|  | // Copyright (c) 2015, 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. | 
|  |  | 
|  | // Check that exception messages for truncating operations contains the | 
|  | // operands. | 
|  |  | 
|  | import 'package:expect/expect.dart'; | 
|  |  | 
|  | @pragma('dart2js:noInline') | 
|  | @pragma('dart2js:assumeDynamic') | 
|  | confuse(x) => x; | 
|  |  | 
|  | void find1(expected, thunk) { | 
|  | if (thunk == null) return; | 
|  | var returned, exceptionText; | 
|  | try { | 
|  | returned = thunk(); | 
|  | } catch (e) { | 
|  | exceptionText = '$e'; | 
|  | } | 
|  | if (exceptionText == null) { | 
|  | Expect.fail( | 
|  | 'Expected exception containing "$expected", returned: $returned'); | 
|  | } | 
|  | Expect.isTrue(exceptionText.contains(expected), | 
|  | 'Expected "$expected" in "$exceptionText"'); | 
|  | } | 
|  |  | 
|  | void find(expected, [thunk1, thunk2, thunk3, thunk4]) { | 
|  | find1(expected, thunk1); | 
|  | find1(expected, thunk2); | 
|  | find1(expected, thunk3); | 
|  | find1(expected, thunk4); | 
|  | } | 
|  |  | 
|  | main() { | 
|  | var NaN = double.nan; | 
|  | var Infinity = double.infinity; | 
|  |  | 
|  | find(' Infinity: 123 ~/ 0', () => confuse(123) ~/ confuse(0), | 
|  | () => confuse(123) ~/ 0, () => 123 ~/ confuse(0), () => 123 ~/ 0); | 
|  |  | 
|  | find( | 
|  | '-Infinity: 123 ~/ -0.0', | 
|  | () => confuse(123) ~/ confuse(-0.0), | 
|  | () => confuse(123) ~/ -0.0, | 
|  | () => 123 ~/ confuse(-0.0), | 
|  | () => 123 ~/ -0.0); | 
|  |  | 
|  | find(' NaN: NaN ~/ 123', () => confuse(NaN) ~/ confuse(123), | 
|  | () => confuse(NaN) ~/ 123, () => NaN ~/ confuse(123), () => NaN ~/ 123); | 
|  |  | 
|  | find( | 
|  | ' Infinity: 1e+200 ~/ 1e-200', | 
|  | () => confuse(1e200) ~/ confuse(1e-200), | 
|  | () => confuse(1e200) ~/ 1e-200, | 
|  | () => 1e200 ~/ confuse(1e-200), | 
|  | () => 1e200 ~/ 1e-200); | 
|  |  | 
|  | find('NaN.toInt()', () => confuse(NaN).toInt(), () => NaN.toInt()); | 
|  | find(' Infinity.toInt()', () => confuse(Infinity).toInt(), | 
|  | () => Infinity.toInt()); | 
|  | find('-Infinity.toInt()', () => confuse(-Infinity).toInt(), | 
|  | () => (-Infinity).toInt()); | 
|  |  | 
|  | find('NaN.ceil()', () => confuse(NaN).ceil(), () => NaN.ceil()); | 
|  | find(' Infinity.ceil()', () => confuse(Infinity).ceil(), | 
|  | () => Infinity.ceil()); | 
|  | find('-Infinity.ceil()', () => confuse(-Infinity).ceil(), | 
|  | () => (-Infinity).ceil()); | 
|  |  | 
|  | find('NaN.floor()', () => confuse(NaN).floor(), () => NaN.floor()); | 
|  | find(' Infinity.floor()', () => confuse(Infinity).floor(), | 
|  | () => Infinity.floor()); | 
|  | find('-Infinity.floor()', () => confuse(-Infinity).floor(), | 
|  | () => (-Infinity).floor()); | 
|  |  | 
|  | find('NaN.round()', () => confuse(NaN).round(), () => NaN.round()); | 
|  | find(' Infinity.round()', () => confuse(Infinity).round(), | 
|  | () => Infinity.round()); | 
|  | find('-Infinity.round()', () => confuse(-Infinity).round(), | 
|  | () => (-Infinity).round()); | 
|  |  | 
|  | // `truncate()` is the same as `toInt()`. | 
|  | // We could change the runtime so that `truncate` is reported. | 
|  | find('NaN.toInt()', () => confuse(NaN).truncate(), () => NaN.truncate()); | 
|  | find(' Infinity.toInt()', () => confuse(Infinity).truncate(), | 
|  | () => Infinity.truncate()); | 
|  | find('-Infinity.toInt()', () => confuse(-Infinity).truncate(), | 
|  | () => (-Infinity).truncate()); | 
|  | } |