|  | // Copyright (c) 2018, 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 "dart:async" show FutureOr; | 
|  |  | 
|  | import "package:expect/expect.dart"; | 
|  |  | 
|  | // Check that integer literals in a double context are allowed | 
|  | // for various double context. | 
|  |  | 
|  | main() { | 
|  | // Variable initializer context. | 
|  | double v1 = 0; | 
|  | Expect.identical(0.0, v1); | 
|  | double v2 = 1; | 
|  | Expect.identical(1.0, v2); | 
|  | double v3 = -0; | 
|  | Expect.identical(-0.0, v3); | 
|  | double v4 = -1; | 
|  | Expect.identical(-1.0, v4); | 
|  | double v5 = 9223372036854775808; // 2^63, not valid signed 64-bit integer. | 
|  | Expect.identical(9223372036854775808.0, v5); | 
|  | double v6 = 18446744073709551616; // 2^64. | 
|  | Expect.identical(18446744073709551616.0, v6); | 
|  | double v7 = 0x02; // Hex literal. | 
|  | Expect.identical(2.0, v7); | 
|  | double v8 = -0x02; // Hex literal. | 
|  | Expect.identical(-2.0, v8); | 
|  |  | 
|  | // Const variable initializer context. | 
|  | const double c1 = 0; | 
|  | Expect.identical(0.0, c1); | 
|  | const double c2 = 1; | 
|  | Expect.identical(1.0, c2); | 
|  | const double c3 = -0; | 
|  | Expect.identical(-0.0, c3); | 
|  | const double c4 = -1; | 
|  | Expect.identical(-1.0, c4); | 
|  | const double c5 = 9223372036854775808; | 
|  | Expect.identical(9223372036854775808.0, c5); | 
|  | const double c6 = 18446744073709551616; | 
|  | Expect.identical(18446744073709551616.0, c6); | 
|  | const double c7 = 0x02; // Hex literal. | 
|  | Expect.identical(2.0, c7); | 
|  | const double c8 = -0x02; // Hex literal. | 
|  | Expect.identical(-2.0, c8); | 
|  |  | 
|  | // Assignment context, variable. | 
|  | double value; | 
|  | value = 0; | 
|  | Expect.identical(0.0, value); | 
|  | value = 1; | 
|  | Expect.identical(1.0, value); | 
|  | value = -0; | 
|  | Expect.identical(-0.0, value); | 
|  | value = -1; | 
|  | Expect.identical(-1.0, value); | 
|  | value = 9223372036854775808; | 
|  | Expect.identical(9223372036854775808.0, value); | 
|  | value = 18446744073709551616; | 
|  | Expect.identical(18446744073709551616.0, value); | 
|  | value = 0x02; | 
|  | Expect.identical(2.0, value); | 
|  | value = -0x02; | 
|  | Expect.identical(-2.0, value); | 
|  |  | 
|  | // Assignment context, setter. | 
|  | setter = 0; | 
|  | Expect.identical(0.0, lastSetValue); | 
|  | setter = 1; | 
|  | Expect.identical(1.0, lastSetValue); | 
|  | setter = -0; | 
|  | Expect.identical(-0.0, lastSetValue); | 
|  | setter = -1; | 
|  | Expect.identical(-1.0, lastSetValue); | 
|  | setter = 9223372036854775808; | 
|  | Expect.identical(9223372036854775808.0, lastSetValue); | 
|  | setter = 18446744073709551616; | 
|  | Expect.identical(18446744073709551616.0, lastSetValue); | 
|  | setter = 0x02; | 
|  | Expect.identical(2.0, lastSetValue); | 
|  | setter = -0x02; | 
|  | Expect.identical(-2.0, lastSetValue); | 
|  |  | 
|  | // Argument context. | 
|  | test(0.0, 0); | 
|  | test(1.0, 1); | 
|  | test(-0.0, -0); | 
|  | test(-1.0, -1); | 
|  | test(9223372036854775808.0, 9223372036854775808); | 
|  | test(18446744073709551616.0, 18446744073709551616); | 
|  | test(2.0, 0x02); | 
|  | test(-2.0, -0x02); | 
|  |  | 
|  | // Argument context, operator setter. | 
|  | List<double> box = [0.5]; | 
|  | box[0] = 0; | 
|  | Expect.identical(0.0, box[0]); | 
|  | box[0] = 1; | 
|  | Expect.identical(1.0, box[0]); | 
|  | box[0] = -0; | 
|  | Expect.identical(-0.0, box[0]); | 
|  | box[0] = -1; | 
|  | Expect.identical(-1.0, box[0]); | 
|  | box[0] = 9223372036854775808; | 
|  | Expect.identical(9223372036854775808.0, box[0]); | 
|  | box[0] = 18446744073709551616; | 
|  | Expect.identical(18446744073709551616.0, box[0]); | 
|  | box[0] = 0x02; | 
|  | Expect.identical(2.0, box[0]); | 
|  | box[0] = -0x02; | 
|  | Expect.identical(-2.0, box[0]); | 
|  |  | 
|  | // Argument context, custom operators. | 
|  | var oper = Oper(); | 
|  | Expect.identical(0.0, oper + 0); | 
|  | Expect.identical(1.0, oper + 1); | 
|  | Expect.identical(-0.0, oper + -0); | 
|  | Expect.identical(-1.0, oper + -1); | 
|  | Expect.identical(9223372036854775808.0, oper + 9223372036854775808); | 
|  | Expect.identical(18446744073709551616.0, oper + 18446744073709551616); | 
|  | Expect.identical(2.0, oper + 0x02); | 
|  | Expect.identical(-2.0, oper + -0x02); | 
|  |  | 
|  | Expect.identical(0.0, oper >> 0); | 
|  | Expect.identical(1.0, oper >> 1); | 
|  | Expect.identical(-0.0, oper >> -0); | 
|  | Expect.identical(-1.0, oper >> -1); | 
|  | Expect.identical(9223372036854775808.0, oper >> 9223372036854775808); | 
|  | Expect.identical(18446744073709551616.0, oper >> 18446744073709551616); | 
|  | Expect.identical(2.0, oper >> 0x02); | 
|  | Expect.identical(-2.0, oper >> -0x02); | 
|  |  | 
|  | Expect.identical(0.0, oper[0]); | 
|  | Expect.identical(1.0, oper[1]); | 
|  | Expect.identical(-0.0, oper[-0]); | 
|  | Expect.identical(-1.0, oper[-1]); | 
|  | Expect.identical(9223372036854775808.0, oper[9223372036854775808]); | 
|  | Expect.identical(18446744073709551616.0, oper[18446744073709551616]); | 
|  | Expect.identical(2.0, oper[0x02]); | 
|  | Expect.identical(-2.0, oper[-0x02]); | 
|  |  | 
|  | // Explicit return context. | 
|  | double fun1() => 0; | 
|  | Expect.identical(0.0, fun1()); | 
|  | double fun2() => 1; | 
|  | Expect.identical(1.0, fun2()); | 
|  | double fun3() => -0; | 
|  | Expect.identical(-0.0, fun3()); | 
|  | double fun4() => -1; | 
|  | Expect.identical(-1.0, fun4()); | 
|  | double fun5() => 9223372036854775808; | 
|  | Expect.identical(9223372036854775808.0, fun5()); | 
|  | double fun6() => 18446744073709551616; | 
|  | Expect.identical(18446744073709551616.0, fun6()); | 
|  | double fun7() => 0x02; | 
|  | Expect.identical(2.0, fun7()); | 
|  | double fun8() => -0x02; | 
|  | Expect.identical(-2.0, fun8()); | 
|  |  | 
|  | // Inferred return context. | 
|  | testFun(0.0, () => 0); | 
|  | testFun(1.0, () => 1); | 
|  | testFun(-0.0, () => -0); | 
|  | testFun(-1.0, () => -1); | 
|  | testFun(9223372036854775808.0, () => 9223372036854775808); | 
|  | testFun(18446744073709551616.0, () => 18446744073709551616); | 
|  | testFun(2.0, () => 0x02); | 
|  | testFun(-2.0, () => -0x02); | 
|  |  | 
|  | // Function default value context. | 
|  | Object deffun1([double v = 0]) => v; | 
|  | Expect.identical(0.0, deffun1()); | 
|  | Object deffun2([double v = 1]) => v; | 
|  | Expect.identical(1.0, deffun2()); | 
|  | Object deffun3([double v = -0]) => v; | 
|  | Expect.identical(-0.0, deffun3()); | 
|  | Object deffun4([double v = -1]) => v; | 
|  | Expect.identical(-1.0, deffun4()); | 
|  | Object deffun5([double v = 9223372036854775808]) => v; | 
|  | Expect.identical(9223372036854775808.0, deffun5()); | 
|  | Object deffun6([double v = 18446744073709551616]) => v; | 
|  | Expect.identical(18446744073709551616.0, deffun6()); | 
|  | Object deffun7([double v = 0x02]) => v; | 
|  | Expect.identical(2.0, deffun7()); | 
|  | Object deffun8([double v = -0x02]) => v; | 
|  | Expect.identical(-2.0, deffun8()); | 
|  |  | 
|  | // Explicit collection literal context. | 
|  | box = <double>[0]; | 
|  | Expect.identical(0.0, box[0]); | 
|  | box = <double>[1]; | 
|  | Expect.identical(1.0, box[0]); | 
|  | box = <double>[-0]; | 
|  | Expect.identical(-0.0, box[0]); | 
|  | box = <double>[-1]; | 
|  | Expect.identical(-1.0, box[0]); | 
|  | box = <double>[9223372036854775808]; | 
|  | Expect.identical(9223372036854775808.0, box[0]); | 
|  | box = <double>[18446744073709551616]; | 
|  | Expect.identical(18446744073709551616.0, box[0]); | 
|  | box = <double>[0x02]; | 
|  | Expect.identical(2.0, box[0]); | 
|  | box = <double>[-0x02]; | 
|  | Expect.identical(-2.0, box[0]); | 
|  |  | 
|  | // Implicit collection literal context. | 
|  | box = [0]; | 
|  | Expect.identical(0.0, box[0]); | 
|  | box = [1]; | 
|  | Expect.identical(1.0, box[0]); | 
|  | box = [-0]; | 
|  | Expect.identical(-0.0, box[0]); | 
|  | box = [-1]; | 
|  | Expect.identical(-1.0, box[0]); | 
|  | box = [9223372036854775808]; | 
|  | Expect.identical(9223372036854775808.0, box[0]); | 
|  | box = [18446744073709551616]; | 
|  | Expect.identical(18446744073709551616.0, box[0]); | 
|  | box = [0x02]; | 
|  | Expect.identical(2.0, box[0]); | 
|  | box = [-0x02]; | 
|  | Expect.identical(-2.0, box[0]); | 
|  |  | 
|  | Map<double?, double?> map; | 
|  | // Explicit map key context. | 
|  | map = <double, Null>{0: null}; | 
|  | Expect.identical(0.0, map.keys.first); | 
|  | map = <double, Null>{1: null}; | 
|  | Expect.identical(1.0, map.keys.first); | 
|  | map = <double, Null>{-0: null}; | 
|  | Expect.identical(-0.0, map.keys.first); | 
|  | map = <double, Null>{-1: null}; | 
|  | Expect.identical(-1.0, map.keys.first); | 
|  | map = <double, Null>{9223372036854775808: null}; | 
|  | Expect.identical(9223372036854775808.0, map.keys.first); | 
|  | map = <double, Null>{18446744073709551616: null}; | 
|  | Expect.identical(18446744073709551616.0, map.keys.first); | 
|  | map = <double, Null>{0x02: null}; | 
|  | Expect.identical(2.0, map.keys.first); | 
|  | map = <double, Null>{-0x02: null}; | 
|  | Expect.identical(-2.0, map.keys.first); | 
|  |  | 
|  | // Implicit map key context. | 
|  | map = {0: null}; | 
|  | Expect.identical(0.0, map.keys.first); | 
|  | map = {1: null}; | 
|  | Expect.identical(1.0, map.keys.first); | 
|  | map = {-0: null}; | 
|  | Expect.identical(-0.0, map.keys.first); | 
|  | map = {-1: null}; | 
|  | Expect.identical(-1.0, map.keys.first); | 
|  | map = {9223372036854775808: null}; | 
|  | Expect.identical(9223372036854775808.0, map.keys.first); | 
|  | map = {18446744073709551616: null}; | 
|  | Expect.identical(18446744073709551616.0, map.keys.first); | 
|  | map = {0x02: null}; | 
|  | Expect.identical(2.0, map.keys.first); | 
|  | map = {-0x02: null}; | 
|  | Expect.identical(-2.0, map.keys.first); | 
|  |  | 
|  | // Explicit map value context. | 
|  | map = <Null, double>{null: 0}; | 
|  | Expect.identical(0.0, map.values.first); | 
|  | map = <Null, double>{null: 1}; | 
|  | Expect.identical(1.0, map.values.first); | 
|  | map = <Null, double>{null: -0}; | 
|  | Expect.identical(-0.0, map.values.first); | 
|  | map = <Null, double>{null: -1}; | 
|  | Expect.identical(-1.0, map.values.first); | 
|  | map = <Null, double>{null: 9223372036854775808}; | 
|  | Expect.identical(9223372036854775808.0, map.values.first); | 
|  | map = <Null, double>{null: 18446744073709551616}; | 
|  | Expect.identical(18446744073709551616.0, map.values.first); | 
|  | map = <Null, double>{null: 0x02}; | 
|  | Expect.identical(2.0, map.values.first); | 
|  | map = <Null, double>{null: -0x02}; | 
|  | Expect.identical(-2.0, map.values.first); | 
|  |  | 
|  | // Implicit map value context. | 
|  | map = {null: 0}; | 
|  | Expect.identical(0.0, map.values.first); | 
|  | map = {null: 1}; | 
|  | Expect.identical(1.0, map.values.first); | 
|  | map = {null: -0}; | 
|  | Expect.identical(-0.0, map.values.first); | 
|  | map = {null: -1}; | 
|  | Expect.identical(-1.0, map.values.first); | 
|  | map = {null: 9223372036854775808}; | 
|  | Expect.identical(9223372036854775808.0, map.values.first); | 
|  | map = {null: 18446744073709551616}; | 
|  | Expect.identical(18446744073709551616.0, map.values.first); | 
|  | map = {null: 0x02}; | 
|  | Expect.identical(2.0, map.values.first); | 
|  | map = {null: -0x02}; | 
|  | Expect.identical(-2.0, map.values.first); | 
|  |  | 
|  | // Top-level contexts | 
|  | Expect.identical(0.0, ts1); | 
|  | Expect.identical(1.0, ts2); | 
|  | Expect.identical(-0.0, ts3); | 
|  | Expect.identical(-1.0, ts4); | 
|  | Expect.identical(9223372036854775808.0, ts5); | 
|  | Expect.identical(18446744073709551616.0, ts6); | 
|  | Expect.identical(2.0, ts7); | 
|  | Expect.identical(-2.0, ts8); | 
|  |  | 
|  | Expect.identical(0.0, tc1); | 
|  | Expect.identical(1.0, tc2); | 
|  | Expect.identical(-0.0, tc3); | 
|  | Expect.identical(-1.0, tc4); | 
|  | Expect.identical(9223372036854775808.0, tc5); | 
|  | Expect.identical(18446744073709551616.0, tc6); | 
|  | Expect.identical(2.0, tc7); | 
|  | Expect.identical(-2.0, tc8); | 
|  |  | 
|  | Expect.identical(0.0, tg1); | 
|  | Expect.identical(1.0, tg2); | 
|  | Expect.identical(-0.0, tg3); | 
|  | Expect.identical(-1.0, tg4); | 
|  | Expect.identical(9223372036854775808.0, tg5); | 
|  | Expect.identical(18446744073709551616.0, tg6); | 
|  | Expect.identical(2.0, tg7); | 
|  | Expect.identical(-2.0, tg8); | 
|  |  | 
|  | // Class contexts | 
|  | var c = new C.ci1(); | 
|  | Expect.identical(0.0, c.v1); | 
|  | Expect.identical(1.0, c.v2); | 
|  | Expect.identical(-0.0, c.v3); | 
|  | Expect.identical(-1.0, c.v4); | 
|  | Expect.identical(9223372036854775808.0, c.v5); | 
|  | Expect.identical(18446744073709551616.0, c.v6); | 
|  | Expect.identical(2.0, c.v7); | 
|  | Expect.identical(-2.0, c.v8); | 
|  |  | 
|  | Expect.identical(0.0, C.s1); | 
|  | Expect.identical(1.0, C.s2); | 
|  | Expect.identical(-0.0, C.s3); | 
|  | Expect.identical(-1.0, C.s4); | 
|  | Expect.identical(9223372036854775808.0, C.s5); | 
|  | Expect.identical(18446744073709551616.0, C.s6); | 
|  | Expect.identical(2.0, C.s7); | 
|  | Expect.identical(-2.0, C.s8); | 
|  |  | 
|  | Expect.identical(0.0, C.c1); | 
|  | Expect.identical(1.0, C.c2); | 
|  | Expect.identical(-0.0, C.c3); | 
|  | Expect.identical(-1.0, C.c4); | 
|  | Expect.identical(9223372036854775808.0, C.c5); | 
|  | Expect.identical(18446744073709551616.0, C.c6); | 
|  | Expect.identical(2.0, C.c7); | 
|  | Expect.identical(-2.0, C.c8); | 
|  |  | 
|  | Expect.identical(0.0, new C.cc1().d); | 
|  | Expect.identical(1.0, new C.cc2().d); | 
|  | Expect.identical(-0.0, new C.cc3().d); | 
|  | Expect.identical(-1.0, new C.cc4().d); | 
|  | Expect.identical(9223372036854775808.0, new C.cc5().d); | 
|  | Expect.identical(18446744073709551616.0, new C.cc6().d); | 
|  | Expect.identical(2.0, new C.cc7().d); | 
|  | Expect.identical(-2.0, new C.cc8().d); | 
|  |  | 
|  | Expect.identical(0.0, const C.cc1().d); | 
|  | Expect.identical(1.0, const C.cc2().d); | 
|  | Expect.identical(-0.0, const C.cc3().d); | 
|  | Expect.identical(-1.0, const C.cc4().d); | 
|  | Expect.identical(9223372036854775808.0, const C.cc5().d); | 
|  | Expect.identical(18446744073709551616.0, const C.cc6().d); | 
|  | Expect.identical(2.0, const C.cc7().d); | 
|  | Expect.identical(-2.0, const C.cc8().d); | 
|  |  | 
|  | Expect.identical(0.0, new C.ci1().d); | 
|  | Expect.identical(1.0, new C.ci2().d); | 
|  | Expect.identical(-0.0, new C.ci3().d); | 
|  | Expect.identical(-1.0, new C.ci4().d); | 
|  | Expect.identical(9223372036854775808.0, new C.ci5().d); | 
|  | Expect.identical(18446744073709551616.0, new C.ci6().d); | 
|  | Expect.identical(2.0, new C.ci7().d); | 
|  | Expect.identical(-2.0, new C.ci8().d); | 
|  |  | 
|  | Expect.identical(0.0, const C.ci1().d); | 
|  | Expect.identical(1.0, const C.ci2().d); | 
|  | Expect.identical(-0.0, const C.ci3().d); | 
|  | Expect.identical(-1.0, const C.ci4().d); | 
|  | Expect.identical(9223372036854775808.0, const C.ci5().d); | 
|  | Expect.identical(18446744073709551616.0, const C.ci6().d); | 
|  | Expect.identical(2.0, const C.ci7().d); | 
|  | Expect.identical(-2.0, const C.ci8().d); | 
|  |  | 
|  | // Nested context, `?:`. | 
|  | v1 = false ? 42.0 : 0; | 
|  | Expect.identical(0.0, v1); | 
|  | v2 = false ? 42.0 : 1; | 
|  | Expect.identical(1.0, v2); | 
|  | v3 = false ? 42.0 : -0; | 
|  | Expect.identical(-0.0, v3); | 
|  | v4 = false ? 42.0 : -1; | 
|  | Expect.identical(-1.0, v4); | 
|  | v5 = false ? 42.0 : 9223372036854775808; | 
|  | Expect.identical(9223372036854775808.0, v5); | 
|  | v6 = false ? 42.0 : 18446744073709551616; | 
|  | Expect.identical(18446744073709551616.0, v6); | 
|  | v7 = false ? 42.0 : 0x02; // Hex literal. | 
|  | Expect.identical(2.0, v7); | 
|  | v8 = false ? 42.0 : -0x02; // Hex literal. | 
|  | Expect.identical(-2.0, v8); | 
|  |  | 
|  | // Nested context, `??`. | 
|  | double? nl = double.tryParse("not a double"); // Returns null typed as double. | 
|  | v1 = nl ?? 0; | 
|  | Expect.identical(0.0, v1); | 
|  | v2 = nl ?? 1; | 
|  | Expect.identical(1.0, v2); | 
|  | v3 = nl ?? -0; | 
|  | Expect.identical(-0.0, v3); | 
|  | v4 = nl ?? -1; | 
|  | Expect.identical(-1.0, v4); | 
|  | v5 = nl ?? 9223372036854775808; | 
|  | Expect.identical(9223372036854775808.0, v5); | 
|  | v6 = nl ?? 18446744073709551616; | 
|  | Expect.identical(18446744073709551616.0, v6); | 
|  | v7 = nl ?? 0x02; // Hex literal. | 
|  | Expect.identical(2.0, v7); | 
|  | v8 = nl ?? -0x02; // Hex literal. | 
|  | Expect.identical(-2.0, v8); | 
|  |  | 
|  | // Nested context, `..`. | 
|  | v1 = 0..toString(); | 
|  | Expect.identical(0.0, v1); | 
|  | v2 = 1..toString(); | 
|  | Expect.identical(1.0, v2); | 
|  | v3 = -0 | 
|  | ..toString(); | 
|  | Expect.identical(-0.0, v3); | 
|  | v4 = -1 | 
|  | ..toString(); | 
|  | Expect.identical(-1.0, v4); | 
|  | v5 = 9223372036854775808..toString(); | 
|  | Expect.identical(9223372036854775808.0, v5); | 
|  | v6 = 18446744073709551616..toString(); | 
|  | Expect.identical(18446744073709551616.0, v6); | 
|  | v7 = 0x02..toString(); // Hex literal. | 
|  | Expect.identical(2.0, v7); | 
|  | v8 = -0x02 | 
|  | ..toString(); // Hex literal. | 
|  | Expect.identical(-2.0, v8); | 
|  |  | 
|  | // Nexted context, double assignment. | 
|  | Object object; | 
|  | object = value = 0; | 
|  | Expect.identical(0.0, value); | 
|  | object = value = 1; | 
|  | Expect.identical(1.0, value); | 
|  | object = value = -0; | 
|  | Expect.identical(-0.0, value); | 
|  | object = value = -1; | 
|  | Expect.identical(-1.0, value); | 
|  | object = value = 9223372036854775808; | 
|  | Expect.identical(9223372036854775808.0, value); | 
|  | object = value = 18446744073709551616; | 
|  | Expect.identical(18446744073709551616.0, value); | 
|  | object = value = 0x02; | 
|  | Expect.identical(2.0, value); | 
|  | object = value = -0x02; | 
|  | Expect.identical(-2.0, value); | 
|  |  | 
|  | // Nested context, value of assignment. | 
|  | Expect.identical(0.0, value = 0); | 
|  | Expect.identical(1.0, value = 1); | 
|  | Expect.identical(-0.0, value = -0); | 
|  | Expect.identical(-1.0, value = -1); | 
|  | Expect.identical(9223372036854775808.0, value = 9223372036854775808); | 
|  | Expect.identical(18446744073709551616.0, value = 18446744073709551616); | 
|  | Expect.identical(2.0, value = 0x02); | 
|  | Expect.identical(-2.0, value = -0x02); | 
|  |  | 
|  | // JavaScript platforms represent integers as doubles, so negating them will | 
|  | // result in negative zero, unfortunately. | 
|  | int zero = 0; | 
|  | bool platformHasNegativeZeroInts = (-zero).isNegative; | 
|  |  | 
|  | // Not promoted without a double context. | 
|  | num x = -0; | 
|  | Expect.identical(0, x); | 
|  | Expect.equals(x.isNegative, platformHasNegativeZeroInts); | 
|  |  | 
|  | var list = [3.14, 2.17, -0]; | 
|  | Expect.notType<List<double>>(list); | 
|  | Expect.identical(0, list[2]); | 
|  | Expect.equals(list[2].isNegative, platformHasNegativeZeroInts); | 
|  |  | 
|  | // FutureOr<double> also forces double. | 
|  | // "Type that int is not assignable to, but double is." | 
|  | FutureOr<double> fo1 = 0; | 
|  | Expect.identical(0.0, fo1); | 
|  | FutureOr<double> fo2 = 1; | 
|  | Expect.identical(1.0, fo2); | 
|  | FutureOr<double> fo3 = -0; | 
|  | Expect.identical(-0.0, fo3); | 
|  | FutureOr<double> fo4 = -1; | 
|  | Expect.identical(-1.0, fo4); | 
|  | FutureOr<double> fo5 = 9223372036854775808; | 
|  | Expect.identical(9223372036854775808.0, fo5); | 
|  | FutureOr<double> fo6 = 18446744073709551616; | 
|  | Expect.identical(18446744073709551616.0, fo6); | 
|  | FutureOr<double> fo7 = 0x02; // Hex literal. | 
|  | Expect.identical(2.0, fo7); | 
|  | FutureOr<double> fo8 = -0x02; // Hex literal. | 
|  | Expect.identical(-2.0, fo8); | 
|  |  | 
|  | // Some other FutureOr cases, without being exhaustive. | 
|  | { | 
|  | Object func([FutureOr<double> x = 9223372036854775808]) => x; | 
|  | Expect.identical(9223372036854775808.0, func(9223372036854775808)); | 
|  | Expect.identical(9223372036854775808.0, func()); | 
|  | FutureOr<double> func2() => 9223372036854775808; | 
|  | Expect.identical(9223372036854775808.0, func2()); | 
|  | testGeneric<FutureOr<double>>(9223372036854775808.0, 9223372036854775808); | 
|  | List<FutureOr<double>> l = [9223372036854775808]; | 
|  | testGeneric<FutureOr<double>>(9223372036854775808.0, l[0]); | 
|  | l.add(9223372036854775808); | 
|  | testGeneric<FutureOr<double>>(9223372036854775808.0, l[1]); | 
|  | l.add(0.0); | 
|  | l[2] = 9223372036854775808; | 
|  | testGeneric<FutureOr<double>>(9223372036854775808.0, l[2]); | 
|  | } | 
|  |  | 
|  | // Type variables statically bound to double also force doubles: | 
|  | testGeneric<double>(0.0, 0); | 
|  | testGeneric<double>(1.0, 1); | 
|  | testGeneric<double>(-0.0, -0); | 
|  | testGeneric<double>(-1.0, -1); | 
|  | testGeneric<double>(9223372036854775808.0, 9223372036854775808); | 
|  | testGeneric<double>(18446744073709551616.0, 18446744073709551616); | 
|  | testGeneric<double>(2.0, 0x02); | 
|  | testGeneric<double>(-2.0, -0x02); | 
|  |  | 
|  | // Uses static type, not run-time type. | 
|  | Super sub = Sub(); | 
|  | Expect.identical(0.0, sub.method(0)); | 
|  | Expect.identical(1.0, sub.method(1)); | 
|  | Expect.identical(-0.0, sub.method(-0)); | 
|  | Expect.identical(-1.0, sub.method(-1)); | 
|  | Expect.identical(9223372036854775808.0, sub.method(9223372036854775808)); | 
|  | Expect.identical(18446744073709551616.0, sub.method(18446744073709551616)); | 
|  | Expect.identical(2.0, sub.method(0x02)); | 
|  | Expect.identical(-2.0, sub.method(-0x02)); | 
|  |  | 
|  | { | 
|  | // Check that the correct value is used as receiver for the cascade. | 
|  | var collector = StringBuffer(); | 
|  | double tricky = -42 | 
|  | ..toString().codeUnits.forEach(collector.writeCharCode); | 
|  | Expect.equals("${-42.0}", collector.toString()); | 
|  | } | 
|  |  | 
|  | bool isDigit(int charCode) => (charCode ^ 0x30) <= 9; | 
|  | // Throws because double context does not affect "4", so the toString does | 
|  | // not contain any non-digit (like ".", which it would if 4 was a double). | 
|  | // The context type of "4.toString..." is not double, and the `-` | 
|  | // is not having a literal as operand. | 
|  | Expect.throws(() { | 
|  | double tricky = -4 | 
|  | .toString() | 
|  | .codeUnits | 
|  | .firstWhere((c) => !isDigit(c)) | 
|  | .toDouble(); | 
|  | }); | 
|  | } | 
|  |  | 
|  | void test(double expect, double value) { | 
|  | Expect.identical(expect, value); | 
|  | } | 
|  |  | 
|  | void testFun(double expect, double f()) { | 
|  | Expect.identical(expect, f()); | 
|  | } | 
|  |  | 
|  | void testGeneric<T>(double expect, T value) { | 
|  | Expect.identical(expect, value); | 
|  | } | 
|  |  | 
|  | class Oper { | 
|  | Object operator +(double value) => value; | 
|  | Object operator >>(double value) => value; | 
|  | Object operator [](double value) => value; | 
|  | } | 
|  |  | 
|  | class C { | 
|  | // Instance variable initializer | 
|  | final double v1 = 0; | 
|  | final double v2 = 1; | 
|  | final double v3 = -0; | 
|  | final double v4 = -1; | 
|  | final double v5 = 9223372036854775808; | 
|  | final double v6 = 18446744073709551616; | 
|  | final double v7 = 0x02; // Hex literal. | 
|  | final double v8 = -0x02; // Hex literal. | 
|  |  | 
|  | // Static class variable initializer | 
|  | static double s1 = 0; | 
|  | static double s2 = 1; | 
|  | static double s3 = -0; | 
|  | static double s4 = -1; | 
|  | static double s5 = 9223372036854775808; | 
|  | static double s6 = 18446744073709551616; | 
|  | static double s7 = 0x02; // Hex literal. | 
|  | static double s8 = -0x02; // Hex literal. | 
|  |  | 
|  | // Const class variable initializer context. | 
|  | static const double c1 = 0; | 
|  | static const double c2 = 1; | 
|  | static const double c3 = -0; | 
|  | static const double c4 = -1; | 
|  | static const double c5 = 9223372036854775808; | 
|  | static const double c6 = 18446744073709551616; | 
|  | static const double c7 = 0x02; // Hex literal. | 
|  | static const double c8 = -0x02; // Hex literal. | 
|  |  | 
|  | final double d; | 
|  |  | 
|  | // Default value context for a double initializing formal. | 
|  | const C.cc1([this.d = 0]); | 
|  | const C.cc2([this.d = 1]); | 
|  | const C.cc3([this.d = -0]); | 
|  | const C.cc4([this.d = -1]); | 
|  | const C.cc5([this.d = 9223372036854775808]); | 
|  | const C.cc6([this.d = 18446744073709551616]); | 
|  | const C.cc7([this.d = 0x02]); | 
|  | const C.cc8([this.d = -0x02]); | 
|  |  | 
|  | // Initializer list expressions context. | 
|  | const C.ci1() : this.d = 0; | 
|  | const C.ci2() : this.d = 1; | 
|  | const C.ci3() : this.d = -0; | 
|  | const C.ci4() : this.d = -1; | 
|  | const C.ci5() : this.d = 9223372036854775808; | 
|  | const C.ci6() : this.d = 18446744073709551616; | 
|  | const C.ci7() : this.d = 0x02; | 
|  | const C.ci8() : this.d = -0x02; | 
|  | } | 
|  |  | 
|  | // Top-level lazy variable initializer | 
|  | double ts1 = 0; | 
|  | double ts2 = 1; | 
|  | double ts3 = -0; | 
|  | double ts4 = -1; | 
|  | double ts5 = 9223372036854775808; | 
|  | double ts6 = 18446744073709551616; | 
|  | double ts7 = 0x02; // Hex literal. | 
|  | double ts8 = -0x02; // Hex literal. | 
|  |  | 
|  | // Top-level const variable initializer. | 
|  | const double tc1 = 0; | 
|  | const double tc2 = 1; | 
|  | const double tc3 = -0; | 
|  | const double tc4 = -1; | 
|  | const double tc5 = 9223372036854775808; // 2^63, invalid signed 64-bit integer. | 
|  | const double tc6 = 18446744073709551616; | 
|  | const double tc7 = 0x02; // Hex literal. | 
|  | const double tc8 = -0x02; // Hex literal. | 
|  |  | 
|  | // Top-level getter return context. | 
|  | double get tg1 => 0; | 
|  | double get tg2 => 1; | 
|  | double get tg3 => -0; | 
|  | double get tg4 => -1; | 
|  | double get tg5 => 9223372036854775808; | 
|  | double get tg6 => 18446744073709551616; | 
|  | double get tg7 => 0x02; // Hex literal. | 
|  | double get tg8 => -0x02; // Hex literal. | 
|  |  | 
|  | Object? lastSetValue = null; | 
|  | void set setter(double v) { | 
|  | lastSetValue = v; | 
|  | } | 
|  |  | 
|  | abstract class Super { | 
|  | Object method(double v); | 
|  | } | 
|  |  | 
|  | class Sub implements Super { | 
|  | Object method(Object o) => o; | 
|  | } |