OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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 import 'package:compiler/src/js/js.dart' as js; | 6 import 'package:compiler/src/js/js.dart' as js; |
7 import 'package:compiler/src/js/placeholder_safety.dart'; | 7 import 'package:compiler/src/js/placeholder_safety.dart'; |
8 | 8 |
9 void test(String source, int expected, {List notNull: const[]}) { | 9 void test(String source, int expected, {List notNull: const []}) { |
10 var predicate = (int pos) => ! notNull.contains(pos); | 10 var predicate = (int pos) => !notNull.contains(pos); |
11 js.Template template = js.js.parseForeignJS(source); | 11 js.Template template = js.js.parseForeignJS(source); |
12 int actual = PlaceholderSafetyAnalysis.analyze(template.ast, predicate); | 12 int actual = PlaceholderSafetyAnalysis.analyze(template.ast, predicate); |
13 Expect.equals(expected, actual, 'source: "$source", notNull: $notNull'); | 13 Expect.equals(expected, actual, 'source: "$source", notNull: $notNull'); |
14 } | 14 } |
15 | 15 |
16 | |
17 void main() { | 16 void main() { |
18 test('0', 0); | 17 test('0', 0); |
19 | 18 |
20 test('#.x', 1); | 19 test('#.x', 1); |
21 test('!!#.x', 1); | 20 test('!!#.x', 1); |
22 test('#.x + 1', 1); | 21 test('#.x + 1', 1); |
23 test('1 + #.x', 1); | 22 test('1 + #.x', 1); |
24 test('#[#] + 2', 2); | 23 test('#[#] + 2', 2); |
25 test('2 + #[#]', 2); | 24 test('2 + #[#]', 2); |
26 test('(# & #) >>> 0', 2); | 25 test('(# & #) >>> 0', 2); |
27 | 26 |
28 test('#.a + #.b + #.c', 1); | 27 test('#.a + #.b + #.c', 1); |
29 test('#.b + #.b + #.c', 2, notNull: [0]); | 28 test('#.b + #.b + #.c', 2, notNull: [0]); |
30 test('#.c + #.b + #.c', 3, notNull: [0, 1]); | 29 test('#.c + #.b + #.c', 3, notNull: [0, 1]); |
31 test('#.d + #.b + #.c', 1, notNull: [1]); | 30 test('#.d + #.b + #.c', 1, notNull: [1]); |
32 | 31 |
33 test('typeof(#) == "string"', 1); | 32 test('typeof(#) == "string"', 1); |
34 test('"object" === typeof #', 1); | 33 test('"object" === typeof #', 1); |
35 | 34 |
36 test('# == 1 || # == 2 || # == 3', 1); | 35 test('# == 1 || # == 2 || # == 3', 1); |
37 test('# != 1 && # != 2 && # != 3', 1); | 36 test('# != 1 && # != 2 && # != 3', 1); |
38 | 37 |
39 test('#.x == 1 || # == 1', 1); | 38 test('#.x == 1 || # == 1', 1); |
40 test('# == 1 || #.x == 1', 1); | 39 test('# == 1 || #.x == 1', 1); |
41 | 40 |
42 test('(# || 1, #)', 1); // Could also be 2. | 41 test('(# || 1, #)', 1); // Could also be 2. |
43 | 42 |
44 test('(#, null.a, #)', 1); | 43 test('(#, null.a, #)', 1); |
45 test('(#, undefined.a, #)', 1); | 44 test('(#, undefined.a, #)', 1); |
46 test('(#, (void 0).a, #)', 1); | 45 test('(#, (void 0).a, #)', 1); |
47 test('(#, "a".a, #)', 2); | 46 test('(#, "a".a, #)', 2); |
48 test('((#, "a").a, #)', 2); | 47 test('((#, "a").a, #)', 2); |
49 | 48 |
50 test('#[#][#][#][#]', 2); | 49 test('#[#][#][#][#]', 2); |
51 test('#[#][#][#][#]', 3, notNull: [0]); | 50 test('#[#][#][#][#]', 3, notNull: [0]); |
52 test('#[#][#][#][#]', 3, notNull: [0, 1, 2, 3]); | 51 test('#[#][#][#][#]', 3, notNull: [0, 1, 2, 3]); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
89 test('throw #.x', 1); | 88 test('throw #.x', 1); |
90 | 89 |
91 test('(function(){})()', 0); | 90 test('(function(){})()', 0); |
92 test('(function(a,b){#})(#, #)', 0); | 91 test('(function(a,b){#})(#, #)', 0); |
93 // Placeholders in an immediate call are ok. | 92 // Placeholders in an immediate call are ok. |
94 test('(function(a,b){a++;b++;return a+b})(#, #)', 2); | 93 test('(function(a,b){a++;b++;return a+b})(#, #)', 2); |
95 | 94 |
96 test('# ? # : #', 1); | 95 test('# ? # : #', 1); |
97 test('(# ? 1 : #, #)', 1); | 96 test('(# ? 1 : #, #)', 1); |
98 test('(# ? # : 2, #)', 1); | 97 test('(# ? # : 2, #)', 1); |
99 test('(# ? 1 : 2, #)', 1); // Could also be 4. | 98 test('(# ? 1 : 2, #)', 1); // Could also be 4. |
100 | 99 |
101 test('{A:#, B:#, C:#}', 3); | 100 test('{A:#, B:#, C:#}', 3); |
102 test('[#,#,#,#]', 4); | 101 test('[#,#,#,#]', 4); |
103 test('[,,,,#,#,,,]', 2); | 102 test('[,,,,#,#,,,]', 2); |
104 } | 103 } |
OLD | NEW |