| // 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. | |
| // Testing Mints. Note that the tests may not work on 64-bit machines, | |
| // as Smi's would be used to represent many of the numbers. | |
| library MediumIntegerTest; | |
| import "package:expect/expect.dart"; | |
| class MediumIntegerTest { | |
| static int getMint() { | |
| return 1234567890123456789; | |
| } | |
| static testSmiOverflow() { | |
| int a = 1073741823; | |
| int b = 1073741822; | |
| Expect.equals(2147483645, a + b); | |
| Expect.equals(1152921501385621506, a * b); | |
| Expect.equals(-2147483645, -a - b); | |
| } | |
| static testMintAdd() { | |
| // Mint and Smi. | |
| var a = 1234567890123456789; | |
| var b = 2; | |
| Expect.equals(1234567890123456791, a + b); | |
| Expect.equals(1234567890123456791, b + a); | |
| a = 9223372036854775807; | |
| Expect.equals(-9223372036854775808, a + 1); | |
| // Mint and Mint. | |
| a = 100000000000000001; | |
| Expect.equals(200000000000000002, a + a); | |
| a = 9223372036854775800; | |
| b = 1000000000000000000; | |
| Expect.equals(-8223372036854775816, a + b); | |
| // Mint and double. | |
| var da = 100000000000.0; | |
| b = 100000000000; | |
| Expect.equals(200000000000.0, da + b); | |
| Expect.equals(200000000000.0, b + da); | |
| } | |
| static testMintSub() { | |
| // Mint and Smi. | |
| var a = 1234567890123456789; | |
| var b = 2; | |
| Expect.equals(1234567890123456787, a - b); | |
| a = -9223372036854775808; | |
| Expect.equals(9223372036854775807, a - 1); | |
| // Mint and Mint. | |
| a = 1234567890123456789; | |
| b = 1000000000000000000; | |
| Expect.equals(234567890123456789, a - b); | |
| a = -9223372036854775808; | |
| b = 1000000000000000000; | |
| Expect.equals(8223372036854775808, a - b); | |
| } | |
| static testMintDiv() { | |
| // Mint and Smi. | |
| var a = 1234567890123456788; | |
| var b = 2; | |
| Expect.equals(617283945061728394.0, a / b); | |
| } | |
| static testMintMul() { | |
| // Mint and Smi. | |
| var a = 4611686018427387904; | |
| var b = 10; | |
| Expect.equals(-9223372036854775808, a * b); | |
| b = 1000000000000000000; | |
| Expect.equals(0, a * b); | |
| } | |
| static testMintAnd(mint) { | |
| // Issue 1845. | |
| final int t = 0; | |
| var res = mint & (t - 1); | |
| Expect.equals(mint, res); | |
| } | |
| static void testMain() { | |
| Expect.equals(1234567890123456789, getMint()); | |
| testSmiOverflow(); | |
| testMintAdd(); | |
| testMintSub(); | |
| testMintMul(); | |
| testMintDiv(); | |
| testMintAnd(-1925149952); | |
| testMintAnd(1925149952); | |
| testMintAnd(0x100000001); | |
| var a = 100000000000; | |
| var b = 100000000001; | |
| Expect.equals(false, a.hashCode == b.hashCode); | |
| Expect.equals(true, a.hashCode == (b - 1).hashCode); | |
| } | |
| } | |
| main() { | |
| for (int i = 0; i < 4000; i++) { | |
| MediumIntegerTest.testMain(); | |
| } | |
| } |