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,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
+ }