scope {
//print(0.INT_MIN, 0.INT_MAX);
assert 0.INT_MIN < 0;
assert 0.INT_MAX > 0;
var i = 0;
assert 'integer' === typename i;
assert 0 === i.compare(0);
assert i.compare(1) < 0;
assert i.compare(-1) > 0;
assert 0.0 === i.toDouble();
assert 0 !== i.toDouble();
assert "0" === i.toJSONString();
assert "0" === i.toString();
assert "1" === 1.toString();
i = 42;
assert '*' === i.toUtf8Char();
}
scope {
var d = 0.0;
assert 'double' === typename d;
assert 0 === d.compare(0);
assert d.compare(1) < 0;
assert d.compare(-1) > 0;
assert 0 === d.toInt();
assert 0.0 !== d.toInt();
assert "0.0" === d.toJSONString();
assert "0.0" === d.toString();
assert "1.0" === 1.0.toString();
assert 1 === 0.5.ceil();
assert 0 === (-0.5).ceil(); // parens needed: dot has higher precedence than unary -.
//assert 0 === 0.ceil(); // INTEGER 0 doesn't have ceil()
assert 0 === 0.0.ceil();
}
scope {
1.0.prototype.twice = proc(){ return this * 2 };
assert 6.2 === 3.1.twice();
assert 8.0 === (2.0*2).twice();
//unset 0.0.prototype.twice; // unset doesn't like this, so...
var d = 0.0;
unset d.prototype.twice, d;
}
scope {
const pi = 0.parseInt, pf = 0.parseDouble, pn = 0.parseNumber;
assert 1 === pi(1);
assert 1 === pi('1');
assert 1 === pi('1.0');
assert -1 === pi('-1');
assert -1 === pi('-1.2');
assert undefined === pi('1-1');
assert 1.0 === pf(1);
assert 1.0 === pf('1');
assert 1.0 === pf(true);
assert 0.0 === pf(false);
assert 0.0 === pf('-0');
assert 1 === pn(1);
assert 1 === pn('1');
assert 1.0 === pn(1.0);
assert 1.0 === pn('1.0');
assert 0 === pn('-0');
assert 0.0 === pn(' + 0.0');
assert 56 === pn('0o70');
assert -1 === pn('-0o1');
assert -1 === pn('-0x0001');
assert undefined === pn('-0x0001.');
assert undefined === pn(pn);
assert pf('1') === pn('1.0');
assert 'double' === typename pn("1.3") /* parseNumber() keeps the numeric type */;
assert 'integer' === typename pn("1") /* parseNumber() keeps the numeric type */;
assert 'integer' === typename pi("1.3") /* parseInt() reduces to an integer */;
}