// 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. // dart2jsOptions=--no-minify import "package:expect/expect.dart"; // Test for correct order of exceptions in code with checks that could be moved // merged from successors into a dominator. get never => new DateTime.now().millisecondsSinceEpoch == 42; get always => new DateTime.now().millisecondsSinceEpoch > 42; // gA and gB have type [null|num], so they compile to a receiver check, and // argument check and then the operation. var gA; // [null|num] var gB; // [null|num] foo1(a, b) { // The checks on a and b are not equivalent, so can't be merged. if (never) { return a ^ b; } else { return b ^ a; } } call1() { return foo1(gA, gB); } test1() { gA = 1; gB = 2; Expect.equals(3, call1()); gA = null; gB = null; Expect.throws(call1, (e) => e is NoSuchMethodError, 'foo1($gA, $gB) NSME'); gA = 1; gB = null; Expect.throws(call1, (e) => e is NoSuchMethodError, 'foo1($gA, $gB) NSME'); gA = null; gB = 2; Expect.throws(call1, (e) => e is ArgumentError, 'foo1($gA, $gB) AE'); } foo2a(a, b) { // The common receiver check on [a] cannot be merged because the operation // (selector) is different. // The common argument check on [b] cannot be merged because it must happen // after the receiver check. if (never) { return a ^ b; } else { return a & b; } } foo2b(a, b) { // Same a foo2a except which branch dynamically taken. if (always) { return a ^ b; } else { return a & b; } } call2a() { return foo2a(gA, gB); } call2b() { return foo2b(gA, gB); } checkNSME(text) { return (e) { Expect.isTrue( e is NoSuchMethodError, 'expecting NoSuchMethodError, got "${e.runtimeType}"', ); Expect.isTrue('$e'.contains(text), '"$e".contains("$text")'); return e is NoSuchMethodError; }; } test2() { gA = 1; gB = 2; Expect.equals(0, call2a()); Expect.equals(3, call2b()); gA = null; gB = null; Expect.throws(call2a, checkNSME(r'Null check'), 'foo2($gA, $gB) NSME'); Expect.throws(call2b, checkNSME(r'Null check'), 'foo2($gA, $gB) NSME'); gA = 1; gB = null; Expect.throws(call2a, (e) => e is ArgumentError, 'foo2($gA, $gB) AE'); Expect.throws(call2b, (e) => e is ArgumentError, 'foo2($gA, $gB) AE'); gA = null; gB = 2; Expect.throws(call2a, checkNSME(r'Null check'), 'foo2($gA, $gB) NSME'); Expect.throws(call2b, checkNSME(r'Null check'), 'foo2($gA, $gB) NSME'); } main() { test1(); test2(); }