|  | // Copyright (c) 2013, 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 'native_testing.dart'; | 
|  | import 'dart:_js_helper' show setNativeSubclassDispatchRecord; | 
|  | import 'dart:_interceptors' show Interceptor, findInterceptorForType; | 
|  |  | 
|  | // Test type checks. | 
|  |  | 
|  | class I {} | 
|  |  | 
|  | class M implements I { | 
|  | miz() => 'M'; | 
|  | } | 
|  |  | 
|  | @Native("N") | 
|  | class N {} | 
|  |  | 
|  | class A extends N {} | 
|  |  | 
|  | class B extends A with M {} | 
|  |  | 
|  | class Checks<T> { | 
|  | bool isCheck(x) => x is T; | 
|  | void assignCheck(x) { | 
|  | T z = x; | 
|  | Expect.identical(x, z); | 
|  | } | 
|  |  | 
|  | void castCheck(x) { | 
|  | var z = x as T; | 
|  | Expect.identical(x, z); | 
|  | } | 
|  | } | 
|  |  | 
|  | makeB() native; | 
|  |  | 
|  | @Creates('=Object') | 
|  | getBPrototype() native; | 
|  |  | 
|  | void setup() { | 
|  | JS('', r""" | 
|  | (function(){ | 
|  | function B() {} | 
|  | makeB = function(){return new B()}; | 
|  | getBPrototype = function(){return B.prototype;}; | 
|  | })()"""); | 
|  | } | 
|  |  | 
|  | bool isCheckedMode() { | 
|  | var isChecked = false; | 
|  | assert(isChecked = true); | 
|  | return isChecked; | 
|  | } | 
|  |  | 
|  | testIsI(x) { | 
|  | Expect.isTrue(x is I); | 
|  | } | 
|  |  | 
|  | testIsM(x) { | 
|  | Expect.isTrue(x is M); | 
|  | } | 
|  |  | 
|  | testIsN(x) { | 
|  | Expect.isTrue(x is N); | 
|  | } | 
|  |  | 
|  | testIsA(x) { | 
|  | Expect.isTrue(x is A); | 
|  | } | 
|  |  | 
|  | testIsB(x) { | 
|  | Expect.isTrue(x is B); | 
|  | } | 
|  |  | 
|  | testAssignI(x) { | 
|  | I z = x; | 
|  | Expect.identical(x, z); | 
|  | } | 
|  |  | 
|  | testAssignM(x) { | 
|  | M z = x; | 
|  | Expect.identical(x, z); | 
|  | } | 
|  |  | 
|  | testAssignN(x) { | 
|  | N z = x; | 
|  | Expect.identical(x, z); | 
|  | } | 
|  |  | 
|  | testAssignA(x) { | 
|  | A z = x; | 
|  | Expect.identical(x, z); | 
|  | } | 
|  |  | 
|  | testAssignB(x) { | 
|  | B z = x; | 
|  | Expect.identical(x, z); | 
|  | } | 
|  |  | 
|  | testCastI(x) { | 
|  | var z = x as I; | 
|  | Expect.identical(x, z); | 
|  | } | 
|  |  | 
|  | testCastM(x) { | 
|  | var z = x as M; | 
|  | Expect.identical(x, z); | 
|  | } | 
|  |  | 
|  | testCastN(x) { | 
|  | var z = x as N; | 
|  | Expect.identical(x, z); | 
|  | } | 
|  |  | 
|  | testCastA(x) { | 
|  | var z = x as A; | 
|  | Expect.identical(x, z); | 
|  | } | 
|  |  | 
|  | testCastB(x) { | 
|  | var z = x as B; | 
|  | Expect.identical(x, z); | 
|  | } | 
|  |  | 
|  | main() { | 
|  | nativeTesting(); | 
|  | setup(); | 
|  |  | 
|  | setNativeSubclassDispatchRecord(getBPrototype(), findInterceptorForType(B)); | 
|  |  | 
|  | var b = confuse(makeB()); | 
|  |  | 
|  | confuse(testIsB)(b); | 
|  | confuse(testIsA)(b); | 
|  | confuse(testIsN)(b); | 
|  | confuse(testIsM)(b); | 
|  | confuse(testIsI)(b); | 
|  |  | 
|  | confuse(new Checks<B>().isCheck)(b); | 
|  | confuse(new Checks<A>().isCheck)(b); | 
|  | confuse(new Checks<N>().isCheck)(b); | 
|  | confuse(new Checks<M>().isCheck)(b); | 
|  | confuse(new Checks<I>().isCheck)(b); | 
|  |  | 
|  | if (isCheckedMode()) { | 
|  | confuse(testAssignB)(b); | 
|  | confuse(testAssignA)(b); | 
|  | confuse(testAssignN)(b); | 
|  | confuse(testAssignM)(b); | 
|  | confuse(testAssignI)(b); | 
|  |  | 
|  | confuse(testCastB)(b); | 
|  | confuse(testCastA)(b); | 
|  | confuse(testCastN)(b); | 
|  | confuse(testCastM)(b); | 
|  | confuse(testCastI)(b); | 
|  |  | 
|  | confuse(new Checks<B>().assignCheck)(b); | 
|  | confuse(new Checks<A>().assignCheck)(b); | 
|  | confuse(new Checks<N>().assignCheck)(b); | 
|  | confuse(new Checks<M>().assignCheck)(b); | 
|  | confuse(new Checks<I>().assignCheck)(b); | 
|  |  | 
|  | confuse(new Checks<B>().castCheck)(b); | 
|  | confuse(new Checks<A>().castCheck)(b); | 
|  | confuse(new Checks<N>().castCheck)(b); | 
|  | confuse(new Checks<M>().castCheck)(b); | 
|  | confuse(new Checks<I>().castCheck)(b); | 
|  | } | 
|  | } |