diff options
Diffstat (limited to 'js/src/tests/ecma_3/extensions')
-rw-r--r-- | js/src/tests/ecma_3/extensions/10.1.3-2.js | 128 | ||||
-rw-r--r-- | js/src/tests/ecma_3/extensions/7.9.1.js | 47 | ||||
-rw-r--r-- | js/src/tests/ecma_3/extensions/browser.js | 0 | ||||
-rw-r--r-- | js/src/tests/ecma_3/extensions/regress-103087.js | 144 | ||||
-rw-r--r-- | js/src/tests/ecma_3/extensions/regress-188206-01.js | 74 | ||||
-rw-r--r-- | js/src/tests/ecma_3/extensions/regress-188206-02.js | 124 | ||||
-rw-r--r-- | js/src/tests/ecma_3/extensions/regress-220367-002.js | 78 | ||||
-rw-r--r-- | js/src/tests/ecma_3/extensions/regress-228087.js | 318 | ||||
-rw-r--r-- | js/src/tests/ecma_3/extensions/regress-274152.js | 48 | ||||
-rw-r--r-- | js/src/tests/ecma_3/extensions/regress-320854.js | 20 | ||||
-rw-r--r-- | js/src/tests/ecma_3/extensions/regress-327170.js | 25 | ||||
-rw-r--r-- | js/src/tests/ecma_3/extensions/regress-368516.js | 45 | ||||
-rw-r--r-- | js/src/tests/ecma_3/extensions/regress-385393-03.js | 30 | ||||
-rw-r--r-- | js/src/tests/ecma_3/extensions/regress-430740.js | 39 | ||||
-rw-r--r-- | js/src/tests/ecma_3/extensions/shell.js | 232 |
15 files changed, 1352 insertions, 0 deletions
diff --git a/js/src/tests/ecma_3/extensions/10.1.3-2.js b/js/src/tests/ecma_3/extensions/10.1.3-2.js new file mode 100644 index 000000000..5bfd0046b --- /dev/null +++ b/js/src/tests/ecma_3/extensions/10.1.3-2.js @@ -0,0 +1,128 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* + * + * Date: 11 Feb 2002 + * SUMMARY: Testing functions having duplicate formal parameter names + * + * SpiderMonkey was crashing on each case below if the parameters had + * the same name. But duplicate parameter names are permitted by ECMA; + * see ECMA-262 3rd Edition Final Section 10.1.3 + * + * NOTE: Rhino does not have toSource() and uneval(); they are non-ECMA + * extensions to the language. So we include a test for them at the beginning - + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = '(none)'; +var summary = 'Testing functions having duplicate formal parameter names'; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; +var OBJ = new Object(); +var OBJ_TYPE = OBJ.toString(); + +/* + * Exit if the implementation doesn't support toSource() or uneval(), + * since these are non-ECMA extensions to the language - + */ +try +{ + if (!OBJ.toSource || !uneval(OBJ)) + quit(); +} +catch(e) +{ + quit(); +} + + +/* + * OK, now begin the test. Just checking that we don't crash on these - + */ +function f1(x,x,x,x) +{ + var ret = eval(arguments.toSource()); + return ret.toString(); +} +status = inSection(1); +actual = f1(1,2,3,4); +expect = OBJ_TYPE; +addThis(); + + +/* + * Same thing, but preface |arguments| with the function name + */ +function f2(x,x,x,x) +{ + var ret = eval(f2.arguments.toSource()); + return ret.toString(); +} +status = inSection(2); +actual = f2(1,2,3,4); +expect = OBJ_TYPE; +addThis(); + + +function f3(x,x,x,x) +{ + var ret = eval(uneval(arguments)); + return ret.toString(); +} +status = inSection(3); +actual = f3(1,2,3,4); +expect = OBJ_TYPE; +addThis(); + + +/* + * Same thing, but preface |arguments| with the function name + */ +function f4(x,x,x,x) +{ + var ret = eval(uneval(f4.arguments)); + return ret.toString(); +} +status = inSection(4); +actual = f4(1,2,3,4); +expect = OBJ_TYPE; +addThis(); + + + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + + + +function addThis() +{ + statusitems[UBound] = status; + actualvalues[UBound] = actual; + expectedvalues[UBound] = expect; + UBound++; +} + + +function test() +{ + enterFunc('test'); + printBugNumber(BUGNUMBER); + printStatus(summary); + + for (var i=0; i<UBound; i++) + { + reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]); + } + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/extensions/7.9.1.js b/js/src/tests/ecma_3/extensions/7.9.1.js new file mode 100644 index 000000000..e6aa6f7fd --- /dev/null +++ b/js/src/tests/ecma_3/extensions/7.9.1.js @@ -0,0 +1,47 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +//----------------------------------------------------------------------------- +var BUGNUMBER = 402386; +var summary = 'Automatic Semicolon insertion in restricted statements'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + var code; + + code = '(function() { label1: for (;;) { continue \n label1; }})'; + actual = uneval(eval(code)); + compareSource(code, actual, summary + ': ' + code); + + code = '(function() { label2: for (;;) { break \n label2; }})'; + actual = uneval(eval(code)); + compareSource(code, actual, summary + ': ' + code); + + code = '(function() { return \n x++; })'; + actual = uneval(eval(code)); + compareSource(code, actual, summary + ': ' + code); + + print('see bug 256617'); + code = '(function() { throw \n x++; })'; +// expect = '(function() { throw ; x++; })'; + expect = 'SyntaxError: no line break is allowed between \'throw\' and its expression'; + try { uneval(eval(code)); } catch(ex) { actual = ex + ''; }; +// compareSource(expect, actual, summary + ': ' + code); + reportCompare(expect, actual, summary + ': ' + code); + + exitFunc ('test'); +} + diff --git a/js/src/tests/ecma_3/extensions/browser.js b/js/src/tests/ecma_3/extensions/browser.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/ecma_3/extensions/browser.js diff --git a/js/src/tests/ecma_3/extensions/regress-103087.js b/js/src/tests/ecma_3/extensions/regress-103087.js new file mode 100644 index 000000000..95895c0f9 --- /dev/null +++ b/js/src/tests/ecma_3/extensions/regress-103087.js @@ -0,0 +1,144 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* + * Date: 04 October 2001 + * + * SUMMARY: Arose from Bugzilla bug 103087: + * "The RegExp MarkupSPE in demo crashes Mozilla" + * + * See http://bugzilla.mozilla.org/show_bug.cgi?id=103087 + * The SpiderMonkey shell crashed on some of these regexps. + * + * The reported crash was on i=24 below ('MarkupSPE' regexp) + * I crashed on that, and also on i=43 ('XML_SPE' regexp) + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = 103087; +var summary = "Testing that we don't crash on any of these regexps -"; +var re = ''; +var lm = ''; +var lc = ''; +var rc = ''; + + +// the regexps are built in pieces - +var NameStrt = "[A-Za-z_:]|[^\\x00-\\x7F]"; +var NameChar = "[A-Za-z0-9_:.-]|[^\\x00-\\x7F]"; +var Name = "(" + NameStrt + ")(" + NameChar + ")*"; +var TextSE = "[^<]+"; +var UntilHyphen = "[^-]*-"; +var Until2Hyphens = UntilHyphen + "([^-]" + UntilHyphen + ")*-"; +var CommentCE = Until2Hyphens + ">?"; +var UntilRSBs = "[^]]*]([^]]+])*]+"; +var CDATA_CE = UntilRSBs + "([^]>]" + UntilRSBs + ")*>"; +var S = "[ \\n\\t\\r]+"; +var QuoteSE = '"[^"]' + "*" + '"' + "|'[^']*'"; +var DT_IdentSE = S + Name + "(" + S + "(" + Name + "|" + QuoteSE + "))*"; +var MarkupDeclCE = "([^]\"'><]+|" + QuoteSE + ")*>"; +var S1 = "[\\n\\r\\t ]"; +var UntilQMs = "[^?]*\\?+"; +var PI_Tail = "\\?>|" + S1 + UntilQMs + "([^>?]" + UntilQMs + ")*>"; +var DT_ItemSE = "<(!(--" + Until2Hyphens + ">|[^-]" + MarkupDeclCE + ")|\\?" + Name + "(" + PI_Tail + "))|%" + Name + ";|" + S; +var DocTypeCE = DT_IdentSE + "(" + S + ")?(\\[(" + DT_ItemSE + ")*](" + S + ")?)?>?"; +var DeclCE = "--(" + CommentCE + ")?|\\[CDATA\\[(" + CDATA_CE + ")?|DOCTYPE(" + DocTypeCE + ")?"; +var PI_CE = Name + "(" + PI_Tail + ")?"; +var EndTagCE = Name + "(" + S + ")?>?"; +var AttValSE = '"[^<"]' + "*" + '"' + "|'[^<']*'"; +var ElemTagCE = Name + "(" + S + Name + "(" + S + ")?=(" + S + ")?(" + AttValSE + "))*(" + S + ")?/?>?"; +var MarkupSPE = "<(!(" + DeclCE + ")?|\\?(" + PI_CE + ")?|/(" + EndTagCE + ")?|(" + ElemTagCE + ")?)"; +var XML_SPE = TextSE + "|" + MarkupSPE; +var CommentRE = "<!--" + Until2Hyphens + ">"; +var CommentSPE = "<!--(" + CommentCE + ")?"; +var PI_RE = "<\\?" + Name + "(" + PI_Tail + ")"; +var Erroneous_PI_SE = "<\\?[^?]*(\\?[^>]+)*\\?>"; +var PI_SPE = "<\\?(" + PI_CE + ")?"; +var CDATA_RE = "<!\\[CDATA\\[" + CDATA_CE; +var CDATA_SPE = "<!\\[CDATA\\[(" + CDATA_CE + ")?"; +var ElemTagSE = "<(" + NameStrt + ")([^<>\"']+|" + AttValSE + ")*>"; +var ElemTagRE = "<" + Name + "(" + S + Name + "(" + S + ")?=(" + S + ")?(" + AttValSE + "))*(" + S + ")?/?>"; +var ElemTagSPE = "<" + ElemTagCE; +var EndTagRE = "</" + Name + "(" + S + ")?>"; +var EndTagSPE = "</(" + EndTagCE + ")?"; +var DocTypeSPE = "<!DOCTYPE(" + DocTypeCE + ")?"; +var PERef_APE = "%(" + Name + ";?)?"; +var HexPart = "x([0-9a-fA-F]+;?)?"; +var NumPart = "#([0-9]+;?|" + HexPart + ")?"; +var CGRef_APE = "&(" + Name + ";?|" + NumPart + ")?"; +var Text_PE = CGRef_APE + "|[^&]+"; +var EntityValue_PE = CGRef_APE + "|" + PERef_APE + "|[^%&]+"; + + +var rePatterns = new Array(AttValSE, CDATA_CE, CDATA_RE, CDATA_SPE, CGRef_APE, CommentCE, CommentRE, CommentSPE, DT_IdentSE, DT_ItemSE, DeclCE, DocTypeCE, DocTypeSPE, ElemTagCE, ElemTagRE, ElemTagSE, ElemTagSPE, EndTagCE, EndTagRE, EndTagSPE, EntityValue_PE, Erroneous_PI_SE, HexPart, MarkupDeclCE, MarkupSPE, Name, NameChar, NameStrt, NumPart, PERef_APE, PI_CE, PI_RE, PI_SPE, PI_Tail, QuoteSE, S, S1, TextSE, Text_PE, Until2Hyphens, UntilHyphen, UntilQMs, UntilRSBs, XML_SPE); + + +// here's a big string to test the regexps on - +var str = ''; +str += '<html xmlns="http://www.w3.org/1999/xhtml"' + '\n'; +str += ' xmlns:xlink="http://www.w3.org/XML/XLink/0.9">' + '\n'; +str += ' <head><title>Three Namespaces</title></head>' + '\n'; +str += ' <body>' + '\n'; +str += ' <h1 align="center">An Ellipse and a Rectangle</h1>' + '\n'; +str += ' <svg xmlns="http://www.w3.org/Graphics/SVG/SVG-19991203.dtd" ' + '\n'; +str += ' width="12cm" height="10cm">' + '\n'; +str += ' <ellipse rx="110" ry="130" />' + '\n'; +str += ' <rect x="4cm" y="1cm" width="3cm" height="6cm" />' + '\n'; +str += ' </svg>' + '\n'; +str += ' <p xlink:type="simple" xlink:href="ellipses.html">' + '\n'; +str += ' More about ellipses' + '\n'; +str += ' </p>' + '\n'; +str += ' <p xlink:type="simple" xlink:href="rectangles.html">' + '\n'; +str += ' More about rectangles' + '\n'; +str += ' </p>' + '\n'; +str += ' <hr/>' + '\n'; +str += ' <p>Last Modified February 13, 2000</p> ' + '\n'; +str += ' </body>' + '\n'; +str += '</html>'; + + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + + + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + for (var i=0; i<rePatterns.length; i++) + { + status = inSection(i); + re = new RegExp(rePatterns[i]); + + // Test that we don't crash on any of these - + re.exec(str); + getResults(); + + // Just for the heck of it, test the current leftContext + re.exec(lc); + getResults(); + + // Test the current rightContext + re.exec(rc); + getResults(); + } + + reportCompare('No Crash', 'No Crash', ''); + + exitFunc ('test'); +} + + +function getResults() +{ + lm = RegExp.lastMatch; + lc = RegExp.leftContext; + rc = RegExp.rightContext; +} diff --git a/js/src/tests/ecma_3/extensions/regress-188206-01.js b/js/src/tests/ecma_3/extensions/regress-188206-01.js new file mode 100644 index 000000000..b53260a80 --- /dev/null +++ b/js/src/tests/ecma_3/extensions/regress-188206-01.js @@ -0,0 +1,74 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = 188206; +var summary = 'Invalid use of regexp quantifiers should generate SyntaxErrors'; +var TEST_PASSED = 'SyntaxError'; +var TEST_FAILED = 'Generated an error, but NOT a SyntaxError!'; +var TEST_FAILED_BADLY = 'Did not generate ANY error!!!'; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; + + +/* + * Now do some weird things on the left side of the regexps - + */ +status = inSection(7); +testThis(' /*a/ '); + +status = inSection(8); +testThis(' /**a/ '); + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +/* + * Invalid syntax should generate a SyntaxError + */ +function testThis(sInvalidSyntax) +{ + expect = TEST_PASSED; + actual = TEST_FAILED_BADLY; + + try + { + eval(sInvalidSyntax); + } + catch(e) + { + if (e instanceof SyntaxError) + actual = TEST_PASSED; + else + actual = TEST_FAILED; + } + + statusitems[UBound] = status; + expectedvalues[UBound] = expect; + actualvalues[UBound] = actual; + UBound++; +} + + +function test() +{ + enterFunc('test'); + printBugNumber(BUGNUMBER); + printStatus(summary); + + for (var i=0; i<UBound; i++) + { + reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]); + } + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/extensions/regress-188206-02.js b/js/src/tests/ecma_3/extensions/regress-188206-02.js new file mode 100644 index 000000000..ced5dd327 --- /dev/null +++ b/js/src/tests/ecma_3/extensions/regress-188206-02.js @@ -0,0 +1,124 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = 188206; +var summary = 'Invalid use of regexp quantifiers should generate SyntaxErrors'; +var CHECK_PASSED = 'Should not generate an error'; +var CHECK_FAILED = 'Generated an error!'; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; + + +/* + * Misusing the {DecmalDigits} quantifier - according to ECMA, + * but not according to Perl. + * + * ECMA-262 Edition 3 prohibits the use of unescaped braces in + * regexp patterns, unless they form part of a quantifier. + * + * Hovever, Perl does not prohibit this. If not used as part + * of a quantifer, Perl treats braces literally. + * + * We decided to follow Perl on this for backward compatibility. + * See http://bugzilla.mozilla.org/show_bug.cgi?id=190685. + * + * Therefore NONE of the following ECMA violations should generate + * a SyntaxError. Note we use checkThis() instead of testThis(). + */ +status = inSection(13); +checkThis(' /a*{/ '); + +status = inSection(14); +checkThis(' /a{}/ '); + +status = inSection(15); +checkThis(' /{a/ '); + +status = inSection(16); +checkThis(' /}a/ '); + +status = inSection(17); +checkThis(' /x{abc}/ '); + +status = inSection(18); +checkThis(' /{{0}/ '); + +status = inSection(19); +checkThis(' /{{1}/ '); + +status = inSection(20); +checkThis(' /x{{0}/ '); + +status = inSection(21); +checkThis(' /x{{1}/ '); + +status = inSection(22); +checkThis(' /x{{0}}/ '); + +status = inSection(23); +checkThis(' /x{{1}}/ '); + +status = inSection(24); +checkThis(' /x{{0}}/ '); + +status = inSection(25); +checkThis(' /x{{1}}/ '); + +status = inSection(26); +checkThis(' /x{{0}}/ '); + +status = inSection(27); +checkThis(' /x{{1}}/ '); + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + + + +/* + * Allowed syntax shouldn't generate any errors + */ +function checkThis(sAllowedSyntax) +{ + expect = CHECK_PASSED; + actual = CHECK_PASSED; + + try + { + eval(sAllowedSyntax); + } + catch(e) + { + actual = CHECK_FAILED; + } + + statusitems[UBound] = status; + expectedvalues[UBound] = expect; + actualvalues[UBound] = actual; + UBound++; +} + + +function test() +{ + enterFunc('test'); + printBugNumber(BUGNUMBER); + printStatus(summary); + + for (var i=0; i<UBound; i++) + { + reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]); + } + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/extensions/regress-220367-002.js b/js/src/tests/ecma_3/extensions/regress-220367-002.js new file mode 100644 index 000000000..be83c1d92 --- /dev/null +++ b/js/src/tests/ecma_3/extensions/regress-220367-002.js @@ -0,0 +1,78 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* + * + * Date: 26 September 2003 + * SUMMARY: Regexp conformance test + * + * See http://bugzilla.mozilla.org/show_bug.cgi?id=220367 + * + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = 220367; +var summary = 'Regexp conformance test'; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; + +var re = /(a)|(b)/; + +re.test('a'); +status = inSection(1); +actual = RegExp.$1; +expect = 'a'; +addThis(); + +status = inSection(2); +actual = RegExp.$2; +expect = ''; +addThis(); + +re.test('b'); +status = inSection(3); +actual = RegExp.$1; +expect = ''; +addThis(); + +status = inSection(4); +actual = RegExp.$2; +expect = 'b'; +addThis(); + + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + + + +function addThis() +{ + statusitems[UBound] = status; + actualvalues[UBound] = actual; + expectedvalues[UBound] = expect; + UBound++; +} + + +function test() +{ + enterFunc('test'); + printBugNumber(BUGNUMBER); + printStatus(summary); + + for (var i=0; i<UBound; i++) + { + reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]); + } + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/extensions/regress-228087.js b/js/src/tests/ecma_3/extensions/regress-228087.js new file mode 100644 index 000000000..94473abc0 --- /dev/null +++ b/js/src/tests/ecma_3/extensions/regress-228087.js @@ -0,0 +1,318 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- +/* This Source Code Form is subject to the terms of the Mozilla Public +* License, v. 2.0. If a copy of the MPL was not distributed with this +* file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* + * + * Date: 12 December 2003 + * SUMMARY: Testing regexps with unescaped braces + * See http://bugzilla.mozilla.org/show_bug.cgi?id=228087 + * + * Note: unbalanced, unescaped braces are not permitted by ECMA-262 Ed.3, + * but we decided to follow Perl and IE and allow this for compatibility. + * + * See http://bugzilla.mozilla.org/show_bug.cgi?id=188206 and its testcase. + * See http://bugzilla.mozilla.org/show_bug.cgi?id=223273 and its testcase. + */ +//----------------------------------------------------------------------------- +var i = 0; +var BUGNUMBER = 228087; +var summary = 'Testing regexps with unescaped braces'; +var status = ''; +var statusmessages = new Array(); +var pattern = ''; +var patterns = new Array(); +var string = ''; +var strings = new Array(); +var actualmatch = ''; +var actualmatches = new Array(); +var expectedmatch = ''; +var expectedmatches = new Array(); +var e; + + +string = 'foo {1} foo {2} foo'; + +// try an example with the braces escaped +status = inSection(1); +try +{ + pattern = new RegExp('\{1.*\}', 'g'); + actualmatch = string.match(pattern); +} +catch (e) +{ + pattern = 'error'; + actualmatch = ''; +} +expectedmatch = Array('{1} foo {2}'); +addThis(); + +// just like Section 1, without the braces being escaped +status = inSection(2); +try +{ + pattern = new RegExp('{1.*}', 'g'); + actualmatch = string.match(pattern); +} +catch (e) +{ + pattern = 'error'; + actualmatch = ''; +} +expectedmatch = Array('{1} foo {2}'); +addThis(); + +// try an example with the braces escaped +status = inSection(3); +try +{ + pattern = new RegExp('\{1[.!\}]*\}', 'g'); + actualmatch = string.match(pattern); +} +catch (e) +{ + pattern = 'error'; + actualmatch = ''; +} +expectedmatch = Array('{1}'); +addThis(); + +// just like Section 3, without the braces being escaped +status = inSection(4); +try +{ + pattern = new RegExp('{1[.!}]*}', 'g'); + actualmatch = string.match(pattern); +} +catch (e) +{ + pattern = 'error'; + actualmatch = ''; +} +expectedmatch = Array('{1}'); +addThis(); + + +string = 'abccccc{3 }c{ 3}c{3, }c{3 ,}c{3 ,4}c{3, 4}c{3,4 }de'; + +// use braces in a normal quantifier construct +status = inSection(5); +try +{ + pattern = new RegExp('c{3}'); + actualmatch = string.match(pattern); +} +catch (e) +{ + pattern = 'error'; + actualmatch = ''; +} +expectedmatch = Array('ccc'); +addThis(); + +// now disrupt the quantifer - the braces should now be interpreted literally +status = inSection(6); +try +{ + pattern = new RegExp('c{3 }'); + actualmatch = string.match(pattern); +} +catch (e) +{ + pattern = 'error'; + actualmatch = ''; +} +expectedmatch = Array('c{3 }'); +addThis(); + +status = inSection(7); +try +{ + pattern = new RegExp('c{3.}'); + actualmatch = string.match(pattern); +} +catch (e) +{ + pattern = 'error'; + actualmatch = ''; +} +expectedmatch = Array('c{3 }'); +addThis(); + +status = inSection(8); +try +{ + // need to escape the \ in \s since + // this has been converted to a constructor call + // instead of a literal regexp + pattern = new RegExp('c{3\\s}'); + actualmatch = string.match(pattern); +} +catch (e) +{ + pattern = 'error'; + actualmatch = ''; +} +expectedmatch = Array('c{3 }'); +addThis(); + +status = inSection(9); +try +{ + pattern = new RegExp('c{3[ ]}'); + actualmatch = string.match(pattern); +} +catch (e) +{ + pattern = 'error'; + actualmatch = ''; +} +expectedmatch = Array('c{3 }'); +addThis(); + +status = inSection(10); +try +{ + pattern = new RegExp('c{ 3}'); + actualmatch = string.match(pattern); +} +catch (e) +{ + pattern = 'error'; + actualmatch = ''; +} +expectedmatch = Array('c{ 3}'); +addThis(); + +// using braces in a normal quantifier construct again +status = inSection(11); +try +{ + pattern = new RegExp('c{3,}'); + actualmatch = string.match(pattern); +} +catch (e) +{ + pattern = 'error'; + actualmatch = ''; +} +expectedmatch = Array('ccccc'); +addThis(); + +// now disrupt it - the braces should now be interpreted literally +status = inSection(12); +try +{ + pattern = new RegExp('c{3, }'); + actualmatch = string.match(pattern); +} +catch (e) +{ + pattern = 'error'; + actualmatch = ''; +} +expectedmatch = Array('c{3, }'); +addThis(); + +status = inSection(13); +try +{ + pattern = new RegExp('c{3 ,}'); + actualmatch = string.match(pattern); +} +catch (e) +{ + pattern = 'error'; + actualmatch = ''; +} +expectedmatch = Array('c{3 ,}'); +addThis(); + +// using braces in a normal quantifier construct again +status = inSection(14); +try +{ + pattern = new RegExp('c{3,4}'); + actualmatch = string.match(pattern); +} +catch (e) +{ + pattern = 'error'; + actualmatch = ''; +} +expectedmatch = Array('cccc'); +addThis(); + +// now disrupt it - the braces should now be interpreted literally +status = inSection(15); +try +{ + pattern = new RegExp('c{3 ,4}'); + actualmatch = string.match(pattern); +} +catch (e) +{ + pattern = 'error'; + actualmatch = ''; +} +expectedmatch = Array('c{3 ,4}'); +addThis(); + +status = inSection(16); +try +{ + pattern = new RegExp('c{3, 4}'); + actualmatch = string.match(pattern); +} +catch (e) +{ + pattern = 'error'; + actualmatch = ''; +} +expectedmatch = Array('c{3, 4}'); +addThis(); + +status = inSection(17); +try +{ + pattern = new RegExp('c{3,4 }'); + actualmatch = string.match(pattern); +} +catch (e) +{ + pattern = 'error'; + actualmatch = ''; +} +expectedmatch = Array('c{3,4 }'); +addThis(); + + + + +//------------------------------------------------------------------------------------------------- +test(); +//------------------------------------------------------------------------------------------------- + + + +function addThis() +{ + statusmessages[i] = status; + patterns[i] = pattern; + strings[i] = string; + actualmatches[i] = actualmatch; + expectedmatches[i] = expectedmatch; + i++; +} + + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches); + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/extensions/regress-274152.js b/js/src/tests/ecma_3/extensions/regress-274152.js new file mode 100644 index 000000000..03ad2833b --- /dev/null +++ b/js/src/tests/ecma_3/extensions/regress-274152.js @@ -0,0 +1,48 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +//----------------------------------------------------------------------------- +var BUGNUMBER = 274152; +var summary = 'Do not ignore unicode format-control characters'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + expect = 'SyntaxError: illegal character'; + + var formatcontrolchars = ['\u200E', + '\u0600', + '\u0601', + '\u0602', + '\u0603', + '\u06DD', + '\u070F']; + + for (var i = 0; i < formatcontrolchars.length; i++) + { + try + { + eval("hi" + formatcontrolchars[i] + "there = 'howdie';"); + } + catch(ex) + { + actual = ex + ''; + } + + reportCompare(expect, actual, summary + ': ' + i); + } + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/extensions/regress-320854.js b/js/src/tests/ecma_3/extensions/regress-320854.js new file mode 100644 index 000000000..8486924d6 --- /dev/null +++ b/js/src/tests/ecma_3/extensions/regress-320854.js @@ -0,0 +1,20 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +//----------------------------------------------------------------------------- +var BUGNUMBER = 320854; +var summary = 'o.hasOwnProperty("length") should not lie when o has function in proto chain'; +var actual = ''; +var expect = ''; + +printBugNumber(BUGNUMBER); +printStatus (summary); + +var o = {__proto__:function(){}}; + +expect = false; +actual = o.hasOwnProperty('length') + + reportCompare(expect, actual, summary); diff --git a/js/src/tests/ecma_3/extensions/regress-327170.js b/js/src/tests/ecma_3/extensions/regress-327170.js new file mode 100644 index 000000000..f9f63be4b --- /dev/null +++ b/js/src/tests/ecma_3/extensions/regress-327170.js @@ -0,0 +1,25 @@ +/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +//----------------------------------------------------------------------------- +var BUGNUMBER = 327170; +var summary = 'Reuse of RegExp in string.replace(rx.compile(...), function() { rx.compile(...); }) causes a crash'; +var actual = 'No Crash'; +var expect = 'No Crash'; + +printBugNumber(BUGNUMBER); +printStatus (summary); + +var g_rx = /(?:)/; + +"this is a test-string".replace(g_rx.compile("test", "g"), + function() + { + // re-use of the g_rx RegExp object, + // that's currently in use by the replace fn. + g_rx.compile("string", "g"); + }); + +reportCompare(expect, actual, summary); diff --git a/js/src/tests/ecma_3/extensions/regress-368516.js b/js/src/tests/ecma_3/extensions/regress-368516.js new file mode 100644 index 000000000..8db195d8d --- /dev/null +++ b/js/src/tests/ecma_3/extensions/regress-368516.js @@ -0,0 +1,45 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +//----------------------------------------------------------------------------- +var BUGNUMBER = 368516; +var summary = 'Treat unicode BOM characters as whitespace'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + var bomchars = ['\uFFFE', + '\uFEFF']; + + for (var i = 0; i < bomchars.length; i++) + { + expect = 'howdie'; + actual = ''; + + try + { + eval("var" + bomchars[i] + "hithere = 'howdie';"); + actual = hithere; + } + catch(ex) + { + actual = ex + ''; + } + + reportCompare(expect, actual, summary + ': ' + i); + } + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/extensions/regress-385393-03.js b/js/src/tests/ecma_3/extensions/regress-385393-03.js new file mode 100644 index 000000000..17fdcf2da --- /dev/null +++ b/js/src/tests/ecma_3/extensions/regress-385393-03.js @@ -0,0 +1,30 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + + +//----------------------------------------------------------------------------- +var BUGNUMBER = 385393; +var summary = 'Regression test for bug 385393'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + f = (function() { new (delete y) }); + eval(uneval(f)) + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/extensions/regress-430740.js b/js/src/tests/ecma_3/extensions/regress-430740.js new file mode 100644 index 000000000..a4ad35341 --- /dev/null +++ b/js/src/tests/ecma_3/extensions/regress-430740.js @@ -0,0 +1,39 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +//----------------------------------------------------------------------------- +var BUGNUMBER = 430740; +var summary = 'Do not strip format-control characters from string literals'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + function doevil() { + print('evildone'); + return 'evildone'; + } + + expect = 'a%E2%80%8D,+doevil()%5D)//'; + actual += eval("(['a\\\u200d', '+doevil()])//'])"); + actual = encodeURI(actual); + reportCompare(expect, actual, summary); + + expect = 'a%EF%BF%BE,+doevil()%5D)//'; + actual = eval("(['a\\\ufffe', '+doevil()])//'])"); + actual = encodeURI(actual); + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/extensions/shell.js b/js/src/tests/ecma_3/extensions/shell.js new file mode 100644 index 000000000..857d06c3e --- /dev/null +++ b/js/src/tests/ecma_3/extensions/shell.js @@ -0,0 +1,232 @@ +/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* + * Date: 07 February 2001 + * + * Functionality common to RegExp testing - + */ +//----------------------------------------------------------------------------- + + +var MSG_PATTERN = '\nregexp = '; +var MSG_STRING = '\nstring = '; +var MSG_EXPECT = '\nExpect: '; +var MSG_ACTUAL = '\nActual: '; +var ERR_LENGTH = '\nERROR !!! match arrays have different lengths:'; +var ERR_MATCH = '\nERROR !!! regexp failed to give expected match array:'; +var ERR_NO_MATCH = '\nERROR !!! regexp FAILED to match anything !!!'; +var ERR_UNEXP_MATCH = '\nERROR !!! regexp MATCHED when we expected it to fail !!!'; +var CHAR_LBRACKET = '['; +var CHAR_RBRACKET = ']'; +var CHAR_QT_DBL = '"'; +var CHAR_QT = "'"; +var CHAR_NL = '\n'; +var CHAR_COMMA = ','; +var CHAR_SPACE = ' '; +var TYPE_STRING = typeof 'abc'; + + + +function testRegExp(statuses, patterns, strings, actualmatches, expectedmatches) +{ + var status = ''; + var pattern = new RegExp(); + var string = ''; + var actualmatch = new Array(); + var expectedmatch = new Array(); + var state = ''; + var lActual = -1; + var lExpect = -1; + + + for (var i=0; i != patterns.length; i++) + { + status = statuses[i]; + pattern = patterns[i]; + string = strings[i]; + actualmatch=actualmatches[i]; + expectedmatch=expectedmatches[i]; + state = getState(status, pattern, string); + + description = status; + + if(actualmatch) + { + actual = formatArray(actualmatch); + if(expectedmatch) + { + // expectedmatch and actualmatch are arrays - + lExpect = expectedmatch.length; + lActual = actualmatch.length; + + var expected = formatArray(expectedmatch); + + if (lActual != lExpect) + { + reportCompare(lExpect, lActual, + state + ERR_LENGTH + + MSG_EXPECT + expected + + MSG_ACTUAL + actual + + CHAR_NL + ); + continue; + } + + // OK, the arrays have same length - + if (expected != actual) + { + reportCompare(expected, actual, + state + ERR_MATCH + + MSG_EXPECT + expected + + MSG_ACTUAL + actual + + CHAR_NL + ); + } + else + { + reportCompare(expected, actual, state) + } + + } + else //expectedmatch is null - that is, we did not expect a match - + { + expected = expectedmatch; + reportCompare(expected, actual, + state + ERR_UNEXP_MATCH + + MSG_EXPECT + expectedmatch + + MSG_ACTUAL + actual + + CHAR_NL + ); + } + + } + else // actualmatch is null + { + if (expectedmatch) + { + actual = actualmatch; + reportCompare(expected, actual, + state + ERR_NO_MATCH + + MSG_EXPECT + expectedmatch + + MSG_ACTUAL + actualmatch + + CHAR_NL + ); + } + else // we did not expect a match + { + // Being ultra-cautious. Presumably expectedmatch===actualmatch===null + expected = expectedmatch; + actual = actualmatch; + reportCompare (expectedmatch, actualmatch, state); + } + } + } +} + + +function getState(status, pattern, string) +{ + /* + * Escape \n's, etc. to make them LITERAL in the presentation string. + * We don't have to worry about this in |pattern|; such escaping is + * done automatically by pattern.toString(), invoked implicitly below. + * + * One would like to simply do: string = string.replace(/(\s)/g, '\$1'). + * However, the backreference $1 is not a literal string value, + * so this method doesn't work. + * + * Also tried string = string.replace(/(\s)/g, escape('$1')); + * but this just inserts the escape of the literal '$1', i.e. '%241'. + */ + string = string.replace(/\n/g, '\\n'); + string = string.replace(/\r/g, '\\r'); + string = string.replace(/\t/g, '\\t'); + string = string.replace(/\v/g, '\\v'); + string = string.replace(/\f/g, '\\f'); + + return (status + MSG_PATTERN + pattern + MSG_STRING + singleQuote(string)); +} + + +/* + * If available, arr.toSource() gives more detail than arr.toString() + * + * var arr = Array(1,2,'3'); + * + * arr.toSource() + * [1, 2, "3"] + * + * arr.toString() + * 1,2,3 + * + * But toSource() doesn't exist in Rhino, so use our own imitation, below - + * + */ +function formatArray(arr) +{ + try + { + return arr.toSource(); + } + catch(e) + { + return toSource(arr); + } +} + + +/* + * Imitate SpiderMonkey's arr.toSource() method: + * + * a) Double-quote each array element that is of string type + * b) Represent |undefined| and |null| by empty strings + * c) Delimit elements by a comma + single space + * d) Do not add delimiter at the end UNLESS the last element is |undefined| + * e) Add square brackets to the beginning and end of the string + */ +function toSource(arr) +{ + var delim = CHAR_COMMA + CHAR_SPACE; + var elt = ''; + var ret = ''; + var len = arr.length; + + for (i=0; i<len; i++) + { + elt = arr[i]; + + switch(true) + { + case (typeof elt === TYPE_STRING) : + ret += doubleQuote(elt); + break; + + case (elt === undefined || elt === null) : + break; // add nothing but the delimiter, below - + + default: + ret += elt.toString(); + } + + if ((i < len-1) || (elt === undefined)) + ret += delim; + } + + return CHAR_LBRACKET + ret + CHAR_RBRACKET; +} + + +function doubleQuote(text) +{ + return CHAR_QT_DBL + text + CHAR_QT_DBL; +} + + +function singleQuote(text) +{ + return CHAR_QT + text + CHAR_QT; +} + |