// Copyright (c) 2013, 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. // Test num.clamp. // VMOptions=--no-use-field-guards // VMOptions= import "package:expect/expect.dart"; // Pedestrian implementation of sign, following its specification directly. num sign(num value) { if (value is int) { if (value < 0) return -1; if (value > 0) return 1; return 0; } if (value.isNaN) return value; if (value == 0.0) return value; if (value > 0.0) return 1.0; return -1.0; } var numbers = [ // Integers 0, 1, 2, 0x7f, // ~7 bits 0x80, 0xff, // ~8 bits 0x100, 0xffff, // ~16 bits 0x10000, 0x3fffffff, // ~30 bits (max positive 32-bit tagged smi) 0x40000000, 0x40000001, 0x7fffffff, // ~31 bits 0x80000000, 0x80000001, 0xfffffffff, // ~32 bits 0x100000000, 0x100000001, 0x10000000000000, // ~53 bits 0x10000000000001, 0x1fffffffffffff, 0x20000000000000, // Use arithmetic to construct values below since they are not valid 'web // integers'. On platforms that use doubles to represent integers, there will // be some rounding in the arithmetic, testing a nearby value instead. 0x20000000000000 + 1, // first integer not representable as double. 0x20000000000000 + 2, 0x7ffffffffffff000 + 0xfff, // ~63 bits 0x8000000000000000, 0x8000000000000000 + 1, 0xfffffffffffff000 + 0xfff, // ~64 bits // Doubles. 0.0, 5e-324, // min positive 2.225073858507201e-308, // max denormal 2.2250738585072014e-308, // min normal 0.49999999999999994, // ~0.5 0.5, 0.5000000000000001, 0.9999999999999999, // ~1.0 1.0, 1.0000000000000002, 4294967295.0, // ~32 bits 4294967296.0, 4503599627370495.5, // max fractional 4503599627370497.0, 9007199254740991.0, 9007199254740992.0, // max exact (+1 is not a double) 1.7976931348623157e+308, // max finite double 1.0 / 0.0, // Infinity 0.0 / 0.0, // NaN ]; main() { for (num number in numbers) { test(number); test(-number); } } void test(number) { num expectSign = sign(number); num actualSign = number.sign; if (expectSign.isNaN) { Expect.isTrue(actualSign.isNaN, "$number: $actualSign != NaN"); } else { if (number is int) { Expect.isTrue(actualSign is int, "$number.sign is int"); } else { Expect.isTrue(actualSign is double, "$number.sign is double"); } Expect.equals(expectSign, actualSign, "$number"); Expect.equals(number.isNegative, actualSign.isNegative, "$number:negative"); var renumber = actualSign * number.abs(); Expect.equals(number, renumber, "$number (sign*abs)"); if (number is int) { Expect.isTrue(renumber is int, "$number (sign*abs) is int"); } else { Expect.isTrue(renumber is double, "$number (sign*abs) is double"); } } }