summaryrefslogtreecommitdiffstats
path: root/js/src/tests/test262/built-ins/String/raw
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/tests/test262/built-ins/String/raw')
-rw-r--r--js/src/tests/test262/built-ins/String/raw/browser.js0
-rw-r--r--js/src/tests/test262/built-ins/String/raw/length.js23
-rw-r--r--js/src/tests/test262/built-ins/String/raw/name.js24
-rw-r--r--js/src/tests/test262/built-ins/String/raw/nextkey-is-symbol-throws.js32
-rw-r--r--js/src/tests/test262/built-ins/String/raw/not-a-constructor.js31
-rw-r--r--js/src/tests/test262/built-ins/String/raw/raw.js19
-rw-r--r--js/src/tests/test262/built-ins/String/raw/return-empty-string-from-empty-array-length.js23
-rw-r--r--js/src/tests/test262/built-ins/String/raw/return-empty-string-if-length-is-negative-infinity.js25
-rw-r--r--js/src/tests/test262/built-ins/String/raw/return-empty-string-if-length-is-not-defined.js23
-rw-r--r--js/src/tests/test262/built-ins/String/raw/return-empty-string-if-length-is-undefined.js25
-rw-r--r--js/src/tests/test262/built-ins/String/raw/return-empty-string-if-length-is-zero-NaN.js25
-rw-r--r--js/src/tests/test262/built-ins/String/raw/return-empty-string-if-length-is-zero-boolean.js25
-rw-r--r--js/src/tests/test262/built-ins/String/raw/return-empty-string-if-length-is-zero-null.js25
-rw-r--r--js/src/tests/test262/built-ins/String/raw/return-empty-string-if-length-is-zero-or-less-number.js45
-rw-r--r--js/src/tests/test262/built-ins/String/raw/return-empty-string-if-length-is-zero-or-less-string.js38
-rw-r--r--js/src/tests/test262/built-ins/String/raw/return-the-string-value-from-template.js28
-rw-r--r--js/src/tests/test262/built-ins/String/raw/return-the-string-value.js41
-rw-r--r--js/src/tests/test262/built-ins/String/raw/returns-abrupt-from-next-key-toString.js35
-rw-r--r--js/src/tests/test262/built-ins/String/raw/returns-abrupt-from-next-key.js48
-rw-r--r--js/src/tests/test262/built-ins/String/raw/returns-abrupt-from-substitution-symbol.js45
-rw-r--r--js/src/tests/test262/built-ins/String/raw/returns-abrupt-from-substitution.js48
-rw-r--r--js/src/tests/test262/built-ins/String/raw/shell.js0
-rw-r--r--js/src/tests/test262/built-ins/String/raw/special-characters.js23
-rw-r--r--js/src/tests/test262/built-ins/String/raw/substitutions-are-appended-on-same-index.js38
-rw-r--r--js/src/tests/test262/built-ins/String/raw/substitutions-are-limited-to-template-raw-length.js37
-rw-r--r--js/src/tests/test262/built-ins/String/raw/template-length-is-symbol-throws.js31
-rw-r--r--js/src/tests/test262/built-ins/String/raw/template-length-throws.js35
-rw-r--r--js/src/tests/test262/built-ins/String/raw/template-not-object-throws.js26
-rw-r--r--js/src/tests/test262/built-ins/String/raw/template-raw-not-object-throws.js32
-rw-r--r--js/src/tests/test262/built-ins/String/raw/template-raw-throws.js31
-rw-r--r--js/src/tests/test262/built-ins/String/raw/template-substitutions-are-appended-on-same-index.js34
-rw-r--r--js/src/tests/test262/built-ins/String/raw/zero-literal-segments.js11
32 files changed, 926 insertions, 0 deletions
diff --git a/js/src/tests/test262/built-ins/String/raw/browser.js b/js/src/tests/test262/built-ins/String/raw/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/test262/built-ins/String/raw/browser.js
diff --git a/js/src/tests/test262/built-ins/String/raw/length.js b/js/src/tests/test262/built-ins/String/raw/length.js
new file mode 100644
index 0000000000..deb433fde5
--- /dev/null
+++ b/js/src/tests/test262/built-ins/String/raw/length.js
@@ -0,0 +1,23 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 21.1.2.4
+description: >
+ String.raw.length value and property descriptor
+info: |
+ String.raw ( template , ...substitutions )
+
+ The length property of the raw function is 1.
+includes: [propertyHelper.js]
+---*/
+
+assert.sameValue(
+ String.raw.length, 1,
+ 'The value of `String.raw.length` is `1`'
+);
+
+verifyNotEnumerable(String.raw, 'length');
+verifyNotWritable(String.raw, 'length');
+verifyConfigurable(String.raw, 'length');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/String/raw/name.js b/js/src/tests/test262/built-ins/String/raw/name.js
new file mode 100644
index 0000000000..c7533e923b
--- /dev/null
+++ b/js/src/tests/test262/built-ins/String/raw/name.js
@@ -0,0 +1,24 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 21.1.2.4
+description: >
+ String.raw.name value and property descriptor
+info: |
+ String.raw ( template , ...substitutions )
+
+ 17 ECMAScript Standard Built-in Objects
+
+includes: [propertyHelper.js]
+---*/
+
+assert.sameValue(
+ String.raw.name, 'raw',
+ 'The value of `String.raw.name` is `"raw"`'
+);
+
+verifyNotEnumerable(String.raw, 'name');
+verifyNotWritable(String.raw, 'name');
+verifyConfigurable(String.raw, 'name');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/String/raw/nextkey-is-symbol-throws.js b/js/src/tests/test262/built-ins/String/raw/nextkey-is-symbol-throws.js
new file mode 100644
index 0000000000..3a670b367e
--- /dev/null
+++ b/js/src/tests/test262/built-ins/String/raw/nextkey-is-symbol-throws.js
@@ -0,0 +1,32 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 21.1.2.4
+description: >
+ Throws a TypeError if nextKey is Symbol
+info: |
+ 21.1.2.4 String.raw ( template , ...substitutions )
+
+ ...
+ 10. Let stringElements be a new List.
+ 11. Let nextIndex be 0.
+ 12. Repeat
+ a. Let nextKey be ToString(nextIndex).
+ b. Let nextSeg be ToString(Get(raw, nextKey)).
+ c. ReturnIfAbrupt(nextSeg).
+ ...
+features: [Symbol]
+---*/
+
+var obj = {
+ raw: {
+ length: 1,
+ '0': Symbol('')
+ }
+};
+
+assert.throws(TypeError, function() {
+ String.raw(obj);
+});
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/String/raw/not-a-constructor.js b/js/src/tests/test262/built-ins/String/raw/not-a-constructor.js
new file mode 100644
index 0000000000..6beda7f32f
--- /dev/null
+++ b/js/src/tests/test262/built-ins/String/raw/not-a-constructor.js
@@ -0,0 +1,31 @@
+// Copyright (C) 2020 Rick Waldron. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-ecmascript-standard-built-in-objects
+description: >
+ String.raw does not implement [[Construct]], is not new-able
+info: |
+ ECMAScript Function Objects
+
+ Built-in function objects that are not identified as constructors do not
+ implement the [[Construct]] internal method unless otherwise specified in
+ the description of a particular function.
+
+ sec-evaluatenew
+
+ ...
+ 7. If IsConstructor(constructor) is false, throw a TypeError exception.
+ ...
+includes: [isConstructor.js]
+features: [Reflect.construct, arrow-function]
+---*/
+
+assert.sameValue(isConstructor(String.raw), false, 'isConstructor(String.raw) must return false');
+
+assert.throws(TypeError, () => {
+ new String.raw({raw: []}, []);
+}, '`new String.raw({raw: []}, [])` throws TypeError');
+
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/String/raw/raw.js b/js/src/tests/test262/built-ins/String/raw/raw.js
new file mode 100644
index 0000000000..c36ee8484a
--- /dev/null
+++ b/js/src/tests/test262/built-ins/String/raw/raw.js
@@ -0,0 +1,19 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 21.1.2.4
+description: >
+ String.raw property descriptor
+info: |
+ String.raw ( template , ...substitutions )
+
+ 17 ECMAScript Standard Built-in Objects
+
+includes: [propertyHelper.js]
+---*/
+
+verifyNotEnumerable(String, 'raw');
+verifyWritable(String, 'raw');
+verifyConfigurable(String, 'raw');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/String/raw/return-empty-string-from-empty-array-length.js b/js/src/tests/test262/built-ins/String/raw/return-empty-string-from-empty-array-length.js
new file mode 100644
index 0000000000..7d286f958d
--- /dev/null
+++ b/js/src/tests/test262/built-ins/String/raw/return-empty-string-from-empty-array-length.js
@@ -0,0 +1,23 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 21.1.2.4
+description: >
+ Returns empty string if template.raw an empty Array
+info: |
+ 21.1.2.4 String.raw ( template , ...substitutions )
+
+ ...
+ 7. Let literalSegments be ToLength(Get(raw, "length")).
+ 8. ReturnIfAbrupt(literalSegments).
+ 9. If literalSegments ≤ 0, return the empty string.
+ ...
+---*/
+
+var result = String.raw({
+ raw: []
+});
+
+assert.sameValue(result, '');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/String/raw/return-empty-string-if-length-is-negative-infinity.js b/js/src/tests/test262/built-ins/String/raw/return-empty-string-if-length-is-negative-infinity.js
new file mode 100644
index 0000000000..099e52e5d0
--- /dev/null
+++ b/js/src/tests/test262/built-ins/String/raw/return-empty-string-if-length-is-negative-infinity.js
@@ -0,0 +1,25 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 21.1.2.4
+description: >
+ Returns empty string if template.raw.length is -Infinity
+info: |
+ 21.1.2.4 String.raw ( template , ...substitutions )
+
+ ...
+ 7. Let literalSegments be ToLength(Get(raw, "length")).
+ 8. ReturnIfAbrupt(literalSegments).
+ 9. If literalSegments ≤ 0, return the empty string.
+ ...
+---*/
+
+var result = String.raw({
+ raw: {
+ length: -Infinity
+ }
+});
+
+assert.sameValue(result, '');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/String/raw/return-empty-string-if-length-is-not-defined.js b/js/src/tests/test262/built-ins/String/raw/return-empty-string-if-length-is-not-defined.js
new file mode 100644
index 0000000000..c3ebe55b92
--- /dev/null
+++ b/js/src/tests/test262/built-ins/String/raw/return-empty-string-if-length-is-not-defined.js
@@ -0,0 +1,23 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 21.1.2.4
+description: >
+ Returns empty string if template.raw.length isn't defined.
+info: |
+ 21.1.2.4 String.raw ( template , ...substitutions )
+
+ ...
+ 7. Let literalSegments be ToLength(Get(raw, "length")).
+ 8. ReturnIfAbrupt(literalSegments).
+ 9. If literalSegments ≤ 0, return the empty string.
+ ...
+---*/
+
+var result = String.raw({
+ raw: {}
+});
+
+assert.sameValue(result, '');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/String/raw/return-empty-string-if-length-is-undefined.js b/js/src/tests/test262/built-ins/String/raw/return-empty-string-if-length-is-undefined.js
new file mode 100644
index 0000000000..1a4041535f
--- /dev/null
+++ b/js/src/tests/test262/built-ins/String/raw/return-empty-string-if-length-is-undefined.js
@@ -0,0 +1,25 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 21.1.2.4
+description: >
+ Returns empty string if template.raw.length isn't defined.
+info: |
+ 21.1.2.4 String.raw ( template , ...substitutions )
+
+ ...
+ 7. Let literalSegments be ToLength(Get(raw, "length")).
+ 8. ReturnIfAbrupt(literalSegments).
+ 9. If literalSegments ≤ 0, return the empty string.
+ ...
+---*/
+
+var result = String.raw({
+ raw: {
+ length: undefined
+ }
+});
+
+assert.sameValue(result, '');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/String/raw/return-empty-string-if-length-is-zero-NaN.js b/js/src/tests/test262/built-ins/String/raw/return-empty-string-if-length-is-zero-NaN.js
new file mode 100644
index 0000000000..e129f9e968
--- /dev/null
+++ b/js/src/tests/test262/built-ins/String/raw/return-empty-string-if-length-is-zero-NaN.js
@@ -0,0 +1,25 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 21.1.2.4
+description: >
+ Returns empty string if template.raw.length is NaN
+info: |
+ 21.1.2.4 String.raw ( template , ...substitutions )
+
+ ...
+ 7. Let literalSegments be ToLength(Get(raw, "length")).
+ 8. ReturnIfAbrupt(literalSegments).
+ 9. If literalSegments ≤ 0, return the empty string.
+ ...
+---*/
+
+var result = String.raw({
+ raw: {
+ length: NaN
+ }
+});
+
+assert.sameValue(result, '');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/String/raw/return-empty-string-if-length-is-zero-boolean.js b/js/src/tests/test262/built-ins/String/raw/return-empty-string-if-length-is-zero-boolean.js
new file mode 100644
index 0000000000..9eb98d7f0f
--- /dev/null
+++ b/js/src/tests/test262/built-ins/String/raw/return-empty-string-if-length-is-zero-boolean.js
@@ -0,0 +1,25 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 21.1.2.4
+description: >
+ Returns empty string if template.raw.length is false
+info: |
+ 21.1.2.4 String.raw ( template , ...substitutions )
+
+ ...
+ 7. Let literalSegments be ToLength(Get(raw, "length")).
+ 8. ReturnIfAbrupt(literalSegments).
+ 9. If literalSegments ≤ 0, return the empty string.
+ ...
+---*/
+
+var result = String.raw({
+ raw: {
+ length: false
+ }
+});
+
+assert.sameValue(result, '');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/String/raw/return-empty-string-if-length-is-zero-null.js b/js/src/tests/test262/built-ins/String/raw/return-empty-string-if-length-is-zero-null.js
new file mode 100644
index 0000000000..e31a22b9bd
--- /dev/null
+++ b/js/src/tests/test262/built-ins/String/raw/return-empty-string-if-length-is-zero-null.js
@@ -0,0 +1,25 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 21.1.2.4
+description: >
+ Returns empty string if template.raw.length is null
+info: |
+ 21.1.2.4 String.raw ( template , ...substitutions )
+
+ ...
+ 7. Let literalSegments be ToLength(Get(raw, "length")).
+ 8. ReturnIfAbrupt(literalSegments).
+ 9. If literalSegments ≤ 0, return the empty string.
+ ...
+---*/
+
+var result = String.raw({
+ raw: {
+ length: null
+ }
+});
+
+assert.sameValue(result, '');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/String/raw/return-empty-string-if-length-is-zero-or-less-number.js b/js/src/tests/test262/built-ins/String/raw/return-empty-string-if-length-is-zero-or-less-number.js
new file mode 100644
index 0000000000..14d3cfad11
--- /dev/null
+++ b/js/src/tests/test262/built-ins/String/raw/return-empty-string-if-length-is-zero-or-less-number.js
@@ -0,0 +1,45 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 21.1.2.4
+description: >
+ Returns empty string if template.raw.length is <= 0
+info: |
+ 21.1.2.4 String.raw ( template , ...substitutions )
+
+ ...
+ 7. Let literalSegments be ToLength(Get(raw, "length")).
+ 8. ReturnIfAbrupt(literalSegments).
+ 9. If literalSegments ≤ 0, return the empty string.
+ ...
+---*/
+
+var result = String.raw({
+ raw: {
+ length: 0
+ }
+});
+assert.sameValue(result, '', 'result is an empty string when length == 0');
+
+result = String.raw({
+ raw: {
+ length: -1
+ }
+});
+assert.sameValue(result, '', 'result is an empty string when length == -1');
+
+result = String.raw({
+ raw: {
+ length: -0
+ }
+});
+assert.sameValue(result, '', 'result is an empty string when length == -0');
+
+result = String.raw({
+ raw: {
+ length: 0.32
+ }
+});
+assert.sameValue(result, '', 'result is an empty string when length == 0.32');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/String/raw/return-empty-string-if-length-is-zero-or-less-string.js b/js/src/tests/test262/built-ins/String/raw/return-empty-string-if-length-is-zero-or-less-string.js
new file mode 100644
index 0000000000..c0190abb2f
--- /dev/null
+++ b/js/src/tests/test262/built-ins/String/raw/return-empty-string-if-length-is-zero-or-less-string.js
@@ -0,0 +1,38 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 21.1.2.4
+description: >
+ Returns empty string if template.raw.length is <= 0
+info: |
+ 21.1.2.4 String.raw ( template , ...substitutions )
+
+ ...
+ 7. Let literalSegments be ToLength(Get(raw, "length")).
+ 8. ReturnIfAbrupt(literalSegments).
+ 9. If literalSegments ≤ 0, return the empty string.
+ ...
+---*/
+
+var result = String.raw({
+ raw: {
+ length: '0'
+ }
+});
+assert.sameValue(result, '', 'result is an empty string when length == "0"');
+
+result = String.raw({
+ raw: {
+ length: '-1'
+ }
+});
+assert.sameValue(result, '', 'result is an empty string when length == "-1"');
+
+result = String.raw({
+ raw: {
+ length: ''
+ }
+});
+assert.sameValue(result, '', 'result is an empty string when length == ""');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/String/raw/return-the-string-value-from-template.js b/js/src/tests/test262/built-ins/String/raw/return-the-string-value-from-template.js
new file mode 100644
index 0000000000..c8a8c5175c
--- /dev/null
+++ b/js/src/tests/test262/built-ins/String/raw/return-the-string-value-from-template.js
@@ -0,0 +1,28 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 21.1.2.4
+description: >
+ Returns the string value.
+info: |
+ 21.1.2.4 String.raw ( template , ...substitutions )
+
+ ...
+ 10. Let stringElements be a new List.
+ 11. Let nextIndex be 0.
+ 12. Repeat
+ a. Let nextKey be ToString(nextIndex).
+ b. Let nextSeg be ToString(Get(raw, nextKey)).
+ c. ReturnIfAbrupt(nextSeg).
+ d. Append in order the code unit elements of nextSeg to the end of
+ stringElements.
+ e. If nextIndex + 1 = literalSegments, then
+ i. Return the String value whose code units are, in order, the elements in
+ the List stringElements. If stringElements has no elements, the empty
+ string is returned.
+ ...
+---*/
+
+assert.sameValue(String.raw`123\u0065`, '123\\u0065');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/String/raw/return-the-string-value.js b/js/src/tests/test262/built-ins/String/raw/return-the-string-value.js
new file mode 100644
index 0000000000..48ca631777
--- /dev/null
+++ b/js/src/tests/test262/built-ins/String/raw/return-the-string-value.js
@@ -0,0 +1,41 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 21.1.2.4
+description: >
+ Returns the string value without substitutions arguments and limited to the
+ given length.
+info: |
+ 21.1.2.4 String.raw ( template , ...substitutions )
+
+ ...
+ 10. Let stringElements be a new List.
+ 11. Let nextIndex be 0.
+ 12. Repeat
+ a. Let nextKey be ToString(nextIndex).
+ b. Let nextSeg be ToString(Get(raw, nextKey)).
+ c. ReturnIfAbrupt(nextSeg).
+ d. Append in order the code unit elements of nextSeg to the end of
+ stringElements.
+ e. If nextIndex + 1 = literalSegments, then
+ i. Return the String value whose code units are, in order, the elements in
+ the List stringElements. If stringElements has no elements, the empty
+ string is returned.
+ ...
+---*/
+
+var obj = {
+ raw: {
+ length: 5,
+ 0: '\u0065',
+ 1: '',
+ 2: null,
+ 3: undefined,
+ 4: 123,
+ 5: 'overpass the length'
+ }
+};
+
+assert.sameValue(String.raw(obj), 'enullundefined123');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/String/raw/returns-abrupt-from-next-key-toString.js b/js/src/tests/test262/built-ins/String/raw/returns-abrupt-from-next-key-toString.js
new file mode 100644
index 0000000000..5d39385342
--- /dev/null
+++ b/js/src/tests/test262/built-ins/String/raw/returns-abrupt-from-next-key-toString.js
@@ -0,0 +1,35 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 21.1.2.4
+description: >
+ Returns abrupt from nextKey.
+info: |
+ 21.1.2.4 String.raw ( template , ...substitutions )
+
+ ...
+ 10. Let stringElements be a new List.
+ 11. Let nextIndex be 0.
+ 12. Repeat
+ a. Let nextKey be ToString(nextIndex).
+ b. Let nextSeg be ToString(Get(raw, nextKey)).
+ c. ReturnIfAbrupt(nextSeg).
+ ...
+---*/
+
+var obj = {
+ raw: {
+ length: 1,
+ '0': {
+ toString: function() {
+ throw new Test262Error();
+ }
+ }
+ }
+};
+
+assert.throws(Test262Error, function() {
+ String.raw(obj);
+});
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/String/raw/returns-abrupt-from-next-key.js b/js/src/tests/test262/built-ins/String/raw/returns-abrupt-from-next-key.js
new file mode 100644
index 0000000000..e044e2c222
--- /dev/null
+++ b/js/src/tests/test262/built-ins/String/raw/returns-abrupt-from-next-key.js
@@ -0,0 +1,48 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 21.1.2.4
+description: >
+ Returns abrupt from nextKey.
+info: |
+ 21.1.2.4 String.raw ( template , ...substitutions )
+
+ ...
+ 10. Let stringElements be a new List.
+ 11. Let nextIndex be 0.
+ 12. Repeat
+ a. Let nextKey be ToString(nextIndex).
+ b. Let nextSeg be ToString(Get(raw, nextKey)).
+ c. ReturnIfAbrupt(nextSeg).
+ ...
+---*/
+
+var obj = {
+ raw: {
+ length: 2
+ }
+};
+
+Object.defineProperty(obj.raw, '0', {
+ get: function() {
+ throw new Test262Error();
+ },
+ configurable: true
+});
+
+assert.throws(Test262Error, function() {
+ String.raw(obj);
+});
+
+delete obj.raw['0'];
+obj.raw['0'] = 'a';
+Object.defineProperty(obj.raw, '1', {
+ get: function() {
+ throw new Test262Error();
+ }
+});
+assert.throws(Test262Error, function() {
+ String.raw(obj);
+});
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/String/raw/returns-abrupt-from-substitution-symbol.js b/js/src/tests/test262/built-ins/String/raw/returns-abrupt-from-substitution-symbol.js
new file mode 100644
index 0000000000..5c3590880e
--- /dev/null
+++ b/js/src/tests/test262/built-ins/String/raw/returns-abrupt-from-substitution-symbol.js
@@ -0,0 +1,45 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 21.1.2.4
+description: >
+ Returns the abrupt from ToString(substitutions[nextIndex]) using a Symbol
+ value.
+info: |
+ 21.1.2.4 String.raw ( template , ...substitutions )
+
+ ...
+ 10. Let stringElements be a new List.
+ 11. Let nextIndex be 0.
+ 12. Repeat
+ a. Let nextKey be ToString(nextIndex).
+ b. Let nextSeg be ToString(Get(raw, nextKey)).
+ c. ReturnIfAbrupt(nextSeg).
+ d. Append in order the code unit elements of nextSeg to the end of
+ stringElements.
+ e. If nextIndex + 1 = literalSegments, then
+ i. Return the String value whose code units are, in order, the elements in
+ the List stringElements. If stringElements has no elements, the empty
+ string is returned.
+ f. If nextIndex < numberOfSubstitutions, let next be substitutions[nextIndex].
+ g. Else, let next be the empty String.
+ h. Let nextSub be ToString(next).
+ i. ReturnIfAbrupt(nextSub).
+ j. Append in order the code unit elements of nextSub to the end of stringElements.
+ k. Let nextIndex be nextIndex + 1.
+features: [Symbol]
+---*/
+
+var template = {
+ raw: ['a', 'b', 'c']
+};
+
+assert.throws(TypeError, function() {
+ String.raw(template, '', Symbol(''));
+});
+
+assert.throws(TypeError, function() {
+ String.raw(template, Symbol(''), '');
+});
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/String/raw/returns-abrupt-from-substitution.js b/js/src/tests/test262/built-ins/String/raw/returns-abrupt-from-substitution.js
new file mode 100644
index 0000000000..42c2ad7f90
--- /dev/null
+++ b/js/src/tests/test262/built-ins/String/raw/returns-abrupt-from-substitution.js
@@ -0,0 +1,48 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 21.1.2.4
+description: >
+ Returns the abrupt from ToString(substitutions[nextIndex]).
+info: |
+ 21.1.2.4 String.raw ( template , ...substitutions )
+
+ ...
+ 10. Let stringElements be a new List.
+ 11. Let nextIndex be 0.
+ 12. Repeat
+ a. Let nextKey be ToString(nextIndex).
+ b. Let nextSeg be ToString(Get(raw, nextKey)).
+ c. ReturnIfAbrupt(nextSeg).
+ d. Append in order the code unit elements of nextSeg to the end of
+ stringElements.
+ e. If nextIndex + 1 = literalSegments, then
+ i. Return the String value whose code units are, in order, the elements in
+ the List stringElements. If stringElements has no elements, the empty
+ string is returned.
+ f. If nextIndex < numberOfSubstitutions, let next be substitutions[nextIndex].
+ g. Else, let next be the empty String.
+ h. Let nextSub be ToString(next).
+ i. ReturnIfAbrupt(nextSub).
+ j. Append in order the code unit elements of nextSub to the end of stringElements.
+ k. Let nextIndex be nextIndex + 1.
+---*/
+
+var template = {
+ raw: ['a', 'b', 'c']
+};
+var obj = {
+ toString: function() {
+ throw new Test262Error();
+ }
+};
+
+assert.throws(Test262Error, function() {
+ String.raw(template, '', obj);
+});
+
+assert.throws(Test262Error, function() {
+ String.raw(template, obj, '');
+});
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/String/raw/shell.js b/js/src/tests/test262/built-ins/String/raw/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/test262/built-ins/String/raw/shell.js
diff --git a/js/src/tests/test262/built-ins/String/raw/special-characters.js b/js/src/tests/test262/built-ins/String/raw/special-characters.js
new file mode 100644
index 0000000000..c2c2696e5a
--- /dev/null
+++ b/js/src/tests/test262/built-ins/String/raw/special-characters.js
@@ -0,0 +1,23 @@
+// Copyright (C) 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 21.1.2.4
+description: >
+ When used as a tag function of a tagged template, `String.raw` should
+ return the "raw" representation of the template.
+---*/
+
+assert.sameValue(
+ String.raw`\u0065\`\r\r\n\n${'test'}check`,
+ '\\u0065\\`\\r\\r\\n\\ntestcheck',
+ 'Unicode escape sequences'
+);
+assert.sameValue(
+ String.raw`\ \
+\
+`,
+ '\\\n\\\n\\\n',
+ 'Literal characters'
+);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/String/raw/substitutions-are-appended-on-same-index.js b/js/src/tests/test262/built-ins/String/raw/substitutions-are-appended-on-same-index.js
new file mode 100644
index 0000000000..96e8839422
--- /dev/null
+++ b/js/src/tests/test262/built-ins/String/raw/substitutions-are-appended-on-same-index.js
@@ -0,0 +1,38 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 21.1.2.4
+description: >
+ Returns the string value appending the substitutions on the same index order.
+info: |
+ 21.1.2.4 String.raw ( template , ...substitutions )
+
+ ...
+ 10. Let stringElements be a new List.
+ 11. Let nextIndex be 0.
+ 12. Repeat
+ a. Let nextKey be ToString(nextIndex).
+ b. Let nextSeg be ToString(Get(raw, nextKey)).
+ c. ReturnIfAbrupt(nextSeg).
+ d. Append in order the code unit elements of nextSeg to the end of
+ stringElements.
+ e. If nextIndex + 1 = literalSegments, then
+ i. Return the String value whose code units are, in order, the elements in
+ the List stringElements. If stringElements has no elements, the empty
+ string is returned.
+ f. If nextIndex < numberOfSubstitutions, let next be substitutions[nextIndex].
+ g. Else, let next be the empty String.
+ h. Let nextSub be ToString(next).
+ i. ReturnIfAbrupt(nextSub).
+ j. Append in order the code unit elements of nextSub to the end of stringElements.
+ k. Let nextIndex be nextIndex + 1.
+---*/
+
+var template = {
+ raw: ['a', 'b', 'd', 'f']
+};
+
+assert.sameValue(String.raw(template, '', 'c', 'e'), 'abcdef');
+assert.sameValue(String.raw(template, 1), 'a1bdf');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/String/raw/substitutions-are-limited-to-template-raw-length.js b/js/src/tests/test262/built-ins/String/raw/substitutions-are-limited-to-template-raw-length.js
new file mode 100644
index 0000000000..95e54cc048
--- /dev/null
+++ b/js/src/tests/test262/built-ins/String/raw/substitutions-are-limited-to-template-raw-length.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 21.1.2.4
+description: >
+ Limit appended substitutions arguments to template.raw.length - 1.
+info: |
+ 21.1.2.4 String.raw ( template , ...substitutions )
+
+ ...
+ 10. Let stringElements be a new List.
+ 11. Let nextIndex be 0.
+ 12. Repeat
+ a. Let nextKey be ToString(nextIndex).
+ b. Let nextSeg be ToString(Get(raw, nextKey)).
+ c. ReturnIfAbrupt(nextSeg).
+ d. Append in order the code unit elements of nextSeg to the end of
+ stringElements.
+ e. If nextIndex + 1 = literalSegments, then
+ i. Return the String value whose code units are, in order, the elements in
+ the List stringElements. If stringElements has no elements, the empty
+ string is returned.
+ ...
+---*/
+
+var template = {
+ raw: ['a', 'c', 'e']
+};
+var obj = {
+ toString: function() {
+ throw new Test262Error();
+ }
+};
+
+assert.sameValue(String.raw(template, 'b', 'd', obj), 'abcde');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/String/raw/template-length-is-symbol-throws.js b/js/src/tests/test262/built-ins/String/raw/template-length-is-symbol-throws.js
new file mode 100644
index 0000000000..eda07012cc
--- /dev/null
+++ b/js/src/tests/test262/built-ins/String/raw/template-length-is-symbol-throws.js
@@ -0,0 +1,31 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 21.1.2.4
+description: >
+ Returns abrupt completion from ToLength(template.raw.length).
+info: |
+ 21.1.2.4 String.raw ( template , ...substitutions )
+
+ 1. Let substitutions be a List consisting of all of the arguments passed to
+ this function, starting with the second argument. If fewer than two arguments
+ were passed, the List is empty.
+ 2. Let numberOfSubstitutions be the number of elements in substitutions.
+ 3. Let cooked be ToObject(template).
+ 4. ReturnIfAbrupt(cooked).
+ 5. Let raw be ToObject(Get(cooked, "raw")).
+ 6. ReturnIfAbrupt(raw).
+ 7. Let literalSegments be ToLength(Get(raw, "length")).
+ 8. ReturnIfAbrupt(literalSegments).
+features: [Symbol]
+---*/
+
+assert.throws(TypeError, function() {
+ String.raw({
+ raw: {
+ length: Symbol(1)
+ }
+ });
+});
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/String/raw/template-length-throws.js b/js/src/tests/test262/built-ins/String/raw/template-length-throws.js
new file mode 100644
index 0000000000..eed53e6406
--- /dev/null
+++ b/js/src/tests/test262/built-ins/String/raw/template-length-throws.js
@@ -0,0 +1,35 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 21.1.2.4
+description: >
+ Returns abrupt completion from ToObject(template.raw.length).
+info: |
+ 21.1.2.4 String.raw ( template , ...substitutions )
+
+ 1. Let substitutions be a List consisting of all of the arguments passed to
+ this function, starting with the second argument. If fewer than two arguments
+ were passed, the List is empty.
+ 2. Let numberOfSubstitutions be the number of elements in substitutions.
+ 3. Let cooked be ToObject(template).
+ 4. ReturnIfAbrupt(cooked).
+ 5. Let raw be ToObject(Get(cooked, "raw")).
+ 6. ReturnIfAbrupt(raw).
+ 7. Let literalSegments be ToLength(Get(raw, "length")).
+ 8. ReturnIfAbrupt(literalSegments).
+---*/
+
+var obj = {
+ raw: {}
+};
+Object.defineProperty(obj.raw, 'length', {
+ get: function() {
+ throw new Test262Error();
+ }
+});
+
+assert.throws(Test262Error, function() {
+ String.raw(obj);
+});
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/String/raw/template-not-object-throws.js b/js/src/tests/test262/built-ins/String/raw/template-not-object-throws.js
new file mode 100644
index 0000000000..7be8b829fb
--- /dev/null
+++ b/js/src/tests/test262/built-ins/String/raw/template-not-object-throws.js
@@ -0,0 +1,26 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 21.1.2.4
+description: >
+ Returns abrupt completion from ToObject(template).
+info: |
+ 21.1.2.4 String.raw ( template , ...substitutions )
+
+ 1. Let substitutions be a List consisting of all of the arguments passed to
+ this function, starting with the second argument. If fewer than two arguments
+ were passed, the List is empty.
+ 2. Let numberOfSubstitutions be the number of elements in substitutions.
+ 3. Let cooked be ToObject(template).
+ 4. ReturnIfAbrupt(cooked).
+---*/
+
+assert.throws(TypeError, function() {
+ String.raw(null);
+});
+
+assert.throws(TypeError, function() {
+ String.raw(undefined);
+});
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/String/raw/template-raw-not-object-throws.js b/js/src/tests/test262/built-ins/String/raw/template-raw-not-object-throws.js
new file mode 100644
index 0000000000..9bb391d907
--- /dev/null
+++ b/js/src/tests/test262/built-ins/String/raw/template-raw-not-object-throws.js
@@ -0,0 +1,32 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 21.1.2.4
+description: >
+ Returns abrupt completion from ToObject(template.raw).
+info: |
+ 21.1.2.4 String.raw ( template , ...substitutions )
+
+ 1. Let substitutions be a List consisting of all of the arguments passed to
+ this function, starting with the second argument. If fewer than two arguments
+ were passed, the List is empty.
+ 2. Let numberOfSubstitutions be the number of elements in substitutions.
+ 3. Let cooked be ToObject(template).
+ 4. ReturnIfAbrupt(cooked).
+ 5. Let raw be ToObject(Get(cooked, "raw")).
+ 6. ReturnIfAbrupt(raw).
+---*/
+
+assert.throws(TypeError, function() {
+ String.raw({
+ raw: undefined
+ });
+});
+
+assert.throws(TypeError, function() {
+ String.raw({
+ raw: null
+ });
+});
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/String/raw/template-raw-throws.js b/js/src/tests/test262/built-ins/String/raw/template-raw-throws.js
new file mode 100644
index 0000000000..b53ad01b5b
--- /dev/null
+++ b/js/src/tests/test262/built-ins/String/raw/template-raw-throws.js
@@ -0,0 +1,31 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 21.1.2.4
+description: >
+ Returns abrupt completion from ToObject(template.raw).
+info: |
+ 21.1.2.4 String.raw ( template , ...substitutions )
+
+ 1. Let substitutions be a List consisting of all of the arguments passed to
+ this function, starting with the second argument. If fewer than two arguments
+ were passed, the List is empty.
+ 2. Let numberOfSubstitutions be the number of elements in substitutions.
+ 3. Let cooked be ToObject(template).
+ 4. ReturnIfAbrupt(cooked).
+ 5. Let raw be ToObject(Get(cooked, "raw")).
+ 6. ReturnIfAbrupt(raw).
+---*/
+
+var obj = {};
+Object.defineProperty(obj, 'raw', {
+ get: function() {
+ throw new Test262Error();
+ }
+});
+
+assert.throws(Test262Error, function() {
+ String.raw(obj);
+});
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/String/raw/template-substitutions-are-appended-on-same-index.js b/js/src/tests/test262/built-ins/String/raw/template-substitutions-are-appended-on-same-index.js
new file mode 100644
index 0000000000..d956f17d9f
--- /dev/null
+++ b/js/src/tests/test262/built-ins/String/raw/template-substitutions-are-appended-on-same-index.js
@@ -0,0 +1,34 @@
+// Copyright (C) 2015 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 21.1.2.4
+description: >
+ Returns the string value appending from the same index order using String.raw
+ as a tag function.
+info: |
+ 21.1.2.4 String.raw ( template , ...substitutions )
+
+ ...
+ 10. Let stringElements be a new List.
+ 11. Let nextIndex be 0.
+ 12. Repeat
+ a. Let nextKey be ToString(nextIndex).
+ b. Let nextSeg be ToString(Get(raw, nextKey)).
+ c. ReturnIfAbrupt(nextSeg).
+ d. Append in order the code unit elements of nextSeg to the end of
+ stringElements.
+ e. If nextIndex + 1 = literalSegments, then
+ i. Return the String value whose code units are, in order, the elements in
+ the List stringElements. If stringElements has no elements, the empty
+ string is returned.
+ f. If nextIndex < numberOfSubstitutions, let next be substitutions[nextIndex].
+ g. Else, let next be the empty String.
+ h. Let nextSub be ToString(next).
+ i. ReturnIfAbrupt(nextSub).
+ j. Append in order the code unit elements of nextSub to the end of stringElements.
+ k. Let nextIndex be nextIndex + 1.
+---*/
+
+assert.sameValue(String.raw`1${2}3${4}5`, '12345');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/String/raw/zero-literal-segments.js b/js/src/tests/test262/built-ins/String/raw/zero-literal-segments.js
new file mode 100644
index 0000000000..5960e26120
--- /dev/null
+++ b/js/src/tests/test262/built-ins/String/raw/zero-literal-segments.js
@@ -0,0 +1,11 @@
+// Copyright (C) 2014 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 21.1.2.4
+description: >
+ If literalSegments ≤ 0, return the empty string.
+---*/
+
+assert.sameValue(String.raw``, '');
+
+reportCompare(0, 0);