// Copyright (c) 2019, 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 "package:expect/expect.dart"; void main() { const BitNot(42, 4294967253).check(); const BitNot(4294967253, 42).check(); const BitNot(-42, 41).check(); const BitNot(-1, 0).check(); const BitNot(0, 0xFFFFFFFF).check(); const BitNot(4294967295, 0).check(); const BitNot(0x12121212121212, 0xEDEDEDED).check(); const BitNot(0x7fffffff00000000, 0xffffffff).check(); const BitNot(0x8000000000000000, 0xffffffff).check(); const Negate(0, -0).check(); const Negate(-0, 0).check(); const Negate(0.0, -0.0).check(); const Negate(-0.0, 0.0).check(); const Negate(-0.0, 0).check(); const Negate(-0, 0.0).check(); const Negate(0, -0.0).check(); const Negate(0.0, -0).check(); const Negate(1, -1).check(); const Negate(-1, 1).check(); const Negate(1.0, -1.0).check(); const Negate(-1.0, 1.0).check(); const Negate(3.14, -3.14).check(); const Negate(-3.14, 3.14).check(); const Negate(4294967295, -4294967295).check(); const Negate(-4294967295, 4294967295).check(); const Negate(4294967295.5, -4294967295.5).check(); const Negate(-4294967295.5, 4294967295.5).check(); const Negate(4294967296, -4294967296).check(); const Negate(-4294967296, 4294967296).check(); const Negate(4294967296.5, -4294967296.5).check(); const Negate(-4294967296.5, 4294967296.5).check(); const Negate(9007199254740991, -9007199254740991).check(); const Negate(-9007199254740991, 9007199254740991).check(); const Negate(9007199254740991.5, -9007199254740991.5).check(); const Negate(-9007199254740991.5, 9007199254740991.5).check(); const Negate(9007199254740992, -9007199254740992).check(); const Negate(-9007199254740992, 9007199254740992).check(); const Negate(9007199254740992.5, -9007199254740992.5).check(); const Negate(-9007199254740992.5, 9007199254740992.5).check(); const Negate(double.infinity, double.negativeInfinity).check(); const Negate(double.negativeInfinity, double.infinity).check(); const Negate(double.maxFinite, -double.maxFinite).check(); const Negate(-double.maxFinite, double.maxFinite).check(); const Negate(double.minPositive, -double.minPositive).check(); const Negate(-double.minPositive, double.minPositive).check(); const Negate(double.nan, double.nan).check(); const Negate(0x7fffffff00000000, -0x7fffffff00000000).check(); const Negate(-0x7fffffff00000000, 0x7fffffff00000000).check(); const Negate(0x8000000000000000, -0x8000000000000000).check(); const Negate(-0x8000000000000000, 0x8000000000000000).check(); const Not(true, false).check(); const Not(false, true).check(); const BitAnd(314159, 271828, 262404).check(); const BitAnd(271828, 314159, 262404).check(); const BitAnd(0, 0, 0).check(); const BitAnd(-1, 0, 0).check(); const BitAnd(-1, 314159, 314159).check(); const BitAnd(-1, 0xFFFFFFFF, 0xFFFFFFFF).check(); const BitAnd(0xff, -4, 0xfc).check(); const BitAnd(0, 0xFFFFFFFF, 0).check(); const BitAnd(0xFFFFFFFF, 0, 0).check(); const BitAnd(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF).check(); const BitAnd(0x123456789ABC, 0xEEEEEEEEEEEE, 0x46688AAC).check(); const BitAnd(0x7fffffff00008000, 0x8000000000008000, 0x8000).check(); const BitAnd(0x8000000000008000, 0x7fffffff00008000, 0x8000).check(); const BitAnd(true, true, true).check(); const BitAnd(true, false, false).check(); const BitAnd(false, true, false).check(); const BitAnd(false, false, false).check(); const BitOr(314159, 271828, 323583).check(); const BitOr(271828, 314159, 323583).check(); const BitOr(0, 0, 0).check(); const BitOr(-8, 0, 0xFFFFFFF8).check(); const BitOr(-8, 271828, 0xFFFFFFFC).check(); const BitOr(-8, 0xFFFFFFFF, 0xFFFFFFFF).check(); const BitOr(0x1, -4, 0xFFFFFFFD).check(); const BitOr(0, 0xFFFFFFFF, 0xFFFFFFFF).check(); const BitOr(0xFFFFFFFF, 0, 0xFFFFFFFF).check(); const BitOr(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF).check(); const BitOr(0x123456789ABC, 0x111111111111, 0x57799BBD).check(); const BitOr(0x7000000080000000, 0x8000000000008000, 0x80008000).check(); const BitOr(0x8000000000008000, 0x7000000080000000, 0x80008000).check(); const BitOr(true, true, true).check(); const BitOr(true, false, true).check(); const BitOr(false, true, true).check(); const BitOr(false, false, false).check(); const BitXor(314159, 271828, 61179).check(); const BitXor(271828, 314159, 61179).check(); const BitXor(0, 0, 0).check(); const BitXor(-1, 0, 0xFFFFFFFF).check(); const BitXor(-256, 1, 0xFFFFFF01).check(); const BitXor(-256, -255, 1).check(); const BitXor(0, 0xFFFFFFFF, 0xFFFFFFFF).check(); const BitXor(0xFFFFFFFF, 0, 0xFFFFFFFF).check(); const BitXor(0xFFFFFFFF, 0xFFFFFFFF, 0).check(); const BitXor(0x123456789ABC, 0x111111111111, 0x47698BAD).check(); const BitXor(0x7000000012340000, 0x8000000011110000, 0x03250000).check(); const BitXor(0x8000000011110000, 0x7000000012340000, 0x03250000).check(); const BitXor(true, true, false).check(); const BitXor(true, false, true).check(); const BitXor(false, true, true).check(); const BitXor(false, false, false).check(); const ShiftLeft(42, 0, 42).check(); const ShiftLeft(42, 5, 1344).check(); const ShiftLeft(1, 31, 0x80000000).check(); const ShiftLeft(1, 32, 0).check(); const ShiftLeft(1, 100, 0).check(); const ShiftLeft(0, 0, 0).check(); const ShiftLeft(0, 5, 0).check(); const ShiftLeft(0, 31, 0).check(); const ShiftLeft(0, 32, 0).check(); const ShiftLeft(0, 100, 0).check(); const ShiftLeft(-1, 0, 0xFFFFFFFF).check(); const ShiftLeft(-1, 5, 0xFFFFFFE0).check(); const ShiftLeft(-1, 31, 0x80000000).check(); const ShiftLeft(-1, 32, 0).check(); const ShiftLeft(-1, 100, 0).check(); const ShiftLeft(0x7000000000008000, 0, 0x8000).check(); const ShiftLeft(0x7000000000008000, 1, 0x10000).check(); const ShiftLeft(0x7000000000008000, 16, 0x80000000).check(); const ShiftLeft(0x7000000000008000, 17, 0x0).check(); const ShiftLeft(0x8000000000008000, 0, 0x8000).check(); const ShiftLeft(0x8000000000008000, 1, 0x10000).check(); const ShiftLeft(0x8000000000008000, 16, 0x80000000).check(); const ShiftLeft(0x8000000000008000, 17, 0x0).check(); const ShiftRight(8675309, 0, 8675309).check(); const ShiftRight(8675309, 5, 271103).check(); const ShiftRight(0xFEDCBA98, 0, 0xFEDCBA98).check(); const ShiftRight(0xFEDCBA98, 5, 0x07F6E5D4).check(); const ShiftRight(0xFEDCBA98, 31, 1).check(); const ShiftRight(0xFEDCBA98, 32, 0).check(); const ShiftRight(0xFEDCBA98, 100, 0).check(); const ShiftRight(0xFFFFFEDCBA98, 0, 0xFEDCBA98).check(); const ShiftRight(0xFFFFFEDCBA98, 5, 0x07F6E5D4).check(); const ShiftRight(0xFFFFFEDCBA98, 31, 1).check(); const ShiftRight(0xFFFFFEDCBA98, 32, 0).check(); const ShiftRight(0xFFFFFEDCBA98, 100, 0).check(); const ShiftRight(-1, 0, 0xFFFFFFFF).check(); const ShiftRight(-1, 5, 0xFFFFFFFF).check(); const ShiftRight(-1, 31, 0xFFFFFFFF).check(); const ShiftRight(-1, 32, 0xFFFFFFFF).check(); const ShiftRight(-1, 100, 0xFFFFFFFF).check(); const ShiftRight(-1073741824, 0, 0xC0000000).check(); const ShiftRight(-1073741824, 5, 0xFE000000).check(); const ShiftRight(-1073741824, 31, 0xFFFFFFFF).check(); const ShiftRight(-1073741824, 32, 0xFFFFFFFF).check(); const ShiftRight(-1073741824, 100, 0xFFFFFFFF).check(); const ShiftRight(0x7000000000008000, 0, 0x8000).check(); const ShiftRight(0x7000000000008000, 1, 0x4000).check(); const ShiftRight(0x7000000000008000, 15, 0x1).check(); const ShiftRight(0x7000000000008000, 16, 0).check(); const ShiftRight(0x8000000000008000, 0, 0x8000).check(); const ShiftRight(0x8000000000008000, 1, 0x4000).check(); const ShiftRight(0x8000000000008000, 15, 0x1).check(); const ShiftRight(0x8000000000008000, 16, 0).check(); const BooleanAnd(true, true, true).check(); const BooleanAnd(true, false, false).check(); const BooleanAnd(false, true, false).check(); const BooleanAnd(false, false, false).check(); const BooleanAnd(false, null, false).check(); const BooleanOr(true, true, true).check(); const BooleanOr(true, false, true).check(); const BooleanOr(false, true, true).check(); const BooleanOr(false, false, false).check(); const BooleanOr(true, null, true).check(); const Subtract(314159, 271828, 42331).check(); const Subtract(271828, 314159, -42331).check(); const Subtract(0, 0, 0).check(); const Subtract(0, 42, -42).check(); const Subtract(0, -42, 42).check(); const Subtract(42, 0, 42).check(); const Subtract(42, 42, 0).check(); const Subtract(42, -42, 84).check(); const Subtract(-42, 0, -42).check(); const Subtract(-42, 42, -84).check(); const Subtract(-42, -42, 0).check(); const Subtract(4294967295, -1, 4294967296).check(); const Subtract(4294967296, -1, 4294967297).check(); const Subtract(9007199254740991, -1, 9007199254740992).check(); const Subtract(9007199254740992, -1, 9007199254740992).check(); const Subtract(9007199254740992, -100, 9007199254741092).check(); const Subtract(-4294967295, 1, -4294967296).check(); const Subtract(-4294967296, 1, -4294967297).check(); const Subtract(-9007199254740991, 1, -9007199254740992).check(); const Subtract(-9007199254740992, 1, -9007199254740992).check(); const Subtract(-9007199254740992, 100, -9007199254741092).check(); const Subtract( 0x7fffffff00000000, -0x7fffffff00000000, 2 * 0x7fffffff00000000) .check(); const Subtract(4.2, 1.5, 2.7).check(); const Subtract(1.5, 4.2, -2.7).check(); const Subtract(1.5, 0, 1.5).check(); const Subtract(0, 1.5, -1.5).check(); const Subtract(1.5, 1.5, 0.0).check(); const Subtract(-1.5, -1.5, 0.0).check(); const Subtract(0.0, 0.0, 0.0).check(); const Subtract(0.0, -0.0, 0.0).check(); const Subtract(-0.0, 0.0, -0.0).check(); const Subtract(-0.0, -0.0, 0.0).check(); const Subtract(double.maxFinite, -double.maxFinite, double.infinity).check(); const Subtract(-double.maxFinite, double.maxFinite, double.negativeInfinity) .check(); const Subtract(1.5, double.nan, double.nan).check(); const Subtract(double.nan, 1.5, double.nan).check(); const Subtract(double.nan, double.nan, double.nan).check(); const Subtract(double.nan, double.infinity, double.nan).check(); const Subtract(double.nan, double.negativeInfinity, double.nan).check(); const Subtract(double.infinity, double.nan, double.nan).check(); const Subtract(double.negativeInfinity, double.nan, double.nan).check(); const Subtract(double.infinity, double.maxFinite, double.infinity).check(); const Subtract(double.infinity, -double.maxFinite, double.infinity).check(); const Subtract( double.negativeInfinity, double.maxFinite, double.negativeInfinity) .check(); const Subtract( double.negativeInfinity, -double.maxFinite, double.negativeInfinity) .check(); const Subtract(1.5, double.infinity, double.negativeInfinity).check(); const Subtract(1.5, double.negativeInfinity, double.infinity).check(); const Subtract(double.infinity, double.infinity, double.nan).check(); const Subtract(double.infinity, double.negativeInfinity, double.infinity) .check(); const Subtract( double.negativeInfinity, double.infinity, double.negativeInfinity) .check(); const Subtract(double.negativeInfinity, double.negativeInfinity, double.nan) .check(); const Subtract(double.minPositive, double.minPositive, 0.0).check(); const Subtract(-double.minPositive, -double.minPositive, 0.0).check(); const Multiply(6, 7, 42).check(); const Multiply(-6, 7, -42).check(); const Multiply(6, -7, -42).check(); const Multiply(-6, -7, 42).check(); const Multiply(0, 0, 0).check(); const Multiply(0, 7, 0).check(); const Multiply(6, 0, 0).check(); const Multiply(65536, 65536, 4294967296).check(); const Multiply(4294967296, -1, -4294967296).check(); const Multiply(-1, 4294967296, -4294967296).check(); const Multiply(134217728, 134217728, 18014398509481984).check(); const Multiply(18014398509481984, -1, -18014398509481984).check(); const Multiply(-1, 18014398509481984, -18014398509481984).check(); const Multiply(9000000000000000, 9000000000000000, 8.1e31).check(); const Multiply(0x7fff000000000000, 0x8000000000000000, 8.506799558180535e37) .check(); const Multiply(0x8000000000000000, 1.2, 11068046444225730000.0).check(); const Multiply(3.14, 2.72, 8.5408).check(); const Multiply(-3.14, 2.72, -8.5408).check(); const Multiply(3.14, -2.72, -8.5408).check(); const Multiply(-3.14, -2.72, 8.5408).check(); const Multiply(3.14, 0, 0.0).check(); const Multiply(0, 2.72, 0.0).check(); const Multiply(0.0, 0.0, 0.0).check(); const Multiply(0.0, -0.0, -0.0).check(); const Multiply(-0.0, 0.0, -0.0).check(); const Multiply(-0.0, -0.0, 0.0).check(); const Multiply(double.maxFinite, double.maxFinite, double.infinity).check(); const Multiply(double.maxFinite, -double.maxFinite, double.negativeInfinity) .check(); const Multiply(-double.maxFinite, double.maxFinite, double.negativeInfinity) .check(); const Multiply(-double.maxFinite, -double.maxFinite, double.infinity).check(); const Multiply(0, double.nan, double.nan).check(); const Multiply(double.nan, 0, double.nan).check(); const Multiply(double.nan, double.nan, double.nan).check(); const Multiply(0, double.infinity, double.nan).check(); const Multiply(double.infinity, 0, double.nan).check(); const Multiply(0, double.negativeInfinity, double.nan).check(); const Multiply(double.negativeInfinity, 0, double.nan).check(); const Multiply(-0.0, double.infinity, double.nan).check(); const Multiply(double.infinity, -0.0, double.nan).check(); const Multiply(-0.0, double.negativeInfinity, double.nan).check(); const Multiply(double.negativeInfinity, -0.0, double.nan).check(); const Multiply(double.infinity, double.infinity, double.infinity).check(); const Multiply( double.infinity, double.negativeInfinity, double.negativeInfinity) .check(); const Multiply( double.negativeInfinity, double.infinity, double.negativeInfinity) .check(); const Multiply( double.negativeInfinity, double.negativeInfinity, double.infinity) .check(); const Multiply(double.minPositive, 0.5, 0.0).check(); const Multiply(double.minPositive, -0.5, -0.0).check(); const Multiply(-double.minPositive, 0.5, -0.0).check(); const Multiply(-double.minPositive, -0.5, 0.0).check(); const Multiply(1e-300, -1e-300, -0.0).check(); const Multiply(double.minPositive, double.infinity, double.infinity).check(); const Multiply( double.minPositive, double.negativeInfinity, double.negativeInfinity) .check(); const Multiply(double.minPositive, double.maxFinite, 8.881784197001251e-16) .check(); const Modulo(27, 314159, 27).check(); const Modulo(27, 1, 0).check(); const Modulo(27, -1, 0).check(); const Modulo(-27, 1, 0).check(); const Modulo(-27, -1, 0).check(); const Modulo(314159, 27, 14).check(); const Modulo(314159, -27, 14).check(); const Modulo(-314159, 27, 13).check(); const Modulo(-314159, -27, 13).check(); const Modulo(4294967295, 4294967296, 4294967295).check(); const Modulo(4294967295, -4294967296, 4294967295).check(); const Modulo(-4294967295, 4294967296, 1).check(); const Modulo(-4294967295, -4294967296, 1).check(); const Modulo(9007199254740991, 9007199254740992, 9007199254740991).check(); const Modulo(9007199254740991, -9007199254740992, 9007199254740991).check(); const Modulo(-9007199254740991, 9007199254740992, 1).check(); const Modulo(-9007199254740991, -9007199254740992, 1).check(); const Modulo(2.71828, 3.14159, 2.71828).check(); const Modulo(2.71828, 1, 0.71828).check(); const Modulo(2.71828, -1, 0.71828).check(); const Modulo(-2.71828, 1, 0.28171999999999997).check(); const Modulo(-2.71828, -1, 0.28171999999999997).check(); const Modulo(27.1828, 3.14159, 2.0500800000000012).check(); const Modulo(27.1828, -3.14159, 2.0500800000000012).check(); const Modulo(-27.1828, 3.14159, 1.0915099999999986).check(); const Modulo(-27.1828, -3.14159, 1.0915099999999986).check(); const Modulo(42, double.nan, double.nan).check(); const Modulo(double.nan, 42, double.nan).check(); const Modulo(0, double.nan, double.nan).check(); const Modulo(double.nan, double.nan, double.nan).check(); const Modulo(double.infinity, double.nan, double.nan).check(); const Modulo(double.nan, double.infinity, double.nan).check(); const Modulo(0.0, double.infinity, 0).check(); const Modulo(-0.0, double.infinity, 0).check(); const Modulo(0.0, double.negativeInfinity, 0).check(); const Modulo(-0.0, double.negativeInfinity, 0).check(); const Modulo(42, double.infinity, 42).check(); const Modulo(-42, double.infinity, double.infinity).check(); const Modulo(42, double.negativeInfinity, 42).check(); const Modulo(-42, double.negativeInfinity, double.infinity).check(); const Modulo(double.infinity, 42, double.nan).check(); const Modulo(double.infinity, -42, double.nan).check(); const Modulo(double.negativeInfinity, 42, double.nan).check(); const Modulo(double.negativeInfinity, -42, double.nan).check(); const Modulo(double.infinity, double.infinity, double.nan).check(); const Modulo(double.negativeInfinity, double.infinity, double.nan).check(); const Modulo(double.infinity, double.negativeInfinity, double.nan).check(); const Modulo(double.negativeInfinity, double.negativeInfinity, double.nan) .check(); const TruncatingDivide(27, 314159, 0).check(); const TruncatingDivide(27, 1, 27).check(); const TruncatingDivide(27, -1, -27).check(); const TruncatingDivide(-27, 1, -27).check(); const TruncatingDivide(-27, -1, 27).check(); const TruncatingDivide(314159, 27, 11635).check(); const TruncatingDivide(314159, -27, -11635).check(); const TruncatingDivide(-314159, 27, -11635).check(); const TruncatingDivide(-314159, -27, 11635).check(); const TruncatingDivide(4294967295, 4294967296, 0).check(); const TruncatingDivide(4294967295, -4294967296, 0).check(); const TruncatingDivide(-4294967295, 4294967296, 0).check(); const TruncatingDivide(-4294967295, -4294967296, 0).check(); const TruncatingDivide(9007199254740991, 9007199254740992, 0).check(); const TruncatingDivide(9007199254740991, -9007199254740992, 0).check(); const TruncatingDivide(-9007199254740991, 9007199254740992, 0).check(); const TruncatingDivide(-9007199254740991, -9007199254740992, 0).check(); const TruncatingDivide(4294967295, 0.5, 8589934590).check(); const TruncatingDivide(4294967295, -0.5, -8589934590).check(); const TruncatingDivide(-4294967295, 0.5, -8589934590).check(); const TruncatingDivide(-4294967295, -0.5, 8589934590).check(); const TruncatingDivide(9007199254740991, 0.5, 18014398509481982).check(); const TruncatingDivide(9007199254740991, -0.5, -18014398509481982).check(); const TruncatingDivide(-9007199254740991, 0.5, -18014398509481982).check(); const TruncatingDivide(-9007199254740991, -0.5, 18014398509481982).check(); const TruncatingDivide(0x8000000000000000, -1, -0x8000000000000000).check(); const TruncatingDivide(0x6000000000000000, 0.5, 0xC000000000000000).check(); const TruncatingDivide(2.71828, 3.14159, 0).check(); const TruncatingDivide(2.71828, 1, 2).check(); const TruncatingDivide(2.71828, -1, -2).check(); const TruncatingDivide(-2.71828, 1, -2).check(); const TruncatingDivide(-2.71828, -1, 2).check(); const TruncatingDivide(27.1828, 3.14159, 8).check(); const TruncatingDivide(27.1828, -3.14159, -8).check(); const TruncatingDivide(-27.1828, 3.14159, -8).check(); const TruncatingDivide(-27.1828, -3.14159, 8).check(); const TruncatingDivide(0.0, double.infinity, 0).check(); const TruncatingDivide(-0.0, double.infinity, 0).check(); const TruncatingDivide(0.0, double.negativeInfinity, 0).check(); const TruncatingDivide(-0.0, double.negativeInfinity, 0).check(); const TruncatingDivide(42, double.infinity, 0).check(); const TruncatingDivide(-42, double.infinity, 0).check(); const TruncatingDivide(42, double.negativeInfinity, 0).check(); const TruncatingDivide(-42, double.negativeInfinity, 0).check(); const Divide(27, 3, 9).check(); const Divide(27, 1, 27).check(); const Divide(27, -1, -27).check(); const Divide(-27, 1, -27).check(); const Divide(-27, -1, 27).check(); const Divide(0, 1, 0).check(); const Divide(0, -1, -0.0).check(); const Divide(-0.0, 1, -0.0).check(); const Divide(-0.0, -1, 0).check(); const Divide(314159, 27, 11635.518518518518).check(); const Divide(314159, -27, -11635.518518518518).check(); const Divide(-314159, 27, -11635.518518518518).check(); const Divide(-314159, -27, 11635.518518518518).check(); const Divide(4294967295, 4294967296, 0.9999999997671694).check(); const Divide(4294967295, -4294967296, -0.9999999997671694).check(); const Divide(-4294967295, 4294967296, -0.9999999997671694).check(); const Divide(-4294967295, -4294967296, 0.9999999997671694).check(); const Divide(9007199254740991, 9007199254740992, 0.9999999999999999).check(); const Divide(9007199254740991, -9007199254740992, -0.9999999999999999) .check(); const Divide(-9007199254740991, 9007199254740992, -0.9999999999999999) .check(); const Divide(-9007199254740991, -9007199254740992, 0.9999999999999999) .check(); const Divide(4294967296, 4294967295, 1.0000000002328306).check(); const Divide(4294967296, -4294967295, -1.0000000002328306).check(); const Divide(-4294967296, 4294967295, -1.0000000002328306).check(); const Divide(-4294967296, -4294967295, 1.0000000002328306).check(); const Divide(9007199254740992, 9007199254740991, 1.0000000000000002).check(); const Divide(9007199254740992, -9007199254740991, -1.0000000000000002) .check(); const Divide(-9007199254740992, 9007199254740991, -1.0000000000000002) .check(); const Divide(-9007199254740992, -9007199254740991, 1.0000000000000002) .check(); const Divide(4294967295, 0.5, 8589934590).check(); const Divide(4294967295, -0.5, -8589934590).check(); const Divide(-4294967295, 0.5, -8589934590).check(); const Divide(-4294967295, -0.5, 8589934590).check(); const Divide(9007199254740991, 0.5, 18014398509481982).check(); const Divide(9007199254740991, -0.5, -18014398509481982).check(); const Divide(-9007199254740991, 0.5, -18014398509481982).check(); const Divide(-9007199254740991, -0.5, 18014398509481982).check(); const Divide(2.71828, 3.14159, 0.8652561282662601).check(); const Divide(2.71828, 1, 2.71828).check(); const Divide(2.71828, -1, -2.71828).check(); const Divide(-2.71828, 1, -2.71828).check(); const Divide(-2.71828, -1, 2.71828).check(); const Divide(27.1828, 3.14159, 8.652561282662601).check(); const Divide(27.1828, -3.14159, -8.652561282662601).check(); const Divide(-27.1828, 3.14159, -8.652561282662601).check(); const Divide(-27.1828, -3.14159, 8.652561282662601).check(); const Divide(1, 0, double.infinity).check(); const Divide(1, -0.0, double.negativeInfinity).check(); const Divide(-1, 0, double.negativeInfinity).check(); const Divide(-1, -0.0, double.infinity).check(); const Divide(0, 0, double.nan).check(); const Divide(0, -0.0, double.nan).check(); const Divide(-0.0, 0, double.nan).check(); const Divide(-0.0, -0.0, double.nan).check(); const Divide(double.infinity, 0, double.infinity).check(); const Divide(double.infinity, -0.0, double.negativeInfinity).check(); const Divide(double.negativeInfinity, 0, double.negativeInfinity).check(); const Divide(double.negativeInfinity, -0.0, double.infinity).check(); const Divide(double.nan, 0, double.nan).check(); const Divide(double.nan, -0.0, double.nan).check(); const Divide(double.nan, 1, double.nan).check(); const Divide(1, double.nan, double.nan).check(); const Divide(0, double.nan, double.nan).check(); const Divide(double.nan, double.nan, double.nan).check(); const Divide(double.nan, double.infinity, double.nan).check(); const Divide(double.infinity, double.nan, double.nan).check(); const Divide(double.negativeInfinity, double.nan, double.nan).check(); const Divide(double.infinity, 1, double.infinity).check(); const Divide(double.infinity, -1, double.negativeInfinity).check(); const Divide(double.negativeInfinity, 1, double.negativeInfinity).check(); const Divide(double.negativeInfinity, -1, double.infinity).check(); const Divide(0, double.infinity, 0).check(); const Divide(0, double.negativeInfinity, -0.0).check(); const Divide(-0.0, double.infinity, -0.0).check(); const Divide(-0.0, double.negativeInfinity, 0).check(); const Divide(1, double.infinity, 0).check(); const Divide(1, double.negativeInfinity, -0.0).check(); const Divide(-1, double.infinity, -0.0).check(); const Divide(-1, double.negativeInfinity, 0).check(); const Divide(double.infinity, double.infinity, double.nan).check(); const Divide(double.minPositive, double.maxFinite, 0).check(); const Divide(double.minPositive, -double.maxFinite, -0.0).check(); const Divide(-double.minPositive, double.maxFinite, -0.0).check(); const Divide(-double.minPositive, -double.maxFinite, 0).check(); const Divide(double.maxFinite, double.minPositive, double.infinity).check(); const Divide(double.maxFinite, -double.minPositive, double.negativeInfinity) .check(); const Divide(-double.maxFinite, double.minPositive, double.negativeInfinity) .check(); const Divide(-double.maxFinite, -double.minPositive, double.infinity).check(); const Add("", "", "").check(); const Add("foo", "", "foo").check(); const Add("", "bar", "bar").check(); const Add("foo", "bar", "foobar").check(); const Add(314159, 271828, 585987).check(); const Add(314159, -271828, 42331).check(); const Add(-314159, 271828, -42331).check(); const Add(-314159, -271828, -585987).check(); const Add(0, 0, 0).check(); const Add(0, 42, 42).check(); const Add(0, -42, -42).check(); const Add(42, 0, 42).check(); const Add(42, 42, 84).check(); const Add(42, -42, 0).check(); const Add(-42, 0, -42).check(); const Add(-42, 42, 0).check(); const Add(-42, -42, -84).check(); const Add(4294967295, 1, 4294967296).check(); const Add(4294967296, 1, 4294967297).check(); const Add(9007199254740991, 1, 9007199254740992).check(); const Add(9007199254740992, 1, 9007199254740992).check(); const Add(9007199254740992, 100, 9007199254741092).check(); const Add(-4294967295, -1, -4294967296).check(); const Add(-4294967296, -1, -4294967297).check(); const Add(-9007199254740991, -1, -9007199254740992).check(); const Add(-9007199254740992, -1, -9007199254740992).check(); const Add(-9007199254740992, -100, -9007199254741092).check(); const Add(4.2, 1.5, 5.7).check(); const Add(4.2, -1.5, 2.7).check(); const Add(-4.2, 1.5, -2.7).check(); const Add(-4.2, -1.5, -5.7).check(); const Add(1.5, 0, 1.5).check(); const Add(0, 1.5, 1.5).check(); const Add(1.5, -1.5, 0.0).check(); const Add(-1.5, 1.5, 0.0).check(); const Add(0.0, 0.0, 0.0).check(); const Add(0.0, -0.0, 0.0).check(); const Add(-0.0, 0.0, 0.0).check(); const Add(-0.0, -0.0, -0.0).check(); const Add(double.maxFinite, double.maxFinite, double.infinity).check(); const Add(-double.maxFinite, -double.maxFinite, double.negativeInfinity) .check(); const Add(1.5, double.nan, double.nan).check(); const Add(double.nan, 1.5, double.nan).check(); const Add(double.nan, double.nan, double.nan).check(); const Add(double.nan, double.infinity, double.nan).check(); const Add(double.nan, double.negativeInfinity, double.nan).check(); const Add(double.infinity, double.nan, double.nan).check(); const Add(double.negativeInfinity, double.nan, double.nan).check(); const Add(double.infinity, -double.maxFinite, double.infinity).check(); const Add(double.infinity, double.maxFinite, double.infinity).check(); const Add(double.negativeInfinity, -double.maxFinite, double.negativeInfinity) .check(); const Add(double.negativeInfinity, double.maxFinite, double.negativeInfinity) .check(); const Add(1.5, double.negativeInfinity, double.negativeInfinity).check(); const Add(1.5, double.infinity, double.infinity).check(); const Add(double.infinity, double.infinity, double.infinity).check(); const Add(double.infinity, double.negativeInfinity, double.nan).check(); const Add(double.negativeInfinity, double.infinity, double.nan).check(); const Add(double.negativeInfinity, double.negativeInfinity, double.negativeInfinity) .check(); const Add(double.minPositive, -double.minPositive, 0.0).check(); const Add(-double.minPositive, double.minPositive, 0.0).check(); const Less(double.nan, double.nan, false).check(); const Less(double.nan, double.infinity, false).check(); const Less(double.infinity, double.nan, false).check(); const Less(double.nan, double.maxFinite, false).check(); const Less(double.maxFinite, double.nan, false).check(); const Less(double.nan, -double.maxFinite, false).check(); const Less(-double.maxFinite, double.nan, false).check(); const Less(double.nan, double.negativeInfinity, false).check(); const Less(double.negativeInfinity, double.nan, false).check(); const Less(double.negativeInfinity, double.negativeInfinity, false).check(); const Less(double.negativeInfinity, -double.maxFinite, true).check(); const Less(-double.maxFinite, double.negativeInfinity, false).check(); const Less(-double.maxFinite, -double.maxFinite, false).check(); const Less(-double.maxFinite, -9007199254740992, true).check(); const Less(-9007199254740992, -double.maxFinite, false).check(); const Less(-9007199254740992, -9007199254740992, false).check(); const Less(-9007199254740992, -4294967296, true).check(); const Less(-4294967296, -9007199254740992, false).check(); const Less(-4294967296, -4294967296, false).check(); const Less(-4294967296, -42, true).check(); const Less(-42, -4294967296, false).check(); const Less(-42, -42, false).check(); const Less(-42, -42.0, false).check(); const Less(-42.0, -42, false).check(); const Less(-42.0, -42.0, false).check(); const Less(-42, -3.14, true).check(); const Less(-3.14, -42, false).check(); const Less(-3.14, -3.14, false).check(); const Less(-3.14, -double.minPositive, true).check(); const Less(-double.minPositive, -3.14, false).check(); const Less(-double.minPositive, -double.minPositive, false).check(); const Less(-double.minPositive, -0.0, true).check(); const Less(-0.0, -double.minPositive, false).check(); const Less(-0.0, -0.0, false).check(); const Less(0, 0, false).check(); const Less(0.0, 0.0, false).check(); const Less(-0.0, 0, false).check(); const Less(0, -0.0, false).check(); const Less(-0.0, 0.0, false).check(); const Less(0.0, -0.0, false).check(); const Less(0, 0.0, false).check(); const Less(0.0, 0, false).check(); const Less(0.0, double.minPositive, true).check(); const Less(double.minPositive, 0.0, false).check(); const Less(double.minPositive, double.minPositive, false).check(); const Less(double.minPositive, 3.14, true).check(); const Less(3.14, double.minPositive, false).check(); const Less(3.14, 3.14, false).check(); const Less(3.14, 42, true).check(); const Less(42, 3.14, false).check(); const Less(42.0, 42.0, false).check(); const Less(42, 42.0, false).check(); const Less(42.0, 42, false).check(); const Less(42, 42, false).check(); const Less(42, 4294967296, true).check(); const Less(4294967296, 42, false).check(); const Less(4294967296, 4294967296, false).check(); const Less(4294967296, 9007199254740992, true).check(); const Less(9007199254740992, 4294967296, false).check(); const Less(9007199254740992, 9007199254740992, false).check(); const Less(9007199254740992, double.maxFinite, true).check(); const Less(double.maxFinite, 9007199254740992, false).check(); const Less(double.maxFinite, double.maxFinite, false).check(); const Less(double.maxFinite, double.infinity, true).check(); const Less(double.infinity, double.maxFinite, false).check(); const Less(double.infinity, double.infinity, false).check(); const Less(0x7fffffff00000000, 0x8000000000000000, true).check(); const Less(0x8000000000000000, 0x7fffffff00000000, false).check(); const LessEqual(double.nan, double.nan, false).check(); const LessEqual(double.nan, double.infinity, false).check(); const LessEqual(double.infinity, double.nan, false).check(); const LessEqual(double.nan, double.maxFinite, false).check(); const LessEqual(double.maxFinite, double.nan, false).check(); const LessEqual(double.nan, -double.maxFinite, false).check(); const LessEqual(-double.maxFinite, double.nan, false).check(); const LessEqual(double.nan, double.negativeInfinity, false).check(); const LessEqual(double.negativeInfinity, double.nan, false).check(); const LessEqual(double.negativeInfinity, double.negativeInfinity, true) .check(); const LessEqual(double.negativeInfinity, -double.maxFinite, true).check(); const LessEqual(-double.maxFinite, double.negativeInfinity, false).check(); const LessEqual(-double.maxFinite, -double.maxFinite, true).check(); const LessEqual(-double.maxFinite, -9007199254740992, true).check(); const LessEqual(-9007199254740992, -double.maxFinite, false).check(); const LessEqual(-9007199254740992, -9007199254740992, true).check(); const LessEqual(-9007199254740992, -4294967296, true).check(); const LessEqual(-4294967296, -9007199254740992, false).check(); const LessEqual(-4294967296, -4294967296, true).check(); const LessEqual(-4294967296, -42, true).check(); const LessEqual(-42, -4294967296, false).check(); const LessEqual(-42, -42, true).check(); const LessEqual(-42, -42.0, true).check(); const LessEqual(-42.0, -42, true).check(); const LessEqual(-42.0, -42.0, true).check(); const LessEqual(-42, -3.14, true).check(); const LessEqual(-3.14, -42, false).check(); const LessEqual(-3.14, -3.14, true).check(); const LessEqual(-3.14, -double.minPositive, true).check(); const LessEqual(-double.minPositive, -3.14, false).check(); const LessEqual(-double.minPositive, -double.minPositive, true).check(); const LessEqual(-double.minPositive, -0.0, true).check(); const LessEqual(-0.0, -double.minPositive, false).check(); const LessEqual(-0.0, -0.0, true).check(); const LessEqual(0, 0, true).check(); const LessEqual(0.0, 0.0, true).check(); const LessEqual(-0.0, 0, true).check(); const LessEqual(0, -0.0, true).check(); const LessEqual(-0.0, 0.0, true).check(); const LessEqual(0.0, -0.0, true).check(); const LessEqual(0, 0.0, true).check(); const LessEqual(0.0, 0, true).check(); const LessEqual(0.0, double.minPositive, true).check(); const LessEqual(double.minPositive, 0.0, false).check(); const LessEqual(double.minPositive, double.minPositive, true).check(); const LessEqual(double.minPositive, 3.14, true).check(); const LessEqual(3.14, double.minPositive, false).check(); const LessEqual(3.14, 3.14, true).check(); const LessEqual(3.14, 42, true).check(); const LessEqual(42, 3.14, false).check(); const LessEqual(42.0, 42.0, true).check(); const LessEqual(42, 42.0, true).check(); const LessEqual(42.0, 42, true).check(); const LessEqual(42, 42, true).check(); const LessEqual(42, 4294967296, true).check(); const LessEqual(4294967296, 42, false).check(); const LessEqual(4294967296, 4294967296, true).check(); const LessEqual(4294967296, 9007199254740992, true).check(); const LessEqual(9007199254740992, 4294967296, false).check(); const LessEqual(9007199254740992, 9007199254740992, true).check(); const LessEqual(9007199254740992, double.maxFinite, true).check(); const LessEqual(double.maxFinite, 9007199254740992, false).check(); const LessEqual(double.maxFinite, double.maxFinite, true).check(); const LessEqual(double.maxFinite, double.infinity, true).check(); const LessEqual(double.infinity, double.maxFinite, false).check(); const LessEqual(double.infinity, double.infinity, true).check(); const LessEqual(0x7fffffff00000000, 0x8000000000000000, true).check(); const LessEqual(0x8000000000000000, 0x7fffffff00000000, false).check(); const Greater(double.nan, double.nan, false).check(); const Greater(double.nan, double.infinity, false).check(); const Greater(double.infinity, double.nan, false).check(); const Greater(double.nan, double.maxFinite, false).check(); const Greater(double.maxFinite, double.nan, false).check(); const Greater(double.nan, -double.maxFinite, false).check(); const Greater(-double.maxFinite, double.nan, false).check(); const Greater(double.nan, double.negativeInfinity, false).check(); const Greater(double.negativeInfinity, double.nan, false).check(); const Greater(double.negativeInfinity, double.negativeInfinity, false) .check(); const Greater(double.negativeInfinity, -double.maxFinite, false).check(); const Greater(-double.maxFinite, double.negativeInfinity, true).check(); const Greater(-double.maxFinite, -double.maxFinite, false).check(); const Greater(-double.maxFinite, -9007199254740992, false).check(); const Greater(-9007199254740992, -double.maxFinite, true).check(); const Greater(-9007199254740992, -9007199254740992, false).check(); const Greater(-9007199254740992, -4294967296, false).check(); const Greater(-4294967296, -9007199254740992, true).check(); const Greater(-4294967296, -4294967296, false).check(); const Greater(-4294967296, -42, false).check(); const Greater(-42, -4294967296, true).check(); const Greater(-42, -42, false).check(); const Greater(-42, -42.0, false).check(); const Greater(-42.0, -42, false).check(); const Greater(-42.0, -42.0, false).check(); const Greater(-42, -3.14, false).check(); const Greater(-3.14, -42, true).check(); const Greater(-3.14, -3.14, false).check(); const Greater(-3.14, -double.minPositive, false).check(); const Greater(-double.minPositive, -3.14, true).check(); const Greater(-double.minPositive, -double.minPositive, false).check(); const Greater(-double.minPositive, -0.0, false).check(); const Greater(-0.0, -double.minPositive, true).check(); const Greater(-0.0, -0.0, false).check(); const Greater(0, 0, false).check(); const Greater(0.0, 0.0, false).check(); const Greater(-0.0, 0, false).check(); const Greater(0, -0.0, false).check(); const Greater(-0.0, 0.0, false).check(); const Greater(0.0, -0.0, false).check(); const Greater(0, 0.0, false).check(); const Greater(0.0, 0, false).check(); const Greater(0.0, double.minPositive, false).check(); const Greater(double.minPositive, 0.0, true).check(); const Greater(double.minPositive, double.minPositive, false).check(); const Greater(double.minPositive, 3.14, false).check(); const Greater(3.14, double.minPositive, true).check(); const Greater(3.14, 3.14, false).check(); const Greater(3.14, 42, false).check(); const Greater(42, 3.14, true).check(); const Greater(42.0, 42.0, false).check(); const Greater(42, 42.0, false).check(); const Greater(42.0, 42, false).check(); const Greater(42, 42, false).check(); const Greater(42, 4294967296, false).check(); const Greater(4294967296, 42, true).check(); const Greater(4294967296, 4294967296, false).check(); const Greater(4294967296, 9007199254740992, false).check(); const Greater(9007199254740992, 4294967296, true).check(); const Greater(9007199254740992, 9007199254740992, false).check(); const Greater(9007199254740992, double.maxFinite, false).check(); const Greater(double.maxFinite, 9007199254740992, true).check(); const Greater(double.maxFinite, double.maxFinite, false).check(); const Greater(double.maxFinite, double.infinity, false).check(); const Greater(double.infinity, double.maxFinite, true).check(); const Greater(double.infinity, double.infinity, false).check(); const Greater(0x7fffffff00000000, 0x8000000000000000, false).check(); const Greater(0x8000000000000000, 0x7fffffff00000000, true).check(); const GreaterEqual(double.nan, double.nan, false).check(); const GreaterEqual(double.nan, double.infinity, false).check(); const GreaterEqual(double.infinity, double.nan, false).check(); const GreaterEqual(double.nan, double.maxFinite, false).check(); const GreaterEqual(double.maxFinite, double.nan, false).check(); const GreaterEqual(double.nan, -double.maxFinite, false).check(); const GreaterEqual(-double.maxFinite, double.nan, false).check(); const GreaterEqual(double.nan, double.negativeInfinity, false).check(); const GreaterEqual(double.negativeInfinity, double.nan, false).check(); const GreaterEqual(double.negativeInfinity, double.negativeInfinity, true) .check(); const GreaterEqual(double.negativeInfinity, -double.maxFinite, false).check(); const GreaterEqual(-double.maxFinite, double.negativeInfinity, true).check(); const GreaterEqual(-double.maxFinite, -double.maxFinite, true).check(); const GreaterEqual(-double.maxFinite, -9007199254740992, false).check(); const GreaterEqual(-9007199254740992, -double.maxFinite, true).check(); const GreaterEqual(-9007199254740992, -9007199254740992, true).check(); const GreaterEqual(-9007199254740992, -4294967296, false).check(); const GreaterEqual(-4294967296, -9007199254740992, true).check(); const GreaterEqual(-4294967296, -4294967296, true).check(); const GreaterEqual(-4294967296, -42, false).check(); const GreaterEqual(-42, -4294967296, true).check(); const GreaterEqual(-42, -42, true).check(); const GreaterEqual(-42, -42.0, true).check(); const GreaterEqual(-42.0, -42, true).check(); const GreaterEqual(-42.0, -42.0, true).check(); const GreaterEqual(-42, -3.14, false).check(); const GreaterEqual(-3.14, -42, true).check(); const GreaterEqual(-3.14, -3.14, true).check(); const GreaterEqual(-3.14, -double.minPositive, false).check(); const GreaterEqual(-double.minPositive, -3.14, true).check(); const GreaterEqual(-double.minPositive, -double.minPositive, true).check(); const GreaterEqual(-double.minPositive, -0.0, false).check(); const GreaterEqual(-0.0, -double.minPositive, true).check(); const GreaterEqual(-0.0, -0.0, true).check(); const GreaterEqual(0, 0, true).check(); const GreaterEqual(0.0, 0.0, true).check(); const GreaterEqual(-0.0, 0, true).check(); const GreaterEqual(0, -0.0, true).check(); const GreaterEqual(-0.0, 0.0, true).check(); const GreaterEqual(0.0, -0.0, true).check(); const GreaterEqual(0, 0.0, true).check(); const GreaterEqual(0.0, 0, true).check(); const GreaterEqual(0.0, double.minPositive, false).check(); const GreaterEqual(double.minPositive, 0.0, true).check(); const GreaterEqual(double.minPositive, double.minPositive, true).check(); const GreaterEqual(double.minPositive, 3.14, false).check(); const GreaterEqual(3.14, double.minPositive, true).check(); const GreaterEqual(3.14, 3.14, true).check(); const GreaterEqual(3.14, 42, false).check(); const GreaterEqual(42, 3.14, true).check(); const GreaterEqual(42.0, 42.0, true).check(); const GreaterEqual(42, 42.0, true).check(); const GreaterEqual(42.0, 42, true).check(); const GreaterEqual(42, 42, true).check(); const GreaterEqual(42, 4294967296, false).check(); const GreaterEqual(4294967296, 42, true).check(); const GreaterEqual(4294967296, 4294967296, true).check(); const GreaterEqual(4294967296, 9007199254740992, false).check(); const GreaterEqual(9007199254740992, 4294967296, true).check(); const GreaterEqual(9007199254740992, 9007199254740992, true).check(); const GreaterEqual(9007199254740992, double.maxFinite, false).check(); const GreaterEqual(double.maxFinite, 9007199254740992, true).check(); const GreaterEqual(double.maxFinite, double.maxFinite, true).check(); const GreaterEqual(double.maxFinite, double.infinity, false).check(); const GreaterEqual(double.infinity, double.maxFinite, true).check(); const GreaterEqual(double.infinity, double.infinity, true).check(); const GreaterEqual(0x7fffffff00000000, 0x8000000000000000, false).check(); const GreaterEqual(0x8000000000000000, 0x7fffffff00000000, true).check(); const Equals(null, null, true).check(); const Equals(null, "", false).check(); const Equals("", null, false).check(); const Equals("", "", true).check(); const Equals(true, true, true).check(); const Equals(false, false, true).check(); const Equals(true, false, false).check(); const Equals(false, true, false).check(); const Equals(0, false, false).check(); const Equals(true, 1, false).check(); const Equals(double.nan, double.nan, false).check(); const Equals(0, 0, true).check(); const Equals(0.0, 0.0, true).check(); const Equals(-0.0, -0.0, true).check(); const Equals(0, 0.0, true).check(); const Equals(0.0, 0, true).check(); const Equals(0, -0.0, true).check(); const Equals(-0.0, 0, true).check(); const Equals(0.0, -0.0, true).check(); const Equals(-0.0, 0.0, true).check(); const Equals(1, 1, true).check(); const Equals(1.0, 1.0, true).check(); const Equals(1, 1.0, true).check(); const Equals(1.0, 1, true).check(); const Equals(double.infinity, double.infinity, true).check(); const Equals(double.infinity, double.negativeInfinity, false).check(); const Equals(double.negativeInfinity, double.infinity, false).check(); const Equals(double.negativeInfinity, double.negativeInfinity, true).check(); const Equals(0x8000000000000000, 0x8000000000000000, true).check(); const Equals(0x8000000000000000, -9223372036854775808, false).check(); const Identity(null, null, true).check(); const Identity(null, "", false).check(); const Identity("", null, false).check(); const Identity("", "", true).check(); const Identity(true, true, true).check(); const Identity(false, false, true).check(); const Identity(true, false, false).check(); const Identity(false, true, false).check(); const Identity(0, false, false).check(); const Identity(true, 1, false).check(); const Identity(double.nan, double.nan, false).check(); const Identity(0, 0, true).check(); const Identity(0.0, 0.0, true).check(); const Identity(-0.0, -0.0, true).check(); const Identity(0, 0.0, true).check(); const Identity(0.0, 0, true).check(); const Identity(0, -0.0, true).check(); const Identity(-0.0, 0, true).check(); const Identity(0.0, -0.0, true).check(); const Identity(-0.0, 0.0, true).check(); const Identity(1, 1, true).check(); const Identity(1.0, 1.0, true).check(); const Identity(1, 1.0, true).check(); const Identity(1.0, 1, true).check(); const Identity(double.infinity, double.infinity, true).check(); const Identity(double.infinity, double.negativeInfinity, false).check(); const Identity(double.negativeInfinity, double.infinity, false).check(); const Identity(double.negativeInfinity, double.negativeInfinity, true) .check(); const Identity(0x8000000000000000, 0x8000000000000000, true).check(); const Identity(0x8000000000000000, -9223372036854775808, false).check(); const IfNull(null, null, null).check(); const IfNull(null, 1, 1).check(); const IfNull("foo", 1, "foo").check(); const IfNull("foo", null, "foo").check(); } /// Wraps [Expect.equals] to accommodate JS equality semantics. /// /// Naively using [Expect.equals] causes JS values to be compared with `===`. /// This can yield some unintended results: /// /// * Since `NaN === NaN` is `false`, [Expect.equals] will throw even if both /// values are `NaN`. Therefore, we check for `NaN` specifically. /// * Since `0.0 === -0.0` is `true`, [Expect.equals] will fail to throw if one /// constant evaluation results in `0` or `0.0` and the other results in /// `-0.0`. Therefore, we additionally check that both values have the same /// sign in this case. void jsEquals(expected, actual, [String reason = ""]) { if (expected is num && actual is num) { if (expected.isNaN && actual.isNaN) return; } Expect.equals(expected, actual, reason); if (expected == 0 && actual == 0) { Expect.equals( expected.isNegative, actual.isNegative, (reason == null ? "" : "$reason ") + "${expected.toString()} and " "${actual.toString()} have different signs."); } } abstract class TestOp { final expected; final result; const TestOp(this.expected, this.result); @pragma('dart2js:noInline') checkAll(evalResult) { jsEquals(expected, result, "Frontend constant evaluation does not yield expected value."); jsEquals(expected, evalResult, "Backend constant evaluation does not yield expected value."); jsEquals(expected, eval(), "eval() does not yield expected value."); } eval(); } class BitNot extends TestOp { final arg; const BitNot(this.arg, expected) : super(expected, ~arg); @pragma('dart2js:tryInline') check() => checkAll(eval()); @override @pragma('dart2js:tryInline') eval() => ~arg; } class Negate extends TestOp { final arg; const Negate(this.arg, expected) : super(expected, -arg); @pragma('dart2js:tryInline') check() => checkAll(eval()); @override @pragma('dart2js:tryInline') eval() => -arg; } class Not extends TestOp { final arg; const Not(this.arg, expected) : super(expected, !arg); @pragma('dart2js:tryInline') check() => checkAll(eval()); @override @pragma('dart2js:tryInline') eval() => !arg; } class BitAnd extends TestOp { final arg1; final arg2; const BitAnd(this.arg1, this.arg2, expected) : super(expected, arg1 & arg2); @pragma('dart2js:tryInline') check() => checkAll(eval()); @override @pragma('dart2js:tryInline') eval() => arg1 & arg2; } class BitOr extends TestOp { final arg1; final arg2; const BitOr(this.arg1, this.arg2, expected) : super(expected, arg1 | arg2); @pragma('dart2js:tryInline') check() => checkAll(eval()); @override @pragma('dart2js:tryInline') eval() => arg1 | arg2; } class BitXor extends TestOp { final arg1; final arg2; const BitXor(this.arg1, this.arg2, expected) : super(expected, arg1 ^ arg2); @pragma('dart2js:tryInline') check() => checkAll(eval()); @override @pragma('dart2js:tryInline') eval() => arg1 ^ arg2; } class ShiftLeft extends TestOp { final arg1; final arg2; const ShiftLeft(this.arg1, this.arg2, expected) : super(expected, arg1 << arg2); @pragma('dart2js:tryInline') check() => checkAll(eval()); @override @pragma('dart2js:tryInline') eval() => arg1 << arg2; } class ShiftRight extends TestOp { final arg1; final arg2; const ShiftRight(this.arg1, this.arg2, expected) : super(expected, arg1 >> arg2); @pragma('dart2js:tryInline') check() => checkAll(eval()); @override @pragma('dart2js:tryInline') eval() => arg1 >> arg2; } class BooleanAnd extends TestOp { final arg1; final arg2; const BooleanAnd(this.arg1, this.arg2, expected) : super(expected, arg1 && arg2); @pragma('dart2js:tryInline') check() => checkAll(eval()); @override @pragma('dart2js:tryInline') eval() => arg1 && arg2; } class BooleanOr extends TestOp { final arg1; final arg2; const BooleanOr(this.arg1, this.arg2, expected) : super(expected, arg1 || arg2); @pragma('dart2js:tryInline') check() => checkAll(eval()); @override @pragma('dart2js:tryInline') eval() => arg1 || arg2; } class Subtract extends TestOp { final arg1; final arg2; const Subtract(this.arg1, this.arg2, expected) : super(expected, arg1 - arg2); @pragma('dart2js:tryInline') check() => checkAll(eval()); @override @pragma('dart2js:tryInline') eval() => arg1 - arg2; } class Multiply extends TestOp { final arg1; final arg2; const Multiply(this.arg1, this.arg2, expected) : super(expected, arg1 * arg2); @pragma('dart2js:tryInline') check() => checkAll(eval()); @override @pragma('dart2js:tryInline') eval() => arg1 * arg2; } class Modulo extends TestOp { final arg1; final arg2; const Modulo(this.arg1, this.arg2, expected) : super(expected, arg1 % arg2); @pragma('dart2js:tryInline') check() => checkAll(eval()); @override @pragma('dart2js:tryInline') eval() => arg1 % arg2; } class TruncatingDivide extends TestOp { final arg1; final arg2; const TruncatingDivide(this.arg1, this.arg2, expected) : super(expected, arg1 ~/ arg2); @pragma('dart2js:tryInline') check() => checkAll(eval()); @override @pragma('dart2js:tryInline') eval() => arg1 ~/ arg2; } class Divide extends TestOp { final arg1; final arg2; const Divide(this.arg1, this.arg2, expected) : super(expected, arg1 / arg2); @pragma('dart2js:tryInline') check() => checkAll(eval()); @override @pragma('dart2js:tryInline') eval() => arg1 / arg2; } class Add extends TestOp { final arg1; final arg2; const Add(this.arg1, this.arg2, expected) : super(expected, arg1 + arg2); @pragma('dart2js:tryInline') check() => checkAll(eval()); @pragma('dart2js:tryInline') eval() => arg1 + arg2; } class Less extends TestOp { final arg1; final arg2; const Less(this.arg1, this.arg2, expected) : super(expected, arg1 < arg2); @pragma('dart2js:tryInline') check() => checkAll(eval()); @pragma('dart2js:tryInline') eval() => arg1 < arg2; } class LessEqual extends TestOp { final arg1; final arg2; const LessEqual(this.arg1, this.arg2, expected) : super(expected, arg1 <= arg2); @pragma('dart2js:tryInline') check() => checkAll(eval()); @pragma('dart2js:tryInline') eval() => arg1 <= arg2; } class Greater extends TestOp { final arg1; final arg2; const Greater(this.arg1, this.arg2, expected) : super(expected, arg1 > arg2); @pragma('dart2js:tryInline') check() => checkAll(eval()); @pragma('dart2js:tryInline') eval() => arg1 > arg2; } class GreaterEqual extends TestOp { final arg1; final arg2; const GreaterEqual(this.arg1, this.arg2, expected) : super(expected, arg1 >= arg2); @pragma('dart2js:tryInline') check() => checkAll(eval()); @pragma('dart2js:tryInline') eval() => arg1 >= arg2; } class Equals extends TestOp { final arg1; final arg2; const Equals(this.arg1, this.arg2, expected) : super(expected, arg1 == arg2); @pragma('dart2js:tryInline') check() => checkAll(eval()); @pragma('dart2js:tryInline') eval() => arg1 == arg2; } class Identity extends TestOp { final arg1; final arg2; const Identity(this.arg1, this.arg2, expected) : super(expected, identical(arg1, arg2)); @pragma('dart2js:tryInline') check() => checkAll(eval()); @pragma('dart2js:tryInline') eval() => identical(arg1, arg2); } class IfNull extends TestOp { final arg1; final arg2; const IfNull(this.arg1, this.arg2, expected) : super(expected, arg1 ?? arg2); @pragma('dart2js:tryInline') check() => checkAll(eval()); @pragma('dart2js:tryInline') eval() => arg1 ?? arg2; }