OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 import "package:expect/expect.dart"; | 5 import "package:expect/expect.dart"; |
6 | 6 |
7 // InvocationMirror and noSuchMethod testing. | 7 // Invocation and noSuchMethod testing. |
8 | 8 |
9 /** Class with noSuchMethod that returns the mirror */ | 9 /** Class with noSuchMethod that returns the mirror */ |
10 class N { | 10 class N { |
11 // Storage for the last argument to noSuchMethod. | 11 // Storage for the last argument to noSuchMethod. |
12 // Needed for setters, which don't evaluate to the return value. | 12 // Needed for setters, which don't evaluate to the return value. |
13 var last; | 13 var last; |
14 noSuchMethod(InvocationMirror m) => last = m; | 14 noSuchMethod(Invocation m) => last = m; |
15 | 15 |
16 flif(int x) { Expect.fail("never get here"); } | 16 flif(int x) { Expect.fail("never get here"); } |
17 flaf([int x]) { Expect.fail("never get here"); } | 17 flaf([int x]) { Expect.fail("never get here"); } |
18 flof({int y}) { Expect.fail("never get here"); } | 18 flof({int y}) { Expect.fail("never get here"); } |
19 | 19 |
20 get wut => this; | 20 get wut => this; |
21 final int plif = 99; | 21 final int plif = 99; |
22 int get plaf { Expect.fail("never get here"); return 0; } | 22 int get plaf { Expect.fail("never get here"); return 0; } |
23 } | 23 } |
24 | 24 |
25 /** As [N] but also implements 'call', so we can call it with wrong arguments.*/ | 25 /** As [N] but also implements 'call', so we can call it with wrong arguments.*/ |
26 class C extends N { | 26 class C extends N { |
27 call(int x) { Expect.fail("never get here"); } | 27 call(int x) { Expect.fail("never get here"); } |
28 } | 28 } |
29 | 29 |
30 /** | 30 /** |
31 * Checks the data of an InvocationMirror. | 31 * Checks the data of an Invocation. |
32 * | 32 * |
33 * Call without optionals for getters, with only positional for setters, | 33 * Call without optionals for getters, with only positional for setters, |
34 * and with both optionals for everything else. | 34 * and with both optionals for everything else. |
35 */ | 35 */ |
36 testInvocationMirror(InvocationMirror im, String name, | 36 testInvocationMirror(Invocation im, String name, |
37 [List positional, Map named]) { | 37 [List positional, Map named]) { |
38 Expect.isTrue(im is InvocationMirror, "is InvocationMirror"); | 38 Expect.isTrue(im is Invocation, "is Invocation"); |
39 Expect.equals(name, im.memberName, "name"); | 39 Expect.equals(name, im.memberName, "name"); |
40 if (named == null) { | 40 if (named == null) { |
41 Expect.isTrue(im.isAccessor, "$name:isAccessor"); | 41 Expect.isTrue(im.isAccessor, "$name:isAccessor"); |
42 Expect.isFalse(im.isMethod, "$name:isMethod"); | 42 Expect.isFalse(im.isMethod, "$name:isMethod"); |
43 if (positional == null) { | 43 if (positional == null) { |
44 Expect.isTrue(im.isGetter, "$name:isGetter"); | 44 Expect.isTrue(im.isGetter, "$name:isGetter"); |
45 Expect.isFalse(im.isSetter, "$name:isSetter"); | 45 Expect.isFalse(im.isSetter, "$name:isSetter"); |
46 Expect.equals(0, im.positionalArguments.length, "$name:#positional"); | 46 Expect.equals(0, im.positionalArguments.length, "$name:#positional"); |
47 Expect.equals(0, im.namedArguments.length, "$name:#named"); | 47 Expect.equals(0, im.namedArguments.length, "$name:#named"); |
48 return; | 48 return; |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
145 // Closurizing a method means that calling it badly will not hit the | 145 // Closurizing a method means that calling it badly will not hit the |
146 // original receivers noSuchMethod, only the one inherited from Object | 146 // original receivers noSuchMethod, only the one inherited from Object |
147 // by the closure object. | 147 // by the closure object. |
148 Expect.throws(() { var x = n.flif; x(37, 42); }, | 148 Expect.throws(() { var x = n.flif; x(37, 42); }, |
149 (e) => e is NoSuchMethodError); | 149 (e) => e is NoSuchMethodError); |
150 Expect.throws(() { var x = c.call; x(37, 42); }, | 150 Expect.throws(() { var x = c.call; x(37, 42); }, |
151 (e) => e is NoSuchMethodError); | 151 (e) => e is NoSuchMethodError); |
152 } | 152 } |
153 | 153 |
154 class M extends N { | 154 class M extends N { |
155 noSuchMethod(InvocationMirror m) { throw "never get here"; } | 155 noSuchMethod(Invocation m) { throw "never get here"; } |
156 | 156 |
157 testSuperCalls() { | 157 testSuperCalls() { |
158 // Missing property/method access. | 158 // Missing property/method access. |
159 testInvocationMirror(super.bar, 'bar'); | 159 testInvocationMirror(super.bar, 'bar'); |
160 testInvocationMirror((){super.bar = 42; return last;}(), 'bar=', [42]); | 160 testInvocationMirror((){super.bar = 42; return last;}(), 'bar=', [42]); |
161 testInvocationMirror(super.bar(), 'bar', [], {}); | 161 testInvocationMirror(super.bar(), 'bar', [], {}); |
162 testInvocationMirror(super.bar(42), 'bar', [42], {}); | 162 testInvocationMirror(super.bar(42), 'bar', [42], {}); |
163 testInvocationMirror(super.bar(x: 42), 'bar', [], {"x": 42}); | 163 testInvocationMirror(super.bar(x: 42), 'bar', [], {"x": 42}); |
164 testInvocationMirror(super.bar(37, x: 42), 'bar', [37], {"x": 42}); | 164 testInvocationMirror(super.bar(37, x: 42), 'bar', [37], {"x": 42}); |
165 | 165 |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
237 test(() => o.hashCode = 42); | 237 test(() => o.hashCode = 42); |
238 test(() => o.hashCode()); // Thrown by int.noSuchMethod. | 238 test(() => o.hashCode()); // Thrown by int.noSuchMethod. |
239 test(() => (n.flif)()); // Extracted method has no noSuchMethod. | 239 test(() => (n.flif)()); // Extracted method has no noSuchMethod. |
240 } | 240 } |
241 | 241 |
242 main() { | 242 main() { |
243 testInvocationMirrors(); | 243 testInvocationMirrors(); |
244 testNoSuchMethodErrors(); | 244 testNoSuchMethodErrors(); |
245 new M().testSuperCalls(); | 245 new M().testSuperCalls(); |
246 } | 246 } |
OLD | NEW |