asunit4 4.2.1.pre

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 (150) hide show
  1. data/Gemfile +5 -0
  2. data/MIT-LICENSE.txt +22 -0
  3. data/README.textile +6 -0
  4. data/air/AIR2Runner.mxml +22 -0
  5. data/air/AIR2RunnerDescriptor.xml +38 -0
  6. data/asunit4.gemspec +20 -0
  7. data/asunit4.rb +16 -0
  8. data/bin/AsUnit-4.1.pre.swc +0 -0
  9. data/bin/AsUnitRunner.swf +0 -0
  10. data/build.xml +46 -0
  11. data/lib/Reflection.swc +0 -0
  12. data/rakefile.rb +169 -0
  13. data/script/generate +21 -0
  14. data/src/asunit/asserts/assertEquals.as +5 -0
  15. data/src/asunit/asserts/assertEqualsArrays.as +5 -0
  16. data/src/asunit/asserts/assertEqualsArraysIgnoringOrder.as +5 -0
  17. data/src/asunit/asserts/assertEqualsFloat.as +5 -0
  18. data/src/asunit/asserts/assertFalse.as +5 -0
  19. data/src/asunit/asserts/assertNotNull.as +5 -0
  20. data/src/asunit/asserts/assertNotSame.as +5 -0
  21. data/src/asunit/asserts/assertNull.as +5 -0
  22. data/src/asunit/asserts/assertSame.as +5 -0
  23. data/src/asunit/asserts/assertThrows.as +5 -0
  24. data/src/asunit/asserts/assertTrue.as +5 -0
  25. data/src/asunit/asserts/fail.as +5 -0
  26. data/src/asunit/core/AsUnitCore.as +177 -0
  27. data/src/asunit/core/FlashBuilderCore.as +22 -0
  28. data/src/asunit/core/FlashDevelopCore.as +21 -0
  29. data/src/asunit/core/TextCore.as +54 -0
  30. data/src/asunit/errors/AbstractError.as +10 -0
  31. data/src/asunit/errors/AssertionFailedError.as +10 -0
  32. data/src/asunit/errors/ClassNotFoundError.as +11 -0
  33. data/src/asunit/errors/InstanceNotFoundError.as +10 -0
  34. data/src/asunit/errors/UnimplementedFeatureError.as +10 -0
  35. data/src/asunit/errors/UsageError.as +11 -0
  36. data/src/asunit/events/TimeoutCommandEvent.as +27 -0
  37. data/src/asunit/framework/Assert.as +408 -0
  38. data/src/asunit/framework/Async.as +138 -0
  39. data/src/asunit/framework/CallbackBridge.as +175 -0
  40. data/src/asunit/framework/Command.as +6 -0
  41. data/src/asunit/framework/ErrorEvent.as +20 -0
  42. data/src/asunit/framework/IAsync.as +21 -0
  43. data/src/asunit/framework/IResult.as +36 -0
  44. data/src/asunit/framework/IRunListener.as +11 -0
  45. data/src/asunit/framework/IRunner.as +15 -0
  46. data/src/asunit/framework/IRunnerFactory.as +9 -0
  47. data/src/asunit/framework/ITestFailure.as +32 -0
  48. data/src/asunit/framework/ITestListener.as +15 -0
  49. data/src/asunit/framework/ITestResult.as +21 -0
  50. data/src/asunit/framework/ITestSuccess.as +22 -0
  51. data/src/asunit/framework/ITestWarning.as +14 -0
  52. data/src/asunit/framework/InjectionDelegate.as +96 -0
  53. data/src/asunit/framework/LegacyTestIterator.as +40 -0
  54. data/src/asunit/framework/MessageBridge.as +24 -0
  55. data/src/asunit/framework/Method.as +80 -0
  56. data/src/asunit/framework/Result.as +181 -0
  57. data/src/asunit/framework/RunnerFactory.as +179 -0
  58. data/src/asunit/framework/SuiteIterator.as +71 -0
  59. data/src/asunit/framework/TestCase.as +106 -0
  60. data/src/asunit/framework/TestFailure.as +65 -0
  61. data/src/asunit/framework/TestIterator.as +282 -0
  62. data/src/asunit/framework/TestObserver.as +12 -0
  63. data/src/asunit/framework/TestSuccess.as +38 -0
  64. data/src/asunit/framework/TestWarning.as +40 -0
  65. data/src/asunit/framework/TimeoutCommand.as +103 -0
  66. data/src/asunit/printers/FlashBuilderPrinter.as +134 -0
  67. data/src/asunit/printers/FlashDevelopPrinter.as +81 -0
  68. data/src/asunit/printers/TextPrinter.as +324 -0
  69. data/src/asunit/runners/LegacyRunner.as +13 -0
  70. data/src/asunit/runners/SuiteRunner.as +125 -0
  71. data/src/asunit/runners/TestRunner.as +403 -0
  72. data/src/asunit/util/ArrayIterator.as +30 -0
  73. data/src/asunit/util/Iterator.as +10 -0
  74. data/test/AllTests.as +73 -0
  75. data/test/AsUnitRunner.as +15 -0
  76. data/test/Flex3Runner.mxml +24 -0
  77. data/test/Flex4Runner.mxml +27 -0
  78. data/test/asunit/core/AsUnitCoreTest.as +97 -0
  79. data/test/asunit/framework/AssertEqualsArraysIgnoringOrderTest.as +88 -0
  80. data/test/asunit/framework/AssertEqualsArraysTest.as +102 -0
  81. data/test/asunit/framework/AssertTest.as +184 -0
  82. data/test/asunit/framework/AssertThrowsTest.as +42 -0
  83. data/test/asunit/framework/AsyncMethodTest.as +69 -0
  84. data/test/asunit/framework/AsyncTest.as +104 -0
  85. data/test/asunit/framework/CallbackBridgeTest.as +73 -0
  86. data/test/asunit/framework/InjectionDelegateTest.as +79 -0
  87. data/test/asunit/framework/MockData.xml +8 -0
  88. data/test/asunit/framework/NestedSuiteIteratorTest.as +59 -0
  89. data/test/asunit/framework/ProceedOnEventTest.as +109 -0
  90. data/test/asunit/framework/ResultTest.as +92 -0
  91. data/test/asunit/framework/RunnerFactoryTest.as +54 -0
  92. data/test/asunit/framework/SuiteIteratorTest.as +67 -0
  93. data/test/asunit/framework/TestCaseMock.as +24 -0
  94. data/test/asunit/framework/TestIteratorIgnoredMethodTest.as +62 -0
  95. data/test/asunit/framework/TestIteratorMethodByNameTest.as +50 -0
  96. data/test/asunit/framework/TestIteratorMultiMethodTest.as +186 -0
  97. data/test/asunit/framework/TestIteratorOrderedTestMethodTest.as +57 -0
  98. data/test/asunit/framework/TestIteratorSingleMethodTest.as +56 -0
  99. data/test/asunit/framework/VisualTestCaseTest.as +43 -0
  100. data/test/asunit/framework/assertAssertionFailed.as +19 -0
  101. data/test/asunit/printers/TextPrinterTest.as +122 -0
  102. data/test/asunit/runners/LegacyRunnerTest.as +40 -0
  103. data/test/asunit/runners/SuiteRunnerTest.as +40 -0
  104. data/test/asunit/runners/TestRunnerAsyncMethodTest.as +107 -0
  105. data/test/asunit/runners/TestRunnerErrorMethodTest.as +56 -0
  106. data/test/asunit/runners/TestRunnerExpectsErrorTest.as +98 -0
  107. data/test/asunit/runners/TestRunnerIgnoredMethodTest.as +42 -0
  108. data/test/asunit/runners/TestRunnerTest.as +171 -0
  109. data/test/asunit/support/AnnotatedSubClass.as +18 -0
  110. data/test/asunit/support/AnnotatedSuperClass.as +15 -0
  111. data/test/asunit/support/CustomParameters.as +13 -0
  112. data/test/asunit/support/CustomTestRunner.as +22 -0
  113. data/test/asunit/support/DoubleFailSuite.as +8 -0
  114. data/test/asunit/support/DoubleNestedSuite.as +14 -0
  115. data/test/asunit/support/ErrorInMethod.as +11 -0
  116. data/test/asunit/support/FailAssertEquals.as +29 -0
  117. data/test/asunit/support/FailAssertTrue.as +28 -0
  118. data/test/asunit/support/FakeObserver.as +42 -0
  119. data/test/asunit/support/FakeRunner.as +32 -0
  120. data/test/asunit/support/IgnoredMethod.as +26 -0
  121. data/test/asunit/support/InjectTimeoutOnAsync.as +14 -0
  122. data/test/asunit/support/InjectionFailure.as +18 -0
  123. data/test/asunit/support/InjectionVerification.as +69 -0
  124. data/test/asunit/support/LegacyTestCase.as +38 -0
  125. data/test/asunit/support/MultiMethod.as +77 -0
  126. data/test/asunit/support/OrderedTestMethod.as +36 -0
  127. data/test/asunit/support/RunWithButNoType.as +14 -0
  128. data/test/asunit/support/RunWithSuiteButNoType.as +11 -0
  129. data/test/asunit/support/SingleErrorSuite.as +7 -0
  130. data/test/asunit/support/SingleSuccessSuite.as +7 -0
  131. data/test/asunit/support/SucceedAssertTrue.as +31 -0
  132. data/test/asunit/support/SuiteOfTwoSuites.as +8 -0
  133. data/test/asunit/support/SuiteWithCustomRunner.as +12 -0
  134. data/test/asunit/support/SuiteWithOneCustomChildSuite.as +10 -0
  135. data/test/asunit/support/TestForFakeRunner.as +14 -0
  136. data/test/asunit/util/ArrayIteratorTest.as +65 -0
  137. data/vendor/as3reflection/README +7 -0
  138. data/vendor/as3reflection/p2/reflect/Reflection.as +417 -0
  139. data/vendor/as3reflection/p2/reflect/ReflectionAccessor.as +14 -0
  140. data/vendor/as3reflection/p2/reflect/ReflectionBase.as +52 -0
  141. data/vendor/as3reflection/p2/reflect/ReflectionMember.as +16 -0
  142. data/vendor/as3reflection/p2/reflect/ReflectionMetaData.as +69 -0
  143. data/vendor/as3reflection/p2/reflect/ReflectionMethod.as +36 -0
  144. data/vendor/as3reflection/p2/reflect/ReflectionMethodParameter.as +19 -0
  145. data/vendor/as3reflection/p2/reflect/ReflectionVariable.as +15 -0
  146. data/vendor/as3reflection/p2/reflect/findFirst.as +14 -0
  147. data/vendor/generators/suite/USAGE +0 -0
  148. data/vendor/generators/suite/suite_generator.rb +17 -0
  149. data/vendor/generators/suite/templates/TestSuite.as +17 -0
  150. metadata +216 -0
@@ -0,0 +1,417 @@
1
+ package p2.reflect {
2
+ import flash.net.getClassByAlias;
3
+ import flash.utils.Dictionary;
4
+ import flash.utils.describeType;
5
+ import flash.utils.getDefinitionByName;
6
+ import flash.utils.getQualifiedClassName;
7
+
8
+ public class Reflection extends ReflectionBase {
9
+
10
+ private static var READ_WRITE:String = "readwrite";
11
+ private static var READ_ONLY:String = "readonly";
12
+ private static var WRITE_ONLY:String = "writeonly";
13
+ private static var reflections:Object;
14
+ private var _accessors:Array;
15
+ private var _allMembers:Array;
16
+ private var _base:String;
17
+ private var _classReference:Class;
18
+ private var _constructor:ReflectionMethod;
19
+ private var _extendedClasses:Array;
20
+ private var _interfaceNames:Array;
21
+ private var _isClass:Boolean;
22
+ private var _isDynamic:Boolean;
23
+ private var _isFinal:Boolean;
24
+ private var _isInterface:Boolean;
25
+ private var _isStatic:Boolean;
26
+ private var _methodNames:Array;
27
+ private var _methods:Array;
28
+ private var _readMembers:Array;
29
+ private var _readWriteMembers:Array;
30
+ private var _types:Array;
31
+ private var _variables:Array;
32
+ private var _writeMembers:Array;
33
+
34
+ public function Reflection(classOrInstance:*) {
35
+ _isClass = (classOrInstance is Class);
36
+ super(describeType(classOrInstance));
37
+ }
38
+
39
+ public static function create(classOrInstance:*):Reflection {
40
+ var name:String = getCacheNameFromClassOrInstance(classOrInstance);
41
+ var cache:Object = getCache();
42
+ if(cache[name] != null) {
43
+ return cache[name];
44
+ }
45
+ return cache[name] = new Reflection(classOrInstance);
46
+ }
47
+
48
+ override protected function getRawMetaData():XMLList {
49
+ return description.factory.metadata;
50
+ }
51
+
52
+ private static function getCacheNameFromClassOrInstance(classOrInstance:*):String {
53
+ return getQualifiedClassName(classOrInstance) + ((classOrInstance is Class) ? "Class" : "");
54
+ }
55
+
56
+ private static function getCache():Object {
57
+ if(reflections == null) {
58
+ clearCache();
59
+ }
60
+ return reflections;
61
+ }
62
+
63
+ public static function clearCache():void {
64
+ reflections = new Object();
65
+ }
66
+
67
+ private function buildMethods():Array {
68
+ var methods:Array = new Array();
69
+ var list:XMLList = description..method;
70
+ var item:XML;
71
+ var method:ReflectionMethod
72
+ for each(item in list) {
73
+ method = new ReflectionMethod(item);
74
+ methods.push(method);
75
+ }
76
+ return methods;
77
+ }
78
+
79
+ private function buildAccessors():Array {
80
+ var accessors:Array = new Array();
81
+ var list:XMLList = description..accessor;
82
+ var item:XML;
83
+ var accessor:ReflectionAccessor;
84
+ for each(item in list) {
85
+ accessor = new ReflectionAccessor(item);
86
+ accessors.push(accessor);
87
+ }
88
+ return accessors;
89
+ }
90
+
91
+ public function get hasConstructor():Boolean {
92
+ return (constructor != null);
93
+ }
94
+
95
+ public function get classReference():Class {
96
+ return _classReference ||= getDefinitionByName(name.split("::").join(".")) as Class;
97
+ }
98
+
99
+ public function get constructor():ReflectionMethod {
100
+ return _constructor ||= buildConstructor();
101
+ }
102
+
103
+ private function buildConstructor():ReflectionMethod {
104
+ var constr:XML = description..constructor[0];
105
+ if(constr != null) {
106
+ return new ReflectionMethod(constr);
107
+ }
108
+ return null;
109
+ }
110
+
111
+ /**
112
+ * Returns whether or not this Class implements or extends the
113
+ * provided Class or Interface name.
114
+ *
115
+ * The name provided must be fully qualified and can use only
116
+ * dots to delimit between the package and class name (pkg.ClassName),
117
+ * or it can use the double-colon that Adobe seems to prefer.
118
+ *
119
+ **/
120
+ public function isA(fullyQualifiedClassOrInterfaceName:String):Boolean {
121
+ var cleanedName:String = normalizeEntityName(fullyQualifiedClassOrInterfaceName);
122
+ return referencesInterfaceOrClassName(function(name:String):Boolean {
123
+ return (name == cleanedName);
124
+ });
125
+ }
126
+
127
+ /**
128
+ * Works just like +isA+, but doesn't require a fully-qualified name,
129
+ * and will instead work with any portion of the full Class or Interface name.
130
+ **/
131
+ public function mightBeA(classOrInterfaceName:String):Boolean {
132
+ return referencesInterfaceOrClassName(function(name:String):Boolean {
133
+ return (name.indexOf(classOrInterfaceName) > -1);
134
+ });
135
+ }
136
+
137
+ private function referencesInterfaceOrClassName(matcher:Function):Boolean {
138
+ return findFirst(types, function(name:String, index:int, names:Array):Boolean {
139
+ return matcher.call(null, name);
140
+ });
141
+ }
142
+
143
+ /**
144
+ * Convert human-normal class names and return Adobe-generated Strings
145
+ * for matching purposes.
146
+ **/
147
+ private function normalizeEntityName(name:String):String {
148
+ if(name.indexOf('::') > -1 || name.indexOf('.') == -1) {
149
+ return name;
150
+ }
151
+ var parts:Array = name.split('.');
152
+ var className:String = parts.pop();
153
+ return [parts.join('.'), className].join('::');
154
+ }
155
+
156
+ public function hasAccessor(name:String, type:String, declaredBy:String=null):Boolean {
157
+ return findFirst(accessors, function(item:*, index:int, items:Array):Boolean {
158
+ return (item.name == name && item.type == type);
159
+ }) != null;
160
+ }
161
+
162
+ public function hasVariable(name:String, type:String):Boolean {
163
+ return findFirst(variables, function(item:*, index:int, items:Array):Boolean {
164
+ return (item.name == name && item.type == type);
165
+ }) != null;
166
+ }
167
+
168
+ public function hasReadWriteMember(name:String, type:String):Boolean {
169
+ return findFirst(readWriteMembers, function(item:*, index:int, items:Array):Boolean {
170
+ return (item.name == name && item.type == type);
171
+ }) != null;
172
+ }
173
+
174
+ public function hasWriteMember(name:String, type:String):Boolean {
175
+ return findFirst(writeMembers, function(item:*, index:int, items:Array):Boolean {
176
+ return (item.name == name && item.type == type);
177
+ }) != null;
178
+ }
179
+
180
+ public function get variables():Array {
181
+ return _variables ||= buildVariables();
182
+ }
183
+
184
+ private function buildVariables():Array {
185
+ var result:Array = [];
186
+ var list:XMLList = description..variable;
187
+ var item:XML;
188
+ for each(item in list) {
189
+ result.push(new ReflectionVariable(item));
190
+ }
191
+ return result;
192
+ }
193
+
194
+ public function get readWriteMembers():Array {
195
+ return _readWriteMembers ||= buildReadWriteMembers();
196
+ }
197
+
198
+ private function buildReadWriteMembers():Array {
199
+ var result:Array = [];
200
+
201
+ variables.forEach(function(item:*, index:int, items:Array):void {
202
+ result.push(item);
203
+ });
204
+
205
+ accessors.forEach(function(accessor:ReflectionAccessor, index:int, items:Array):void {
206
+ if(accessor.access == READ_WRITE) {
207
+ result.push(accessor);
208
+ }
209
+ });
210
+
211
+ return result;
212
+ }
213
+
214
+ public function get readMembers():Array {
215
+ if(_readMembers == null) {
216
+ _readMembers = [];
217
+ variables.forEach(function(item:*, index:int, items:Array):void {
218
+ _readMembers.push(item);
219
+ });
220
+ var accessors:Array = this.accessors;
221
+ var accessor:ReflectionAccessor
222
+ for each(accessor in accessors) {
223
+ if(accessor.access == READ_WRITE || accessor.access == READ_ONLY) {
224
+ _readMembers.push(accessor);
225
+ }
226
+ }
227
+ }
228
+
229
+ return _readMembers;
230
+ }
231
+
232
+ public function get writeMembers():Array {
233
+ if(_writeMembers == null) {
234
+ _writeMembers = [];
235
+ variables.forEach(function(item:*, index:int, items:Array):void {
236
+ _writeMembers.push(item);
237
+ });
238
+ var accessors:Array = this.accessors;
239
+ var accessor:ReflectionAccessor
240
+ for each(accessor in accessors) {
241
+ if(accessor.access == READ_WRITE || accessor.access == WRITE_ONLY) {
242
+ _writeMembers.push(accessor);
243
+ }
244
+ }
245
+ }
246
+
247
+ return _writeMembers;
248
+ }
249
+
250
+ public function get interfaceNames():Array {
251
+ return _interfaceNames ||= buildInterfaceNames();
252
+ }
253
+
254
+ private function buildInterfaceNames():Array {
255
+ var result:Array = new Array();
256
+ var list:XMLList = description..implementsInterface.@type;
257
+ var item:XML;
258
+ for each(item in list) {
259
+ result.push(item);
260
+ }
261
+ return result;
262
+ }
263
+
264
+ public function get extendedClasses():Array {
265
+ return _extendedClasses ||= buildExtendedClasses();
266
+ }
267
+
268
+ private function buildExtendedClasses():Array {
269
+ var result:Array = [];
270
+ var list:XMLList = description..extendsClass.@type;
271
+ var item:XML;
272
+ for each(item in list) {
273
+ result.push(item);
274
+ }
275
+ return result;
276
+ }
277
+
278
+ public function get types():Array {
279
+ return _types ||= extendedClasses.concat(interfaceNames);
280
+ }
281
+
282
+ public function get base():String {
283
+ return _base ||= description.@base;
284
+ }
285
+
286
+ public function get isInterface():Boolean {
287
+ return _isInterface ||= inferIsInterface();
288
+ }
289
+
290
+ private function inferIsInterface():Boolean {
291
+ return (base == "Class" && (description..factory..extendsClass.length() == 0));
292
+ }
293
+
294
+ public function get isClass():Boolean {
295
+ return _isClass;
296
+ }
297
+
298
+ public function get isDynamic():Boolean {
299
+ return _isDynamic ||= (description.@isDynamic == "true");
300
+ }
301
+
302
+ public function get isFinal():Boolean {
303
+ return _isFinal ||= (description.@isFinal == "true");
304
+ }
305
+
306
+ public function get isStatic():Boolean {
307
+ return _isStatic ||= (description.@isStatic == "true");
308
+ }
309
+
310
+ public function get methods():Array {
311
+ return _methods ||= buildMethods();
312
+ }
313
+
314
+ public function get accessors():Array {
315
+ return _accessors ||= buildAccessors();
316
+ }
317
+
318
+ /**
319
+ * An alphabetized list of all variables, accessors and methods.
320
+ **/
321
+ public function get allMembers():Array {
322
+ return _allMembers ||= buildAllMembers();
323
+ }
324
+
325
+ private function buildAllMembers():Array {
326
+ return variables.concat(accessors).concat(methods).sortOn('name');
327
+ }
328
+
329
+ public function get methodNames():Array {
330
+ return _methodNames ||= buildMethodNames();
331
+ }
332
+
333
+ private function buildMethodNames():Array {
334
+ var result:Array = [];
335
+ var list:XMLList = description..method.@name;
336
+ var item:XML;
337
+ for each(item in list) {
338
+ result.push(item.toString());
339
+ }
340
+ return result;
341
+ }
342
+
343
+ public function hasMethod(methodName:String):Boolean {
344
+ return (methodNames.indexOf(methodName) > -1);
345
+ }
346
+
347
+ /**
348
+ * Return an alphabetized list of all variables, accessors and
349
+ * methods that are annotated with the provided +metaDataName+.
350
+ **/
351
+ public function getMembersByMetaData(metaDataName:String):Array {
352
+ var result:Array = allMembers.filter(function(item:ReflectionMember, index:int, items:Array):Boolean {
353
+ return (item.getMetaDataByName(metaDataName) != null);
354
+ });
355
+ // We should have some way to remind folks to add a new metadata tag to
356
+ // their compiler options, shouldn't we?
357
+ // it's just that the following is really annoying...
358
+ //if(Reflection.WARN && result.length == 0) {
359
+ //var warning:String = "[WARNING] p2.reflect.Reflection.getMembersByMetaData was unable to find any members with meta data: " + metaDataName + "\n";
360
+ //warning += "Did you forget to add --keep-as3-metadata=" + metaDataName + " to your compiler options?\n";
361
+ //warning += "(set p2.reflect.Reflection.WARN = false to hide this message in the future)";
362
+ //trace(warning);
363
+ //}
364
+
365
+ return result;
366
+ }
367
+
368
+ /**
369
+ * Return an alphabetized list of all methods that are
370
+ * annotated with the provided +metaDataName+.
371
+ **/
372
+ public function getMethodsByMetaData(metaDataName:String):Array {
373
+ return methods.filter(function(item:ReflectionMember, index:int, items:Array):Boolean {
374
+ return (item.getMetaDataByName(metaDataName) != null);
375
+ });
376
+ }
377
+
378
+ public function getAccessorByName(name:String):ReflectionAccessor {
379
+ var ln:Number = accessors.length
380
+ for(var i:Number = 0; i < ln; i++) {
381
+ if(accessors[i].name == name) {
382
+ return accessors[i];
383
+ }
384
+ }
385
+ return null;
386
+ }
387
+
388
+ public function getMethodByName(name:String):ReflectionMethod {
389
+ var ln:Number = methods.length;
390
+ for(var i:Number = 0; i < ln; i++) {
391
+ if(methods[i].name == name) {
392
+ return methods[i];
393
+ }
394
+ }
395
+ return null;
396
+ }
397
+
398
+ // This implementation of Clone has some serious caveats...
399
+ // a) Only member variables and accessors that are read/write will be cloned
400
+ // b) The clone is shallow, meaning property references will not also be cloned
401
+ // c) Only argument-free constructors are supported
402
+ public static function clone(instance:Object):Object {
403
+ var reflection:Reflection = new Reflection(instance);
404
+ var clazz:Class = reflection.classReference;
405
+ var clone:Object = new clazz();
406
+ var members:Array = reflection.readWriteMembers;
407
+ var name:String;
408
+ var member:ReflectionMember;
409
+ for each(member in members) {
410
+ name = member.name;
411
+ clone[name] = instance[name];
412
+ }
413
+ return clone;
414
+ }
415
+ }
416
+ }
417
+
@@ -0,0 +1,14 @@
1
+ package p2.reflect {
2
+
3
+ public class ReflectionAccessor extends ReflectionVariable {
4
+ protected var _access:String;
5
+
6
+ public function ReflectionAccessor(description:XML) {
7
+ super(description);
8
+ }
9
+
10
+ public function get access():String {
11
+ return _access ||= description.@access;
12
+ }
13
+ }
14
+ }
@@ -0,0 +1,52 @@
1
+ package p2.reflect {
2
+
3
+ public class ReflectionBase {
4
+
5
+ private var _description:XML;
6
+ private var _metaDataItems:Array;
7
+ private var _name:String;
8
+
9
+ public function ReflectionBase(description:*) {
10
+ _description = description;
11
+ }
12
+
13
+ public function get name():String {
14
+ return _name ||= description.@name;
15
+ }
16
+
17
+ public function get description():XML {
18
+ return _description;
19
+ }
20
+
21
+ public function get metaDataItems():Array {
22
+ return _metaDataItems ||= parseMetaDataItems();
23
+ }
24
+
25
+ public function toString():String {
26
+ return description.toXMLString();
27
+ }
28
+
29
+ public function getMetaDataByName(name:String):ReflectionMetaData {
30
+ return findFirst(metaDataItems, function(item:*, index:int, items:Array):Boolean {
31
+ return (item.name == name);
32
+ });
33
+ }
34
+
35
+ // Class metadata is stored in a different
36
+ // location from member metadata... Boo.
37
+ protected function getRawMetaData():XMLList {
38
+ return description.metadata;
39
+ }
40
+
41
+ private function parseMetaDataItems():Array {
42
+ var items:Array = [];
43
+ var list:XMLList = getRawMetaData();
44
+ var item:XML;
45
+ for each(item in list) {
46
+ items.push(new ReflectionMetaData(item));
47
+ }
48
+ return items;
49
+ }
50
+ }
51
+ }
52
+
@@ -0,0 +1,16 @@
1
+ package p2.reflect {
2
+
3
+ public class ReflectionMember extends ReflectionBase {
4
+
5
+ protected var _declaredBy:String;
6
+
7
+ public function ReflectionMember(description:XML) {
8
+ super(description);
9
+ }
10
+
11
+ public function get declaredBy():String {
12
+ return _declaredBy ||= description.@declaredBy;
13
+ }
14
+
15
+ }
16
+ }
@@ -0,0 +1,69 @@
1
+ package p2.reflect {
2
+
3
+ /**
4
+ * Parses:
5
+ * <metadata name="BeforeFilter">
6
+ * <arg key="order" value="1"/>
7
+ * </metadata>
8
+ */
9
+ dynamic public class ReflectionMetaData {
10
+
11
+ private var _args:Array;
12
+ private var _xmlDescription:XML;
13
+ private var _name:String;
14
+
15
+ public function ReflectionMetaData(xmlDescription:XML) {
16
+ _xmlDescription = xmlDescription;
17
+ // Have to parse args here, because the
18
+ // args are appended to this instance - there's
19
+ // no getter to trigger the parse:
20
+ _args = parseArgs();
21
+ }
22
+
23
+ public function get name():String {
24
+ return _name ||= _xmlDescription.@name;
25
+ }
26
+
27
+ public function get xmlDescription():XML {
28
+ return _xmlDescription;
29
+ }
30
+
31
+ public function get args():Array {
32
+ return _args;
33
+ }
34
+
35
+ public function getValueFor(argumentKey:String):* {
36
+ var found:Object = findFirst(args, function(item:Object, index:int, items:Array):Boolean {
37
+ return (item.key == argumentKey);
38
+ });
39
+ if(found) {
40
+ return found.value;
41
+ }
42
+ return null;
43
+ }
44
+
45
+ public function toString():String {
46
+ return xmlDescription;
47
+ }
48
+
49
+ private function parseArgs():Array {
50
+ var items:Array = [];
51
+ var list:XMLList = xmlDescription..arg;
52
+ var item:XML;
53
+ var key:String;
54
+ var value:*;
55
+ for each(item in list) {
56
+ key = item.@key;
57
+ value = item.@value;
58
+ if(key == "") {
59
+ items.push(value);
60
+ }
61
+ else {
62
+ items.push({ key: key, value: value });
63
+ }
64
+ this[key] = value;
65
+ }
66
+ return items;
67
+ }
68
+ }
69
+ }
@@ -0,0 +1,36 @@
1
+ package p2.reflect {
2
+
3
+ public class ReflectionMethod extends ReflectionMember {
4
+
5
+ protected var _parameters:Array;
6
+ protected var _returnType:String;
7
+
8
+ public function ReflectionMethod(description:XML) {
9
+ super(description);
10
+ }
11
+
12
+ private function buildParameters():Array {
13
+ var parameters:Array = new Array();
14
+ var list:XMLList = description..parameter;
15
+ var param:ReflectionMethodParameter;
16
+ var item:XML;
17
+ for each(item in list) {
18
+ param = new ReflectionMethodParameter(item);
19
+ parameters.push(param);
20
+ }
21
+ return parameters;
22
+ }
23
+
24
+ public function get returnType():String {
25
+ return _returnType ||= description.@returnType;
26
+ }
27
+
28
+ public function get parameters():Array {
29
+ if(_parameters == null) {
30
+ _parameters = buildParameters();
31
+ }
32
+ return _parameters;
33
+ }
34
+ }
35
+ }
36
+
@@ -0,0 +1,19 @@
1
+ package p2.reflect {
2
+
3
+ public class ReflectionMethodParameter extends ReflectionVariable {
4
+ protected var _index:int;
5
+ protected var _optional:Boolean;
6
+
7
+ public function ReflectionMethodParameter(description:XML) {
8
+ super(description);
9
+ }
10
+
11
+ public function get index():int {
12
+ return _index ||= description.@index;
13
+ }
14
+
15
+ public function get optional():Boolean {
16
+ return _optional ||= (description.@optional == "true");
17
+ }
18
+ }
19
+ }
@@ -0,0 +1,15 @@
1
+ package p2.reflect {
2
+
3
+ public class ReflectionVariable extends ReflectionMember {
4
+
5
+ protected var _type:String;
6
+
7
+ public function ReflectionVariable(description:XML) {
8
+ super(description);
9
+ }
10
+
11
+ public function get type():String {
12
+ return _type ||= description.@type;
13
+ }
14
+ }
15
+ }
@@ -0,0 +1,14 @@
1
+ package p2.reflect {
2
+
3
+ public function findFirst(collection:Array, handler:Function):* {
4
+ var result:*;
5
+ var len:Number = collection.length;
6
+ for(var i:int; i < len; i++) {
7
+ result = collection[i];
8
+ if(handler(result, i, collection)) {
9
+ return result;
10
+ }
11
+ }
12
+ }
13
+ }
14
+
File without changes
@@ -0,0 +1,17 @@
1
+
2
+ # Generate a new ActionScript 3.0 test suite
3
+ # This generator can be executed as follows:
4
+ #
5
+ # sprout -n as3 SomeProject
6
+ # cd SomeProject
7
+ # script/generator suite
8
+ #
9
+ class SuiteGenerator < Sprout::Generator::NamedBase # :nodoc:
10
+
11
+ def manifest
12
+ record do |m|
13
+ m.template 'TestSuite.as', File.join(test_dir, 'AllTests.as'), :collision => :force
14
+ end
15
+ end
16
+
17
+ end
@@ -0,0 +1,17 @@
1
+ package {
2
+ /**
3
+ * This file has been automatically created using
4
+ * #!/usr/bin/ruby script/generate suite
5
+ * If you modify it and run this script, your
6
+ * modifications will be lost!
7
+ */
8
+ <% test_case_classes.each do |test_case| %>
9
+ import <%= test_case %>;<% end %>
10
+
11
+ [Suite]
12
+ public class AllTests {
13
+ <% test_case_classes.each do |test_case| %>
14
+ public var <%= test_case.gsub('.', '_') %>:<%= test_case %>;<% end %>
15
+ }
16
+ }
17
+