diff --git a/api/node/index.ts b/api/node/index.ts index e09ab997cb..34bec8320c 100644 --- a/api/node/index.ts +++ b/api/node/index.ts @@ -956,6 +956,7 @@ export function quitEventLoop() { */ export namespace private_api { export import mock_elapsed_time = napi.mockElapsedTime; + export import get_mocked_time = napi.getMockedTime; export import ComponentCompiler = napi.ComponentCompiler; export import ComponentDefinition = napi.ComponentDefinition; export import ComponentInstance = napi.ComponentInstance; diff --git a/api/node/src/lib.rs b/api/node/src/lib.rs index f07f7a4565..e798be4876 100644 --- a/api/node/src/lib.rs +++ b/api/node/src/lib.rs @@ -17,6 +17,11 @@ pub fn mock_elapsed_time(ms: f64) { i_slint_core::tests::slint_mock_elapsed_time(ms as _); } +#[napi] +pub fn get_mocked_time() -> f64 { + i_slint_core::tests::slint_get_mocked_time() as f64 +} + #[napi] pub enum ProcessEventsResult { Continue, diff --git a/tests/cases/test_infrastructure.slint b/tests/cases/test_infrastructure.slint new file mode 100644 index 0000000000..f605d27e87 --- /dev/null +++ b/tests/cases/test_infrastructure.slint @@ -0,0 +1,88 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-Royalty-free-1.1 OR LicenseRef-Slint-commercial + +export component TestCase { } + +/* +```cpp +auto handle = TestCase::create(); +const TestCase &instance = *handle; + +// Check time mocking without event delivery happening: +auto start_time = slint_testing::get_mocked_time(); +slint_testing::mock_elapsed_time(512); +assert(slint_testing::get_mocked_time() == start_time + 512); +slint_testing::mock_elapsed_time(10333); +auto pre_event1_time = slint_testing::get_mocked_time(); +assert_eq(pre_event1_time, start_time + 512 + 10333); + +// Test that the first mouse event keeps time consistent +slint_testing::send_mouse_click(&instance, 5., 5.); +auto post_event1_time = slint_testing::get_mocked_time(); +assert(post_event1_time >= pre_event1_time && post_event1_time < pre_event1_time + 100); // allow for a bit of time for event handling... + +// Test that a second mouse event keeps time consistent +slint_testing::send_mouse_click(&instance, 5., 5.); +auto post_event2_time = slint_testing::get_mocked_time(); +assert(post_event2_time >= post_event1_time && post_event2_time < post_event1_time + 100); + +// Test that mocking works after mouse event delivery: +slint_testing::mock_elapsed_time(500000); +auto pre_event3_time = slint_testing::get_mocked_time(); +assert(pre_event3_time == post_event2_time + 500000); + +// Test that a new event does not break the mocked time again +slint_testing::send_mouse_click(&instance, 5., 5.); +auto post_event3_time = slint_testing::get_mocked_time(); +assert(post_event3_time >= pre_event3_time && post_event3_time <= pre_event3_time + 100); +``` + +```rust +let instance = TestCase::new().unwrap(); + +// Check time mocking without event delivery happening: +let start_time = slint_testing::get_mocked_time(); +slint_testing::mock_elapsed_time(512); +assert_eq!(slint_testing::get_mocked_time(), start_time + 512, "Mocked time is wrong"); +slint_testing::mock_elapsed_time(10333); +let pre_event1_time = slint_testing::get_mocked_time(); +assert_eq!(pre_event1_time, start_time + 512 + 10333); + +// Test that the first mouse event keeps time consistent +slint_testing::send_mouse_click(&instance, 5., 5.); +let post_event1_time = slint_testing::get_mocked_time(); +assert!(post_event1_time >= pre_event1_time && post_event1_time < pre_event1_time + 100); // allow for a bit of time for event handling... + +// Test that a second mouse event keeps time consistent +slint_testing::send_mouse_click(&instance, 5., 5.); +let post_event2_time = slint_testing::get_mocked_time(); +assert!(post_event2_time >= post_event1_time && post_event2_time < post_event1_time + 100); + +// Test that mocking works after mouse event delivery: +slint_testing::mock_elapsed_time(500000); +let pre_event3_time = slint_testing::get_mocked_time(); +assert_eq!(pre_event3_time, post_event2_time + 500000); + +// Test that a new event does not break the mocked time again +slint_testing::send_mouse_click(&instance, 5., 5.); +let post_event3_time = slint_testing::get_mocked_time(); +assert!(post_event3_time >= pre_event3_time && post_event3_time <= pre_event3_time + 100); +``` + +```js +var instance = new slint.TestCase({}); + +let start_time = slintlib.private_api.get_mocked_time(); +slintlib.private_api.mock_elapsed_time(512); +assert(slintlib.private_api.get_mocked_time() == start_time + 512); +slintlib.private_api.mock_elapsed_time(122); +assert(slintlib.private_api.get_mocked_time() == start_time + 512 + 122); +slintlib.private_api.mock_elapsed_time(10333); +assert(slintlib.private_api.get_mocked_time() == start_time + 512 + 122 + 10333); + +// FIXME: Sending a mouse event undoes the mock_elapsed_time calls on Node at this time! +// slintlib.private_api.send_mouse_click(instance, 5., 5.); +// assert(slintlib.private_api.get_mocked_time() == start_time + 512 + 122 + 10333); +``` + +*/