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,148 @@
1
+ package org.osflash.signals.natives
2
+ {
3
+ import asunit.asserts.*;
4
+ import asunit.framework.IAsync;
5
+
6
+ import org.osflash.signals.IDeluxeSignal;
7
+
8
+ import flash.display.Sprite;
9
+ import flash.events.Event;
10
+ import flash.events.MouseEvent;
11
+
12
+ public class NativeMappedSignalFunctionArgTest
13
+ {
14
+ [Inject]
15
+ public var async:IAsync;
16
+
17
+ private var signal:NativeMappedSignal;
18
+ private var signalMappingToEventType:NativeMappedSignal;
19
+ private var signalMappingToIncorrectEventType:NativeMappedSignal;
20
+ private var signalMappingToVoid:NativeMappedSignal;
21
+ private var sprite:Sprite;
22
+ private const EventType:String = MouseEvent.CLICK;
23
+ private const MappedObject:String = "mapped " + EventType;
24
+
25
+ [Before]
26
+ public function setUp():void
27
+ {
28
+ sprite = new Sprite();
29
+ signal = new NativeMappedSignal(sprite, EventType, MouseEvent, String).mapTo(
30
+ function ():String {
31
+ return MappedObject;
32
+ }
33
+ );
34
+
35
+ signalMappingToEventType = new NativeMappedSignal(sprite, EventType, MouseEvent, String).mapTo(
36
+ function (event:MouseEvent):String {
37
+ return event.type;
38
+ }
39
+ );
40
+
41
+ signalMappingToIncorrectEventType = new NativeMappedSignal(sprite, EventType, MouseEvent, String).mapTo(
42
+ function (event:MouseEvent):int {
43
+ return event.delta;
44
+ }
45
+ );
46
+
47
+ signalMappingToVoid = new NativeMappedSignal(sprite, EventType).mapTo(function ():void {});
48
+ }
49
+
50
+ [After]
51
+ public function tearDown():void
52
+ {
53
+ signal.removeAll();
54
+ signal = null;
55
+ signalMappingToEventType.removeAll();
56
+ signalMappingToEventType = null;
57
+ signalMappingToIncorrectEventType.removeAll();
58
+ signalMappingToIncorrectEventType = null;
59
+ signalMappingToVoid.removeAll();
60
+ signalMappingToVoid = null;
61
+ }
62
+
63
+ [Test]
64
+ public function testInstantiated():void
65
+ {
66
+ assertFalse('sprite has no click event listener to start', sprite.hasEventListener(EventType));
67
+
68
+ assertTrue("NativeMappedSignal instantiated", signal is NativeMappedSignal);
69
+ assertTrue('implements IDeluxeSignal', signal is IDeluxeSignal);
70
+ assertSame('has only one value class', 1, signal.valueClasses.length);
71
+ assertSame('single value class is of type String', String, signal.valueClasses[0]);
72
+
73
+ assertTrue("NativeMappedSignal instantiated", signalMappingToEventType is NativeMappedSignal);
74
+ assertTrue('implements IDeluxeSignal', signalMappingToEventType is IDeluxeSignal);
75
+ assertSame('has only one value class', 1, signalMappingToEventType.valueClasses.length);
76
+ assertSame('single value class is of type String', String, signalMappingToEventType.valueClasses[0]);
77
+
78
+ assertTrue("NativeMappedSignal instantiated", signalMappingToIncorrectEventType is NativeMappedSignal);
79
+ assertTrue('implements IDeluxeSignal', signalMappingToIncorrectEventType is IDeluxeSignal);
80
+ assertSame('has only one value class', 1, signalMappingToIncorrectEventType.valueClasses.length);
81
+ assertSame('single value class is of type String', String, signalMappingToIncorrectEventType.valueClasses[0]);
82
+
83
+ assertTrue("NativeMappedSignal instantiated", signalMappingToVoid is NativeMappedSignal);
84
+ assertTrue('implements IDeluxeSignal', signalMappingToVoid is IDeluxeSignal);
85
+ assertSame('has no value classes', 0, signalMappingToVoid.valueClasses.length);
86
+ }
87
+
88
+ private function dispatchTestEvent():void
89
+ {
90
+ sprite.dispatchEvent(buildTestEvent());
91
+ }
92
+
93
+ private function buildTestEvent():Event
94
+ {
95
+ return new MouseEvent(EventType);
96
+ }
97
+
98
+ //////
99
+ [Test]
100
+ public function signal_add_then_mapped_object_should_be_callback_argument():void
101
+ {
102
+ signal.add( async.add(checkMappedArgument, 10) );
103
+ dispatchTestEvent();
104
+ }
105
+
106
+ private function checkMappedArgument(argument:String):void
107
+ {
108
+ assertSame(MappedObject, argument);
109
+ }
110
+ //////
111
+ [Test]
112
+ public function mapping_function_should_receive_event_as_argument():void
113
+ {
114
+ signalMappingToEventType.add( async.add(checkMappedEventTypeArgument, 10) );
115
+ dispatchTestEvent();
116
+ }
117
+
118
+ private function checkMappedEventTypeArgument(argument:String):void
119
+ {
120
+ assertSame(EventType, argument);
121
+ }
122
+
123
+ [Test(expects="ArgumentError")]
124
+ public function mapping_function_has_to_many_arguments_should_throw_ArgumentError():void
125
+ {
126
+ var signal:NativeMappedSignal = new NativeMappedSignal(sprite, EventType, MouseEvent, String).mapTo(
127
+ function (event:MouseEvent, extraArg:Object):String {
128
+ return event.type;
129
+ }
130
+ );
131
+ }
132
+
133
+ [Test(expects="Error")]
134
+ public function mapping_function_returns_incorrectly_typed_argument_should_throw_Error():void
135
+ {
136
+ signalMappingToIncorrectEventType.dispatch(buildTestEvent());
137
+ }
138
+
139
+ private function emptyHandler(argument:String):void {}
140
+
141
+ [Test]
142
+ public function mapping_to_void():void
143
+ {
144
+ signalMappingToVoid.add(async.add(emptyHandler, 10));
145
+ dispatchTestEvent();
146
+ }
147
+ }
148
+ }
@@ -0,0 +1,95 @@
1
+ package org.osflash.signals.natives
2
+ {
3
+ import asunit.asserts.*;
4
+ import asunit.framework.IAsync;
5
+
6
+ import org.osflash.signals.IDeluxeSignal;
7
+
8
+ import flash.display.Sprite;
9
+ import flash.events.MouseEvent;
10
+
11
+ public class NativeMappedSignalFunctionNoArgsTest
12
+ {
13
+ [Inject]
14
+ public var async:IAsync;
15
+
16
+ private var signalSingle:NativeMappedSignal;
17
+ private var signalList:NativeMappedSignal;
18
+ private var sprite:Sprite;
19
+ private const EventType:String = MouseEvent.CLICK;
20
+ private const MappedObject:String = "mapped " + EventType;
21
+ private const MappedObject2:int = 3;
22
+ private const MappedObject3:Number = 3.1415;
23
+
24
+ [Before]
25
+ public function setUp():void
26
+ {
27
+ sprite = new Sprite();
28
+ signalSingle = new NativeMappedSignal(sprite, EventType, MouseEvent, String).mapTo(
29
+ function ():String {
30
+ return MappedObject;
31
+ }
32
+ );
33
+
34
+ signalList = new NativeMappedSignal(sprite, EventType, MouseEvent, String, int, Number).mapTo(
35
+ function ():Array
36
+ {
37
+ return [MappedObject, MappedObject2, MappedObject3];
38
+ }
39
+ );
40
+ }
41
+
42
+ [After]
43
+ public function tearDown():void
44
+ {
45
+ signalSingle.removeAll();
46
+ signalSingle = null;
47
+ signalList.removeAll();
48
+ signalList = null;
49
+ }
50
+
51
+ [Test]
52
+ public function testInstantiated():void
53
+ {
54
+ assertFalse('sprite has no click event listener to start', sprite.hasEventListener(EventType));
55
+
56
+ assertTrue("NativeMappedSignal instantiated", signalSingle is NativeMappedSignal);
57
+ assertTrue('implements IDeluxeSignal', signalSingle is IDeluxeSignal);
58
+ assertSame('has only one value class', 1, signalSingle.valueClasses.length);
59
+ assertSame('single value class is of type String', String, signalSingle.valueClasses[0]);
60
+
61
+ assertTrue("NativeMappedSignal instantiated", signalList is NativeMappedSignal);
62
+ assertTrue('implements IDeluxeSignal', signalList is IDeluxeSignal);
63
+ assertSame('has three value classes', 3, signalList.valueClasses.length);
64
+ assertSame('first value class is of type String', String, signalList.valueClasses[0]);
65
+ assertSame('second value class is of type int', int, signalList.valueClasses[1]);
66
+ assertSame('third value class is of type Number', Number, signalList.valueClasses[2]);
67
+ }
68
+ //////
69
+ [Test]
70
+ public function signal_add_then_mapped_object_should_be_callback_argument():void
71
+ {
72
+ signalSingle.add( async.add(checkMappedArgumentSingle, 10) );
73
+ sprite.dispatchEvent(new MouseEvent(EventType));
74
+ }
75
+
76
+ private function checkMappedArgumentSingle(argument:String):void
77
+ {
78
+ assertSame(MappedObject, argument);
79
+ }
80
+ //////
81
+ [Test]
82
+ public function signal_list_add_then_mapped_object_should_be_callback_argument():void
83
+ {
84
+ signalList.add( async.add(checkMappedArgumentList, 10) );
85
+ sprite.dispatchEvent(new MouseEvent(EventType));
86
+ }
87
+
88
+ private function checkMappedArgumentList(argument1:String, argument2:int, argument3:Number):void
89
+ {
90
+ assertSame(MappedObject, argument1);
91
+ assertSame(MappedObject2, argument2);
92
+ assertSame(MappedObject3, argument3);
93
+ }
94
+ }
95
+ }
@@ -0,0 +1,85 @@
1
+ package org.osflash.signals.natives
2
+ {
3
+ import asunit.asserts.*;
4
+ import asunit.framework.IAsync;
5
+
6
+ import org.osflash.signals.IDeluxeSignal;
7
+
8
+ import flash.display.Sprite;
9
+ import flash.events.MouseEvent;
10
+
11
+ public class NativeMappedSignalObjectArgTest
12
+ {
13
+ [Inject]
14
+ public var async:IAsync;
15
+
16
+ private var signalSingle:NativeMappedSignal;
17
+ private var signalList:NativeMappedSignal;
18
+ private var sprite:Sprite;
19
+ private const EventType:String = MouseEvent.CLICK;
20
+ private const MappedObject:String = "mapped " + EventType;
21
+ private const MappedObject2:int = 3;
22
+ private const MappedObject3:Number = 3.1415;
23
+
24
+ [Before]
25
+ public function setUp():void
26
+ {
27
+ sprite = new Sprite();
28
+ signalSingle = new NativeMappedSignal(sprite, EventType, MouseEvent, String).mapTo(MappedObject);
29
+ signalList = new NativeMappedSignal(sprite, EventType, MouseEvent, String, int, Number).mapTo(MappedObject, MappedObject2, MappedObject3);
30
+ }
31
+
32
+ [After]
33
+ public function tearDown():void
34
+ {
35
+ signalSingle.removeAll();
36
+ signalSingle = null;
37
+ signalList.removeAll();
38
+ signalList = null;
39
+ }
40
+
41
+ [Test]
42
+ public function testInstantiated():void
43
+ {
44
+ assertFalse('sprite has no click event listener to start', sprite.hasEventListener(EventType));
45
+
46
+ assertTrue("NativeMappedSignal instantiated", signalSingle is NativeMappedSignal);
47
+ assertTrue('implements ISignal', signalSingle is IDeluxeSignal);
48
+ assertSame('has only one value class', 1, signalSingle.valueClasses.length);
49
+ assertSame('single value class is of type String', String, signalSingle.valueClasses[0]);
50
+
51
+ assertTrue("NativeMappedSignal instantiated", signalList is NativeMappedSignal);
52
+ assertTrue('implements IDeluxeSignal', signalList is IDeluxeSignal);
53
+ assertSame('has three value classes', 3, signalList.valueClasses.length);
54
+ assertSame('first value class is of type String', String, signalList.valueClasses[0]);
55
+ assertSame('second value class is of type int', int, signalList.valueClasses[1]);
56
+ assertSame('third value class is of type Number', Number, signalList.valueClasses[2]);
57
+ }
58
+ //////
59
+ [Test]
60
+ public function signal_single_add_then_mapped_object_should_be_callback_argument():void
61
+ {
62
+ signalSingle.add( async.add(checkMappedArgumentSingle, 10) );
63
+ sprite.dispatchEvent(new MouseEvent(EventType));
64
+ }
65
+
66
+ private function checkMappedArgumentSingle(argument:String):void
67
+ {
68
+ assertSame(MappedObject, argument);
69
+ }
70
+ //////
71
+ [Test]
72
+ public function signal_list_add_then_mapped_object_should_be_callback_argument():void
73
+ {
74
+ signalList.add( async.add(checkMappedArgumentList, 10) );
75
+ sprite.dispatchEvent(new MouseEvent(EventType));
76
+ }
77
+
78
+ private function checkMappedArgumentList(argument1:String, argument2:int, argument3:Number):void
79
+ {
80
+ assertSame(MappedObject, argument1);
81
+ assertSame(MappedObject2, argument2);
82
+ assertSame(MappedObject3, argument3);
83
+ }
84
+ }
85
+ }
@@ -0,0 +1,174 @@
1
+ package org.osflash.signals.natives
2
+ {
3
+ import asunit.asserts.*;
4
+ import asunit.framework.IAsync;
5
+
6
+ import org.osflash.signals.ISignal;
7
+
8
+ import flash.display.Sprite;
9
+ import flash.events.EventDispatcher;
10
+ import flash.events.MouseEvent;
11
+
12
+ public class NativeRelaySignalTest
13
+ {
14
+ [Inject]
15
+ public var async:IAsync;
16
+
17
+ private var clicked:NativeRelaySignal;
18
+ private var sprite:Sprite;
19
+
20
+ [Before]
21
+ public function setUp():void
22
+ {
23
+ sprite = new Sprite();
24
+ clicked = new NativeRelaySignal(sprite, 'click', MouseEvent);
25
+ }
26
+
27
+ [After]
28
+ public function tearDown():void
29
+ {
30
+ clicked.removeAll();
31
+ clicked = null;
32
+ }
33
+
34
+ public function testInstantiated():void
35
+ {
36
+ assertTrue("NativeRelaySignal instantiated", clicked is NativeRelaySignal);
37
+ assertTrue('implements ISignal', clicked is ISignal);
38
+ assertFalse('sprite has no click event listener to start', sprite.hasEventListener('click'));
39
+ }
40
+ //////
41
+ [Test]
42
+ public function signal_add_then_EventDispatcher_dispatch_should_call_signal_listener():void
43
+ {
44
+ clicked.add( async.add(checkSpriteAsCurrentTarget, 10) );
45
+ sprite.dispatchEvent(new MouseEvent('click'));
46
+ }
47
+
48
+ private function checkSpriteAsCurrentTarget(e:MouseEvent):void
49
+ {
50
+ assertSame(sprite, e.currentTarget);
51
+ }
52
+ //////
53
+ [Test]
54
+ public function signal_addOnce_then_EventDispatcher_dispatch_should_call_signal_listener():void
55
+ {
56
+ clicked.addOnce( async.add(checkSpriteAsCurrentTarget, 10) );
57
+ sprite.dispatchEvent(new MouseEvent('click'));
58
+ }
59
+ //////
60
+ [Test]
61
+ public function when_signal_adds_listener_then_hasEventListener_should_be_true():void
62
+ {
63
+ clicked.add(emptyHandler);
64
+ assertTrue(sprite.hasEventListener('click'));
65
+ }
66
+
67
+ private function emptyHandler(e:MouseEvent):void { }
68
+
69
+ [Test]
70
+ public function when_signal_addOnce_listener_then_hasEventListener_should_be_true():void
71
+ {
72
+ clicked.addOnce(emptyHandler);
73
+ assertTrue(sprite.hasEventListener('click'));
74
+ }
75
+
76
+ [Test]
77
+ public function when_signal_adds_then_removes_listener_then_hasEventListener_should_be_false():void
78
+ {
79
+ clicked.add(emptyHandler);
80
+ clicked.remove(emptyHandler);
81
+ assertFalse(sprite.hasEventListener('click'));
82
+ }
83
+
84
+ [Test]
85
+ public function when_signal_addOnce_then_removes_listener_then_hasEventListener_should_be_false():void
86
+ {
87
+ clicked.addOnce(emptyHandler);
88
+ clicked.remove(emptyHandler);
89
+ assertFalse(sprite.hasEventListener('click'));
90
+ }
91
+
92
+ [Test]
93
+ public function when_signal_adds_then_removeAll_listeners_then_hasEventListener_should_be_false():void
94
+ {
95
+ clicked.add(emptyHandler);
96
+ clicked.removeAll();
97
+ assertFalse(sprite.hasEventListener('click'));
98
+ }
99
+ //////
100
+ [Test]
101
+ public function setting_target_to_a_different_object_should_remove_all_listeners_from_1st_target():void
102
+ {
103
+ clicked.add(emptyHandler);
104
+ clicked.target = new EventDispatcher();
105
+ assertFalse(sprite.hasEventListener('click'));
106
+ }
107
+ //////
108
+ [Test]
109
+ public function setting_target_to_the_same_object_should_not_remove_listeners():void
110
+ {
111
+ clicked.add(emptyHandler);
112
+ var numListenersBefore:uint = clicked.numListeners;
113
+ clicked.target = sprite;
114
+ assertEquals(numListenersBefore, clicked.numListeners);
115
+ }
116
+ //////
117
+ [Test]
118
+ public function addOnce_and_dispatch_should_remove_listener_automatically():void
119
+ {
120
+ clicked.addOnce(emptyHandler);
121
+ clicked.dispatch(new MouseEvent('click'));
122
+ assertEquals('there should be no listeners', 0, clicked.numListeners);
123
+ }
124
+
125
+ //////
126
+ [Test]
127
+ public function can_use_anonymous_listeners():void
128
+ {
129
+ var listeners:Array = [];
130
+
131
+ for ( var i:int = 0; i < 100; i++ )
132
+ {
133
+ listeners.push(clicked.add(function(e:MouseEvent):void{}));
134
+ }
135
+
136
+ assertTrue("there should be 100 listeners", clicked.numListeners == 100);
137
+
138
+ for each( var fnt:Function in listeners )
139
+ {
140
+ clicked.remove(fnt);
141
+ }
142
+ assertTrue("all anonymous listeners removed", clicked.numListeners == 0);
143
+ }
144
+
145
+ //////
146
+ [Test]
147
+ public function can_use_anonymous_listeners_in_addOnce():void
148
+ {
149
+ var listeners:Array = [];
150
+
151
+ for ( var i:int = 0; i < 100; i++ )
152
+ {
153
+ listeners.push(clicked.addOnce(function(e:MouseEvent):void{}));
154
+ }
155
+
156
+ assertTrue("there should be 100 listeners", clicked.numListeners == 100);
157
+
158
+ for each( var fnt:Function in listeners )
159
+ {
160
+ clicked.remove(fnt);
161
+ }
162
+ assertTrue("all anonymous listeners removed", clicked.numListeners == 0);
163
+ }
164
+
165
+ //////
166
+ [Test]
167
+ public function removed_listener_should_be_returned():void
168
+ {
169
+ var listener:Function = clicked.add(function(e:MouseEvent):void{});
170
+
171
+ assertTrue("Listener is returned", listener == clicked.remove(listener));
172
+ }
173
+ }
174
+ }