|  | // 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 the feature where the native string declares the native method's name. | 
|  | // #3. The name does not get | 
|  |  | 
|  | import 'native_testing.dart'; | 
|  |  | 
|  | @Native("A") | 
|  | class A { | 
|  | @JSName('fooA') | 
|  | int foo() native; | 
|  | } | 
|  |  | 
|  | @Native("B") | 
|  | class B extends A { | 
|  | @JSName('fooB') | 
|  | int foo() native; | 
|  | int fooA() => 333; | 
|  | } | 
|  |  | 
|  | class Decoy { | 
|  | int fooA() => 666; | 
|  | int fooB() => 999; | 
|  | } | 
|  |  | 
|  | makeA() native; | 
|  | makeB() native; | 
|  |  | 
|  | void setup() { | 
|  | JS('', r""" | 
|  | (function(){ | 
|  | // This code is inside 'setup' and so not accessible from the global scope. | 
|  | function inherits(child, parent) { | 
|  | if (child.prototype.__proto__) { | 
|  | child.prototype.__proto__ = parent.prototype; | 
|  | } else { | 
|  | function tmp() {}; | 
|  | tmp.prototype = parent.prototype; | 
|  | child.prototype = new tmp(); | 
|  | child.prototype.constructor = child; | 
|  | } | 
|  | } | 
|  | function A(){} | 
|  | A.prototype.fooA = function(){return 100;}; | 
|  | function B(){} | 
|  | inherits(B, A); | 
|  | B.prototype.fooB = function(){return 200;}; | 
|  |  | 
|  | self.makeA = function(){return new A()}; | 
|  | self.makeB = function(){return new B()}; | 
|  |  | 
|  | self.nativeConstructor(A); | 
|  | self.nativeConstructor(B); | 
|  | })()"""); | 
|  | applyTestExtensions(['A', 'B']); | 
|  | } | 
|  |  | 
|  | testDynamic() { | 
|  | var a = confuse(makeA()); | 
|  | var b = confuse(makeB()); | 
|  | var d = confuse(new Decoy()); | 
|  |  | 
|  | Expect.equals(100, a.foo()); | 
|  | Expect.equals(200, b.foo()); | 
|  | Expect.equals(666, d.fooA()); | 
|  | Expect.equals(999, d.fooB()); | 
|  |  | 
|  | expectNoSuchMethod(() { | 
|  | a.fooA(); | 
|  | }, 'fooA should be invisible on A'); | 
|  | Expect.equals(333, b.fooA()); | 
|  |  | 
|  | expectNoSuchMethod(() { | 
|  | a.fooB(); | 
|  | }, 'fooB should be absent on A'); | 
|  | expectNoSuchMethod(() { | 
|  | b.fooB(); | 
|  | }, 'fooA should be invisible on B'); | 
|  | } | 
|  |  | 
|  | testTyped() { | 
|  | A a = makeA(); | 
|  | B b = makeB(); | 
|  | Decoy d = new Decoy(); | 
|  |  | 
|  | Expect.equals(100, a.foo()); | 
|  | Expect.equals(200, b.foo()); | 
|  | Expect.equals(666, d.fooA()); | 
|  | Expect.equals(999, d.fooB()); | 
|  | } | 
|  |  | 
|  | main() { | 
|  | nativeTesting(); | 
|  | setup(); | 
|  |  | 
|  | testDynamic(); | 
|  | testTyped(); | 
|  | } | 
|  |  | 
|  | expectNoSuchMethod(action, note) { | 
|  | bool caught = false; | 
|  | try { | 
|  | action(); | 
|  | } on NoSuchMethodError catch (ex) { | 
|  | caught = true; | 
|  | Expect.isTrue(ex is NoSuchMethodError, note); | 
|  | } | 
|  | Expect.isTrue(caught, note); | 
|  | } |