gtk_test/
macros.rs

1/// To check if the widget's label matches the given string.
2///
3/// Example:
4///
5/// ```
6/// extern crate gtk;
7/// #[macro_use]
8/// extern crate gtk_test;
9///
10/// use gtk::{Button, prelude::ButtonExt, prelude::LabelExt};
11///
12/// # fn main() {
13/// gtk::init().expect("GTK init failed");
14/// let but = Button::new();
15/// but.set_label("text");
16/// assert_label!(but, "text");
17/// # }
18/// ```
19#[macro_export]
20macro_rules! assert_label {
21    ($widget:expr, $string:expr) => {
22        assert_eq!($widget.label().expect("get label"), $string.to_string());
23    };
24}
25
26/// To check if the widget's text matches the given string.
27///
28/// Example:
29///
30/// ```
31/// extern crate gtk;
32/// #[macro_use]
33/// extern crate gtk_test;
34///
35/// use gtk::{Label, prelude::LabelExt};
36///
37/// # fn main() {
38/// gtk::init().expect("GTK init failed");
39/// let label = Label::new(Some("I'm a label!"));
40/// assert_text!(label, "I'm a label!");
41/// # }
42/// ```
43#[macro_export]
44macro_rules! assert_text {
45    ($widget:expr, $string:expr) => {
46        assert_eq!($widget.text(), $string.to_string());
47    };
48}
49
50/// To check if the widget's title matches the given string.
51///
52/// Example:
53///
54/// ```
55/// extern crate gtk;
56/// #[macro_use]
57/// extern crate gtk_test;
58///
59/// use gtk::{prelude::GtkWindowExt, Window, WindowType};
60///
61/// # fn main() {
62/// gtk::init().expect("GTK init failed");
63/// let window = Window::new(WindowType::Toplevel);
64/// window.set_title("Fromage ?");
65/// assert_title!(window, "Fromage ?");
66/// # }
67/// ```
68#[macro_export]
69macro_rules! assert_title {
70    ($widget:expr, $string:expr) => {
71        assert_eq!($widget.title().expect("get text"), $string.to_string());
72    };
73}
74
75/// To check if the widget's name matches the given string.
76///
77/// Example:
78///
79/// ```
80/// extern crate gtk;
81/// #[macro_use]
82/// extern crate gtk_test;
83///
84/// use gtk::{prelude::WidgetExt, Button};
85///
86/// # fn main() {
87/// gtk::init().expect("GTK init failed");
88/// let button = Button::new();
89/// button.set_widget_name("Omelette");
90/// assert_name!(button, "Omelette");
91/// # }
92/// ```
93#[macro_export]
94macro_rules! assert_name {
95    ($widget:expr, $string:expr) => {
96        assert_eq!($widget.widget_name(), $string.to_string());
97    };
98}
99
100/// Create a new observer for signals.
101///
102/// Example:
103///
104/// ```
105/// extern crate gtk;
106/// #[macro_use]
107/// extern crate gtk_test;
108///
109/// use gtk::prelude::GtkWindowExt;
110///
111/// # fn main() {
112/// gtk::init().expect("initialization failed");
113/// let window = gtk::Window::new(gtk::WindowType::Toplevel);
114///
115/// let observer = observer_new!(window, connect_activate_focus, |_|);
116/// window.emit_activate_focus();
117/// observer.wait();
118/// # }
119/// ```
120///
121/// You can also give a block to the macro that will be called when the signal is triggered:
122///
123/// ```
124/// extern crate gtk;
125/// #[macro_use]
126/// extern crate gtk_test;
127///
128/// use gtk::prelude::GtkWindowExt;
129///
130/// # fn main() {
131/// gtk::init().expect("initialization failed");
132/// let window = gtk::Window::new(gtk::WindowType::Toplevel);
133///
134/// let observer = observer_new!(window, connect_activate_focus, |w| {
135///     w.set_title("Caribou !");
136/// });
137/// window.emit_activate_focus();
138/// observer.wait();
139/// assert_title!(window, "Caribou !");
140/// # }
141/// ```
142#[macro_export]
143// TODO: should remove the signal after wait()?
144macro_rules! observer_new {
145    ($widget:expr, $signal_name:ident, |$($arg:tt $(: $typ:ty)?),+|) => {{
146        let observer = $crate::Observer::new();
147        let res = (*observer.get_inner()).clone();
148        $widget.$signal_name(move |$($arg $(: $typ)?),+| {
149            *res.borrow_mut() = true;
150        });
151        observer
152    }};
153    ($widget:expr, $signal_name:ident, |$($arg:tt $(: $typ:ty)?),+| $block:block) => {{
154        let observer = $crate::Observer::new();
155        let res = (*observer.get_inner()).clone();
156        $widget.$signal_name(move |$($arg $(: $typ)?),+| {
157            *res.borrow_mut() = true;
158            $block
159        });
160        observer
161    }}
162}