e69cfdffd6a93d46ba8be6b496284a7b56750b3e
[WebKit-https.git] / Source / JavaScriptCore / tests / stress / template-literal.js
1 function test(actual, expected) {
2     if (actual !== expected)
3         throw new Error("bad value: " + actual);
4 }
5
6 function testEval(script, expected) {
7     test(eval(script), expected);
8 }
9
10 function testEmbedded(value, expected) {
11     var template = `Hello ${value} World`;
12     test(template, expected);
13 }
14
15 test(``, "");
16 test(`${""}`, "");
17 test(`${``}`, "");
18 test(`${``}${``}${``}${""}`, "");
19
20 test(`Hello World`, "Hello World");
21 test(`Hello
22         World`, "Hello\n        World");
23
24 test(`\uFEFF`, "\uFEFF");
25 testEval("`\uFEFF`", "\uFEFF");
26
27 test(`\x20`, "\x20");
28 test(`\x2020`, "\x2020");
29
30 for (var ch of [ '\'', '"', '\\', 'b', 'f', 'n', 'r', 't', 'v' ])
31     testEval("`\\" + ch + "`", eval("'\\" + ch + "'"));
32
33 test(`\
34 Hello World`, "Hello World");
35
36 test(`\
37
38 Hello World`, "\nHello World");
39
40 test(`\u2028\u2029\r\n`, "\u2028\u2029\r\n");
41 test(`\u2028\u2029\n\r\n`, "\u2028\u2029\n\r\n");
42 test(`\u2028200`, "\u2028200");
43
44 testEmbedded(42, "Hello 42 World");
45 testEmbedded("ISUCA", "Hello ISUCA World");
46 testEmbedded(null, "Hello null World");
47 testEmbedded(undefined, "Hello undefined World");
48 testEmbedded({}, "Hello [object Object] World");
49
50 (function () {
51     var object = {
52         name: "Cocoa",
53     };
54     var array = [
55         "Cappuccino"
56     ]
57     test(`Hello ${object.name} and ${array[0]} :D`, "Hello Cocoa and Cappuccino :D");
58 }());
59
60 (function () {
61     function ok() {
62         return "Cocoa";
63     }
64     test(`Hello ${ ok() }`, "Hello Cocoa");
65 }());
66
67 (function () {
68     var object = {
69         toString() {
70             return 'Cocoa';
71         }
72     };
73     test(`Hello ${object} :D`, "Hello Cocoa :D");
74 }());
75
76 // Immediately adjacent template expressions, with empty intermediate template strings.
77 test(`${"C"}${"o"}${"c"}${"o"}${"a"}`, "Cocoa");
78 test(`${"C"}${"o"}${"c"}${"o"}${" "}`, "Coco ");
79
80 // Nested templates.
81 test(`Hello ${ `Cocoa` }`, "Hello Cocoa");
82 test(`Hello ${ `Co${`c`}oa` }`, "Hello Cocoa");
83
84 // Evaluation order
85 (function () {
86     var count = 0;
87
88     function check(num) {
89         var now = count++;
90         test(now, num);
91         return now;
92     }
93
94     test(`Hello ${ `${ check(0) } ${ ` ${ check(1) } ${ check(2) }` } ${ check(3) }` } ${ check(4) }`, "Hello 0  1 2 3 4")
95 }());
96
97 // Exceptions
98
99 (function () {
100     function gen(num) {
101         return {
102             toString() {
103                 throw new Error(num);
104             }
105         };
106     }
107
108     var error = null;
109     try {
110         var template = `${gen(0)} ${gen(1)} ${gen(2)}`;
111     } catch (e) {
112         error = e;
113     }
114     if (!error)
115         throw new Error('no error thrown');
116     if (String(error) !== 'Error: 0')
117         throw new Error("bad error: " + String(error));
118
119     var error = null;
120     try {
121         var template = `${52} ${gen(0)} ${gen(1)}`;
122     } catch (e) {
123         error = e;
124     }
125     if (!error)
126         throw new Error('no error thrown');
127     if (String(error) !== 'Error: 0')
128         throw new Error("bad error: " + String(error));
129 }());
130
131
132 (function () {
133     var stat= {
134         count: 0
135     };
136     function gen(num) {
137         stat[num] = {
138             called: true,
139             count: stat.count++,
140             toString: null
141         };
142         return {
143             toString() {
144                 stat[num].toString = {
145                     called: true,
146                     count: stat.count++,
147                 };
148                 throw new Error(num);
149             }
150         };
151     }
152
153     var error = null;
154     try {
155         var template = `${gen(0)} ${gen(1)} ${gen(2)}`;
156     } catch (e) {
157         error = e;
158     }
159     if (!error)
160         throw new Error('no error thrown');
161     if (String(error) !== 'Error: 0')
162         throw new Error("bad error: " + String(error));
163     test(stat[0].count, 0);
164     test(stat[0].toString.called, true);
165     test(stat[0].toString.count, 1);
166     test(stat[1], undefined);
167     test(stat[2], undefined);
168 }());
169
170 (function () {
171     var stat= {
172         count: 0
173     };
174     function gen(num) {
175         stat[num] = {
176             called: true,
177             count: stat.count++,
178             toString: null
179         };
180         return {
181             toString() {
182                 stat[num].toString = {
183                     called: true,
184                     count: stat.count++,
185                 };
186                 throw new Error(num);
187             }
188         };
189     }
190
191     var error = null;
192     try {
193         var template = `${ `${gen(0)}` } ${ `${gen(1)} ${gen(2)}` }`;
194     } catch (e) {
195         error = e;
196     }
197     if (!error)
198         throw new Error('no error thrown');
199     if (String(error) !== 'Error: 0')
200         throw new Error("bad error: " + String(error));
201     test(stat[0].count, 0);
202     test(stat[0].toString.called, true);
203     test(stat[0].toString.count, 1);
204     test(stat[1], undefined);
205     test(stat[2], undefined);
206 }());