Index: tests/compiler/dart2js/js_throw_behavior_test.dart |
diff --git a/tests/compiler/dart2js/js_throw_behavior_test.dart b/tests/compiler/dart2js/js_throw_behavior_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d1325821d314e61014b71c70c8cad3596ea4c4d0 |
--- /dev/null |
+++ b/tests/compiler/dart2js/js_throw_behavior_test.dart |
@@ -0,0 +1,95 @@ |
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+import 'package:expect/expect.dart'; |
+import 'package:compiler/src/native/native.dart'; |
+import 'package:compiler/src/js/js.dart' as js; |
+ |
+void test(String source, NativeThrowBehavior expectedThrowBehavior) { |
+ js.Template template = js.js.parseForeignJS(source); |
+ NativeThrowBehavior throwBehavior = |
+ new ThrowBehaviorVisitor().analyze(template.ast); |
+ Expect.equals(expectedThrowBehavior, throwBehavior, 'source "$source"'); |
+} |
+ |
+void main() { |
+ final MAY = NativeThrowBehavior.MAY; |
+ final MUST = NativeThrowBehavior.MUST; |
+ final NEVER = NativeThrowBehavior.NEVER; |
+ final NULL_NSM = NativeThrowBehavior.MAY_THROW_ONLY_ON_FIRST_ARGUMENT_ACCESS; |
+ |
+ test('0', NEVER); |
+ test('void 0', NEVER); |
+ test('#', NEVER); |
+ test('void #', NEVER); |
+ test('# + 1', NEVER); |
+ test('!#', NEVER); |
+ test('!!#', NEVER); |
+ test('~#', NEVER); |
+ test('~~#', NEVER); |
+ |
+ test('# * #', NEVER); |
+ test('# / #', NEVER); |
+ test('# % #', NEVER); |
+ test('# + #', NEVER); |
+ test('# - #', NEVER); |
+ |
+ test('# << #', NEVER); |
+ test('# >> #', NEVER); |
+ test('# >>> #', NEVER); |
+ |
+ test('# < #', NEVER); |
+ test('# > #', NEVER); |
+ test('# <= #', NEVER); |
+ test('# >= #', NEVER); |
+ |
+ test('# == #', NEVER); |
+ test('# != #', NEVER); |
+ test('# === #', NEVER); |
+ test('# !== #', NEVER); |
+ |
+ test('# & #', NEVER); |
+ test('# ^ #', NEVER); |
+ test('# | #', NEVER); |
+ |
+ test('# , #', NEVER); |
+ |
+ test('typeof(#) == "string"', NEVER); |
+ test('"object" === typeof #', NEVER); |
+ |
+ test('# == 1 || # == 2 || # == 3', NEVER); |
+ test('# != 1 && # != 2 && # != 3', NEVER); |
+ |
+ test('#.x', NULL_NSM); |
+ test('!!#.x', NULL_NSM); |
+ test('#.x + 1', NULL_NSM); |
+ test('1 + #.x', NULL_NSM); |
+ test('#[#] + 2', NULL_NSM); |
+ test('2 + #[#]', NULL_NSM); |
+ |
+ test('#.x == 1 || # == 1', NULL_NSM); |
+ test('# == 1 || #.x == 1', MAY); |
+ |
+ test('#[#][#]', MAY); |
+ test('# + #[#]', MAY); |
+ test('#()', MAY); |
+ test('(function(){})()', MAY); |
+ |
+ test('new Date(#)', MAY); |
+ test('# in #', MAY); |
+ |
+ test('console', MAY); |
+ test('Array', NEVER); |
+ test('Object', NEVER); |
+ |
+ test('typeof #', NEVER); |
+ test('typeof console', NEVER); |
+ test('typeof foo.#', MAY); |
+ test('typeof #.foo', NULL_NSM); |
+ |
+ test('throw 123', MUST); |
+ test('throw #', MUST); |
+ test('throw #.x', MUST); // Could be better: is also an NSM guard. |
+ test('throw #.x = 123', MUST); |
+} |