use crate::it::test_client::TestClientExt;
use crate::it::test_error::TestResult;
use crate::it::testrun::TestRun;
use std::rc::Rc;
testcase!();
async fn test(run: Rc<TestRun>) -> TestResult {
run.backend.install_default().await?;
let client = run.create_client()?;
let connector_id = run.backend.default_connector.id;
let connector_data = run.state.connectors.get(&connector_id).unwrap();
let window = client.create_window().await?;
let buffer = client.create_single_pixel_buffer(crate::theme::Color::from_srgb(0, 255, 0));
window.surface.attach(buffer.id);
window.map().await?;
client.sync().await;
connector_data.damaged.set(false);
run.backend.default_connector.damage_calls.set(0);
tassert!(!connector_data.damaged.get());
tassert_eq!(run.backend.default_connector.damage_calls.get(), 0);
window.surface.damage(10, 10, 50, 50);
window.surface.commit();
client.sync().await;
tassert!(connector_data.damaged.get());
tassert!(run.backend.default_connector.damage_calls.get() > 0);
connector_data.damaged.set(false);
let previous_calls = run.backend.default_connector.damage_calls.get();
tassert!(!connector_data.damaged.get());
window.surface.damage_buffer(0, 0, 1, 1); window.surface.commit();
client.sync().await;
tassert!(connector_data.damaged.get());
tassert!(run.backend.default_connector.damage_calls.get() > previous_calls);
let invisible_surface = client.create_surface().await?;
let invisible_buffer =
client.create_single_pixel_buffer(crate::theme::Color::from_srgb(255, 255, 0));
invisible_surface.attach(invisible_buffer.id);
invisible_surface.commit(); client.sync().await;
connector_data.damaged.set(false);
let invisible_calls_before = run.backend.default_connector.damage_calls.get();
tassert!(!connector_data.damaged.get());
invisible_surface.damage(20, 20, 30, 30);
invisible_surface.commit();
client.sync().await;
tassert!(!connector_data.damaged.get());
tassert_eq!(
run.backend.default_connector.damage_calls.get(),
invisible_calls_before
);
connector_data.damaged.set(false);
let multi_calls_before = run.backend.default_connector.damage_calls.get();
tassert!(!connector_data.damaged.get());
window.surface.damage(5, 5, 10, 10);
window.surface.damage(25, 25, 15, 15);
window.surface.damage_buffer(0, 0, 1, 1);
window.surface.commit();
client.sync().await;
tassert!(connector_data.damaged.get());
tassert!(run.backend.default_connector.damage_calls.get() > multi_calls_before);
connector_data.damaged.set(false);
let no_commit_calls_before = run.backend.default_connector.damage_calls.get();
tassert!(!connector_data.damaged.get());
window.surface.damage(40, 40, 20, 20);
client.sync().await;
tassert!(!connector_data.damaged.get());
tassert_eq!(
run.backend.default_connector.damage_calls.get(),
no_commit_calls_before
);
window.surface.commit();
client.sync().await;
tassert!(connector_data.damaged.get());
tassert!(run.backend.default_connector.damage_calls.get() > no_commit_calls_before);
Ok(())
}