| <!DOCTYPE html> |
| <script src="../../resources/js-test-pre.js"></script> |
| <script> |
| description("Exercise WebIDL type conversions."); |
| |
| quiet = true; |
| evalAndLog("converter = window.internals.typeConversions()"); |
| debug(""); |
| |
| function verifyAttribute(attribute) |
| { |
| shouldBeTrue("'" + attribute + "' in converter", quiet); |
| shouldBeTrue("typeof converter." + attribute + " === 'number'", quiet); |
| evalAndLog("converter." + attribute + " = 123", quiet); |
| shouldBe("converter." + attribute, "123", quiet); |
| evalAndLog("converter." + attribute + " = 0", quiet); |
| shouldBe("converter." + attribute, "0", quiet); |
| } |
| |
| function convert(attribute, value, expected) |
| { |
| if (arguments.length < 3) { |
| expected = value; |
| } |
| evalAndLog("converter." + attribute + " = " + value); |
| shouldBe("converter." + attribute, expected); |
| } |
| |
| function convertThrows(attribute, value) |
| { |
| shouldThrow("converter." + attribute + " = " + value); |
| } |
| |
| function testNonNumericToNumeric(attribute) |
| { |
| convert(attribute, "false", "0"); |
| convert(attribute, "true", "1"); |
| convert(attribute, "''", "0"); |
| convert(attribute, "'1'", "1"); |
| convert(attribute, "'abc'", "0"); |
| convert(attribute, "null", "0"); |
| convert(attribute, "undefined", "0"); |
| } |
| |
| function testNonNumericToNumericEnforceRange(attribute) |
| { |
| convert(attribute, "false", "0"); |
| convert(attribute, "true", "1"); |
| convert(attribute, "''", "0"); |
| convert(attribute, "'1'", "1"); |
| convertThrows(attribute, "'abc'"); |
| convert(attribute, "null", "0"); |
| convertThrows(attribute, "undefined"); |
| } |
| // |
| type = "testLong"; |
| verifyAttribute(type); |
| convert(type, "0"); |
| convert(type, "-0", "0"); |
| convert(type, "-1"); |
| convert(type, "1"); |
| convert(type, "0x7F"); |
| convert(type, "0x80"); |
| convert(type, "0xFF"); |
| convert(type, "-0x80"); |
| convert(type, "-0x81"); |
| convert(type, "0x7FFF"); |
| convert(type, "0x8000"); |
| convert(type, "0xFFFF"); |
| convert(type, "-0x8000"); |
| convert(type, "-0x8001"); |
| convert(type, "0x7FFFFFFF"); |
| convert(type, "0x80000000", "-0x80000000"); |
| convert(type, "0xFFFFFFFF", "-1"); |
| convert(type, "-0x80000000"); |
| convert(type, "-0x80000001", "0x7FFFFFFF"); |
| convert(type, "0xDCBA9876543210", "0x76543210"); |
| convert(type, "Number.MAX_VALUE", "0"); |
| convert(type, "Number.MIN_VALUE", "0"); |
| convert(type, "-Number.MAX_VALUE", "0"); |
| convert(type, "-Number.MIN_VALUE", "0"); |
| convert(type, "1.99", "1"); |
| convert(type, "-1.99", "-1"); |
| convert(type, "Infinity", "0"); |
| convert(type, "-Infinity", "0"); |
| convert(type, "NaN", "0"); |
| testNonNumericToNumeric(type); |
| convertThrows(type, "{valueOf:function(){throw new Error('custom');}}"); |
| debug(""); |
| |
| type = "testEnforceRangeLong"; |
| verifyAttribute(type); |
| convert(type, "0"); |
| convert(type, "-0", "0"); |
| convert(type, "-1"); |
| convert(type, "1"); |
| convert(type, "0x7F"); |
| convert(type, "0x80"); |
| convert(type, "0xFF"); |
| convert(type, "-0x80"); |
| convert(type, "-0x81"); |
| convert(type, "0x7FFF"); |
| convert(type, "0x8000"); |
| convert(type, "0xFFFF"); |
| convert(type, "-0x8000"); |
| convert(type, "-0x8001"); |
| convert(type, "0x7FFFFFFF"); |
| convertThrows(type, "0x80000000"); |
| convertThrows(type, "0xFFFFFFFF"); |
| convert(type, "-0x80000000"); |
| convertThrows(type, "-0x80000001"); |
| convertThrows(type, "0xDCBA9876543210"); |
| convertThrows(type, "Number.MAX_VALUE"); |
| convert(type, "Number.MIN_VALUE", "0"); |
| convertThrows(type, "-Number.MAX_VALUE"); |
| convert(type, "-Number.MIN_VALUE", "0"); |
| convert(type, "1.99", "1"); |
| convert(type, "-1.99", "-1"); |
| convertThrows(type, "Infinity"); |
| convertThrows(type, "-Infinity"); |
| convertThrows(type, "NaN"); |
| testNonNumericToNumericEnforceRange(type); |
| convertThrows(type, "{valueOf:function(){throw new Error('custom');}}"); |
| debug(""); |
| |
| type = "testUnsignedLong"; |
| verifyAttribute(type); |
| convert(type, "0"); |
| convert(type, "-0", "0"); |
| convert(type, "-1", "0xFFFFFFFF"); |
| convert(type, "1"); |
| convert(type, "0x7F"); |
| convert(type, "0x80"); |
| convert(type, "0xFF"); |
| convert(type, "-0x80", "0xFFFFFF80"); |
| convert(type, "-0x81", "0xFFFFFF7F"); |
| convert(type, "0x7FFF"); |
| convert(type, "0x8000"); |
| convert(type, "0xFFFF"); |
| convert(type, "-0x8000", "0xFFFF8000"); |
| convert(type, "-0x8001", "0xFFFF7FFF"); |
| convert(type, "0x7FFFFFFF"); |
| convert(type, "0x80000000"); |
| convert(type, "0xFFFFFFFF"); |
| convert(type, "-0x80000000", "0x80000000"); |
| convert(type, "-0x80000001", "0x7FFFFFFF"); |
| convert(type, "0xDCBA9876543210", "0x76543210"); |
| convert(type, "Number.MAX_VALUE", "0"); |
| convert(type, "Number.MIN_VALUE", "0"); |
| convert(type, "-Number.MAX_VALUE", "0"); |
| convert(type, "-Number.MIN_VALUE", "0"); |
| convert(type, "1.99", "1"); |
| convert(type, "-1.99", "0xFFFFFFFF"); |
| convert(type, "Infinity", "0"); |
| convert(type, "-Infinity", "0"); |
| convert(type, "NaN", "0"); |
| testNonNumericToNumeric(type); |
| convertThrows(type, "{valueOf:function(){throw new Error('custom');}}"); |
| debug(""); |
| |
| type = "testEnforceRangeUnsignedLong"; |
| verifyAttribute(type); |
| convert(type, "0"); |
| convert(type, "-0", "0"); |
| convertThrows(type, "-1"); |
| convert(type, "1"); |
| convert(type, "0x7F"); |
| convert(type, "0x80"); |
| convert(type, "0xFF"); |
| convertThrows(type, "-0x80"); |
| convertThrows(type, "-0x81"); |
| convert(type, "0x7FFF"); |
| convert(type, "0x8000"); |
| convert(type, "0xFFFF"); |
| convertThrows(type, "-0x8000"); |
| convertThrows(type, "-0x8001"); |
| convert(type, "0x7FFFFFFF"); |
| convert(type, "0x80000000"); |
| convert(type, "0xFFFFFFFF"); |
| convertThrows(type, "-0x80000000"); |
| convertThrows(type, "-0x80000001"); |
| convertThrows(type, "0xDCBA9876543210"); |
| convertThrows(type, "Number.MAX_VALUE"); |
| convert(type, "Number.MIN_VALUE", "0"); |
| convertThrows(type, "-Number.MAX_VALUE"); |
| convert(type, "-Number.MIN_VALUE", "0"); |
| convert(type, "1.99", "1"); |
| convertThrows(type, "-1.99"); |
| convertThrows(type, "Infinity"); |
| convertThrows(type, "-Infinity"); |
| convertThrows(type, "NaN"); |
| testNonNumericToNumericEnforceRange(type); |
| convertThrows(type, "{valueOf:function(){throw new Error('custom');}}"); |
| debug(""); |
| |
| type = "testLongLong"; |
| verifyAttribute(type); |
| convert(type, "0"); |
| convert(type, "-0", "0"); |
| convert(type, "-1"); |
| convert(type, "1"); |
| convert(type, "0x7F"); |
| convert(type, "0x80"); |
| convert(type, "0xFF"); |
| convert(type, "-0x80"); |
| convert(type, "-0x81"); |
| convert(type, "0x7FFF"); |
| convert(type, "0x8000"); |
| convert(type, "0xFFFF"); |
| convert(type, "-0x8000"); |
| convert(type, "-0x8001"); |
| convert(type, "0x7FFFFFFF"); |
| convert(type, "0x80000000"); |
| convert(type, "0xFFFFFFFF"); |
| convert(type, "-0x80000000"); |
| convert(type, "-0x80000001"); |
| convert(type, "0xDCBA9876543210"); |
| convert(type, "Number.MIN_VALUE", "0"); |
| convert(type, "-Number.MIN_VALUE", "0"); |
| convert(type, "Number.MAX_VALUE", "0"); |
| convert(type, "-Number.MAX_VALUE", "0"); |
| convert(type, "1.99", "1"); |
| convert(type, "-1.99", "-1"); |
| convert(type, "Infinity", "0"); |
| convert(type, "-Infinity", "0"); |
| convert(type, "NaN", "0"); |
| testNonNumericToNumeric(type); |
| convertThrows(type, "{valueOf:function(){throw new Error('custom');}}"); |
| debug(""); |
| |
| type = "testEnforceRangeLongLong"; |
| verifyAttribute(type); |
| convert(type, "0"); |
| convert(type, "-0", "0"); |
| convert(type, "-1"); |
| convert(type, "1"); |
| convert(type, "0x7F"); |
| convert(type, "0x80"); |
| convert(type, "0xFF"); |
| convert(type, "-0x80"); |
| convert(type, "-0x81"); |
| convert(type, "0x7FFF"); |
| convert(type, "0x8000"); |
| convert(type, "0xFFFF"); |
| convert(type, "-0x8000"); |
| convert(type, "-0x8001"); |
| convert(type, "0x7FFFFFFF"); |
| convert(type, "0x80000000"); |
| convert(type, "0xFFFFFFFF"); |
| convert(type, "-0x80000000"); |
| convert(type, "-0x80000001"); |
| convertThrows(type, "0xDCBA9876543210"); |
| convert(type, "Number.MIN_VALUE", "0"); |
| convert(type, "-Number.MIN_VALUE", "0"); |
| convertThrows(type, "Number.MAX_VALUE"); |
| convertThrows(type, "-Number.MAX_VALUE"); |
| convert(type, "1.99", "1"); |
| convert(type, "-1.99", "-1"); |
| convertThrows(type, "Infinity"); |
| convertThrows(type, "-Infinity"); |
| convertThrows(type, "NaN", "0"); |
| testNonNumericToNumericEnforceRange(type); |
| convertThrows(type, "{valueOf:function(){throw new Error('custom');}}"); |
| debug(""); |
| |
| type = "testUnsignedLongLong"; |
| verifyAttribute(type); |
| convert(type, "0"); |
| convert(type, "-0", "0"); |
| convert(type, "-1", "0xFFFFFFFFFFFFFFFF"); |
| convert(type, "1"); |
| convert(type, "0x7F"); |
| convert(type, "0x80"); |
| convert(type, "0xFF"); |
| convert(type, "-0x80", "0xFFFFFFFFFFFFFF80"); |
| convert(type, "-0x81", "0xFFFFFFFFFFFFFF7F"); |
| convert(type, "0x7FFF"); |
| convert(type, "0x8000"); |
| convert(type, "0xFFFF"); |
| convert(type, "-0x8000", "0xFFFFFFFFFFFF8000"); |
| convert(type, "-0x8001", "0xFFFFFFFFFFFF7FFF"); |
| convert(type, "0x7FFFFFFF"); |
| convert(type, "0x80000000"); |
| convert(type, "0xFFFFFFFF"); |
| convert(type, "-0x80000000", "0xFFFFFFFF80000000"); |
| convert(type, "-0x80000001", "0xFFFFFFFF7FFFFFFF"); |
| convert(type, "0xDCBA9876543210"); |
| convert(type, "Number.MIN_VALUE", "0"); |
| convert(type, "-Number.MIN_VALUE", "0"); |
| convert(type, "Number.MAX_VALUE", "0"); |
| convert(type, "-Number.MAX_VALUE", "0"); |
| convert(type, "1.99", "1"); |
| convert(type, "-1.99", "0xFFFFFFFFFFFFFFFF"); |
| convert(type, "Infinity", "0"); |
| convert(type, "-Infinity", "0"); |
| convert(type, "NaN", "0"); |
| testNonNumericToNumeric(type); |
| convertThrows(type, "{valueOf:function(){throw new Error('custom');}}"); |
| debug(""); |
| |
| type = "testEnforceRangeUnsignedLongLong"; |
| verifyAttribute(type); |
| convert(type, "0"); |
| convert(type, "-0", "0"); |
| convertThrows(type, "-1"); |
| convert(type, "1"); |
| convert(type, "0x7F"); |
| convert(type, "0x80"); |
| convert(type, "0xFF"); |
| convertThrows(type, "-0x80"); |
| convertThrows(type, "-0x81"); |
| convert(type, "0x7FFF"); |
| convert(type, "0x8000"); |
| convert(type, "0xFFFF"); |
| convertThrows(type, "-0x8000"); |
| convertThrows(type, "-0x8001"); |
| convert(type, "0x7FFFFFFF"); |
| convert(type, "0x80000000"); |
| convert(type, "0xFFFFFFFF"); |
| convertThrows(type, "-0x80000000"); |
| convertThrows(type, "-0x80000001"); |
| convertThrows(type, "0xDCBA9876543210"); |
| convert(type, "Number.MIN_VALUE", "0"); |
| convert(type, "-Number.MIN_VALUE", "0"); |
| convertThrows(type, "Number.MAX_VALUE"); |
| convertThrows(type, "-Number.MAX_VALUE"); |
| convert(type, "1.99", "1"); |
| convertThrows(type, "-1.99"); |
| convertThrows(type, "Infinity"); |
| convertThrows(type, "-Infinity"); |
| convertThrows(type, "NaN"); |
| testNonNumericToNumericEnforceRange(type); |
| convertThrows(type, "{valueOf:function(){throw new Error('custom');}}"); |
| debug(""); |
| |
| type = "testByte"; |
| verifyAttribute(type); |
| convert(type, "0"); |
| convert(type, "-0", "0"); |
| convert(type, "-1"); |
| convert(type, "1"); |
| convert(type, "0x7F"); |
| convert(type, "0x80", "-0x80"); |
| convert(type, "-0x7F"); |
| convert(type, "-0x80"); |
| convert(type, "-0x81", "0x7F"); |
| convert(type, "Number.MIN_VALUE", "0"); |
| convert(type, "-Number.MIN_VALUE", "0"); |
| convert(type, "Number.MAX_VALUE", "0"); |
| convert(type, "-Number.MAX_VALUE", "0"); |
| convert(type, "1.99", "1"); |
| convert(type, "-1.99", "-1"); |
| convert(type, "Infinity", "0"); |
| convert(type, "-Infinity", "0"); |
| convert(type, "NaN", "0"); |
| testNonNumericToNumeric(type); |
| convertThrows(type, "{valueOf:function(){throw new Error('custom');}}"); |
| debug(""); |
| |
| type = "testEnforceRangeByte"; |
| verifyAttribute(type); |
| convert(type, "0"); |
| convert(type, "-0", "0"); |
| convert(type, "-1"); |
| convert(type, "1"); |
| convert(type, "0x7F"); |
| convertThrows(type, "0x80"); |
| convert(type, "-0x7F"); |
| convert(type, "-0x80"); |
| convertThrows(type, "-0x81"); |
| convert(type, "Number.MIN_VALUE", "0"); |
| convert(type, "-Number.MIN_VALUE", "0"); |
| convertThrows(type, "Number.MAX_VALUE"); |
| convertThrows(type, "-Number.MAX_VALUE"); |
| convert(type, "1.99", "1"); |
| convert(type, "-1.99", "-1"); |
| convertThrows(type, "Infinity"); |
| convertThrows(type, "-Infinity"); |
| convertThrows(type, "NaN"); |
| testNonNumericToNumericEnforceRange(type); |
| convertThrows(type, "{valueOf:function(){throw new Error('custom');}}"); |
| debug(""); |
| |
| type = "testOctet"; |
| verifyAttribute(type); |
| convert(type, "0"); |
| convert(type, "-0", "0"); |
| convert(type, "-1", "0xFF"); |
| convert(type, "1"); |
| convert(type, "0x7F"); |
| convert(type, "0x80"); |
| convert(type, "0xFF"); |
| convert(type, "0x100", "0"); |
| convert(type, "0x101", "1"); |
| convert(type, "-0x80", "0x80"); |
| convert(type, "-0x81", "0x7F"); |
| convert(type, "Number.MAX_VALUE", "0"); |
| convert(type, "Number.MIN_VALUE", "0"); |
| convert(type, "-Number.MAX_VALUE", "0"); |
| convert(type, "-Number.MIN_VALUE", "0"); |
| convert(type, "1.99", "1"); |
| convert(type, "-1.99", "0xFF"); |
| convert(type, "Infinity", "0"); |
| convert(type, "-Infinity", "0"); |
| convert(type, "NaN", "0"); |
| testNonNumericToNumeric(type); |
| convertThrows(type, "{valueOf:function(){throw new Error('custom');}}"); |
| debug(""); |
| |
| type = "testEnforceRangeOctet"; |
| verifyAttribute(type); |
| convert(type, "0"); |
| convert(type, "-0", "0"); |
| convertThrows(type, "-1"); |
| convert(type, "1"); |
| convert(type, "0x7F"); |
| convert(type, "0x80"); |
| convert(type, "0xFF"); |
| convertThrows(type, "0x100"); |
| convertThrows(type, "0x101"); |
| convertThrows(type, "-0x80"); |
| convertThrows(type, "-0x81"); |
| convertThrows(type, "Number.MAX_VALUE"); |
| convert(type, "Number.MIN_VALUE", "0"); |
| convertThrows(type, "-Number.MAX_VALUE"); |
| convert(type, "-Number.MIN_VALUE", "0"); |
| convert(type, "1.99", "1"); |
| convertThrows(type, "-1.99"); |
| convertThrows(type, "Infinity"); |
| convertThrows(type, "-Infinity"); |
| convertThrows(type, "NaN"); |
| testNonNumericToNumericEnforceRange(type); |
| convertThrows(type, "{valueOf:function(){throw new Error('custom');}}"); |
| debug(""); |
| |
| type = "testShort"; |
| verifyAttribute(type); |
| convert(type, "0"); |
| convert(type, "-0", "0"); |
| convert(type, "-1"); |
| convert(type, "1"); |
| convert(type, "0x7F"); |
| convert(type, "0x80"); |
| convert(type, "0xFF"); |
| convert(type, "-0x80"); |
| convert(type, "-0x81"); |
| convert(type, "0x7FFF"); |
| convert(type, "0x8000", "-0x8000"); |
| convert(type, "0xFFFF", "-1"); |
| convert(type, "-0x8000"); |
| convert(type, "-0x8001", "0x7FFF"); |
| convert(type, "0xDCBA9876543210", "0x3210"); |
| convert(type, "Number.MAX_VALUE", "0"); |
| convert(type, "Number.MIN_VALUE", "0"); |
| convert(type, "-Number.MAX_VALUE", "0"); |
| convert(type, "-Number.MIN_VALUE", "0"); |
| convert(type, "1.99", "1"); |
| convert(type, "-1.99", "-1"); |
| convert(type, "Infinity", "0"); |
| convert(type, "-Infinity", "0"); |
| convert(type, "NaN", "0"); |
| testNonNumericToNumeric(type); |
| convertThrows(type, "{valueOf:function(){throw new Error('custom');}}"); |
| debug(""); |
| |
| type = "testEnforceRangeShort"; |
| verifyAttribute(type); |
| convert(type, "0"); |
| convert(type, "-0", "0"); |
| convert(type, "-1"); |
| convert(type, "1"); |
| convert(type, "0x7F"); |
| convert(type, "0x80"); |
| convert(type, "0xFF"); |
| convert(type, "-0x80"); |
| convert(type, "-0x81"); |
| convert(type, "0x7FFF"); |
| convertThrows(type, "0x8000"); |
| convertThrows(type, "0xFFFF"); |
| convert(type, "-0x8000"); |
| convertThrows(type, "-0x8001"); |
| convertThrows(type, "0xDCBA9876543210"); |
| convertThrows(type, "Number.MAX_VALUE"); |
| convert(type, "Number.MIN_VALUE", "0"); |
| convertThrows(type, "-Number.MAX_VALUE"); |
| convert(type, "-Number.MIN_VALUE", "0"); |
| convert(type, "1.99", "1"); |
| convert(type, "-1.99", "-1"); |
| convertThrows(type, "Infinity"); |
| convertThrows(type, "-Infinity"); |
| convertThrows(type, "NaN"); |
| testNonNumericToNumericEnforceRange(type); |
| convertThrows(type, "{valueOf:function(){throw new Error('custom');}}"); |
| debug(""); |
| |
| type = "testUnsignedShort"; |
| verifyAttribute(type); |
| convert(type, "0"); |
| convert(type, "-0", "0"); |
| convert(type, "-1", "0xFFFF"); |
| convert(type, "1"); |
| convert(type, "0x7F"); |
| convert(type, "0x80"); |
| convert(type, "0xFF"); |
| convert(type, "-0x80", "0xFF80"); |
| convert(type, "-0x81", "0xFF7F"); |
| convert(type, "0x7FFF"); |
| convert(type, "0x8000"); |
| convert(type, "0xFFFF"); |
| convert(type, "0x10000", "0"); |
| convert(type, "-0x8000", "0x8000"); |
| convert(type, "-0x8001", "0x7FFF"); |
| convert(type, "0xDCBA9876543210", "0x3210"); |
| convert(type, "Number.MAX_VALUE", "0"); |
| convert(type, "Number.MIN_VALUE", "0"); |
| convert(type, "-Number.MAX_VALUE", "0"); |
| convert(type, "-Number.MIN_VALUE", "0"); |
| convert(type, "1.99", "1"); |
| convert(type, "-1.99", "0xFFFF"); |
| convert(type, "Infinity", "0"); |
| convert(type, "-Infinity", "0"); |
| convert(type, "NaN", "0"); |
| testNonNumericToNumeric(type); |
| convertThrows(type, "{valueOf:function(){throw new Error('custom');}}"); |
| debug(""); |
| |
| type = "testEnforceRangeUnsignedShort"; |
| verifyAttribute(type); |
| convert(type, "0"); |
| convert(type, "-0", "0"); |
| convertThrows(type, "-1"); |
| convert(type, "1"); |
| convert(type, "0x7F"); |
| convert(type, "0x80"); |
| convert(type, "0xFF"); |
| convertThrows(type, "-0x80"); |
| convertThrows(type, "-0x81"); |
| convert(type, "0x7FFF"); |
| convert(type, "0x8000"); |
| convert(type, "0xFFFF"); |
| convertThrows(type, "0x10000"); |
| convertThrows(type, "-0x8000"); |
| convertThrows(type, "-0x8001"); |
| convert(type, "0x3210"); |
| convertThrows(type, "Number.MAX_VALUE"); |
| convert(type, "Number.MIN_VALUE", "0"); |
| convertThrows(type, "-Number.MAX_VALUE"); |
| convert(type, "-Number.MIN_VALUE", "0"); |
| convert(type, "1.99", "1"); |
| convertThrows(type, "-1.99"); |
| convertThrows(type, "Infinity"); |
| convertThrows(type, "-Infinity"); |
| convertThrows(type, "NaN"); |
| testNonNumericToNumericEnforceRange(type); |
| convertThrows(type, "{valueOf:function(){throw new Error('custom');}}"); |
| debug(""); |
| |
| evalAndLog("converter.testUSVString = '!@#123ABCabc\\x00\\x80\\xFF\\r\\n\\t'"); |
| evalAndLog("converter.testString = '!@#123ABCabc\\x00\\x80\\xFF\\r\\n\\t'"); |
| shouldBeEqualToString("converter.testUSVString", "!@#123ABCabc\x00\x80\xFF\r\n\t"); |
| shouldBeEqualToString("converter.testString", "!@#123ABCabc\x00\x80\xFF\r\n\t"); |
| evalAndLog("converter.testUSVString = '\\u0100'"); |
| evalAndLog("converter.testString = '\\u0100'") |
| shouldBeEqualToString("converter.testUSVString", "\u0100"); |
| shouldBeEqualToString("converter.testString", "\u0100"); |
| shouldThrow("converter.testUSVString = {toString: function() { throw Error(); }}"); |
| shouldThrow("converter.testString = {toString: function() { throw Error(); }}"); |
| shouldBeEqualToString("converter.testUSVString", "\u0100"); |
| shouldBeEqualToString("converter.testString", "\u0100"); |
| [{input: "\uD800", expected: "\uFFFD"}, |
| {input: "\uDC00", expected: "\uFFFD"}, |
| {input: "\uD800\u0000", expected: "\uFFFD\u0000"}, |
| {input: "\uDC00\u0000", expected: "\uFFFD\u0000"}, |
| {input: "\uDC00\uD800", expected: "\uFFFD\uFFFD"}, |
| {input: "\uD834\uDD1E", expected: "\uD834\uDD1E"}, |
| ].forEach(function(test) { |
| evalAndLog("converter.testUSVString = " + JSON.stringify(test.input)); |
| evalAndLog("converter.testString = " + JSON.stringify(test.input)); |
| shouldBeEqualToString("converter.testUSVString", test.expected); |
| shouldBeEqualToString("converter.testString", test.input); |
| }); |
| |
| evalAndLog("converter.testByteString = '!@#123ABCabc\\x00\\x80\\xFF\\r\\n\\t'"); |
| shouldBeEqualToString("converter.testByteString", "!@#123ABCabc\x00\x80\xFF\r\n\t"); |
| evalAndLog("converter.testByteString = '\\u00FF'"); |
| shouldBeEqualToString("converter.testByteString", "\u00FF"); |
| shouldThrow("converter.testByteString = '\\u0100'"); |
| shouldBeEqualToString("converter.testByteString", "\u00FF"); |
| shouldThrow("converter.testByteString = {toString: function() { throw Error(); }}"); |
| shouldBeEqualToString("converter.testByteString", "\u00FF"); |
| |
| ["true", "123", "null", "undefined"].forEach(function(value) { |
| evalAndLog("converter.testUSVString = " + value); |
| evalAndLog("converter.testString = " + value); |
| evalAndLog("converter.testByteString = " + value); |
| shouldBeEqualToString("converter.testUSVString", value); |
| shouldBeEqualToString("converter.testString", value); |
| shouldBeEqualToString("converter.testByteString", value); |
| }); |
| |
| debug(""); |
| debug("Testing union conversion") |
| evalAndLog("converter.testUnion = 'hello'"); |
| shouldBe("converter.testUnion", "'hello'"); |
| shouldBe("typeof converter.testUnion", "'string'"); |
| evalAndLog("converter.testUnion = 1"); |
| shouldBe("converter.testUnion", "1"); |
| shouldBe("typeof converter.testUnion", "'number'"); |
| evalAndLog("converter.testUnion = false"); |
| shouldBe("converter.testUnion", "false"); |
| shouldBe("typeof converter.testUnion", "'boolean'"); |
| evalAndLog("converter.testUnion = document"); |
| shouldBe("converter.testUnion", "document"); |
| shouldBe("typeof converter.testUnion", "'object'"); |
| shouldBeType("converter.testUnion", "Document"); |
| evalAndLog("converter.testUnion = [1, 2]"); |
| shouldBe("converter.testUnion", "[1, 2]"); |
| shouldBe("typeof converter.testUnion", "'object'"); |
| shouldBeType("converter.testUnion", "Array"); |
| evalAndLog("converter.testUnion = null"); |
| shouldBe("converter.testUnion", "'null'"); |
| shouldBe("typeof converter.testUnion", "'string'"); |
| evalAndLog("converter.testUnion = undefined"); |
| shouldBe("converter.testUnion", "'undefined'"); |
| shouldBe("typeof converter.testUnion", "'string'"); |
| evalAndLog("converter.testUnion = window"); |
| shouldBe("typeof converter.testUnion", "'string'"); |
| shouldBe("converter.testUnion", "'[object Window]'"); |
| evalAndLog("converter.testUnion = { }"); |
| shouldBe("typeof converter.testUnion", "'string'"); |
| shouldBe("converter.testUnion", "'[object Object]'"); |
| shouldThrow("converter.testUnion = { toString: function() { throw Error(); } }"); |
| |
| evalAndLog("converter.testDictionary = { longValue: 1 }"); |
| shouldBe("converter.testDictionary.longValue", "1"); |
| evalAndLog("converter.testDictionary = { stringValue: 'hello' }"); |
| shouldBe("converter.testDictionary.stringValue", "'hello'"); |
| evalAndLog("converter.testDictionary = { sequenceValue: ['hi', 'there'] }"); |
| shouldBe("converter.testDictionary.sequenceValue", "['hi', 'there']"); |
| |
| evalAndLog("converter.testDictionary = { unionValue: document }"); |
| shouldBeType("converter.testDictionary.unionValue", "Document"); |
| shouldBe("converter.testDictionary.unionValue", "document"); |
| evalAndLog("converter.testDictionary = { unionValue: ['a', 'sequence'] }"); |
| shouldBeType("converter.testDictionary.unionValue", "Array"); |
| shouldBe("converter.testDictionary.unionValue", "['a', 'sequence']"); |
| evalAndLog("converter.testDictionary = { unionValue: { longValue: 1 } }"); |
| shouldBeType("converter.testDictionary.unionValue", "Object"); |
| shouldBe("converter.testDictionary.unionValue.longValue", "1"); |
| evalAndLog("converter.testDictionary = { unionValue: null }"); |
| shouldBeType("converter.testDictionary.unionValue", "Object"); |
| shouldBe("converter.testDictionary.unionValue.longValue", "0"); |
| evalAndLog("converter.testDictionary = { unionValue: undefined }"); |
| shouldBeType("converter.testDictionary.unionValue", "Object"); |
| shouldBe("converter.testDictionary.unionValue.longValue", "0"); |
| evalAndLog("converter.testDictionary = { }"); |
| shouldBeType("converter.testDictionary.unionValue", "Object"); |
| shouldBe("converter.testDictionary.unionValue.longValue", "0"); |
| |
| evalAndLog("converter.testDictionary = { stringValue: null }"); |
| shouldBe("converter.testDictionary.stringValue", "'null'"); |
| evalAndLog("converter.testDictionary = { treatNullAsEmptyStringValue: null }"); |
| shouldBe("converter.testDictionary.treatNullAsEmptyStringValue", "''"); |
| |
| evalAndLog("converter.testDictionary = { longValue: 0x7FFFFFFF }"); |
| shouldBe("converter.testDictionary.longValue", "0x7FFFFFFF"); |
| evalAndLog("converter.testDictionary = { longValue: 0x80000000 }"); |
| shouldBe("converter.testDictionary.longValue", "-0x80000000"); |
| |
| evalAndLog("converter.testDictionary = { enforceRangeLongValue: 0x7FFFFFFF }"); |
| shouldBe("converter.testDictionary.enforceRangeLongValue", "0x7FFFFFFF"); |
| shouldThrow("converter.testDictionary = { enforceRangeLongValue: 0x80000000 }"); |
| |
| evalAndLog("converter.testDictionary = { clampLongValue: 0x7FFFFFFF }"); |
| shouldBe("converter.testDictionary.clampLongValue", "0x7FFFFFFF"); |
| evalAndLog("converter.testDictionary = { clampLongValue: 0x80000000 }"); |
| shouldBe("converter.testDictionary.clampLongValue", "0x7FFFFFFF"); |
| |
| |
| debug(""); |
| debug("Testing record conversion") |
| |
| // testLongRecord is a record<DOMString, long> attribute |
| // testNodeRecord is a record<USVString, Node> attribute |
| // testSequenceRecord is a record<ByteString, sequence<DOMString>> attribute |
| |
| evalAndLog("converter.setTestLongRecord({ key: 1, key2: 2 })"); |
| shouldBeType("converter.testLongRecord()", "Object"); |
| shouldBeTrue("converter.testLongRecord().hasOwnProperty('key')"); |
| shouldBeTrue("'key' in converter.testLongRecord()"); |
| shouldBe("converter.testLongRecord()['key']", "1"); |
| shouldBeTrue("converter.testLongRecord().hasOwnProperty('key2')"); |
| shouldBeTrue("'key2' in converter.testLongRecord()"); |
| shouldBe("converter.testLongRecord()['key2']", "2"); |
| evalAndLog("converter.setTestLongRecord(undefined)"); |
| shouldBeType("converter.testLongRecord()", "Object"); |
| evalAndLog("converter.setTestLongRecord(null)"); |
| shouldBeType("converter.testLongRecord()", "Object"); |
| shouldThrow("converter.setTestLongRecord(1)"); |
| shouldThrow("converter.setTestLongRecord({ key: { valueOf:function() { throw new Error(); } } })"); |
| evalAndLog("var o = { otherKey: 2 }; Object.defineProperty(o, 'key', { enumerable: false, value: 1 }); converter.setTestLongRecord(o);"); |
| shouldBeFalse("converter.testLongRecord().hasOwnProperty('key')"); |
| shouldBeTrue("converter.testLongRecord().hasOwnProperty('otherKey')"); |
| shouldBe("converter.testLongRecord()['otherKey']", "2"); |
| evalAndLog("var o = { otherKey: 2 }; Object.defineProperty(o, 'key', { get: function() { return 1; }, enumerable: true }); converter.setTestLongRecord(o);"); |
| shouldBeTrue("converter.testLongRecord().hasOwnProperty('key')"); |
| shouldBe("converter.testLongRecord()['key']", "1"); |
| shouldBeTrue("converter.testLongRecord().hasOwnProperty('otherKey')"); |
| shouldBe("converter.testLongRecord()['otherKey']", "2"); |
| shouldThrow("var o = { otherKey: 2 }; Object.defineProperty(o, 'key', { get: function() { throw new Error(); }, enumerable: true }); converter.setTestLongRecord(o);"); |
| |
| evalAndLog("converter.setTestNodeRecord({ key: document, key2: document.documentElement })"); |
| shouldBeTrue("converter.testNodeRecord().hasOwnProperty('key')"); |
| shouldBeTrue("'key' in converter.testNodeRecord()"); |
| shouldBe("converter.testNodeRecord()['key']", "document"); |
| shouldBeTrue("converter.testNodeRecord().hasOwnProperty('key2')"); |
| shouldBeTrue("'key2' in converter.testNodeRecord()"); |
| shouldBe("converter.testNodeRecord()['key2']", "document.documentElement"); |
| shouldThrow("converter.setTestNodeRecord({ key: 'hello' })"); |
| |
| [{input: "\uD800", expected: "\uFFFD"}, |
| {input: "\uDC00", expected: "\uFFFD"}, |
| {input: "\uD800\u0000", expected: "\uFFFD\u0000"}, |
| {input: "\uDC00\u0000", expected: "\uFFFD\u0000"}, |
| {input: "\uDC00\uD800", expected: "\uFFFD\uFFFD"}, |
| {input: "\uD834\uDD1E", expected: "\uD834\uDD1E"}, |
| ].forEach(function(test) { |
| evalAndLog("converter.setTestLongRecord({'" + test.input + "': 1 })"); |
| shouldBe("converter.testLongRecord()['" + test.input + "']", "1"); |
| evalAndLog("converter.setTestNodeRecord({'" + test.input + "': document })"); |
| shouldBe("converter.testNodeRecord()['" + test.expected + "']", "document"); |
| }); |
| |
| evalAndLog("converter.setTestSequenceRecord({ key: ['value', 'other value'] })"); |
| shouldBeTrue("converter.testSequenceRecord().hasOwnProperty('key')"); |
| shouldBeTrue("'key' in converter.testSequenceRecord()"); |
| shouldBe("converter.testSequenceRecord()['key']", "['value', 'other value']"); |
| shouldThrow("converter.setTestSequenceRecord({ '\u0100': ['value'] })"); |
| evalAndLog("converter.setTestSequenceRecord({ '\u00FF': ['value'] })"); |
| shouldBe("converter.testSequenceRecord()['\u00FF']", "['value']"); |
| |
| shouldBe("converter.testImpureNaNUnrestrictedDouble", "NaN"); |
| shouldBe("converter.testImpureNaN2UnrestrictedDouble", "NaN"); |
| shouldBe("converter.testQuietNaNUnrestrictedDouble", "NaN"); |
| shouldBe("converter.testPureNaNUnrestrictedDouble", "NaN"); |
| |
| </script> |
| <script src="../../resources/js-test-post.js"></script> |