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