forked from gtk-rs/gtk-rs-core
-
Notifications
You must be signed in to change notification settings - Fork 0
/
clone.rs
91 lines (83 loc) · 4.3 KB
/
clone.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
// Take a look at the license at the top of the repository in the LICENSE file.
use glib::clone;
use std::rc::Rc;
#[test]
fn clone() {
let v = Rc::new(1);
let _ = clone!(@strong v => @default-return None::<i32>, move || {println!("foo"); 1});
let v = Rc::new(1);
let _ = clone!(@weak v => @default-return None::<i32>, move || {println!("foo"); Some(1)});
let v = "123";
let _ = clone!(@to-owned v => @default-return None::<i32>, move || {println!("foo"); 1});
}
const TESTS: &[(&str, &str)] = &[
("clone!( => move || {})",
"If you have nothing to clone, no need to use this macro!"),
("clone!(|| {})",
"If you have nothing to clone, no need to use this macro!"),
("clone!(|a, b| {})",
"If you have nothing to clone, no need to use this macro!"),
("clone!(@weak a, @weak b => |x| {})",
"Closure needs to be \"moved\" so please add `move` before closure"),
("clone!(@weak a, @weak b => || {})",
"Closure needs to be \"moved\" so please add `move` before closure"),
("clone!(@weak a, @weak b => |x| println!(\"a\"))",
"Closure needs to be \"moved\" so please add `move` before closure"),
("clone!(@weak a, @weak b => || println!(\"a\"))",
"Closure needs to be \"moved\" so please add `move` before closure"),
("clone!(@weak a => |x| {})",
"Closure needs to be \"moved\" so please add `move` before closure"),
("clone!(@weak a => || {})",
"Closure needs to be \"moved\" so please add `move` before closure"),
("clone!(@weak a => |x| println!(\"a\"))",
"Closure needs to be \"moved\" so please add `move` before closure"),
("clone!(@weak a => || println!(\"a\"))",
"Closure needs to be \"moved\" so please add `move` before closure"),
("clone!(@strong self => move |x| {})",
"Can't use `self` as variable name. Try storing it in a temporary variable or rename it using `as`."),
("clone!(@strong self.v => move |x| {})",
"`self.v`: Field accesses are not allowed as is, you must rename it!"),
("clone!(@weak v => @default-return false, || {})",
"Closure needs to be \"moved\" so please add `move` before closure"),
("clone!(@weak v => @default-return false, || println!(\"a\"))",
"Closure needs to be \"moved\" so please add `move` before closure"),
("clone!(@weak v => @default-return false, |bla| {})",
"Closure needs to be \"moved\" so please add `move` before closure"),
("clone!(@weak v => @default-return false, |bla| println!(\"a\"))",
"Closure needs to be \"moved\" so please add `move` before closure"),
("clone!(@weak v => default-return false, move || {})",
"Missing `@` before `default-return`"),
("clone!(@weak v => @default-return false move || {})",
"Expected `,` after `@default-return false`, found `,`"),
("clone!(@yolo v => move || {})",
"Unknown keyword `yolo`, only `weak`, `weak-allow-none`, `to-owned` and `strong` are allowed"),
("clone!(v => move || {})",
"Unexpected ident `v`: you need to specify if this is a weak or a strong clone."),
("clone!(@strong v => {println!(\"foo\");})",
"Missing `move` and closure declaration"),
("clone!(@strong v, @default-return lol => move || {println!(\"foo\");})",
"`@default-return` should be after `=>`"),
("clone!(@default-return lol, @strong v => move || {println!(\"foo\");})",
"`@default-return` should be after `=>`"),
// The async part!
("clone!(@strong v => async || {println!(\"foo\");})",
"Expected `move` after `async`, found `|`"),
("clone!(@strong v => async {println!(\"foo\");})",
"Expected `move` after `async`, found `{`"),
("clone!(@strong v => move || async {println!(\"foo\");})",
"Expected `move` after `async`, found `{`"),
("clone!(@strong v => move || async println!(\"foo\");)",
"Expected `move` after `async`, found `println`"),
("clone!(@strong v => move || async move println!(\"foo\");)",
"Expected block after `| async move`"),
];
#[test]
fn clone_failures() {
let t = trybuild2::TestCases::new();
for (index, (expr, err)) in TESTS.iter().enumerate() {
let prefix = "fn main() { use glib::clone; let v = std::rc::Rc::new(1); ";
let suffix = "; }";
let output = format!("{prefix}{expr}{suffix}");
t.compile_fail_inline_check_sub(&format!("test_{index}"), &output, err);
}
}