--- /dev/null
+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");