slint/tests/cases/expr/comparison.slint
Olivier Goffart 31867fad61
compiler: Reject comparison on unsupported types
The compiler was accepting the comparison of types such as color, or
struct, and then later we'd get rust compilation error or interpreter
panic.

Example seen in the crash reporter:
`internal/interpreter/eval.rs:257:35`
```
unsupported Value::Brush(SolidColor(Color { red: 0, green: 0, blue: 0, alpha: 0 })) ≤ Value::Brush(SolidColor(Color { red: 255, green: 0, blue: 0, alpha: 255 }))
```

Note that some code hapenned to compile with rust or C++.
For example, comparison of bool, or anonymous struct (represented as
tuples), or color represeted as int)
So technically this is a breaking change.
But this should be fine as this was not working in the interpreter and
this is a bug fix.

ChangeLog: Slint compilation error for comparison of types that can't be
compared with less or greater operator.
2025-05-07 11:39:27 +02:00

164 lines
4.7 KiB
Text

// Copyright © SixtyFPS GmbH <info@slint.dev>
// SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-Royalty-free-2.0 OR LicenseRef-Slint-Software-3.0
TestCase := Rectangle {
property<int> hello: 44;
property<bool> t1: hello == 44 || hello == 45;
property<bool> t2: hello > 44 && hello < 46;
property<bool> t3: hello >= 44 && hello <= 46;
property<bool> t4: t1 || (t2 && t3);
property<bool> t5: t2 || hello + 3 != 4*10+4;
property<bool> t6: !t1 || 1 == 0;
property<string> my_str: "hello";
property<bool> t7: my_str == "hello";
property<bool> string-cmp: "fooa" < "foob";
out property <bool> test: t1 && !t2 && t3 && t4 && t5 && !t6 && t7 && string-cmp;
}
/*
```cpp
auto handle = TestCase::create();
const TestCase &instance = *handle;
assert_eq(instance.get_t1(), true);
assert_eq(instance.get_t2(), false);
assert_eq(instance.get_t3(), true);
assert_eq(instance.get_t4(), true);
assert_eq(instance.get_t5(), true);
assert_eq(instance.get_t6(), false);
assert_eq(instance.get_t7(), true);
assert_eq(instance.get_string_cmp(), true);
assert_eq(instance.get_test(), true);
instance.set_hello(45);
assert_eq(instance.get_t1(), true);
assert_eq(instance.get_t2(), true);
assert_eq(instance.get_t3(), true);
assert_eq(instance.get_t4(), true);
assert_eq(instance.get_t5(), true);
assert_eq(instance.get_t6(), false);
instance.set_hello(46);
assert_eq(instance.get_t1(), false);
assert_eq(instance.get_t2(), false);
assert_eq(instance.get_t3(), true);
assert_eq(instance.get_t4(), false);
assert_eq(instance.get_t5(), true);
assert_eq(instance.get_t6(), true);
instance.set_hello(47);
assert_eq(instance.get_t1(), false);
assert_eq(instance.get_t2(), false);
assert_eq(instance.get_t3(), false);
assert_eq(instance.get_t4(), false);
assert_eq(instance.get_t5(), true);
assert_eq(instance.get_t6(), true);
instance.set_hello(41);
assert_eq(instance.get_t1(), false);
assert_eq(instance.get_t2(), false);
assert_eq(instance.get_t3(), false);
assert_eq(instance.get_t4(), false);
assert_eq(instance.get_t5(), false);
assert_eq(instance.get_t6(), true);
```
```rust
let instance = TestCase::new().unwrap();
assert_eq!(instance.get_t1(), true);
assert_eq!(instance.get_t2(), false);
assert_eq!(instance.get_t3(), true);
assert_eq!(instance.get_t4(), true);
assert_eq!(instance.get_t5(), true);
assert_eq!(instance.get_t6(), false);
assert_eq!(instance.get_t7(), true);
assert_eq!(instance.get_string_cmp(), true);
assert_eq!(instance.get_test(), true);
instance.set_hello(45);
assert_eq!(instance.get_t1(), true);
assert_eq!(instance.get_t2(), true);
assert_eq!(instance.get_t3(), true);
assert_eq!(instance.get_t4(), true);
assert_eq!(instance.get_t5(), true);
assert_eq!(instance.get_t6(), false);
instance.set_hello(46);
assert_eq!(instance.get_t1(), false);
assert_eq!(instance.get_t2(), false);
assert_eq!(instance.get_t3(), true);
assert_eq!(instance.get_t4(), false);
assert_eq!(instance.get_t5(), true);
assert_eq!(instance.get_t6(), true);
instance.set_hello(47);
assert_eq!(instance.get_t1(), false);
assert_eq!(instance.get_t2(), false);
assert_eq!(instance.get_t3(), false);
assert_eq!(instance.get_t4(), false);
assert_eq!(instance.get_t5(), true);
assert_eq!(instance.get_t6(), true);
instance.set_hello(41);
assert_eq!(instance.get_t1(), false);
assert_eq!(instance.get_t2(), false);
assert_eq!(instance.get_t3(), false);
assert_eq!(instance.get_t4(), false);
assert_eq!(instance.get_t5(), false);
assert_eq!(instance.get_t6(), true);
```
```js
var instance = new slint.TestCase({});
assert.equal(instance.t1, true);
assert.equal(instance.t2, false);
assert.equal(instance.t3, true);
assert.equal(instance.t4, true);
assert.equal(instance.t5, true);
assert.equal(instance.t6, false);
assert.equal(instance.t7, true);
assert.equal(instance.string_cmp, true);
assert.equal(instance.test, true);
instance.hello = 45;
assert.equal(instance.t1, true);
assert.equal(instance.t2, true);
assert.equal(instance.t3, true);
assert.equal(instance.t4, true);
assert.equal(instance.t5, true);
assert.equal(instance.t6, false);
instance.hello = 46;
assert.equal(instance.t1, false);
assert.equal(instance.t2, false);
assert.equal(instance.t3, true);
assert.equal(instance.t4, false);
assert.equal(instance.t5, true);
assert.equal(instance.t6, true);
instance.hello = 47;
assert.equal(instance.t1, false);
assert.equal(instance.t2, false);
assert.equal(instance.t3, false);
assert.equal(instance.t4, false);
assert.equal(instance.t5, true);
assert.equal(instance.t6, true);
instance.hello = 41;
assert.equal(instance.t1, false);
assert.equal(instance.t2, false);
assert.equal(instance.t3, false);
assert.equal(instance.t4, false);
assert.equal(instance.t5, false);
assert.equal(instance.t6, true);
```
*/