X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/2d39b0e377c0896910ee49ae70082ba665faf986..ed1e77d3adeb83d26fd1dfb16dd84cabdcefd250:/tests/stress/string-raw.js?ds=inline diff --git a/tests/stress/string-raw.js b/tests/stress/string-raw.js new file mode 100644 index 0000000..17c769b --- /dev/null +++ b/tests/stress/string-raw.js @@ -0,0 +1,154 @@ +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error(`bad value: ${actual}`); +} + +function shouldThrow(func, errorMessage) { + var errorThrown = false; + var error = null; + try { + func(); + } catch (e) { + errorThrown = true; + error = e; + } + if (!errorThrown) + throw new Error('not thrown'); + if (String(error) !== errorMessage) + throw new Error(`bad error: ${String(error)}`); +} + +shouldBe(String.raw.name, 'raw'); +shouldBe(String.raw.length, 1); + +shouldThrow(function () { + String.raw(); +}, "TypeError: String.raw requires template not be null or undefined"); + +shouldThrow(function () { + String.raw(undefined); +}, "TypeError: String.raw requires template not be null or undefined"); + +shouldThrow(function () { + String.raw({ raw: undefined }); +}, "TypeError: String.raw requires template.raw not be null or undefined"); + +shouldThrow(function () { + String.raw({ raw: null }); +}, "TypeError: String.raw requires template.raw not be null or undefined"); + +shouldThrow(function () { + String.raw({ + get length() { + return new Error('template.length called'); + }, + + raw: { + get length() { + throw new Error("template.raw.length called"); + } + } + }); +}, "Error: template.raw.length called"); + +shouldBe(String.raw({ + raw: { + length: -1 + } +}), ""); + +shouldBe(String.raw({ + raw: { + length: -2.5 + } +}), ""); + +shouldBe(String.raw({ + raw: { + length: -Infinity + } +}), ""); + +shouldBe(String.raw({ + raw: { + length: 0 + } +}), ""); + +shouldBe(String.raw({ + raw: { + length: NaN + } +}), ""); + +function generateTemplate() { + var cooked = []; + cooked.raw = Array.from(arguments); + return cooked; +} + +shouldBe(String.raw(generateTemplate("", ",", ",", ""), "Cocoa", "Cappuccino", "Matcha"), "Cocoa,Cappuccino,Matcha"); +shouldBe(String.raw(generateTemplate("", ",", ",", ""), "Cocoa", "Cappuccino", "Matcha", "Hello"), "Cocoa,Cappuccino,Matcha"); +shouldBe(String.raw(generateTemplate("", ",", ",", ""), "Cocoa", "Cappuccino"), "Cocoa,Cappuccino,"); +shouldBe(String.raw(generateTemplate("", ",", ",", ""), "Cocoa"), "Cocoa,,"); +shouldBe(String.raw(generateTemplate("", ",", ",", "")), ",,"); + +function Counter(p) { + var count = 0; + return { + toString() { + return count++; + } + }; +} + +var counter = Counter(); +shouldBe(String.raw(generateTemplate(counter, counter, counter, counter)), "0123"); +var counter = Counter(); +shouldBe(String.raw(generateTemplate(counter, counter, counter, counter), counter), "01234"); +var counter = Counter(); +shouldBe(String.raw(generateTemplate(counter, counter, counter, counter), counter, counter), "012345"); +var counter = Counter(); +shouldBe(String.raw(generateTemplate(counter, counter, counter, counter), counter, counter, counter), "0123456"); +var counter = Counter(); +shouldBe(String.raw(generateTemplate(counter, counter, counter, counter), counter, counter, counter, counter), "0123456"); +var counter = Counter(); +shouldBe(String.raw(generateTemplate(counter, counter, counter, counter), counter, counter, counter, counter), "0123456"); +var counter = Counter(); +shouldBe(String.raw(generateTemplate(counter, counter, counter, counter), counter, counter, counter, counter, counter), "0123456"); + + +shouldBe(String.raw({ + raw: { + length: 3.5, + 0: "a", + 1: "b", + 2: "c" + } +}, "d", "e", "f", "g"), "adbec"); + +shouldBe(String.raw({ + raw: { + length: 2.3, + 0: "a", + 1: "b", + 2: "c" + } +}, "d", "e", "f", "g"), "adb"); + +shouldBe(String.raw({ + raw: { + length: 2.3, + 0: "a", + 2: "c" + } +}, "d", "e", "f", "g"), "adundefined"); + +shouldBe(String.raw({ + raw: { + length: 2.3, + 0: "a", + 1: "b", + 2: "c" + } +}, undefined, "e", "f", "g"), "aundefinedb");