package com.oracle.truffle.js.test.builtins;
import static com.oracle.truffle.js.lang.JavaScriptLanguage.ID;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import org.graalvm.polyglot.Context;
import org.graalvm.polyglot.Value;
import org.junit.Test;
import com.oracle.truffle.js.runtime.JSRuntime;
import com.oracle.truffle.js.test.JSTest;
public class ParseIntTest {
@Test
public void testJSONParseNumber() {
try (Context context = JSTest.newContextBuilder().build()) {
Value result;
result = context.eval(ID, "parseInt('-0')");
assertTrue(result.fitsInDouble());
assertEquals(Double.valueOf(-0.0), Double.valueOf(result.asDouble()));
result = context.eval(ID, "parseInt(new String('-0'))");
assertTrue(result.fitsInDouble());
assertEquals(Double.valueOf(-0.0), Double.valueOf(result.asDouble()));
}
}
@Test
public void testSpecializations() {
try (Context context = JSTest.newContextBuilder().build()) {
Value result;
result = context.eval(ID, "parseInt('12345', 10)");
assertTrue(result.fitsInInt());
assertEquals(12345, result.asInt());
result = context.eval(ID, "parseInt('3', 10)");
assertTrue(result.fitsInInt());
assertEquals(3, result.asInt());
result = context.eval(ID, "parseInt('\t 12345 \t', 10)");
assertTrue(result.fitsInInt());
assertEquals(12345, result.asInt());
result = context.eval(ID, "parseInt('12345', 9)");
assertTrue(result.fitsInInt());
assertEquals(8303, result.asInt());
result = context.eval(ID, "parseInt('\t 12345 \t', 9)");
assertTrue(result.fitsInInt());
assertEquals(8303, result.asInt());
result = context.eval(ID, "parseInt('\t -0xABCDEF \t', 16)");
assertTrue(result.fitsInInt());
assertEquals(-11259375, result.asInt());
result = context.eval(ID, "parseInt('\t 3 \t', 16)");
assertTrue(result.fitsInInt());
assertEquals(3, result.asInt());
result = context.eval(ID, "parseInt(' 0xA ', 16)");
assertTrue(result.fitsInInt());
assertEquals(10, result.asInt());
}
}
@Test
public void testInvalid() {
try (Context context = JSTest.newContextBuilder().build()) {
Value result;
result = context.eval(ID, "parseInt('', 10)");
assertTrue(result.fitsInDouble());
assertTrue(Double.isNaN(result.asDouble()));
result = context.eval(ID, "parseInt('0x ', 16)");
assertTrue(result.fitsInDouble());
assertTrue(Double.isNaN(result.asDouble()));
result = context.eval(ID, "parseInt(' 1234--- ', 10)");
assertTrue(result.fitsInInt());
assertEquals(1234, result.asInt());
}
}
@Test
public void testLongs() {
try (Context context = JSTest.newContextBuilder().build()) {
assertEquals(-1234567890L, parseInt("-1234567890", 10, context).asLong());
assertEquals(1234567890L, parseInt("+1234567890", 10, context).asLong());
assertEquals(1234567890L, parseInt("1234567890", 10, context).asLong());
assertEquals(162254319L, parseInt("9abcdef", 16, context).asLong());
assertEquals(9223372036854778000d, parseInt("1104332401304422434310342411", 5, context).asDouble(), 0.000001);
}
}
@Test
public void testNegativeZero() {
try (Context context = JSTest.newContextBuilder().build()) {
assertTrue(JSRuntime.isNegativeZero(parseInt("-0.000001", 10, context).asDouble()));
assertTrue(JSRuntime.isNegativeZero(parseInt("-0.0000000000000001", 10, context).asDouble()));
assertTrue(JSRuntime.isNegativeZero(parseInt("-0", 10, context).asDouble()));
assertTrue(JSRuntime.isNegativeZero(parseInt("-000000000000000000", 16, context).asDouble()));
}
}
private static Value parseInt(String string, int radix, Context context) {
return context.eval(ID, "parseInt('" + string + "', " + radix + ");");
}
@Test
public void testGR25478() {
try (Context context = JSTest.newContextBuilder().build()) {
Value result = context.eval(ID, "parseInt('18446462598732840000\" at LowLevelInterpreter.asm:194', 10)");
assertTrue(result.fitsInDouble());
assertEquals(18446462598732840000d, result.asDouble(), 0.000001);
result = context.eval(ID, "parseInt('-10000000000000', 10)");
assertTrue(result.fitsInDouble());
assertEquals(-10000000000000d, result.asDouble(), 0.000001);
}
}
}