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// As of now, the C++ optimization doesn't optimize hidden item of Listview so this test would take forever
5//ignore:cpp
6
7import { ListView } from "std-widgets.slint";
8export component TestCase inherits Window {
9 preferred-width: 300px;
10 preferred-height: 300px;
11
12 in-out property <string> result;
13 callback clicked(int);
14 in-out property <length> viewport-y <=> lv.viewport-y;
15
16 lv := ListView {
17 for _[num] in 2130000000: Rectangle {
18 height: 20px;
19 border-width: 1px;
20 border-color: red;
21 Text { text: num; }
22 TouchArea {
23 clicked => { result = "|"+num; root.clicked(num) }
24 }
25 }
26 }
27}
28
29
30/*
31
32
33```rust
34let instance = TestCase::new().unwrap();
35let clicked = std::rc::Rc::new(std::cell::RefCell::new(Vec::<i32>::new()));
36let clicked2 = clicked.clone();
37instance.on_clicked(move |x| clicked2.borrow_mut().push(x) );
38slint_testing::send_mouse_click(&instance, 5., 250.);
39assert_eq!(clicked.borrow().as_slice(), &[12]);
40slint_testing::send_mouse_click(&instance, 5., 263.);
41slint_testing::send_mouse_click(&instance, 5., 239.);
42assert_eq!(clicked.borrow().as_slice(), &[12, 13, 11]);
43
44instance.set_viewport_y(-20. * 1000.);
45clicked.borrow_mut().clear();
46slint_testing::send_mouse_click(&instance, 5., 250.);
47assert_eq!(clicked.borrow().as_slice(), &[1012]);
48slint_testing::send_mouse_click(&instance, 5., 263.);
49slint_testing::send_mouse_click(&instance, 5., 239.);
50assert_eq!(clicked.borrow().as_slice(), &[1012, 1013, 1011]);
51
52instance.set_viewport_y(-20. * 100000.);
53clicked.borrow_mut().clear();
54slint_testing::send_mouse_click(&instance, 5., 250.);
55assert_eq!(clicked.borrow().as_slice(), &[100012]);
56slint_testing::send_mouse_click(&instance, 5., 263.);
57slint_testing::send_mouse_click(&instance, 5., 239.);
58assert_eq!(clicked.borrow().as_slice(), &[100012, 100013, 100011]);
59
60instance.set_viewport_y(-20. * 10000000.);
61clicked.borrow_mut().clear();
62slint_testing::send_mouse_click(&instance, 5., 250.);
63assert_eq!(clicked.borrow().as_slice(), &[10000012]);
64slint_testing::send_mouse_click(&instance, 5., 263.);
65slint_testing::send_mouse_click(&instance, 5., 239.);
66assert_eq!(clicked.borrow().as_slice(), &[10000012, 10000013, 10000011]);
67
68instance.set_viewport_y(-20. * 210000000.);
69clicked.borrow_mut().clear();
70slint_testing::send_mouse_click(&instance, 5., 250.);
71assert_eq!(clicked.borrow().as_slice(), &[210000012]);
72slint_testing::send_mouse_click(&instance, 5., 263.);
73slint_testing::send_mouse_click(&instance, 5., 239.);
74assert_eq!(clicked.borrow().as_slice(), &[210000012, 210000013, 210000011]);
75
76// go all the way to the end, it shouldn't crash or loop forever
77instance.set_viewport_y(-20. * (2130000000. - 5.));
78slint_testing::send_mouse_click(&instance, 5., 250.);
79```
80
81```cpp
82auto handle = TestCase::create();
83const TestCase &instance = *handle;
84auto clicked = std::make_shared<std::vector<int>>();
85instance.on_clicked([clicked](int x) { clicked->push_back(x); });
86slint_testing::send_mouse_click(&instance, 5., 250.);
87assert(*clicked == std::vector<int>{12});
88```
89
90```js
91var instance = new slint.TestCase();
92var clicked = new Array();
93instance.clicked = function(x) { clicked.push(x); };
94slintlib.private_api.send_mouse_click(instance, 5., 250.);
95assert.deepEqual(clicked, [12]);
96slintlib.private_api.send_mouse_click(instance, 5., 263.);
97slintlib.private_api.send_mouse_click(instance, 5., 239.);
98assert.deepEqual(clicked, [12, 13, 11]);
99
100instance.viewport_y=(-20. * 1000.);
101clicked.length = 0;
102slintlib.private_api.send_mouse_click(instance, 5., 250.);
103assert.deepEqual(clicked, [1012]);
104slintlib.private_api.send_mouse_click(instance, 5., 263.);
105slintlib.private_api.send_mouse_click(instance, 5., 239.);
106assert.deepEqual(clicked, [1012, 1013, 1011]);
107
108instance.viewport_y=(-20. * 100000.);
109clicked.length = 0;
110slintlib.private_api.send_mouse_click(instance, 5., 250.);
111assert.deepEqual(clicked, [100012]);
112slintlib.private_api.send_mouse_click(instance, 5., 263.);
113slintlib.private_api.send_mouse_click(instance, 5., 239.);
114assert.deepEqual(clicked, [100012, 100013, 100011]);
115
116instance.viewport_y=(-20. * 10000000.);
117clicked.length = 0;
118slintlib.private_api.send_mouse_click(instance, 5., 250.);
119assert.deepEqual(clicked, [10000012]);
120slintlib.private_api.send_mouse_click(instance, 5., 263.);
121slintlib.private_api.send_mouse_click(instance, 5., 239.);
122assert.deepEqual(clicked, [10000012, 10000013, 10000011]);
123
124instance.viewport_y=(-20. * 210000000.);
125clicked.length = 0;
126slintlib.private_api.send_mouse_click(instance, 5., 250.);
127assert.deepEqual(clicked, [210000012]);
128slintlib.private_api.send_mouse_click(instance, 5., 263.);
129slintlib.private_api.send_mouse_click(instance, 5., 239.);
130assert.deepEqual(clicked, [210000012, 210000013, 210000011]);
131
132// go all the way to the end, it shouldn't crash or loop forever
133instance.viewport_y=(-20. * (2130000000. - 5.));
134slintlib.private_api.send_mouse_click(instance, 5., 250.);
135```
136
137
138*/
139