as3signals 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. data/CHANGELOG.textile +51 -0
  2. data/Gemfile +6 -0
  3. data/MIT-LICENSE.txt +22 -0
  4. data/README.textile +43 -0
  5. data/Rakefile +52 -0
  6. data/as3-signals.as3proj +87 -0
  7. data/as3-signals.docproj +9 -0
  8. data/as3signals.gemspec +24 -0
  9. data/build-asunit.properties +7 -0
  10. data/build-asunit.xml +34 -0
  11. data/build.properties +20 -0
  12. data/build.xml +53 -0
  13. data/lib/as3signals.rb +15 -0
  14. data/src/org/osflash/signals/DeluxeSignal.as +260 -0
  15. data/src/org/osflash/signals/IDeluxeSignal.as +34 -0
  16. data/src/org/osflash/signals/IDispatcher.as +15 -0
  17. data/src/org/osflash/signals/ISignal.as +44 -0
  18. data/src/org/osflash/signals/ISignalOwner.as +13 -0
  19. data/src/org/osflash/signals/Signal.as +206 -0
  20. data/src/org/osflash/signals/events/GenericEvent.as +44 -0
  21. data/src/org/osflash/signals/events/IBubbleEventHandler.as +14 -0
  22. data/src/org/osflash/signals/events/IEvent.as +27 -0
  23. data/src/org/osflash/signals/natives/INativeDispatcher.as +34 -0
  24. data/src/org/osflash/signals/natives/NativeMappedSignal.as +230 -0
  25. data/src/org/osflash/signals/natives/NativeRelaySignal.as +71 -0
  26. data/src/org/osflash/signals/natives/NativeSignal.as +176 -0
  27. data/tests/org/osflash/signals/AllTests.as +44 -0
  28. data/tests/org/osflash/signals/AllTestsRunner.as +19 -0
  29. data/tests/org/osflash/signals/AmbiguousRelationshipTest.as +60 -0
  30. data/tests/org/osflash/signals/DeluxeSignalAmbiguousRelationshipTest.as +60 -0
  31. data/tests/org/osflash/signals/DeluxeSignalDispatchExtraArgsTest.as +43 -0
  32. data/tests/org/osflash/signals/DeluxeSignalDispatchNoArgsTest.as +55 -0
  33. data/tests/org/osflash/signals/DeluxeSignalDispatchNonEventTest.as +67 -0
  34. data/tests/org/osflash/signals/DeluxeSignalSplitInterfacesTest.as +41 -0
  35. data/tests/org/osflash/signals/DeluxeSignalTest.as +134 -0
  36. data/tests/org/osflash/signals/DeluxeSignalWithBubblingEventTest.as +129 -0
  37. data/tests/org/osflash/signals/DeluxeSignalWithCustomEventTest.as +84 -0
  38. data/tests/org/osflash/signals/DeluxeSignalWithGenericEventTest.as +190 -0
  39. data/tests/org/osflash/signals/GenericEventTest.as +62 -0
  40. data/tests/org/osflash/signals/PriorityListenersTest.as +68 -0
  41. data/tests/org/osflash/signals/RedispatchedEventTest.as +51 -0
  42. data/tests/org/osflash/signals/SignalDispatchArgsTest.as +74 -0
  43. data/tests/org/osflash/signals/SignalDispatchNoArgsTest.as +55 -0
  44. data/tests/org/osflash/signals/SignalDispatchNonEventTest.as +81 -0
  45. data/tests/org/osflash/signals/SignalSplitInterfacesTest.as +47 -0
  46. data/tests/org/osflash/signals/SignalTest.as +267 -0
  47. data/tests/org/osflash/signals/SignalWithCustomEventTest.as +107 -0
  48. data/tests/org/osflash/signals/natives/AmbiguousRelationshipInNativeSignalTest.as +63 -0
  49. data/tests/org/osflash/signals/natives/NativeMappedSignalBoundaryUseTest.as +100 -0
  50. data/tests/org/osflash/signals/natives/NativeMappedSignalDefaultsTest.as +78 -0
  51. data/tests/org/osflash/signals/natives/NativeMappedSignalFunctionArgTest.as +148 -0
  52. data/tests/org/osflash/signals/natives/NativeMappedSignalFunctionNoArgsTest.as +95 -0
  53. data/tests/org/osflash/signals/natives/NativeMappedSignalObjectArgTest.as +85 -0
  54. data/tests/org/osflash/signals/natives/NativeRelaySignalTest.as +174 -0
  55. data/tests/org/osflash/signals/natives/NativeSignalTest.as +312 -0
  56. metadata +152 -0
@@ -0,0 +1,190 @@
1
+ package org.osflash.signals
2
+ {
3
+ import asunit.asserts.*;
4
+ import asunit.framework.IAsync;
5
+
6
+ import org.osflash.signals.events.GenericEvent;
7
+ import org.osflash.signals.events.IEvent;
8
+
9
+ import flash.display.Sprite;
10
+
11
+ public class DeluxeSignalWithGenericEventTest
12
+ {
13
+ [Inject]
14
+ public var async:IAsync;
15
+
16
+ protected var completed:DeluxeSignal;
17
+ protected var delegate:Function;
18
+
19
+ [Before]
20
+ public function setUp():void
21
+ {
22
+ completed = new DeluxeSignal(this);
23
+ }
24
+
25
+ [After]
26
+ public function tearDown():void
27
+ {
28
+ completed.removeAll();
29
+ completed = null;
30
+ delegate = null;
31
+ }
32
+
33
+ [Test]
34
+ public function signal_length_is_0_after_creation():void
35
+ {
36
+ assertEquals(0, completed.numListeners);
37
+ }
38
+
39
+ //////
40
+
41
+ [Test]
42
+ public function add_listener_and_dispatch_event_should_pass_event_to_listener():void
43
+ {
44
+ completed.add(async.add(checkGenericEvent, 10));
45
+ completed.dispatch(new GenericEvent());
46
+ }
47
+
48
+ protected function checkGenericEvent(e:IEvent):void
49
+ {
50
+ assertTrue('instance of IEvent', e is IEvent);
51
+ assertTrue('instance of GenericEvent', e is GenericEvent);
52
+ assertEquals('event.signal points to the originating Signal', this.completed, e.signal);
53
+ assertEquals('event.target points to object containing the Signal', this, e.target);
54
+ assertEquals('event.target is e.currentTarget because event does not bubble', e.target, e.currentTarget);
55
+ }
56
+
57
+ //////
58
+
59
+
60
+ [Test]
61
+ public function add_two_listeners_and_dispatch_should_call_both():void
62
+ {
63
+ completed.add(async.add(checkGenericEvent, 10));
64
+ completed.add(async.add(checkGenericEvent, 10));
65
+ completed.dispatch(new GenericEvent());
66
+ }
67
+
68
+ //////
69
+
70
+ [Test]
71
+ public function addOnce_and_dispatch_should_remove_listener_automatically():void
72
+ {
73
+ completed.addOnce(newEmptyHandler());
74
+ completed.dispatch(new GenericEvent());
75
+ assertEquals('there should be no listeners', 0, completed.numListeners);
76
+ }
77
+
78
+ //////
79
+
80
+ [Test]
81
+ public function add_one_listener_and_dispatch_then_listener_remove_itself_using_event_signal():void
82
+ {
83
+ delegate = async.add(remove_myself_from_signal, 10);
84
+ completed.add(delegate);
85
+ completed.dispatch(new GenericEvent());
86
+ }
87
+
88
+ private function remove_myself_from_signal(e:IEvent):void
89
+ {
90
+ assertEquals('listener still in signal', 1, e.signal.numListeners);
91
+
92
+ // Can't remove(arguments.callee) because it's wrapped with delegate created by async.add().
93
+ e.signal.remove(delegate);
94
+
95
+ assertEquals('listener removed from signal', 0, e.signal.numListeners);
96
+ }
97
+
98
+ //////
99
+
100
+ [Test]
101
+ public function add_listener_then_remove_then_dispatch_should_not_call_listener():void
102
+ {
103
+ var delegate:Function = failIfCalled;
104
+ completed.add(delegate);
105
+ completed.remove(delegate);
106
+ completed.dispatch(new GenericEvent());
107
+ }
108
+
109
+ private function failIfCalled(e:IEvent):void
110
+ {
111
+ fail('This event handler should not have been called.');
112
+ }
113
+
114
+ //////
115
+
116
+ [Test]
117
+ public function add_2_listeners_remove_2nd_then_dispatch_should_call_1st_not_2nd_listener():void
118
+ {
119
+ completed.add(async.add(checkGenericEvent, 10));
120
+ var delegate:Function = failIfCalled;
121
+ completed.add(delegate);
122
+ completed.remove(delegate);
123
+ completed.dispatch(new GenericEvent());
124
+ }
125
+ //////
126
+ [Test]
127
+ public function add_2_listeners_should_yield_length_of_2():void
128
+ {
129
+ completed.add(newEmptyHandler());
130
+ completed.add(newEmptyHandler());
131
+ assertEquals(2, completed.numListeners);
132
+ }
133
+
134
+ private function newEmptyHandler():Function
135
+ {
136
+ return function(e:*):void {};
137
+ }
138
+
139
+
140
+ //////
141
+ [Test]
142
+ public function add_2_listeners_then_remove_1_should_yield_length_of_1():void
143
+ {
144
+ var firstFunc:Function = newEmptyHandler();
145
+ completed.add(firstFunc);
146
+ completed.add(newEmptyHandler());
147
+
148
+ completed.remove(firstFunc);
149
+
150
+ assertEquals(1, completed.numListeners);
151
+ }
152
+
153
+ [Test]
154
+ public function add_2_listeners_then_removeAll_should_yield_length_of_0():void
155
+ {
156
+ completed.add(newEmptyHandler());
157
+ completed.add(newEmptyHandler());
158
+
159
+ completed.removeAll();
160
+
161
+ assertEquals(0, completed.numListeners);
162
+ }
163
+
164
+ [Test]
165
+ public function add_same_listener_twice_should_only_add_it_once():void
166
+ {
167
+ var func:Function = newEmptyHandler();
168
+ completed.add(func);
169
+ completed.add(func);
170
+ assertEquals(1, completed.numListeners);
171
+ }
172
+ //////
173
+ [Test]
174
+ public function dispatch_object_that_isnt_an_IEvent_should_dispatch_without_error():void
175
+ {
176
+ completed.addOnce(checkSprite);
177
+ // Sprite doesn't have a target property,
178
+ // so if the signal tried to set .target,
179
+ // an error would be thrown and this test would fail.
180
+ completed.dispatch(new Sprite());
181
+ }
182
+
183
+ private function checkSprite(sprite:Sprite):void
184
+ {
185
+ assertTrue(sprite is Sprite);
186
+ }
187
+ //////
188
+
189
+ }
190
+ }
@@ -0,0 +1,62 @@
1
+ package org.osflash.signals
2
+ {
3
+ import asunit.asserts.*;
4
+
5
+ import org.osflash.signals.events.GenericEvent;
6
+ import org.osflash.signals.events.IEvent;
7
+
8
+ public class GenericEventTest
9
+ {
10
+ private var instance:GenericEvent;
11
+
12
+ [Before]
13
+ public function setUp():void
14
+ {
15
+ instance = new GenericEvent();
16
+ }
17
+
18
+ [After]
19
+ public function tearDown():void
20
+ {
21
+ instance = null;
22
+ }
23
+
24
+ public function testInstantiated():void
25
+ {
26
+ assertTrue("GenericEvent instantiated", instance is GenericEvent);
27
+ assertNull('target is null by default', instance.target);
28
+ assertFalse('bubbles is false by default', instance.bubbles);
29
+ }
30
+
31
+ [Test]
32
+ public function bubbles_roundtrips_through_constructor():void
33
+ {
34
+ var bubblingEvent:GenericEvent = new GenericEvent(true);
35
+ assertTrue(bubblingEvent.bubbles);
36
+ }
37
+
38
+ [Test]
39
+ public function clone_should_be_instance_of_original_event_class():void
40
+ {
41
+ var theClone:IEvent = instance.clone();
42
+ assertTrue(theClone is GenericEvent);
43
+ }
44
+
45
+ [Test]
46
+ public function clone_non_bubbling_event_should_have_bubbles_false():void
47
+ {
48
+ var theClone:GenericEvent = GenericEvent(instance.clone());
49
+ assertFalse(theClone.bubbles);
50
+ }
51
+
52
+ [Test]
53
+ public function clone_bubbling_event_should_have_bubbles_true():void
54
+ {
55
+ var bubblingEvent:GenericEvent = new GenericEvent(true);
56
+ var theClone:IEvent = bubblingEvent.clone();
57
+ assertTrue(theClone.bubbles);
58
+ }
59
+
60
+
61
+ }
62
+ }
@@ -0,0 +1,68 @@
1
+ package org.osflash.signals
2
+ {
3
+ import asunit.asserts.*;
4
+ import asunit.framework.IAsync;
5
+
6
+ public class PriorityListenersTest
7
+ {
8
+ [Inject]
9
+ public var async:IAsync;
10
+
11
+ public var completed:DeluxeSignal;
12
+ private var listenersCalled:Array;
13
+
14
+ [Before]
15
+ public function setUp():void
16
+ {
17
+ completed = new DeluxeSignal(this);
18
+ listenersCalled = [];
19
+ }
20
+
21
+ [After]
22
+ public function tearDown():void
23
+ {
24
+ completed.removeAll();
25
+ completed = null;
26
+ listenersCalled = null;
27
+ }
28
+ //////
29
+ [Test]
30
+ public function listener_added_second_with_higher_priority_should_be_called_first():void
31
+ {
32
+ completed.addWithPriority( async.add(listener1, 5) );
33
+ completed.addWithPriority( async.add(listener0, 5), 10 );
34
+
35
+ completed.dispatch();
36
+ }
37
+
38
+ private function listener0():void
39
+ {
40
+ listenersCalled.push(arguments.callee);
41
+ assertSame('this should be the first listener called', arguments.callee, listenersCalled[0]);
42
+ }
43
+
44
+ private function listener1():void
45
+ {
46
+ listenersCalled.push(arguments.callee);
47
+ assertSame('this should be the second listener called', arguments.callee, listenersCalled[1]);
48
+ }
49
+
50
+ private function listener2():void
51
+ {
52
+ listenersCalled.push(arguments.callee);
53
+ assertSame('this should be the third listener called', arguments.callee, listenersCalled[2]);
54
+ }
55
+ //////
56
+ [Test]
57
+ public function listeners_added_with_same_priority_should_be_called_in_order_added():void
58
+ {
59
+ completed.addWithPriority( async.add(listener0, 5), 10 );
60
+ completed.addWithPriority( async.add(listener1, 5), 10 );
61
+ completed.addWithPriority( async.add(listener2, 5), 10 );
62
+
63
+ completed.dispatch();
64
+ }
65
+
66
+
67
+ }
68
+ }
@@ -0,0 +1,51 @@
1
+ package org.osflash.signals
2
+ {
3
+ import asunit.asserts.*;
4
+ import asunit.framework.IAsync;
5
+
6
+ import org.osflash.signals.events.GenericEvent;
7
+
8
+ public class RedispatchedEventTest
9
+ {
10
+ [Inject]
11
+ public var async:IAsync;
12
+
13
+ public var completed:DeluxeSignal;
14
+ protected var originalEvent:GenericEvent;
15
+
16
+ [Before]
17
+ public function setUp():void
18
+ {
19
+ completed = new DeluxeSignal(this);
20
+ }
21
+
22
+ [After]
23
+ public function tearDown():void
24
+ {
25
+ completed.removeAll();
26
+ completed = null;
27
+ }
28
+ //////
29
+ [Test]
30
+ public function dispatch_event_already_dispatched_should_clone_it():void
31
+ {
32
+ completed.add(async.add(redispatchEvent, 10));
33
+ originalEvent = new GenericEvent();
34
+ completed.dispatch(originalEvent);
35
+ }
36
+
37
+ private function redispatchEvent(e:GenericEvent):void
38
+ {
39
+ DeluxeSignal(e.signal).removeAll();
40
+ assertSame(originalEvent, e);
41
+ completed.add(async.add(check_redispatched_event_is_not_original, 10));
42
+
43
+ completed.dispatch(originalEvent);
44
+ }
45
+
46
+ private function check_redispatched_event_is_not_original(e:GenericEvent):void
47
+ {
48
+ assertNotSame(originalEvent, e);
49
+ }
50
+ }
51
+ }
@@ -0,0 +1,74 @@
1
+ package org.osflash.signals
2
+ {
3
+ import asunit.asserts.*;
4
+ import asunit.framework.IAsync;
5
+
6
+ public class SignalDispatchArgsTest
7
+ {
8
+ [Inject]
9
+ public var async:IAsync;
10
+
11
+ public var completed:Signal;
12
+
13
+ [Before]
14
+ public function setUp():void
15
+ {
16
+ completed = new Signal();
17
+ }
18
+
19
+ [After]
20
+ public function tearDown():void
21
+ {
22
+ completed.removeAll();
23
+ completed = null;
24
+ }
25
+
26
+ [Test]
27
+ public function dispatch_two_correct_value_objects_should_succeed():void
28
+ {
29
+ var signal:Signal = new Signal(String, uint);
30
+ signal.dispatch("the Answer", 42);
31
+ }
32
+
33
+ [Test(expects="ArgumentError")]
34
+ public function dispatch_fewer_value_objects_than_value_classes_should_should_throw_ArgumentError():void
35
+ {
36
+ var signal:Signal = new Signal(Date, Array);
37
+ signal.dispatch(new Date());
38
+ }
39
+
40
+ [Test]
41
+ public function dispatch_more_value_objects_than_value_classes_should_succeed():void
42
+ {
43
+ var signal:Signal = new Signal(Date, Array);
44
+ signal.dispatch(new Date(), new Array(), "extra value object");
45
+ }
46
+
47
+ [Test]
48
+ public function dispatch_values_with_no_value_classes_defined_should_pass_to_listener():void
49
+ {
50
+ var signalNoValueClasses:Signal = new Signal();
51
+ signalNoValueClasses.add( async.add(checkDispatchedValues, 10) );
52
+ signalNoValueClasses.dispatch(22, 'done', new Date());
53
+ }
54
+
55
+ private function checkDispatchedValues(a:uint, b:String, c:Date):void
56
+ {
57
+ assertEquals('correct number of arguments were dispatched', 3, arguments.length);
58
+ assertEquals('the uint was dispatched', 22, a);
59
+ assertEquals('the String was dispatched', 'done', b);
60
+ assertTrue('a Date was dispatched', c is Date);
61
+ }
62
+
63
+ [Test(expects="ArgumentError")]
64
+ public function dispatch_one_correct_and_one_incorrect_value_object_should_throw_ArgumentError():void
65
+ {
66
+ var signal:Signal = new Signal(Date, Array);
67
+ signal.dispatch(new Date(), "wrong value type");
68
+ }
69
+
70
+
71
+
72
+
73
+ }
74
+ }
@@ -0,0 +1,55 @@
1
+ package org.osflash.signals
2
+ {
3
+ import asunit.asserts.*;
4
+ import asunit.framework.IAsync;
5
+
6
+ public class SignalDispatchNoArgsTest
7
+ {
8
+ [Inject]
9
+ public var async:IAsync;
10
+
11
+ public var completed:Signal;
12
+
13
+ [Before]
14
+ public function setUp():void
15
+ {
16
+ completed = new Signal();
17
+ }
18
+
19
+ [After]
20
+ public function tearDown():void
21
+ {
22
+ completed.removeAll();
23
+ completed = null;
24
+ }
25
+ //////
26
+ [Test]
27
+ public function dispatch_no_args_should_call_listener_with_no_args():void
28
+ {
29
+ completed.add( async.add(onCompleted, 10) );
30
+ completed.dispatch();
31
+ }
32
+
33
+ private function onCompleted():void
34
+ {
35
+ assertEquals(0, arguments.length);
36
+ }
37
+ //////
38
+ [Test]
39
+ public function addOnce_in_handler_and_dispatch_should_call_new_listener():void
40
+ {
41
+ completed.addOnce( async.add(addOnceInHandler, 10) );
42
+ completed.dispatch();
43
+ }
44
+
45
+ protected function addOnceInHandler():void
46
+ {
47
+ completed.addOnce( async.add(secondAddOnceListener, 10) );
48
+ completed.dispatch();
49
+ }
50
+
51
+ protected function secondAddOnceListener():void
52
+ {
53
+ }
54
+ }
55
+ }
@@ -0,0 +1,81 @@
1
+ package org.osflash.signals
2
+ {
3
+ import asunit.asserts.*;
4
+ import asunit.framework.IAsync;
5
+
6
+ public class SignalDispatchNonEventTest
7
+ {
8
+ [Inject]
9
+ public var async:IAsync;
10
+
11
+ public var completed:Signal;
12
+
13
+ [Before]
14
+ public function setUp():void
15
+ {
16
+ completed = new Signal(Date);
17
+ }
18
+
19
+ [After]
20
+ public function tearDown():void
21
+ {
22
+ completed.removeAll();
23
+ completed = null;
24
+ }
25
+
26
+ /**
27
+ * Captures bug where dispatching 0 was considered null.
28
+ */
29
+ [Test]
30
+ public function dispatch_zero_should_call_listener_with_zero():void
31
+ {
32
+ completed = new Signal(Number);
33
+ completed.add( async.add(onZero, 10) );
34
+ completed.dispatch(0);
35
+ }
36
+
37
+ private function onZero(num:Number):void
38
+ {
39
+ assertEquals(0, num);
40
+ }
41
+ //////
42
+ [Test]
43
+ public function dispatch_2_zeroes_should_call_listener_with_2_zeroes():void
44
+ {
45
+ completed = new Signal(Number, Number);
46
+ completed.add( async.add(onZeroZero, 10) );
47
+ completed.dispatch(0, 0);
48
+ }
49
+
50
+ private function onZeroZero(a:Object, b:Object):void
51
+ {
52
+ assertEquals(0, a);
53
+ assertEquals(0, b);
54
+ }
55
+ //////
56
+ [Test]
57
+ public function dispatch_null_should_call_listener_with_null():void
58
+ {
59
+ completed.addOnce( async.add(checkNullDate, 10) );
60
+ completed.dispatch(null);
61
+ }
62
+
63
+ private function checkNullDate(date:Date):void
64
+ {
65
+ assertNull(date);
66
+ }
67
+ //////
68
+ [Test]
69
+ public function dispatch_null_through_int_Signal_should_be_autoconverted_to_zero():void
70
+ {
71
+ completed = new Signal(int);
72
+ completed.addOnce( async.add(checkNullConvertedToZero, 10) );
73
+ completed.dispatch(null);
74
+ }
75
+
76
+ private function checkNullConvertedToZero(intValue:int):void
77
+ {
78
+ assertEquals('null was converted to 0', 0, intValue);
79
+ }
80
+ }
81
+ }
@@ -0,0 +1,47 @@
1
+ package org.osflash.signals
2
+ {
3
+ import asunit.asserts.*;
4
+ import asunit.framework.IAsync;
5
+
6
+ public class SignalSplitInterfacesTest
7
+ {
8
+ [Inject]
9
+ public var async:IAsync;
10
+
11
+ // Notice the use of the ISignal interface, rather than Signal.
12
+ // This makes dispatch() inaccessible unless the ISignal is cast to IDispatcher or Signal.
13
+ public var completed:ISignal;
14
+
15
+ [Before]
16
+ public function setUp():void
17
+ {
18
+ completed = new Signal();
19
+ }
20
+
21
+ [After]
22
+ public function tearDown():void
23
+ {
24
+ Signal(completed).removeAll();
25
+ completed = null;
26
+ }
27
+
28
+ [Test]
29
+ public function cast_ISignal_to_IDispatcher_and_dispatch():void
30
+ {
31
+ completed.addOnce( async.add(onCompleted, 10) );
32
+ IDispatcher(completed).dispatch();
33
+ }
34
+
35
+ private function onCompleted():void
36
+ {
37
+ assertEquals(0, arguments.length);
38
+ }
39
+
40
+ [Test]
41
+ public function cast_ISignal_to_Signal_and_dispatch():void
42
+ {
43
+ completed.addOnce( async.add(onCompleted, 10) );
44
+ Signal(completed).dispatch();
45
+ }
46
+ }
47
+ }