summaryrefslogtreecommitdiff
path: root/tests/objects/signals-delegate.vala
blob: 1e94603b8f6f0bf9145a34fd7f68d8b9a40a2241 (plain)
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
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 ();
}