Index: frog/tests/frog_native/native_exceptions1_frog_test.dart |
=================================================================== |
--- frog/tests/frog_native/native_exceptions1_frog_test.dart (revision 8644) |
+++ frog/tests/frog_native/native_exceptions1_frog_test.dart (working copy) |
@@ -1,99 +0,0 @@ |
-// Copyright (c) 2011, 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. |
- |
-// Test that hidden native exception classes can be marked as existing. |
-// |
-// To infer which native hidden types exist, we need |
-// (1) return types of native methods and getters |
-// (2) argument types of callbacks |
-// (3) exceptions thrown by the operation. |
-// |
-// (1) and (2) can be achieved by having nicely typed native methods, but there |
-// is no place in the Dart language to communicate (3). So we use the following |
-// fake body technique. |
- |
- |
-// The exception type. |
-class E native "*E" { |
- E._used() native; // Bogus native constructor, called only from fake body. |
- |
- final int code; |
-} |
- |
-// Type with exception-throwing methods. |
-class A native "*A" { |
- op(int x) native { |
- // Fake body calls constructor to mark the exception class (E) as used. |
- throw new E._used(); |
- } |
-} |
- |
-// This class is here just so that a dynamic context is polymorphic. |
-class B { |
- int get code() => 666; |
- op(String x) => 123; |
-} |
- |
-makeA() native; |
- |
-void setup1() native """ |
-// Ensure we are not relying on global names 'A' and 'E'. |
-A = null; |
-E = null; |
-"""; |
- |
-void setup2() native """ |
-// This code is all inside 'setup2' and so not accesible from the global scope. |
-function E(x){ this.code = x; } |
- |
-function A(){} |
-A.prototype.op = function (x) { |
- if (x & 1) throw new E(100); |
- return x / 2; |
-}; |
-makeA = function(){return new A}; |
-"""; |
- |
-int inscrutable(int x) => x == 0 ? 0 : x | inscrutable(x & (x - 1)); |
- |
-main() { |
- setup1(); |
- setup2(); |
- |
- var things = [makeA(), new B()]; |
- var a = things[inscrutable(0)]; |
- var b = things[inscrutable(1)]; |
- |
- Expect.equals(25, a.op(50)); |
- Expect.equals(123, b.op('hello')); |
- Expect.equals(666, b.code); |
- |
- bool threw = false; |
- try { |
- var x = a.op(51); |
- } catch (var e) { |
- threw = true; |
- Expect.equals(100, e.code); |
- Expect.isTrue(e is E); |
- } |
- Expect.isTrue(threw); |
- |
- // Again, but with statically typed receivers. |
- A aa = a; |
- B bb = b; |
- |
- Expect.equals(25, aa.op(50)); |
- Expect.equals(123, bb.op('hello')); |
- Expect.equals(666, bb.code); |
- |
- threw = false; |
- try { |
- var x = aa.op(51); |
- } catch (E e) { |
- threw = true; |
- Expect.equals(100, e.code); |
- Expect.isTrue(e is E); |
- } |
- Expect.isTrue(threw); |
-} |