// Copyright 2017 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Flags: --harmony-template-escapes // This test is added because harmony-template-escapes were not properly // handled in the preparser. function check({cooked, raw, exprs}) { return function(strs, ...args) { assertArrayEquals(cooked, strs); assertArrayEquals(raw, strs.raw); assertArrayEquals(exprs, args); }; } // clang-format off function lazy() { check({ 'cooked': [ undefined ], 'raw': [ '\\01' ], 'exprs': [] })`\01`; check({ 'cooked': [ undefined, 'right' ], 'raw': [ '\\01', 'right' ], 'exprs': [ 0 ] })`\01${0}right`; check({ 'cooked': [ 'left', undefined ], 'raw': [ 'left', '\\01' ], 'exprs': [ 0 ] })`left${0}\01`; check({ 'cooked': [ 'left', undefined, 'right' ], 'raw': [ 'left', '\\01', 'right' ], 'exprs': [ 0, 1 ] })`left${0}\01${1}right`; check({ 'cooked': [ undefined ], 'raw': [ '\\1' ], 'exprs': [] })`\1`; check({ 'cooked': [ undefined, 'right' ], 'raw': [ '\\1', 'right' ], 'exprs': [ 0 ] })`\1${0}right`; check({ 'cooked': [ 'left', undefined ], 'raw': [ 'left', '\\1' ], 'exprs': [ 0 ] })`left${0}\1`; check({ 'cooked': [ 'left', undefined, 'right' ], 'raw': [ 'left', '\\1', 'right' ], 'exprs': [ 0, 1 ] })`left${0}\1${1}right`; check({ 'cooked': [ undefined ], 'raw': [ '\\xg' ], 'exprs': [] })`\xg`; check({ 'cooked': [ undefined, 'right' ], 'raw': [ '\\xg', 'right' ], 'exprs': [ 0 ] })`\xg${0}right`; check({ 'cooked': [ 'left', undefined ], 'raw': [ 'left', '\\xg' ], 'exprs': [ 0 ] })`left${0}\xg`; check({ 'cooked': [ 'left', undefined, 'right' ], 'raw': [ 'left', '\\xg', 'right' ], 'exprs': [ 0, 1 ] })`left${0}\xg${1}right`; check({ 'cooked': [ undefined ], 'raw': [ '\\xAg' ], 'exprs': [] })`\xAg`; check({ 'cooked': [ undefined, 'right' ], 'raw': [ '\\xAg', 'right' ], 'exprs': [ 0 ] })`\xAg${0}right`; check({ 'cooked': [ 'left', undefined ], 'raw': [ 'left', '\\xAg' ], 'exprs': [ 0 ] })`left${0}\xAg`; check({ 'cooked': [ 'left', undefined, 'right' ], 'raw': [ 'left', '\\xAg', 'right' ], 'exprs': [ 0, 1 ] })`left${0}\xAg${1}right`; check({ 'cooked': [ undefined ], 'raw': [ '\\u0' ], 'exprs': [] })`\u0`; check({ 'cooked': [ undefined, 'right' ], 'raw': [ '\\u0', 'right' ], 'exprs': [ 0 ] })`\u0${0}right`; check({ 'cooked': [ 'left', undefined ], 'raw': [ 'left', '\\u0' ], 'exprs': [ 0 ] })`left${0}\u0`; check({ 'cooked': [ 'left', undefined, 'right' ], 'raw': [ 'left', '\\u0', 'right' ], 'exprs': [ 0, 1 ] })`left${0}\u0${1}right`; check({ 'cooked': [ undefined ], 'raw': [ '\\u0g' ], 'exprs': [] })`\u0g`; check({ 'cooked': [ undefined, 'right' ], 'raw': [ '\\u0g', 'right' ], 'exprs': [ 0 ] })`\u0g${0}right`; check({ 'cooked': [ 'left', undefined ], 'raw': [ 'left', '\\u0g' ], 'exprs': [ 0 ] })`left${0}\u0g`; check({ 'cooked': [ 'left', undefined, 'right' ], 'raw': [ 'left', '\\u0g', 'right' ], 'exprs': [ 0, 1 ] })`left${0}\u0g${1}right`; check({ 'cooked': [ undefined ], 'raw': [ '\\u00g' ], 'exprs': [] })`\u00g`; check({ 'cooked': [ undefined, 'right' ], 'raw': [ '\\u00g', 'right' ], 'exprs': [ 0 ] })`\u00g${0}right`; check({ 'cooked': [ 'left', undefined ], 'raw': [ 'left', '\\u00g' ], 'exprs': [ 0 ] })`left${0}\u00g`; check({ 'cooked': [ 'left', undefined, 'right' ], 'raw': [ 'left', '\\u00g', 'right' ], 'exprs': [ 0, 1 ] })`left${0}\u00g${1}right`; check({ 'cooked': [ undefined ], 'raw': [ '\\u000g' ], 'exprs': [] })`\u000g`; check({ 'cooked': [ undefined, 'right' ], 'raw': [ '\\u000g', 'right' ], 'exprs': [ 0 ] })`\u000g${0}right`; check({ 'cooked': [ 'left', undefined ], 'raw': [ 'left', '\\u000g' ], 'exprs': [ 0 ] })`left${0}\u000g`; check({ 'cooked': [ 'left', undefined, 'right' ], 'raw': [ 'left', '\\u000g', 'right' ], 'exprs': [ 0, 1 ] })`left${0}\u000g${1}right`; check({ 'cooked': [ undefined ], 'raw': [ '\\u{}' ], 'exprs': [] })`\u{}`; check({ 'cooked': [ undefined, 'right' ], 'raw': [ '\\u{}', 'right' ], 'exprs': [ 0 ] })`\u{}${0}right`; check({ 'cooked': [ 'left', undefined ], 'raw': [ 'left', '\\u{}' ], 'exprs': [ 0 ] })`left${0}\u{}`; check({ 'cooked': [ 'left', undefined, 'right' ], 'raw': [ 'left', '\\u{}', 'right' ], 'exprs': [ 0, 1 ] })`left${0}\u{}${1}right`; check({ 'cooked': [ undefined ], 'raw': [ '\\u{-0}' ], 'exprs': [] })`\u{-0}`; check({ 'cooked': [ undefined, 'right' ], 'raw': [ '\\u{-0}', 'right' ], 'exprs': [ 0 ] })`\u{-0}${0}right`; check({ 'cooked': [ 'left', undefined ], 'raw': [ 'left', '\\u{-0}' ], 'exprs': [ 0 ] })`left${0}\u{-0}`; check({ 'cooked': [ 'left', undefined, 'right' ], 'raw': [ 'left', '\\u{-0}', 'right' ], 'exprs': [ 0, 1 ] })`left${0}\u{-0}${1}right`; check({ 'cooked': [ undefined ], 'raw': [ '\\u{g}' ], 'exprs': [] })`\u{g}`; check({ 'cooked': [ undefined, 'right' ], 'raw': [ '\\u{g}', 'right' ], 'exprs': [ 0 ] })`\u{g}${0}right`; check({ 'cooked': [ 'left', undefined ], 'raw': [ 'left', '\\u{g}' ], 'exprs': [ 0 ] })`left${0}\u{g}`; check({ 'cooked': [ 'left', undefined, 'right' ], 'raw': [ 'left', '\\u{g}', 'right' ], 'exprs': [ 0, 1 ] })`left${0}\u{g}${1}right`; check({ 'cooked': [ undefined ], 'raw': [ '\\u{0' ], 'exprs': [] })`\u{0`; check({ 'cooked': [ undefined, 'right' ], 'raw': [ '\\u{0', 'right' ], 'exprs': [ 0 ] })`\u{0${0}right`; check({ 'cooked': [ 'left', undefined ], 'raw': [ 'left', '\\u{0' ], 'exprs': [ 0 ] })`left${0}\u{0`; check({ 'cooked': [ 'left', undefined, 'right' ], 'raw': [ 'left', '\\u{0', 'right' ], 'exprs': [ 0, 1 ] })`left${0}\u{0${1}right`; check({ 'cooked': [ undefined ], 'raw': [ '\\u{\\u{0}' ], 'exprs': [] })`\u{\u{0}`; check({ 'cooked': [ undefined, 'right' ], 'raw': [ '\\u{\\u{0}', 'right' ], 'exprs': [ 0 ] })`\u{\u{0}${0}right`; check({ 'cooked': [ 'left', undefined ], 'raw': [ 'left', '\\u{\\u{0}' ], 'exprs': [ 0 ] })`left${0}\u{\u{0}`; check({ 'cooked': [ 'left', undefined, 'right' ], 'raw': [ 'left', '\\u{\\u{0}', 'right' ], 'exprs': [ 0, 1 ] })`left${0}\u{\u{0}${1}right`; check({ 'cooked': [ undefined ], 'raw': [ '\\u{110000}' ], 'exprs': [] })`\u{110000}`; check({ 'cooked': [ undefined, 'right' ], 'raw': [ '\\u{110000}', 'right' ], 'exprs': [ 0 ] })`\u{110000}${0}right`; check({ 'cooked': [ 'left', undefined ], 'raw': [ 'left', '\\u{110000}' ], 'exprs': [ 0 ] })`left${0}\u{110000}`; check({ 'cooked': [ 'left', undefined, 'right' ], 'raw': [ 'left', '\\u{110000}', 'right' ], 'exprs': [ 0, 1 ] })`left${0}\u{110000}${1}right`; function checkMultiple(expectedArray) { let results = []; return function consume(strs, ...args) { if (typeof strs === 'undefined') { assertArrayEquals(expectedArray, results); } else { results.push({cooked: strs, raw: strs.raw, exprs: args}); return consume; } }; } checkMultiple([{ 'cooked': [ undefined ], 'raw': [ '\\u', ], 'exprs': [] }, { 'cooked': [ undefined ], 'raw': [ '\\u', ], 'exprs': [] }])`\u``\u`(); checkMultiple([{ 'cooked': [ ' ' ], 'raw': [ ' ', ], 'exprs': [] }, { 'cooked': [ undefined ], 'raw': [ '\\u', ], 'exprs': [] }])` ``\u`(); checkMultiple([{ 'cooked': [ undefined ], 'raw': [ '\\u', ], 'exprs': [] }, { 'cooked': [ ' ' ], 'raw': [ ' ', ], 'exprs': [] }])`\u`` `(); checkMultiple([{ 'cooked': [ ' ' ], 'raw': [ ' ', ], 'exprs': [] }, { 'cooked': [ ' ' ], 'raw': [ ' ', ], 'exprs': [] }])` `` `(); } (function eager() { check({ 'cooked': [ undefined ], 'raw': [ '\\01' ], 'exprs': [] })`\01`; check({ 'cooked': [ undefined, 'right' ], 'raw': [ '\\01', 'right' ], 'exprs': [ 0 ] })`\01${0}right`; check({ 'cooked': [ 'left', undefined ], 'raw': [ 'left', '\\01' ], 'exprs': [ 0 ] })`left${0}\01`; check({ 'cooked': [ 'left', undefined, 'right' ], 'raw': [ 'left', '\\01', 'right' ], 'exprs': [ 0, 1 ] })`left${0}\01${1}right`; check({ 'cooked': [ undefined ], 'raw': [ '\\1' ], 'exprs': [] })`\1`; check({ 'cooked': [ undefined, 'right' ], 'raw': [ '\\1', 'right' ], 'exprs': [ 0 ] })`\1${0}right`; check({ 'cooked': [ 'left', undefined ], 'raw': [ 'left', '\\1' ], 'exprs': [ 0 ] })`left${0}\1`; check({ 'cooked': [ 'left', undefined, 'right' ], 'raw': [ 'left', '\\1', 'right' ], 'exprs': [ 0, 1 ] })`left${0}\1${1}right`; check({ 'cooked': [ undefined ], 'raw': [ '\\xg' ], 'exprs': [] })`\xg`; check({ 'cooked': [ undefined, 'right' ], 'raw': [ '\\xg', 'right' ], 'exprs': [ 0 ] })`\xg${0}right`; check({ 'cooked': [ 'left', undefined ], 'raw': [ 'left', '\\xg' ], 'exprs': [ 0 ] })`left${0}\xg`; check({ 'cooked': [ 'left', undefined, 'right' ], 'raw': [ 'left', '\\xg', 'right' ], 'exprs': [ 0, 1 ] })`left${0}\xg${1}right`; check({ 'cooked': [ undefined ], 'raw': [ '\\xAg' ], 'exprs': [] })`\xAg`; check({ 'cooked': [ undefined, 'right' ], 'raw': [ '\\xAg', 'right' ], 'exprs': [ 0 ] })`\xAg${0}right`; check({ 'cooked': [ 'left', undefined ], 'raw': [ 'left', '\\xAg' ], 'exprs': [ 0 ] })`left${0}\xAg`; check({ 'cooked': [ 'left', undefined, 'right' ], 'raw': [ 'left', '\\xAg', 'right' ], 'exprs': [ 0, 1 ] })`left${0}\xAg${1}right`; check({ 'cooked': [ undefined ], 'raw': [ '\\u0' ], 'exprs': [] })`\u0`; check({ 'cooked': [ undefined, 'right' ], 'raw': [ '\\u0', 'right' ], 'exprs': [ 0 ] })`\u0${0}right`; check({ 'cooked': [ 'left', undefined ], 'raw': [ 'left', '\\u0' ], 'exprs': [ 0 ] })`left${0}\u0`; check({ 'cooked': [ 'left', undefined, 'right' ], 'raw': [ 'left', '\\u0', 'right' ], 'exprs': [ 0, 1 ] })`left${0}\u0${1}right`; check({ 'cooked': [ undefined ], 'raw': [ '\\u0g' ], 'exprs': [] })`\u0g`; check({ 'cooked': [ undefined, 'right' ], 'raw': [ '\\u0g', 'right' ], 'exprs': [ 0 ] })`\u0g${0}right`; check({ 'cooked': [ 'left', undefined ], 'raw': [ 'left', '\\u0g' ], 'exprs': [ 0 ] })`left${0}\u0g`; check({ 'cooked': [ 'left', undefined, 'right' ], 'raw': [ 'left', '\\u0g', 'right' ], 'exprs': [ 0, 1 ] })`left${0}\u0g${1}right`; check({ 'cooked': [ undefined ], 'raw': [ '\\u00g' ], 'exprs': [] })`\u00g`; check({ 'cooked': [ undefined, 'right' ], 'raw': [ '\\u00g', 'right' ], 'exprs': [ 0 ] })`\u00g${0}right`; check({ 'cooked': [ 'left', undefined ], 'raw': [ 'left', '\\u00g' ], 'exprs': [ 0 ] })`left${0}\u00g`; check({ 'cooked': [ 'left', undefined, 'right' ], 'raw': [ 'left', '\\u00g', 'right' ], 'exprs': [ 0, 1 ] })`left${0}\u00g${1}right`; check({ 'cooked': [ undefined ], 'raw': [ '\\u000g' ], 'exprs': [] })`\u000g`; check({ 'cooked': [ undefined, 'right' ], 'raw': [ '\\u000g', 'right' ], 'exprs': [ 0 ] })`\u000g${0}right`; check({ 'cooked': [ 'left', undefined ], 'raw': [ 'left', '\\u000g' ], 'exprs': [ 0 ] })`left${0}\u000g`; check({ 'cooked': [ 'left', undefined, 'right' ], 'raw': [ 'left', '\\u000g', 'right' ], 'exprs': [ 0, 1 ] })`left${0}\u000g${1}right`; check({ 'cooked': [ undefined ], 'raw': [ '\\u{}' ], 'exprs': [] })`\u{}`; check({ 'cooked': [ undefined, 'right' ], 'raw': [ '\\u{}', 'right' ], 'exprs': [ 0 ] })`\u{}${0}right`; check({ 'cooked': [ 'left', undefined ], 'raw': [ 'left', '\\u{}' ], 'exprs': [ 0 ] })`left${0}\u{}`; check({ 'cooked': [ 'left', undefined, 'right' ], 'raw': [ 'left', '\\u{}', 'right' ], 'exprs': [ 0, 1 ] })`left${0}\u{}${1}right`; check({ 'cooked': [ undefined ], 'raw': [ '\\u{-0}' ], 'exprs': [] })`\u{-0}`; check({ 'cooked': [ undefined, 'right' ], 'raw': [ '\\u{-0}', 'right' ], 'exprs': [ 0 ] })`\u{-0}${0}right`; check({ 'cooked': [ 'left', undefined ], 'raw': [ 'left', '\\u{-0}' ], 'exprs': [ 0 ] })`left${0}\u{-0}`; check({ 'cooked': [ 'left', undefined, 'right' ], 'raw': [ 'left', '\\u{-0}', 'right' ], 'exprs': [ 0, 1 ] })`left${0}\u{-0}${1}right`; check({ 'cooked': [ undefined ], 'raw': [ '\\u{g}' ], 'exprs': [] })`\u{g}`; check({ 'cooked': [ undefined, 'right' ], 'raw': [ '\\u{g}', 'right' ], 'exprs': [ 0 ] })`\u{g}${0}right`; check({ 'cooked': [ 'left', undefined ], 'raw': [ 'left', '\\u{g}' ], 'exprs': [ 0 ] })`left${0}\u{g}`; check({ 'cooked': [ 'left', undefined, 'right' ], 'raw': [ 'left', '\\u{g}', 'right' ], 'exprs': [ 0, 1 ] })`left${0}\u{g}${1}right`; check({ 'cooked': [ undefined ], 'raw': [ '\\u{0' ], 'exprs': [] })`\u{0`; check({ 'cooked': [ undefined, 'right' ], 'raw': [ '\\u{0', 'right' ], 'exprs': [ 0 ] })`\u{0${0}right`; check({ 'cooked': [ 'left', undefined ], 'raw': [ 'left', '\\u{0' ], 'exprs': [ 0 ] })`left${0}\u{0`; check({ 'cooked': [ 'left', undefined, 'right' ], 'raw': [ 'left', '\\u{0', 'right' ], 'exprs': [ 0, 1 ] })`left${0}\u{0${1}right`; check({ 'cooked': [ undefined ], 'raw': [ '\\u{\\u{0}' ], 'exprs': [] })`\u{\u{0}`; check({ 'cooked': [ undefined, 'right' ], 'raw': [ '\\u{\\u{0}', 'right' ], 'exprs': [ 0 ] })`\u{\u{0}${0}right`; check({ 'cooked': [ 'left', undefined ], 'raw': [ 'left', '\\u{\\u{0}' ], 'exprs': [ 0 ] })`left${0}\u{\u{0}`; check({ 'cooked': [ 'left', undefined, 'right' ], 'raw': [ 'left', '\\u{\\u{0}', 'right' ], 'exprs': [ 0, 1 ] })`left${0}\u{\u{0}${1}right`; check({ 'cooked': [ undefined ], 'raw': [ '\\u{110000}' ], 'exprs': [] })`\u{110000}`; check({ 'cooked': [ undefined, 'right' ], 'raw': [ '\\u{110000}', 'right' ], 'exprs': [ 0 ] })`\u{110000}${0}right`; check({ 'cooked': [ 'left', undefined ], 'raw': [ 'left', '\\u{110000}' ], 'exprs': [ 0 ] })`left${0}\u{110000}`; check({ 'cooked': [ 'left', undefined, 'right' ], 'raw': [ 'left', '\\u{110000}', 'right' ], 'exprs': [ 0, 1 ] })`left${0}\u{110000}${1}right`; function checkMultiple(expectedArray) { let results = []; return function consume(strs, ...args) { if (typeof strs === 'undefined') { assertArrayEquals(expectedArray, results); } else { results.push({cooked: strs, raw: strs.raw, exprs: args}); return consume; } }; } checkMultiple([{ 'cooked': [ undefined ], 'raw': [ '\\u', ], 'exprs': [] }, { 'cooked': [ undefined ], 'raw': [ '\\u', ], 'exprs': [] }])`\u``\u`(); checkMultiple([{ 'cooked': [ ' ' ], 'raw': [ ' ', ], 'exprs': [] }, { 'cooked': [ undefined ], 'raw': [ '\\u', ], 'exprs': [] }])` ``\u`(); checkMultiple([{ 'cooked': [ undefined ], 'raw': [ '\\u', ], 'exprs': [] }, { 'cooked': [ ' ' ], 'raw': [ ' ', ], 'exprs': [] }])`\u`` `(); checkMultiple([{ 'cooked': [ ' ' ], 'raw': [ ' ', ], 'exprs': [] }, { 'cooked': [ ' ' ], 'raw': [ ' ', ], 'exprs': [] }])` `` `(); })(); lazy();