1// Copyright © SixtyFPS GmbH <info@slint.dev>
2// SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-Royalty-free-2.0 OR LicenseRef-Slint-Software-3.0
3
4// Verify that the init callback is invoked in the correct order
5
6import { ExportedGlobal } from "../../helper_components/export_globals.slint";
7
8export global InitOrder := {
9 property <string> observed-order: "start";
10}
11
12Sub1 := Rectangle {
13 init => {
14 InitOrder.observed-order += "|sub1";
15 }
16}
17
18Sub2 := Rectangle {
19 init => {
20 InitOrder.observed-order += "|sub2";
21 }
22}
23
24SubSub := Rectangle {
25 init => {
26 InitOrder.observed-order += "|subsub";
27 }
28}
29
30Sub3 := Rectangle {
31 property <string> some-value: "should-not-show-up";
32 init => {
33 InitOrder.observed-order += some-value;
34 }
35 SubSub {}
36}
37
38Container := Rectangle {
39 in property <string> name-inside: "container";
40 init => {
41 InitOrder.observed-order += "|" + self.name-inside;
42 }
43 @children
44}
45
46InsideRepeater := Rectangle {
47 property <int> index;
48 init => {
49 InitOrder.observed-order += "(i" + self.index + ")";
50 }
51 @children
52}
53
54TestCase := Rectangle {
55 width: 300phx;
56 height: 300phx;
57 init => {
58 InitOrder.observed-order += "|root";
59 ExportedGlobal.foo += 1;
60 }
61 Sub1 {
62 init => {
63 InitOrder.observed-order += "|sub1-use-site";
64 }
65 }
66 Sub2 {
67 }
68 Sub3 {
69 some-value: "|sub3";
70 }
71
72 Container {
73 property <string> name-outside: "container-instantiation";
74 init => {
75 InitOrder.observed-order += "|" + self.name-outside;
76 }
77 }
78
79 Rectangle {
80 init => {
81 InitOrder.observed-order += "|element";
82 }
83 }
84
85 for i in 2: InsideRepeater {
86 index: i;
87 init => {
88 InitOrder.observed-order += "|repeater";
89 InitOrder.observed-order += i;
90 }
91 Rectangle {}
92 }
93
94 property <string> test_global_prop_value: InitOrder.observed-order;
95
96 property <string> expected_static_order: "start|sub1|sub2|subsub|sub3|container|root|sub1-use-site|container-instantiation|element";
97
98 property <bool> test: InitOrder.observed-order == expected_static_order;
99}
100
101/*
102```rust
103let instance = TestCase::new().unwrap();
104
105assert!(instance.get_test());
106slint_testing::send_mouse_click(&instance, 5., 5.);
107assert_eq!(instance.global::<InitOrder<'_>>().get_observed_order(), instance.get_expected_static_order() + "|repeater0(i0)|repeater1(i1)");
108```
109
110```cpp
111auto handle = TestCase::create();
112const TestCase &instance = *handle;
113assert(instance.get_test());
114slint_testing::send_mouse_click(&instance, 5., 5.);
115assert_eq(instance.global<InitOrder>().get_observed_order(), instance.get_expected_static_order() + "|repeater0(i0)|repeater1(i1)");
116```
117
118
119```js
120var instance = new slint.TestCase({});
121assert(instance.test);
122slintlib.private_api.send_mouse_click(instance, 5., 5.);
123assert.equal(instance.test_global_prop_value, instance.expected_static_order + "|repeater0(i0)|repeater1(i1)");
124```
125
126
127*/
128