From 1f22932d69f8cdd5ed1602300c4690c5cfc11ef9 Mon Sep 17 00:00:00 2001 From: Mike Pennisi Date: Mon, 30 Mar 2015 17:36:38 -0400 Subject: [PATCH] Import tests from Google V8 (templates) These tests are derived from the following files within the Google V8 project: test/mjsunit/es6/templates.js Some of these tests include non-printable characters, causing git to infer that they are binary files. Introduce a `.gitattributes` file to configure git to consistently display the source text of all JavaScript files. --- .gitattributes | 1 + .../String/raw/special-characters.js | 21 +++++ .../String/raw/zero-literal-segments.js | 9 ++ .../templates/expressions/evaluation-order.js | 25 ++++++ .../expressions/function-invocation.js | 11 +++ ...legacy-octal-escape-sequence-non-strict.js | 13 +++ .../legacy-octal-escape-sequence-strict.js | 14 +++ .../expressions/method-invocation.js | 13 +++ .../templates/expressions/object-deference.js | 19 ++++ test/language/templates/expressions/object.js | 24 +++++ .../templates/expressions/primitives.js | 11 +++ .../templates/expressions/template-literal.js | 9 ++ .../caching/differing-expressions-eval.js | 25 ++++++ .../differing-expressions-new-function.js | 29 ++++++ .../tagged/caching/differing-expressions.js | 24 +++++ .../tagged/caching/differing-raw-strings.js | 24 +++++ .../tagged/caching/differing-string-count.js | 24 +++++ .../tagged/caching/identical-source-eval.js | 23 +++++ .../caching/identical-source-new-function.js | 23 +++++ .../tagged/caching/identical-source.js | 26 ++++++ ...all-expression-argument-list-evaluation.js | 38 ++++++++ .../templates/tagged/chained-application.js | 20 +++++ .../tagged/constructor-invocation.js | 27 ++++++ .../tagged/member-expression-context.js | 20 +++++ .../templates/tagged/template-object.js | 47 ++++++++++ .../character-escape-sequence.js | 88 +++++++++++++++++++ .../template-values/escape-sequence.js | 39 ++++++++ ...mal-character-escape-sequence-truncated.js | 11 +++ .../invalid/legacy-octal-escape-sequence.js | 11 +++ .../unicode-escape-sequence-truncated.js | 11 +++ .../template-values/line-continuation.js | 19 ++++ .../line-terminator-sequence.js | 20 +++++ .../templates/template-values/multi-line.js | 13 +++ .../template-values/no-substitution.js | 27 ++++++ .../template-values/non-escape-character.js | 15 ++++ .../null-character-escape-sequence.js | 17 ++++ .../template-values/template-character.js | 29 ++++++ .../template-values/template-characters.js | 24 +++++ .../template-values/template-head.js | 29 ++++++ .../template-values/template-middle.js | 29 ++++++ .../template-values/template-tail.js | 29 ++++++ .../template-values/utf16-escape-sequence.js | 29 ++++++ .../templates/template-values/zwnbsp.js | 15 ++++ 43 files changed, 975 insertions(+) create mode 100644 .gitattributes create mode 100644 test/built-ins/String/raw/special-characters.js create mode 100644 test/built-ins/String/raw/zero-literal-segments.js create mode 100644 test/language/templates/expressions/evaluation-order.js create mode 100644 test/language/templates/expressions/function-invocation.js create mode 100644 test/language/templates/expressions/legacy-octal-escape-sequence-non-strict.js create mode 100644 test/language/templates/expressions/legacy-octal-escape-sequence-strict.js create mode 100644 test/language/templates/expressions/method-invocation.js create mode 100644 test/language/templates/expressions/object-deference.js create mode 100644 test/language/templates/expressions/object.js create mode 100644 test/language/templates/expressions/primitives.js create mode 100644 test/language/templates/expressions/template-literal.js create mode 100644 test/language/templates/tagged/caching/differing-expressions-eval.js create mode 100644 test/language/templates/tagged/caching/differing-expressions-new-function.js create mode 100644 test/language/templates/tagged/caching/differing-expressions.js create mode 100644 test/language/templates/tagged/caching/differing-raw-strings.js create mode 100644 test/language/templates/tagged/caching/differing-string-count.js create mode 100644 test/language/templates/tagged/caching/identical-source-eval.js create mode 100644 test/language/templates/tagged/caching/identical-source-new-function.js create mode 100644 test/language/templates/tagged/caching/identical-source.js create mode 100644 test/language/templates/tagged/call-expression-argument-list-evaluation.js create mode 100644 test/language/templates/tagged/chained-application.js create mode 100644 test/language/templates/tagged/constructor-invocation.js create mode 100644 test/language/templates/tagged/member-expression-context.js create mode 100644 test/language/templates/tagged/template-object.js create mode 100644 test/language/templates/template-values/character-escape-sequence.js create mode 100644 test/language/templates/template-values/escape-sequence.js create mode 100644 test/language/templates/template-values/invalid/hexidecimal-character-escape-sequence-truncated.js create mode 100644 test/language/templates/template-values/invalid/legacy-octal-escape-sequence.js create mode 100644 test/language/templates/template-values/invalid/unicode-escape-sequence-truncated.js create mode 100644 test/language/templates/template-values/line-continuation.js create mode 100644 test/language/templates/template-values/line-terminator-sequence.js create mode 100644 test/language/templates/template-values/multi-line.js create mode 100644 test/language/templates/template-values/no-substitution.js create mode 100644 test/language/templates/template-values/non-escape-character.js create mode 100644 test/language/templates/template-values/null-character-escape-sequence.js create mode 100644 test/language/templates/template-values/template-character.js create mode 100644 test/language/templates/template-values/template-characters.js create mode 100644 test/language/templates/template-values/template-head.js create mode 100644 test/language/templates/template-values/template-middle.js create mode 100644 test/language/templates/template-values/template-tail.js create mode 100644 test/language/templates/template-values/utf16-escape-sequence.js create mode 100644 test/language/templates/template-values/zwnbsp.js diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000..a35dab0d3e --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.js diff diff --git a/test/built-ins/String/raw/special-characters.js b/test/built-ins/String/raw/special-characters.js new file mode 100644 index 0000000000..6c6d4adf73 --- /dev/null +++ b/test/built-ins/String/raw/special-characters.js @@ -0,0 +1,21 @@ +// Copyright (C) Copyright 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' +); diff --git a/test/built-ins/String/raw/zero-literal-segments.js b/test/built-ins/String/raw/zero-literal-segments.js new file mode 100644 index 0000000000..c66124b2da --- /dev/null +++ b/test/built-ins/String/raw/zero-literal-segments.js @@ -0,0 +1,9 @@ +// Copyright (C) Copyright 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``, ''); diff --git a/test/language/templates/expressions/evaluation-order.js b/test/language/templates/expressions/evaluation-order.js new file mode 100644 index 0000000000..b707f6d2c2 --- /dev/null +++ b/test/language/templates/expressions/evaluation-order.js @@ -0,0 +1,25 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.8 +description: > + Expressions should be evaluated in left-to-right order. +---*/ + +var tag = function(templateObject, a, b, c) { + callCount++; + assert.sameValue(a, 0); + assert.sameValue(b, 1); + assert.sameValue(c, 2); +}; +var i = 0; +var callCount; + +assert.sameValue(`a${ i++ }b${ i++ }c${ i++ }d`, 'a0b1c2d'); + +i = 0; +callCount = 0; + +tag`a${ i++ }b${ i++ }c${ i++ }d`; + +assert.sameValue(callCount, 1); diff --git a/test/language/templates/expressions/function-invocation.js b/test/language/templates/expressions/function-invocation.js new file mode 100644 index 0000000000..06235f8244 --- /dev/null +++ b/test/language/templates/expressions/function-invocation.js @@ -0,0 +1,11 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.8 +description: > + Expressions should be evaluated and converted to Stings accordingto the + ToString abstract operation. +---*/ +function fn() { return 'result'; } + +assert.sameValue(`foo ${fn()} bar`, 'foo result bar'); diff --git a/test/language/templates/expressions/legacy-octal-escape-sequence-non-strict.js b/test/language/templates/expressions/legacy-octal-escape-sequence-non-strict.js new file mode 100644 index 0000000000..6822e58746 --- /dev/null +++ b/test/language/templates/expressions/legacy-octal-escape-sequence-non-strict.js @@ -0,0 +1,13 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.8 +description: > + The expression within the template should be evaluated according to the + semantics of the surrounding context. + The SV of EscapeSequence :: HexEscapeSequence is the SV of the + HexEscapeSequence. +flags: [noStrict] +---*/ + +assert.sameValue(`${'\07'}`, ''); diff --git a/test/language/templates/expressions/legacy-octal-escape-sequence-strict.js b/test/language/templates/expressions/legacy-octal-escape-sequence-strict.js new file mode 100644 index 0000000000..d2a0467e9d --- /dev/null +++ b/test/language/templates/expressions/legacy-octal-escape-sequence-strict.js @@ -0,0 +1,14 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.8 +description: > + The expression within the template should be evaluated according to the + semantics of the surrounding context. + The SV of EscapeSequence :: HexEscapeSequence is the SV of the + HexEscapeSequence. +negative: SyntaxError +flags: [onlyStrict] +---*/ + +`${'\07'}`; diff --git a/test/language/templates/expressions/method-invocation.js b/test/language/templates/expressions/method-invocation.js new file mode 100644 index 0000000000..98fe65266b --- /dev/null +++ b/test/language/templates/expressions/method-invocation.js @@ -0,0 +1,13 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.8 +description: > + Expressions should be evaluated and converted to Stings accordingto the + ToString abstract operation. +---*/ +var object = { + fn: function() { return 'result'; } +}; + +assert.sameValue(`foo ${object.fn()} bar`, 'foo result bar'); diff --git a/test/language/templates/expressions/object-deference.js b/test/language/templates/expressions/object-deference.js new file mode 100644 index 0000000000..40e696df3c --- /dev/null +++ b/test/language/templates/expressions/object-deference.js @@ -0,0 +1,19 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.8 +description: > + Expressions should be evaluated and converted to Stings accordingto the + ToString abstract operation. +---*/ +var object = { + number: 5, + string: 'stringValue' +}; + +assert.sameValue( + `foo ${object.number} bar`, 'foo 5 bar', 'number value property' +); +assert.sameValue( + `foo ${object.string} bar`, 'foo stringValue bar', 'string value property' +); diff --git a/test/language/templates/expressions/object.js b/test/language/templates/expressions/object.js new file mode 100644 index 0000000000..605f4a0cc3 --- /dev/null +++ b/test/language/templates/expressions/object.js @@ -0,0 +1,24 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.8 +description: > + Expressions should be evaluated and converted to Stings according to the + ToString abstract operation. +---*/ +var plain = {}; +var custom = { + toString: function() { + return '"own" toString'; + } +}; + +assert.sameValue(`${plain}`, '[object Object]'); +assert.sameValue(`1${plain}`, '1[object Object]'); +assert.sameValue(`${plain}2`, '[object Object]2'); +assert.sameValue(`1${plain}2`, '1[object Object]2'); + +assert.sameValue(`${custom}`, '"own" toString'); +assert.sameValue(`1${custom}`, '1"own" toString'); +assert.sameValue(`${custom}2`, '"own" toString2'); +assert.sameValue(`1${custom}2`, '1"own" toString2'); diff --git a/test/language/templates/expressions/primitives.js b/test/language/templates/expressions/primitives.js new file mode 100644 index 0000000000..b5e1b67392 --- /dev/null +++ b/test/language/templates/expressions/primitives.js @@ -0,0 +1,11 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.8 +description: > + Expressions should be evaluated and converted to Stings accordingto the + ToString abstract operation. +---*/ + +assert.sameValue(`foo ${5} bar`, 'foo 5 bar', 'number value'); +assert.sameValue(`foo ${'string'} bar`, 'foo string bar', 'string value'); diff --git a/test/language/templates/expressions/template-literal.js b/test/language/templates/expressions/template-literal.js new file mode 100644 index 0000000000..6e4aca2ec6 --- /dev/null +++ b/test/language/templates/expressions/template-literal.js @@ -0,0 +1,9 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.8 +description: > + Expressions should be evaluated and converted to Stings accordingto the + ToString abstract operation. +---*/ +assert.sameValue(`foo ${`bar ${5} baz`} qux`, 'foo bar 5 baz qux'); diff --git a/test/language/templates/tagged/caching/differing-expressions-eval.js b/test/language/templates/tagged/caching/differing-expressions-eval.js new file mode 100644 index 0000000000..c233db3b86 --- /dev/null +++ b/test/language/templates/tagged/caching/differing-expressions-eval.js @@ -0,0 +1,25 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.8 +description: > + Previously-created template objects should be retrieved from the internal + template registry when their source is identical but their expressions + evaluate to different values and the tagged template is being evaluated in + an `eval` context. +---*/ +function tag(templateObject) { + previousObject = templateObject; +} +var a = 1; +var b = 2; +var firstObject = null; +var previousObject = null; + +tag`head${a}tail`; +firstObject = previousObject; +assert(firstObject !== null); +previousObject = null; + +eval('tag`head${b}tail`'); +assert.sameValue(previousObject, firstObject); diff --git a/test/language/templates/tagged/caching/differing-expressions-new-function.js b/test/language/templates/tagged/caching/differing-expressions-new-function.js new file mode 100644 index 0000000000..4fe47eabc1 --- /dev/null +++ b/test/language/templates/tagged/caching/differing-expressions-new-function.js @@ -0,0 +1,29 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.8 +description: > + Previously-created template objects should be retrieved from the internal + template registry when their source is identical but their expressions + evaluate to different values and the tagged template is being evaluated in + an `eval` context. +---*/ +function tag(templateObject) { + previousObject = templateObject; +} +var a = 1; +var b = 2; +var firstObject = null; +var previousObject = null; + +tag`head${a}tail`; +firstObject = previousObject; +assert(firstObject !== null); +previousObject = null; + +(new Function('tag', 'a', 'b', 'return tag`head${b}tail`;'))(tag, 1, 2); +assert.sameValue( + previousObject, + firstObject, + 'The realm\'s template cache is referenced when tagged templates are declared within "new Function" contexts and templated values differ' +); diff --git a/test/language/templates/tagged/caching/differing-expressions.js b/test/language/templates/tagged/caching/differing-expressions.js new file mode 100644 index 0000000000..88495e3504 --- /dev/null +++ b/test/language/templates/tagged/caching/differing-expressions.js @@ -0,0 +1,24 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.8 +description: > + Previously-created template objects should be retrieved from the internal + template registry when their source is identical but their expressions + evaluate to different values. +---*/ +function tag(templateObject) { + previousObject = templateObject; +} +var a = 1; +var b = 2; +var firstObject = null; +var previousObject = null; + +tag`head${a}tail`; +firstObject = previousObject; +assert(firstObject !== null); +previousObject = null; + +tag`head${b}tail`; +assert.sameValue(previousObject, firstObject); diff --git a/test/language/templates/tagged/caching/differing-raw-strings.js b/test/language/templates/tagged/caching/differing-raw-strings.js new file mode 100644 index 0000000000..98bb3568ec --- /dev/null +++ b/test/language/templates/tagged/caching/differing-raw-strings.js @@ -0,0 +1,24 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.8 +description: > + The internal template registry should be queried according to the "raw" + strings of the tagged template. +---*/ +var previousObject = null; +var firstObject = null; +function tag(templateObject) { + previousObject = templateObject; +} + +tag`\uc548\ub155`; + +assert(previousObject !== null); +firstObject = previousObject; +previousObject = null; + +tag`안녕`; + +assert(previousObject !== null); +assert(firstObject !== previousObject); diff --git a/test/language/templates/tagged/caching/differing-string-count.js b/test/language/templates/tagged/caching/differing-string-count.js new file mode 100644 index 0000000000..30afbe9426 --- /dev/null +++ b/test/language/templates/tagged/caching/differing-string-count.js @@ -0,0 +1,24 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.8 +description: > + The internal template registry should be queried according to the number of + "raw" strings in the tagged template. +---*/ +var previousObject = null; +var firstObject = null; +function tag(templateObject) { + previousObject = templateObject; +} + +tag`foo${1}bar`; + +assert(previousObject !== null); +firstObject = previousObject; +previousObject = null; + +tag`foo\${1}bar`; + +assert(previousObject !== null); +assert(firstObject !== previousObject); diff --git a/test/language/templates/tagged/caching/identical-source-eval.js b/test/language/templates/tagged/caching/identical-source-eval.js new file mode 100644 index 0000000000..a835344820 --- /dev/null +++ b/test/language/templates/tagged/caching/identical-source-eval.js @@ -0,0 +1,23 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.8 +description: > + Previously-created template objects should be retrieved from the internal + template registry when their source is identical and the tagged template is + being evaluated in an `eval` context. +---*/ +function tag(templateObject) { + previousObject = templateObject; +} +var a = 1; +var firstObject = null; +var previousObject = null; + +tag`head${a}tail`; +firstObject = previousObject; +assert(firstObject !== null); +previousObject = null; + +eval('tag`head${a}tail`'); +assert.sameValue(previousObject, firstObject); diff --git a/test/language/templates/tagged/caching/identical-source-new-function.js b/test/language/templates/tagged/caching/identical-source-new-function.js new file mode 100644 index 0000000000..f262e55c8d --- /dev/null +++ b/test/language/templates/tagged/caching/identical-source-new-function.js @@ -0,0 +1,23 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.8 +description: > + Previously-created template objects should be retrieved from the internal + template registry when their source is identical and the tagged template is + being evaluated in a `new Function` context. +---*/ +function tag(templateObject) { + previousObject = templateObject; +} +var a = 1; +var firstObject = null; +var previousObject = null; + +tag`head${a}tail`; +firstObject = previousObject; +assert(firstObject !== null); +previousObject = null; + +(new Function('tag', 'a', 'b', 'return tag`head${b}tail`;'))(tag, 1, 2); +assert.sameValue(previousObject, firstObject); diff --git a/test/language/templates/tagged/caching/identical-source.js b/test/language/templates/tagged/caching/identical-source.js new file mode 100644 index 0000000000..dc844481f2 --- /dev/null +++ b/test/language/templates/tagged/caching/identical-source.js @@ -0,0 +1,26 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.2.8 +description: > + Previously-created template objects should be retrieved from the internal + template registry when their source is identical. +---*/ +function tag(templateObject) { + previousObject = templateObject; +} +var a = 1; +var firstObject = null; +var previousObject = null; + +tag`head${a}tail`; +firstObject = previousObject; +assert(firstObject !== null); +previousObject = null; + +tag`head${a}tail`; +assert.sameValue( + previousObject, + firstObject, + 'The realm\'s template cache is used when tagged templates are executed in the source code directly' +); diff --git a/test/language/templates/tagged/call-expression-argument-list-evaluation.js b/test/language/templates/tagged/call-expression-argument-list-evaluation.js new file mode 100644 index 0000000000..ea2b12496e --- /dev/null +++ b/test/language/templates/tagged/call-expression-argument-list-evaluation.js @@ -0,0 +1,38 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.3.7 +description: > + A tagged template is a function call where the arguments of the call are + derived from a TemplateLiteral. The actual arguments include a template + object and the values produced by evaluating the expressions embedded + within the TemplateLiteral. +---*/ + +var number = 5; +var string = 'str'; +var object = {}; +function fn() { return 'result'; } +var calls; + +calls = 0; +(function() { + calls++; + assert.sameValue( + arguments.length, 1, 'NoSubstitutionTemplate arguments length' + ); +})`NoSubstitutionTemplate`; +assert.sameValue(calls, 1, 'NoSubstitutionTemplate function invocation'); + +calls = 0; +(function(site, n, s, o, f, r) { + calls++; + assert.sameValue(arguments.length, 6); + assert.sameValue(n, number); + assert.sameValue(s, string); + assert.sameValue(o, object); + assert.sameValue(f, fn); + assert.sameValue(r, 'result'); + assert.sameValue(arguments.length, 6, 'TemplateHead arguments length'); +})`TemplateHead${number}TemplateSpans${string}${object}${fn}${fn()}`; +assert.sameValue(calls, 1, 'TemplateHead function invocation'); diff --git a/test/language/templates/tagged/chained-application.js b/test/language/templates/tagged/chained-application.js new file mode 100644 index 0000000000..55dea95a1d --- /dev/null +++ b/test/language/templates/tagged/chained-application.js @@ -0,0 +1,20 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.3.7 +description: > + Tagged templates may be chained and are applied in a left-to-right order. +---*/ + +var callCount = 0; +var expected = ['x', 'y', 'z']; +var tag = function(templateObject) { + assert.sameValue(templateObject[0], expected[callCount]); + callCount++; + return tag; +} + +var result = tag`x``y``z`; + +assert.sameValue(callCount, 3); +assert.sameValue(result, tag); diff --git a/test/language/templates/tagged/constructor-invocation.js b/test/language/templates/tagged/constructor-invocation.js new file mode 100644 index 0000000000..1e68e3736c --- /dev/null +++ b/test/language/templates/tagged/constructor-invocation.js @@ -0,0 +1,27 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.3.7 +description: > + Tagged template application takes precedence over `new` invocation. +---*/ + +function Constructor(x) { + arg = x; +} +var tag = function(x) { + templateObject = x; + return Constructor; +}; +var arg = null; +var instance, templateObject; + +instance = new tag`first template`; + +assert(instance instanceof Constructor); +assert.sameValue(templateObject[0], 'first template'); +assert.sameValue(arg, undefined); + +instance = new tag`second template`('constructor argument'); +assert.sameValue(templateObject[0], 'second template', 'tagging function'); +assert.sameValue(arg, 'constructor argument'); diff --git a/test/language/templates/tagged/member-expression-context.js b/test/language/templates/tagged/member-expression-context.js new file mode 100644 index 0000000000..818a9e50c6 --- /dev/null +++ b/test/language/templates/tagged/member-expression-context.js @@ -0,0 +1,20 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.3.7 +description: > + A tagged template is a function call where the arguments of the call are + derived from a TemplateLiteral. The actual arguments include a template + object and the values produced by evaluating the expressions embedded + within the TemplateLiteral. +---*/ +var context; +var obj = { + fn: function() { + context = this; + } +}; + +obj.fn`NoSubstitutionTemplate`; + +assert.sameValue(context, obj); diff --git a/test/language/templates/tagged/template-object.js b/test/language/templates/tagged/template-object.js new file mode 100644 index 0000000000..bf1bd30a58 --- /dev/null +++ b/test/language/templates/tagged/template-object.js @@ -0,0 +1,47 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 12.3.7 +description: > + The first argument to a tagged template should be a template object as + defined by the GetTemplateObject abstract operation. +includes: [propertyHelper.js] +---*/ +var templateObject; + +(function(parameter) { + templateObject = parameter; +})`${1}`; + +templateObject.test262Prop = true; +assert.sameValue( + templateObject.test262Prop, undefined, 'The template object is frozen' +); +assert(Array.isArray(templateObject.raw), 'The template object is an array'); + +assert(templateObject.hasOwnProperty('raw')); +verifyNotEnumerable(templateObject, 'raw'); +verifyNotWritable(templateObject, 'raw') +verifyNotConfigurable(templateObject, 'raw'); + +templateObject.raw.test262Prop = true; +assert.sameValue( + templateObject.raw.test262Prop, undefined, 'The "raw" object is frozen' +); +assert(Array.isArray(templateObject), 'The "raw" object is an array'); + +verifyEnumerable(templateObject, '0'); +verifyNotWritable(templateObject, '0') +verifyNotConfigurable(templateObject, '0'); + +verifyNotEnumerable(templateObject, 'length'); +verifyNotWritable(templateObject, 'length') +verifyNotConfigurable(templateObject, 'length'); + +verifyEnumerable(templateObject.raw, '0'); +verifyNotWritable(templateObject.raw, '0') +verifyNotConfigurable(templateObject.raw, '0'); + +verifyNotEnumerable(templateObject.raw, 'length'); +verifyNotWritable(templateObject.raw, 'length') +verifyNotConfigurable(templateObject.raw, 'length'); diff --git a/test/language/templates/template-values/character-escape-sequence.js b/test/language/templates/template-values/character-escape-sequence.js new file mode 100644 index 0000000000..cf3fecbd97 --- /dev/null +++ b/test/language/templates/template-values/character-escape-sequence.js @@ -0,0 +1,88 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 11.8.6 +description: > + The TRV of CharacterEscapeSequence :: SingleEscapeCharacter is the TRV of + the SingleEscapeCharacter. + The TRV of CharacterEscapeSequence :: NonEscapeCharacter is the CV of the + NonEscapeCharacter. +---*/ +var calls; + +calls = 0; +(function(s) { + calls++; + assert.sameValue(s.raw[0], "\u005C\u0027"); +})`\'`; +assert.sameValue(calls, 1); + +calls = 0; +(function(s) { + calls++; + assert.sameValue(s.raw[0], "\u005C\u0022"); +})`\"`; +assert.sameValue(calls, 1); + +calls = 0; +(function(s) { + calls++; + assert.sameValue(s.raw[0], "\u005C\u005C"); +})`\\`; +assert.sameValue(calls, 1); + +calls = 0; +(function(s) { + calls++; + assert.sameValue(s.raw[0], "\u005Cb"); +})`\b`; +assert.sameValue(calls, 1); + +calls = 0; +(function(s) { + calls++; + assert.sameValue(s.raw[0], "\u005Cf"); +})`\f`; +assert.sameValue(calls, 1); + +calls = 0; +(function(s) { + calls++; + assert.sameValue(s.raw[0], "\u005Cn"); +})`\n`; +assert.sameValue(calls, 1); + +calls = 0; +(function(s) { + calls++; + assert.sameValue(s.raw[0], "\u005Cr"); +})`\r`; +assert.sameValue(calls, 1); + +calls = 0; +(function(s) { + calls++; + assert.sameValue(s.raw[0], "\u005Ct"); +})`\t`; +assert.sameValue(calls, 1); + +calls = 0; +(function(s) { + calls++; + assert.sameValue(s.raw[0], "\u005Cv"); +})`\v`; +assert.sameValue(calls, 1); + +calls = 0; +(function(s) { + calls++; + assert.sameValue(s.raw[0], "\u005C`"); +})`\``; +assert.sameValue(calls, 1); + +calls = 0; +(function(s) { + calls++; + assert.sameValue(s.raw[0], "\u005Cz"); +})`\z`; +assert.sameValue(calls, 1); diff --git a/test/language/templates/template-values/escape-sequence.js b/test/language/templates/template-values/escape-sequence.js new file mode 100644 index 0000000000..e3e0ee8275 --- /dev/null +++ b/test/language/templates/template-values/escape-sequence.js @@ -0,0 +1,39 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 11.8.6 +description: > + The TV of TemplateCharacter :: \ EscapeSequence is the SV of + EscapeSequence. + The TRV of EscapeSequence :: 0 is the code unit value 0x0030. + The TRV of EscapeSequence :: HexEscapeSequence is the TRV of the + HexEscapeSequence. + The TRV of EscapeSequence :: UnicodeEscapeSequence is the TRV of the + UnicodeEscapeSequence. +---*/ +var calls; + +calls = 0; +(function(s) { + calls++; + assert.sameValue(s[0], '', '`\\0` sequence template value'); + assert.sameValue(s.raw[0], '\\0', '`\\0` sequence template raw value'); +})`\0`; +assert.sameValue(calls, 1); + +calls = 0; +(function(s) { + calls++; + assert.sameValue(s[0], 'ÿ', 'HexEscapeSequence template value'); + assert.sameValue(s.raw[0], '\\xff', 'HexEscapeSequence template raw value'); +})`\xff`; +assert.sameValue(calls, 1); + +calls = 0; +(function(s) { + calls++; + assert.sameValue( + s.raw[0], '\\uc548', 'UnicodeEscapeSequence template raw value' + ); +})`\uc548`; +assert.sameValue(calls, 1); diff --git a/test/language/templates/template-values/invalid/hexidecimal-character-escape-sequence-truncated.js b/test/language/templates/template-values/invalid/hexidecimal-character-escape-sequence-truncated.js new file mode 100644 index 0000000000..49403e12d8 --- /dev/null +++ b/test/language/templates/template-values/invalid/hexidecimal-character-escape-sequence-truncated.js @@ -0,0 +1,11 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 11.8.6 +description: > + The TV of TemplateCharacter :: \ EscapeSequence is the SV of + EscapeSequence. +negative: SyntaxError +---*/ + +(function() {})`\x`; diff --git a/test/language/templates/template-values/invalid/legacy-octal-escape-sequence.js b/test/language/templates/template-values/invalid/legacy-octal-escape-sequence.js new file mode 100644 index 0000000000..56a7611d88 --- /dev/null +++ b/test/language/templates/template-values/invalid/legacy-octal-escape-sequence.js @@ -0,0 +1,11 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 16.1 +description: > + TemplateCharacter (11.8.6) must not be extended to include + LegacyOctalEscapeSequence as defined in B.1.2. +negative: SyntaxError +---*/ + +(function() {})`\00`; diff --git a/test/language/templates/template-values/invalid/unicode-escape-sequence-truncated.js b/test/language/templates/template-values/invalid/unicode-escape-sequence-truncated.js new file mode 100644 index 0000000000..4a228da532 --- /dev/null +++ b/test/language/templates/template-values/invalid/unicode-escape-sequence-truncated.js @@ -0,0 +1,11 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 11.8.6 +description: > + The TV of TemplateCharacter :: \ EscapeSequence is the SV of + EscapeSequence. +negative: SyntaxError +---*/ + +(function() {})`\u`; diff --git a/test/language/templates/template-values/line-continuation.js b/test/language/templates/template-values/line-continuation.js new file mode 100644 index 0000000000..8488a99c4f --- /dev/null +++ b/test/language/templates/template-values/line-continuation.js @@ -0,0 +1,19 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 11.8.6 +description: > + The TRV of LineContinuation :: \ LineTerminatorSequence is the sequence + consisting of the code unit value 0x005C followed by the code units of TRV + of LineTerminatorSequence. +---*/ +var calls; + +calls = 0; +(function(cs) { + calls++; + assert.sameValue(cs.raw[0], '\u005C\n\u005C\n\u005C\n'); +})`\ +\ +\ ` +assert.sameValue(calls, 1); diff --git a/test/language/templates/template-values/line-terminator-sequence.js b/test/language/templates/template-values/line-terminator-sequence.js new file mode 100644 index 0000000000..507b5816a4 --- /dev/null +++ b/test/language/templates/template-values/line-terminator-sequence.js @@ -0,0 +1,20 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 11.8.6 +description: > + The TRV of LineTerminatorSequence :: is the code unit value 0x000A. + The TRV of LineTerminatorSequence :: is the code unit value 0x000A. + The TRV of LineTerminatorSequence :: is the sequence consisting of + the code unit value 0x000A. +---*/ +var calls; + +calls = 0; +(function(s) { + calls++; + assert.sameValue(s.raw[0], '\n\n\n'); +})` + + `; +assert.sameValue(calls, 1); diff --git a/test/language/templates/template-values/multi-line.js b/test/language/templates/template-values/multi-line.js new file mode 100644 index 0000000000..cafb05179a --- /dev/null +++ b/test/language/templates/template-values/multi-line.js @@ -0,0 +1,13 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 11.8.6 +description: > + The TV of TemplateCharacter :: \ EscapeSequence is the SV of + EscapeSequence. +---*/ +assert.sameValue(`foo + bar + baz`, 'foo\n bar\n baz'); + +assert.sameValue(eval('`foo\r\n bar\r baz`'), 'foo\n bar\n baz'); diff --git a/test/language/templates/template-values/no-substitution.js b/test/language/templates/template-values/no-substitution.js new file mode 100644 index 0000000000..6812185834 --- /dev/null +++ b/test/language/templates/template-values/no-substitution.js @@ -0,0 +1,27 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 11.8.6 +description: > + The TV and TRV of NoSubstitutionTemplate :: `` is the empty code unit + sequence. + The TV of NoSubstitutionTemplate :: ` TemplateCharacters ` is the TV of + TemplateCharacters. +---*/ + +var calls; + +calls = 0; +(function(s) { + calls++; + assert.sameValue(s[0], '', 'Template value (empty)'); + assert.sameValue(s.raw[0], '', 'Template raw value (empty)'); +})``; +assert.sameValue(calls, 1); + +calls = 0; +(function(s) { + calls++; + assert.sameValue(s[0], 'foo', 'Template value (with content)'); +})`foo`; +assert.sameValue(calls, 1); diff --git a/test/language/templates/template-values/non-escape-character.js b/test/language/templates/template-values/non-escape-character.js new file mode 100644 index 0000000000..031c797325 --- /dev/null +++ b/test/language/templates/template-values/non-escape-character.js @@ -0,0 +1,15 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 11.8.6 +description: > + The TV of TemplateCharacter :: \ EscapeSequence is the SV of + EscapeSequence. + The SV of CharacterEscapeSequence :: NonEscapeCharacter is the SV of the + NonEscapeCharacter. +---*/ + +assert.sameValue(`\8`, "8"); +assert.sameValue(`\9`, "9"); +assert.sameValue(`\08`, "8"); +assert.sameValue(`\09`, "9"); diff --git a/test/language/templates/template-values/null-character-escape-sequence.js b/test/language/templates/template-values/null-character-escape-sequence.js new file mode 100644 index 0000000000..c7eadf0365 --- /dev/null +++ b/test/language/templates/template-values/null-character-escape-sequence.js @@ -0,0 +1,17 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 11.8.6 +description: > + The TV of TemplateCharacter :: \ EscapeSequence is the SV of + EscapeSequence. + The TRV of EscapeSequence :: 0 is the code unit value 0x0030. +---*/ +var calls = 0; + +(function(s) { + calls++; + assert.sameValue(s[0], '', '"Cookied" value'); + assert.sameValue(s.raw[0], '\\0', '"Raw" value'); +})`\0`; +assert.sameValue(calls, 1); diff --git a/test/language/templates/template-values/template-character.js b/test/language/templates/template-values/template-character.js new file mode 100644 index 0000000000..7b2e0aae6b --- /dev/null +++ b/test/language/templates/template-values/template-character.js @@ -0,0 +1,29 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 11.8.6 +description: > + The TV of TemplateCharacter :: $ is the code unit value 0x0024. + The TV of TemplateCharacter :: \ EscapeSequence is the CV of + EscapeSequence. + The TV of TemplateCharacter :: LineContinuation is the TV of + LineContinuation. The TV of LineContinuation :: \ LineTerminatorSequence is + the empty code unit sequence. + The TRV of TemplateCharacter :: $ is the code unit value 0x0024. +---*/ + +var calls; + +assert.sameValue(`\uc548\uB155`, "안녕"); +assert.sameValue(`\xff`, "\xff"); +assert.sameValue(`\n`, "\n"); +assert.sameValue(`\ +`, ''); + +calls = 0; +(function(s) { + calls++; + assert.sameValue(s[0], '$', '`$` character template value'); + assert.sameValue(s.raw[0], '$', '`$` character template raw value'); +})`$`; +assert.sameValue(calls, 1); diff --git a/test/language/templates/template-values/template-characters.js b/test/language/templates/template-values/template-characters.js new file mode 100644 index 0000000000..8d1b7fb357 --- /dev/null +++ b/test/language/templates/template-values/template-characters.js @@ -0,0 +1,24 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 11.8.6 +description: > + The TV of TemplateCharacters :: TemplateCharacter is the TV of + TemplateCharacter. + The TV of NoSubstitutionTemplate :: ` TemplateCharacters ` is the TV of + TemplateCharacters. + The TRV of TemplateCharacters :: TemplateCharacter is the TRV of + TemplateCharacter. +---*/ + +var calls; + +calls = 0; +(function(s) { + calls++; + assert.sameValue(s[0], 'f', 'TemplateCharacters template value'); + assert.sameValue(s.raw[0], 'f', 'TemplateCharacters template raw value'); +})`f`; +assert.sameValue(calls, 1); + +assert.sameValue(`test`, 'test', 'TemplateCharacters template value'); diff --git a/test/language/templates/template-values/template-head.js b/test/language/templates/template-values/template-head.js new file mode 100644 index 0000000000..b73dd3b563 --- /dev/null +++ b/test/language/templates/template-values/template-head.js @@ -0,0 +1,29 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 11.8.6 +description: > + The TV and TRV of TemplateHead :: `${ is the empty code unit sequence. + The TV of TemplateHead :: ` TemplateCharacters ${ is the TV of + TemplateCharacters. + The TRV of TemplateHead :: ` TemplateCharacters ${ is the TRV of + TemplateCharacters. +---*/ + +var calls; + +calls = 0; +(function(s) { + calls++; + assert.sameValue(s[0], '', 'Template value (empty)'); + assert.sameValue(s.raw[0], '', 'Template raw value (empty)'); +})`${1}`; +assert.sameValue(calls, 1); + +calls = 0; +(function(s) { + calls++; + assert.sameValue(s[0], 'foo', 'Template value (with content)'); + assert.sameValue(s.raw[0], 'foo', 'Template raw value (with content)'); +})`foo${1}`; +assert.sameValue(calls, 1); diff --git a/test/language/templates/template-values/template-middle.js b/test/language/templates/template-values/template-middle.js new file mode 100644 index 0000000000..db100e9239 --- /dev/null +++ b/test/language/templates/template-values/template-middle.js @@ -0,0 +1,29 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 11.8.6 +description: > + The TV and TRV of TemplateMiddle :: }${ is the empty code unit sequence. + The TV of TemplateMiddle :: } TemplateCharacters ${ is the TV of + TemplateCharacters. + The TRV of TemplateMiddle :: } TemplateCharacters ${ is the TRV of + TemplateCharacters. +---*/ + +var calls; + +calls = 0; +(function(s) { + calls++; + assert.sameValue(s[1], '', 'Template value (empty)'); + assert.sameValue(s.raw[1], '', 'Template raw value (empty)'); +})`${1}${2}`; +assert.sameValue(calls, 1); + +calls = 0; +(function(s) { + calls++; + assert.sameValue(s[1], 'foo', 'Template value (with content)'); + assert.sameValue(s.raw[1], 'foo', 'Template raw value (with content)'); +})`${1}foo${2}`; +assert.sameValue(calls, 1); diff --git a/test/language/templates/template-values/template-tail.js b/test/language/templates/template-values/template-tail.js new file mode 100644 index 0000000000..541883eedb --- /dev/null +++ b/test/language/templates/template-values/template-tail.js @@ -0,0 +1,29 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 11.8.6 +description: > + The TV and TRV of TemplateTail :: }` is the empty code unit sequence. + The TV of TemplateTail :: } TemplateCharacters ` is the TV of + TemplateCharacters. + The TRV of TemplateTail :: } TemplateCharacters ` is the TRV of + TemplateCharacters. +---*/ + +var calls; + +calls = 0; +(function(s) { + calls++; + assert.sameValue(s[1], '', 'Template value (empty)'); + assert.sameValue(s.raw[1], '', 'Template raw value (empty)'); +})`${1}`; +assert.sameValue(calls, 1); + +calls = 0; +(function(s) { + calls++; + assert.sameValue(s[1], 'foo', 'Template value (with content)'); + assert.sameValue(s.raw[1], 'foo', 'Template raw value (with content)'); +})`${1}foo`; +assert.sameValue(calls, 1); diff --git a/test/language/templates/template-values/utf16-escape-sequence.js b/test/language/templates/template-values/utf16-escape-sequence.js new file mode 100644 index 0000000000..14fa3b500a --- /dev/null +++ b/test/language/templates/template-values/utf16-escape-sequence.js @@ -0,0 +1,29 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 11.1 +description: > + The SV of UnicodeEscapeSequence :: u{ HexDigits } is the UTF16Encoding + (10.1.1) of the MV of HexDigits. + The TRV of UnicodeEscapeSequence :: u{ HexDigits } is the sequence + consisting of code unit value 0x0075 followed by code unit value 0x007B + followed by TRV of HexDigits followed by code unit value 0x007D. +---*/ + +var calls; + +calls = 0; +(function(s) { + calls++; + assert.sameValue(s[0], 'abc', '`` sequence template value'); + assert.sameValue(s.raw[0], 'a\\u{62}c', '`` sequence template raw value'); +})`a\u{62}c`; +assert.sameValue(calls, 1); + +calls = 0; +(function(s) { + calls++; + assert.sameValue(s[0], 'abc', 'HexEscapeSequence template value'); + assert.sameValue(s.raw[0], 'a\\u{000062}c', 'HexEscapeSequence template raw value'); +})`a\u{000062}c`; +assert.sameValue(calls, 1); diff --git a/test/language/templates/template-values/zwnbsp.js b/test/language/templates/template-values/zwnbsp.js new file mode 100644 index 0000000000..f4d095dc99 --- /dev/null +++ b/test/language/templates/template-values/zwnbsp.js @@ -0,0 +1,15 @@ +// Copyright (C) Copyright 2014 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +es6id: 11.1 +description: > + The zero width no-break space format-control character may be used within + template literals. +---*/ + +assert.sameValue( + `\uFEFFtest`, 'test', 'Specified via unicode escape sequence' +); +assert.sameValue( + `test`, 'test', 'Specified via literal character' +);