diff options
author | Rico Tzschichholz <ricotz@ubuntu.com> | 2017-09-10 15:49:56 +0200 |
---|---|---|
committer | Rico Tzschichholz <ricotz@ubuntu.com> | 2017-11-19 14:16:07 +0100 |
commit | d4d6cc2abbfff21dd8978c50c2a98ce7cf11515e (patch) | |
tree | 545d88fdea34ada8e7ff8ee6d37e01f4c5ffb43e /tests/objects/signals-delegate.vala | |
parent | 801d6301da5dd62022538252913215a20dc40976 (diff) | |
download | vala-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.vala | 108 |
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 (); +} |