summaryrefslogtreecommitdiff
path: root/tests/objects/signals-delegate.vala
diff options
context:
space:
mode:
authorRico Tzschichholz <ricotz@ubuntu.com>2017-09-10 15:49:56 +0200
committerRico Tzschichholz <ricotz@ubuntu.com>2017-11-19 14:16:07 +0100
commitd4d6cc2abbfff21dd8978c50c2a98ce7cf11515e (patch)
tree545d88fdea34ada8e7ff8ee6d37e01f4c5ffb43e /tests/objects/signals-delegate.vala
parent801d6301da5dd62022538252913215a20dc40976 (diff)
downloadvala-d4d6cc2abbfff21dd8978c50c2a98ce7cf11515e.tar.gz
Allow to pass compatible delegates to signal.connect()
https://bugzilla.gnome.org/show_bug.cgi?id=787521
Diffstat (limited to 'tests/objects/signals-delegate.vala')
-rw-r--r--tests/objects/signals-delegate.vala108
1 files changed, 108 insertions, 0 deletions
diff --git a/tests/objects/signals-delegate.vala b/tests/objects/signals-delegate.vala
new file mode 100644
index 000000000..1e94603b8
--- /dev/null
+++ b/tests/objects/signals-delegate.vala
@@ -0,0 +1,108 @@
+public delegate string FooFunc (Foo foo, string s);
+
+public class Foo : Object {
+ public signal string test (string s);
+
+ public void add (FooFunc func) {
+ test.connect (func);
+ }
+
+ public void add_owned (owned FooFunc func) {
+ test.connect (func);
+ }
+
+ public void add_remove (FooFunc func) {
+ test.connect (func);
+ test.disconnect (func);
+ }
+
+ public void add_remove_owned (owned FooFunc func) {
+ test.connect (func);
+ test.disconnect (func);
+ }
+
+ public void invoke_test () {
+ assert (test ("bar") == "foo");
+ }
+
+ public void invoke_test_empty () {
+ assert (test ("bar") == null);
+ }
+}
+
+public class Bar : Object {
+ public signal string test (string s);
+
+ int i;
+
+ public Bar (Foo foo) {
+ i = 42;
+ foo.add (instance_callback);
+ }
+
+ public Bar.owned (Foo foo) {
+ i = 42;
+ foo.add_owned (instance_callback);
+ }
+
+ public Bar.remove (Foo foo) {
+ i = 42;
+ foo.add_remove (instance_callback);
+ }
+
+ public Bar.remove_owned (Foo foo) {
+ i = 42;
+ foo.add_remove_owned (instance_callback);
+ }
+
+ string instance_callback (Foo foo, string s) {
+ assert (foo is Foo);
+ assert (this is Bar);
+ assert (s == "bar");
+ assert (i == 42);
+ return "foo";
+ }
+}
+
+string callback_static (Foo foo, string s) {
+ assert (foo is Foo);
+ assert (s == "bar");
+ return "foo";
+}
+
+void main () {
+ Foo foo;
+ Bar bar;
+
+ foo = new Foo ();
+ foo.add ((FooFunc) callback_static);
+ foo.invoke_test ();
+
+ foo = new Foo ();
+ foo.add_owned ((FooFunc) callback_static);
+ foo.invoke_test ();
+
+ foo = new Foo ();
+ foo.add_remove ((FooFunc) callback_static);
+ foo.invoke_test_empty ();
+
+ foo = new Foo ();
+ foo.add_remove_owned ((FooFunc) callback_static);
+ foo.invoke_test_empty ();
+
+ foo = new Foo ();
+ bar = new Bar (foo);
+ foo.invoke_test ();
+
+ foo = new Foo ();
+ bar = new Bar.owned (foo);
+ foo.invoke_test ();
+
+ foo = new Foo ();
+ bar = new Bar.remove (foo);
+ foo.invoke_test_empty ();
+
+ foo = new Foo ();
+ bar = new Bar.remove_owned (foo);
+ foo.invoke_test_empty ();
+}