1
16
17 import org.as2lib.env.except.IllegalArgumentException;
18 import org.as2lib.env.overload.Overload;
19 import org.as2lib.env.reflect.PropertyInfo;
20 import org.as2lib.env.reflect.ClassInfo;
21 import org.as2lib.test.speed.AbstractTest;
22 import org.as2lib.test.speed.Test;
23 import org.as2lib.test.speed.SimpleTestSuiteResult;
24 import org.as2lib.test.speed.MethodTestCase;
25
26
31 class org.as2lib.test.speed.PropertyTestCase extends AbstractTest implements Test {
32
33
34 private var property:PropertyInfo;
35
36
37 private var getter:MethodTestCase;
38
39
40 private var setter:MethodTestCase;
41
42
46 public function PropertyTestCase() {
47 var o:Overload = new Overload(this);
48 o.addHandler([PropertyInfo], PropertyTestCaseByProperty);
49 o.addHandler([Object, String], PropertyTestCaseByObjectAndName);
50 o.forward(arguments);
51 }
52
53
67 public function PropertyTestCaseByProperty(property:PropertyInfo, referenceScope, referenceName:String):Void {
68 if (!property) {
69 throw new IllegalArgumentException("Argument 'property' [" + property + "] must not be 'null' nor 'undefined'.", this, arguments);
70 }
71 this.property = property;
72 setResult(new SimpleTestSuiteResult(property.getFullName()));
73 if (property.getGetter()) {
74 this.getter = new MethodTestCase(property.getGetter(), referenceScope, "__get__" + referenceName);
75 this.result.addTestResult(this.getter.getResult(NONE));
76 }
77 if (property.getSetter()) {
78 this.setter = new MethodTestCase(property.getSetter(), referenceScope, "__set__" + referenceName);
79 this.result.addTestResult(this.getter.getResult(NONE));
80 }
81 }
82
83
91 public function PropertyTestCaseByObjectAndName(object, propertyName:String):Void {
92 var c:ClassInfo = ClassInfo.forObject(object);
93 if (c.hasProperty(propertyName)) {
94 PropertyTestCaseByProperty(c.getPropertyByName(propertyName));
95 } else {
96 if (!object["__set__" + propertyName] && !object["__get__" + propertyName]) {
97 throw new IllegalArgumentException("Property with name [" + propertyName + "] does not exist on object [" + object + "].", this, arguments);
98 }
99 var setter:Function = object["__set__" + propertyName];
100 var getter:Function = object["__get__" + propertyName];
101 var p:PropertyInfo = new PropertyInfo(propertyName, c, false, setter, getter);
102 PropertyTestCaseByProperty(p, object, propertyName);
103 }
104 }
105
106
111 public function getProperty(Void):PropertyInfo {
112 return this.property;
113 }
114
115
118 public function run(Void):Void {
119 this.getter.run();
120 this.setter.run();
121 }
122
123 }