as3signals 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+ }