use crate::frame_tv_api::FrameTvApi;
use crate::frame_tv_impl::FrameTvImpl;
use crate::protocol::art_response::ArtResponse;
use crate::transport::mock_transport::MockTransport;
use crate::transport::rest_client::RestClient;
use crate::types::{DisplayBrightness, RemoteControlButton};
use std::net::{IpAddr, Ipv4Addr};
fn make_test_tv(mock: MockTransport) -> FrameTvImpl<MockTransport> {
let rest_client = RestClient::new(
IpAddr::V4(Ipv4Addr::new(192, 168, 1, 100)),
reqwest::Client::new(),
);
FrameTvImpl {
transport: mock,
rest_client,
}
}
fn art_response_with_content_list(json_list: &str) -> ArtResponse {
serde_json::from_str(&format!(
r#"{{"content_list": {}}}"#,
serde_json::to_string(json_list).unwrap()
))
.unwrap()
}
fn art_response_with_value(value: &str) -> ArtResponse {
serde_json::from_str(&format!(r#"{{"value": "{value}"}}"#)).unwrap()
}
fn art_response_empty() -> ArtResponse {
serde_json::from_str("{}").unwrap()
}
#[tokio::test]
async fn test_get_uploaded_art_images() {
let mock = MockTransport::new();
let content_list =
r#"[{"content_id":"MY-F0001","category_id":"MY-C0002","width":3840,"height":2160}]"#;
mock.enqueue_art_response(art_response_with_content_list(content_list));
let tv = make_test_tv(mock);
let images = tv.get_uploaded_art_images().await.unwrap();
assert_eq!(images.len(), 1);
assert_eq!(images[0].id(), "MY-F0001");
assert_eq!(images[0].width(), 3840);
}
#[tokio::test]
async fn test_is_artmode_enabled() {
let mock = MockTransport::new();
mock.enqueue_art_response(art_response_with_value("on"));
let tv = make_test_tv(mock);
assert!(tv.is_artmode_enabled().await.unwrap());
}
#[tokio::test]
async fn test_is_artmode_disabled() {
let mock = MockTransport::new();
mock.enqueue_art_response(art_response_with_value("off"));
let tv = make_test_tv(mock);
assert!(!tv.is_artmode_enabled().await.unwrap());
}
#[tokio::test]
async fn test_get_display_brightness() {
let mock = MockTransport::new();
mock.enqueue_art_response(art_response_with_value("7"));
let tv = make_test_tv(mock);
let brightness = tv.get_display_brightness().await.unwrap();
assert_eq!(brightness, DisplayBrightness::L7);
}
#[tokio::test]
async fn test_set_display_brightness() {
let mock = MockTransport::new();
mock.enqueue_art_response(art_response_empty());
let tv = make_test_tv(mock);
tv.set_display_brightness(DisplayBrightness::L5)
.await
.unwrap();
}
#[tokio::test]
async fn test_press_remote_control_button() {
let mock = MockTransport::new();
let tv = make_test_tv(mock);
tv.press_remote_control_button(RemoteControlButton::Power)
.await
.unwrap();
let log = tv.transport.get_remote_key_log();
assert_eq!(log, vec!["KEY_POWER"]);
}
#[tokio::test]
async fn test_enable_artmode() {
let mock = MockTransport::new();
mock.enqueue_art_response(art_response_empty());
let tv = make_test_tv(mock);
tv.enable_artmode().await.unwrap();
}
#[tokio::test]
async fn test_disable_artmode() {
let mock = MockTransport::new();
mock.enqueue_art_response(art_response_empty());
let tv = make_test_tv(mock);
tv.disable_artmode().await.unwrap();
}
#[tokio::test]
async fn test_get_available_mattes() {
let mock = MockTransport::new();
let resp: ArtResponse = serde_json::from_str(
r#"{"matte_type_list": "[{\"matte_id\":\"shadowbox_polar\",\"matte_type\":\"shadowbox\"}]"}"#,
)
.unwrap();
mock.enqueue_art_response(resp);
let tv = make_test_tv(mock);
let mattes = tv.get_available_mattes().await.unwrap();
assert_eq!(mattes.len(), 1);
assert_eq!(mattes[0].id(), "shadowbox_polar");
}
#[tokio::test]
async fn test_get_available_photo_filters() {
let mock = MockTransport::new();
let resp: ArtResponse = serde_json::from_str(
r#"{"filter_list": "[{\"filter_id\":\"ink\",\"filter_name\":\"Ink Wash\"}]"}"#,
)
.unwrap();
mock.enqueue_art_response(resp);
let tv = make_test_tv(mock);
let filters = tv.get_available_photo_filters().await.unwrap();
assert_eq!(filters.len(), 1);
assert_eq!(filters[0].id(), "ink");
assert_eq!(filters[0].name(), "Ink Wash");
}