diff options
author | Matt A. Tobin <mattatobin@localhost.localdomain> | 2018-02-02 04:16:08 -0500 |
---|---|---|
committer | Matt A. Tobin <mattatobin@localhost.localdomain> | 2018-02-02 04:16:08 -0500 |
commit | 5f8de423f190bbb79a62f804151bc24824fa32d8 (patch) | |
tree | 10027f336435511475e392454359edea8e25895d /js/src/tests/ecma_3 | |
parent | 49ee0794b5d912db1f95dce6eb52d781dc210db5 (diff) | |
download | UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.gz UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.lz UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.xz UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.zip |
Add m-esr52 at 52.6.0
Diffstat (limited to 'js/src/tests/ecma_3')
267 files changed, 50123 insertions, 0 deletions
diff --git a/js/src/tests/ecma_3/Array/15.4.4.11-01.js b/js/src/tests/ecma_3/Array/15.4.4.11-01.js new file mode 100644 index 000000000..d92ad5fce --- /dev/null +++ b/js/src/tests/ecma_3/Array/15.4.4.11-01.js @@ -0,0 +1,28 @@ +/* -*- 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 = 312138; +var summary = 'Array.sort should not eat exceptions'; +var actual = ''; +var expect = ''; + +printBugNumber(BUGNUMBER); +printStatus (summary); + +expect = "e=1 N=1"; + +var N = 0; +var array = [4,3,2,1]; + +try { + array.sort(function() { + throw ++N; + }); +} catch (e) { + actual = ("e="+e+" N="+N); +} + +reportCompare(expect, actual, summary); diff --git a/js/src/tests/ecma_3/Array/15.4.4.3-1.js b/js/src/tests/ecma_3/Array/15.4.4.3-1.js new file mode 100644 index 000000000..f42834310 --- /dev/null +++ b/js/src/tests/ecma_3/Array/15.4.4.3-1.js @@ -0,0 +1,54 @@ +/* -*- 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: 12 Mar 2001 + * + * + * SUMMARY: Testing Array.prototype.toLocaleString() + * See http://bugzilla.mozilla.org/show_bug.cgi?id=56883 + * See http://bugzilla.mozilla.org/show_bug.cgi?id=58031 + * + * By ECMA3 15.4.4.3, myArray.toLocaleString() means that toLocaleString() + * should be applied to each element of the array, and the results should be + * concatenated with an implementation-specific delimiter. For example: + * + * myArray[0].toLocaleString() + ',' + myArray[1].toLocaleString() + etc. + * + * In this testcase toLocaleString is a user-defined property of each + * array element; therefore it is the function that should be + * invoked. This function increments a global variable. Therefore the + * end value of this variable should be myArray.length. + */ +//----------------------------------------------------------------------------- +var BUGNUMBER = 56883; +var summary = 'Testing Array.prototype.toLocaleString() -'; +var actual = ''; +var expect = ''; +var n = 0; +var obj = {toLocaleString: function() {n++}}; +var myArray = [obj, obj, obj]; + + +myArray.toLocaleString(); +actual = n; +expect = 3; // (see explanation above) + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/Array/15.4.4.4-001.js b/js/src/tests/ecma_3/Array/15.4.4.4-001.js new file mode 100644 index 000000000..602624951 --- /dev/null +++ b/js/src/tests/ecma_3/Array/15.4.4.4-001.js @@ -0,0 +1,119 @@ +/* -*- 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: 19 September 2002 + * SUMMARY: Testing Array.prototype.concat() + * See http://bugzilla.mozilla.org/show_bug.cgi?id=169795 + * + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = 169795; +var summary = 'Testing Array.prototype.concat()'; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; +var x; + + +status = inSection(1); +x = "Hello"; +actual = [].concat(x).toString(); +expect = x.toString(); +addThis(); + +status = inSection(2); +x = 999; +actual = [].concat(x).toString(); +expect = x.toString(); +addThis(); + +status = inSection(3); +x = /Hello/g; +actual = [].concat(x).toString(); +expect = x.toString(); +addThis(); + +status = inSection(4); +x = new Error("Hello"); +actual = [].concat(x).toString(); +expect = x.toString(); +addThis(); + +status = inSection(5); +x = function() {return "Hello";}; +actual = [].concat(x).toString(); +expect = x.toString(); +addThis(); + +status = inSection(6); +x = [function() {return "Hello";}]; +actual = [].concat(x).toString(); +expect = x.toString(); +addThis(); + +status = inSection(7); +x = [1,2,3].concat([4,5,6]); +actual = [].concat(x).toString(); +expect = x.toString(); +addThis(); + +status = inSection(8); +x = eval('this'); +actual = [].concat(x).toString(); +expect = x.toString(); +addThis(); + +/* + * The next two sections are by igor@icesoft.no; see + * http://bugzilla.mozilla.org/show_bug.cgi?id=169795#c3 + */ +status = inSection(9); +x={length:0}; +actual = [].concat(x).toString(); +expect = x.toString(); +addThis(); + +status = inSection(10); +x={length:2, 0:0, 1:1}; +actual = [].concat(x).toString(); +expect = x.toString(); +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/Array/15.4.5.1-01.js b/js/src/tests/ecma_3/Array/15.4.5.1-01.js new file mode 100644 index 000000000..96acdef63 --- /dev/null +++ b/js/src/tests/ecma_3/Array/15.4.5.1-01.js @@ -0,0 +1,60 @@ +/* -*- 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 = "(none)"; +var summary = '15.4.5.1 - array.length coverage'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + var a = []; + + expect = 'RangeError: invalid array length'; + actual = ''; + try + { + a.length = -1; + } + catch(ex) + { + actual = ex + ''; + } + reportCompare(expect, actual, summary); + + actual = ''; + try + { + a.length = 12345678901234567890; + } + catch(ex) + { + actual = ex + ''; + } + reportCompare(expect, actual, summary); + + actual = ''; + try + { + a.length = 'a'; + } + catch(ex) + { + actual = ex + ''; + } + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/Array/15.5.4.8-01.js b/js/src/tests/ecma_3/Array/15.5.4.8-01.js new file mode 100644 index 000000000..9901a556e --- /dev/null +++ b/js/src/tests/ecma_3/Array/15.5.4.8-01.js @@ -0,0 +1,43 @@ +/* -*- 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 = 480096; +var summary = 'Array.lastIndexOf'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + expect = '-12'; + actual = 0; + actual += Array.lastIndexOf([2, 3,, 4, 5, 6]); + actual += [2, 3,, 4, 5, 6].lastIndexOf(); + actual += Array.prototype.lastIndexOf.call([2, 3,, 4, 5, 6]); + actual += Array.prototype.lastIndexOf.apply([2, 3,, 4, 5, 6], [, -4]); + actual += Array.prototype.lastIndexOf.apply([2, 3,, 4, 5, 6], [undefined, -4]); + actual += Array.prototype.lastIndexOf.apply([2, 3,, 4, 5, 6], [undefined, -5]); + actual += Array.lastIndexOf([2, 3,, 4, 5, 6], undefined); + actual += Array.lastIndexOf([2, 3,, 4, 5, 6], undefined, 1); + actual += Array.lastIndexOf([2, 3,, 4, 5, 6], undefined, 2); + actual += Array.lastIndexOf([2, 3,, 4, 5, 6], undefined); + actual += Array.lastIndexOf([2, 3,, 4, 5, 6], undefined, 1); + actual += Array.lastIndexOf([2, 3,, 4, 5, 6], undefined, 2); + + actual = String(actual); + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/Array/browser.js b/js/src/tests/ecma_3/Array/browser.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/ecma_3/Array/browser.js diff --git a/js/src/tests/ecma_3/Array/regress-101488.js b/js/src/tests/ecma_3/Array/regress-101488.js new file mode 100644 index 000000000..b5563745f --- /dev/null +++ b/js/src/tests/ecma_3/Array/regress-101488.js @@ -0,0 +1,138 @@ +/* -*- 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: 24 September 2001 + * + * SUMMARY: Try assigning arr.length = new Number(n) + * From correspondence with Igor Bukanov <igor@icesoft.no> + * See http://bugzilla.mozilla.org/show_bug.cgi?id=101488 + * + * Without the "new" keyword, assigning arr.length = Number(n) worked. + * But with it, Rhino was giving an error "Inappropriate array length" + * and SpiderMonkey was exiting without giving any error or return value - + * + * Comments on the Rhino code by igor@icesoft.no: + * + * jsSet_length requires that the new length value should be an instance + * of Number. But according to Ecma 15.4.5.1, item 12-13, an error should + * be thrown only if ToUint32(length_value) != ToNumber(length_value) + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = 101488; +var summary = 'Try assigning arr.length = new Number(n)'; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; +var arr = []; + + +status = inSection(1); +arr = Array(); +tryThis('arr.length = new Number(1);'); +actual = arr.length; +expect = 1; +addThis(); + +status = inSection(2); +arr = Array(5); +tryThis('arr.length = new Number(1);'); +actual = arr.length; +expect = 1; +addThis(); + +status = inSection(3); +arr = Array(); +tryThis('arr.length = new Number(17);'); +actual = arr.length; +expect = 17; +addThis(); + +status = inSection(4); +arr = Array(5); +tryThis('arr.length = new Number(17);'); +actual = arr.length; +expect = 17; +addThis(); + + +/* + * Also try the above with the "new" keyword before Array(). + * Array() and new Array() should be equivalent, by ECMA 15.4.1.1 + */ +status = inSection(5); +arr = new Array(); +tryThis('arr.length = new Number(1);'); +actual = arr.length; +expect = 1; +addThis(); + +status = inSection(6); +arr = new Array(5); +tryThis('arr.length = new Number(1);'); +actual = arr.length; +expect = 1; +addThis(); + +arr = new Array(); +tryThis('arr.length = new Number(17);'); +actual = arr.length; +expect = 17; +addThis(); + +status = inSection(7); +arr = new Array(5); +tryThis('arr.length = new Number(17);'); +actual = arr.length; +expect = 17; +addThis(); + + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + + + +function tryThis(s) +{ + try + { + eval(s); + } + catch(e) + { + // keep going + } +} + + +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/Array/regress-130451.js b/js/src/tests/ecma_3/Array/regress-130451.js new file mode 100644 index 000000000..9dc5dc41e --- /dev/null +++ b/js/src/tests/ecma_3/Array/regress-130451.js @@ -0,0 +1,185 @@ +/* -*- 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: 25 Mar 2002 + * SUMMARY: Array.prototype.sort() should not (re-)define .length + * See http://bugzilla.mozilla.org/show_bug.cgi?id=130451 + * + * From the ECMA-262 Edition 3 Final spec: + * + * NOTE: The sort function is intentionally generic; it does not require that + * its |this| value be an Array object. Therefore, it can be transferred to + * other kinds of objects for use as a method. Whether the sort function can + * be applied successfully to a host object is implementation-dependent. + * + * The interesting parts of this testcase are the contrasting expectations for + * Brendan's test below, when applied to Array objects vs. non-Array objects. + * + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = 130451; +var summary = 'Array.prototype.sort() should not (re-)define .length'; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; +var arr = []; +var cmp = new Function(); + + +/* + * First: test Array.prototype.sort() on Array objects + */ +status = inSection(1); +arr = [0,1,2,3]; +cmp = function(x,y) {return x-y;}; +actual = arr.sort(cmp).length; +expect = 4; +addThis(); + +status = inSection(2); +arr = [0,1,2,3]; +cmp = function(x,y) {return y-x;}; +actual = arr.sort(cmp).length; +expect = 4; +addThis(); + +status = inSection(3); +arr = [0,1,2,3]; +cmp = function(x,y) {return x-y;}; +arr.length = 1; +actual = arr.sort(cmp).length; +expect = 1; +addThis(); + +/* + * This test is by Brendan. Setting arr.length to + * 2 and then 4 should cause elements to be deleted. + */ +arr = [0,1,2,3]; +cmp = function(x,y) {return x-y;}; +arr.sort(cmp); + +status = inSection(4); +actual = arr.join(); +expect = '0,1,2,3'; +addThis(); + +status = inSection(5); +actual = arr.length; +expect = 4; +addThis(); + +status = inSection(6); +arr.length = 2; +actual = arr.join(); +expect = '0,1'; +addThis(); + +status = inSection(7); +arr.length = 4; +actual = arr.join(); +expect = '0,1,,'; //<---- see how 2,3 have been lost +addThis(); + + + +/* + * Now test Array.prototype.sort() on non-Array objects + */ +status = inSection(8); +var obj = new Object(); +obj.sort = Array.prototype.sort; +obj.length = 4; +obj[0] = 0; +obj[1] = 1; +obj[2] = 2; +obj[3] = 3; +cmp = function(x,y) {return x-y;}; +actual = obj.sort(cmp).length; +expect = 4; +addThis(); + + +/* + * Here again is Brendan's test. Unlike the array case + * above, the setting of obj.length to 2 and then 4 + * should NOT cause elements to be deleted + */ +obj = new Object(); +obj.sort = Array.prototype.sort; +obj.length = 4; +obj[0] = 3; +obj[1] = 2; +obj[2] = 1; +obj[3] = 0; +cmp = function(x,y) {return x-y;}; +obj.sort(cmp); //<---- this is what triggered the buggy behavior below +obj.join = Array.prototype.join; + +status = inSection(9); +actual = obj.join(); +expect = '0,1,2,3'; +addThis(); + +status = inSection(10); +actual = obj.length; +expect = 4; +addThis(); + +status = inSection(11); +obj.length = 2; +actual = obj.join(); +expect = '0,1'; +addThis(); + +/* + * Before this bug was fixed, |actual| held the value '0,1,,' + * as in the Array-object case at top. This bug only occurred + * if Array.prototype.sort() had been applied to |obj|, + * as we have done higher up. + */ +status = inSection(12); +obj.length = 4; +actual = obj.join(); +expect = '0,1,2,3'; +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/Array/regress-322135-01.js b/js/src/tests/ecma_3/Array/regress-322135-01.js new file mode 100644 index 000000000..2f65724eb --- /dev/null +++ b/js/src/tests/ecma_3/Array/regress-322135-01.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 = 322135; +var summary = 'Array.prototype.push on Array with length 2^32-1'; +var actual = 'Completed'; +var expect = 'Completed'; + +printBugNumber(BUGNUMBER); +printStatus (summary); + +printStatus('This bug passes if it does not cause an out of memory error'); +printStatus('Other issues related to array length are not tested.'); + +var length = 4294967295; +var array = new Array(length); + +printStatus('before array.length = ' + array.length); + +try +{ + array.push('Kibo'); +} +catch(ex) +{ + printStatus(ex.name + ': ' + ex.message); +} +reportCompare(expect, actual, summary); + +//expect = 'Kibo'; +//actual = array[length]; +//reportCompare(expect, actual, summary + ': element appended'); + +//expect = length; +//actual = array.length; +//reportCompare(expect, actual, summary + ': array length unchanged'); diff --git a/js/src/tests/ecma_3/Array/regress-322135-02.js b/js/src/tests/ecma_3/Array/regress-322135-02.js new file mode 100644 index 000000000..3fbfb59f3 --- /dev/null +++ b/js/src/tests/ecma_3/Array/regress-322135-02.js @@ -0,0 +1,32 @@ +// |reftest| skip -- slow (bug 1234947) +/* -*- 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 = 322135; +var summary = 'Array.prototype.concat on Array with length 2^32-1'; +var actual = 'Completed'; +var expect = 'Completed'; + +printBugNumber(BUGNUMBER); +printStatus (summary); + +printStatus('This bug passes if it does not cause an out of memory error'); +printStatus('Other issues related to array length are not tested.'); + +var length = 4294967295; +var array1 = new Array(length); +var array2 = ['Kibo']; +var array; + +try +{ + array = array1.concat(array2); +} +catch(ex) +{ + printStatus(ex.name + ': ' + ex.message); +} +reportCompare(expect, actual, summary); diff --git a/js/src/tests/ecma_3/Array/regress-322135-03.js b/js/src/tests/ecma_3/Array/regress-322135-03.js new file mode 100644 index 000000000..1ff42eb66 --- /dev/null +++ b/js/src/tests/ecma_3/Array/regress-322135-03.js @@ -0,0 +1,40 @@ +// |reftest| skip -- slow +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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 = 322135; +var summary = 'Array.prototype.splice on Array with length 2^32-1'; +var actual = 'Completed'; +var expect = 'Completed'; + +printBugNumber(BUGNUMBER); +printStatus (summary); + +printStatus('This bug passes if it does not cause an out of memory error'); +printStatus('Other issues related to array length are not tested.'); + +var length = 4294967295; +var array = new Array(length); +var array1 = ['Kibo']; +var array; + +try +{ + array.splice(0, 0, array1); +} +catch(ex) +{ + printStatus(ex.name + ': ' + ex.message); +} +reportCompare(expect, actual, summary + ': RangeError'); + +//expect = 'Kibo'; +//actual = array[0]; +//reportCompare(expect, actual, summary + ': element prepended'); + +//expect = length; +//actual = array.length; +//reportCompare(expect, actual, summary + ': array length unchanged'); diff --git a/js/src/tests/ecma_3/Array/regress-322135-04.js b/js/src/tests/ecma_3/Array/regress-322135-04.js new file mode 100644 index 000000000..c1858ea20 --- /dev/null +++ b/js/src/tests/ecma_3/Array/regress-322135-04.js @@ -0,0 +1,38 @@ +// |reftest| skip -- slow +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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 = 322135; +var summary = 'Array.prototype.unshift on Array with length 2^32-1'; +var actual = 'Completed'; +var expect = 'Completed'; + +printBugNumber(BUGNUMBER); +printStatus (summary); + +printStatus('This bug passes if it does not cause an out of memory error'); +printStatus('Other issues related to array length are not tested.'); + +var length = 4294967295; +var array = new Array(length); + +try +{ + array.unshift('Kibo'); +} +catch(ex) +{ + printStatus(ex.name + ': ' + ex.message); +} +reportCompare(expect, actual, summary); + +//expect = 'Kibo'; +//actual = array[0]; +//reportCompare(expect, actual, summary + ': first prepended'); + +//expect = length; +//actual = array.length; +//reportCompare(expect, actual, summary + ': array length unchanged'); diff --git a/js/src/tests/ecma_3/Array/regress-387501.js b/js/src/tests/ecma_3/Array/regress-387501.js new file mode 100644 index 000000000..9646fe5e9 --- /dev/null +++ b/js/src/tests/ecma_3/Array/regress-387501.js @@ -0,0 +1,51 @@ +/* -*- 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 = 387501; +var summary = + 'Array.prototype.toString|toLocaleString|toSource are generic'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + expect = '[object String]'; + actual = Array.prototype.toString.call((new String('foo'))); + assertEq(actual, expect, summary); + + expect = 'f,o,o'; + actual = Array.prototype.toLocaleString.call((new String('foo'))); + assertEq(actual, expect, summary); + + assertEq('["f", "o", "o"]', Array.prototype.toSource.call(new String('foo'))); + + if (typeof Array.prototype.toSource != 'undefined') + { + try + { + Array.prototype.toSource.call('foo'); + throw new Error("didn't throw"); + } + catch(ex) + { + assertEq(ex instanceof TypeError, true, + "wrong error thrown: expected TypeError, got " + ex); + } + } + + reportCompare(true, true, "Tests complete"); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/Array/regress-390598.js b/js/src/tests/ecma_3/Array/regress-390598.js new file mode 100644 index 000000000..f100050ec --- /dev/null +++ b/js/src/tests/ecma_3/Array/regress-390598.js @@ -0,0 +1,40 @@ +/* -*- 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 = 390598; +var summary = 'Override inherited length of Array-like object'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + + function F() {} + F.prototype = []; + + // override inherited length from the prototype. + expect = 10; + var x = new F(); + + print('x = new F(); x instanceof Array: ' + (x instanceof Array)); + + x.length = expect; + actual = x.length; + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/Array/regress-421325.js b/js/src/tests/ecma_3/Array/regress-421325.js new file mode 100644 index 000000000..84f884ba0 --- /dev/null +++ b/js/src/tests/ecma_3/Array/regress-421325.js @@ -0,0 +1,34 @@ +/* -*- 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 = 421325; +var summary = 'Dense Arrays and holes'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + Array.prototype[1] = 'bar'; + + var a = []; + a[0]='foo'; + a[2] = 'baz'; + expect = 'foo,bar,baz'; + actual = a + ''; + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/Array/regress-430717.js b/js/src/tests/ecma_3/Array/regress-430717.js new file mode 100644 index 000000000..31b3b8325 --- /dev/null +++ b/js/src/tests/ecma_3/Array/regress-430717.js @@ -0,0 +1,32 @@ +/* -*- 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 = 430717; +var summary = 'Dense Arrays should inherit deleted elements from Array.prototype'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + Array.prototype[2] = "two"; + var a = [0,1,2,3]; + delete a[2]; + + expect = 'two'; + actual = a[2]; + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/Array/regress-488989.js b/js/src/tests/ecma_3/Array/regress-488989.js new file mode 100644 index 000000000..a610f413b --- /dev/null +++ b/js/src/tests/ecma_3/Array/regress-488989.js @@ -0,0 +1,35 @@ +/* -*- 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 = 488989; +var summary = 'Array.prototype.push for non-arrays near max-array-index limit'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + var stack = { push: [].push }; stack.length = Math.pow(2, 37); + stack.push(-2, -1, 0); + + var stack = { push: [].push }; stack.length = Math.pow(2, 5); + stack.push(-2, -1, 0); + + var stack = { push: [].push }; stack.length = Math.pow(2, 32) -2; + stack.push(-2, -1, 0); + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/Array/regress-619970.js b/js/src/tests/ecma_3/Array/regress-619970.js new file mode 100644 index 000000000..6ec94fc3b --- /dev/null +++ b/js/src/tests/ecma_3/Array/regress-619970.js @@ -0,0 +1,8 @@ +function test() { + delete arguments[1]; + return Array.prototype.join.call(arguments); +} +assertEq(test(1,2,3), "1,,3"); +Object.prototype[1] = "ponies!!!1"; +assertEq(test(1,2,3), "1,ponies!!!1,3"); +reportCompare(true,true); diff --git a/js/src/tests/ecma_3/Array/shell.js b/js/src/tests/ecma_3/Array/shell.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/ecma_3/Array/shell.js diff --git a/js/src/tests/ecma_3/Date/15.9.1.2-01.js b/js/src/tests/ecma_3/Date/15.9.1.2-01.js new file mode 100644 index 000000000..9b12e3184 --- /dev/null +++ b/js/src/tests/ecma_3/Date/15.9.1.2-01.js @@ -0,0 +1,29 @@ +/* -*- 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 = 264727; +var summary = '15.9.1.2 - TimeWithinDay(TIME_1900) == 0'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + expect = 0; + actual = TimeWithinDay(TIME_1900); + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/Date/15.9.4.3.js b/js/src/tests/ecma_3/Date/15.9.4.3.js new file mode 100644 index 000000000..ba4d4d7cb --- /dev/null +++ b/js/src/tests/ecma_3/Date/15.9.4.3.js @@ -0,0 +1,200 @@ +/* -*- 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 = 363578; +var summary = '15.9.4.3 - Date.UTC edge-case arguments.'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + // + + expect = 31; + actual = (new Date(Date.UTC(2006, 0, 0)).getUTCDate()); + reportCompare(expect, actual, summary + ': date 0'); + + expect = 0; + actual = (new Date(Date.UTC(2006, 0, 0, 0)).getUTCHours()); + reportCompare(expect, actual, summary + ': hours 0'); + + expect = 0; + actual = (new Date(Date.UTC(2006, 0, 0, 0, 0)).getUTCMinutes()); + reportCompare(expect, actual, summary + ': minutes 0'); + + expect = 0; + actual = (new Date(Date.UTC(2006, 0, 0, 0, 0, 0)).getUTCSeconds()); + reportCompare(expect, actual, summary + ': seconds 0'); + + expect = 0; + actual = (new Date(Date.UTC(2006, 0, 0, 0, 0, 0, 0)).getUTCMilliseconds()); + reportCompare(expect, actual, summary + ': milliseconds 0'); + + // + + expect = 30; + actual = (new Date(Date.UTC(2006, 0, -1)).getUTCDate()); + reportCompare(expect, actual, summary + ': date -1'); + + expect = 23; + actual = (new Date(Date.UTC(2006, 0, 0, -1)).getUTCHours()); + reportCompare(expect, actual, summary + ': hours -1'); + + expect = 59; + actual = (new Date(Date.UTC(2006, 0, 0, 0, -1)).getUTCMinutes()); + reportCompare(expect, actual, summary + ': minutes -1'); + + expect = 59; + actual = (new Date(Date.UTC(2006, 0, 0, 0, 0, -1)).getUTCSeconds()); + reportCompare(expect, actual, summary + ': seconds -1'); + + expect = 999; + actual = (new Date(Date.UTC(2006, 0, 0, 0, 0, 0, -1)).getUTCMilliseconds()); + reportCompare(expect, actual, summary + ': milliseconds -1'); + + // + + expect = true; + actual = isNaN(new Date(Date.UTC(2006, 0, undefined)).getUTCDate()); + reportCompare(expect, actual, summary + ': date undefined'); + + expect = true; + actual = isNaN(new Date(Date.UTC(2006, 0, 0, undefined)).getUTCHours()); + reportCompare(expect, actual, summary + ': hours undefined'); + + expect = true; + actual = isNaN(new Date(Date.UTC(2006, 0, 0, 0, undefined)).getUTCMinutes()); + reportCompare(expect, actual, summary + ': minutes undefined'); + + expect = true; + actual = isNaN(new Date(Date.UTC(2006, 0, 0, 0, 0, undefined)).getUTCSeconds()); + reportCompare(expect, actual, summary + ': seconds undefined'); + + expect = true; + actual = isNaN(new Date(Date.UTC(2006, 0, 0, 0, 0, 0, undefined)).getUTCMilliseconds()); + reportCompare(expect, actual, summary + ': milliseconds undefined'); + + // + + expect = true; + actual = isNaN(new Date(Date.UTC(2006, 0, {})).getUTCDate()); + reportCompare(expect, actual, summary + ': date {}'); + + expect = true; + actual = isNaN(new Date(Date.UTC(2006, 0, 0, {})).getUTCHours()); + reportCompare(expect, actual, summary + ': hours {}'); + + expect = true; + actual = isNaN(new Date(Date.UTC(2006, 0, 0, 0, {})).getUTCMinutes()); + reportCompare(expect, actual, summary + ': minutes {}'); + + expect = true; + actual = isNaN(new Date(Date.UTC(2006, 0, 0, 0, 0, {})).getUTCSeconds()); + reportCompare(expect, actual, summary + ': seconds {}'); + + expect = true; + actual = isNaN(new Date(Date.UTC(2006, 0, 0, 0, 0, 0, {})).getUTCMilliseconds()); + reportCompare(expect, actual, summary + ': milliseconds {}'); + + // + + expect = 31; + actual = (new Date(Date.UTC(2006, 0, null)).getUTCDate()); + reportCompare(expect, actual, summary + ': date null'); + + expect = 0; + actual = (new Date(Date.UTC(2006, 0, 0, null)).getUTCHours()); + reportCompare(expect, actual, summary + ': hours null'); + + expect = 0; + actual = (new Date(Date.UTC(2006, 0, 0, 0, null)).getUTCMinutes()); + reportCompare(expect, actual, summary + ': minutes null'); + + expect = 0; + actual = (new Date(Date.UTC(2006, 0, 0, 0, 0, null)).getUTCSeconds()); + reportCompare(expect, actual, summary + ': seconds null'); + + expect = 0; + actual = (new Date(Date.UTC(2006, 0, 0, 0, 0, 0, null)).getUTCMilliseconds()); + reportCompare(expect, actual, summary + ': milliseconds null'); + + // + + expect = true; + actual = isNaN(new Date(Date.UTC(2006, 0, Infinity)).getUTCDate()); + reportCompare(expect, actual, summary + ': date Infinity'); + + expect = true; + actual = isNaN(new Date(Date.UTC(2006, 0, 0, Infinity)).getUTCHours()); + reportCompare(expect, actual, summary + ': hours Infinity'); + + expect = true; + actual = isNaN(new Date(Date.UTC(2006, 0, 0, 0, Infinity)).getUTCMinutes()); + reportCompare(expect, actual, summary + ': minutes Infinity'); + + expect = true; + actual = isNaN(new Date(Date.UTC(2006, 0, 0, 0, 0, Infinity)).getUTCSeconds()); + reportCompare(expect, actual, summary + ': seconds Infinity'); + + expect = true; + actual = isNaN(new Date(Date.UTC(2006, 0, 0, 0, 0, 0, Infinity)).getUTCMilliseconds()); + reportCompare(expect, actual, summary + ': milliseconds Infinity'); + + // + + expect = true; + actual = isNaN(new Date(Date.UTC(2006, 0, -Infinity)).getUTCDate()); + reportCompare(expect, actual, summary + ': date -Infinity'); + + expect = true; + actual = isNaN(new Date(Date.UTC(2006, 0, 0, -Infinity)).getUTCHours()); + reportCompare(expect, actual, summary + ': hours -Infinity'); + + expect = true; + actual = isNaN(new Date(Date.UTC(2006, 0, 0, 0, -Infinity)).getUTCMinutes()); + reportCompare(expect, actual, summary + ': minutes -Infinity'); + + expect = true; + actual = isNaN(new Date(Date.UTC(2006, 0, 0, 0, 0, -Infinity)).getUTCSeconds()); + reportCompare(expect, actual, summary + ': seconds -Infinity'); + + expect = true; + actual = isNaN(new Date(Date.UTC(2006, 0, 0, 0, 0, 0, -Infinity)).getUTCMilliseconds()); + reportCompare(expect, actual, summary + ': milliseconds -Infinity'); + + // + + expect = true; + actual = isNaN(new Date(Date.UTC(2006, 0, NaN)).getUTCDate()); + reportCompare(expect, actual, summary + ': date NaN'); + + expect = true; + actual = isNaN(new Date(Date.UTC(2006, 0, 0, NaN)).getUTCHours()); + reportCompare(expect, actual, summary + ': hours NaN'); + + expect = true; + actual = isNaN(new Date(Date.UTC(2006, 0, 0, 0, NaN)).getUTCMinutes()); + reportCompare(expect, actual, summary + ': minutes NaN'); + + expect = true; + actual = isNaN(new Date(Date.UTC(2006, 0, 0, 0, 0, NaN)).getUTCSeconds()); + reportCompare(expect, actual, summary + ': seconds NaN'); + + expect = true; + actual = isNaN(new Date(Date.UTC(2006, 0, 0, 0, 0, 0, NaN)).getUTCMilliseconds()); + reportCompare(expect, actual, summary + ': milliseconds NaN'); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/Date/15.9.5.3.js b/js/src/tests/ecma_3/Date/15.9.5.3.js new file mode 100644 index 000000000..e3f072b47 --- /dev/null +++ b/js/src/tests/ecma_3/Date/15.9.5.3.js @@ -0,0 +1,118 @@ +/* -*- 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/. */ + +/** + File Name: 15.9.5.3.js + ECMA Section: 15.9.5.3 Date.prototype.toDateString() + Description: + This function returns a string value. The contents of the string are + implementation dependent, but are intended to represent the "date" + portion of the Date in the current time zone in a convenient, + human-readable form. We can't test the content of the string, + but can verify that the string is parsable by Date.parse + + The toDateString function is not generic; it generates a runtime error + if its 'this' value is not a Date object. Therefore it cannot be transferred + to other kinds of objects for use as a method. + + Author: pschwartau@netscape.com + Date: 14 november 2000 (adapted from ecma/Date/15.9.5.2.js) +*/ + +var SECTION = "15.9.5.3"; +var VERSION = "ECMA_3"; +var TITLE = "Date.prototype.toDateString()"; + +var status = ''; +var actual = ''; +var expect = ''; + + +startTest(); +writeHeaderToLog( SECTION + " "+ TITLE); + +// first, some generic tests - + +status = "typeof (now.toDateString())"; +actual = typeof (now.toDateString()); +expect = "string"; +addTestCase(); + +status = "Date.prototype.toDateString.length"; +actual = Date.prototype.toDateString.length; +expect = 0; +addTestCase(); + +/* + * Date.parse is accurate to the second; valueOf() to the millisecond. + * Here we expect them to coincide, as we expect a time of exactly + * midnight - + */ +status = "(Date.parse(now.toDateString()) - (midnight(now)).valueOf()) == 0"; +actual = (Date.parse(now.toDateString()) - (midnight(now)).valueOf()) == 0; +expect = true; +addTestCase(); + + + +// 1970 +addDateTestCase(0); +addDateTestCase(TZ_ADJUST); + + +// 1900 +addDateTestCase(TIME_1900); +addDateTestCase(TIME_1900 - TZ_ADJUST); + + +// 2000 +addDateTestCase(TIME_2000); +addDateTestCase(TIME_2000 - TZ_ADJUST); + + +// 29 Feb 2000 +addDateTestCase(UTC_29_FEB_2000); +addDateTestCase(UTC_29_FEB_2000 - 1000); +addDateTestCase(UTC_29_FEB_2000 - TZ_ADJUST); + + +// 2005 +addDateTestCase(UTC_1_JAN_2005); +addDateTestCase(UTC_1_JAN_2005 - 1000); +addDateTestCase(UTC_1_JAN_2005 - TZ_ADJUST); + + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + + +function addTestCase() +{ + new TestCase( + SECTION, + status, + expect, + actual); +} + +function addDateTestCase(date_given_in_milliseconds) +{ + var givenDate = new Date(date_given_in_milliseconds); + + status = 'Date.parse(' + givenDate + ').toDateString())'; + actual = Date.parse(givenDate.toDateString()); + expect = Date.parse(midnight(givenDate)); + addTestCase(); +} + + +function midnight(givenDate) +{ + // midnight on the given date - + return new Date(givenDate.getFullYear(), givenDate.getMonth(), givenDate.getDate()); +} + diff --git a/js/src/tests/ecma_3/Date/15.9.5.4.js b/js/src/tests/ecma_3/Date/15.9.5.4.js new file mode 100644 index 000000000..89a296571 --- /dev/null +++ b/js/src/tests/ecma_3/Date/15.9.5.4.js @@ -0,0 +1,151 @@ +/* -*- 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/. */ + +/** + File Name: 15.9.5.4.js + ECMA Section: 15.9.5.4 Date.prototype.toTimeString() + Description: + This function returns a string value. The contents of the string are + implementation dependent, but are intended to represent the "time" + portion of the Date in the current time zone in a convenient, + human-readable form. We test the content of the string by checking + that d.toDateString() + d.toTimeString() == d.toString() + + Author: pschwartau@netscape.com + Date: 14 november 2000 + Revised: 07 january 2002 because of a change in JS Date format: + + See http://bugzilla.mozilla.org/show_bug.cgi?id=118266 (SpiderMonkey) + See http://bugzilla.mozilla.org/show_bug.cgi?id=118636 (Rhino) +*/ +//----------------------------------------------------------------------------- +var SECTION = "15.9.5.4"; +var VERSION = "ECMA_3"; +var TITLE = "Date.prototype.toTimeString()"; + +var status = ''; +var actual = ''; +var expect = ''; +var givenDate; +var year = ''; +var regexp = ''; +var reducedDateString = ''; +var hopeThisIsTimeString = ''; +var cnEmptyString = ''; +var cnERR ='OOPS! FATAL ERROR: no regexp match in extractTimeString()'; + +startTest(); +writeHeaderToLog( SECTION + " "+ TITLE); + +// first, a couple of generic tests - + +status = "typeof (now.toTimeString())"; +actual = typeof (now.toTimeString()); +expect = "string"; +addTestCase(); + +status = "Date.prototype.toTimeString.length"; +actual = Date.prototype.toTimeString.length; +expect = 0; +addTestCase(); + +// 1970 +addDateTestCase(0); +addDateTestCase(TZ_ADJUST); + + +// 1900 +addDateTestCase(TIME_1900); +addDateTestCase(TIME_1900 - TZ_ADJUST); + + +// 2000 +addDateTestCase(TIME_2000); +addDateTestCase(TIME_2000 - TZ_ADJUST); + + +// 29 Feb 2000 +addDateTestCase(UTC_29_FEB_2000); +addDateTestCase(UTC_29_FEB_2000 - 1000); +addDateTestCase(UTC_29_FEB_2000 - TZ_ADJUST); + + +// Now +addDateTestCase( TIME_NOW); +addDateTestCase( TIME_NOW - TZ_ADJUST); + + +// 2005 +addDateTestCase(UTC_1_JAN_2005); +addDateTestCase(UTC_1_JAN_2005 - 1000); +addDateTestCase(UTC_1_JAN_2005 - TZ_ADJUST); + +//----------------------------------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------------------------------- + +function addTestCase() +{ + new TestCase( + SECTION, + status, + expect, + actual); +} + +function addDateTestCase(date_given_in_milliseconds) +{ + givenDate = new Date(date_given_in_milliseconds); + + status = '(' + givenDate + ').toTimeString()'; + actual = givenDate.toTimeString(); + expect = extractTimeString(givenDate); + addTestCase(); +} + + +/* + * As of 2002-01-07, the format for JavaScript dates changed. + * See http://bugzilla.mozilla.org/show_bug.cgi?id=118266 (SpiderMonkey) + * See http://bugzilla.mozilla.org/show_bug.cgi?id=118636 (Rhino) + * + * WAS: Mon Jan 07 13:40:34 GMT-0800 (Pacific Standard Time) 2002 + * NOW: Mon Jan 07 2002 13:40:34 GMT-0800 (Pacific Standard Time) + * + * Thus, use a regexp of the form /date.toDateString()(.*)$/ + * to capture the TimeString into the first backreference - + */ +function extractTimeString(date) +{ + regexp = new RegExp(date.toDateString() + '(.*)' + '$'); + + try + { + hopeThisIsTimeString = date.toString().match(regexp)[1]; + } + catch(e) + { + return cnERR; + } + + // trim any leading or trailing spaces - + return trimL(trimR(hopeThisIsTimeString)); +} + + +function trimL(s) +{ + if (!s) {return cnEmptyString;}; + for (var i = 0; i!=s.length; i++) {if (s[i] != ' ') {break;}} + return s.substring(i); +} + + +function trimR(s) +{ + if (!s) {return cnEmptyString;}; + for (var i = (s.length - 1); i!=-1; i--) {if (s[i] != ' ') {break;}} + return s.substring(0, i+1); +} diff --git a/js/src/tests/ecma_3/Date/15.9.5.5-02.js b/js/src/tests/ecma_3/Date/15.9.5.5-02.js new file mode 100644 index 000000000..56f951784 --- /dev/null +++ b/js/src/tests/ecma_3/Date/15.9.5.5-02.js @@ -0,0 +1,66 @@ +/* -*- 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 = 398485; +var summary = 'Date.prototype.toLocaleString should not clamp year'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + var d; + var y; + var l; + var maxms = 8640000000000000; + + d = new Date(-maxms ); + y = d.getFullYear(); + + actual = y; + expect = -271821; + reportCompare(expect, actual, summary + ': check year'); + + l = d.toLocaleString(); + print(l); + if (this.hasOwnProperty("Intl")) { + // ECMA-402 specifies that toLocaleString uses a proleptic Gregorian + // calender without year 0. + // Also, localized strings usually use era indicators such as "BC" + // instead of minus signs. + expect = Math.abs(y - 1) + ''; + } else { + // ECMA-262 up to edition 5.1 didn't specify toLocaleString; + // the previous implementation assumed a calendar with year 0 and used + // minus sign. + expect = y + ''; + } + actual = l.match(/-?[0-9]{3,}/) + ''; + reportCompare(expect, actual, summary + ': check toLocaleString'); + + d = new Date(maxms ); + y = d.getFullYear(); + l = d.toLocaleString(); + print(l); + + actual = y; + expect = 275760; + reportCompare(expect, actual, summary + ': check year'); + + actual = l.match(new RegExp(y)) + ''; + expect = y + ''; + reportCompare(expect, actual, summary + ': check toLocaleString'); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/Date/15.9.5.5.js b/js/src/tests/ecma_3/Date/15.9.5.5.js new file mode 100644 index 000000000..27a2df956 --- /dev/null +++ b/js/src/tests/ecma_3/Date/15.9.5.5.js @@ -0,0 +1,111 @@ +// |reftest| random-if(xulRuntime.OS=="Linux") +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. */ + + +/** + File Name: 15.9.5.5.js + ECMA Section: 15.9.5.5 Date.prototype.toLocaleString() + Description: + This function returns a string value. The contents of the string are + implementation dependent, but are intended to represent the "date" + portion of the Date in the current time zone in a convenient, + human-readable form. We can't test the content of the string, + but can verify that the string is parsable by Date.parse + + The toLocaleString function is not generic; it generates a runtime error + if its 'this' value is not a Date object. Therefore it cannot be transferred + to other kinds of objects for use as a method. + + Note: This test isn't supposed to work with a non-English locale per spec. + + Author: pschwartau@netscape.com + Date: 14 november 2000 +*/ + +var SECTION = "15.9.5.5"; +var VERSION = "ECMA_3"; +var TITLE = "Date.prototype.toLocaleString()"; + +var status = ''; +var actual = ''; +var expect = ''; + + +startTest(); +writeHeaderToLog( SECTION + " "+ TITLE); + +// first, some generic tests - + +status = "typeof (now.toLocaleString())"; +actual = typeof (now.toLocaleString()); +expect = "string"; +addTestCase(); + +status = "Date.prototype.toLocaleString.length"; +actual = Date.prototype.toLocaleString.length; +expect = 0; +addTestCase(); + +// Date.parse is accurate to the second; valueOf() to the millisecond - +status = "Math.abs(Date.parse(now.toLocaleString('en-US')) - now.valueOf()) < 1000"; +actual = Math.abs(Date.parse(now.toLocaleString('en-US')) - now.valueOf()) < 1000; +expect = true; +addTestCase(); + + + +// 1970 +addDateTestCase(0); +addDateTestCase(TZ_ADJUST); + + +// 1900 +addDateTestCase(TIME_1900); +addDateTestCase(TIME_1900 -TZ_ADJUST); + + +// 2000 +addDateTestCase(TIME_2000); +addDateTestCase(TIME_2000 -TZ_ADJUST); + + +// 29 Feb 2000 +addDateTestCase(UTC_29_FEB_2000); +addDateTestCase(UTC_29_FEB_2000 - 1000); +addDateTestCase(UTC_29_FEB_2000 - TZ_ADJUST); + + +// 2005 +addDateTestCase(UTC_1_JAN_2005); +addDateTestCase(UTC_1_JAN_2005 - 1000); +addDateTestCase(UTC_1_JAN_2005-TZ_ADJUST); + + + +//----------------------------------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------------------------------- + + +function addTestCase() +{ + AddTestCase( + status, + expect, + actual); +} + + +function addDateTestCase(date_given_in_milliseconds) +{ + var givenDate = new Date(date_given_in_milliseconds); + + status = 'Date.parse(' + givenDate + ').toLocaleString("en-US"))'; + actual = Date.parse(givenDate.toLocaleString("en-US")); + expect = date_given_in_milliseconds; + addTestCase(); +} + diff --git a/js/src/tests/ecma_3/Date/15.9.5.6.js b/js/src/tests/ecma_3/Date/15.9.5.6.js new file mode 100644 index 000000000..6d091b600 --- /dev/null +++ b/js/src/tests/ecma_3/Date/15.9.5.6.js @@ -0,0 +1,119 @@ +/* -*- 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/. */ + + +/** + File Name: 15.9.5.6.js + ECMA Section: 15.9.5.6 Date.prototype.toLocaleDateString() + Description: + This function returns a string value. The contents of the string are + implementation dependent, but are intended to represent the "date" + portion of the Date in the current time zone in a convenient, + human-readable form. We can't test the content of the string, + but can verify that the string is parsable by Date.parse + + The toLocaleDateString function is not generic; it generates a runtime error + if its 'this' value is not a Date object. Therefore it cannot be transferred + to other kinds of objects for use as a method. + + Note: This test isn't supposed to work with a non-English locale per spec. + + Author: pschwartau@netscape.com + Date: 14 november 2000 +*/ + +var SECTION = "15.9.5.6"; +var VERSION = "ECMA_3"; +var TITLE = "Date.prototype.toLocaleDateString()"; + +var status = ''; +var actual = ''; +var expect = ''; + + +startTest(); +writeHeaderToLog( SECTION + " "+ TITLE); + +// first, some generic tests - + +status = "typeof (now.toLocaleDateString())"; +actual = typeof (now.toLocaleDateString()); +expect = "string"; +addTestCase(); + +status = "Date.prototype.toLocaleDateString.length"; +actual = Date.prototype.toLocaleDateString.length; +expect = 0; +addTestCase(); + +/* Date.parse is accurate to the second; valueOf() to the millisecond. + Here we expect them to coincide, as we expect a time of exactly midnight - */ +status = "(Date.parse(now.toLocaleDateString('en-US')) - (midnight(now)).valueOf()) == 0"; +actual = (Date.parse(now.toLocaleDateString('en-US')) - (midnight(now)).valueOf()) == 0; +expect = true; +addTestCase(); + + + +// 1970 +addDateTestCase(0); +addDateTestCase(TZ_ADJUST); + + +// 1900 +addDateTestCase(TIME_1900); +addDateTestCase(TIME_1900 - TZ_ADJUST); + + +// 2000 +addDateTestCase(TIME_2000); +addDateTestCase(TIME_2000 - TZ_ADJUST); + + +// 29 Feb 2000 +addDateTestCase(UTC_29_FEB_2000); +addDateTestCase(UTC_29_FEB_2000 - 1000); +addDateTestCase(UTC_29_FEB_2000 - TZ_ADJUST); + + +// 2005 +addDateTestCase(UTC_1_JAN_2005); +addDateTestCase(UTC_1_JAN_2005 - 1000); +addDateTestCase(UTC_1_JAN_2005 - TZ_ADJUST); + + + +//----------------------------------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------------------------------- + + +function addTestCase() +{ + new TestCase( + "unknown-test-name", + status, + expect, + actual); +} + + +function addDateTestCase(date_given_in_milliseconds) +{ + var givenDate = new Date(date_given_in_milliseconds); + + status = 'Date.parse(' + givenDate + ').toLocaleDateString("en-US"))'; + actual = Date.parse(givenDate.toLocaleDateString("en-US")); + expect = Date.parse(midnight(givenDate)); + addTestCase(); +} + + +function midnight(givenDate) +{ + // midnight on the given date - + return new Date(givenDate.getFullYear(), givenDate.getMonth(), givenDate.getDate()); +} + diff --git a/js/src/tests/ecma_3/Date/15.9.5.7.js b/js/src/tests/ecma_3/Date/15.9.5.7.js new file mode 100644 index 000000000..f116f3e65 --- /dev/null +++ b/js/src/tests/ecma_3/Date/15.9.5.7.js @@ -0,0 +1,108 @@ +/* -*- 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/. */ + +/** + File Name: 15.9.5.7.js + ECMA Section: 15.9.5.7 Date.prototype.toLocaleTimeString() + Description: + This function returns a string value. The contents of the string are + implementation dependent, but are intended to represent the "time" + portion of the Date in the current time zone in a convenient, + human-readable form. We test the content of the string by checking + that + + new Date(d.toDateString() + " " + d.toLocaleTimeString()) == d + + Author: pschwartau@netscape.com + Date: 14 november 2000 + Revised: 07 january 2002 because of a change in JS Date format: + Revised: 21 November 2005 since the string comparison stuff is horked. + bclary + + See http://bugzilla.mozilla.org/show_bug.cgi?id=118266 (SpiderMonkey) + See http://bugzilla.mozilla.org/show_bug.cgi?id=118636 (Rhino) +*/ +//----------------------------------------------------------------------------- +var SECTION = "15.9.5.7"; +var VERSION = "ECMA_3"; +var TITLE = "Date.prototype.toLocaleTimeString()"; + +var status = ''; +var actual = ''; +var expect = ''; +var givenDate; +var year = ''; +var regexp = ''; +var TimeString = ''; +var reducedDateString = ''; +var hopeThisIsLocaleTimeString = ''; +var cnERR ='OOPS! FATAL ERROR: no regexp match in extractLocaleTimeString()'; + +startTest(); +writeHeaderToLog( SECTION + " "+ TITLE); + +// first, a couple generic tests - + +status = "typeof (now.toLocaleTimeString())"; +actual = typeof (now.toLocaleTimeString()); +expect = "string"; +addTestCase(); + +status = "Date.prototype.toLocaleTimeString.length"; +actual = Date.prototype.toLocaleTimeString.length; +expect = 0; +addTestCase(); + +// 1970 +addDateTestCase(0); +addDateTestCase(TZ_ADJUST); + +// 1900 +addDateTestCase(TIME_1900); +addDateTestCase(TIME_1900 - TZ_ADJUST); + +// 2000 +addDateTestCase(TIME_2000); +addDateTestCase(TIME_2000 - TZ_ADJUST); + +// 29 Feb 2000 +addDateTestCase(UTC_29_FEB_2000); +addDateTestCase(UTC_29_FEB_2000 - 1000); +addDateTestCase(UTC_29_FEB_2000 - TZ_ADJUST); + +// Now +addDateTestCase( TIME_NOW); +addDateTestCase( TIME_NOW - TZ_ADJUST); + +// 2005 +addDateTestCase(UTC_1_JAN_2005); +addDateTestCase(UTC_1_JAN_2005 - 1000); +addDateTestCase(UTC_1_JAN_2005 - TZ_ADJUST); + +test(); + +function addTestCase() +{ + new TestCase( + SECTION, + status, + expect, + actual); +} + + +function addDateTestCase(date_given_in_milliseconds) +{ + var s = 'new Date(' + date_given_in_milliseconds + ')'; + givenDate = new Date(date_given_in_milliseconds); + + status = 'd = ' + s + + '; d == new Date(d.toDateString() + " " + d.toLocaleTimeString())'; + expect = givenDate.toString(); + actual = new Date(givenDate.toDateString() + + ' ' + givenDate.toLocaleTimeString()).toString(); + addTestCase(); +} + diff --git a/js/src/tests/ecma_3/Date/browser.js b/js/src/tests/ecma_3/Date/browser.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/ecma_3/Date/browser.js diff --git a/js/src/tests/ecma_3/Date/regress-452786.js b/js/src/tests/ecma_3/Date/regress-452786.js new file mode 100644 index 000000000..a140a844b --- /dev/null +++ b/js/src/tests/ecma_3/Date/regress-452786.js @@ -0,0 +1,33 @@ +/* -*- 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 = 452786; +var summary = 'Do not crash with (new Date()).getMonth.call(new Function())'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + try + { + (new Date()).getMonth.call(new Function()); + } + catch(ex) + { + } + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/Date/shell.js b/js/src/tests/ecma_3/Date/shell.js new file mode 100644 index 000000000..bc01272b1 --- /dev/null +++ b/js/src/tests/ecma_3/Date/shell.js @@ -0,0 +1,530 @@ +/* -*- 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 functions used by tests in Date suite + * + */ +var msPerDay = 86400000; +var HoursPerDay = 24; +var MinutesPerHour = 60; +var SecondsPerMinute = 60; +var msPerSecond = 1000; +var msPerMinute = 60000; // msPerSecond * SecondsPerMinute +var msPerHour = 3600000; // msPerMinute * MinutesPerHour +var TZ_DIFF = getTimeZoneDiff(); // offset of tester's timezone from UTC +var TZ_ADJUST = TZ_DIFF * msPerHour; +var TZ_PST = -8; // offset of Pacific Standard Time from UTC +var PST_DIFF = TZ_DIFF - TZ_PST; // offset of tester's timezone from PST +var TIME_1970 = 0; +var TIME_2000 = 946684800000; +var TIME_1900 = -2208988800000; +var UTC_29_FEB_2000 = TIME_2000 + 31*msPerDay + 28*msPerDay; +var UTC_1_JAN_2005 = TIME_2000 + TimeInYear(2000) + TimeInYear(2001) + + TimeInYear(2002) + TimeInYear(2003) + TimeInYear(2004); +var now = new Date(); +var TIME_NOW = now.valueOf(); //valueOf() is to accurate to the millisecond + //Date.parse() is accurate only to the second + +/* + * Originally, the test suite used a hard-coded value TZ_DIFF = -8. + * But that was only valid for testers in the Pacific Standard Time Zone! + * We calculate the proper number dynamically for any tester. We just + * have to be careful not to use a date subject to Daylight Savings Time... + */ +function getTimeZoneDiff() +{ + return -((new Date(2000, 1, 1)).getTimezoneOffset())/60; +} + + +/* + * Date test "ResultArrays" are hard-coded for Pacific Standard Time. + * We must adjust them for the tester's own timezone - + */ +function adjustResultArray(ResultArray, msMode) +{ + // If the tester's system clock is in PST, no need to continue - + if (!PST_DIFF) {return;} + + /* The date testcases instantiate Date objects in two different ways: + * + * millisecond mode: e.g. dt = new Date(10000000); + * year-month-day mode: dt = new Date(2000, 5, 1, ...); + * + * In the first case, the date is measured from Time 0 in Greenwich (i.e. UTC). + * In the second case, it is measured with reference to the tester's local timezone. + * + * In the first case we must correct those values expected for local measurements, + * like dt.getHours() etc. No correction is necessary for dt.getUTCHours() etc. + * + * In the second case, it is exactly the other way around - + */ + if (msMode) + { + // The hard-coded UTC milliseconds from Time 0 derives from a UTC date. + // Shift to the right by the offset between UTC and the tester. + var t = ResultArray[TIME] + TZ_DIFF*msPerHour; + + // Use our date arithmetic functions to determine the local hour, day, etc. + ResultArray[HOURS] = HourFromTime(t); + ResultArray[DAY] = WeekDay(t); + ResultArray[DATE] = DateFromTime(t); + ResultArray[MONTH] = MonthFromTime(t); + ResultArray[YEAR] = YearFromTime(t); + } + else + { + // The hard-coded UTC milliseconds from Time 0 derives from a PST date. + // Shift to the left by the offset between PST and the tester. + var t = ResultArray[TIME] - PST_DIFF*msPerHour; + + // Use our date arithmetic functions to determine the UTC hour, day, etc. + ResultArray[TIME] = t; + ResultArray[UTC_HOURS] = HourFromTime(t); + ResultArray[UTC_DAY] = WeekDay(t); + ResultArray[UTC_DATE] = DateFromTime(t); + ResultArray[UTC_MONTH] = MonthFromTime(t); + ResultArray[UTC_YEAR] = YearFromTime(t); + } +} + + +function Day( t ) { + return ( Math.floor(t/msPerDay ) ); +} +function DaysInYear( y ) { + if ( y % 4 != 0 ) { + return 365; + } + if ( (y % 4 == 0) && (y % 100 != 0) ) { + return 366; + } + if ( (y % 100 == 0) && (y % 400 != 0) ) { + return 365; + } + if ( (y % 400 == 0) ){ + return 366; + } else { + return "ERROR: DaysInYear(" + y + ") case not covered"; + } +} +function TimeInYear( y ) { + return ( DaysInYear(y) * msPerDay ); +} +function DayNumber( t ) { + return ( Math.floor( t / msPerDay ) ); +} +function TimeWithinDay( t ) { + + var r = t % msPerDay; + + if (r < 0) + { + r += msPerDay; + } + return r; + +} +function YearNumber( t ) { +} +function TimeFromYear( y ) { + return ( msPerDay * DayFromYear(y) ); +} +function DayFromYear( y ) { + return ( 365*(y-1970) + + Math.floor((y-1969)/4) - + Math.floor((y-1901)/100) + + Math.floor((y-1601)/400) ); +} +function InLeapYear( t ) { + if ( DaysInYear(YearFromTime(t)) == 365 ) { + return 0; + } + if ( DaysInYear(YearFromTime(t)) == 366 ) { + return 1; + } else { + return "ERROR: InLeapYear("+ t + ") case not covered"; + } +} +function YearFromTime( t ) { + t = Number( t ); + var sign = ( t < 0 ) ? -1 : 1; + var year = ( sign < 0 ) ? 1969 : 1970; + for ( var timeToTimeZero = t; ; ) { + // subtract the current year's time from the time that's left. + timeToTimeZero -= sign * TimeInYear(year) + + // if there's less than the current year's worth of time left, then break. + if ( sign < 0 ) { + if ( sign * timeToTimeZero <= 0 ) { + break; + } else { + year += sign; + } + } else { + if ( sign * timeToTimeZero < 0 ) { + break; + } else { + year += sign; + } + } + } + return ( year ); +} +function MonthFromTime( t ) { + // i know i could use switch but i'd rather not until it's part of ECMA + var day = DayWithinYear( t ); + var leap = InLeapYear(t); + + if ( (0 <= day) && (day < 31) ) { + return 0; + } + if ( (31 <= day) && (day < (59+leap)) ) { + return 1; + } + if ( ((59+leap) <= day) && (day < (90+leap)) ) { + return 2; + } + if ( ((90+leap) <= day) && (day < (120+leap)) ) { + return 3; + } + if ( ((120+leap) <= day) && (day < (151+leap)) ) { + return 4; + } + if ( ((151+leap) <= day) && (day < (181+leap)) ) { + return 5; + } + if ( ((181+leap) <= day) && (day < (212+leap)) ) { + return 6; + } + if ( ((212+leap) <= day) && (day < (243+leap)) ) { + return 7; + } + if ( ((243+leap) <= day) && (day < (273+leap)) ) { + return 8; + } + if ( ((273+leap) <= day) && (day < (304+leap)) ) { + return 9; + } + if ( ((304+leap) <= day) && (day < (334+leap)) ) { + return 10; + } + if ( ((334+leap) <= day) && (day < (365+leap)) ) { + return 11; + } else { + return "ERROR: MonthFromTime("+t+") not known"; + } +} +function DayWithinYear( t ) { + return( Day(t) - DayFromYear(YearFromTime(t))); +} +function DateFromTime( t ) { + var day = DayWithinYear(t); + var month = MonthFromTime(t); + + if ( month == 0 ) { + return ( day + 1 ); + } + if ( month == 1 ) { + return ( day - 30 ); + } + if ( month == 2 ) { + return ( day - 58 - InLeapYear(t) ); + } + if ( month == 3 ) { + return ( day - 89 - InLeapYear(t)); + } + if ( month == 4 ) { + return ( day - 119 - InLeapYear(t)); + } + if ( month == 5 ) { + return ( day - 150- InLeapYear(t)); + } + if ( month == 6 ) { + return ( day - 180- InLeapYear(t)); + } + if ( month == 7 ) { + return ( day - 211- InLeapYear(t)); + } + if ( month == 8 ) { + return ( day - 242- InLeapYear(t)); + } + if ( month == 9 ) { + return ( day - 272- InLeapYear(t)); + } + if ( month == 10 ) { + return ( day - 303- InLeapYear(t)); + } + if ( month == 11 ) { + return ( day - 333- InLeapYear(t)); + } + + return ("ERROR: DateFromTime("+t+") not known" ); +} +function WeekDay( t ) { + var weekday = (Day(t)+4) % 7; + return( weekday < 0 ? 7 + weekday : weekday ); +} + +// missing daylight savings time adjustment + +function HourFromTime( t ) { + var h = Math.floor( t / msPerHour ) % HoursPerDay; + return ( (h<0) ? HoursPerDay + h : h ); +} +function MinFromTime( t ) { + var min = Math.floor( t / msPerMinute ) % MinutesPerHour; + return( ( min < 0 ) ? MinutesPerHour + min : min ); +} +function SecFromTime( t ) { + var sec = Math.floor( t / msPerSecond ) % SecondsPerMinute; + return ( (sec < 0 ) ? SecondsPerMinute + sec : sec ); +} +function msFromTime( t ) { + var ms = t % msPerSecond; + return ( (ms < 0 ) ? msPerSecond + ms : ms ); +} +function LocalTZA() { + return ( TZ_DIFF * msPerHour ); +} +function UTC( t ) { + return ( t - LocalTZA() - DaylightSavingTA(t - LocalTZA()) ); +} + +function DaylightSavingTA( t ) { + t = t - LocalTZA(); + + var dst_start = GetDSTStart(t); + var dst_end = GetDSTEnd(t); + + if ( t >= dst_start && t < dst_end ) + return msPerHour; + + return 0; +} + +function GetFirstSundayInMonth( t, m ) { + var year = YearFromTime(t); + var leap = InLeapYear(t); + +// month m 0..11 +// april == 3 +// march == 2 + + // set time to first day of month m + var time = TimeFromYear(year); + for (var i = 0; i < m; ++i) + { + time += TimeInMonth(i, leap); + } + + for ( var first_sunday = time; WeekDay(first_sunday) > 0; + first_sunday += msPerDay ) + { + ; + } + + return first_sunday; +} + +function GetLastSundayInMonth( t, m ) { + var year = YearFromTime(t); + var leap = InLeapYear(t); + +// month m 0..11 +// april == 3 +// march == 2 + + // first day of following month + var time = TimeFromYear(year); + for (var i = 0; i <= m; ++i) + { + time += TimeInMonth(i, leap); + } + // prev day == last day of month + time -= msPerDay; + + for ( var last_sunday = time; WeekDay(last_sunday) > 0; + last_sunday -= msPerDay ) + { + ; + } + return last_sunday; +} + +/* + 15.9.1.9 Daylight Saving Time Adjustment + + The implementation of ECMAScript should not try to determine whether + the exact time was subject to daylight saving time, but just whether + daylight saving time would have been in effect if the current + daylight saving time algorithm had been used at the time. This avoids + complications such as taking into account the years that the locale + observed daylight saving time year round. +*/ + +/* + US DST algorithm + + Before 2007, DST starts first Sunday in April at 2 AM and ends last + Sunday in October at 2 AM + + Starting in 2007, DST starts second Sunday in March at 2 AM and ends + first Sunday in November at 2 AM + + Note that different operating systems behave differently. + + Fully patched Windows XP uses the 2007 algorithm for all dates while + fully patched Fedora Core 6 and RHEL 4 Linux use the algorithm in + effect at the time. + + Since pre-2007 DST is a subset of 2007 DST rules, this only affects + tests that occur in the period Mar-Apr and Oct-Nov where the two + algorithms do not agree. + +*/ + +function GetDSTStart( t ) +{ + return (GetFirstSundayInMonth(t, 2) + 7*msPerDay + 2*msPerHour - LocalTZA()); +} + +function GetDSTEnd( t ) +{ + return (GetFirstSundayInMonth(t, 10) + 2*msPerHour - LocalTZA()); +} + +function GetOldDSTStart( t ) +{ + return (GetFirstSundayInMonth(t, 3) + 2*msPerHour - LocalTZA()); +} + +function GetOldDSTEnd( t ) +{ + return (GetLastSundayInMonth(t, 9) + 2*msPerHour - LocalTZA()); +} + +function LocalTime( t ) { + return ( t + LocalTZA() + DaylightSavingTA(t) ); +} +function MakeTime( hour, min, sec, ms ) { + if ( isNaN( hour ) || isNaN( min ) || isNaN( sec ) || isNaN( ms ) ) { + return Number.NaN; + } + + hour = ToInteger(hour); + min = ToInteger( min); + sec = ToInteger( sec); + ms = ToInteger( ms ); + + return( (hour*msPerHour) + (min*msPerMinute) + + (sec*msPerSecond) + ms ); +} +function MakeDay( year, month, date ) { + if ( isNaN(year) || isNaN(month) || isNaN(date) ) { + return Number.NaN; + } + year = ToInteger(year); + month = ToInteger(month); + date = ToInteger(date ); + + var sign = ( year < 1970 ) ? -1 : 1; + var t = ( year < 1970 ) ? 1 : 0; + var y = ( year < 1970 ) ? 1969 : 1970; + + var result5 = year + Math.floor( month/12 ); + var result6 = month % 12; + + if ( year < 1970 ) { + for ( y = 1969; y >= year; y += sign ) { + t += sign * TimeInYear(y); + } + } else { + for ( y = 1970 ; y < year; y += sign ) { + t += sign * TimeInYear(y); + } + } + + var leap = InLeapYear( t ); + + for ( var m = 0; m < month; m++ ) { + t += TimeInMonth( m, leap ); + } + + if ( YearFromTime(t) != result5 ) { + return Number.NaN; + } + if ( MonthFromTime(t) != result6 ) { + return Number.NaN; + } + if ( DateFromTime(t) != 1 ) { + return Number.NaN; + } + + return ( (Day(t)) + date - 1 ); +} +function TimeInMonth( month, leap ) { + // september april june november + // jan 0 feb 1 mar 2 apr 3 may 4 june 5 jul 6 + // aug 7 sep 8 oct 9 nov 10 dec 11 + + if ( month == 3 || month == 5 || month == 8 || month == 10 ) { + return ( 30*msPerDay ); + } + + // all the rest + if ( month == 0 || month == 2 || month == 4 || month == 6 || + month == 7 || month == 9 || month == 11 ) { + return ( 31*msPerDay ); + } + + // save february + return ( (leap == 0) ? 28*msPerDay : 29*msPerDay ); +} +function MakeDate( day, time ) { + if ( day == Number.POSITIVE_INFINITY || + day == Number.NEGATIVE_INFINITY ) { + return Number.NaN; + } + if ( time == Number.POSITIVE_INFINITY || + time == Number.NEGATIVE_INFINITY ) { + return Number.NaN; + } + return ( day * msPerDay ) + time; +} +function TimeClip( t ) { + if ( isNaN( t ) ) { + return ( Number.NaN ); + } + if ( Math.abs( t ) > 8.64e15 ) { + return ( Number.NaN ); + } + + return ( ToInteger( t ) ); +} +function ToInteger( t ) { + t = Number( t ); + + if ( isNaN( t ) ){ + return ( Number.NaN ); + } + if ( t == 0 || t == -0 || + t == Number.POSITIVE_INFINITY || t == Number.NEGATIVE_INFINITY ) { + return 0; + } + + var sign = ( t < 0 ) ? -1 : 1; + + return ( sign * Math.floor( Math.abs( t ) ) ); +} +function Enumerate ( o ) { + var p; + for ( p in o ) { + print( p +": " + o[p] ); + } +} + diff --git a/js/src/tests/ecma_3/Exceptions/15.11.1.1.js b/js/src/tests/ecma_3/Exceptions/15.11.1.1.js new file mode 100644 index 000000000..bcba1613a --- /dev/null +++ b/js/src/tests/ecma_3/Exceptions/15.11.1.1.js @@ -0,0 +1,103 @@ +/* -*- 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: 27 Nov 2002 + * SUMMARY: Ensuring normal function call of Error (ECMA-262 Ed.3 15.11.1.1). + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = ''; +var summary = 'Ensuring normal function call of Error (ECMA-262 Ed.3 15.11.1.1)'; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; +var EMPTY_STRING = ''; +var EXPECTED_FORMAT = 0; + + +function otherScope(msg) +{ + return Error(msg); +} + + +status = inSection(1); +var err1 = Error('msg1'); +actual = examineThis(err1, 'msg1'); +expect = EXPECTED_FORMAT; +addThis(); + +status = inSection(2); +var err2 = otherScope('msg2'); +actual = examineThis(err2, 'msg2'); +expect = EXPECTED_FORMAT; +addThis(); + +status = inSection(3); +var err3 = otherScope(); +actual = examineThis(err3, EMPTY_STRING); +expect = EXPECTED_FORMAT; +addThis(); + +status = inSection(4); +var err4 = eval("Error('msg4')"); +actual = examineThis(err4, 'msg4'); +expect = EXPECTED_FORMAT; +addThis(); + + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + + + +/* + * Searches err.toString() for err.name + ':' + err.message, + * with possible whitespace on each side of the colon sign. + * + * We allow for no colon in case err.message was not provided by the user. + * In such a case, SpiderMonkey and Rhino currently set err.message = '', + * as allowed for by ECMA 15.11.4.3. This makes |pattern| work in this case. + * + * If this is ever changed to a non-empty string, e.g. 'undefined', + * you may have to modify |pattern| to take that into account - + * + */ +function examineThis(err, msg) +{ + var pattern = err.name + '\\s*:?\\s*' + msg; + return err.toString().search(RegExp(pattern)); +} + + +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/Exceptions/15.11.4.4-1.js b/js/src/tests/ecma_3/Exceptions/15.11.4.4-1.js new file mode 100644 index 000000000..333460137 --- /dev/null +++ b/js/src/tests/ecma_3/Exceptions/15.11.4.4-1.js @@ -0,0 +1,140 @@ +/* -*- 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: 22 Jan 2002 + * SUMMARY: Testing Error.prototype.toString() + * + * Revised: 25 Nov 2002 + * See http://bugzilla.mozilla.org/show_bug.cgi?id=181909 + * + * Note that ECMA-262 3rd Edition Final, Section 15.11.4.4 states that + * Error.prototype.toString() returns an implementation-dependent string. + * Therefore any testcase on this property is somewhat arbitrary. + * + * However, d-russo@ti.com pointed out that Rhino was returning this: + * + * js> err = new Error() + * undefined: undefined + * + * js> err = new Error("msg") + * undefined: msg + * + * + * We expect Rhino to return what SpiderMonkey currently does: + * + * js> err = new Error() + * Error + * + * js> err = new Error("msg") + * Error: msg + * + * + * i.e. we expect err.toString() === err.name if err.message is not defined; + * otherwise, we expect err.toString() === err.name + ': ' + err.message. + * + * See also ECMA 15.11.4.2, 15.11.4.3 + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = '(none)'; +var summary = 'Testing Error.prototype.toString()'; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; +var EMPTY_STRING = ''; +var EXPECTED_FORMAT = 0; + + +status = inSection(1); +var err1 = new Error('msg1'); +actual = examineThis(err1, 'msg1'); +expect = EXPECTED_FORMAT; +addThis(); + +status = inSection(2); +var err2 = new Error(err1); +actual = examineThis(err2, err1); +expect = EXPECTED_FORMAT; +addThis(); + +status = inSection(3); +var err3 = new Error(); +actual = examineThis(err3, EMPTY_STRING); +expect = EXPECTED_FORMAT; +addThis(); + +status = inSection(4); +var err4 = new Error(EMPTY_STRING); +actual = examineThis(err4, EMPTY_STRING); +expect = EXPECTED_FORMAT; +addThis(); + +// now generate a run-time error - +status = inSection(5); +try +{ + eval('1=2'); +} +catch(err5) +{ + actual = examineThis(err5, '.*'); +} +expect = EXPECTED_FORMAT; +addThis(); + + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + + + +/* + * Searches err.toString() for err.name + ':' + err.message, + * with possible whitespace on each side of the colon sign. + * + * We allow for no colon in case err.message was not provided by the user. + * In such a case, SpiderMonkey and Rhino currently set err.message = '', + * as allowed for by ECMA 15.11.4.3. This makes |pattern| work in this case. + * + * If this is ever changed to a non-empty string, e.g. 'undefined', + * you may have to modify |pattern| to take that into account - + * + */ +function examineThis(err, msg) +{ + var pattern = err.name + '\\s*:?\\s*' + msg; + return err.toString().search(RegExp(pattern)); +} + + +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/Exceptions/15.11.5.js b/js/src/tests/ecma_3/Exceptions/15.11.5.js new file mode 100644 index 000000000..f61d74ecd --- /dev/null +++ b/js/src/tests/ecma_3/Exceptions/15.11.5.js @@ -0,0 +1,36 @@ +/* -*- 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: 4 Oct 2010 + * SUMMARY: Error instances have no special properties beyond those inherited + * from the Error prototype object + */ +//----------------------------------------------------------------------------- +var summary = 'Error instances have no special properties beyond those inherited the Error prototype object'; + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printStatus (summary); + + var actual = { name: "no error", message: "no message" }; + try { + new Error.prototype; + } catch (e) { + actual = e; + } + + reportCompare("TypeError", actual.name, "must be a TypeError"); + reportCompare(true, /not a constructor/.test(actual.message), + "message must indicate not a constructor"); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/Exceptions/15.11.7.6-001.js b/js/src/tests/ecma_3/Exceptions/15.11.7.6-001.js new file mode 100644 index 000000000..4c7dfb862 --- /dev/null +++ b/js/src/tests/ecma_3/Exceptions/15.11.7.6-001.js @@ -0,0 +1,96 @@ +/* -*- 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: 14 April 2003 + * SUMMARY: Prototype of predefined error objects should be DontEnum + * See http://bugzilla.mozilla.org/show_bug.cgi?id=201989 + * + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = 201989; +var summary = 'Prototype of predefined error objects should be DontEnum'; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; + + +/* + * Tests that |F.prototype| is not enumerable in |F| + */ +function testDontEnum(F) +{ + var proto = F.prototype; + + for (var prop in F) + { + if (F[prop] === proto) + return false; + } + return true; +} + + +var list = [ + "Error", + "ConversionError", + "EvalError", + "RangeError", + "ReferenceError", + "SyntaxError", + "TypeError", + "URIError" + ]; + + +for (i in list) +{ + var F = this[list[i]]; + + // Test for |F|; e.g. Rhino defines |ConversionError| while SM does not. + if (F) + { + status = 'Testing DontEnum attribute of |' + list[i] + '.prototype|'; + actual = testDontEnum(F); + expect = true; + 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/Exceptions/15.11.7.6-002.js b/js/src/tests/ecma_3/Exceptions/15.11.7.6-002.js new file mode 100644 index 000000000..b2a279217 --- /dev/null +++ b/js/src/tests/ecma_3/Exceptions/15.11.7.6-002.js @@ -0,0 +1,98 @@ +/* -*- 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: 14 April 2003 + * SUMMARY: Prototype of predefined error objects should be DontDelete + * See http://bugzilla.mozilla.org/show_bug.cgi?id=201989 + * + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = 201989; +var summary = 'Prototype of predefined error objects should be DontDelete'; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; + + +/* + * Tests that |F.prototype| is DontDelete + */ +function testDontDelete(F) +{ + var e; + var orig = F.prototype; + try + { + delete F.prototype; + } + catch (e) + { + } + return F.prototype === orig; +} + + +var list = [ + "Error", + "ConversionError", + "EvalError", + "RangeError", + "ReferenceError", + "SyntaxError", + "TypeError", + "URIError" + ]; + + +for (i in list) +{ + var F = this[list[i]]; + + // Test for |F|; e.g. Rhino defines |ConversionError| while SM does not. + if (F) + { + status = 'Testing DontDelete attribute of |' + list[i] + '.prototype|'; + actual = testDontDelete(F); + expect = true; + 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/Exceptions/15.11.7.6-003.js b/js/src/tests/ecma_3/Exceptions/15.11.7.6-003.js new file mode 100644 index 000000000..faf8e133c --- /dev/null +++ b/js/src/tests/ecma_3/Exceptions/15.11.7.6-003.js @@ -0,0 +1,98 @@ +/* -*- 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: 14 April 2003 + * SUMMARY: Prototype of predefined error objects should be ReadOnly + * See http://bugzilla.mozilla.org/show_bug.cgi?id=201989 + * + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = 201989; +var summary = 'Prototype of predefined error objects should be ReadOnly'; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; + + +/* + * Tests that |F.prototype| is ReadOnly + */ +function testReadOnly(F) +{ + var e; + var orig = F.prototype; + try + { + F.prototype = new Object(); + } + catch (e) + { + } + return F.prototype === orig; +} + + +var list = [ + "Error", + "ConversionError", + "EvalError", + "RangeError", + "ReferenceError", + "SyntaxError", + "TypeError", + "URIError" + ]; + + +for (i in list) +{ + var F = this[list[i]]; + + // Test for |F|; e.g. Rhino defines |ConversionError| while SM does not. + if (F) + { + status = 'Testing ReadOnly attribute of |' + list[i] + '.prototype|'; + actual = testReadOnly(F); + expect = true; + 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/Exceptions/binding-001.js b/js/src/tests/ecma_3/Exceptions/binding-001.js new file mode 100644 index 000000000..dc070ac95 --- /dev/null +++ b/js/src/tests/ecma_3/Exceptions/binding-001.js @@ -0,0 +1,94 @@ +/* -*- 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: 2001-08-27 + * + * SUMMARY: Testing binding of function names + * + * Brendan: + * + * "... the question is, does Rhino bind 'sum' in the global object + * for the following test? If it does, it's buggy. + * + * var f = function sum(){}; + * print(sum); // should fail with 'sum is not defined' " + * + */ + +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = '(none)'; +var summary = 'Testing binding of function names'; +var ERR_REF_YES = 'ReferenceError'; +var ERR_REF_NO = 'did NOT generate a ReferenceError'; +var statusitems = []; +var actualvalues = []; +var expectedvalues = []; +var status = summary; +var actual = ERR_REF_NO; +var expect= ERR_REF_YES; + + +try +{ + var f = function sum(){}; + print(sum); +} +catch (e) +{ + status = 'Section 1 of test'; + actual = e instanceof ReferenceError; + expect = true; + addThis(); + + + /* + * This test is more literal, and one day may not be valid. + * Searching for literal string "ReferenceError" in e.toString() + */ + status = 'Section 2 of test'; + var match = e.toString().search(/ReferenceError/); + actual = (match > -1); + expect = true; + addThis(); +} + + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + + +function addThis() +{ + statusitems[UBound] = status; + actualvalues[UBound] = isReferenceError(actual); + expectedvalues[UBound] = isReferenceError(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'); +} + + +// converts a Boolean result into a textual result - +function isReferenceError(bResult) +{ + return bResult? ERR_REF_YES : ERR_REF_NO; +} diff --git a/js/src/tests/ecma_3/Exceptions/browser.js b/js/src/tests/ecma_3/Exceptions/browser.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/ecma_3/Exceptions/browser.js diff --git a/js/src/tests/ecma_3/Exceptions/regress-181654.js b/js/src/tests/ecma_3/Exceptions/regress-181654.js new file mode 100644 index 000000000..2dbbd0705 --- /dev/null +++ b/js/src/tests/ecma_3/Exceptions/regress-181654.js @@ -0,0 +1,121 @@ +/* -*- 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: 23 Nov 2002 + * SUMMARY: Calling toString for an object derived from the Error class + * results in an TypeError (Rhino only) + * See http://bugzilla.mozilla.org/show_bug.cgi?id=181654 + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = '181654'; +var summary = 'Calling toString for an object derived from the Error class should be possible.'; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; +var EMPTY_STRING = ''; +var EXPECTED_FORMAT = 0; + + +// derive MyError from Error +function MyError( msg ) +{ + this.message = msg; +} +MyError.prototype = new Error(); +MyError.prototype.name = "MyError"; + + +status = inSection(1); +var err1 = new MyError('msg1'); +actual = examineThis(err1, 'msg1'); +expect = EXPECTED_FORMAT; +addThis(); + +status = inSection(2); +var err2 = new MyError(String(err1)); +actual = examineThis(err2, err1); +expect = EXPECTED_FORMAT; +addThis(); + +status = inSection(3); +var err3 = new MyError(); +actual = examineThis(err3, EMPTY_STRING); +expect = EXPECTED_FORMAT; +addThis(); + +status = inSection(4); +var err4 = new MyError(EMPTY_STRING); +actual = examineThis(err4, EMPTY_STRING); +expect = EXPECTED_FORMAT; +addThis(); + +// now generate an error - +status = inSection(5); +try +{ + throw new MyError("thrown"); +} +catch(err5) +{ + actual = examineThis(err5, "thrown"); +} +expect = EXPECTED_FORMAT; +addThis(); + + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + + + +/* + * Searches err.toString() for err.name + ':' + err.message, + * with possible whitespace on each side of the colon sign. + * + * We allow for no colon in case err.message was not provided by the user. + * In such a case, SpiderMonkey and Rhino currently set err.message = '', + * as allowed for by ECMA 15.11.4.3. This makes |pattern| work in this case. + * + * If this is ever changed to a non-empty string, e.g. 'undefined', + * you may have to modify |pattern| to take that into account - + * + */ +function examineThis(err, msg) +{ + var pattern = err.name + '\\s*:?\\s*' + msg; + return err.toString().search(RegExp(pattern)); +} + + +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/Exceptions/regress-181914.js b/js/src/tests/ecma_3/Exceptions/regress-181914.js new file mode 100644 index 000000000..88934ee73 --- /dev/null +++ b/js/src/tests/ecma_3/Exceptions/regress-181914.js @@ -0,0 +1,160 @@ +/* -*- 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: 25 Nov 2002 + * SUMMARY: Calling a user-defined superconstructor + * See http://bugzilla.mozilla.org/show_bug.cgi?id=181914, esp. Comment 10. + * + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = '181914'; +var summary = 'Calling a user-defined superconstructor'; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; +var EMPTY_STRING = ''; +var EXPECTED_FORMAT = 0; + + +// make a user-defined version of the Error constructor +function _Error(msg) +{ + this.message = msg; +} +_Error.prototype = new Error(); +_Error.prototype.name = '_Error'; + + +// derive MyApplyError from _Error +function MyApplyError(msg) +{ + if(this instanceof MyApplyError) + _Error.apply(this, arguments); + else + return new MyApplyError(msg); +} +MyApplyError.prototype = new _Error(); +MyApplyError.prototype.name = "MyApplyError"; + + +// derive MyCallError from _Error +function MyCallError(msg) +{ + if(this instanceof MyCallError) + _Error.call(this, msg); + else + return new MyCallError(msg); +} +MyCallError.prototype = new _Error(); +MyCallError.prototype.name = "MyCallError"; + + +function otherScope(msg) +{ + return MyApplyError(msg); +} + + +status = inSection(1); +var err1 = new MyApplyError('msg1'); +actual = examineThis(err1, 'msg1'); +expect = EXPECTED_FORMAT; +addThis(); + +status = inSection(2); +var err2 = new MyCallError('msg2'); +actual = examineThis(err2, 'msg2'); +expect = EXPECTED_FORMAT; +addThis(); + +status = inSection(3); +var err3 = MyApplyError('msg3'); +actual = examineThis(err3, 'msg3'); +expect = EXPECTED_FORMAT; +addThis(); + +status = inSection(4); +var err4 = MyCallError('msg4'); +actual = examineThis(err4, 'msg4'); +expect = EXPECTED_FORMAT; +addThis(); + +status = inSection(5); +var err5 = otherScope('msg5'); +actual = examineThis(err5, 'msg5'); +expect = EXPECTED_FORMAT; +addThis(); + +status = inSection(6); +var err6 = otherScope(); +actual = examineThis(err6, EMPTY_STRING); +expect = EXPECTED_FORMAT; +addThis(); + +status = inSection(7); +var err7 = eval("MyApplyError('msg7')"); +actual = examineThis(err7, 'msg7'); +expect = EXPECTED_FORMAT; +addThis(); + +status = inSection(8); +var err8; +try +{ + throw MyApplyError('msg8'); +} +catch(e) +{ + if(e instanceof Error) + err8 = e; +} +actual = examineThis(err8, 'msg8'); +expect = EXPECTED_FORMAT; +addThis(); + + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + + + +// Searches |err.toString()| for |err.name + ':' + err.message| +function examineThis(err, msg) +{ + var pattern = err.name + '\\s*:?\\s*' + msg; + return err.toString().search(RegExp(pattern)); +} + + +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/Exceptions/regress-58946.js b/js/src/tests/ecma_3/Exceptions/regress-58946.js new file mode 100644 index 000000000..e24ccc77e --- /dev/null +++ b/js/src/tests/ecma_3/Exceptions/regress-58946.js @@ -0,0 +1,36 @@ +/* -*- 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/. */ + +//------------------------------------------------------------------------------------------------- +var BUGNUMBER = '58946'; +var stat = 'Testing a return statement inside a catch statement inside a function'; + +test(); + +function test() { + enterFunc ("test"); + printBugNumber(BUGNUMBER); + printStatus (stat); + + expect = 'PASS'; + + function f() + { + try + { + throw 'PASS'; + } + catch(e) + { + return e; + } + } + + actual = f(); + + reportCompare(expect, actual, stat); + + exitFunc ("test"); +} diff --git a/js/src/tests/ecma_3/Exceptions/regress-95101.js b/js/src/tests/ecma_3/Exceptions/regress-95101.js new file mode 100644 index 000000000..5585ae04f --- /dev/null +++ b/js/src/tests/ecma_3/Exceptions/regress-95101.js @@ -0,0 +1,84 @@ +/* -*- 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: 13 August 2001 + * + * SUMMARY: Invoking an undefined function should produce a ReferenceError + * See http://bugzilla.mozilla.org/show_bug.cgi?id=95101 + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = 95101; +var summary = 'Invoking an undefined function should produce a ReferenceError'; +var msgERR_REF_YES = 'ReferenceError'; +var msgERR_REF_NO = 'did NOT generate a ReferenceError'; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; + + +try +{ + xxxyyyzzz(); +} +catch (e) +{ + status = 'Section 1 of test'; + actual = e instanceof ReferenceError; + expect = true; + addThis(); + + + /* + * This test is more literal, and may one day be invalid. + * Searching for literal string "ReferenceError" in e.toString() + */ + status = 'Section 2 of test'; + var match = e.toString().search(/ReferenceError/); + actual = (match > -1); + expect = true; + addThis(); +} + + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + + +function addThis() +{ + statusitems[UBound] = status; + actualvalues[UBound] = isReferenceError(actual); + expectedvalues[UBound] = isReferenceError(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'); +} + + +// converts a Boolean result into a textual result - +function isReferenceError(bResult) +{ + return bResult? msgERR_REF_YES : msgERR_REF_NO; +} diff --git a/js/src/tests/ecma_3/Exceptions/shell.js b/js/src/tests/ecma_3/Exceptions/shell.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/ecma_3/Exceptions/shell.js diff --git a/js/src/tests/ecma_3/ExecutionContexts/10.1.3-1.js b/js/src/tests/ecma_3/ExecutionContexts/10.1.3-1.js new file mode 100644 index 000000000..eb29e55e5 --- /dev/null +++ b/js/src/tests/ecma_3/ExecutionContexts/10.1.3-1.js @@ -0,0 +1,167 @@ +/* -*- 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 + * + * Note: given function f(x,x,x,x) {return x;}; f(1,2,3,4) should return 4. + * See ECMA-262 3rd Edition Final Section 10.1.3: Variable Instantiation + * + * Also see http://bugzilla.mozilla.org/show_bug.cgi?id=124900 + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = 124900; +var summary = 'Testing functions having duplicate formal parameter names'; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; + + +function f1(x,x) +{ + return x; +} +status = inSection(1); +actual = f1(1,2); +expect = 2; +addThis(); + + +function f2(x,x,x) +{ + return x*x*x; +} +status = inSection(2); +actual = f2(1,2,3); +expect = 27; +addThis(); + + +function f3(x,x,x,x) +{ + return 'a' + x + 'b' + x + 'c' + x ; +} +status = inSection(3); +actual = f3(1,2,3,4); +expect = 'a4b4c4'; +addThis(); + + +/* + * If the value of the last duplicate parameter is not provided by + * the function caller, the value of this parameter is undefined + */ +function f4(x,a,b,x,z) +{ + return x; +} +status = inSection(4); +actual = f4(1,2); +expect = undefined; +addThis(); + + +/* + * f.toString() should preserve any duplicate formal parameter names that exist + */ +function f5(x,x,x,x) +{ +} +status = inSection(5); +actual = f5.toString().match(/\((.*)\)/)[1]; +actual = actual.replace(/\s/g, ''); // for definiteness, remove any white space +expect = 'x,x,x,x'; +addThis(); + + +function f6(x,x,x,x) +{ + var ret = []; + + for (var i=0; i<arguments.length; i++) + ret.push(arguments[i]); + + return ret.toString(); +} +status = inSection(6); +actual = f6(1,2,3,4); +expect = '1,2,3,4'; +addThis(); + + +/* + * This variation (assigning to x inside f) is from nboyd@atg.com + * See http://bugzilla.mozilla.org/show_bug.cgi?id=124900 + */ +function f7(x,x,x,x) +{ + x = 999; + var ret = []; + + for (var i=0; i<arguments.length; i++) + ret.push(arguments[i]); + + return ret.toString(); +} +status = inSection(7); +actual = f7(1,2,3,4); +expect = '1,2,3,999'; +addThis(); + + +/* + * Same as above, but with |var| keyword added - + */ +function f8(x,x,x,x) +{ + var x = 999; + var ret = []; + + for (var i=0; i<arguments.length; i++) + ret.push(arguments[i]); + + return ret.toString(); +} +status = inSection(8); +actual = f8(1,2,3,4); +expect = '1,2,3,999'; +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/ExecutionContexts/10.1.3-2.js b/js/src/tests/ecma_3/ExecutionContexts/10.1.3-2.js new file mode 100644 index 000000000..295a58d4b --- /dev/null +++ b/js/src/tests/ecma_3/ExecutionContexts/10.1.3-2.js @@ -0,0 +1,37 @@ +/* -*- 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 = 395907; +var summary = 'eval of function declaration should change existing variable'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + expect = 'typeof x: number, typeof x: function, x(): true'; + var x = "string"; + function f () { + var x = 0; + actual += 'typeof x: ' + (typeof x) + ', '; + eval('function x() { return true; }'); + actual += 'typeof x: ' + (typeof x) + ', '; + actual += 'x(): ' + x(); + } + f(); + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/ExecutionContexts/10.1.3.js b/js/src/tests/ecma_3/ExecutionContexts/10.1.3.js new file mode 100644 index 000000000..0911afcb6 --- /dev/null +++ b/js/src/tests/ecma_3/ExecutionContexts/10.1.3.js @@ -0,0 +1,37 @@ +/* -*- 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/. */ + + +/** + ECMA Section: 10.1.3: Variable Instantiation + FunctionDeclarations are processed before VariableDeclarations, and + VariableDeclarations don't replace existing values with undefined +*/ + +test(); + +function f() +{ + var x; + + return typeof x; + + function x() + { + return 7; + } +} + +function test() +{ + enterFunc ("test"); + + printStatus ("ECMA Section: 10.1.3: Variable Instantiation."); + printBugNumber (17290); + + reportCompare ("function", f(), "Declaration precedence test"); + + exitFunc("test"); +} diff --git a/js/src/tests/ecma_3/ExecutionContexts/10.1.4-1.js b/js/src/tests/ecma_3/ExecutionContexts/10.1.4-1.js new file mode 100644 index 000000000..95cc5b476 --- /dev/null +++ b/js/src/tests/ecma_3/ExecutionContexts/10.1.4-1.js @@ -0,0 +1,49 @@ +/* -*- 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/. */ + + +/** + ECMA Section: 10.1.4.1 Entering An Execution Context + ECMA says: + * Global Code, Function Code + Variable instantiation is performed using the global object as the + variable object and using property attributes { DontDelete }. + + * Eval Code + Variable instantiation is performed using the calling context's + variable object and using empty property attributes. +*/ + +var BUGNUMBER = '(none)'; +var summary = '10.1.4.1 Entering An Execution Context'; +var actual = ''; +var expect = ''; + +test(); + +function test() +{ + enterFunc ("test"); + printBugNumber(BUGNUMBER); + printStatus (summary); + + var y; + eval("var x = 1"); + + if (delete y) + reportCompare('PASS', 'FAIL', "Expected *NOT* to be able to delete y"); + + if (typeof x == "undefined") + reportCompare('PASS', 'FAIL', "x did not remain defined after eval()"); + else if (x != 1) + reportCompare('PASS', 'FAIL', "x did not retain it's value after eval()"); + + if (!delete x) + reportCompare('PASS', 'FAIL', "Expected to be able to delete x"); + + reportCompare('PASS', 'PASS', '10.1.4.1 Entering An Execution Context'); + + exitFunc("test"); +} diff --git a/js/src/tests/ecma_3/ExecutionContexts/10.6.1-01.js b/js/src/tests/ecma_3/ExecutionContexts/10.6.1-01.js new file mode 100644 index 000000000..3de644571 --- /dev/null +++ b/js/src/tests/ecma_3/ExecutionContexts/10.6.1-01.js @@ -0,0 +1,103 @@ +/* -*- 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 = 290774; +var summary = 'activation object never delegates to Object.prototype'; +var actual = ''; +var expect = ''; + +printBugNumber(BUGNUMBER); +printStatus (summary); + +var toStringResult; +var evalResult; +var watchResult; +var parseIntResult; + +var eval = 'fooEval'; +var watch = undefined; +var parseInt = 'fooParseInt'; + + +function toString() +{ + return 'fooString'; +} + +function normal() +{ + toStringResult = toString; + evalResult = eval; + watchResult = watch; + parseIntResult = parseInt; +} + +function outerinnervar() +{ + toStringResult = toString; + evalResult = eval; + watchResult = watch; + parseIntResult = parseInt; + function inner() + { + // addition of any statement + // which accesses a variable + // from the outer scope causes the bug + printStatus(toString); + } +} + +expect = true; + +printStatus('normal'); +printStatus('======'); +normal(); + +printStatus('toStringResult ' + toStringResult); +printStatus('toString ' + toString); +actual = ((toStringResult + '') == (toString + '')); +reportCompare(expect, actual, inSection(1)); + +printStatus('evalResult ' + evalResult); +printStatus('eval ' + eval); +actual = ((evalResult + '') == (eval + '')); +reportCompare(expect, actual, inSection(2)); + +printStatus('watchResult ' + watchResult); +printStatus('watch ' + watch); +actual = ((watchResult + '') == (watch + '')); +reportCompare(expect, actual, inSection(3)); + +printStatus('parseIntResult ' + parseIntResult); +printStatus('parseInt ' + parseInt); +actual = ((parseIntResult + '') == (parseInt + '')); +reportCompare(expect, actual, inSection(4)); + +printStatus('outerinner'); +printStatus('=========='); + +outerinnervar(); + +printStatus('toStringResult ' + toStringResult); +printStatus('toString ' + toString); +actual = ((toStringResult + '') == (toString + '')); +reportCompare(expect, actual, inSection(5)); + + +printStatus('evalResult ' + evalResult); +printStatus('eval ' + eval); +actual = ((evalResult + '') == (eval + '')); +reportCompare(expect, actual, inSection(6)); + +printStatus('watchResult ' + watchResult); +printStatus('watch ' + watch); +actual = ((watchResult + '') == (watch + '')); +reportCompare(expect, actual, inSection(7)); + +printStatus('parseIntResult ' + parseIntResult); +printStatus('parseInt ' + parseInt); +actual = ((parseIntResult + '') == (parseInt + '')); +reportCompare(expect, actual, inSection(8)); diff --git a/js/src/tests/ecma_3/ExecutionContexts/browser.js b/js/src/tests/ecma_3/ExecutionContexts/browser.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/ecma_3/ExecutionContexts/browser.js diff --git a/js/src/tests/ecma_3/ExecutionContexts/regress-23346.js b/js/src/tests/ecma_3/ExecutionContexts/regress-23346.js new file mode 100644 index 000000000..1b22b8c51 --- /dev/null +++ b/js/src/tests/ecma_3/ExecutionContexts/regress-23346.js @@ -0,0 +1,35 @@ +/* -*- tab-width: 8; 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/. */ + + +var CALL_CALLED = "PASSED"; + +test(); + +function f(x) +{ + if (x) + return call(); + + return "FAILED!"; +} + +function call() +{ + return CALL_CALLED; +} + +function test() +{ + enterFunc ("test"); + + printStatus ("ECMA Section: 10.1.3: Variable Instantiation."); + printBugNumber (23346); + + reportCompare ("PASSED", f(true), + "Unqualified reference should not see Function.prototype"); + + exitFunc("test"); +} diff --git a/js/src/tests/ecma_3/ExecutionContexts/regress-448595-01.js b/js/src/tests/ecma_3/ExecutionContexts/regress-448595-01.js new file mode 100644 index 000000000..36359eb2a --- /dev/null +++ b/js/src/tests/ecma_3/ExecutionContexts/regress-448595-01.js @@ -0,0 +1,58 @@ +/* -*- 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 = 448595; +var summary = 'scope chain var declaration with initialiser in |with| clauses'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + var f; + + expect = 'bar'; + + f = function(){ + var e = "bar"; + with({e:"foo"}) { + var e = "wibble"; + }; + + actual = e; + } + + f(); + + reportCompare(expect, actual, summary + ': with'); + + f = function(){ + var e = "bar"; + try + { + throw {e:"foo"}; + } + catch(e) { + var e = "wibble"; + }; + + actual = e; + } + + f(); + + reportCompare(expect, actual, summary + ': catch'); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/ExecutionContexts/shell.js b/js/src/tests/ecma_3/ExecutionContexts/shell.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/ecma_3/ExecutionContexts/shell.js diff --git a/js/src/tests/ecma_3/Expressions/11.10-01.js b/js/src/tests/ecma_3/Expressions/11.10-01.js new file mode 100644 index 000000000..1810f5797 --- /dev/null +++ b/js/src/tests/ecma_3/Expressions/11.10-01.js @@ -0,0 +1,43 @@ +/* -*- 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 = 396969; +var summary = '11.10 - & should evaluate operands in order'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + expect = 'o.valueOf, p.valueOf'; + var actualval; + var expectval = 2; + + var o = { + valueOf: (function (){ actual += 'o.valueOf'; return this.value}), + value:42 + }; + + var p = { + valueOf: (function (){ actual += ', p.valueOf'; return this.value}), + value:2 + }; + + actualval = (o & p); + + reportCompare(expectval, actualval, summary + ': value'); + reportCompare(expect, actual, summary + ': order'); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/Expressions/11.10-02.js b/js/src/tests/ecma_3/Expressions/11.10-02.js new file mode 100644 index 000000000..2f3e3c99d --- /dev/null +++ b/js/src/tests/ecma_3/Expressions/11.10-02.js @@ -0,0 +1,43 @@ +/* -*- 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 = 396969; +var summary = '11.10 - ^ should evaluate operands in order'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + expect = 'o.valueOf, p.valueOf'; + var actualval; + var expectval = 40; + + var o = { + valueOf: (function (){ actual += 'o.valueOf'; return this.value}), + value:42 + }; + + var p = { + valueOf: (function (){ actual += ', p.valueOf'; return this.value}), + value:2 + }; + + actualval = (o ^ p); + + reportCompare(expectval, actualval, summary + ': value'); + reportCompare(expect, actual, summary + ': order'); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/Expressions/11.10-03.js b/js/src/tests/ecma_3/Expressions/11.10-03.js new file mode 100644 index 000000000..fba85c8fa --- /dev/null +++ b/js/src/tests/ecma_3/Expressions/11.10-03.js @@ -0,0 +1,43 @@ +/* -*- 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 = 396969; +var summary = '11.10 - | should evaluate operands in order'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + expect = 'o.valueOf, p.valueOf'; + var actualval; + var expectval = 42; + + var o = { + valueOf: (function (){ actual += 'o.valueOf'; return this.value}), + value:42 + }; + + var p = { + valueOf: (function (){ actual += ', p.valueOf'; return this.value}), + value:2 + }; + + actualval = (o | p); + + reportCompare(expectval, actualval, summary + ': value'); + reportCompare(expect, actual, summary + ': order'); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/Expressions/11.6.1-1.js b/js/src/tests/ecma_3/Expressions/11.6.1-1.js new file mode 100644 index 000000000..76e71f30c --- /dev/null +++ b/js/src/tests/ecma_3/Expressions/11.6.1-1.js @@ -0,0 +1,142 @@ +/* -*- 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: 14 Mar 2003 + * SUMMARY: Testing left-associativity of the + operator + * + * See ECMA-262 Ed.3, Section 11.6.1, "The Addition operator" + * See http://bugzilla.mozilla.org/show_bug.cgi?id=196290 + * + * The upshot: |a + b + c| should always equal |(a + b) + c| + * + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = 196290; +var summary = 'Testing left-associativity of the + operator'; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; + + +status = inSection(1); +actual = 1 + 1 + 'px'; +expect = '2px'; +addThis(); + +status = inSection(2); +actual = 'px' + 1 + 1; +expect = 'px11'; +addThis(); + +status = inSection(3); +actual = 1 + 1 + 1 + 'px'; +expect = '3px'; +addThis(); + +status = inSection(4); +actual = 1 + 1 + 'a' + 1 + 1 + 'b'; +expect = '2a11b'; +addThis(); + +/* + * The next sections test the + operator via eval() + */ +status = inSection(5); +actual = sumThese(1, 1, 'a', 1, 1, 'b'); +expect = '2a11b'; +addThis(); + +status = inSection(6); +actual = sumThese(new Number(1), new Number(1), 'a'); +expect = '2a'; +addThis(); + +status = inSection(7); +actual = sumThese('a', new Number(1), new Number(1)); +expect = 'a11'; +addThis(); + + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + + + +function addThis() +{ + statusitems[UBound] = status; + actualvalues[UBound] = actual; + expectedvalues[UBound] = expect; + UBound++; +} + +/* + * Applies the + operator to the provided arguments via eval(). + * + * Form an eval string of the form 'arg1 + arg2 + arg3', but + * remember to add double-quotes inside the eval string around + * any argument that is of string type. For example, suppose the + * arguments were 11, 'a', 22. Then the eval string should be + * + * arg1 + quoteThis(arg2) + arg3 + * + * If we didn't put double-quotes around the string argument, + * we'd get this for an eval string: + * + * '11 + a + 22' + * + * If we eval() this, we get 'ReferenceError: a is not defined'. + * With proper quoting, we get eval('11 + "a" + 22') as desired. + */ +function sumThese() +{ + var sEval = ''; + var arg; + var i; + + var L = arguments.length; + for (i=0; i<L; i++) + { + arg = arguments[i]; + if (typeof arg === 'string') + arg = quoteThis(arg); + + if (i < L-1) + sEval += arg + ' + '; + else + sEval += arg; + } + + return eval(sEval); +} + + +function quoteThis(x) +{ + return '"' + x + '"'; +} + + +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/Expressions/11.7.1-01.js b/js/src/tests/ecma_3/Expressions/11.7.1-01.js new file mode 100644 index 000000000..b839c2950 --- /dev/null +++ b/js/src/tests/ecma_3/Expressions/11.7.1-01.js @@ -0,0 +1,43 @@ +/* -*- 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 = 396969; +var summary = '11.7.1 - << should evaluate operands in order'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + expect = 'o.valueOf, p.valueOf'; + var actualval; + var expectval = 168; + + var o = { + valueOf: (function (){ actual += 'o.valueOf'; return this.value}), + value:42 + }; + + var p = { + valueOf: (function (){ actual += ', p.valueOf'; return this.value}), + value:2 + }; + + actualval = (o << p); + + reportCompare(expectval, actualval, summary + ': value'); + reportCompare(expect, actual, summary + ': order'); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/Expressions/11.7.2-01.js b/js/src/tests/ecma_3/Expressions/11.7.2-01.js new file mode 100644 index 000000000..072edc7b3 --- /dev/null +++ b/js/src/tests/ecma_3/Expressions/11.7.2-01.js @@ -0,0 +1,43 @@ +/* -*- 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 = 396969; +var summary = '11.7.2 - >> should evaluate operands in order'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + expect = 'o.valueOf, p.valueOf'; + var actualval; + var expectval = 10; + + var o = { + valueOf: (function (){ actual += 'o.valueOf'; return this.value}), + value:42 + }; + + var p = { + valueOf: (function (){ actual += ', p.valueOf'; return this.value}), + value:2 + }; + + actualval = (o >> p); + + reportCompare(expectval, actualval, summary + ': value'); + reportCompare(expect, actual, summary + ': order'); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/Expressions/11.7.3-01.js b/js/src/tests/ecma_3/Expressions/11.7.3-01.js new file mode 100644 index 000000000..75227e242 --- /dev/null +++ b/js/src/tests/ecma_3/Expressions/11.7.3-01.js @@ -0,0 +1,43 @@ +/* -*- 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 = 396969; +var summary = '11.7.3 - >>> should evaluate operands in order'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + expect = 'o.valueOf, p.valueOf'; + var actualval; + var expectval = 10; + + var o = { + valueOf: (function (){ actual += 'o.valueOf'; return this.value}), + value:42 + }; + + var p = { + valueOf: (function (){ actual += ', p.valueOf'; return this.value}), + value:2 + }; + + actualval = (o >>> p); + + reportCompare(expectval, actualval, summary + ': value'); + reportCompare(expect, actual, summary + ': order'); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/Expressions/11.9.6-1.js b/js/src/tests/ecma_3/Expressions/11.9.6-1.js new file mode 100644 index 000000000..ccf9e7b64 --- /dev/null +++ b/js/src/tests/ecma_3/Expressions/11.9.6-1.js @@ -0,0 +1,179 @@ +/* -*- 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: 20 Feb 2002 + * SUMMARY: Testing the comparison |undefined === null| + * See http://bugzilla.mozilla.org/show_bug.cgi?id=126722 + * + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = 126722; +var summary = 'Testing the comparison |undefined === null|'; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; + + +status = inSection(1); +if (undefined === null) + actual = true; +else + actual = false; +expect = false; +addThis(); + + + +status = inSection(2); +switch(true) +{ +case (undefined === null) : + actual = true; + break; + +default: + actual = false; +} +expect = false; +addThis(); + + + +status = inSection(3); +function f3(x) +{ + var res = false; + + switch(true) + { + case (x === null) : + res = true; + break; + + default: + // do nothing + } + + return res; +} + +actual = f3(undefined); +expect = false; +addThis(); + + + +status = inSection(4); +function f4(arr) +{ + var elt = ''; + var res = false; + + for (i=0; i<arr.length; i++) + { + elt = arr[i]; + + switch(true) + { + case (elt === null) : + res = true; + break; + + default: + // do nothing + } + } + + return res; +} + +var arr = Array('a', undefined); +actual = f4(arr); +expect = false; +addThis(); + + + +status = inSection(5); +function f5(arr) +{ + var len = arr.length; + + for(var i=0; (arr[i]===undefined) && (i<len); i++) + ; //do nothing + + return i; +} + +/* + * An array of 5 undefined elements. Note: + * + * The return value of eval(a STATEMENT) is undefined. + * A non-existent PROPERTY is undefined, not a ReferenceError. + * No undefined element exists AFTER trailing comma at end. + * + */ +var arrUndef = [ , undefined, eval('var x = 0'), this.NOT_A_PROPERTY, , ]; +actual = f5(arrUndef); +expect = 5; +addThis(); + + + +status = inSection(6); +function f6(arr) +{ + var len = arr.length; + + for(var i=0; (arr[i]===null) && (i<len); i++) + ; //do nothing + + return i; +} + +/* + * Use same array as above. This time we're comparing to |null|, so we expect 0 + */ +actual = f6(arrUndef); +expect = 0; +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/Expressions/browser.js b/js/src/tests/ecma_3/Expressions/browser.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/ecma_3/Expressions/browser.js diff --git a/js/src/tests/ecma_3/Expressions/shell.js b/js/src/tests/ecma_3/Expressions/shell.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/ecma_3/Expressions/shell.js diff --git a/js/src/tests/ecma_3/FunExpr/browser.js b/js/src/tests/ecma_3/FunExpr/browser.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/ecma_3/FunExpr/browser.js diff --git a/js/src/tests/ecma_3/FunExpr/fe-001-n.js b/js/src/tests/ecma_3/FunExpr/fe-001-n.js new file mode 100644 index 000000000..2af7bfa25 --- /dev/null +++ b/js/src/tests/ecma_3/FunExpr/fe-001-n.js @@ -0,0 +1,22 @@ +/* -*- 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/. */ + + +DESCRIPTION = "Previous statement should have thrown a ReferenceError"; +EXPECTED = "error"; + +test(); + +function test() +{ + enterFunc ("test"); + printStatus ("Function Expression test."); + + var x = function f(){return "inner";}(); + var y = f(); + reportCompare('PASS', 'FAIL', "Previous statement should have thrown a ReferenceError"); + + exitFunc ("test"); +} diff --git a/js/src/tests/ecma_3/FunExpr/fe-001.js b/js/src/tests/ecma_3/FunExpr/fe-001.js new file mode 100644 index 000000000..65c9b7375 --- /dev/null +++ b/js/src/tests/ecma_3/FunExpr/fe-001.js @@ -0,0 +1,21 @@ +/* -*- 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/. */ + + +if (1) function f() {return 1;} +if (0) function f() {return 0;} + +function test() +{ + enterFunc ("test"); + + printStatus ("Function Expression Statements basic test."); + + reportCompare (1, f(), "Both functions were defined."); + + exitFunc ("test"); +} + +test(); diff --git a/js/src/tests/ecma_3/FunExpr/fe-002.js b/js/src/tests/ecma_3/FunExpr/fe-002.js new file mode 100644 index 000000000..bb0f1a714 --- /dev/null +++ b/js/src/tests/ecma_3/FunExpr/fe-002.js @@ -0,0 +1,25 @@ +/* -*- tab-width: 8; 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/. */ + + +function f() +{ + return "outer"; +} + +function test() +{ + enterFunc ("test"); + printStatus ("Function Expression test."); + + var x = function f(){return "inner";}(); + + reportCompare ("outer", f(), + "Inner function statement should not have been called."); + + exitFunc ("test"); +} + +test(); diff --git a/js/src/tests/ecma_3/FunExpr/regress-518103.js b/js/src/tests/ecma_3/FunExpr/regress-518103.js new file mode 100644 index 000000000..70bab0d57 --- /dev/null +++ b/js/src/tests/ecma_3/FunExpr/regress-518103.js @@ -0,0 +1,27 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +var BUGNUMBER = 518103; +var summary = 'lambda constructor "method" vs. instanceof'; +var actual; +var expect; + +printBugNumber(BUGNUMBER); +printStatus(summary); + +var Y = {widget: {}}; + +Y.widget.DataSource = function () {}; +Y.widget.DS_JSArray = function (A) { this.data = A; }; +Y.widget.DS_JSArray.prototype = new Y.widget.DataSource(); + +var J = new Y.widget.DS_JSArray( [ ] ); + +actual = J instanceof Y.widget.DataSource; +expect = true; + +reportCompare(expect, actual, summary); + +printStatus("All tests passed!"); diff --git a/js/src/tests/ecma_3/FunExpr/regress-524826.js b/js/src/tests/ecma_3/FunExpr/regress-524826.js new file mode 100644 index 000000000..da1dfbba0 --- /dev/null +++ b/js/src/tests/ecma_3/FunExpr/regress-524826.js @@ -0,0 +1,28 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +var BUGNUMBER = 524826; +var summary = 'null-closure property initialiser mis-brands object literal scope'; +var actual; +var expect; + +printBugNumber(BUGNUMBER); +printStatus(summary); + +function make(g) { + var o = {f: function(a,b) { return a*b; }, g: g}; + return o; +} +var z = -1; +var x = make(function(c) { return c*z; }); +var y = make(function(c) { return -c*z; }); + +function callg(o, c) { return o.g(c); }; +actual = callg(x, 1); +expect = -callg(y, 1); + +reportCompare(expect, actual, summary); + +printStatus("All tests passed!"); diff --git a/js/src/tests/ecma_3/FunExpr/regress-528082.js b/js/src/tests/ecma_3/FunExpr/regress-528082.js new file mode 100644 index 000000000..1ca7b77cb --- /dev/null +++ b/js/src/tests/ecma_3/FunExpr/regress-528082.js @@ -0,0 +1,20 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +var BUGNUMBER = 528082; +var summary = 'named function expression function-name-as-upvar slot botch'; + +printBugNumber(BUGNUMBER); +printStatus(summary); + +function f() { + return function g(a) { return function () { return g; }(); }(); +} +var actual = typeof f(); +var expect = "function"; + +reportCompare(expect, actual, summary); + +printStatus("All tests passed!"); diff --git a/js/src/tests/ecma_3/FunExpr/regress-533254.js b/js/src/tests/ecma_3/FunExpr/regress-533254.js new file mode 100644 index 000000000..b0e319818 --- /dev/null +++ b/js/src/tests/ecma_3/FunExpr/regress-533254.js @@ -0,0 +1,28 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +var BUGNUMBER = 533254; +var summary = 'init-method late in table-big initialiser screwup'; + +printBugNumber(BUGNUMBER); +printStatus(summary); + +function f() { + var proto = {p8:8}; + var obj = { + p0:0, p1:1, p2:2, p3:3, p4:4, p5:5, p6:6, p7:7, p8:8, p9:9, + p10:0, p11:1, p12:2, p13:3, p14:4, p15:5, p16:6, p17:7, p18:8, p19:9, + m: function() { return 42; } + }; + return obj; +} +var expect = f(), + actual = f(); + +expect += ''; +actual += ''; +reportCompare(expect, actual, summary); + +printStatus("All tests passed!"); diff --git a/js/src/tests/ecma_3/FunExpr/regress-545980.js b/js/src/tests/ecma_3/FunExpr/regress-545980.js new file mode 100644 index 000000000..1ecf1c9b6 --- /dev/null +++ b/js/src/tests/ecma_3/FunExpr/regress-545980.js @@ -0,0 +1,41 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +var BUGNUMBER = 518103; +var summary = 'partial flat closures must not reach across funargs'; +var actual = "no crash"; +var expect = actual; + +function Timer(){} +Timer.prototype = { initWithCallback: function (o) {Timer.q.push(o)} }; +Timer.q = []; + +var later; +var ac = {startSearch: function(q,s,n,o){later=o}}; + +var bm = {insertBookmark: function(){}, getIdForItemAt: function(){}}; + +function run_test() { + var tagIds = []; + + (function doSearch(query) { + ac.startSearch(query, "", null, { + onSearchResult: function() { + var num = tagIds.length; + + var timer = new Timer; + var next = query.slice(1); + timer.initWithCallback({ notify: function() doSearch(next) }); + } + }); + })("title"); +} + +run_test(); +later.onSearchResult(); +for (var i in Timer.q) + Timer.q[i].notify(); + +reportCompare(expect, actual, summary); diff --git a/js/src/tests/ecma_3/FunExpr/shell.js b/js/src/tests/ecma_3/FunExpr/shell.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/ecma_3/FunExpr/shell.js diff --git a/js/src/tests/ecma_3/Function/15.3.4.3-1.js b/js/src/tests/ecma_3/Function/15.3.4.3-1.js new file mode 100644 index 000000000..5fd49ea3e --- /dev/null +++ b/js/src/tests/ecma_3/Function/15.3.4.3-1.js @@ -0,0 +1,176 @@ +/* -*- 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: 21 May 2002 + * SUMMARY: ECMA conformance of Function.prototype.apply + * + * Function.prototype.apply(thisArg, argArray) + * + * See ECMA-262 Edition 3 Final, Section 15.3.4.3 + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = 145791; +var summary = 'Testing ECMA conformance of Function.prototype.apply'; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; + + +function F0(a) +{ + return "" + this + arguments.length; +} + +function F1(a) +{ + return "" + this + a; +} + +function F2() +{ + return "" + this; +} + + + +/* + * Function.prototype.apply.length should return 2 + */ +status = inSection(1); +actual = Function.prototype.apply.length; +expect = 2; +addThis(); + + +/* + * When |thisArg| is not provided to the apply() method, the + * called function must be passed the global object as |this| + */ +status = inSection(2); +actual = F0.apply(); +expect = "" + this + 0; +addThis(); + + +/* + * If |argArray| is not provided to the apply() method, the + * called function should be invoked with an empty argument list + */ +status = inSection(3); +actual = F0.apply(""); +expect = "" + "" + 0; +addThis(); + +status = inSection(4); +actual = F0.apply(true); +expect = "" + true + 0; +addThis(); + + +/* + * Function.prototype.apply(x) and + * Function.prototype.apply(x, undefined) should return the same result + */ +status = inSection(5); +actual = F1.apply(0, undefined); +expect = F1.apply(0); +addThis(); + +status = inSection(6); +actual = F1.apply("", undefined); +expect = F1.apply(""); +addThis(); + +status = inSection(7); +actual = F1.apply(null, undefined); +expect = F1.apply(null); +addThis(); + +status = inSection(8); +actual = F1.apply(undefined, undefined); +expect = F1.apply(undefined); +addThis(); + + +/* + * Function.prototype.apply(x) and + * Function.prototype.apply(x, null) should return the same result + */ +status = inSection(9); +actual = F1.apply(0, null); +expect = F1.apply(0); +addThis(); + +status = inSection(10); +actual = F1.apply("", null); +expect = F1.apply(""); +addThis(); + +status = inSection(11); +actual = F1.apply(null, null); +expect = F1.apply(null); +addThis(); + +status = inSection(12); +actual = F1.apply(undefined, null); +expect = F1.apply(undefined); +addThis(); + + +/* + * Function.prototype.apply() and + * Function.prototype.apply(undefined) should return the same result + */ +status = inSection(13); +actual = F2.apply(undefined); +expect = F2.apply(); +addThis(); + + +/* + * Function.prototype.apply() and + * Function.prototype.apply(null) should return the same result + */ +status = inSection(14); +actual = F2.apply(null); +expect = F2.apply(); +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/Function/15.3.4.4-1.js b/js/src/tests/ecma_3/Function/15.3.4.4-1.js new file mode 100644 index 000000000..fed244a95 --- /dev/null +++ b/js/src/tests/ecma_3/Function/15.3.4.4-1.js @@ -0,0 +1,162 @@ +/* -*- 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: 21 May 2002 + * SUMMARY: ECMA conformance of Function.prototype.call + * + * Function.prototype.call(thisArg [,arg1 [,arg2, ...]]) + * + * See ECMA-262 Edition 3 Final, Section 15.3.4.4 + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = 145791; +var summary = 'Testing ECMA conformance of Function.prototype.call'; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; + + +function F0(a) +{ + return "" + this + arguments.length; +} + +function F1(a) +{ + return "" + this + a; +} + +function F2() +{ + return "" + this; +} + + + +/* + * Function.prototype.call.length should return 1 + */ +status = inSection(1); +actual = Function.prototype.call.length; +expect = 1; +addThis(); + + +/* + * When |thisArg| is not provided to the call() method, the + * called function must be passed the global object as |this| + */ +status = inSection(2); +actual = F0.call(); +expect = "" + this + 0; +addThis(); + + +/* + * If [,arg1 [,arg2, ...]] are not provided to the call() method, + * the called function should be invoked with an empty argument list + */ +status = inSection(3); +actual = F0.call(""); +expect = "" + "" + 0; +addThis(); + +status = inSection(4); +actual = F0.call(true); +expect = "" + true + 0; +addThis(); + + +/* + * Function.prototype.call(x) and + * Function.prototype.call(x, undefined) should return the same result + */ +status = inSection(5); +actual = F1.call(0, undefined); +expect = F1.call(0); +addThis(); + +status = inSection(6); +actual = F1.call("", undefined); +expect = F1.call(""); +addThis(); + +status = inSection(7); +actual = F1.call(null, undefined); +expect = F1.call(null); +addThis(); + +status = inSection(8); +actual = F1.call(undefined, undefined); +expect = F1.call(undefined); +addThis(); + + +/* + * Function.prototype.call() and + * Function.prototype.call(undefined) should return the same result + */ +status = inSection(9); +actual = F2.call(undefined); +expect = F2.call(); +addThis(); + + +/* + * Function.prototype.call() and + * Function.prototype.call(null) should return the same result + */ +status = inSection(10); +actual = F2.call(null); +expect = F2.call(); +addThis(); + +if (typeof newGlobal === "function") +{ + /* + * Function.prototype.call gets lexical globals, not caller globals + */ + status = inSection(11); + actual = g2 = newGlobal(); + g2.eval("boundMethod = Function('return this');"); + expect = g2.boundMethod.call(); + 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/Function/arguments-001.js b/js/src/tests/ecma_3/Function/arguments-001.js new file mode 100644 index 000000000..7804aa85c --- /dev/null +++ b/js/src/tests/ecma_3/Function/arguments-001.js @@ -0,0 +1,135 @@ +/* -*- 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 May 2001 + * + * SUMMARY: Testing the arguments object + * + * See http://bugzilla.mozilla.org/show_bug.cgi?id=72884 + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = 72884; +var summary = 'Testing the arguments object'; +var status = ''; +var statusitems = [ ]; +var actual = ''; +var actualvalues = [ ]; +var expect= ''; +var expectedvalues = [ ]; +var a = ''; + + +status = inSection(1); +function f() +{ + delete arguments.length; + return arguments; +} + +a = f(); +actual = a instanceof Object; +expect = true; +addThis(); + +actual = a instanceof Array; +expect = false; +addThis(); + +actual = a.length; +expect = undefined; +addThis(); + + + +status = inSection(2); +a = f(1,2,3); +actual = a instanceof Object; +expect = true; +addThis(); + +actual = a instanceof Array; +expect = false; +addThis(); + +actual = a.length; +expect = undefined; +addThis(); + +actual = a[0]; +expect = 1; +addThis(); + +actual = a[1]; +expect = 2; +addThis(); + +actual = a[2]; +expect = 3; +addThis(); + + + +status = inSection(3); +/* + * Brendan: + * + * Note that only callee and length can be overridden, so deleting an indexed + * property and asking for it again causes it to be recreated by args_resolve: + * + * function g(){delete arguments[0]; return arguments[0]} + * g(42) // should this print 42? + * + * I'm not positive this violates ECMA, which allows in chapter 16 for extensions + * including properties (does it allow for magically reappearing properties?). The + * delete operator successfully deletes arguments[0] and results in true, but that + * is not distinguishable from the case where arguments[0] was delegated to + * Arguments.prototype[0], which was how the bad old code worked. + * + * I'll ponder this last detail... + * + * UPDATE: Per ECMA-262, delete on an arguments[i] should succeed + * and remove that property from the arguments object, leaving any get + * of it after the delete to evaluate to undefined. + */ +function g() +{ + delete arguments[0]; + return arguments[0]; +} +actual = g(42); +expect = undefined; // not 42... +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/Function/arguments-002.js b/js/src/tests/ecma_3/Function/arguments-002.js new file mode 100644 index 000000000..7e5927492 --- /dev/null +++ b/js/src/tests/ecma_3/Function/arguments-002.js @@ -0,0 +1,40 @@ +/* -*- 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 = 383269; +var summary = 'Allow override of arguments'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + var expect1 = '33,42'; + var expect2 = 33; + var actual1 = ''; + var actual2 = ''; + + function f(){ + var a=arguments; actual1 = a[0]; arguments=42; actual1 += ',' + arguments; return a; + } + + actual2 = f(33)[0]; + + expect = expect1 + ':' + expect2; + actual = actual1 + ':' + actual2; + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/Function/browser.js b/js/src/tests/ecma_3/Function/browser.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/ecma_3/Function/browser.js diff --git a/js/src/tests/ecma_3/Function/call-001.js b/js/src/tests/ecma_3/Function/call-001.js new file mode 100644 index 000000000..319a75e3a --- /dev/null +++ b/js/src/tests/ecma_3/Function/call-001.js @@ -0,0 +1,119 @@ +/* -*- 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: 2001-07-13 + * + * SUMMARY: Applying Function.prototype.call to the Function object itself + * + * + * ECMA-262 15.3.4.4 Function.prototype.call (thisArg [,arg1 [,arg2,…] ] ) + * + * When applied to the Function object itself, thisArg should be ignored. + * As explained by Waldemar (waldemar@netscape.com): + * + * Function.call(obj, "print(this)") is equivalent to invoking + * Function("print(this)") with this set to obj. Now, Function("print(this)") + * is equivalent to new Function("print(this)") (see 15.3.1.1), and the latter + * ignores the this value that you passed it and constructs a function + * (which we'll call F) which will print the value of the this that will be + * passed in when F will be invoked. + * + * With the last set of () you're invoking F(), which means you're calling it + * with no this value. When you don't provide a this value, it defaults to the + * global object. + * + */ + +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = '(none)'; +var summary = 'Applying Function.prototype.call to the Function object itself'; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; +var self = this; // capture a reference to the global object +var cnOBJECT_GLOBAL = self.toString(); +var cnOBJECT_OBJECT = (new Object).toString(); +var cnHello = 'Hello'; +var cnRed = 'red'; +var objTEST = {color:cnRed}; +var f = new Function(); +var g = new Function(); + + +f = Function.call(self, 'return cnHello'); +g = Function.call(objTEST, 'return cnHello'); + +status = 'Section A of test'; +actual = f(); +expect = cnHello; +captureThis(); + +status = 'Section B of test'; +actual = g(); +expect = cnHello; +captureThis(); + + +f = Function.call(self, 'return this.toString()'); +g = Function.call(objTEST, 'return this.toString()'); + +status = 'Section C of test'; +actual = f(); +expect = cnOBJECT_GLOBAL; +captureThis(); + +status = 'Section D of test'; +actual = g(); +expect = cnOBJECT_GLOBAL; +captureThis(); + + +f = Function.call(self, 'return this.color'); +g = Function.call(objTEST, 'return this.color'); + +status = 'Section E of test'; +actual = f(); +expect = undefined; +captureThis(); + +status = 'Section F of test'; +actual = g(); +expect = undefined; +captureThis(); + + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + + +function captureThis() +{ + 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/Function/regress-131964.js b/js/src/tests/ecma_3/Function/regress-131964.js new file mode 100644 index 000000000..b1364df8a --- /dev/null +++ b/js/src/tests/ecma_3/Function/regress-131964.js @@ -0,0 +1,162 @@ +/* -*- 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: 19 Mar 2002 + * SUMMARY: Function declarations in global or function scope are {DontDelete}. + * Function declarations in eval scope are not {DontDelete}. + * + * See http://bugzilla.mozilla.org/show_bug.cgi?id=131964 + * + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = 131964; +var summary = 'Functions defined in global or function scope are {DontDelete}'; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; + + +status = inSection(1); +function f() +{ + return 'f lives!'; +} +delete f; + +try +{ + actual = f(); +} +catch(e) +{ + actual = 'f was deleted'; +} + +expect = 'f lives!'; +addThis(); + + + +/* + * Try the same test in function scope - + */ +status = inSection(2); +function g() +{ + function f() + { + return 'f lives!'; + } + delete f; + + try + { + actual = f(); + } + catch(e) + { + actual = 'f was deleted'; + } + + expect = 'f lives!'; + addThis(); +} +g(); + + + +/* + * Try the same test in eval scope - here we EXPECT the function to be deleted (?) + */ +status = inSection(3); +var s = ''; +s += 'function h()'; +s += '{ '; +s += ' return "h lives!";'; +s += '}'; +s += 'delete h;'; + +s += 'try'; +s += '{'; +s += ' actual = h();'; +s += '}'; +s += 'catch(e)'; +s += '{'; +s += ' actual = "h was deleted";'; +s += '}'; + +s += 'expect = "h was deleted";'; +s += 'addThis();'; +eval(s); + + +/* + * Define the function in eval scope, but delete it in global scope - + */ +status = inSection(4); +s = ''; +s += 'function k()'; +s += '{ '; +s += ' return "k lives!";'; +s += '}'; +eval(s); + +delete k; + +try +{ + actual = k(); +} +catch(e) +{ + actual = 'k was deleted'; +} + +expect = 'k was deleted'; +addThis(); + + + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + + + +function wasDeleted(functionName) +{ + return functionName + ' was deleted...'; +} + + +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/Function/regress-137181.js b/js/src/tests/ecma_3/Function/regress-137181.js new file mode 100644 index 000000000..ecd2883bd --- /dev/null +++ b/js/src/tests/ecma_3/Function/regress-137181.js @@ -0,0 +1,79 @@ +/* -*- 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: 12 Apr 2002 + * SUMMARY: delete arguments[i] should break connection to local reference + * + * See http://bugzilla.mozilla.org/show_bug.cgi?id=137181 + * + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = 137181; +var summary = 'delete arguments[i] should break connection to local reference'; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; + + +status = inSection(1); +function f1(x) +{ + x = 1; + delete arguments[0]; + return x; +} +actual = f1(0); // (bug: Rhino was returning |undefined|) +expect = 1; +addThis(); + + +status = inSection(2); +function f2(x) +{ + x = 1; + delete arguments[0]; + arguments[0] = -1; + return x; +} +actual = f2(0); // (bug: Rhino was returning -1) +expect = 1; +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/Function/regress-193555.js b/js/src/tests/ecma_3/Function/regress-193555.js new file mode 100644 index 000000000..00077a9e5 --- /dev/null +++ b/js/src/tests/ecma_3/Function/regress-193555.js @@ -0,0 +1,102 @@ +/* -*- 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: 17 February 2003 + * SUMMARY: Testing access to function name from inside function + * + * See http://bugzilla.mozilla.org/show_bug.cgi?id=193555 + * + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = 193555; +var summary = 'Testing access to function name from inside function'; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; + + +// test via function statement +status = inSection(1); +function f() {return f.toString();}; +actual = f(); +expect = f.toString(); +addThis(); + +// test via function expression +status = inSection(2); +var x = function g() {return g.toString();}; +actual = x(); +expect = x.toString(); +addThis(); + +// test via eval() outside function +status = inSection(3); +eval ('function a() {return a.toString();}'); +actual = a(); +expect = a.toString(); +addThis(); + +status = inSection(4); +eval ('var y = function b() {return b.toString();}'); +actual = y(); +expect = y.toString(); +addThis(); + +// test via eval() inside function +status = inSection(5); +function c() {return eval('c').toString();}; +actual = c(); +expect = c.toString(); +addThis(); + +status = inSection(6); +var z = function d() {return eval('d').toString();}; +actual = z(); +expect = z.toString(); +addThis(); + +// test via two evals! +status = inSection(7); +eval('var w = function e() {return eval("e").toString();}'); +actual = w(); +expect = w.toString(); +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/Function/regress-313570.js b/js/src/tests/ecma_3/Function/regress-313570.js new file mode 100644 index 000000000..eb3039650 --- /dev/null +++ b/js/src/tests/ecma_3/Function/regress-313570.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 = 313570; +var summary = 'length of objects whose prototype chain includes a function'; +var actual = ''; +var expect = ''; + +printBugNumber(BUGNUMBER); +printStatus (summary); + +function tmp() {} +tmp.prototype = function(a, b, c) {}; +var obj = new tmp(); + +// arity +expect = 3; +actual = obj.length; +reportCompare(expect, actual, summary + ': arity'); + +// immutable +obj.length = 10; + +expect = 3; +actual = obj.length; +reportCompare(expect, actual, summary + ': immutable'); + diff --git a/js/src/tests/ecma_3/Function/regress-49286.js b/js/src/tests/ecma_3/Function/regress-49286.js new file mode 100644 index 000000000..8ae5fd959 --- /dev/null +++ b/js/src/tests/ecma_3/Function/regress-49286.js @@ -0,0 +1,103 @@ +/* -*- 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: 2001-07-10 + * + * SUMMARY: Invoking try...catch through Function.call + * See http://bugzilla.mozilla.org/show_bug.cgi?id=49286 + * + * 1) Define a function with a try...catch block in it + * 2) Invoke the function via the call method of Function + * 3) Pass bad syntax to the try...catch block + * 4) We should catch the error! + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = 49286; +var summary = 'Invoking try...catch through Function.call'; +var cnErrorCaught = 'Error caught'; +var cnErrorNotCaught = 'Error NOT caught'; +var cnGoodSyntax = '1==2'; +var cnBadSyntax = '1=2'; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; + + +var obj = new testObject(); + +status = 'Section A of test: direct call of f'; +actual = f.call(obj); +expect = cnErrorCaught; +addThis(); + +status = 'Section B of test: indirect call of f'; +actual = g.call(obj); +expect = cnErrorCaught; +addThis(); + + + +//----------------------------------------- +test(); +//----------------------------------------- + + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + for (var i=0; i<UBound; i++) + { + reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]); + } + + exitFunc ('test'); +} + + +// An object storing bad syntax as a property - +function testObject() +{ + this.badSyntax = cnBadSyntax; + this.goodSyntax = cnGoodSyntax; +} + + +// A function wrapping a try...catch block +function f() +{ + try + { + eval(this.badSyntax); + } + catch(e) + { + return cnErrorCaught; + } + return cnErrorNotCaught; +} + + +// A function wrapping a call to f - +function g() +{ + return f.call(this); +} + + +function addThis() +{ + statusitems[UBound] = status; + actualvalues[UBound] = actual; + expectedvalues[UBound] = expect; + UBound++; +} diff --git a/js/src/tests/ecma_3/Function/regress-58274.js b/js/src/tests/ecma_3/Function/regress-58274.js new file mode 100644 index 000000000..3d326c279 --- /dev/null +++ b/js/src/tests/ecma_3/Function/regress-58274.js @@ -0,0 +1,192 @@ +/* -*- 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: 15 July 2002 + * SUMMARY: Testing functions with double-byte names + * See http://bugzilla.mozilla.org/show_bug.cgi?id=58274 + * + * Here is a sample of the problem: + * + * js> function f\u02B1 () {} + * + * js> f\u02B1.toSource(); + * function f¦() {} + * + * js> f\u02B1.toSource().toSource(); + * (new String("function f\xB1() {}")) + * + * + * See how the high-byte information (the 02) has been lost? + * The same thing was happening with the toString() method: + * + * js> f\u02B1.toString(); + * + * function f¦() { + * } + * + * js> f\u02B1.toString().toSource(); + * (new String("\nfunction f\xB1() {\n}\n")) + * + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = 58274; +var summary = 'Testing functions with double-byte names'; +var ERR = 'UNEXPECTED ERROR! \n'; +var ERR_MALFORMED_NAME = ERR + 'Could not find function name in: \n\n'; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; +var sEval; +var sName; + + +sEval = "function f\u02B2() {return 42;}"; +eval(sEval); +sName = getFunctionName(f\u02B2); + +// Test function call - +status = inSection(1); +actual = f\u02B2(); +expect = 42; +addThis(); + +// Test both characters of function name - +status = inSection(2); +actual = sName[0]; +expect = sEval[9]; +addThis(); + +status = inSection(3); +actual = sName[1]; +expect = sEval[10]; +addThis(); + + + +sEval = "function f\u02B2\u0AAA () {return 84;}"; +eval(sEval); +sName = getFunctionName(f\u02B2\u0AAA); + +// Test function call - +status = inSection(4); +actual = f\u02B2\u0AAA(); +expect = 84; +addThis(); + +// Test all three characters of function name - +status = inSection(5); +actual = sName[0]; +expect = sEval[9]; +addThis(); + +status = inSection(6); +actual = sName[1]; +expect = sEval[10]; +addThis(); + +status = inSection(7); +actual = sName[2]; +expect = sEval[11]; +addThis(); + + + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + + + +/* + * Goal: test that f.toString() contains the proper function name. + * + * Note, however, f.toString() is implementation-independent. For example, + * it may begin with '\nfunction' instead of 'function'. Therefore we use + * a regexp to make sure we extract the name properly. + * + * Here we assume that f has been defined by means of a function statement, + * and not a function expression (where it wouldn't have to have a name). + * + * Rhino uses a Unicode representation for f.toString(); whereas + * SpiderMonkey uses an ASCII representation, putting escape sequences + * for non-ASCII characters. For example, if a function is called f\u02B1, + * then in Rhino the toString() method will present a 2-character Unicode + * string for its name, whereas SpiderMonkey will present a 7-character + * ASCII string for its name: the string literal 'f\u02B1'. + * + * So we force the lexer to condense the string before using it. + * This will give uniform results in Rhino and SpiderMonkey. + */ +function getFunctionName(f) +{ + var s = condenseStr(f.toString()); + var re = /\s*function\s+(\S+)\s*\(/; + var arr = s.match(re); + + if (!(arr && arr[1])) + return ERR_MALFORMED_NAME + s; + return arr[1]; +} + + +/* + * This function is the opposite of functions like escape(), which take + * Unicode characters and return escape sequences for them. Here, we force + * the lexer to turn escape sequences back into single characters. + * + * Note we can't simply do |eval(str)|, since in practice |str| will be an + * identifier somewhere in the program (e.g. a function name); thus |eval(str)| + * would return the object that the identifier represents: not what we want. + * + * So we surround |str| lexicographically with quotes to force the lexer to + * evaluate it as a string. Have to strip out any linefeeds first, however - + */ +function condenseStr(str) +{ + /* + * You won't be able to do the next step if |str| has + * any carriage returns or linefeeds in it. For example: + * + * js> eval("'" + '\nHello' + "'"); + * 1: SyntaxError: unterminated string literal: + * 1: ' + * 1: ^ + * + * So replace them with the empty string - + */ + str = str.replace(/[\r\n]/g, '') + return eval("'" + str + "'"); +} + + +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/Function/regress-85880.js b/js/src/tests/ecma_3/Function/regress-85880.js new file mode 100644 index 000000000..4d0eb65f0 --- /dev/null +++ b/js/src/tests/ecma_3/Function/regress-85880.js @@ -0,0 +1,139 @@ +/* -*- 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: 2001-06-14 + * + * SUMMARY: Regression test for Bugzilla bug 85880 + * + * Rhino interpreted mode was nulling out the arguments object of a + * function if it happened to call another function inside its body. + * + * See http://bugzilla.mozilla.org/show_bug.cgi?id=85880 + * + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = 85880; +var summary = 'Arguments object of g(){f()} should not be null'; +var cnNonNull = 'Arguments != null'; +var cnNull = 'Arguments == null'; +var cnRecurse = true; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; + + +function f1(x) +{ +} + + +function f2() +{ + return f2.arguments; +} +status = 'Section A of test'; +actual = (f2() == null); +expect = false; +addThis(); + +status = 'Section B of test'; +actual = (f2(0) == null); +expect = false; +addThis(); + + +function f3() +{ + f1(); + return f3.arguments; +} +status = 'Section C of test'; +actual = (f3() == null); +expect = false; +addThis(); + +status = 'Section D of test'; +actual = (f3(0) == null); +expect = false; +addThis(); + + +function f4() +{ + f1(); + f2(); + f3(); + return f4.arguments; +} +status = 'Section E of test'; +actual = (f4() == null); +expect = false; +addThis(); + +status = 'Section F of test'; +actual = (f4(0) == null); +expect = false; +addThis(); + + +function f5() +{ + if (cnRecurse) + { + cnRecurse = false; + f5(); + } + return f5.arguments; +} +status = 'Section G of test'; +actual = (f5() == null); +expect = false; +addThis(); + +status = 'Section H of test'; +actual = (f5(0) == null); +expect = false; +addThis(); + + + +//------------------------------------------------------------------------------------------------- +test(); +//------------------------------------------------------------------------------------------------- + + +function addThis() +{ + statusitems[UBound] = status; + actualvalues[UBound] = isThisNull(actual); + expectedvalues[UBound] = isThisNull(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'); +} + + +function isThisNull(bool) +{ + return bool? cnNull : cnNonNull + } diff --git a/js/src/tests/ecma_3/Function/regress-94506.js b/js/src/tests/ecma_3/Function/regress-94506.js new file mode 100644 index 000000000..735b0d546 --- /dev/null +++ b/js/src/tests/ecma_3/Function/regress-94506.js @@ -0,0 +1,129 @@ +/* -*- 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: 08 August 2001 + * + * SUMMARY: When we invoke a function, the arguments object should take + * a back seat to any local identifier named "arguments". + * + * See http://bugzilla.mozilla.org/show_bug.cgi?id=94506 + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = 94506; +var summary = 'Testing functions employing identifiers named "arguments"'; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; +var TYPE_OBJECT = typeof new Object(); +var arguments = 5555; + + +// use a parameter named "arguments" +function F1(arguments) +{ + return arguments; +} + + +// use a local variable named "arguments" +function F2() +{ + var arguments = 55; + return arguments; +} + + +// same thing in a different order. CHANGES THE RESULT! +function F3() +{ + return arguments; + var arguments = 555; +} + + +// use the global variable above named "arguments" +function F4() +{ + return arguments; +} + + + +/* + * In Sections 1 and 2, expect the local identifier, not the arguments object. + * In Sections 3 and 4, expect the arguments object, not the the identifier. + */ + +status = 'Section 1 of test'; +actual = F1(5); +expect = 5; +addThis(); + + +status = 'Section 2 of test'; +actual = F2(); +expect = 55; +addThis(); + + +status = 'Section 3 of test'; +actual = typeof F3(); +expect = TYPE_OBJECT; +addThis(); + + +status = 'Section 4 of test'; +actual = typeof F4(); +expect = TYPE_OBJECT; +addThis(); + + +// Let's try calling F1 without providing a parameter - +status = 'Section 5 of test'; +actual = F1(); +expect = undefined; +addThis(); + + +// Let's try calling F1 with too many parameters - +status = 'Section 6 of test'; +actual = F1(3,33,333); +expect = 3; +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/Function/regress-97921.js b/js/src/tests/ecma_3/Function/regress-97921.js new file mode 100644 index 000000000..2b0154386 --- /dev/null +++ b/js/src/tests/ecma_3/Function/regress-97921.js @@ -0,0 +1,118 @@ +/* -*- 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: 10 September 2001 + * + * SUMMARY: Testing with() statement with nested functions + * See http://bugzilla.mozilla.org/show_bug.cgi?id=97921 + * + * Brendan: "The bug is peculiar to functions that have formal parameters, + * but that are called with fewer actual arguments than the declared number + * of formal parameters." + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = 97921; +var summary = 'Testing with() statement with nested functions'; +var cnYES = 'Inner value === outer value'; +var cnNO = "Inner value !== outer value!"; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; +var outerValue = ''; +var innerValue = ''; +var useWith = ''; + + +function F(i) +{ + i = 0; + if(useWith) with(1){i;} + i++; + + outerValue = i; // capture value of i in outer function + F1 = function() {innerValue = i;}; // capture value of i in inner function + F1(); +} + + +status = inSection(1); +useWith=false; +F(); // call F without supplying the argument +actual = innerValue === outerValue; +expect = true; +addThis(); + +status = inSection(2); +useWith=true; +F(); // call F without supplying the argument +actual = innerValue === outerValue; +expect = true; +addThis(); + + +function G(i) +{ + i = 0; + with (new Object()) {i=100}; + i++; + + outerValue = i; // capture value of i in outer function + G1 = function() {innerValue = i;}; // capture value of i in inner function + G1(); +} + + +status = inSection(3); +G(); // call G without supplying the argument +actual = innerValue === 101; +expect = true; +addThis(); + +status = inSection(4); +G(); // call G without supplying the argument +actual = innerValue === outerValue; +expect = true; +addThis(); + + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + + +function addThis() +{ + statusitems[UBound] = status; + actualvalues[UBound] = areTheseEqual(actual); + expectedvalues[UBound] = areTheseEqual(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'); +} + + +function areTheseEqual(yes) +{ + return yes? cnYES : cnNO + } diff --git a/js/src/tests/ecma_3/Function/scope-001.js b/js/src/tests/ecma_3/Function/scope-001.js new file mode 100644 index 000000000..a7b42b4e2 --- /dev/null +++ b/js/src/tests/ecma_3/Function/scope-001.js @@ -0,0 +1,231 @@ +/* -*- 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: 28 May 2001 + * + * SUMMARY: Functions are scoped statically, not dynamically + * + * See ECMA Section 10.1.4 Scope Chain and Identifier Resolution + * (This section defines the scope chain of an execution context) + * + * See ECMA Section 12.10 The with Statement + * + * See ECMA Section 13 Function Definition + * (This section defines the scope chain of a function object as that + * of the running execution context when the function was declared) + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = '(none)'; +var summary = 'Testing that functions are scoped statically, not dynamically'; +var self = this; // capture a reference to the global object +var status = ''; +var statusitems = [ ]; +var actual = ''; +var actualvalues = [ ]; +var expect= ''; +var expectedvalues = [ ]; + +/* + * In this section the expected value is 1, not 2. + * + * Why? f captures its scope chain from when it's declared, and imposes that chain + * when it's executed. In other words, f's scope chain is from when it was compiled. + * Since f is a top-level function, this is the global object only. Hence 'a' resolves to 1. + */ +status = 'Section A of test'; +var a = 1; +function f() +{ + return a; +} +var obj = {a:2}; +with (obj) +{ + actual = f(); +} +expect = 1; +addThis(); + + +/* + * In this section the expected value is 2, not 1. That is because here + * f's associated scope chain now includes 'obj' before the global object. + */ +status = 'Section B of test'; +var a = 1; +var obj = {a:2}; +with (obj) +{ + function f() + { + return a; + } + actual = f(); +} +expect = 2; +addThis(); + + +/* + * Like Section B , except that we call f outside the with block. + * By the principles explained above, we still expect 2 - + */ +status = 'Section C of test'; +var a = 1; +var obj = {a:2}; +with (obj) +{ + function f() + { + return a; + } +} +actual = f(); +expect = 2; +addThis(); + + +/* + * Like Section C, but with one more level of indirection - + */ +status = 'Section D of test'; +var a = 1; +var obj = {a:2, obj:{a:3}}; +with (obj) +{ + with (obj) + { + function f() + { + return a; + } + } +} +actual = f(); +expect = 3; +addThis(); + + +/* + * Like Section C, but here we actually delete obj before calling f. + * We still expect 2 - + */ +status = 'Section E of test'; +var a = 1; +var obj = {a:2}; +with (obj) +{ + function f() + { + return a; + } +} +delete obj; +actual = f(); +expect = 2; +addThis(); + + +/* + * Like Section E. Here we redefine obj and call f under with (obj) - + * We still expect 2 - + */ +status = 'Section F of test'; +var a = 1; +var obj = {a:2}; +with (obj) +{ + function f() + { + return a; + } +} +delete obj; +var obj = {a:3}; +with (obj) +{ + actual = f(); +} +expect = 2; // NOT 3 !!! +addThis(); + + +/* + * Explicitly verify that f exists at global level, even though + * it was defined under the with(obj) block - + */ +status = 'Section G of test'; +var a = 1; +var obj = {a:2}; +with (obj) +{ + function f() + { + return a; + } +} +actual = String([obj.hasOwnProperty('f'), self.hasOwnProperty('f')]); +expect = String([false, true]); +addThis(); + + +/* + * Explicitly verify that f exists at global level, even though + * it was defined under the with(obj) block - + */ +status = 'Section H of test'; +var a = 1; +var obj = {a:2}; +with (obj) +{ + function f() + { + return a; + } +} +actual = String(['f' in obj, 'f' in self]); +expect = String([false, true]); +addThis(); + + + +//------------------------------------------------------------------------------------------------- +test(); +//------------------------------------------------------------------------------------------------- + + +function addThis() +{ + statusitems[UBound] = status; + actualvalues[UBound] = actual; + expectedvalues[UBound] = expect; + UBound++; + resetTestVars(); +} + + +function resetTestVars() +{ + delete a; + delete obj; + delete f; +} + + +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/Function/scope-002.js b/js/src/tests/ecma_3/Function/scope-002.js new file mode 100644 index 000000000..20e3fa523 --- /dev/null +++ b/js/src/tests/ecma_3/Function/scope-002.js @@ -0,0 +1,211 @@ +/* -*- 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: 28 May 2001 + * + * SUMMARY: Functions are scoped statically, not dynamically + * + * See ECMA Section 10.1.4 Scope Chain and Identifier Resolution + * (This section defines the scope chain of an execution context) + * + * See ECMA Section 12.10 The with Statement + * + * See ECMA Section 13 Function Definition + * (This section defines the scope chain of a function object as that + * of the running execution context when the function was declared) + * + * Like scope-001.js, but using assignment var f = function expression + * instead of a function declaration: function f() {} etc. + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = '(none)'; +var summary = 'Testing that functions are scoped statically, not dynamically'; +var self = this; // capture a reference to the global object +var status = ''; +var statusitems = [ ]; +var actual = ''; +var actualvalues = [ ]; +var expect= ''; +var expectedvalues = [ ]; + + +/* + * In this section the expected value is 1, not 2. + * + * Why? f captures its scope chain from when it's declared, and imposes that chain + * when it's executed. In other words, f's scope chain is from when it was compiled. + * Since f is a top-level function, this is the global object only. Hence 'a' resolves to 1. + */ +status = 'Section A of test'; +var a = 1; +var f = function () {return a;}; +var obj = {a:2}; +with (obj) +{ + actual = f(); +} +expect = 1; +addThis(); + + +/* + * In this section the expected value is 2, not 1. That is because here + * f's associated scope chain now includes 'obj' before the global object. + */ +status = 'Section B of test'; +var a = 1; +var obj = {a:2}; +with (obj) +{ + var f = function () {return a;}; + actual = f(); +} +expect = 2; +addThis(); + + +/* + * Like Section B , except that we call f outside the with block. + * By the principles explained above, we still expect 2 - + */ +status = 'Section C of test'; +var a = 1; +var obj = {a:2}; +with (obj) +{ + var f = function () {return a;}; +} +actual = f(); +expect = 2; +addThis(); + + +/* + * Like Section C, but with one more level of indirection - + */ +status = 'Section D of test'; +var a = 1; +var obj = {a:2, obj:{a:3}}; +with (obj) +{ + with (obj) + { + var f = function () {return a;}; + } +} +actual = f(); +expect = 3; +addThis(); + + +/* + * Like Section C, but here we actually delete obj before calling f. + * We still expect 2 - + */ +status = 'Section E of test'; +var a = 1; +var obj = {a:2}; +with (obj) +{ + var f = function () {return a;}; +} +delete obj; +actual = f(); +expect = 2; +addThis(); + + +/* + * Like Section E. Here we redefine obj and call f under with (obj) - + * We still expect 2 - + */ +status = 'Section F of test'; +var a = 1; +var obj = {a:2}; +with (obj) +{ + var f = function () {return a;}; +} +delete obj; +var obj = {a:3}; +with (obj) +{ + actual = f(); +} +expect = 2; // NOT 3 !!! +addThis(); + + +/* + * Explicitly verify that f exists at global level, even though + * it was defined under the with(obj) block - + */ +status = 'Section G of test'; +var a = 1; +var obj = {a:2}; +with (obj) +{ + var f = function () {return a;}; +} +actual = String([obj.hasOwnProperty('f'), self.hasOwnProperty('f')]); +expect = String([false, true]); +addThis(); + + +/* + * Explicitly verify that f exists at global level, even though + * it was defined under the with(obj) block - + */ +status = 'Section H of test'; +var a = 1; +var obj = {a:2}; +with (obj) +{ + var f = function () {return a;}; +} +actual = String(['f' in obj, 'f' in self]); +expect = String([false, true]); +addThis(); + + + +//------------------------------------------------------------------------------------------------- +test(); +//------------------------------------------------------------------------------------------------- + + +function addThis() +{ + statusitems[UBound] = status; + actualvalues[UBound] = actual; + expectedvalues[UBound] = expect; + UBound++; + resetTestVars(); +} + + +function resetTestVars() +{ + delete a; + delete obj; + delete f; +} + + +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/Function/shell.js b/js/src/tests/ecma_3/Function/shell.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/ecma_3/Function/shell.js diff --git a/js/src/tests/ecma_3/LexicalConventions/7.4-01.js b/js/src/tests/ecma_3/LexicalConventions/7.4-01.js new file mode 100644 index 000000000..2ec702e9e --- /dev/null +++ b/js/src/tests/ecma_3/LexicalConventions/7.4-01.js @@ -0,0 +1,40 @@ +/* -*- 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 = 475834; +var summary = ' /**/ comments with newlines in them must act as line breaks'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + function f() { + L: for (var i=0; i<2; i++) { + for (var j=0; j<2; j++) { + break/* + */L; + } + return "conformant!"; + } + return "non-conformant!"; + } + + expect = 'conformant!'; + print(actual = f()); + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/LexicalConventions/7.8.3-01.js b/js/src/tests/ecma_3/LexicalConventions/7.8.3-01.js new file mode 100644 index 000000000..e323738f0 --- /dev/null +++ b/js/src/tests/ecma_3/LexicalConventions/7.8.3-01.js @@ -0,0 +1,23 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +var BUGNUMBER = 523401; +var summary = 'identifier starts immediately after numeric literal'; +var expect = "SyntaxError: identifier starts immediately after numeric literal"; +var actual; + +printBugNumber(BUGNUMBER); +printStatus(summary); + +try { + eval("actual = 0in [1]"); +} catch (e) { + actual = e; +} +actual = '' + actual; + +reportCompare(expect, actual, summary); + +printStatus("All tests passed!"); diff --git a/js/src/tests/ecma_3/LexicalConventions/7.9.1.js b/js/src/tests/ecma_3/LexicalConventions/7.9.1.js new file mode 100644 index 000000000..7e11692cf --- /dev/null +++ b/js/src/tests/ecma_3/LexicalConventions/7.9.1.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 BUGNUMBER = 402386; +var summary = 'Automatic Semicolon insertion in postfix expressions'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + var expr; + var code; + + // LeftHandSideExpression [no LineTerminator here] ++ + + code = 'expr ++'; + expr = 0; + expect = 1; + + try + { + eval(code); + actual = expr; + } + catch(ex) + { + actual = ex + ''; + } + reportCompare(expect, actual, summary + ': ' + code); + + code = 'expr\n++'; + expr = 0; + expect = 'SyntaxError: expected expression, got end of script'; + + try + { + eval(code); + actual = expr; + } + catch(ex) + { + actual = ex + ''; + } + reportCompare(expect, actual, summary + ': ' + code); + + // LeftHandSideExpression [no LineTerminator here] -- + + code = 'expr --'; + expr = 0; + expect = -1; + + try + { + eval(code); + actual = expr; + } + catch(ex) + { + actual = ex + ''; + } + reportCompare(expect, actual, summary + ': ' + code); + + code = 'expr\n--'; + expr = 0; + expect = 'SyntaxError: expected expression, got end of script'; + + try + { + eval(code); + actual = expr; + } + catch(ex) + { + actual = ex + ''; + } + reportCompare(expect, actual, summary + ': ' + code); + + // + + var x = 1; + var y = 1; + code = '(x\n)-- y'; + expect = 'SyntaxError: missing ; before statement'; + + try + { + eval(code); + actual = expr; + } + catch(ex) + { + actual = ex + ''; + } + reportCompare(expect, actual, summary + ': ' + code); + + code = '(x)-- y'; + expect = 'SyntaxError: missing ; before statement'; + + try + { + eval(code); + actual = expr; + } + catch(ex) + { + actual = ex + ''; + } + reportCompare(expect, actual, summary + ': ' + code); + + exitFunc ('test'); +} + diff --git a/js/src/tests/ecma_3/LexicalConventions/browser.js b/js/src/tests/ecma_3/LexicalConventions/browser.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/ecma_3/LexicalConventions/browser.js diff --git a/js/src/tests/ecma_3/LexicalConventions/shell.js b/js/src/tests/ecma_3/LexicalConventions/shell.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/ecma_3/LexicalConventions/shell.js diff --git a/js/src/tests/ecma_3/Number/15.7.4.2-01.js b/js/src/tests/ecma_3/Number/15.7.4.2-01.js new file mode 100644 index 000000000..a2cc265e1 --- /dev/null +++ b/js/src/tests/ecma_3/Number/15.7.4.2-01.js @@ -0,0 +1,44 @@ +/* -*- 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 = "411889"; +var summary = "num.toString(), num.toString(10), and num.toString(undefined)" + + " should all be equivalent"; +var actual, expect; + +printBugNumber(BUGNUMBER); +printStatus(summary); + +/************** + * BEGIN TEST * + **************/ + +var failed = false; + +try +{ + var noargs = 3.3.toString(); + var tenarg = 3.3.toString(10); + var undefarg = 3.3.toString(undefined); + + if (noargs !== tenarg) + throw "() !== (10): " + noargs + " !== " + tenarg; + if (tenarg !== undefarg) + throw "(10) !== (undefined): " + tenarg + " !== " + undefarg; +} +catch (e) +{ + failed = e; +} + +expect = false; +actual = failed; + +reportCompare(expect, actual, summary); + +expect = 1; +actual = 3.3.toString.length; +reportCompare(expect, actual, '3.3.toString.length should be 1'); diff --git a/js/src/tests/ecma_3/Number/15.7.4.3-01.js b/js/src/tests/ecma_3/Number/15.7.4.3-01.js new file mode 100644 index 000000000..2f1f3fffc --- /dev/null +++ b/js/src/tests/ecma_3/Number/15.7.4.3-01.js @@ -0,0 +1,36 @@ +/* -*- 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 = "412068"; +var summary = "num.toLocaleString incorrectly accesses its first argument " + + "even when no first argument has been given"; +var actual, expect; + +printBugNumber(BUGNUMBER); +printStatus(summary); + +/************** + * BEGIN TEST * + **************/ + +var failed = false; + +try +{ + if ("3" !== 3..toLocaleString()) + throw '"3" should equal 3..toLocaleString()'; + if ("9" !== 9..toLocaleString(8)) + throw 'Number.prototype.toLocaleString should ignore its first argument'; +} +catch (e) +{ + failed = e; +} + +expect = false; +actual = failed; + +reportCompare(expect, actual, summary); diff --git a/js/src/tests/ecma_3/Number/15.7.4.5-1.js b/js/src/tests/ecma_3/Number/15.7.4.5-1.js new file mode 100644 index 000000000..ab7f356c6 --- /dev/null +++ b/js/src/tests/ecma_3/Number/15.7.4.5-1.js @@ -0,0 +1,111 @@ +/* -*- 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: 2001-07-15 + * + * SUMMARY: Testing Number.prototype.toFixed(fractionDigits) + * See EMCA 262 Edition 3 Section 15.7.4.5 + * + * Also see http://bugzilla.mozilla.org/show_bug.cgi?id=90551 + * + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = '(none)'; +var summary = 'Testing Number.prototype.toFixed(fractionDigits)'; +var cnIsRangeError = 'instanceof RangeError'; +var cnNotRangeError = 'NOT instanceof RangeError'; +var cnNoErrorCaught = 'NO ERROR CAUGHT...'; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; +var testNum = 234.2040506; + + +status = 'Section A of test: no error intended!'; +actual = testNum.toFixed(4); +expect = '234.2041'; +captureThis(); + + +/////////////////////////// OOPS.... /////////////////////////////// +/************************************************************************* + * 15.7.4.5 Number.prototype.toFixed(fractionDigits) + * + * An implementation is permitted to extend the behaviour of toFixed + * for values of fractionDigits less than 0 or greater than 20. In this + * case toFixed would not necessarily throw RangeError for such values. + +status = 'Section B of test: expect RangeError because fractionDigits < 0'; +actual = catchError('testNum.toFixed(-4)'); +expect = cnIsRangeError; +captureThis(); + +status = 'Section C of test: expect RangeError because fractionDigits > 20 '; +actual = catchError('testNum.toFixed(21)'); +expect = cnIsRangeError; +captureThis(); +*************************************************************************/ + + +status = 'Section D of test: no error intended!'; +actual = 0.00001.toFixed(2); +expect = '0.00'; +captureThis(); + +status = 'Section E of test: no error intended!'; +actual = 0.000000000000000000001.toFixed(20); +expect = '0.00000000000000000000'; +captureThis(); + + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + + +function captureThis() +{ + 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'); +} + + +function catchError(sEval) +{ + try {eval(sEval);} + catch(e) {return isRangeError(e);} + return cnNoErrorCaught; +} + + +function isRangeError(obj) +{ + if (obj instanceof RangeError) + return cnIsRangeError; + return cnNotRangeError; +} diff --git a/js/src/tests/ecma_3/Number/15.7.4.5-2.js b/js/src/tests/ecma_3/Number/15.7.4.5-2.js new file mode 100644 index 000000000..f9c75ea15 --- /dev/null +++ b/js/src/tests/ecma_3/Number/15.7.4.5-2.js @@ -0,0 +1,29 @@ +/* -*- 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 = 469397; +var summary = '(0.5).toFixed(0) == 1'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + expect = '1'; + actual = (0.5).toFixed(0); + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/Number/15.7.4.6-1.js b/js/src/tests/ecma_3/Number/15.7.4.6-1.js new file mode 100644 index 000000000..df45fa2ac --- /dev/null +++ b/js/src/tests/ecma_3/Number/15.7.4.6-1.js @@ -0,0 +1,115 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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: 2001-07-15 + * + * SUMMARY: Testing Number.prototype.toExponential(fractionDigits) + * See EMCA 262 Edition 3 Section 15.7.4.6 + * + * Also see http://bugzilla.mozilla.org/show_bug.cgi?id=90551 + * + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = '(none)'; +var summary = 'Testing Number.prototype.toExponential(fractionDigits)'; +var cnIsRangeError = 'instanceof RangeError'; +var cnNotRangeError = 'NOT instanceof RangeError'; +var cnNoErrorCaught = 'NO ERROR CAUGHT...'; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; +var testNum = 77.1234; + + +status = 'Section A of test: no error intended!'; +actual = testNum.toExponential(4); +expect = '7.7123e+1'; +captureThis(); + +status = 'Section B of test: Infinity.toExponential() with out-of-range fractionDigits'; +actual = Number.POSITIVE_INFINITY.toExponential(-3); +expect = 'Infinity'; +captureThis(); + +status = 'Section C of test: -Infinity.toExponential() with out-of-range fractionDigits'; +actual = Number.NEGATIVE_INFINITY.toExponential(-3); +expect = '-Infinity'; +captureThis(); + +status = 'Section D of test: NaN.toExponential() with out-of-range fractionDigits'; +actual = Number.NaN.toExponential(-3); +expect = 'NaN'; +captureThis(); + + +/////////////////////////// OOPS.... /////////////////////////////// +/************************************************************************* + * 15.7.4.6 Number.prototype.toExponential(fractionDigits) + * + * An implementation is permitted to extend the behaviour of toExponential + * for values of fractionDigits less than 0 or greater than 20. In this + * case toExponential would not necessarily throw RangeError for such values. + +status = 'Section B of test: expect RangeError because fractionDigits < 0'; +actual = catchError('testNum.toExponential(-4)'); +expect = cnIsRangeError; +captureThis(); + +status = 'Section C of test: expect RangeError because fractionDigits > 20 '; +actual = catchError('testNum.toExponential(21)'); +expect = cnIsRangeError; +captureThis(); +*************************************************************************/ + + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + + +function captureThis() +{ + 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'); +} + + +function catchError(sEval) +{ + try {eval(sEval);} + catch(e) {return isRangeError(e);} + return cnNoErrorCaught; +} + + +function isRangeError(obj) +{ + if (obj instanceof RangeError) + return cnIsRangeError; + return cnNotRangeError; +} diff --git a/js/src/tests/ecma_3/Number/15.7.4.7-1.js b/js/src/tests/ecma_3/Number/15.7.4.7-1.js new file mode 100644 index 000000000..e754528d5 --- /dev/null +++ b/js/src/tests/ecma_3/Number/15.7.4.7-1.js @@ -0,0 +1,120 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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: 2001-07-15 + * + * SUMMARY: Testing Number.prototype.toPrecision(precision) + * See EMCA 262 Edition 3 Section 15.7.4.7 + * + * Also see http://bugzilla.mozilla.org/show_bug.cgi?id=90551 + * + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = '(none)'; +var summary = 'Testing Number.prototype.toPrecision(precision)'; +var cnIsRangeError = 'instanceof RangeError'; +var cnNotRangeError = 'NOT instanceof RangeError'; +var cnNoErrorCaught = 'NO ERROR CAUGHT...'; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; +var testNum = 5.123456; + + +status = 'Section A of test: no error intended!'; +actual = testNum.toPrecision(4); +expect = '5.123'; +captureThis(); + +status = 'Section B of test: Infinity.toPrecision() with out-of-range fractionDigits'; +actual = Number.POSITIVE_INFINITY.toPrecision(-3); +expect = 'Infinity'; +captureThis(); + +status = 'Section C of test: -Infinity.toPrecision() with out-of-range fractionDigits'; +actual = Number.NEGATIVE_INFINITY.toPrecision(-3); +expect = '-Infinity'; +captureThis(); + +status = 'Section D of test: NaN.toPrecision() with out-of-range fractionDigits'; +actual = Number.NaN.toPrecision(-3); +expect = 'NaN'; +captureThis(); + + +/////////////////////////// OOPS.... /////////////////////////////// +/************************************************************************* + * 15.7.4.7 Number.prototype.toPrecision(precision) + * + * An implementation is permitted to extend the behaviour of toPrecision + * for values of precision less than 1 or greater than 21. In this + * case toPrecision would not necessarily throw RangeError for such values. + +status = 'Section B of test: expect RangeError because precision < 1'; +actual = catchError('testNum.toPrecision(0)'); +expect = cnIsRangeError; +captureThis(); + +status = 'Section C of test: expect RangeError because precision < 1'; +actual = catchError('testNum.toPrecision(-4)'); +expect = cnIsRangeError; +captureThis(); + +status = 'Section D of test: expect RangeError because precision > 21 '; +actual = catchError('testNum.toPrecision(22)'); +expect = cnIsRangeError; +captureThis(); +*************************************************************************/ + + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + + +function captureThis() +{ + 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'); +} + + +function catchError(sEval) +{ + try {eval(sEval);} + catch(e) {return isRangeError(e);} + return cnNoErrorCaught; +} + + +function isRangeError(obj) +{ + if (obj instanceof RangeError) + return cnIsRangeError; + return cnNotRangeError; +} diff --git a/js/src/tests/ecma_3/Number/15.7.4.7-2.js b/js/src/tests/ecma_3/Number/15.7.4.7-2.js new file mode 100644 index 000000000..6845b3087 --- /dev/null +++ b/js/src/tests/ecma_3/Number/15.7.4.7-2.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 = "411893"; +var summary = "num.toPrecision(undefined) should equal num.toString()"; +var actual, expect; + +printBugNumber(BUGNUMBER); +printStatus(summary); + +/************** + * BEGIN TEST * + **************/ + +var failed = false; + +try +{ + var prec = 3.3.toPrecision(undefined); + var str = 3.3.toString(); + if (prec !== str) + { + throw "not equal! " + + "3.3.toPrecision(undefined) === '" + prec + "', " + + "3.3.toString() === '" + str + "'"; + } +} +catch (e) +{ + failed = e; +} + +expect = false; +actual = failed; + +reportCompare(expect, actual, summary); diff --git a/js/src/tests/ecma_3/Number/browser.js b/js/src/tests/ecma_3/Number/browser.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/ecma_3/Number/browser.js diff --git a/js/src/tests/ecma_3/Number/regress-442242-01.js b/js/src/tests/ecma_3/Number/regress-442242-01.js new file mode 100644 index 000000000..5202c004f --- /dev/null +++ b/js/src/tests/ecma_3/Number/regress-442242-01.js @@ -0,0 +1,29 @@ +/* -*- 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 = 442242; +var summary = 'Do not assert: INT_FITS_IN_JSVAL(i)'; +var actual = 'No Crash'; +var expect = 'No Crash'; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + var i = 28800000; + -i; + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/Number/shell.js b/js/src/tests/ecma_3/Number/shell.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/ecma_3/Number/shell.js diff --git a/js/src/tests/ecma_3/NumberFormatting/browser.js b/js/src/tests/ecma_3/NumberFormatting/browser.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/ecma_3/NumberFormatting/browser.js diff --git a/js/src/tests/ecma_3/NumberFormatting/shell.js b/js/src/tests/ecma_3/NumberFormatting/shell.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/ecma_3/NumberFormatting/shell.js diff --git a/js/src/tests/ecma_3/NumberFormatting/tostring-001.js b/js/src/tests/ecma_3/NumberFormatting/tostring-001.js new file mode 100644 index 000000000..efc13f78a --- /dev/null +++ b/js/src/tests/ecma_3/NumberFormatting/tostring-001.js @@ -0,0 +1,24 @@ +/* -*- 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/. */ + + +test(); + +function test() +{ + var n0 = 1e23; + var n1 = 5e22; + var n2 = 1.6e24; + + printStatus ("Number formatting test."); + printBugNumber ("11178"); + + reportCompare ("1e+23", n0.toString(), "1e23 toString()"); + reportCompare ("5e+22", n1.toString(), "5e22 toString()"); + reportCompare ("1.6e+24", n2.toString(), "1.6e24 toString()"); + +} + + diff --git a/js/src/tests/ecma_3/Object/8.6.1-01.js b/js/src/tests/ecma_3/Object/8.6.1-01.js new file mode 100644 index 000000000..14bfef7c7 --- /dev/null +++ b/js/src/tests/ecma_3/Object/8.6.1-01.js @@ -0,0 +1,80 @@ +/* -*- 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 = 315436; +var summary = 'In strict mode, setting a read-only property should generate a warning'; + +printBugNumber(BUGNUMBER); +printStatus (summary); + +enterFunc (String (BUGNUMBER)); + +// should throw an error in strict mode +var actual = ''; +var expect = '"length" is read-only'; +var status = summary + ': Throw if STRICT and WERROR is enabled'; + +if (!options().match(/strict/)) +{ + options('strict'); +} +if (!options().match(/werror/)) +{ + options('werror'); +} + +try +{ + var s = new String ('abc'); + s.length = 0; +} +catch (e) +{ + actual = e.message; +} + +reportCompare(expect, actual, status); + +// should not throw an error if in strict mode and WERROR is false + +actual = 'did not throw'; +expect = 'did not throw'; +var status = summary + ': Do not throw if STRICT is enabled and WERROR is disabled'; + +// toggle werror off +options('werror'); + +try +{ + s.length = 0; +} +catch (e) +{ + actual = e.message; +} + +reportCompare(expect, actual, status); + +// should not throw an error if not in strict mode + +actual = 'did not throw'; +expect = 'did not throw'; +var status = summary + ': Do not throw if not in strict mode'; + +// toggle strict off +options('strict'); + +try +{ + s.length = 0; +} +catch (e) +{ + actual = e.message; +} + +reportCompare(expect, actual, status); diff --git a/js/src/tests/ecma_3/Object/8.6.2.6-001.js b/js/src/tests/ecma_3/Object/8.6.2.6-001.js new file mode 100644 index 000000000..9e7c99344 --- /dev/null +++ b/js/src/tests/ecma_3/Object/8.6.2.6-001.js @@ -0,0 +1,79 @@ +/* -*- 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: 09 September 2002 + * SUMMARY: Test for TypeError on invalid default string value of object + * See ECMA reference at http://bugzilla.mozilla.org/show_bug.cgi?id=167325 + * + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = 167325; +var summary = "Test for TypeError on invalid default string value of object"; +var TEST_PASSED = 'TypeError'; +var TEST_FAILED = 'Generated an error, but NOT a TypeError!'; +var TEST_FAILED_BADLY = 'Did not generate ANY error!!!'; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; + + +status = inSection(1); +expect = TEST_PASSED; +actual = TEST_FAILED_BADLY; +/* + * This should generate a TypeError. See ECMA reference + * at http://bugzilla.mozilla.org/show_bug.cgi?id=167325 + */ +try +{ + var obj = {toString: function() {return new Object();}} + obj == 'abc'; +} +catch(e) +{ + if (e instanceof TypeError) + actual = TEST_PASSED; + else + actual = TEST_FAILED; +} +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/Object/8.6.2.6-002.js b/js/src/tests/ecma_3/Object/8.6.2.6-002.js new file mode 100644 index 000000000..f2e24b284 --- /dev/null +++ b/js/src/tests/ecma_3/Object/8.6.2.6-002.js @@ -0,0 +1,46 @@ +/* -*- 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 = 476624; +var summary = '[[DefaultValue]] should not call valueOf, toString with an argument'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + expect = actual = 'No exception'; + + try + { + var o = { + valueOf: function() + { + if (arguments.length !== 0) + throw "unexpected arguments! arg1 type=" + typeof arguments[0] + ", value=" + + arguments[0]; + return 2; + } + }; + o + 3; + } + catch(ex) + { + actual = ex + ''; + } + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/Object/browser.js b/js/src/tests/ecma_3/Object/browser.js new file mode 100644 index 000000000..0e57d1fcd --- /dev/null +++ b/js/src/tests/ecma_3/Object/browser.js @@ -0,0 +1,7 @@ +var GLOBAL = 'Window'; + +function isObject(obj) +{ + return obj instanceof Object || obj == window; +} + diff --git a/js/src/tests/ecma_3/Object/class-001.js b/js/src/tests/ecma_3/Object/class-001.js new file mode 100644 index 000000000..0445ec87d --- /dev/null +++ b/js/src/tests/ecma_3/Object/class-001.js @@ -0,0 +1,122 @@ +/* -*- 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: 14 Mar 2001 + * + * SUMMARY: Testing the internal [[Class]] property of objects + * See ECMA-262 Edition 3 13-Oct-1999, Section 8.6.2 + * + * The getJSClass() function we use is in a utility file, e.g. "shell.js". + */ +//----------------------------------------------------------------------------- +var i = 0; +var UBound = 0; +var BUGNUMBER = '(none)'; +var summary = 'Testing the internal [[Class]] property of objects'; +var statprefix = 'Current object is: '; +var status = ''; var statusList = [ ]; +var actual = ''; var actualvalue = [ ]; +var expect= ''; var expectedvalue = [ ]; + + +status = 'the global object'; +actual = getJSClass(this); +expect = GLOBAL; +if (expect == 'Window' && actual == 'XPCCrossOriginWrapper') +{ + print('Skipping global object due to XPCCrossOriginWrapper. See bug 390946'); +} +else +{ + addThis(); +} + +status = 'new Object()'; +actual = getJSClass(new Object()); +expect = 'Object'; +addThis(); + +status = 'new Function()'; +actual = getJSClass(new Function()); +expect = 'Function'; +addThis(); + +status = 'new Array()'; +actual = getJSClass(new Array()); +expect = 'Array'; +addThis(); + +status = 'new String()'; +actual = getJSClass(new String()); +expect = 'String'; +addThis(); + +status = 'new Boolean()'; +actual = getJSClass(new Boolean()); +expect = 'Boolean'; +addThis(); + +status = 'new Number()'; +actual = getJSClass(new Number()); +expect = 'Number'; +addThis(); + +status = 'Math'; +actual = getJSClass(Math); // can't use 'new' with the Math object (EMCA3, 15.8) +expect = 'Math'; +addThis(); + +status = 'new Date()'; +actual = getJSClass(new Date()); +expect = 'Date'; +addThis(); + +status = 'new RegExp()'; +actual = getJSClass(new RegExp()); +expect = 'RegExp'; +addThis(); + +status = 'new Error()'; +actual = getJSClass(new Error()); +expect = 'Error'; +addThis(); + + + +//--------------------------------------------------------------------------------- +test(); +//--------------------------------------------------------------------------------- + + + +function addThis() +{ + statusList[UBound] = status; + actualvalue[UBound] = actual; + expectedvalue[UBound] = expect; + UBound++; +} + + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + for (i = 0; i < UBound; i++) + { + reportCompare(expectedvalue[i], actualvalue[i], getStatus(i)); + } + + exitFunc ('test'); +} + + +function getStatus(i) +{ + return statprefix + statusList[i]; +} diff --git a/js/src/tests/ecma_3/Object/class-002.js b/js/src/tests/ecma_3/Object/class-002.js new file mode 100644 index 000000000..d6ea450e2 --- /dev/null +++ b/js/src/tests/ecma_3/Object/class-002.js @@ -0,0 +1,112 @@ +/* -*- 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: 14 Mar 2001 + * + * SUMMARY: Testing the [[Class]] property of native constructors. + * See ECMA-262 Edition 3 13-Oct-1999, Section 8.6.2 re [[Class]] property. + * + * Same as class-001.js - but testing the constructors here, not + * object instances. Therefore we expect the [[Class]] property to + * equal 'Function' in each case. + * + * The getJSClass() function we use is in a utility file, e.g. "shell.js" + */ +//----------------------------------------------------------------------------- +var i = 0; +var UBound = 0; +var BUGNUMBER = '(none)'; +var summary = 'Testing the internal [[Class]] property of native constructors'; +var statprefix = 'Current constructor is: '; +var status = ''; var statusList = [ ]; +var actual = ''; var actualvalue = [ ]; +var expect= ''; var expectedvalue = [ ]; + +/* + * We set the expect variable each time only for readability. + * We expect 'Function' every time; see discussion above - + */ +status = 'Object'; +actual = getJSClass(Object); +expect = 'Function'; +addThis(); + +status = 'Function'; +actual = getJSClass(Function); +expect = 'Function'; +addThis(); + +status = 'Array'; +actual = getJSClass(Array); +expect = 'Function'; +addThis(); + +status = 'String'; +actual = getJSClass(String); +expect = 'Function'; +addThis(); + +status = 'Boolean'; +actual = getJSClass(Boolean); +expect = 'Function'; +addThis(); + +status = 'Number'; +actual = getJSClass(Number); +expect = 'Function'; +addThis(); + +status = 'Date'; +actual = getJSClass(Date); +expect = 'Function'; +addThis(); + +status = 'RegExp'; +actual = getJSClass(RegExp); +expect = 'Function'; +addThis(); + +status = 'Error'; +actual = getJSClass(Error); +expect = 'Function'; +addThis(); + + + +//--------------------------------------------------------------------------------- +test(); +//--------------------------------------------------------------------------------- + + + +function addThis() +{ + statusList[UBound] = status; + actualvalue[UBound] = actual; + expectedvalue[UBound] = expect; + UBound++; +} + + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + for (i = 0; i < UBound; i++) + { + reportCompare(expectedvalue[i], actualvalue[i], getStatus(i)); + } + + exitFunc ('test'); +} + + +function getStatus(i) +{ + return statprefix + statusList[i]; +} diff --git a/js/src/tests/ecma_3/Object/class-003.js b/js/src/tests/ecma_3/Object/class-003.js new file mode 100644 index 000000000..3c935253d --- /dev/null +++ b/js/src/tests/ecma_3/Object/class-003.js @@ -0,0 +1,105 @@ +/* -*- 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: 14 Mar 2001 + * + * SUMMARY: Testing the [[Class]] property of native error types. + * See ECMA-262 Edition 3, Section 8.6.2 for the [[Class]] property. + * + * Same as class-001.js - but testing only the native error types here. + * See ECMA-262 Edition 3, Section 15.11.6 for a list of these types. + * + * ECMA expects the [[Class]] property to equal 'Error' in each case. + * See ECMA-262 Edition 3, Sections 15.11.1.1 and 15.11.7.2 for this. + * See http://bugzilla.mozilla.org/show_bug.cgi?id=56868 + * + * The getJSClass() function we use is in a utility file, e.g. "shell.js" + */ +//----------------------------------------------------------------------------- +var i = 0; +var UBound = 0; +var BUGNUMBER = 56868; +var summary = 'Testing the internal [[Class]] property of native error types'; +var statprefix = 'Current object is: '; +var status = ''; var statusList = [ ]; +var actual = ''; var actualvalue = [ ]; +var expect= ''; var expectedvalue = [ ]; + +/* + * We set the expect variable each time only for readability. + * We expect 'Error' every time; see discussion above - + */ +status = 'new Error()'; +actual = getJSClass(new Error()); +expect = 'Error'; +addThis(); + +status = 'new EvalError()'; +actual = getJSClass(new EvalError()); +expect = 'Error'; +addThis(); + +status = 'new RangeError()'; +actual = getJSClass(new RangeError()); +expect = 'Error'; +addThis(); + +status = 'new ReferenceError()'; +actual = getJSClass(new ReferenceError()); +expect = 'Error'; +addThis(); + +status = 'new SyntaxError()'; +actual = getJSClass(new SyntaxError()); +expect = 'Error'; +addThis(); + +status = 'new TypeError()'; +actual = getJSClass(new TypeError()); +expect = 'Error'; +addThis(); + +status = 'new URIError()'; +actual = getJSClass(new URIError()); +expect = 'Error'; +addThis(); + + + +//--------------------------------------------------------------------------------- +test(); +//--------------------------------------------------------------------------------- + + + +function addThis() +{ + statusList[UBound] = status; + actualvalue[UBound] = actual; + expectedvalue[UBound] = expect; + UBound++; +} + + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + for (i = 0; i < UBound; i++) + { + reportCompare(expectedvalue[i], actualvalue[i], getStatus(i)); + } + + exitFunc ('test'); +} + + +function getStatus(i) +{ + return statprefix + statusList[i]; +} diff --git a/js/src/tests/ecma_3/Object/class-004.js b/js/src/tests/ecma_3/Object/class-004.js new file mode 100644 index 000000000..a3f9b12fb --- /dev/null +++ b/js/src/tests/ecma_3/Object/class-004.js @@ -0,0 +1,105 @@ +/* -*- 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: 14 Mar 2001 + * + * SUMMARY: Testing [[Class]] property of native error constructors. + * See ECMA-262 Edition 3, Section 8.6.2 for the [[Class]] property. + * + * See ECMA-262 Edition 3, Section 15.11.6 for the native error types. + * See http://bugzilla.mozilla.org/show_bug.cgi?id=56868 + * + * Same as class-003.js - but testing the constructors here, not + * object instances. Therefore we expect the [[Class]] property to + * equal 'Function' in each case. + * + * The getJSClass() function we use is in a utility file, e.g. "shell.js" + */ +//----------------------------------------------------------------------------- +var i = 0; +var UBound = 0; +var BUGNUMBER = 56868; +var summary = 'Testing the internal [[Class]] property of native error constructors'; +var statprefix = 'Current constructor is: '; +var status = ''; var statusList = [ ]; +var actual = ''; var actualvalue = [ ]; +var expect= ''; var expectedvalue = [ ]; + +/* + * We set the expect variable each time only for readability. + * We expect 'Function' every time; see discussion above - + */ +status = 'Error'; +actual = getJSClass(Error); +expect = 'Function'; +addThis(); + +status = 'EvalError'; +actual = getJSClass(EvalError); +expect = 'Function'; +addThis(); + +status = 'RangeError'; +actual = getJSClass(RangeError); +expect = 'Function'; +addThis(); + +status = 'ReferenceError'; +actual = getJSClass(ReferenceError); +expect = 'Function'; +addThis(); + +status = 'SyntaxError'; +actual = getJSClass(SyntaxError); +expect = 'Function'; +addThis(); + +status = 'TypeError'; +actual = getJSClass(TypeError); +expect = 'Function'; +addThis(); + +status = 'URIError'; +actual = getJSClass(URIError); +expect = 'Function'; +addThis(); + + + +//--------------------------------------------------------------------------------- +test(); +//--------------------------------------------------------------------------------- + + + +function addThis() +{ + statusList[UBound] = status; + actualvalue[UBound] = actual; + expectedvalue[UBound] = expect; + UBound++; +} + + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + for (i = 0; i < UBound; i++) + { + reportCompare(expectedvalue[i], actualvalue[i], getStatus(i)); + } + + exitFunc ('test'); +} + + +function getStatus(i) +{ + return statprefix + statusList[i]; +} diff --git a/js/src/tests/ecma_3/Object/class-005.js b/js/src/tests/ecma_3/Object/class-005.js new file mode 100644 index 000000000..1ccdc94b2 --- /dev/null +++ b/js/src/tests/ecma_3/Object/class-005.js @@ -0,0 +1,90 @@ +/* -*- 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: 14 Mar 2001 + * + * SUMMARY: Testing the internal [[Class]] property of user-defined types. + * See ECMA-262 Edition 3 13-Oct-1999, Section 8.6.2 re [[Class]] property. + * + * Same as class-001.js - but testing user-defined types here, not + * native types. Therefore we expect the [[Class]] property to equal + * 'Object' in each case - + * + * The getJSClass() function we use is in a utility file, e.g. "shell.js" + */ +//----------------------------------------------------------------------------- +var i = 0; +var UBound = 0; +var BUGNUMBER = '(none)'; +var summary = 'Testing the internal [[Class]] property of user-defined types'; +var statprefix = 'Current user-defined type is: '; +var status = ''; var statusList = [ ]; +var actual = ''; var actualvalue = [ ]; +var expect= ''; var expectedvalue = [ ]; + + +Calf.prototype= new Cow(); + +/* + * We set the expect variable each time only for readability. + * We expect 'Object' every time; see discussion above - + */ +status = 'new Cow()'; +actual = getJSClass(new Cow()); +expect = 'Object'; +addThis(); + +status = 'new Calf()'; +actual = getJSClass(new Calf()); +expect = 'Object'; +addThis(); + + +//--------------------------------------------------------------------------------- +test(); +//--------------------------------------------------------------------------------- + + +function addThis() +{ + statusList[UBound] = status; + actualvalue[UBound] = actual; + expectedvalue[UBound] = expect; + UBound++; +} + + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + for (i = 0; i < UBound; i++) + { + reportCompare(expectedvalue[i], actualvalue[i], getStatus(i)); + } + + exitFunc ('test'); +} + + +function getStatus(i) +{ + return statprefix + statusList[i]; +} + + +function Cow(name) +{ + this.name=name; +} + + +function Calf(name) +{ + this.name=name; +} diff --git a/js/src/tests/ecma_3/Object/regress-361274.js b/js/src/tests/ecma_3/Object/regress-361274.js new file mode 100644 index 000000000..7b798143e --- /dev/null +++ b/js/src/tests/ecma_3/Object/regress-361274.js @@ -0,0 +1,33 @@ +/* -*- 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 = 361274; +var summary = 'Embedded nulls in property names'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + var x='123'+'\0'+'456'; + var y='123'+'\0'+'789'; + var a={}; + a[x]=1; + a[y]=2; + + reportCompare(1, a[x], summary + ': 123\\0456'); + reportCompare(2, a[y], summary + ': 123\\0789'); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/Object/regress-385393-07.js b/js/src/tests/ecma_3/Object/regress-385393-07.js new file mode 100644 index 000000000..90cace674 --- /dev/null +++ b/js/src/tests/ecma_3/Object/regress-385393-07.js @@ -0,0 +1,34 @@ +/* -*- 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 = 'No Crash'; +var expect = 'No Crash'; + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + try + { + (2).eval(); + } + catch(ex) + { + } + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/Object/regress-459405.js b/js/src/tests/ecma_3/Object/regress-459405.js new file mode 100644 index 000000000..1e9f97ccb --- /dev/null +++ b/js/src/tests/ecma_3/Object/regress-459405.js @@ -0,0 +1,40 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + * Contributor: Robert Sayre + */ + +//----------------------------------------------------------------------------- +var BUGNUMBER = 459405; +var summary = 'Math is not ReadOnly'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + expect = 'foo'; + + try + { + var Math = 'foo'; + actual = Math; + } + catch(ex) + { + actual = ex + ''; + } + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/Object/regress-72773.js b/js/src/tests/ecma_3/Object/regress-72773.js new file mode 100644 index 000000000..2b7722084 --- /dev/null +++ b/js/src/tests/ecma_3/Object/regress-72773.js @@ -0,0 +1,63 @@ +/* -*- 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: 09 May 2001 + * + * SUMMARY: Regression test: we shouldn't crash on this code + * See http://bugzilla.mozilla.org/show_bug.cgi?id=72773 + * + * See ECMA-262 Edition 3 13-Oct-1999, Section 8.6.2 re [[Class]] property. + * + * Same as class-001.js - but testing user-defined types here, not + * native types. Therefore we expect the [[Class]] property to equal + * 'Object' in each case - + * + * The getJSClass() function we use is in a utility file, e.g. "shell.js" + */ +//----------------------------------------------------------------------------- +var BUGNUMBER = 72773; +var summary = "Regression test: we shouldn't crash on this code"; +var status = ''; +var actual = ''; +var expect = ''; +var sToEval = ''; + +/* + * This code should produce an error, but not a crash. + * 'TypeError: Function.prototype.toString called on incompatible object' + */ +sToEval += 'function Cow(name){this.name = name;}' +sToEval += 'function Calf(str){this.name = str;}' +sToEval += 'Calf.prototype = Cow;' +sToEval += 'new Calf().toString();' + +status = 'Trying to catch an expected error'; +try +{ + eval(sToEval); +} +catch(e) +{ + actual = getJSClass(e); + expect = 'Error'; +} + + +//---------------------------------------------------------------------------------------------- +test(); +//---------------------------------------------------------------------------------------------- + + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + reportCompare(expect, actual, status); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/Object/regress-79129-001.js b/js/src/tests/ecma_3/Object/regress-79129-001.js new file mode 100644 index 000000000..66e170d30 --- /dev/null +++ b/js/src/tests/ecma_3/Object/regress-79129-001.js @@ -0,0 +1,46 @@ +/* -*- 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: 06 May 2001 + * + * SUMMARY: Regression test: we shouldn't crash on this code + * + * See http://bugzilla.mozilla.org/show_bug.cgi?id=79129 + */ +//----------------------------------------------------------------------------- +var BUGNUMBER = 79129; +var summary = "Regression test: we shouldn't crash on this code"; + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + tryThis(); + reportCompare('No Crash', 'No Crash', 'Should not crash'); + exitFunc ('test'); +} + + +function tryThis() +{ + obj={}; + obj.a = obj.b = obj.c = 1; + delete obj.a; + delete obj.b; + delete obj.c; + obj.d = obj.e = 1; + obj.a=1; + obj.b=1; + obj.c=1; + obj.d=1; + obj.e=1; +} diff --git a/js/src/tests/ecma_3/Object/shell.js b/js/src/tests/ecma_3/Object/shell.js new file mode 100644 index 000000000..583d545f8 --- /dev/null +++ b/js/src/tests/ecma_3/Object/shell.js @@ -0,0 +1,71 @@ +/* -*- 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: 14 Mar 2001 + * + * SUMMARY: Utility functions for testing objects - + * + * Suppose obj is an instance of a native type, e.g. Number. + * Then obj.toString() invokes Number.prototype.toString(). + * We would also like to access Object.prototype.toString(). + * + * The difference is this: suppose obj = new Number(7). + * Invoking Number.prototype.toString() on this just returns 7. + * Object.prototype.toString() on this returns '[object Number]'. + * + * The getJSType() function below will return '[object Number]' for us. + * The getJSClass() function returns 'Number', the [[Class]] property of obj. + * See ECMA-262 Edition 3, 13-Oct-1999, Section 8.6.2 + */ +//----------------------------------------------------------------------------- + + +var cnNoObject = 'Unexpected Error!!! Parameter to this function must be an object'; +var cnNoClass = 'Unexpected Error!!! Cannot find Class property'; +var cnObjectToString = Object.prototype.toString; +var GLOBAL = 'global'; + +// checks that it's safe to call findType() +function getJSType(obj) +{ + if (isObject(obj)) + return findType(obj); + return cnNoObject; +} + + +// checks that it's safe to call findType() +function getJSClass(obj) +{ + if (isObject(obj)) + return findClass(findType(obj)); + return cnNoObject; +} + + +function findType(obj) +{ + return cnObjectToString.apply(obj); +} + + +// given '[object Number]', return 'Number' +function findClass(sType) +{ + var re = /^\[.*\s+(\w+)\s*\]$/; + var a = sType.match(re); + + if (a && a[1]) + return a[1]; + return cnNoClass; +} + + +function isObject(obj) +{ + return obj instanceof Object; +} + diff --git a/js/src/tests/ecma_3/Operators/11.13.1-001.js b/js/src/tests/ecma_3/Operators/11.13.1-001.js new file mode 100644 index 000000000..8df71af80 --- /dev/null +++ b/js/src/tests/ecma_3/Operators/11.13.1-001.js @@ -0,0 +1,118 @@ +/* -*- 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: 08 May 2003 + * SUMMARY: JS should evaluate RHS before binding LHS implicit variable + * + * See http://bugzilla.mozilla.org/show_bug.cgi?id=204919 + * + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = 204919; +var summary = 'JS should evaluate RHS before binding LHS implicit variable'; +var TEST_PASSED = 'ReferenceError'; +var TEST_FAILED = 'Generated an error, but NOT a ReferenceError!'; +var TEST_FAILED_BADLY = 'Did not generate ANY error!!!'; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; + + +/* + * global scope - + */ +status = inSection(1); +try +{ + x = x; + actual = TEST_FAILED_BADLY; +} +catch(e) +{ + if (e instanceof ReferenceError) + actual = TEST_PASSED; + else + actual = TEST_FAILED; +} +expect = TEST_PASSED; +addThis(); + + +/* + * function scope - + */ +status = inSection(2); +try +{ + (function() {y = y;})(); + actual = TEST_FAILED_BADLY; +} +catch(e) +{ + if (e instanceof ReferenceError) + actual = TEST_PASSED; + else + actual = TEST_FAILED; +} +expect = TEST_PASSED; +addThis(); + + +/* + * eval scope - + */ +status = inSection(3); +try +{ + eval('z = z'); + actual = TEST_FAILED_BADLY; +} +catch(e) +{ + if (e instanceof ReferenceError) + actual = TEST_PASSED; + else + actual = TEST_FAILED; +} +expect = TEST_PASSED; +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/Operators/11.13.1-002.js b/js/src/tests/ecma_3/Operators/11.13.1-002.js new file mode 100644 index 000000000..4ccc4bb1f --- /dev/null +++ b/js/src/tests/ecma_3/Operators/11.13.1-002.js @@ -0,0 +1,24 @@ +/* -*- 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 = 312354; +var summary = '11.13.1 Simple Assignment should return type of RHS'; +var actual = ''; +var expect = ''; + +// XXX this test should really test each property of the native +// objects, but I'm too lazy. Patches accepted. + +printBugNumber(BUGNUMBER); +printStatus (summary); + +var re = /x/g; +var y = re.lastIndex = "7"; + +expect = "string"; +actual = typeof y; + +reportCompare(expect, actual, summary); diff --git a/js/src/tests/ecma_3/Operators/11.4.1-001.js b/js/src/tests/ecma_3/Operators/11.4.1-001.js new file mode 100644 index 000000000..ea0fb4487 --- /dev/null +++ b/js/src/tests/ecma_3/Operators/11.4.1-001.js @@ -0,0 +1,86 @@ +/* -*- 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: 14 April 2003 + * SUMMARY: |delete x.y| should return |true| if |x| has no property |y| + * See http://bugzilla.mozilla.org/show_bug.cgi?id=201987 + * + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = 201987; +var summary = '|delete x.y| should return |true| if |x| has no property |y|'; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; + + +status = inSection(1); +var x = {}; +actual = delete x.y; +expect = true; +addThis(); + +status = inSection(2); +actual = delete {}.y; +expect = true; +addThis(); + +status = inSection(3); +actual = delete "".y; +expect = true; +addThis(); + +status = inSection(4); +actual = delete /abc/.y; +expect = true; +addThis(); + +status = inSection(5); +actual = delete (new Date()).y; +expect = true; +addThis(); + +status = inSection(6); +var x = 99; +actual = delete x.y; +expect = true; +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/Operators/11.4.1-002.js b/js/src/tests/ecma_3/Operators/11.4.1-002.js new file mode 100644 index 000000000..41d584386 --- /dev/null +++ b/js/src/tests/ecma_3/Operators/11.4.1-002.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 = 423300; +var summary = '11.4.1 - The delete Operator - delete f()'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function f() {} + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + expect = true; + + try + { + actual = delete f(); + } + catch(ex) + { + actual = ex + ''; + } + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/Operators/browser.js b/js/src/tests/ecma_3/Operators/browser.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/ecma_3/Operators/browser.js diff --git a/js/src/tests/ecma_3/Operators/order-01.js b/js/src/tests/ecma_3/Operators/order-01.js new file mode 100644 index 000000000..38d187a7b --- /dev/null +++ b/js/src/tests/ecma_3/Operators/order-01.js @@ -0,0 +1,75 @@ +/* -*- 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 = 433672; +var summary = 'operator evaluation order'; +var actual = ''; +var expect = ''; + +function makeObject(label) +{ + var o = (function (){}); + + o.label = label; + o.valueOf = (function() { actual += this.label + ' valueOf, '; return Object.prototype.valueOf.call(this); }); + o.toString = (function() { actual += this.label + ' toString, '; return Object.prototype.toString.call(this); }); + + return o; +} + +operators = [ + {section: '11.5.1', operator: '*'}, + {section: '11.5.2', operator: '/'}, + {section: '11.5.3', operator: '%'}, + {section: '11.6.1', operator: '+'}, + {section: '11.6.2', operator: '-'}, + {section: '11.7.1', operator: '<<'}, + {section: '11.7.2', operator: '>>'}, + {section: '11.7.3', operator: '>>>'}, + {section: '11.8.1', operator: '<'}, + {section: '11.8.2', operator: '>'}, + {section: '11.8.3', operator: '<='}, + {section: '11.8.4', operator: '>='}, + {section: '11.10', operator: '&'}, + {section: '11.10', operator: '^'}, + {section: '11.10', operator: '|'}, + {section: '11.13.2', operator: '*='}, + {section: '11.13.2', operator: '/='}, + {section: '11.13.2', operator: '%='}, + {section: '11.13.2', operator: '+='}, + {section: '11.13.2', operator: '<<='}, + {section: '11.13.2', operator: '>>='}, + {section: '11.13.2', operator: '>>>='}, + {section: '11.13.2', operator: '&='}, + {section: '11.13.2', operator: '^='}, + {section: '11.13.2', operator: '|='}, + ]; + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + for (var i = 0; i < operators.length; i++) + { + expect = 'left valueOf, left toString, right valueOf, right toString, '; + actual = ''; + + var left = makeObject('left'); + var right = makeObject('right'); + + eval('left ' + operators[i].operator + ' right'); + + reportCompare(expect, actual, summary + ': ' + operators[i].section + ' ' + operators[i].operator); + } + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/Operators/shell.js b/js/src/tests/ecma_3/Operators/shell.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/ecma_3/Operators/shell.js diff --git a/js/src/tests/ecma_3/README b/js/src/tests/ecma_3/README new file mode 100644 index 000000000..eebd421c2 --- /dev/null +++ b/js/src/tests/ecma_3/README @@ -0,0 +1 @@ +ECMA 262 Edition 3 diff --git a/js/src/tests/ecma_3/RegExp/15.10.2-1.js b/js/src/tests/ecma_3/RegExp/15.10.2-1.js new file mode 100644 index 000000000..c2f414539 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/15.10.2-1.js @@ -0,0 +1,147 @@ +/* -*- 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: 09 July 2002 + * SUMMARY: RegExp conformance test + * + * These testcases are derived from the examples in the ECMA-262 Ed.3 spec + * scattered through section 15.10.2. + * + */ +//----------------------------------------------------------------------------- +var i = 0; +var BUGNUMBER = '(none)'; +var summary = 'RegExp conformance test'; +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(); + + +status = inSection(1); +pattern = /a|ab/; +string = 'abc'; +actualmatch = string.match(pattern); +expectedmatch = Array('a'); +addThis(); + +status = inSection(2); +pattern = /((a)|(ab))((c)|(bc))/; +string = 'abc'; +actualmatch = string.match(pattern); +expectedmatch = Array('abc', 'a', 'a', undefined, 'bc', undefined, 'bc'); +addThis(); + +status = inSection(3); +pattern = /a[a-z]{2,4}/; +string = 'abcdefghi'; +actualmatch = string.match(pattern); +expectedmatch = Array('abcde'); +addThis(); + +status = inSection(4); +pattern = /a[a-z]{2,4}?/; +string = 'abcdefghi'; +actualmatch = string.match(pattern); +expectedmatch = Array('abc'); +addThis(); + +status = inSection(5); +pattern = /(aa|aabaac|ba|b|c)*/; +string = 'aabaac'; +actualmatch = string.match(pattern); +expectedmatch = Array('aaba', 'ba'); +addThis(); + +status = inSection(6); +pattern = /^(a+)\1*,\1+$/; +string = 'aaaaaaaaaa,aaaaaaaaaaaaaaa'; +actualmatch = string.match(pattern); +expectedmatch = Array('aaaaaaaaaa,aaaaaaaaaaaaaaa', 'aaaaa'); +addThis(); + +status = inSection(7); +pattern = /(z)((a+)?(b+)?(c))*/; +string = 'zaacbbbcac'; +actualmatch = string.match(pattern); +expectedmatch = Array('zaacbbbcac', 'z', 'ac', 'a', undefined, 'c'); +addThis(); + +status = inSection(8); +pattern = /(a*)*/; +string = 'b'; +actualmatch = string.match(pattern); +expectedmatch = Array('', undefined); +addThis(); + +status = inSection(9); +pattern = /(a*)b\1+/; +string = 'baaaac'; +actualmatch = string.match(pattern); +expectedmatch = Array('b', ''); +addThis(); + +status = inSection(10); +pattern = /(?=(a+))/; +string = 'baaabac'; +actualmatch = string.match(pattern); +expectedmatch = Array('', 'aaa'); +addThis(); + +status = inSection(11); +pattern = /(?=(a+))a*b\1/; +string = 'baaabac'; +actualmatch = string.match(pattern); +expectedmatch = Array('aba', 'a'); +addThis(); + +status = inSection(12); +pattern = /(.*?)a(?!(a+)b\2c)\2(.*)/; +string = 'baaabaac'; +actualmatch = string.match(pattern); +expectedmatch = Array('baaabaac', 'ba', undefined, 'abaac'); +addThis(); + +status = inSection(13); +pattern = /(?=(a+))/; +string = 'baaabac'; +actualmatch = string.match(pattern); +expectedmatch = Array('', 'aaa'); +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/RegExp/15.10.2.12.js b/js/src/tests/ecma_3/RegExp/15.10.2.12.js new file mode 100644 index 000000000..c2adfdfb9 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/15.10.2.12.js @@ -0,0 +1,29 @@ +/* -*- 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 = 378738; +var summary = '15.10.2.12 - CharacterClassEscape \d'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + expect = false; + actual = /\d/.test("\uFF11"); + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/RegExp/15.10.3.1-1.js b/js/src/tests/ecma_3/RegExp/15.10.3.1-1.js new file mode 100644 index 000000000..74ff25e4c --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/15.10.3.1-1.js @@ -0,0 +1,102 @@ +/* -*- 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 November 2000 + * + * + * SUMMARY: Passing (RegExp object, flag) to RegExp() function. + * This test arose from Bugzilla bug 61266. The ECMA3 section is: + * + * 15.10.3 The RegExp Constructor Called as a Function + * + * 15.10.3.1 RegExp(pattern, flags) + * + * If pattern is an object R whose [[Class]] property is "RegExp" + * and flags is undefined, then return R unchanged. Otherwise + * call the RegExp constructor (section 15.10.4.1), passing it the + * pattern and flags arguments and return the object constructed + * by that constructor. + * + * + * The current test will check the first scenario outlined above: + * + * "pattern" is itself a RegExp object R + * "flags" is undefined + * + * The flags parameter will be undefined in the sense of not being + * provided. We check that RegExp(R) returns R - + */ +//----------------------------------------------------------------------------- +var BUGNUMBER = '61266'; +var summary = 'Passing (RegExp object,flag) to RegExp() function'; +var statprefix = 'RegExp(new RegExp('; +var comma = ', '; var singlequote = "'"; var closeparens = '))'; +var cnSUCCESS = 'RegExp() returned the supplied RegExp object'; +var cnFAILURE = 'RegExp() did NOT return the supplied RegExp object'; +var i = -1; var j = -1; var s = ''; var f = ''; +var obj = {}; +var status = ''; var actual = ''; var expect = ''; +var patterns = new Array(); +var flags = new Array(); + + +// various regular expressions to try - +patterns[0] = ''; +patterns[1] = 'abc'; +patterns[2] = '(.*)(3-1)\s\w'; +patterns[3] = '(.*)(...)\\s\\w'; +patterns[4] = '[^A-Za-z0-9_]'; +patterns[5] = '[^\f\n\r\t\v](123.5)([4 - 8]$)'; + +// various flags to try - +flags[0] = 'i'; +flags[1] = 'g'; +flags[2] = 'm'; +flags[3] = undefined; + + + +//------------------------------------------------------------------------------------------------- +test(); +//------------------------------------------------------------------------------------------------- + + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + for (i in patterns) + { + s = patterns[i]; + + for (j in flags) + { + f = flags[j]; + status = getStatus(s, f); + obj = new RegExp(s, f); + + actual = (obj == RegExp(obj))? cnSUCCESS : cnFAILURE; + expect = cnSUCCESS; + reportCompare (expect, actual, status); + } + } + + exitFunc ('test'); +} + + +function getStatus(regexp, flag) +{ + return (statprefix + quote(regexp) + comma + flag + closeparens); +} + + +function quote(text) +{ + return (singlequote + text + singlequote); +} diff --git a/js/src/tests/ecma_3/RegExp/15.10.3.1-2.js b/js/src/tests/ecma_3/RegExp/15.10.3.1-2.js new file mode 100644 index 000000000..777bb43d4 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/15.10.3.1-2.js @@ -0,0 +1,110 @@ +/* -*- 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 November 2000 + * + * + * SUMMARY: Passing (RegExp object, flag) to RegExp() function. + * This test arose from Bugzilla bug 61266. The ECMA3 section is: + * + * 15.10.3 The RegExp Constructor Called as a Function + * + * 15.10.3.1 RegExp(pattern, flags) + * + * If pattern is an object R whose [[Class]] property is "RegExp" + * and flags is undefined, then return R unchanged. Otherwise + * call the RegExp constructor (section 15.10.4.1), passing it the + * pattern and flags arguments and return the object constructed + * by that constructor. + * + * + * The current test will check the first scenario outlined above: + * + * "pattern" is itself a RegExp object R + * "flags" is undefined + * + * This test is identical to test 15.10.3.1-1.js, except here we do: + * + * RegExp(R, undefined); + * + * instead of: + * + * RegExp(R); + * + * + * We check that RegExp(R, undefined) returns R - + */ +//----------------------------------------------------------------------------- +var BUGNUMBER = '61266'; +var summary = 'Passing (RegExp object,flag) to RegExp() function'; +var statprefix = 'RegExp(new RegExp('; +var comma = ', '; var singlequote = "'"; var closeparens = '))'; +var cnSUCCESS = 'RegExp() returned the supplied RegExp object'; +var cnFAILURE = 'RegExp() did NOT return the supplied RegExp object'; +var i = -1; var j = -1; var s = ''; var f = ''; +var obj = {}; +var status = ''; var actual = ''; var expect = ''; +var patterns = new Array(); +var flags = new Array(); + + +// various regular expressions to try - +patterns[0] = ''; +patterns[1] = 'abc'; +patterns[2] = '(.*)(3-1)\s\w'; +patterns[3] = '(.*)(...)\\s\\w'; +patterns[4] = '[^A-Za-z0-9_]'; +patterns[5] = '[^\f\n\r\t\v](123.5)([4 - 8]$)'; + +// various flags to try - +flags[0] = 'i'; +flags[1] = 'g'; +flags[2] = 'm'; +flags[3] = undefined; + + + +//------------------------------------------------------------------------------------------------- +test(); +//------------------------------------------------------------------------------------------------- + + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + for (i in patterns) + { + s = patterns[i]; + + for (j in flags) + { + f = flags[j]; + status = getStatus(s, f); + obj = new RegExp(s, f); + + actual = (obj == RegExp(obj, undefined))? cnSUCCESS : cnFAILURE ; + expect = cnSUCCESS; + reportCompare (expect, actual, status); + } + } + + exitFunc ('test'); +} + + +function getStatus(regexp, flag) +{ + return (statprefix + quote(regexp) + comma + flag + closeparens); +} + + +function quote(text) +{ + return (singlequote + text + singlequote); +} diff --git a/js/src/tests/ecma_3/RegExp/15.10.4.1-1.js b/js/src/tests/ecma_3/RegExp/15.10.4.1-1.js new file mode 100644 index 000000000..6a3ff20a7 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/15.10.4.1-1.js @@ -0,0 +1,93 @@ +/* -*- 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 November 2000 + * + * + *SUMMARY: Passing a RegExp object to a RegExp() constructor. + *This test arose from Bugzilla bug 61266. The ECMA3 section is: + * + * 15.10.4.1 new RegExp(pattern, flags) + * + * If pattern is an object R whose [[Class]] property is "RegExp" and + * flags is undefined, then let P be the pattern used to construct R + * and let F be the flags used to construct R. If pattern is an object R + * whose [[Class]] property is "RegExp" and flags is not undefined, + * then throw a TypeError exception. Otherwise, let P be the empty string + * if pattern is undefined and ToString(pattern) otherwise, and let F be + * the empty string if flags is undefined and ToString(flags) otherwise. + * + * + *The current test will check the first scenario outlined above: + * + * "pattern" is itself a RegExp object R + * "flags" is undefined + * + * We check that a new RegExp object obj2 defined from these parameters + * is morally the same as the original RegExp object obj1. Of course, they + * can't be equal as objects - so we check their enumerable properties... + * + * In this test, the initial RegExp object obj1 will not include a + * flag. The flags parameter for obj2 will be undefined in the sense + * of not being provided. + */ +//----------------------------------------------------------------------------- +var BUGNUMBER = '61266'; +var summary = 'Passing a RegExp object to a RegExp() constructor'; +var statprefix = 'Applying RegExp() twice to pattern '; +var statsuffix = '; testing property '; +var singlequote = "'"; +var i = -1; var s = ''; +var obj1 = {}; var obj2 = {}; +var status = ''; var actual = ''; var expect = ''; var msg = ''; +var patterns = new Array(); + + +// various regular expressions to try - +patterns[0] = ''; +patterns[1] = 'abc'; +patterns[2] = '(.*)(3-1)\s\w'; +patterns[3] = '(.*)(...)\\s\\w'; +patterns[4] = '[^A-Za-z0-9_]'; +patterns[5] = '[^\f\n\r\t\v](123.5)([4 - 8]$)'; + + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + for (i in patterns) + { + s = patterns[i]; + status =getStatus(s); + obj1 = new RegExp(s); + obj2 = new RegExp(obj1); + + reportCompare (obj1 + '', obj2 + '', status); + } + + exitFunc ('test'); +} + + +function getStatus(regexp) +{ + return (statprefix + quote(regexp) + statsuffix); +} + + +function quote(text) +{ + return (singlequote + text + singlequote); +} diff --git a/js/src/tests/ecma_3/RegExp/15.10.4.1-2.js b/js/src/tests/ecma_3/RegExp/15.10.4.1-2.js new file mode 100644 index 000000000..71fe58d19 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/15.10.4.1-2.js @@ -0,0 +1,99 @@ +/* -*- 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 November 2000 + * + * + *SUMMARY: Passing a RegExp object to a RegExp() constructor. + *This test arose from Bugzilla bug 61266. The ECMA3 section is: + * + * 15.10.4.1 new RegExp(pattern, flags) + * + * If pattern is an object R whose [[Class]] property is "RegExp" and + * flags is undefined, then let P be the pattern used to construct R + * and let F be the flags used to construct R. If pattern is an object R + * whose [[Class]] property is "RegExp" and flags is not undefined, + * then throw a TypeError exception. Otherwise, let P be the empty string + * if pattern is undefined and ToString(pattern) otherwise, and let F be + * the empty string if flags is undefined and ToString(flags) otherwise. + * + * + *The current test will check the first scenario outlined above: + * + * "pattern" is itself a RegExp object R + * "flags" is undefined + * + * We check that a new RegExp object obj2 defined from these parameters + * is morally the same as the original RegExp object obj1. Of course, they + * can't be equal as objects - so we check their enumerable properties... + * + * In this test, the initial RegExp object obj1 will not include a + * flag. This test is identical to test 15.10.4.1-1.js, except that + * here we use this syntax: + * + * obj2 = new RegExp(obj1, undefined); + * + * instead of: + * + * obj2 = new RegExp(obj1); + */ +//----------------------------------------------------------------------------- +var BUGNUMBER = '61266'; +var summary = 'Passing a RegExp object to a RegExp() constructor'; +var statprefix = 'Applying RegExp() twice to pattern '; +var statsuffix = '; testing property '; +var singlequote = "'"; +var i = -1; var s = ''; +var obj1 = {}; var obj2 = {}; +var status = ''; var actual = ''; var expect = ''; var msg = ''; +var patterns = new Array(); + + +// various regular expressions to try - +patterns[0] = ''; +patterns[1] = 'abc'; +patterns[2] = '(.*)(3-1)\s\w'; +patterns[3] = '(.*)(...)\\s\\w'; +patterns[4] = '[^A-Za-z0-9_]'; +patterns[5] = '[^\f\n\r\t\v](123.5)([4 - 8]$)'; + + + +//------------------------------------------------------------------------------------------------- +test(); +//------------------------------------------------------------------------------------------------- + + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + for (i in patterns) + { + s = patterns[i]; + status =getStatus(s); + obj1 = new RegExp(s); + obj2 = new RegExp(obj1, undefined); // see introduction to bug + + reportCompare (obj1 + '', obj2 + '', status); + } + + exitFunc ('test'); +} + + +function getStatus(regexp) +{ + return (statprefix + quote(regexp) + statsuffix); +} + + +function quote(text) +{ + return (singlequote + text + singlequote); +} diff --git a/js/src/tests/ecma_3/RegExp/15.10.4.1-3.js b/js/src/tests/ecma_3/RegExp/15.10.4.1-3.js new file mode 100644 index 000000000..15959ef5e --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/15.10.4.1-3.js @@ -0,0 +1,105 @@ +/* -*- 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 November 2000 + * + * + *SUMMARY: Passing a RegExp object to a RegExp() constructor. + *This test arose from Bugzilla bug 61266. The ECMA3 section is: + * + * 15.10.4.1 new RegExp(pattern, flags) + * + * If pattern is an object R whose [[Class]] property is "RegExp" and + * flags is undefined, then let P be the pattern used to construct R + * and let F be the flags used to construct R. If pattern is an object R + * whose [[Class]] property is "RegExp" and flags is not undefined, + * then throw a TypeError exception. Otherwise, let P be the empty string + * if pattern is undefined and ToString(pattern) otherwise, and let F be + * the empty string if flags is undefined and ToString(flags) otherwise. + * + * + *The current test will check the first scenario outlined above: + * + * "pattern" is itself a RegExp object R + * "flags" is undefined + * + * We check that a new RegExp object obj2 defined from these parameters + * is morally the same as the original RegExp object obj1. Of course, they + * can't be equal as objects - so we check their enumerable properties... + * + * In this test, the initial RegExp obj1 will include a flag. The flags + * parameter for obj2 will be undefined in the sense of not being provided. + */ +//----------------------------------------------------------------------------- +var BUGNUMBER = '61266'; +var summary = 'Passing a RegExp object to a RegExp() constructor'; +var statprefix = 'Applying RegExp() twice to pattern '; +var statmiddle = ' and flag '; +var statsuffix = '; testing property '; +var singlequote = "'"; +var i = -1; var j = -1; var s = ''; +var obj1 = {}; var obj2 = {}; +var status = ''; var actual = ''; var expect = ''; var msg = ''; +var patterns = new Array(); +var flags = new Array(); + + +// various regular expressions to try - +patterns[0] = ''; +patterns[1] = 'abc'; +patterns[2] = '(.*)(3-1)\s\w'; +patterns[3] = '(.*)(...)\\s\\w'; +patterns[4] = '[^A-Za-z0-9_]'; +patterns[5] = '[^\f\n\r\t\v](123.5)([4 - 8]$)'; + +// various flags to try - +flags[0] = 'i'; +flags[1] = 'g'; +flags[2] = 'm'; +flags[3] = undefined; + + + +//------------------------------------------------------------------------------------------------- +test(); +//------------------------------------------------------------------------------------------------- + + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + for (i in patterns) + { + s = patterns[i]; + + for (j in flags) + { + f = flags[j]; + status = getStatus(s, f); + obj1 = new RegExp(s, f); + obj2 = new RegExp(obj1); + + reportCompare (obj1 + '', obj2 + '', status); + } + } + + exitFunc ('test'); +} + + +function getStatus(regexp, flag) +{ + return (statprefix + quote(regexp) + statmiddle + flag + statsuffix); +} + + +function quote(text) +{ + return (singlequote + text + singlequote); +} diff --git a/js/src/tests/ecma_3/RegExp/15.10.4.1-4.js b/js/src/tests/ecma_3/RegExp/15.10.4.1-4.js new file mode 100644 index 000000000..455e1d248 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/15.10.4.1-4.js @@ -0,0 +1,112 @@ +/* -*- 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 November 2000 + * + * + *SUMMARY: Passing a RegExp object to a RegExp() constructor. + *This test arose from Bugzilla bug 61266. The ECMA3 section is: + * + * 15.10.4.1 new RegExp(pattern, flags) + * + * If pattern is an object R whose [[Class]] property is "RegExp" and + * flags is undefined, then let P be the pattern used to construct R + * and let F be the flags used to construct R. If pattern is an object R + * whose [[Class]] property is "RegExp" and flags is not undefined, + * then throw a TypeError exception. Otherwise, let P be the empty string + * if pattern is undefined and ToString(pattern) otherwise, and let F be + * the empty string if flags is undefined and ToString(flags) otherwise. + * + * + *The current test will check the first scenario outlined above: + * + * "pattern" is itself a RegExp object R + * "flags" is undefined + * + * We check that a new RegExp object obj2 defined from these parameters + * is morally the same as the original RegExp object obj1. Of course, they + * can't be equal as objects - so we check their enumerable properties... + * + * In this test, the initial RegExp object obj1 will include a + * flag. This test is identical to test 15.10.4.1-3.js, except that + * here we use this syntax: + * + * obj2 = new RegExp(obj1, undefined); + * + * instead of: + * + * obj2 = new RegExp(obj1); + */ +//----------------------------------------------------------------------------- +var BUGNUMBER = '61266'; +var summary = 'Passing a RegExp object to a RegExp() constructor'; +var statprefix = 'Applying RegExp() twice to pattern '; +var statmiddle = ' and flag '; +var statsuffix = '; testing property '; +var singlequote = "'"; +var i = -1; var j = -1; var s = ''; +var obj1 = {}; var obj2 = {}; +var status = ''; var actual = ''; var expect = ''; var msg = ''; +var patterns = new Array(); +var flags = new Array(); + + +// various regular expressions to try - +patterns[0] = ''; +patterns[1] = 'abc'; +patterns[2] = '(.*)(3-1)\s\w'; +patterns[3] = '(.*)(...)\\s\\w'; +patterns[4] = '[^A-Za-z0-9_]'; +patterns[5] = '[^\f\n\r\t\v](123.5)([4 - 8]$)'; + +// various flags to try - +flags[0] = 'i'; +flags[1] = 'g'; +flags[2] = 'm'; +flags[3] = undefined; + + + +//------------------------------------------------------------------------------------------------- +test(); +//------------------------------------------------------------------------------------------------- + + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + for (i in patterns) + { + s = patterns[i]; + + for (j in flags) + { + f = flags[j]; + status = getStatus(s, f); + obj1 = new RegExp(s, f); + obj2 = new RegExp(obj1, undefined); // see introduction to bug + + reportCompare (obj1 + '', obj2 + '', status); + } + } + + exitFunc ('test'); +} + + +function getStatus(regexp, flag) +{ + return (statprefix + quote(regexp) + statmiddle + flag + statsuffix); +} + + +function quote(text) +{ + return (singlequote + text + singlequote); +} diff --git a/js/src/tests/ecma_3/RegExp/15.10.4.1-6.js b/js/src/tests/ecma_3/RegExp/15.10.4.1-6.js new file mode 100644 index 000000000..104e83ee6 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/15.10.4.1-6.js @@ -0,0 +1,62 @@ +/* -*- 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/. */ + +/* + 15.10.4.1 new RegExp(pattern, flags) + + If F contains any character other than "g", "i", or" m", or if it + contains the same one more than once, then throw a SyntaxError + exception. +*/ + +//----------------------------------------------------------------------------- +var BUGNUMBER = 476940; +var summary = 'Section 15.10.4.1 - RegExp with invalid flags'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + var invalidflags = ['ii', 'gg', 'mm', 'a']; + + for (var i = 0; i < invalidflags.length; i++) + { + var flag = invalidflags[i]; + expect = 'SyntaxError: invalid regular expression flag ' + flag.charAt(0); + actual = ''; + try + { + new RegExp('bar', flag); + } + catch(ex) + { + actual = ex + ''; + } + reportCompare(expect, actual, summary + + ': new RegExp("bar", "' + flag + '")'); + + actual = ''; + try + { + eval("/bar/" + flag); + } + catch(ex) + { + actual = ex + ''; + } + reportCompare(expect, actual, summary + ': /bar/' + flag + ')'); + } + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/RegExp/15.10.6.2-1.js b/js/src/tests/ecma_3/RegExp/15.10.6.2-1.js new file mode 100644 index 000000000..9717ba217 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/15.10.6.2-1.js @@ -0,0 +1,106 @@ +/* -*- 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: 23 October 2001 + * + * SUMMARY: Testing regexps with the global flag set. + * NOT every substring fitting the given pattern will be matched. + * The parent string is CONSUMED as successive matches are found. + * + * From the ECMA-262 Final spec: + * + * 15.10.6.2 RegExp.prototype.exec(string) + * Performs a regular expression match of string against the regular + * expression and returns an Array object containing the results of + * the match, or null if the string did not match. + * + * The string ToString(string) is searched for an occurrence of the + * regular expression pattern as follows: + * + * 1. Let S be the value of ToString(string). + * 2. Let length be the length of S. + * 3. Let lastIndex be the value of the lastIndex property. + * 4. Let i be the value of ToInteger(lastIndex). + * 5. If the global property is false, let i = 0. + * 6. If i < 0 or i > length then set lastIndex to 0 and return null. + * 7. Call [[Match]], giving it the arguments S and i. + * If [[Match]] returned failure, go to step 8; + * otherwise let r be its State result and go to step 10. + * 8. Let i = i+1. + * 9. Go to step 6. + * 10. Let e be r's endIndex value. + * 11. If the global property is true, set lastIndex to e. + * + * etc. + * + * + * So when the global flag is set, |lastIndex| is incremented every time + * there is a match; not from i to i+1, but from i to "endIndex" e: + * + * e = (index of last input character matched so far by the pattern) + 1 + * + * Thus in the example below, the first endIndex e occurs after the + * first match 'a b'. The next match will begin AFTER this, and so + * will NOT be 'b c', but rather 'c d'. Similarly, 'd e' won't be matched. + */ +//----------------------------------------------------------------------------- +var i = 0; +var BUGNUMBER = '(none)'; +var summary = 'Testing regexps with the global flag set'; +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(); + + +status = inSection(1); +string = 'a b c d e'; +pattern = /\w\s\w/g; +actualmatch = string.match(pattern); +expectedmatch = ['a b','c d']; // see above explanation - +addThis(); + + +status = inSection(2); +string = '12345678'; +pattern = /\d\d\d/g; +actualmatch = string.match(pattern); +expectedmatch = ['123','456']; +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/RegExp/15.10.6.2-2.js b/js/src/tests/ecma_3/RegExp/15.10.6.2-2.js new file mode 100644 index 000000000..eb544cb35 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/15.10.6.2-2.js @@ -0,0 +1,294 @@ +/* -*- 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: 18 Feb 2002 + * SUMMARY: Testing re.exec(str) when re.lastIndex is < 0 or > str.length + * + * Case 1: If re has the global flag set, then re(str) should be null + * Case 2: If re doesn't have this set, then re(str) should be unaffected + * + * See http://bugzilla.mozilla.org/show_bug.cgi?id=76717 + * + * + * From the ECMA-262 Final spec: + * + * 15.10.6.2 RegExp.prototype.exec(string) + * Performs a regular expression match of string against the regular + * expression and returns an Array object containing the results of + * the match, or null if the string did not match. + * + * The string ToString(string) is searched for an occurrence of the + * regular expression pattern as follows: + * + * 1. Let S be the value of ToString(string). + * 2. Let length be the length of S. + * 3. Let lastIndex be the value of the lastIndex property. + * 4. Let i be the value of ToInteger(lastIndex). + * 5. If the global property is false, let i = 0. + * 6. If i < 0 or i > length then set lastIndex to 0 and return null. + * 7. Call [[Match]], giving it the arguments S and i. + * If [[Match]] returned failure, go to step 8; + * otherwise let r be its State result and go to step 10. + * 8. Let i = i+1. + * 9. Go to step 6. + * 10. Let e be r's endIndex value. + * 11. If the global property is true, set lastIndex to e. + * + * etc. + * + * + * So: + * + * A. If the global flag is not set, |lastIndex| is set to 0 + * before the match is attempted; thus the match is unaffected. + * + * B. If the global flag IS set and re.lastIndex is >= 0 and <= str.length, + * |lastIndex| is incremented every time there is a match; not from + * i to i+1, but from i to "endIndex" e: + * + * e = (index of last input character matched so far by the pattern) + 1 + * + * The match is then attempted from this position in the string (Step 7). + * + * C. When the global flag IS set and re.lastIndex is < 0 or > str.length, + * |lastIndex| is set to 0 and the match returns null. + * + * + * Note the |lastIndex| property is writeable, and may be set arbitrarily + * by the programmer - and we will do that below. + * + */ +//----------------------------------------------------------------------------- +var i = 0; +var BUGNUMBER = 76717; +var summary = 'Testing re.exec(str) when re.lastIndex is < 0 or > str.length'; +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(); + + +/****************************************************************************** + * + * Case 1 : when the global flag is set - + * + *****************************************************************************/ +pattern = /abc/gi; +string = 'AbcaBcabC'; + +status = inSection(1); +actualmatch = pattern.exec(string); +expectedmatch = Array('Abc'); +addThis(); + +status = inSection(2); +actualmatch = pattern.exec(string); +expectedmatch = Array('aBc'); +addThis(); + +status = inSection(3); +actualmatch = pattern.exec(string); +expectedmatch = Array('abC'); +addThis(); + +/* + * At this point |lastIndex| is > string.length, so the match should be null - + */ +status = inSection(4); +actualmatch = pattern.exec(string); +expectedmatch = null; +addThis(); + +/* + * Now try some edge-case values. Thanks to the work done in + * http://bugzilla.mozilla.org/show_bug.cgi?id=124339, |lastIndex| + * is now stored as a double instead of a uint32_t (unsigned integer). + * + * Note 2^32 -1 is the upper bound for uint32's, but doubles can go + * all the way up to Number.MAX_VALUE. So that's why we need cases + * between those two numbers. + */ +status = inSection(6); +pattern.lastIndex = Math.pow(2,32); +actualmatch = pattern.exec(string); +expectedmatch = null; +addThis(); + +status = inSection(8); +pattern.lastIndex = Math.pow(2,32) + 1; +actualmatch = pattern.exec(string); +expectedmatch = null; +addThis(); + +status = inSection(10); +pattern.lastIndex = Math.pow(2,32) * 2; +actualmatch = pattern.exec(string); +expectedmatch = null; +addThis(); + +status = inSection(12); +pattern.lastIndex = Math.pow(2,40); +actualmatch = pattern.exec(string); +expectedmatch = null; +addThis(); + +status = inSection(14); +pattern.lastIndex = Number.MAX_VALUE; +actualmatch = pattern.exec(string); +expectedmatch = null; +addThis(); + + + +/****************************************************************************** + * + * Case 2: repeat all the above cases WITHOUT the global flag set. + * According to EMCA. |lastIndex| should get set to 0 before the match. + * + * Therefore re.exec(str) should be unaffected; thus our expected values + * below are now DIFFERENT when |lastIndex| is < 0 or > str.length + * + *****************************************************************************/ + +pattern = /abc/i; +string = 'AbcaBcabC'; + +status = inSection(16); +actualmatch = pattern.exec(string); +expectedmatch = Array('Abc'); +addThis(); + +status = inSection(17); +actualmatch = pattern.exec(string); +expectedmatch = Array('Abc'); // NOT Array('aBc') as before - +addThis(); + +status = inSection(18); +actualmatch = pattern.exec(string); +expectedmatch = Array('Abc'); // NOT Array('abC') as before - +addThis(); + +/* + * At this point above, |lastIndex| WAS > string.length, but not here - + */ +status = inSection(19); +actualmatch = pattern.exec(string); +expectedmatch = Array('Abc') // NOT null as before - + addThis(); + +/* + * Now let's set |lastIndex| to -1 + */ +status = inSection(20); +pattern.lastIndex = -1; +actualmatch = pattern.exec(string); +expectedmatch = Array('Abc') // NOT null as before - + addThis(); + +/* + * Now try some edge-case values. Thanks to the work done in + * http://bugzilla.mozilla.org/show_bug.cgi?id=124339, |lastIndex| + * is now stored as a double instead of a uint32_t (unsigned integer). + * + * Note 2^32 -1 is the upper bound for uint32's, but doubles can go + * all the way up to Number.MAX_VALUE. So that's why we need cases + * between those two numbers. + */ +status = inSection(21); +pattern.lastIndex = Math.pow(2,32); +actualmatch = pattern.exec(string); +expectedmatch = Array('Abc') // NOT null as before - + addThis(); + +status = inSection(22); +pattern.lastIndex = -Math.pow(2,32); +actualmatch = pattern.exec(string); +expectedmatch = Array('Abc') // NOT null as before - + addThis(); + +status = inSection(23); +pattern.lastIndex = Math.pow(2,32) + 1; +actualmatch = pattern.exec(string); +expectedmatch = Array('Abc') // NOT null as before - + addThis(); + +status = inSection(24); +pattern.lastIndex = -(Math.pow(2,32) + 1); +actualmatch = pattern.exec(string); +expectedmatch = Array('Abc') // NOT null as before - + addThis(); + +status = inSection(25); +pattern.lastIndex = Math.pow(2,32) * 2; +actualmatch = pattern.exec(string); +expectedmatch = Array('Abc') // NOT null as before - + addThis(); + +status = inSection(26); +pattern.lastIndex = -Math.pow(2,32) * 2; +actualmatch = pattern.exec(string); +expectedmatch = Array('Abc') // NOT null as before - + addThis(); + +status = inSection(27); +pattern.lastIndex = Math.pow(2,40); +actualmatch = pattern.exec(string); +expectedmatch = Array('Abc') // NOT null as before -; + addThis(); + +status = inSection(28); +pattern.lastIndex = -Math.pow(2,40); +actualmatch = pattern.exec(string); +expectedmatch = Array('Abc') // NOT null as before - + addThis(); + +status = inSection(29); +pattern.lastIndex = Number.MAX_VALUE; +actualmatch = pattern.exec(string); +expectedmatch = Array('Abc') // NOT null as before - + addThis(); + +status = inSection(30); +pattern.lastIndex = -Number.MAX_VALUE; +actualmatch = pattern.exec(string); +expectedmatch = Array('Abc') // NOT null as before - + 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/RegExp/browser.js b/js/src/tests/ecma_3/RegExp/browser.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/browser.js diff --git a/js/src/tests/ecma_3/RegExp/octal-001.js b/js/src/tests/ecma_3/RegExp/octal-001.js new file mode 100644 index 000000000..449384b4b --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/octal-001.js @@ -0,0 +1,102 @@ +/* -*- 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: 18 July 2002 + * SUMMARY: Testing octal sequences in regexps + * See http://bugzilla.mozilla.org/show_bug.cgi?id=141078 + * + */ +//----------------------------------------------------------------------------- +var i = 0; +var BUGNUMBER = 141078; +var summary = 'Testing octal sequences in regexps'; +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(); + + +status = inSection(1); +pattern = /\240/; +string = 'abc'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +/* + * In the following sections, we test the octal escape sequence '\052'. + * This is character code 42, representing the asterisk character '*'. + * The Unicode escape for it would be '\u002A', the hex escape '\x2A'. + */ +status = inSection(2); +pattern = /ab\052c/; +string = 'ab*c'; +actualmatch = string.match(pattern); +expectedmatch = Array('ab*c'); +addThis(); + +status = inSection(3); +pattern = /ab\052*c/; +string = 'abc'; +actualmatch = string.match(pattern); +expectedmatch = Array('abc'); +addThis(); + +status = inSection(4); +pattern = /ab(\052)+c/; +string = 'ab****c'; +actualmatch = string.match(pattern); +expectedmatch = Array('ab****c', '*'); +addThis(); + +status = inSection(5); +pattern = /ab((\052)+)c/; +string = 'ab****c'; +actualmatch = string.match(pattern); +expectedmatch = Array('ab****c', '****', '*'); +addThis(); + +status = inSection(6); +pattern = /(?:\052)c/; +string = 'ab****c'; +actualmatch = string.match(pattern); +expectedmatch = Array('*c'); +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/RegExp/octal-002.js b/js/src/tests/ecma_3/RegExp/octal-002.js new file mode 100644 index 000000000..947031a94 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/octal-002.js @@ -0,0 +1,184 @@ +/* -*- 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: 31 July 2002 + * SUMMARY: Testing regexps containing octal escape sequences + * This is an elaboration of mozilla/js/tests/ecma_2/RegExp/octal-003.js + * + * See http://bugzilla.mozilla.org/show_bug.cgi?id=141078 + * for a reference on octal escape sequences in regexps. + * + * NOTE: + * We will use the identities '\011' === '\u0009' === '\x09' === '\t' + * + * The first is an octal escape sequence (\(0-3)OO; O an octal digit). + * See ECMA-262 Edition 2, Section 7.7.4 "String Literals". These were + * dropped in Edition 3 but we support them for backward compatibility. + * + * The second is a Unicode escape sequence (\uHHHH; H a hex digit). + * Since octal 11 = hex 9, the two escapes define the same character. + * + * The third is a hex escape sequence (\xHH; H a hex digit). + * Since hex 09 = hex 0009, this defines the same character. + * + * The fourth is the familiar escape sequence for a horizontal tab, + * defined in the ECMA spec as having Unicode value \u0009. + */ +//----------------------------------------------------------------------------- +var i = 0; +var BUGNUMBER = 141078; +var summary = 'Testing regexps containing octal escape sequences'; +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(); + + +/* + * Test a string containing the null character '\0' followed by the string '11' + * + * 'a' + String.fromCharCode(0) + '11'; + * + * Note we can't simply write 'a\011', because '\011' would be interpreted + * as the octal escape sequence for the tab character (see above). + * + * We should get no match from the regexp /.\011/, because it should be + * looking for the octal escape sequence \011, i.e. the tab character - + * + */ +status = inSection(1); +pattern = /.\011/; +string = 'a' + String.fromCharCode(0) + '11'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + + +/* + * Try same thing with 'xx' in place of '11'. + * + * Should get a match now, because the octal escape sequence in the regexp + * has been reduced from \011 to \0, and '\0' is present in the string - + */ +status = inSection(2); +pattern = /.\0xx/; +string = 'a' + String.fromCharCode(0) + 'xx'; +actualmatch = string.match(pattern); +expectedmatch = Array(string); +addThis(); + + +/* + * Same thing; don't use |String.fromCharCode(0)| this time. + * There is no ambiguity in '\0xx': it is the null character + * followed by two x's, no other interpretation is possible. + */ +status = inSection(3); +pattern = /.\0xx/; +string = 'a\0xx'; +actualmatch = string.match(pattern); +expectedmatch = Array(string); +addThis(); + + +/* + * This one should produce a match. The two-character string + * 'a' + '\011' is duplicated in the pattern and test string: + */ +status = inSection(4); +pattern = /.\011/; +string = 'a\011'; +actualmatch = string.match(pattern); +expectedmatch = Array(string); +addThis(); + + +/* + * Same as above, only now, for the second character of the string, + * use the Unicode escape '\u0009' instead of the octal escape '\011' + */ +status = inSection(5); +pattern = /.\011/; +string = 'a\u0009'; +actualmatch = string.match(pattern); +expectedmatch = Array(string); +addThis(); + + +/* + * Same as above, only now for the second character of the string, + * use the hex escape '\x09' instead of the octal escape '\011' + */ +status = inSection(6); +pattern = /.\011/; +string = 'a\x09'; +actualmatch = string.match(pattern); +expectedmatch = Array(string); +addThis(); + + +/* + * Same as above, only now for the second character of the string, + * use the escape '\t' instead of the octal escape '\011' + */ +status = inSection(7); +pattern = /.\011/; +string = 'a\t'; +actualmatch = string.match(pattern); +expectedmatch = Array(string); +addThis(); + + +/* + * Return to the string from Section 1. + * + * Unlike Section 1, use the RegExp() function to create the + * regexp pattern: null character followed by the string '11'. + * + * Since this is exactly what the string is, we should get a match - + */ +status = inSection(8); +string = 'a' + String.fromCharCode(0) + '11'; +pattern = RegExp(string); +actualmatch = string.match(pattern); +expectedmatch = Array(string); +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/RegExp/perlstress-001.js b/js/src/tests/ecma_3/RegExp/perlstress-001.js new file mode 100644 index 000000000..ba23360da --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/perlstress-001.js @@ -0,0 +1,3196 @@ +/* -*- 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: 2002-07-07 + * SUMMARY: Testing JS RegExp engine against Perl 5 RegExp engine. + * Adjust cnLBOUND, cnUBOUND below to restrict which sections are tested. + * + * This test was created by running various patterns and strings through the + * Perl 5 RegExp engine. We saved the results below to test the JS engine. + * + * NOTE: ECMA/JS and Perl do differ on certain points. We have either commented + * out such sections altogether, or modified them to fit what we expect from JS. + * + * EXAMPLES: + * + * - In JS, regexp captures (/(a) etc./) must hold |undefined| if not used. + * See http://bugzilla.mozilla.org/show_bug.cgi?id=123437. + * By contrast, in Perl, unmatched captures hold the empty string. + * We have modified such sections accordingly. Example: + + pattern = /^([^a-z])|(\^)$/; + string = '.'; + actualmatch = string.match(pattern); + //expectedmatch = Array('.', '.', ''); <<<--- Perl + expectedmatch = Array('.', '.', undefined); <<<--- JS + addThis(); + + + * - In JS, you can't refer to a capture before it's encountered & completed + * + * - Perl supports ] & ^] inside a [], ECMA does not + * + * - ECMA does support (?: (?= and (?! operators, but doesn't support (?< etc. + * + * - ECMA doesn't support (?imsx or (?-imsx + * + * - ECMA doesn't support (?(condition) + * + * - Perl has \Z has end-of-line, ECMA doesn't + * + * - In ECMA, ^ matches only the empty string before the first character + * + * - In ECMA, $ matches only the empty string at end of input (unless multiline) + * + * - ECMA spec says that each atom in a range must be a single character + * + * - ECMA doesn't support \A + * + * - ECMA doesn't have rules for [: + * + */ +//----------------------------------------------------------------------------- +var i = 0; +var BUGNUMBER = 85721; +var summary = 'Testing regular expression edge cases'; +var cnSingleSpace = ' '; +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 cnLBOUND = 1; +var cnUBOUND = 1000; + + +status = inSection(1); +pattern = /abc/; +string = 'abc'; +actualmatch = string.match(pattern); +expectedmatch = Array('abc'); +addThis(); + +status = inSection(2); +pattern = /abc/; +string = 'xabcy'; +actualmatch = string.match(pattern); +expectedmatch = Array('abc'); +addThis(); + +status = inSection(3); +pattern = /abc/; +string = 'ababc'; +actualmatch = string.match(pattern); +expectedmatch = Array('abc'); +addThis(); + +status = inSection(4); +pattern = /ab*c/; +string = 'abc'; +actualmatch = string.match(pattern); +expectedmatch = Array('abc'); +addThis(); + +status = inSection(5); +pattern = /ab*bc/; +string = 'abc'; +actualmatch = string.match(pattern); +expectedmatch = Array('abc'); +addThis(); + +status = inSection(6); +pattern = /ab*bc/; +string = 'abbc'; +actualmatch = string.match(pattern); +expectedmatch = Array('abbc'); +addThis(); + +status = inSection(7); +pattern = /ab*bc/; +string = 'abbbbc'; +actualmatch = string.match(pattern); +expectedmatch = Array('abbbbc'); +addThis(); + +status = inSection(8); +pattern = /.{1}/; +string = 'abbbbc'; +actualmatch = string.match(pattern); +expectedmatch = Array('a'); +addThis(); + +status = inSection(9); +pattern = /.{3,4}/; +string = 'abbbbc'; +actualmatch = string.match(pattern); +expectedmatch = Array('abbb'); +addThis(); + +status = inSection(10); +pattern = /ab{0,}bc/; +string = 'abbbbc'; +actualmatch = string.match(pattern); +expectedmatch = Array('abbbbc'); +addThis(); + +status = inSection(11); +pattern = /ab+bc/; +string = 'abbc'; +actualmatch = string.match(pattern); +expectedmatch = Array('abbc'); +addThis(); + +status = inSection(12); +pattern = /ab+bc/; +string = 'abbbbc'; +actualmatch = string.match(pattern); +expectedmatch = Array('abbbbc'); +addThis(); + +status = inSection(13); +pattern = /ab{1,}bc/; +string = 'abbbbc'; +actualmatch = string.match(pattern); +expectedmatch = Array('abbbbc'); +addThis(); + +status = inSection(14); +pattern = /ab{1,3}bc/; +string = 'abbbbc'; +actualmatch = string.match(pattern); +expectedmatch = Array('abbbbc'); +addThis(); + +status = inSection(15); +pattern = /ab{3,4}bc/; +string = 'abbbbc'; +actualmatch = string.match(pattern); +expectedmatch = Array('abbbbc'); +addThis(); + +status = inSection(16); +pattern = /ab?bc/; +string = 'abbc'; +actualmatch = string.match(pattern); +expectedmatch = Array('abbc'); +addThis(); + +status = inSection(17); +pattern = /ab?bc/; +string = 'abc'; +actualmatch = string.match(pattern); +expectedmatch = Array('abc'); +addThis(); + +status = inSection(18); +pattern = /ab{0,1}bc/; +string = 'abc'; +actualmatch = string.match(pattern); +expectedmatch = Array('abc'); +addThis(); + +status = inSection(19); +pattern = /ab?c/; +string = 'abc'; +actualmatch = string.match(pattern); +expectedmatch = Array('abc'); +addThis(); + +status = inSection(20); +pattern = /ab{0,1}c/; +string = 'abc'; +actualmatch = string.match(pattern); +expectedmatch = Array('abc'); +addThis(); + +status = inSection(21); +pattern = /^abc$/; +string = 'abc'; +actualmatch = string.match(pattern); +expectedmatch = Array('abc'); +addThis(); + +status = inSection(22); +pattern = /^abc/; +string = 'abcc'; +actualmatch = string.match(pattern); +expectedmatch = Array('abc'); +addThis(); + +status = inSection(23); +pattern = /abc$/; +string = 'aabc'; +actualmatch = string.match(pattern); +expectedmatch = Array('abc'); +addThis(); + +status = inSection(24); +pattern = /^/; +string = 'abc'; +actualmatch = string.match(pattern); +expectedmatch = Array(''); +addThis(); + +status = inSection(25); +pattern = /$/; +string = 'abc'; +actualmatch = string.match(pattern); +expectedmatch = Array(''); +addThis(); + +status = inSection(26); +pattern = /a.c/; +string = 'abc'; +actualmatch = string.match(pattern); +expectedmatch = Array('abc'); +addThis(); + +status = inSection(27); +pattern = /a.c/; +string = 'axc'; +actualmatch = string.match(pattern); +expectedmatch = Array('axc'); +addThis(); + +status = inSection(28); +pattern = /a.*c/; +string = 'axyzc'; +actualmatch = string.match(pattern); +expectedmatch = Array('axyzc'); +addThis(); + +status = inSection(29); +pattern = /a[bc]d/; +string = 'abd'; +actualmatch = string.match(pattern); +expectedmatch = Array('abd'); +addThis(); + +status = inSection(30); +pattern = /a[b-d]e/; +string = 'ace'; +actualmatch = string.match(pattern); +expectedmatch = Array('ace'); +addThis(); + +status = inSection(31); +pattern = /a[b-d]/; +string = 'aac'; +actualmatch = string.match(pattern); +expectedmatch = Array('ac'); +addThis(); + +status = inSection(32); +pattern = /a[-b]/; +string = 'a-'; +actualmatch = string.match(pattern); +expectedmatch = Array('a-'); +addThis(); + +status = inSection(33); +pattern = /a[b-]/; +string = 'a-'; +actualmatch = string.match(pattern); +expectedmatch = Array('a-'); +addThis(); + +status = inSection(34); +pattern = /a]/; +string = 'a]'; +actualmatch = string.match(pattern); +expectedmatch = Array('a]'); +addThis(); + +/* Perl supports ] & ^] inside a [], ECMA does not + pattern = /a[]]b/; + status = inSection(35); + string = 'a]b'; + actualmatch = string.match(pattern); + expectedmatch = Array('a]b'); + addThis(); +*/ + +status = inSection(36); +pattern = /a[^bc]d/; +string = 'aed'; +actualmatch = string.match(pattern); +expectedmatch = Array('aed'); +addThis(); + +status = inSection(37); +pattern = /a[^-b]c/; +string = 'adc'; +actualmatch = string.match(pattern); +expectedmatch = Array('adc'); +addThis(); + +/* Perl supports ] & ^] inside a [], ECMA does not + status = inSection(38); + pattern = /a[^]b]c/; + string = 'adc'; + actualmatch = string.match(pattern); + expectedmatch = Array('adc'); + addThis(); +*/ + +status = inSection(39); +pattern = /\ba\b/; +string = 'a-'; +actualmatch = string.match(pattern); +expectedmatch = Array('a'); +addThis(); + +status = inSection(40); +pattern = /\ba\b/; +string = '-a'; +actualmatch = string.match(pattern); +expectedmatch = Array('a'); +addThis(); + +status = inSection(41); +pattern = /\ba\b/; +string = '-a-'; +actualmatch = string.match(pattern); +expectedmatch = Array('a'); +addThis(); + +status = inSection(42); +pattern = /\By\b/; +string = 'xy'; +actualmatch = string.match(pattern); +expectedmatch = Array('y'); +addThis(); + +status = inSection(43); +pattern = /\by\B/; +string = 'yz'; +actualmatch = string.match(pattern); +expectedmatch = Array('y'); +addThis(); + +status = inSection(44); +pattern = /\By\B/; +string = 'xyz'; +actualmatch = string.match(pattern); +expectedmatch = Array('y'); +addThis(); + +status = inSection(45); +pattern = /\w/; +string = 'a'; +actualmatch = string.match(pattern); +expectedmatch = Array('a'); +addThis(); + +status = inSection(46); +pattern = /\W/; +string = '-'; +actualmatch = string.match(pattern); +expectedmatch = Array('-'); +addThis(); + +status = inSection(47); +pattern = /a\Sb/; +string = 'a-b'; +actualmatch = string.match(pattern); +expectedmatch = Array('a-b'); +addThis(); + +status = inSection(48); +pattern = /\d/; +string = '1'; +actualmatch = string.match(pattern); +expectedmatch = Array('1'); +addThis(); + +status = inSection(49); +pattern = /\D/; +string = '-'; +actualmatch = string.match(pattern); +expectedmatch = Array('-'); +addThis(); + +status = inSection(50); +pattern = /[\w]/; +string = 'a'; +actualmatch = string.match(pattern); +expectedmatch = Array('a'); +addThis(); + +status = inSection(51); +pattern = /[\W]/; +string = '-'; +actualmatch = string.match(pattern); +expectedmatch = Array('-'); +addThis(); + +status = inSection(52); +pattern = /a[\S]b/; +string = 'a-b'; +actualmatch = string.match(pattern); +expectedmatch = Array('a-b'); +addThis(); + +status = inSection(53); +pattern = /[\d]/; +string = '1'; +actualmatch = string.match(pattern); +expectedmatch = Array('1'); +addThis(); + +status = inSection(54); +pattern = /[\D]/; +string = '-'; +actualmatch = string.match(pattern); +expectedmatch = Array('-'); +addThis(); + +status = inSection(55); +pattern = /ab|cd/; +string = 'abc'; +actualmatch = string.match(pattern); +expectedmatch = Array('ab'); +addThis(); + +status = inSection(56); +pattern = /ab|cd/; +string = 'abcd'; +actualmatch = string.match(pattern); +expectedmatch = Array('ab'); +addThis(); + +status = inSection(57); +pattern = /()ef/; +string = 'def'; +actualmatch = string.match(pattern); +expectedmatch = Array('ef', ''); +addThis(); + +status = inSection(58); +pattern = /a\(b/; +string = 'a(b'; +actualmatch = string.match(pattern); +expectedmatch = Array('a(b'); +addThis(); + +status = inSection(59); +pattern = /a\(*b/; +string = 'ab'; +actualmatch = string.match(pattern); +expectedmatch = Array('ab'); +addThis(); + +status = inSection(60); +pattern = /a\(*b/; +string = 'a((b'; +actualmatch = string.match(pattern); +expectedmatch = Array('a((b'); +addThis(); + +status = inSection(61); +pattern = /a\\b/; +string = 'a\\b'; +actualmatch = string.match(pattern); +expectedmatch = Array('a\\b'); +addThis(); + +status = inSection(62); +pattern = /((a))/; +string = 'abc'; +actualmatch = string.match(pattern); +expectedmatch = Array('a', 'a', 'a'); +addThis(); + +status = inSection(63); +pattern = /(a)b(c)/; +string = 'abc'; +actualmatch = string.match(pattern); +expectedmatch = Array('abc', 'a', 'c'); +addThis(); + +status = inSection(64); +pattern = /a+b+c/; +string = 'aabbabc'; +actualmatch = string.match(pattern); +expectedmatch = Array('abc'); +addThis(); + +status = inSection(65); +pattern = /a{1,}b{1,}c/; +string = 'aabbabc'; +actualmatch = string.match(pattern); +expectedmatch = Array('abc'); +addThis(); + +status = inSection(66); +pattern = /a.+?c/; +string = 'abcabc'; +actualmatch = string.match(pattern); +expectedmatch = Array('abc'); +addThis(); + +status = inSection(67); +pattern = /(a+|b)*/; +string = 'ab'; +actualmatch = string.match(pattern); +expectedmatch = Array('ab', 'b'); +addThis(); + +status = inSection(68); +pattern = /(a+|b){0,}/; +string = 'ab'; +actualmatch = string.match(pattern); +expectedmatch = Array('ab', 'b'); +addThis(); + +status = inSection(69); +pattern = /(a+|b)+/; +string = 'ab'; +actualmatch = string.match(pattern); +expectedmatch = Array('ab', 'b'); +addThis(); + +status = inSection(70); +pattern = /(a+|b){1,}/; +string = 'ab'; +actualmatch = string.match(pattern); +expectedmatch = Array('ab', 'b'); +addThis(); + +status = inSection(71); +pattern = /(a+|b)?/; +string = 'ab'; +actualmatch = string.match(pattern); +expectedmatch = Array('a', 'a'); +addThis(); + +status = inSection(72); +pattern = /(a+|b){0,1}/; +string = 'ab'; +actualmatch = string.match(pattern); +expectedmatch = Array('a', 'a'); +addThis(); + +status = inSection(73); +pattern = /[^ab]*/; +string = 'cde'; +actualmatch = string.match(pattern); +expectedmatch = Array('cde'); +addThis(); + +status = inSection(74); +pattern = /([abc])*d/; +string = 'abbbcd'; +actualmatch = string.match(pattern); +expectedmatch = Array('abbbcd', 'c'); +addThis(); + +status = inSection(75); +pattern = /([abc])*bcd/; +string = 'abcd'; +actualmatch = string.match(pattern); +expectedmatch = Array('abcd', 'a'); +addThis(); + +status = inSection(76); +pattern = /a|b|c|d|e/; +string = 'e'; +actualmatch = string.match(pattern); +expectedmatch = Array('e'); +addThis(); + +status = inSection(77); +pattern = /(a|b|c|d|e)f/; +string = 'ef'; +actualmatch = string.match(pattern); +expectedmatch = Array('ef', 'e'); +addThis(); + +status = inSection(78); +pattern = /abcd*efg/; +string = 'abcdefg'; +actualmatch = string.match(pattern); +expectedmatch = Array('abcdefg'); +addThis(); + +status = inSection(79); +pattern = /ab*/; +string = 'xabyabbbz'; +actualmatch = string.match(pattern); +expectedmatch = Array('ab'); +addThis(); + +status = inSection(80); +pattern = /ab*/; +string = 'xayabbbz'; +actualmatch = string.match(pattern); +expectedmatch = Array('a'); +addThis(); + +status = inSection(81); +pattern = /(ab|cd)e/; +string = 'abcde'; +actualmatch = string.match(pattern); +expectedmatch = Array('cde', 'cd'); +addThis(); + +status = inSection(82); +pattern = /[abhgefdc]ij/; +string = 'hij'; +actualmatch = string.match(pattern); +expectedmatch = Array('hij'); +addThis(); + +status = inSection(83); +pattern = /(abc|)ef/; +string = 'abcdef'; +actualmatch = string.match(pattern); +expectedmatch = Array('ef', ''); +addThis(); + +status = inSection(84); +pattern = /(a|b)c*d/; +string = 'abcd'; +actualmatch = string.match(pattern); +expectedmatch = Array('bcd', 'b'); +addThis(); + +status = inSection(85); +pattern = /(ab|ab*)bc/; +string = 'abc'; +actualmatch = string.match(pattern); +expectedmatch = Array('abc', 'a'); +addThis(); + +status = inSection(86); +pattern = /a([bc]*)c*/; +string = 'abc'; +actualmatch = string.match(pattern); +expectedmatch = Array('abc', 'bc'); +addThis(); + +status = inSection(87); +pattern = /a([bc]*)(c*d)/; +string = 'abcd'; +actualmatch = string.match(pattern); +expectedmatch = Array('abcd', 'bc', 'd'); +addThis(); + +status = inSection(88); +pattern = /a([bc]+)(c*d)/; +string = 'abcd'; +actualmatch = string.match(pattern); +expectedmatch = Array('abcd', 'bc', 'd'); +addThis(); + +status = inSection(89); +pattern = /a([bc]*)(c+d)/; +string = 'abcd'; +actualmatch = string.match(pattern); +expectedmatch = Array('abcd', 'b', 'cd'); +addThis(); + +status = inSection(90); +pattern = /a[bcd]*dcdcde/; +string = 'adcdcde'; +actualmatch = string.match(pattern); +expectedmatch = Array('adcdcde'); +addThis(); + +status = inSection(91); +pattern = /(ab|a)b*c/; +string = 'abc'; +actualmatch = string.match(pattern); +expectedmatch = Array('abc', 'ab'); +addThis(); + +status = inSection(92); +pattern = /((a)(b)c)(d)/; +string = 'abcd'; +actualmatch = string.match(pattern); +expectedmatch = Array('abcd', 'abc', 'a', 'b', 'd'); +addThis(); + +status = inSection(93); +pattern = /[a-zA-Z_][a-zA-Z0-9_]*/; +string = 'alpha'; +actualmatch = string.match(pattern); +expectedmatch = Array('alpha'); +addThis(); + +status = inSection(94); +pattern = /^a(bc+|b[eh])g|.h$/; +string = 'abh'; +actualmatch = string.match(pattern); +expectedmatch = Array('bh', undefined); +addThis(); + +status = inSection(95); +pattern = /(bc+d$|ef*g.|h?i(j|k))/; +string = 'effgz'; +actualmatch = string.match(pattern); +expectedmatch = Array('effgz', 'effgz', undefined); +addThis(); + +status = inSection(96); +pattern = /(bc+d$|ef*g.|h?i(j|k))/; +string = 'ij'; +actualmatch = string.match(pattern); +expectedmatch = Array('ij', 'ij', 'j'); +addThis(); + +status = inSection(97); +pattern = /(bc+d$|ef*g.|h?i(j|k))/; +string = 'reffgz'; +actualmatch = string.match(pattern); +expectedmatch = Array('effgz', 'effgz', undefined); +addThis(); + +status = inSection(98); +pattern = /((((((((((a))))))))))/; +string = 'a'; +actualmatch = string.match(pattern); +expectedmatch = Array('a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a'); +addThis(); + +status = inSection(99); +pattern = /((((((((((a))))))))))\10/; +string = 'aa'; +actualmatch = string.match(pattern); +expectedmatch = Array('aa', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a'); +addThis(); + +status = inSection(100); +pattern = /((((((((((a))))))))))/; +string = 'a!'; +actualmatch = string.match(pattern); +expectedmatch = Array('a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a'); +addThis(); + +status = inSection(101); +pattern = /(((((((((a)))))))))/; +string = 'a'; +actualmatch = string.match(pattern); +expectedmatch = Array('a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a'); +addThis(); + +status = inSection(102); +pattern = /(.*)c(.*)/; +string = 'abcde'; +actualmatch = string.match(pattern); +expectedmatch = Array('abcde', 'ab', 'de'); +addThis(); + +status = inSection(103); +pattern = /abcd/; +string = 'abcd'; +actualmatch = string.match(pattern); +expectedmatch = Array('abcd'); +addThis(); + +status = inSection(104); +pattern = /a(bc)d/; +string = 'abcd'; +actualmatch = string.match(pattern); +expectedmatch = Array('abcd', 'bc'); +addThis(); + +status = inSection(105); +pattern = /a[-]?c/; +string = 'ac'; +actualmatch = string.match(pattern); +expectedmatch = Array('ac'); +addThis(); + +status = inSection(106); +pattern = /(abc)\1/; +string = 'abcabc'; +actualmatch = string.match(pattern); +expectedmatch = Array('abcabc', 'abc'); +addThis(); + +status = inSection(107); +pattern = /([a-c]*)\1/; +string = 'abcabc'; +actualmatch = string.match(pattern); +expectedmatch = Array('abcabc', 'abc'); +addThis(); + +status = inSection(108); +pattern = /(a)|\1/; +string = 'a'; +actualmatch = string.match(pattern); +expectedmatch = Array('a', 'a'); +addThis(); + +status = inSection(109); +pattern = /(([a-c])b*?\2)*/; +string = 'ababbbcbc'; +actualmatch = string.match(pattern); +expectedmatch = Array('ababb', 'bb', 'b'); +addThis(); + +status = inSection(110); +pattern = /(([a-c])b*?\2){3}/; +string = 'ababbbcbc'; +actualmatch = string.match(pattern); +expectedmatch = Array('ababbbcbc', 'cbc', 'c'); +addThis(); + +/* Can't refer to a capture before it's encountered & completed + status = inSection(111); + pattern = /((\3|b)\2(a)x)+/; + string = 'aaaxabaxbaaxbbax'; + actualmatch = string.match(pattern); + expectedmatch = Array('bbax', 'bbax', 'b', 'a'); + addThis(); + + status = inSection(112); + pattern = /((\3|b)\2(a)){2,}/; + string = 'bbaababbabaaaaabbaaaabba'; + actualmatch = string.match(pattern); + expectedmatch = Array('bbaaaabba', 'bba', 'b', 'a'); + addThis(); +*/ + +status = inSection(113); +pattern = /abc/i; +string = 'ABC'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABC'); +addThis(); + +status = inSection(114); +pattern = /abc/i; +string = 'XABCY'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABC'); +addThis(); + +status = inSection(115); +pattern = /abc/i; +string = 'ABABC'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABC'); +addThis(); + +status = inSection(116); +pattern = /ab*c/i; +string = 'ABC'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABC'); +addThis(); + +status = inSection(117); +pattern = /ab*bc/i; +string = 'ABC'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABC'); +addThis(); + +status = inSection(118); +pattern = /ab*bc/i; +string = 'ABBC'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABBC'); +addThis(); + +status = inSection(119); +pattern = /ab*?bc/i; +string = 'ABBBBC'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABBBBC'); +addThis(); + +status = inSection(120); +pattern = /ab{0,}?bc/i; +string = 'ABBBBC'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABBBBC'); +addThis(); + +status = inSection(121); +pattern = /ab+?bc/i; +string = 'ABBC'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABBC'); +addThis(); + +status = inSection(122); +pattern = /ab+bc/i; +string = 'ABBBBC'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABBBBC'); +addThis(); + +status = inSection(123); +pattern = /ab{1,}?bc/i; +string = 'ABBBBC'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABBBBC'); +addThis(); + +status = inSection(124); +pattern = /ab{1,3}?bc/i; +string = 'ABBBBC'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABBBBC'); +addThis(); + +status = inSection(125); +pattern = /ab{3,4}?bc/i; +string = 'ABBBBC'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABBBBC'); +addThis(); + +status = inSection(126); +pattern = /ab??bc/i; +string = 'ABBC'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABBC'); +addThis(); + +status = inSection(127); +pattern = /ab??bc/i; +string = 'ABC'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABC'); +addThis(); + +status = inSection(128); +pattern = /ab{0,1}?bc/i; +string = 'ABC'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABC'); +addThis(); + +status = inSection(129); +pattern = /ab??c/i; +string = 'ABC'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABC'); +addThis(); + +status = inSection(130); +pattern = /ab{0,1}?c/i; +string = 'ABC'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABC'); +addThis(); + +status = inSection(131); +pattern = /^abc$/i; +string = 'ABC'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABC'); +addThis(); + +status = inSection(132); +pattern = /^abc/i; +string = 'ABCC'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABC'); +addThis(); + +status = inSection(133); +pattern = /abc$/i; +string = 'AABC'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABC'); +addThis(); + +status = inSection(134); +pattern = /^/i; +string = 'ABC'; +actualmatch = string.match(pattern); +expectedmatch = Array(''); +addThis(); + +status = inSection(135); +pattern = /$/i; +string = 'ABC'; +actualmatch = string.match(pattern); +expectedmatch = Array(''); +addThis(); + +status = inSection(136); +pattern = /a.c/i; +string = 'ABC'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABC'); +addThis(); + +status = inSection(137); +pattern = /a.c/i; +string = 'AXC'; +actualmatch = string.match(pattern); +expectedmatch = Array('AXC'); +addThis(); + +status = inSection(138); +pattern = /a.*?c/i; +string = 'AXYZC'; +actualmatch = string.match(pattern); +expectedmatch = Array('AXYZC'); +addThis(); + +status = inSection(139); +pattern = /a[bc]d/i; +string = 'ABD'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABD'); +addThis(); + +status = inSection(140); +pattern = /a[b-d]e/i; +string = 'ACE'; +actualmatch = string.match(pattern); +expectedmatch = Array('ACE'); +addThis(); + +status = inSection(141); +pattern = /a[b-d]/i; +string = 'AAC'; +actualmatch = string.match(pattern); +expectedmatch = Array('AC'); +addThis(); + +status = inSection(142); +pattern = /a[-b]/i; +string = 'A-'; +actualmatch = string.match(pattern); +expectedmatch = Array('A-'); +addThis(); + +status = inSection(143); +pattern = /a[b-]/i; +string = 'A-'; +actualmatch = string.match(pattern); +expectedmatch = Array('A-'); +addThis(); + +status = inSection(144); +pattern = /a]/i; +string = 'A]'; +actualmatch = string.match(pattern); +expectedmatch = Array('A]'); +addThis(); + +/* Perl supports ] & ^] inside a [], ECMA does not + status = inSection(145); + pattern = /a[]]b/i; + string = 'A]B'; + actualmatch = string.match(pattern); + expectedmatch = Array('A]B'); + addThis(); +*/ + +status = inSection(146); +pattern = /a[^bc]d/i; +string = 'AED'; +actualmatch = string.match(pattern); +expectedmatch = Array('AED'); +addThis(); + +status = inSection(147); +pattern = /a[^-b]c/i; +string = 'ADC'; +actualmatch = string.match(pattern); +expectedmatch = Array('ADC'); +addThis(); + +/* Perl supports ] & ^] inside a [], ECMA does not + status = inSection(148); + pattern = /a[^]b]c/i; + string = 'ADC'; + actualmatch = string.match(pattern); + expectedmatch = Array('ADC'); + addThis(); +*/ + +status = inSection(149); +pattern = /ab|cd/i; +string = 'ABC'; +actualmatch = string.match(pattern); +expectedmatch = Array('AB'); +addThis(); + +status = inSection(150); +pattern = /ab|cd/i; +string = 'ABCD'; +actualmatch = string.match(pattern); +expectedmatch = Array('AB'); +addThis(); + +status = inSection(151); +pattern = /()ef/i; +string = 'DEF'; +actualmatch = string.match(pattern); +expectedmatch = Array('EF', ''); +addThis(); + +status = inSection(152); +pattern = /a\(b/i; +string = 'A(B'; +actualmatch = string.match(pattern); +expectedmatch = Array('A(B'); +addThis(); + +status = inSection(153); +pattern = /a\(*b/i; +string = 'AB'; +actualmatch = string.match(pattern); +expectedmatch = Array('AB'); +addThis(); + +status = inSection(154); +pattern = /a\(*b/i; +string = 'A((B'; +actualmatch = string.match(pattern); +expectedmatch = Array('A((B'); +addThis(); + +status = inSection(155); +pattern = /a\\b/i; +string = 'A\\B'; +actualmatch = string.match(pattern); +expectedmatch = Array('A\\B'); +addThis(); + +status = inSection(156); +pattern = /((a))/i; +string = 'ABC'; +actualmatch = string.match(pattern); +expectedmatch = Array('A', 'A', 'A'); +addThis(); + +status = inSection(157); +pattern = /(a)b(c)/i; +string = 'ABC'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABC', 'A', 'C'); +addThis(); + +status = inSection(158); +pattern = /a+b+c/i; +string = 'AABBABC'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABC'); +addThis(); + +status = inSection(159); +pattern = /a{1,}b{1,}c/i; +string = 'AABBABC'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABC'); +addThis(); + +status = inSection(160); +pattern = /a.+?c/i; +string = 'ABCABC'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABC'); +addThis(); + +status = inSection(161); +pattern = /a.*?c/i; +string = 'ABCABC'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABC'); +addThis(); + +status = inSection(162); +pattern = /a.{0,5}?c/i; +string = 'ABCABC'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABC'); +addThis(); + +status = inSection(163); +pattern = /(a+|b)*/i; +string = 'AB'; +actualmatch = string.match(pattern); +expectedmatch = Array('AB', 'B'); +addThis(); + +status = inSection(164); +pattern = /(a+|b){0,}/i; +string = 'AB'; +actualmatch = string.match(pattern); +expectedmatch = Array('AB', 'B'); +addThis(); + +status = inSection(165); +pattern = /(a+|b)+/i; +string = 'AB'; +actualmatch = string.match(pattern); +expectedmatch = Array('AB', 'B'); +addThis(); + +status = inSection(166); +pattern = /(a+|b){1,}/i; +string = 'AB'; +actualmatch = string.match(pattern); +expectedmatch = Array('AB', 'B'); +addThis(); + +status = inSection(167); +pattern = /(a+|b)?/i; +string = 'AB'; +actualmatch = string.match(pattern); +expectedmatch = Array('A', 'A'); +addThis(); + +status = inSection(168); +pattern = /(a+|b){0,1}/i; +string = 'AB'; +actualmatch = string.match(pattern); +expectedmatch = Array('A', 'A'); +addThis(); + +status = inSection(169); +pattern = /(a+|b){0,1}?/i; +string = 'AB'; +actualmatch = string.match(pattern); +expectedmatch = Array('', undefined); +addThis(); + +status = inSection(170); +pattern = /[^ab]*/i; +string = 'CDE'; +actualmatch = string.match(pattern); +expectedmatch = Array('CDE'); +addThis(); + +status = inSection(171); +pattern = /([abc])*d/i; +string = 'ABBBCD'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABBBCD', 'C'); +addThis(); + +status = inSection(172); +pattern = /([abc])*bcd/i; +string = 'ABCD'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABCD', 'A'); +addThis(); + +status = inSection(173); +pattern = /a|b|c|d|e/i; +string = 'E'; +actualmatch = string.match(pattern); +expectedmatch = Array('E'); +addThis(); + +status = inSection(174); +pattern = /(a|b|c|d|e)f/i; +string = 'EF'; +actualmatch = string.match(pattern); +expectedmatch = Array('EF', 'E'); +addThis(); + +status = inSection(175); +pattern = /abcd*efg/i; +string = 'ABCDEFG'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABCDEFG'); +addThis(); + +status = inSection(176); +pattern = /ab*/i; +string = 'XABYABBBZ'; +actualmatch = string.match(pattern); +expectedmatch = Array('AB'); +addThis(); + +status = inSection(177); +pattern = /ab*/i; +string = 'XAYABBBZ'; +actualmatch = string.match(pattern); +expectedmatch = Array('A'); +addThis(); + +status = inSection(178); +pattern = /(ab|cd)e/i; +string = 'ABCDE'; +actualmatch = string.match(pattern); +expectedmatch = Array('CDE', 'CD'); +addThis(); + +status = inSection(179); +pattern = /[abhgefdc]ij/i; +string = 'HIJ'; +actualmatch = string.match(pattern); +expectedmatch = Array('HIJ'); +addThis(); + +status = inSection(180); +pattern = /(abc|)ef/i; +string = 'ABCDEF'; +actualmatch = string.match(pattern); +expectedmatch = Array('EF', ''); +addThis(); + +status = inSection(181); +pattern = /(a|b)c*d/i; +string = 'ABCD'; +actualmatch = string.match(pattern); +expectedmatch = Array('BCD', 'B'); +addThis(); + +status = inSection(182); +pattern = /(ab|ab*)bc/i; +string = 'ABC'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABC', 'A'); +addThis(); + +status = inSection(183); +pattern = /a([bc]*)c*/i; +string = 'ABC'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABC', 'BC'); +addThis(); + +status = inSection(184); +pattern = /a([bc]*)(c*d)/i; +string = 'ABCD'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABCD', 'BC', 'D'); +addThis(); + +status = inSection(185); +pattern = /a([bc]+)(c*d)/i; +string = 'ABCD'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABCD', 'BC', 'D'); +addThis(); + +status = inSection(186); +pattern = /a([bc]*)(c+d)/i; +string = 'ABCD'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABCD', 'B', 'CD'); +addThis(); + +status = inSection(187); +pattern = /a[bcd]*dcdcde/i; +string = 'ADCDCDE'; +actualmatch = string.match(pattern); +expectedmatch = Array('ADCDCDE'); +addThis(); + +status = inSection(188); +pattern = /(ab|a)b*c/i; +string = 'ABC'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABC', 'AB'); +addThis(); + +status = inSection(189); +pattern = /((a)(b)c)(d)/i; +string = 'ABCD'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABCD', 'ABC', 'A', 'B', 'D'); +addThis(); + +status = inSection(190); +pattern = /[a-zA-Z_][a-zA-Z0-9_]*/i; +string = 'ALPHA'; +actualmatch = string.match(pattern); +expectedmatch = Array('ALPHA'); +addThis(); + +status = inSection(191); +pattern = /^a(bc+|b[eh])g|.h$/i; +string = 'ABH'; +actualmatch = string.match(pattern); +expectedmatch = Array('BH', undefined); +addThis(); + +status = inSection(192); +pattern = /(bc+d$|ef*g.|h?i(j|k))/i; +string = 'EFFGZ'; +actualmatch = string.match(pattern); +expectedmatch = Array('EFFGZ', 'EFFGZ', undefined); +addThis(); + +status = inSection(193); +pattern = /(bc+d$|ef*g.|h?i(j|k))/i; +string = 'IJ'; +actualmatch = string.match(pattern); +expectedmatch = Array('IJ', 'IJ', 'J'); +addThis(); + +status = inSection(194); +pattern = /(bc+d$|ef*g.|h?i(j|k))/i; +string = 'REFFGZ'; +actualmatch = string.match(pattern); +expectedmatch = Array('EFFGZ', 'EFFGZ', undefined); +addThis(); + +status = inSection(195); +pattern = /((((((((((a))))))))))/i; +string = 'A'; +actualmatch = string.match(pattern); +expectedmatch = Array('A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A'); +addThis(); + +status = inSection(196); +pattern = /((((((((((a))))))))))\10/i; +string = 'AA'; +actualmatch = string.match(pattern); +expectedmatch = Array('AA', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A'); +addThis(); + +status = inSection(197); +pattern = /((((((((((a))))))))))/i; +string = 'A!'; +actualmatch = string.match(pattern); +expectedmatch = Array('A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A'); +addThis(); + +status = inSection(198); +pattern = /(((((((((a)))))))))/i; +string = 'A'; +actualmatch = string.match(pattern); +expectedmatch = Array('A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A'); +addThis(); + +status = inSection(199); +pattern = /(?:(?:(?:(?:(?:(?:(?:(?:(?:(a))))))))))/i; +string = 'A'; +actualmatch = string.match(pattern); +expectedmatch = Array('A', 'A'); +addThis(); + +status = inSection(200); +pattern = /(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))/i; +string = 'C'; +actualmatch = string.match(pattern); +expectedmatch = Array('C', 'C'); +addThis(); + +status = inSection(201); +pattern = /(.*)c(.*)/i; +string = 'ABCDE'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABCDE', 'AB', 'DE'); +addThis(); + +status = inSection(202); +pattern = /abcd/i; +string = 'ABCD'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABCD'); +addThis(); + +status = inSection(203); +pattern = /a(bc)d/i; +string = 'ABCD'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABCD', 'BC'); +addThis(); + +status = inSection(204); +pattern = /a[-]?c/i; +string = 'AC'; +actualmatch = string.match(pattern); +expectedmatch = Array('AC'); +addThis(); + +status = inSection(205); +pattern = /(abc)\1/i; +string = 'ABCABC'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABCABC', 'ABC'); +addThis(); + +status = inSection(206); +pattern = /([a-c]*)\1/i; +string = 'ABCABC'; +actualmatch = string.match(pattern); +expectedmatch = Array('ABCABC', 'ABC'); +addThis(); + +status = inSection(207); +pattern = /a(?!b)./; +string = 'abad'; +actualmatch = string.match(pattern); +expectedmatch = Array('ad'); +addThis(); + +status = inSection(208); +pattern = /a(?=d)./; +string = 'abad'; +actualmatch = string.match(pattern); +expectedmatch = Array('ad'); +addThis(); + +status = inSection(209); +pattern = /a(?=c|d)./; +string = 'abad'; +actualmatch = string.match(pattern); +expectedmatch = Array('ad'); +addThis(); + +status = inSection(210); +pattern = /a(?:b|c|d)(.)/; +string = 'ace'; +actualmatch = string.match(pattern); +expectedmatch = Array('ace', 'e'); +addThis(); + +status = inSection(211); +pattern = /a(?:b|c|d)*(.)/; +string = 'ace'; +actualmatch = string.match(pattern); +expectedmatch = Array('ace', 'e'); +addThis(); + +status = inSection(212); +pattern = /a(?:b|c|d)+?(.)/; +string = 'ace'; +actualmatch = string.match(pattern); +expectedmatch = Array('ace', 'e'); +addThis(); + +status = inSection(213); +pattern = /a(?:b|c|d)+?(.)/; +string = 'acdbcdbe'; +actualmatch = string.match(pattern); +expectedmatch = Array('acd', 'd'); +addThis(); + +status = inSection(214); +pattern = /a(?:b|c|d)+(.)/; +string = 'acdbcdbe'; +actualmatch = string.match(pattern); +expectedmatch = Array('acdbcdbe', 'e'); +addThis(); + +status = inSection(215); +pattern = /a(?:b|c|d){2}(.)/; +string = 'acdbcdbe'; +actualmatch = string.match(pattern); +expectedmatch = Array('acdb', 'b'); +addThis(); + +status = inSection(216); +pattern = /a(?:b|c|d){4,5}(.)/; +string = 'acdbcdbe'; +actualmatch = string.match(pattern); +expectedmatch = Array('acdbcdb', 'b'); +addThis(); + +status = inSection(217); +pattern = /a(?:b|c|d){4,5}?(.)/; +string = 'acdbcdbe'; +actualmatch = string.match(pattern); +expectedmatch = Array('acdbcd', 'd'); +addThis(); + +// MODIFIED - ECMA has different rules for paren contents +status = inSection(218); +pattern = /((foo)|(bar))*/; +string = 'foobar'; +actualmatch = string.match(pattern); +//expectedmatch = Array('foobar', 'bar', 'foo', 'bar'); +expectedmatch = Array('foobar', 'bar', undefined, 'bar'); +addThis(); + +status = inSection(219); +pattern = /a(?:b|c|d){6,7}(.)/; +string = 'acdbcdbe'; +actualmatch = string.match(pattern); +expectedmatch = Array('acdbcdbe', 'e'); +addThis(); + +status = inSection(220); +pattern = /a(?:b|c|d){6,7}?(.)/; +string = 'acdbcdbe'; +actualmatch = string.match(pattern); +expectedmatch = Array('acdbcdbe', 'e'); +addThis(); + +status = inSection(221); +pattern = /a(?:b|c|d){5,6}(.)/; +string = 'acdbcdbe'; +actualmatch = string.match(pattern); +expectedmatch = Array('acdbcdbe', 'e'); +addThis(); + +status = inSection(222); +pattern = /a(?:b|c|d){5,6}?(.)/; +string = 'acdbcdbe'; +actualmatch = string.match(pattern); +expectedmatch = Array('acdbcdb', 'b'); +addThis(); + +status = inSection(223); +pattern = /a(?:b|c|d){5,7}(.)/; +string = 'acdbcdbe'; +actualmatch = string.match(pattern); +expectedmatch = Array('acdbcdbe', 'e'); +addThis(); + +status = inSection(224); +pattern = /a(?:b|c|d){5,7}?(.)/; +string = 'acdbcdbe'; +actualmatch = string.match(pattern); +expectedmatch = Array('acdbcdb', 'b'); +addThis(); + +status = inSection(225); +pattern = /a(?:b|(c|e){1,2}?|d)+?(.)/; +string = 'ace'; +actualmatch = string.match(pattern); +expectedmatch = Array('ace', 'c', 'e'); +addThis(); + +status = inSection(226); +pattern = /^(.+)?B/; +string = 'AB'; +actualmatch = string.match(pattern); +expectedmatch = Array('AB', 'A'); +addThis(); + +/* MODIFIED - ECMA has different rules for paren contents */ +status = inSection(227); +pattern = /^([^a-z])|(\^)$/; +string = '.'; +actualmatch = string.match(pattern); +//expectedmatch = Array('.', '.', ''); +expectedmatch = Array('.', '.', undefined); +addThis(); + +status = inSection(228); +pattern = /^[<>]&/; +string = '<&OUT'; +actualmatch = string.match(pattern); +expectedmatch = Array('<&'); +addThis(); + +/* Can't refer to a capture before it's encountered & completed + status = inSection(229); + pattern = /^(a\1?){4}$/; + string = 'aaaaaaaaaa'; + actualmatch = string.match(pattern); + expectedmatch = Array('aaaaaaaaaa', 'aaaa'); + addThis(); + + status = inSection(230); + pattern = /^(a(?(1)\1)){4}$/; + string = 'aaaaaaaaaa'; + actualmatch = string.match(pattern); + expectedmatch = Array('aaaaaaaaaa', 'aaaa'); + addThis(); +*/ + +status = inSection(231); +pattern = /((a{4})+)/; +string = 'aaaaaaaaa'; +actualmatch = string.match(pattern); +expectedmatch = Array('aaaaaaaa', 'aaaaaaaa', 'aaaa'); +addThis(); + +status = inSection(232); +pattern = /(((aa){2})+)/; +string = 'aaaaaaaaaa'; +actualmatch = string.match(pattern); +expectedmatch = Array('aaaaaaaa', 'aaaaaaaa', 'aaaa', 'aa'); +addThis(); + +status = inSection(233); +pattern = /(((a{2}){2})+)/; +string = 'aaaaaaaaaa'; +actualmatch = string.match(pattern); +expectedmatch = Array('aaaaaaaa', 'aaaaaaaa', 'aaaa', 'aa'); +addThis(); + +status = inSection(234); +pattern = /(?:(f)(o)(o)|(b)(a)(r))*/; +string = 'foobar'; +actualmatch = string.match(pattern); +//expectedmatch = Array('foobar', 'f', 'o', 'o', 'b', 'a', 'r'); +expectedmatch = Array('foobar', undefined, undefined, undefined, 'b', 'a', 'r'); +addThis(); + +/* ECMA supports (?: (?= and (?! but doesn't support (?< etc. + status = inSection(235); + pattern = /(?<=a)b/; + string = 'ab'; + actualmatch = string.match(pattern); + expectedmatch = Array('b'); + addThis(); + + status = inSection(236); + pattern = /(?<!c)b/; + string = 'ab'; + actualmatch = string.match(pattern); + expectedmatch = Array('b'); + addThis(); + + status = inSection(237); + pattern = /(?<!c)b/; + string = 'b'; + actualmatch = string.match(pattern); + expectedmatch = Array('b'); + addThis(); + + status = inSection(238); + pattern = /(?<!c)b/; + string = 'b'; + actualmatch = string.match(pattern); + expectedmatch = Array('b'); + addThis(); +*/ + +status = inSection(239); +pattern = /(?:..)*a/; +string = 'aba'; +actualmatch = string.match(pattern); +expectedmatch = Array('aba'); +addThis(); + +status = inSection(240); +pattern = /(?:..)*?a/; +string = 'aba'; +actualmatch = string.match(pattern); +expectedmatch = Array('a'); +addThis(); + +/* + * MODIFIED - ECMA has different rules for paren contents. Note + * this regexp has two non-capturing parens, and one capturing + * + * The issue: shouldn't the match be ['ab', undefined]? Because the + * '\1' matches the undefined value of the second iteration of the '*' + * (in which the 'b' part of the '|' matches). But Perl wants ['ab','b']. + * + * Answer: waldemar@netscape.com: + * + * The correct answer is ['ab', undefined]. Perl doesn't match + * ECMAScript here, and I'd say that Perl is wrong in this case. + */ +status = inSection(241); +pattern = /^(?:b|a(?=(.)))*\1/; +string = 'abc'; +actualmatch = string.match(pattern); +//expectedmatch = Array('ab', 'b'); +expectedmatch = Array('ab', undefined); +addThis(); + +status = inSection(242); +pattern = /^(){3,5}/; +string = 'abc'; +actualmatch = string.match(pattern); +expectedmatch = Array('', ''); +addThis(); + +status = inSection(243); +pattern = /^(a+)*ax/; +string = 'aax'; +actualmatch = string.match(pattern); +expectedmatch = Array('aax', 'a'); +addThis(); + +status = inSection(244); +pattern = /^((a|b)+)*ax/; +string = 'aax'; +actualmatch = string.match(pattern); +expectedmatch = Array('aax', 'a', 'a'); +addThis(); + +status = inSection(245); +pattern = /^((a|bc)+)*ax/; +string = 'aax'; +actualmatch = string.match(pattern); +expectedmatch = Array('aax', 'a', 'a'); +addThis(); + +/* MODIFIED - ECMA has different rules for paren contents */ +status = inSection(246); +pattern = /(a|x)*ab/; +string = 'cab'; +actualmatch = string.match(pattern); +//expectedmatch = Array('ab', ''); +expectedmatch = Array('ab', undefined); +addThis(); + +status = inSection(247); +pattern = /(a)*ab/; +string = 'cab'; +actualmatch = string.match(pattern); +expectedmatch = Array('ab', undefined); +addThis(); + +/* ECMA doesn't support (?imsx or (?-imsx + status = inSection(248); + pattern = /(?:(?i)a)b/; + string = 'ab'; + actualmatch = string.match(pattern); + expectedmatch = Array('ab'); + addThis(); + + status = inSection(249); + pattern = /((?i)a)b/; + string = 'ab'; + actualmatch = string.match(pattern); + expectedmatch = Array('ab', 'a'); + addThis(); + + status = inSection(250); + pattern = /(?:(?i)a)b/; + string = 'Ab'; + actualmatch = string.match(pattern); + expectedmatch = Array('Ab'); + addThis(); + + status = inSection(251); + pattern = /((?i)a)b/; + string = 'Ab'; + actualmatch = string.match(pattern); + expectedmatch = Array('Ab', 'A'); + addThis(); + + status = inSection(252); + pattern = /(?i:a)b/; + string = 'ab'; + actualmatch = string.match(pattern); + expectedmatch = Array('ab'); + addThis(); + + status = inSection(253); + pattern = /((?i:a))b/; + string = 'ab'; + actualmatch = string.match(pattern); + expectedmatch = Array('ab', 'a'); + addThis(); + + status = inSection(254); + pattern = /(?i:a)b/; + string = 'Ab'; + actualmatch = string.match(pattern); + expectedmatch = Array('Ab'); + addThis(); + + status = inSection(255); + pattern = /((?i:a))b/; + string = 'Ab'; + actualmatch = string.match(pattern); + expectedmatch = Array('Ab', 'A'); + addThis(); + + status = inSection(256); + pattern = /(?:(?-i)a)b/i; + string = 'ab'; + actualmatch = string.match(pattern); + expectedmatch = Array('ab'); + addThis(); + + status = inSection(257); + pattern = /((?-i)a)b/i; + string = 'ab'; + actualmatch = string.match(pattern); + expectedmatch = Array('ab', 'a'); + addThis(); + + status = inSection(258); + pattern = /(?:(?-i)a)b/i; + string = 'aB'; + actualmatch = string.match(pattern); + expectedmatch = Array('aB'); + addThis(); + + status = inSection(259); + pattern = /((?-i)a)b/i; + string = 'aB'; + actualmatch = string.match(pattern); + expectedmatch = Array('aB', 'a'); + addThis(); + + status = inSection(260); + pattern = /(?:(?-i)a)b/i; + string = 'aB'; + actualmatch = string.match(pattern); + expectedmatch = Array('aB'); + addThis(); + + status = inSection(261); + pattern = /((?-i)a)b/i; + string = 'aB'; + actualmatch = string.match(pattern); + expectedmatch = Array('aB', 'a'); + addThis(); + + status = inSection(262); + pattern = /(?-i:a)b/i; + string = 'ab'; + actualmatch = string.match(pattern); + expectedmatch = Array('ab'); + addThis(); + + status = inSection(263); + pattern = /((?-i:a))b/i; + string = 'ab'; + actualmatch = string.match(pattern); + expectedmatch = Array('ab', 'a'); + addThis(); + + status = inSection(264); + pattern = /(?-i:a)b/i; + string = 'aB'; + actualmatch = string.match(pattern); + expectedmatch = Array('aB'); + addThis(); + + status = inSection(265); + pattern = /((?-i:a))b/i; + string = 'aB'; + actualmatch = string.match(pattern); + expectedmatch = Array('aB', 'a'); + addThis(); + + status = inSection(266); + pattern = /(?-i:a)b/i; + string = 'aB'; + actualmatch = string.match(pattern); + expectedmatch = Array('aB'); + addThis(); + + status = inSection(267); + pattern = /((?-i:a))b/i; + string = 'aB'; + actualmatch = string.match(pattern); + expectedmatch = Array('aB', 'a'); + addThis(); + + status = inSection(268); + pattern = /((?s-i:a.))b/i; + string = 'a\nB'; + actualmatch = string.match(pattern); + expectedmatch = Array('a\nB', 'a\n'); + addThis(); +*/ + +status = inSection(269); +pattern = /(?:c|d)(?:)(?:a(?:)(?:b)(?:b(?:))(?:b(?:)(?:b)))/; +string = 'cabbbb'; +actualmatch = string.match(pattern); +expectedmatch = Array('cabbbb'); +addThis(); + +status = inSection(270); +pattern = /(?:c|d)(?:)(?:aaaaaaaa(?:)(?:bbbbbbbb)(?:bbbbbbbb(?:))(?:bbbbbbbb(?:)(?:bbbbbbbb)))/; +string = 'caaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'; +actualmatch = string.match(pattern); +expectedmatch = Array('caaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'); +addThis(); + +status = inSection(271); +pattern = /(ab)\d\1/i; +string = 'Ab4ab'; +actualmatch = string.match(pattern); +expectedmatch = Array('Ab4ab', 'Ab'); +addThis(); + +status = inSection(272); +pattern = /(ab)\d\1/i; +string = 'ab4Ab'; +actualmatch = string.match(pattern); +expectedmatch = Array('ab4Ab', 'ab'); +addThis(); + +status = inSection(273); +pattern = /foo\w*\d{4}baz/; +string = 'foobar1234baz'; +actualmatch = string.match(pattern); +expectedmatch = Array('foobar1234baz'); +addThis(); + +status = inSection(274); +pattern = /x(~~)*(?:(?:F)?)?/; +string = 'x~~'; +actualmatch = string.match(pattern); +expectedmatch = Array('x~~', '~~'); +addThis(); + +/* Perl supports (?# but JS doesn't + status = inSection(275); + pattern = /^a(?#xxx){3}c/; + string = 'aaac'; + actualmatch = string.match(pattern); + expectedmatch = Array('aaac'); + addThis(); +*/ + +/* ECMA doesn't support (?< etc + status = inSection(276); + pattern = /(?<![cd])[ab]/; + string = 'dbaacb'; + actualmatch = string.match(pattern); + expectedmatch = Array('a'); + addThis(); + + status = inSection(277); + pattern = /(?<!(c|d))[ab]/; + string = 'dbaacb'; + actualmatch = string.match(pattern); + expectedmatch = Array('a'); + addThis(); + + status = inSection(278); + pattern = /(?<!cd)[ab]/; + string = 'cdaccb'; + actualmatch = string.match(pattern); + expectedmatch = Array('b'); + addThis(); + + status = inSection(279); + pattern = /((?s)^a(.))((?m)^b$)/; + string = 'a\nb\nc\n'; + actualmatch = string.match(pattern); + expectedmatch = Array('a\nb', 'a\n', '\n', 'b'); + addThis(); + + status = inSection(280); + pattern = /((?m)^b$)/; + string = 'a\nb\nc\n'; + actualmatch = string.match(pattern); + expectedmatch = Array('b', 'b'); + addThis(); + + status = inSection(281); + pattern = /(?m)^b/; + string = 'a\nb\n'; + actualmatch = string.match(pattern); + expectedmatch = Array('b'); + addThis(); + + status = inSection(282); + pattern = /(?m)^(b)/; + string = 'a\nb\n'; + actualmatch = string.match(pattern); + expectedmatch = Array('b', 'b'); + addThis(); + + status = inSection(283); + pattern = /((?m)^b)/; + string = 'a\nb\n'; + actualmatch = string.match(pattern); + expectedmatch = Array('b', 'b'); + addThis(); + + status = inSection(284); + pattern = /\n((?m)^b)/; + string = 'a\nb\n'; + actualmatch = string.match(pattern); + expectedmatch = Array('\nb', 'b'); + addThis(); + + status = inSection(285); + pattern = /((?s).)c(?!.)/; + string = 'a\nb\nc\n'; + actualmatch = string.match(pattern); + expectedmatch = Array('\nc', '\n'); + addThis(); + + status = inSection(286); + pattern = /((?s).)c(?!.)/; + string = 'a\nb\nc\n'; + actualmatch = string.match(pattern); + expectedmatch = Array('\nc', '\n'); + addThis(); + + status = inSection(287); + pattern = /((?s)b.)c(?!.)/; + string = 'a\nb\nc\n'; + actualmatch = string.match(pattern); + expectedmatch = Array('b\nc', 'b\n'); + addThis(); + + status = inSection(288); + pattern = /((?s)b.)c(?!.)/; + string = 'a\nb\nc\n'; + actualmatch = string.match(pattern); + expectedmatch = Array('b\nc', 'b\n'); + addThis(); + + status = inSection(289); + pattern = /((?m)^b)/; + string = 'a\nb\nc\n'; + actualmatch = string.match(pattern); + expectedmatch = Array('b', 'b'); + addThis(); +*/ + +/* ECMA doesn't support (?(condition) + status = inSection(290); + pattern = /(?(1)b|a)/; + string = 'a'; + actualmatch = string.match(pattern); + expectedmatch = Array('a'); + addThis(); + + status = inSection(291); + pattern = /(x)?(?(1)b|a)/; + string = 'a'; + actualmatch = string.match(pattern); + expectedmatch = Array('a'); + addThis(); + + status = inSection(292); + pattern = /()?(?(1)b|a)/; + string = 'a'; + actualmatch = string.match(pattern); + expectedmatch = Array('a'); + addThis(); + + status = inSection(293); + pattern = /()?(?(1)a|b)/; + string = 'a'; + actualmatch = string.match(pattern); + expectedmatch = Array('a'); + addThis(); + + status = inSection(294); + pattern = /^(\()?blah(?(1)(\)))$/; + string = '(blah)'; + actualmatch = string.match(pattern); + expectedmatch = Array('(blah)', '(', ')'); + addThis(); + + status = inSection(295); + pattern = /^(\()?blah(?(1)(\)))$/; + string = 'blah'; + actualmatch = string.match(pattern); + expectedmatch = Array('blah'); + addThis(); + + status = inSection(296); + pattern = /^(\(+)?blah(?(1)(\)))$/; + string = '(blah)'; + actualmatch = string.match(pattern); + expectedmatch = Array('(blah)', '(', ')'); + addThis(); + + status = inSection(297); + pattern = /^(\(+)?blah(?(1)(\)))$/; + string = 'blah'; + actualmatch = string.match(pattern); + expectedmatch = Array('blah'); + addThis(); + + status = inSection(298); + pattern = /(?(?!a)b|a)/; + string = 'a'; + actualmatch = string.match(pattern); + expectedmatch = Array('a'); + addThis(); + + status = inSection(299); + pattern = /(?(?=a)a|b)/; + string = 'a'; + actualmatch = string.match(pattern); + expectedmatch = Array('a'); + addThis(); +*/ + +status = inSection(300); +pattern = /(?=(a+?))(\1ab)/; +string = 'aaab'; +actualmatch = string.match(pattern); +expectedmatch = Array('aab', 'a', 'aab'); +addThis(); + +status = inSection(301); +pattern = /(\w+:)+/; +string = 'one:'; +actualmatch = string.match(pattern); +expectedmatch = Array('one:', 'one:'); +addThis(); + +/* ECMA doesn't support (?< etc + status = inSection(302); + pattern = /$(?<=^(a))/; + string = 'a'; + actualmatch = string.match(pattern); + expectedmatch = Array('', 'a'); + addThis(); +*/ + +status = inSection(303); +pattern = /(?=(a+?))(\1ab)/; +string = 'aaab'; +actualmatch = string.match(pattern); +expectedmatch = Array('aab', 'a', 'aab'); +addThis(); + +/* MODIFIED - ECMA has different rules for paren contents */ +status = inSection(304); +pattern = /([\w:]+::)?(\w+)$/; +string = 'abcd'; +actualmatch = string.match(pattern); +//expectedmatch = Array('abcd', '', 'abcd'); +expectedmatch = Array('abcd', undefined, 'abcd'); +addThis(); + +status = inSection(305); +pattern = /([\w:]+::)?(\w+)$/; +string = 'xy:z:::abcd'; +actualmatch = string.match(pattern); +expectedmatch = Array('xy:z:::abcd', 'xy:z:::', 'abcd'); +addThis(); + +status = inSection(306); +pattern = /^[^bcd]*(c+)/; +string = 'aexycd'; +actualmatch = string.match(pattern); +expectedmatch = Array('aexyc', 'c'); +addThis(); + +status = inSection(307); +pattern = /(a*)b+/; +string = 'caab'; +actualmatch = string.match(pattern); +expectedmatch = Array('aab', 'aa'); +addThis(); + +/* MODIFIED - ECMA has different rules for paren contents */ +status = inSection(308); +pattern = /([\w:]+::)?(\w+)$/; +string = 'abcd'; +actualmatch = string.match(pattern); +//expectedmatch = Array('abcd', '', 'abcd'); +expectedmatch = Array('abcd', undefined, 'abcd'); +addThis(); + +status = inSection(309); +pattern = /([\w:]+::)?(\w+)$/; +string = 'xy:z:::abcd'; +actualmatch = string.match(pattern); +expectedmatch = Array('xy:z:::abcd', 'xy:z:::', 'abcd'); +addThis(); + +status = inSection(310); +pattern = /^[^bcd]*(c+)/; +string = 'aexycd'; +actualmatch = string.match(pattern); +expectedmatch = Array('aexyc', 'c'); +addThis(); + +/* ECMA doesn't support (?> + status = inSection(311); + pattern = /(?>a+)b/; + string = 'aaab'; + actualmatch = string.match(pattern); + expectedmatch = Array('aaab'); + addThis(); +*/ + +status = inSection(312); +pattern = /([[:]+)/; + string = 'a:[b]:'; + actualmatch = string.match(pattern); + expectedmatch = Array(':[', ':['); + addThis(); + + status = inSection(313); + pattern = /([[=]+)/; + string = 'a=[b]='; + actualmatch = string.match(pattern); + expectedmatch = Array('=[', '=['); + addThis(); + + status = inSection(314); + pattern = /([[.]+)/; + string = 'a.[b].'; + actualmatch = string.match(pattern); + expectedmatch = Array('.[', '.['); + addThis(); + +/* ECMA doesn't have rules for [: + status = inSection(315); + pattern = /[a[:]b[:c]/; + string = 'abc'; + actualmatch = string.match(pattern); + expectedmatch = Array('abc'); + addThis(); +*/ + +/* ECMA doesn't support (?> + status = inSection(316); + pattern = /((?>a+)b)/; + string = 'aaab'; + actualmatch = string.match(pattern); + expectedmatch = Array('aaab', 'aaab'); + addThis(); + + status = inSection(317); + pattern = /(?>(a+))b/; + string = 'aaab'; + actualmatch = string.match(pattern); + expectedmatch = Array('aaab', 'aaa'); + addThis(); + + status = inSection(318); + pattern = /((?>[^()]+)|\([^()]*\))+/; + string = '((abc(ade)ufh()()x'; + actualmatch = string.match(pattern); + expectedmatch = Array('abc(ade)ufh()()x', 'x'); + addThis(); +*/ + +/* Perl has \Z has end-of-line, ECMA doesn't + status = inSection(319); + pattern = /\Z/; + string = 'a\nb\n'; + actualmatch = string.match(pattern); + expectedmatch = Array(''); + addThis(); + + status = inSection(320); + pattern = /\z/; + string = 'a\nb\n'; + actualmatch = string.match(pattern); + expectedmatch = Array(''); + addThis(); +*/ + + status = inSection(321); + pattern = /$/; + string = 'a\nb\n'; + actualmatch = string.match(pattern); + expectedmatch = Array(''); + addThis(); + +/* Perl has \Z has end-of-line, ECMA doesn't + status = inSection(322); + pattern = /\Z/; + string = 'b\na\n'; + actualmatch = string.match(pattern); + expectedmatch = Array(''); + addThis(); + + status = inSection(323); + pattern = /\z/; + string = 'b\na\n'; + actualmatch = string.match(pattern); + expectedmatch = Array(''); + addThis(); +*/ + + status = inSection(324); + pattern = /$/; + string = 'b\na\n'; + actualmatch = string.match(pattern); + expectedmatch = Array(''); + addThis(); + +/* Perl has \Z has end-of-line, ECMA doesn't + status = inSection(325); + pattern = /\Z/; + string = 'b\na'; + actualmatch = string.match(pattern); + expectedmatch = Array(''); + addThis(); + + status = inSection(326); + pattern = /\z/; + string = 'b\na'; + actualmatch = string.match(pattern); + expectedmatch = Array(''); + addThis(); +*/ + + status = inSection(327); + pattern = /$/; + string = 'b\na'; + actualmatch = string.match(pattern); + expectedmatch = Array(''); + addThis(); + +/* Perl has \Z has end-of-line, ECMA doesn't + status = inSection(328); + pattern = /\Z/m; + string = 'a\nb\n'; + actualmatch = string.match(pattern); + expectedmatch = Array(''); + addThis(); + + status = inSection(329); + pattern = /\z/m; + string = 'a\nb\n'; + actualmatch = string.match(pattern); + expectedmatch = Array(''); + addThis(); +*/ + + status = inSection(330); + pattern = /$/m; + string = 'a\nb\n'; + actualmatch = string.match(pattern); + expectedmatch = Array(''); + addThis(); + +/* Perl has \Z has end-of-line, ECMA doesn't + status = inSection(331); + pattern = /\Z/m; + string = 'b\na\n'; + actualmatch = string.match(pattern); + expectedmatch = Array(''); + addThis(); + + status = inSection(332); + pattern = /\z/m; + string = 'b\na\n'; + actualmatch = string.match(pattern); + expectedmatch = Array(''); + addThis(); +*/ + + status = inSection(333); + pattern = /$/m; + string = 'b\na\n'; + actualmatch = string.match(pattern); + expectedmatch = Array(''); + addThis(); + +/* Perl has \Z has end-of-line, ECMA doesn't + status = inSection(334); + pattern = /\Z/m; + string = 'b\na'; + actualmatch = string.match(pattern); + expectedmatch = Array(''); + addThis(); + + status = inSection(335); + pattern = /\z/m; + string = 'b\na'; + actualmatch = string.match(pattern); + expectedmatch = Array(''); + addThis(); +*/ + + status = inSection(336); + pattern = /$/m; + string = 'b\na'; + actualmatch = string.match(pattern); + expectedmatch = Array(''); + addThis(); + +/* Perl has \Z has end-of-line, ECMA doesn't + status = inSection(337); + pattern = /a\Z/; + string = 'b\na\n'; + actualmatch = string.match(pattern); + expectedmatch = Array('a'); + addThis(); +*/ + +/* $ only matches end of input unless multiline + status = inSection(338); + pattern = /a$/; + string = 'b\na\n'; + actualmatch = string.match(pattern); + expectedmatch = Array('a'); + addThis(); +*/ + +/* Perl has \Z has end-of-line, ECMA doesn't + status = inSection(339); + pattern = /a\Z/; + string = 'b\na'; + actualmatch = string.match(pattern); + expectedmatch = Array('a'); + addThis(); + + status = inSection(340); + pattern = /a\z/; + string = 'b\na'; + actualmatch = string.match(pattern); + expectedmatch = Array('a'); + addThis(); +*/ + + status = inSection(341); + pattern = /a$/; + string = 'b\na'; + actualmatch = string.match(pattern); + expectedmatch = Array('a'); + addThis(); + + status = inSection(342); + pattern = /a$/m; + string = 'a\nb\n'; + actualmatch = string.match(pattern); + expectedmatch = Array('a'); + addThis(); + +/* Perl has \Z has end-of-line, ECMA doesn't + status = inSection(343); + pattern = /a\Z/m; + string = 'b\na\n'; + actualmatch = string.match(pattern); + expectedmatch = Array('a'); + addThis(); +*/ + + status = inSection(344); + pattern = /a$/m; + string = 'b\na\n'; + actualmatch = string.match(pattern); + expectedmatch = Array('a'); + addThis(); + +/* Perl has \Z has end-of-line, ECMA doesn't + status = inSection(345); + pattern = /a\Z/m; + string = 'b\na'; + actualmatch = string.match(pattern); + expectedmatch = Array('a'); + addThis(); + + status = inSection(346); + pattern = /a\z/m; + string = 'b\na'; + actualmatch = string.match(pattern); + expectedmatch = Array('a'); + addThis(); +*/ + + status = inSection(347); + pattern = /a$/m; + string = 'b\na'; + actualmatch = string.match(pattern); + expectedmatch = Array('a'); + addThis(); + +/* Perl has \Z has end-of-line, ECMA doesn't + status = inSection(348); + pattern = /aa\Z/; + string = 'b\naa\n'; + actualmatch = string.match(pattern); + expectedmatch = Array('aa'); + addThis(); +*/ + +/* $ only matches end of input unless multiline + status = inSection(349); + pattern = /aa$/; + string = 'b\naa\n'; + actualmatch = string.match(pattern); + expectedmatch = Array('aa'); + addThis(); +*/ + +/* Perl has \Z has end-of-line, ECMA doesn't + status = inSection(350); + pattern = /aa\Z/; + string = 'b\naa'; + actualmatch = string.match(pattern); + expectedmatch = Array('aa'); + addThis(); + + status = inSection(351); + pattern = /aa\z/; + string = 'b\naa'; + actualmatch = string.match(pattern); + expectedmatch = Array('aa'); + addThis(); +*/ + + status = inSection(352); + pattern = /aa$/; + string = 'b\naa'; + actualmatch = string.match(pattern); + expectedmatch = Array('aa'); + addThis(); + + status = inSection(353); + pattern = /aa$/m; + string = 'aa\nb\n'; + actualmatch = string.match(pattern); + expectedmatch = Array('aa'); + addThis(); + +/* Perl has \Z has end-of-line, ECMA doesn't + status = inSection(354); + pattern = /aa\Z/m; + string = 'b\naa\n'; + actualmatch = string.match(pattern); + expectedmatch = Array('aa'); + addThis(); +*/ + + status = inSection(355); + pattern = /aa$/m; + string = 'b\naa\n'; + actualmatch = string.match(pattern); + expectedmatch = Array('aa'); + addThis(); + +/* Perl has \Z has end-of-line, ECMA doesn't + status = inSection(356); + pattern = /aa\Z/m; + string = 'b\naa'; + actualmatch = string.match(pattern); + expectedmatch = Array('aa'); + addThis(); + + status = inSection(357); + pattern = /aa\z/m; + string = 'b\naa'; + actualmatch = string.match(pattern); + expectedmatch = Array('aa'); + addThis(); +*/ + + status = inSection(358); + pattern = /aa$/m; + string = 'b\naa'; + actualmatch = string.match(pattern); + expectedmatch = Array('aa'); + addThis(); + +/* Perl has \Z has end-of-line, ECMA doesn't + status = inSection(359); + pattern = /ab\Z/; + string = 'b\nab\n'; + actualmatch = string.match(pattern); + expectedmatch = Array('ab'); + addThis(); +*/ + +/* $ only matches end of input unless multiline + status = inSection(360); + pattern = /ab$/; + string = 'b\nab\n'; + actualmatch = string.match(pattern); + expectedmatch = Array('ab'); + addThis(); +*/ + +/* Perl has \Z has end-of-line, ECMA doesn't + status = inSection(361); + pattern = /ab\Z/; + string = 'b\nab'; + actualmatch = string.match(pattern); + expectedmatch = Array('ab'); + addThis(); + + status = inSection(362); + pattern = /ab\z/; + string = 'b\nab'; + actualmatch = string.match(pattern); + expectedmatch = Array('ab'); + addThis(); +*/ + + status = inSection(363); + pattern = /ab$/; + string = 'b\nab'; + actualmatch = string.match(pattern); + expectedmatch = Array('ab'); + addThis(); + + status = inSection(364); + pattern = /ab$/m; + string = 'ab\nb\n'; + actualmatch = string.match(pattern); + expectedmatch = Array('ab'); + addThis(); + +/* Perl has \Z has end-of-line, ECMA doesn't + status = inSection(365); + pattern = /ab\Z/m; + string = 'b\nab\n'; + actualmatch = string.match(pattern); + expectedmatch = Array('ab'); + addThis(); +*/ + + status = inSection(366); + pattern = /ab$/m; + string = 'b\nab\n'; + actualmatch = string.match(pattern); + expectedmatch = Array('ab'); + addThis(); + +/* Perl has \Z has end-of-line, ECMA doesn't + status = inSection(367); + pattern = /ab\Z/m; + string = 'b\nab'; + actualmatch = string.match(pattern); + expectedmatch = Array('ab'); + addThis(); + + status = inSection(368); + pattern = /ab\z/m; + string = 'b\nab'; + actualmatch = string.match(pattern); + expectedmatch = Array('ab'); + addThis(); +*/ + + status = inSection(369); + pattern = /ab$/m; + string = 'b\nab'; + actualmatch = string.match(pattern); + expectedmatch = Array('ab'); + addThis(); + +/* Perl has \Z has end-of-line, ECMA doesn't + status = inSection(370); + pattern = /abb\Z/; + string = 'b\nabb\n'; + actualmatch = string.match(pattern); + expectedmatch = Array('abb'); + addThis(); +*/ + +/* $ only matches end of input unless multiline + status = inSection(371); + pattern = /abb$/; + string = 'b\nabb\n'; + actualmatch = string.match(pattern); + expectedmatch = Array('abb'); + addThis(); +*/ + +/* Perl has \Z has end-of-line, ECMA doesn't + status = inSection(372); + pattern = /abb\Z/; + string = 'b\nabb'; + actualmatch = string.match(pattern); + expectedmatch = Array('abb'); + addThis(); + + status = inSection(373); + pattern = /abb\z/; + string = 'b\nabb'; + actualmatch = string.match(pattern); + expectedmatch = Array('abb'); + addThis(); +*/ + + status = inSection(374); + pattern = /abb$/; + string = 'b\nabb'; + actualmatch = string.match(pattern); + expectedmatch = Array('abb'); + addThis(); + + status = inSection(375); + pattern = /abb$/m; + string = 'abb\nb\n'; + actualmatch = string.match(pattern); + expectedmatch = Array('abb'); + addThis(); + +/* Perl has \Z has end-of-line, ECMA doesn't + status = inSection(376); + pattern = /abb\Z/m; + string = 'b\nabb\n'; + actualmatch = string.match(pattern); + expectedmatch = Array('abb'); + addThis(); +*/ + + status = inSection(377); + pattern = /abb$/m; + string = 'b\nabb\n'; + actualmatch = string.match(pattern); + expectedmatch = Array('abb'); + addThis(); + +/* Perl has \Z has end-of-line, ECMA doesn't + status = inSection(378); + pattern = /abb\Z/m; + string = 'b\nabb'; + actualmatch = string.match(pattern); + expectedmatch = Array('abb'); + addThis(); + + status = inSection(379); + pattern = /abb\z/m; + string = 'b\nabb'; + actualmatch = string.match(pattern); + expectedmatch = Array('abb'); + addThis(); +*/ + + status = inSection(380); + pattern = /abb$/m; + string = 'b\nabb'; + actualmatch = string.match(pattern); + expectedmatch = Array('abb'); + addThis(); + + status = inSection(381); + pattern = /(^|x)(c)/; + string = 'ca'; + actualmatch = string.match(pattern); + expectedmatch = Array('c', '', 'c'); + addThis(); + + status = inSection(382); + pattern = /foo.bart/; + string = 'foo.bart'; + actualmatch = string.match(pattern); + expectedmatch = Array('foo.bart'); + addThis(); + + status = inSection(383); + pattern = /^d[x][x][x]/m; + string = 'abcd\ndxxx'; + actualmatch = string.match(pattern); + expectedmatch = Array('dxxx'); + addThis(); + + status = inSection(384); + pattern = /tt+$/; + string = 'xxxtt'; + actualmatch = string.match(pattern); + expectedmatch = Array('tt'); + addThis(); + +/* ECMA spec says that each atom in a range must be a single character + status = inSection(385); + pattern = /([a-\d]+)/; + string = 'za-9z'; + actualmatch = string.match(pattern); + expectedmatch = Array('9', '9'); + addThis(); + + status = inSection(386); + pattern = /([\d-z]+)/; + string = 'a0-za'; + actualmatch = string.match(pattern); + expectedmatch = Array('0-z', '0-z'); + addThis(); +*/ + +/* ECMA doesn't support [: + status = inSection(387); + pattern = /([a-[:digit:]]+)/; + string = 'za-9z'; + actualmatch = string.match(pattern); + expectedmatch = Array('a-9', 'a-9'); + addThis(); + + status = inSection(388); + pattern = /([[:digit:]-z]+)/; + string = '=0-z='; + actualmatch = string.match(pattern); + expectedmatch = Array('0-z', '0-z'); + addThis(); + + status = inSection(389); + pattern = /([[:digit:]-[:alpha:]]+)/; + string = '=0-z='; + actualmatch = string.match(pattern); + expectedmatch = Array('0-z', '0-z'); + addThis(); +*/ + + status = inSection(390); + pattern = /(\d+\.\d+)/; + string = '3.1415926'; + actualmatch = string.match(pattern); + expectedmatch = Array('3.1415926', '3.1415926'); + addThis(); + + status = inSection(391); + pattern = /\.c(pp|xx|c)?$/i; + string = 'IO.c'; + actualmatch = string.match(pattern); + expectedmatch = Array('.c', undefined); + addThis(); + + status = inSection(392); + pattern = /(\.c(pp|xx|c)?$)/i; + string = 'IO.c'; + actualmatch = string.match(pattern); + expectedmatch = Array('.c', '.c', undefined); + addThis(); + + status = inSection(393); + pattern = /(^|a)b/; + string = 'ab'; + actualmatch = string.match(pattern); + expectedmatch = Array('ab', 'a'); + addThis(); + + status = inSection(394); + pattern = /^([ab]*?)(b)?(c)$/; + string = 'abac'; + actualmatch = string.match(pattern); + expectedmatch = Array('abac', 'aba', undefined, 'c'); + addThis(); + + status = inSection(395); + pattern = /^(?:.,){2}c/i; + string = 'a,b,c'; + actualmatch = string.match(pattern); + expectedmatch = Array('a,b,c'); + addThis(); + + status = inSection(396); + pattern = /^(.,){2}c/i; + string = 'a,b,c'; + actualmatch = string.match(pattern); + expectedmatch = Array('a,b,c', 'b,'); + addThis(); + + status = inSection(397); + pattern = /^(?:[^,]*,){2}c/; + string = 'a,b,c'; + actualmatch = string.match(pattern); + expectedmatch = Array('a,b,c'); + addThis(); + + status = inSection(398); + pattern = /^([^,]*,){2}c/; + string = 'a,b,c'; + actualmatch = string.match(pattern); + expectedmatch = Array('a,b,c', 'b,'); + addThis(); + + status = inSection(399); + pattern = /^([^,]*,){3}d/; + string = 'aaa,b,c,d'; + actualmatch = string.match(pattern); + expectedmatch = Array('aaa,b,c,d', 'c,'); + addThis(); + + status = inSection(400); + pattern = /^([^,]*,){3,}d/; + string = 'aaa,b,c,d'; + actualmatch = string.match(pattern); + expectedmatch = Array('aaa,b,c,d', 'c,'); + addThis(); + + status = inSection(401); + pattern = /^([^,]*,){0,3}d/; + string = 'aaa,b,c,d'; + actualmatch = string.match(pattern); + expectedmatch = Array('aaa,b,c,d', 'c,'); + addThis(); + + status = inSection(402); + pattern = /^([^,]{1,3},){3}d/i; + string = 'aaa,b,c,d'; + actualmatch = string.match(pattern); + expectedmatch = Array('aaa,b,c,d', 'c,'); + addThis(); + + status = inSection(403); + pattern = /^([^,]{1,3},){3,}d/; + string = 'aaa,b,c,d'; + actualmatch = string.match(pattern); + expectedmatch = Array('aaa,b,c,d', 'c,'); + addThis(); + + status = inSection(404); + pattern = /^([^,]{1,3},){0,3}d/; + string = 'aaa,b,c,d'; + actualmatch = string.match(pattern); + expectedmatch = Array('aaa,b,c,d', 'c,'); + addThis(); + + status = inSection(405); + pattern = /^([^,]{1,},){3}d/; + string = 'aaa,b,c,d'; + actualmatch = string.match(pattern); + expectedmatch = Array('aaa,b,c,d', 'c,'); + addThis(); + + status = inSection(406); + pattern = /^([^,]{1,},){3,}d/; + string = 'aaa,b,c,d'; + actualmatch = string.match(pattern); + expectedmatch = Array('aaa,b,c,d', 'c,'); + addThis(); + + status = inSection(407); + pattern = /^([^,]{1,},){0,3}d/; + string = 'aaa,b,c,d'; + actualmatch = string.match(pattern); + expectedmatch = Array('aaa,b,c,d', 'c,'); + addThis(); + + status = inSection(408); + pattern = /^([^,]{0,3},){3}d/i; + string = 'aaa,b,c,d'; + actualmatch = string.match(pattern); + expectedmatch = Array('aaa,b,c,d', 'c,'); + addThis(); + + status = inSection(409); + pattern = /^([^,]{0,3},){3,}d/; + string = 'aaa,b,c,d'; + actualmatch = string.match(pattern); + expectedmatch = Array('aaa,b,c,d', 'c,'); + addThis(); + + status = inSection(410); + pattern = /^([^,]{0,3},){0,3}d/; + string = 'aaa,b,c,d'; + actualmatch = string.match(pattern); + expectedmatch = Array('aaa,b,c,d', 'c,'); + addThis(); + +/* ECMA doesn't support \A + status = inSection(411); + pattern = /(?!\A)x/m; + string = 'a\nxb\n'; + actualmatch = string.match(pattern); + expectedmatch = Array('\n'); + addThis(); +*/ + + status = inSection(412); + pattern = /^(a(b)?)+$/; + string = 'aba'; + actualmatch = string.match(pattern); + expectedmatch = Array('aba', 'a', undefined); + addThis(); + + status = inSection(413); + pattern = /^(aa(bb)?)+$/; + string = 'aabbaa'; + actualmatch = string.match(pattern); + expectedmatch = Array('aabbaa', 'aa', undefined); + addThis(); + + status = inSection(414); + pattern = /^.{9}abc.*\n/m; + string = '123\nabcabcabcabc\n'; + actualmatch = string.match(pattern); + expectedmatch = Array('abcabcabcabc\n'); + addThis(); + + status = inSection(415); + pattern = /^(a)?a$/; + string = 'a'; + actualmatch = string.match(pattern); + expectedmatch = Array('a', undefined); + addThis(); + + status = inSection(416); + pattern = /^(a\1?)(a\1?)(a\2?)(a\3?)$/; + string = 'aaaaaa'; + actualmatch = string.match(pattern); + expectedmatch = Array('aaaaaa', 'a', 'aa', 'a', 'aa'); + addThis(); + +/* Can't refer to a capture before it's encountered & completed + status = inSection(417); + pattern = /^(a\1?){4}$/; + string = 'aaaaaa'; + actualmatch = string.match(pattern); + expectedmatch = Array('aaaaaa', 'aaa'); + addThis(); +*/ + + status = inSection(418); + pattern = /^(0+)?(?:x(1))?/; + string = 'x1'; + actualmatch = string.match(pattern); + expectedmatch = Array('x1', undefined, '1'); + addThis(); + + status = inSection(419); + pattern = /^([0-9a-fA-F]+)(?:x([0-9a-fA-F]+)?)(?:x([0-9a-fA-F]+))?/; + string = '012cxx0190'; + actualmatch = string.match(pattern); + expectedmatch = Array('012cxx0190', '012c', undefined, '0190'); + addThis(); + + status = inSection(420); + pattern = /^(b+?|a){1,2}c/; + string = 'bbbac'; + actualmatch = string.match(pattern); + expectedmatch = Array('bbbac', 'a'); + addThis(); + + status = inSection(421); + pattern = /^(b+?|a){1,2}c/; + string = 'bbbbac'; + actualmatch = string.match(pattern); + expectedmatch = Array('bbbbac', 'a'); + addThis(); + + status = inSection(422); + pattern = /((?:aaaa|bbbb)cccc)?/; + string = 'aaaacccc'; + actualmatch = string.match(pattern); + expectedmatch = Array('aaaacccc', 'aaaacccc'); + addThis(); + + status = inSection(423); + pattern = /((?:aaaa|bbbb)cccc)?/; + string = 'bbbbcccc'; + actualmatch = string.match(pattern); + expectedmatch = Array('bbbbcccc', 'bbbbcccc'); + addThis(); + + + + +//----------------------------------------------------------------------------- + test(); +//----------------------------------------------------------------------------- + + + + function addThis() + { + if(omitCurrentSection()) + return; + + statusmessages[i] = status; + patterns[i] = pattern; + strings[i] = string; + actualmatches[i] = actualmatch; + expectedmatches[i] = expectedmatch; + i++; + } + + + function omitCurrentSection() + { + try + { + // current section number is in global status variable + var n = status.match(/(\d+)/)[1]; + return ((n < cnLBOUND) || (n > cnUBOUND)); + } + catch(e) + { + return false; + } + } + + + function test() + { + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches); + exitFunc ('test'); + } diff --git a/js/src/tests/ecma_3/RegExp/perlstress-002.js b/js/src/tests/ecma_3/RegExp/perlstress-002.js new file mode 100644 index 000000000..126d12bc1 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/perlstress-002.js @@ -0,0 +1,1808 @@ +/* -*- 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: 2002-07-07 + * SUMMARY: Testing JS RegExp engine against Perl 5 RegExp engine. + * Adjust cnLBOUND, cnUBOUND below to restrict which sections are tested. + * + * This test was created by running various patterns and strings through the + * Perl 5 RegExp engine. We saved the results below to test the JS engine. + * + * Each of the examples below is a negative test; that is, each produces a + * null match in Perl. Thus we set |expectedmatch| = |null| in each section. + * + * NOTE: ECMA/JS and Perl do differ on certain points. We have either commented + * out such sections altogether, or modified them to fit what we expect from JS. + * + * EXAMPLES: + * + * - ECMA does support (?: (?= and (?! operators, but doesn't support (?< etc. + * + * - ECMA doesn't support (?(condition) + * + */ +//----------------------------------------------------------------------------- +var i = 0; +var BUGNUMBER = 85721; +var summary = 'Testing regular expression edge cases'; +var cnSingleSpace = ' '; +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 cnLBOUND = 0; +var cnUBOUND = 1000; + + +status = inSection(1); +pattern = /abc/; +string = 'xbc'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(2); +pattern = /abc/; +string = 'axc'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(3); +pattern = /abc/; +string = 'abx'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(4); +pattern = /ab+bc/; +string = 'abc'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(5); +pattern = /ab+bc/; +string = 'abq'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(6); +pattern = /ab{1,}bc/; +string = 'abq'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(7); +pattern = /ab{4,5}bc/; +string = 'abbbbc'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(8); +pattern = /ab?bc/; +string = 'abbbbc'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(9); +pattern = /^abc$/; +string = 'abcc'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(10); +pattern = /^abc$/; +string = 'aabc'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(11); +pattern = /abc$/; +string = 'aabcd'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(12); +pattern = /a.*c/; +string = 'axyzd'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(13); +pattern = /a[bc]d/; +string = 'abc'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(14); +pattern = /a[b-d]e/; +string = 'abd'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(15); +pattern = /a[^bc]d/; +string = 'abd'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(16); +pattern = /a[^-b]c/; +string = 'a-c'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(17); +pattern = /a[^]b]c/; +string = 'a]c'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(18); +pattern = /\by\b/; +string = 'xy'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(19); +pattern = /\by\b/; +string = 'yz'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(20); +pattern = /\by\b/; +string = 'xyz'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(21); +pattern = /\Ba\B/; +string = 'a-'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(22); +pattern = /\Ba\B/; +string = '-a'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(23); +pattern = /\Ba\B/; +string = '-a-'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(24); +pattern = /\w/; +string = '-'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(25); +pattern = /\W/; +string = 'a'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(26); +pattern = /a\sb/; +string = 'a-b'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(27); +pattern = /\d/; +string = '-'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(28); +pattern = /\D/; +string = '1'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(29); +pattern = /[\w]/; +string = '-'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(30); +pattern = /[\W]/; +string = 'a'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(31); +pattern = /a[\s]b/; +string = 'a-b'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(32); +pattern = /[\d]/; +string = '-'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(33); +pattern = /[\D]/; +string = '1'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(34); +pattern = /$b/; +string = 'b'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(35); +pattern = /^(ab|cd)e/; +string = 'abcde'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(36); +pattern = /a[bcd]+dcdcde/; +string = 'adcdcde'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(37); +pattern = /(bc+d$|ef*g.|h?i(j|k))/; +string = 'effg'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(38); +pattern = /(bc+d$|ef*g.|h?i(j|k))/; +string = 'bcdd'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(39); +pattern = /[k]/; +string = 'ab'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +// MODIFIED - ECMA has different rules for paren contents. +status = inSection(40); +pattern = /(a)|\1/; +string = 'x'; +actualmatch = string.match(pattern); +//expectedmatch = null; +expectedmatch = Array("", undefined); +addThis(); + +// MODIFIED - ECMA has different rules for paren contents. +status = inSection(41); +pattern = /((\3|b)\2(a)x)+/; +string = 'aaxabxbaxbbx'; +actualmatch = string.match(pattern); +//expectedmatch = null; +expectedmatch = Array("ax", "ax", "", "a"); +addThis(); + +status = inSection(42); +pattern = /abc/i; +string = 'XBC'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(43); +pattern = /abc/i; +string = 'AXC'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(44); +pattern = /abc/i; +string = 'ABX'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(45); +pattern = /ab+bc/i; +string = 'ABC'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(46); +pattern = /ab+bc/i; +string = 'ABQ'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(47); +pattern = /ab{1,}bc/i; +string = 'ABQ'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(48); +pattern = /ab{4,5}?bc/i; +string = 'ABBBBC'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(49); +pattern = /ab??bc/i; +string = 'ABBBBC'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(50); +pattern = /^abc$/i; +string = 'ABCC'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(51); +pattern = /^abc$/i; +string = 'AABC'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(52); +pattern = /a.*c/i; +string = 'AXYZD'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(53); +pattern = /a[bc]d/i; +string = 'ABC'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(54); +pattern = /a[b-d]e/i; +string = 'ABD'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(55); +pattern = /a[^bc]d/i; +string = 'ABD'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(56); +pattern = /a[^-b]c/i; +string = 'A-C'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(57); +pattern = /a[^]b]c/i; +string = 'A]C'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(58); +pattern = /$b/i; +string = 'B'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(59); +pattern = /^(ab|cd)e/i; +string = 'ABCDE'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(60); +pattern = /a[bcd]+dcdcde/i; +string = 'ADCDCDE'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(61); +pattern = /(bc+d$|ef*g.|h?i(j|k))/i; +string = 'EFFG'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(62); +pattern = /(bc+d$|ef*g.|h?i(j|k))/i; +string = 'BCDD'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(63); +pattern = /[k]/i; +string = 'AB'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(64); +pattern = /^(a\1?){4}$/; +string = 'aaaaaaaaa'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(65); +pattern = /^(a\1?){4}$/; +string = 'aaaaaaaaaaa'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +/* ECMA doesn't support (?( + status = inSection(66); + pattern = /^(a(?(1)\1)){4}$/; + string = 'aaaaaaaaa'; + actualmatch = string.match(pattern); + expectedmatch = null; + addThis(); + + status = inSection(67); + pattern = /^(a(?(1)\1)){4}$/; + string = 'aaaaaaaaaaa'; + actualmatch = string.match(pattern); + expectedmatch = null; + addThis(); +*/ + +/* ECMA doesn't support (?< + status = inSection(68); + pattern = /(?<=a)b/; + string = 'cb'; + actualmatch = string.match(pattern); + expectedmatch = null; + addThis(); + + status = inSection(69); + pattern = /(?<=a)b/; + string = 'b'; + actualmatch = string.match(pattern); + expectedmatch = null; + addThis(); + + status = inSection(70); + pattern = /(?<!c)b/; + string = 'cb'; + actualmatch = string.match(pattern); + expectedmatch = null; + addThis(); +*/ + +/* ECMA doesn't support (?(condition) + status = inSection(71); + pattern = /(?:(?i)a)b/; + string = 'aB'; + actualmatch = string.match(pattern); + expectedmatch = null; + addThis(); + + status = inSection(72); + pattern = /((?i)a)b/; + string = 'aB'; + actualmatch = string.match(pattern); + expectedmatch = null; + addThis(); + + status = inSection(73); + pattern = /(?i:a)b/; + string = 'aB'; + actualmatch = string.match(pattern); + expectedmatch = null; + addThis(); + + status = inSection(74); + pattern = /((?i:a))b/; + string = 'aB'; + actualmatch = string.match(pattern); + expectedmatch = null; + addThis(); + + status = inSection(75); + pattern = /(?:(?-i)a)b/i; + string = 'Ab'; + actualmatch = string.match(pattern); + expectedmatch = null; + addThis(); + + status = inSection(76); + pattern = /((?-i)a)b/i; + string = 'Ab'; + actualmatch = string.match(pattern); + expectedmatch = null; + addThis(); + + status = inSection(77); + pattern = /(?:(?-i)a)b/i; + string = 'AB'; + actualmatch = string.match(pattern); + expectedmatch = null; + addThis(); + + status = inSection(78); + pattern = /((?-i)a)b/i; + string = 'AB'; + actualmatch = string.match(pattern); + expectedmatch = null; + addThis(); + + status = inSection(79); + pattern = /(?-i:a)b/i; + string = 'Ab'; + actualmatch = string.match(pattern); + expectedmatch = null; + addThis(); + + status = inSection(80); + pattern = /((?-i:a))b/i; + string = 'Ab'; + actualmatch = string.match(pattern); + expectedmatch = null; + addThis(); + + status = inSection(81); + pattern = /(?-i:a)b/i; + string = 'AB'; + actualmatch = string.match(pattern); + expectedmatch = null; + addThis(); + + status = inSection(82); + pattern = /((?-i:a))b/i; + string = 'AB'; + actualmatch = string.match(pattern); + expectedmatch = null; + addThis(); + + status = inSection(83); + pattern = /((?-i:a.))b/i; + string = 'a\nB'; + actualmatch = string.match(pattern); + expectedmatch = null; + addThis(); + + status = inSection(84); + pattern = /((?s-i:a.))b/i; + string = 'B\nB'; + actualmatch = string.match(pattern); + expectedmatch = null; + addThis(); +*/ + +/* ECMA doesn't support (?< + status = inSection(85); + pattern = /(?<![cd])b/; + string = 'dbcb'; + actualmatch = string.match(pattern); + expectedmatch = null; + addThis(); + + status = inSection(86); + pattern = /(?<!(c|d))b/; + string = 'dbcb'; + actualmatch = string.match(pattern); + expectedmatch = null; + addThis(); +*/ + +status = inSection(87); +pattern = /^(?:a?b?)*$/; +string = 'a--'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(88); +pattern = /^b/; +string = 'a\nb\nc\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(89); +pattern = /()^b/; +string = 'a\nb\nc\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +/* ECMA doesn't support (?( + status = inSection(90); + pattern = /(?(1)a|b)/; + string = 'a'; + actualmatch = string.match(pattern); + expectedmatch = null; + addThis(); + + status = inSection(91); + pattern = /(x)?(?(1)a|b)/; + string = 'a'; + actualmatch = string.match(pattern); + expectedmatch = null; + addThis(); + + status = inSection(92); + pattern = /()(?(1)b|a)/; + string = 'a'; + actualmatch = string.match(pattern); + expectedmatch = null; + addThis(); + + status = inSection(93); + pattern = /^(\()?blah(?(1)(\)))$/; + string = 'blah)'; + actualmatch = string.match(pattern); + expectedmatch = null; + addThis(); + + status = inSection(94); + pattern = /^(\()?blah(?(1)(\)))$/; + string = '(blah'; + actualmatch = string.match(pattern); + expectedmatch = null; + addThis(); + + status = inSection(95); + pattern = /^(\(+)?blah(?(1)(\)))$/; + string = 'blah)'; + actualmatch = string.match(pattern); + expectedmatch = null; + addThis(); + + status = inSection(96); + pattern = /^(\(+)?blah(?(1)(\)))$/; + string = '(blah'; + actualmatch = string.match(pattern); + expectedmatch = null; + addThis(); + + status = inSection(97); + pattern = /(?(?{0})a|b)/; + string = 'a'; + actualmatch = string.match(pattern); + expectedmatch = null; + addThis(); + + status = inSection(98); + pattern = /(?(?{1})b|a)/; + string = 'a'; + actualmatch = string.match(pattern); + expectedmatch = null; + addThis(); + + status = inSection(99); + pattern = /(?(?!a)a|b)/; + string = 'a'; + actualmatch = string.match(pattern); + expectedmatch = null; + addThis(); + + status = inSection(100); + pattern = /(?(?=a)b|a)/; + string = 'a'; + actualmatch = string.match(pattern); + expectedmatch = null; + addThis(); +*/ + +status = inSection(101); +pattern = /^(?=(a+?))\1ab/; +string = 'aaab'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(102); +pattern = /^(?=(a+?))\1ab/; +string = 'aaab'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(103); +pattern = /([\w:]+::)?(\w+)$/; +string = 'abcd:'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(104); +pattern = /([\w:]+::)?(\w+)$/; +string = 'abcd:'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(105); +pattern = /(>a+)ab/; +string = 'aaab'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(106); +pattern = /a\Z/; +string = 'a\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(107); +pattern = /a\z/; +string = 'a\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(108); +pattern = /a$/; +string = 'a\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(109); +pattern = /a\z/; +string = 'b\na\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(110); +pattern = /a\z/m; +string = 'a\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(111); +pattern = /a\z/m; +string = 'b\na\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(112); +pattern = /aa\Z/; +string = 'aa\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(113); +pattern = /aa\z/; +string = 'aa\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(114); +pattern = /aa$/; +string = 'aa\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(115); +pattern = /aa\z/; +string = 'b\naa\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(116); +pattern = /aa\z/m; +string = 'aa\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(117); +pattern = /aa\z/m; +string = 'b\naa\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(118); +pattern = /aa\Z/; +string = 'ac\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(119); +pattern = /aa\z/; +string = 'ac\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(120); +pattern = /aa$/; +string = 'ac\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(121); +pattern = /aa\Z/; +string = 'b\nac\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(122); +pattern = /aa\z/; +string = 'b\nac\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(123); +pattern = /aa$/; +string = 'b\nac\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(124); +pattern = /aa\Z/; +string = 'b\nac'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(125); +pattern = /aa\z/; +string = 'b\nac'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(126); +pattern = /aa$/; +string = 'b\nac'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(127); +pattern = /aa\Z/m; +string = 'ac\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(128); +pattern = /aa\z/m; +string = 'ac\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(129); +pattern = /aa$/m; +string = 'ac\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(130); +pattern = /aa\Z/m; +string = 'b\nac\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(131); +pattern = /aa\z/m; +string = 'b\nac\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(132); +pattern = /aa$/m; +string = 'b\nac\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(133); +pattern = /aa\Z/m; +string = 'b\nac'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(134); +pattern = /aa\z/m; +string = 'b\nac'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(135); +pattern = /aa$/m; +string = 'b\nac'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(136); +pattern = /aa\Z/; +string = 'ca\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(137); +pattern = /aa\z/; +string = 'ca\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(138); +pattern = /aa$/; +string = 'ca\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(139); +pattern = /aa\Z/; +string = 'b\nca\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(140); +pattern = /aa\z/; +string = 'b\nca\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(141); +pattern = /aa$/; +string = 'b\nca\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(142); +pattern = /aa\Z/; +string = 'b\nca'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(143); +pattern = /aa\z/; +string = 'b\nca'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(144); +pattern = /aa$/; +string = 'b\nca'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(145); +pattern = /aa\Z/m; +string = 'ca\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(146); +pattern = /aa\z/m; +string = 'ca\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(147); +pattern = /aa$/m; +string = 'ca\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(148); +pattern = /aa\Z/m; +string = 'b\nca\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(149); +pattern = /aa\z/m; +string = 'b\nca\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(150); +pattern = /aa$/m; +string = 'b\nca\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(151); +pattern = /aa\Z/m; +string = 'b\nca'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(152); +pattern = /aa\z/m; +string = 'b\nca'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(153); +pattern = /aa$/m; +string = 'b\nca'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(154); +pattern = /ab\Z/; +string = 'ab\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(155); +pattern = /ab\z/; +string = 'ab\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(156); +pattern = /ab$/; +string = 'ab\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(157); +pattern = /ab\z/; +string = 'b\nab\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(158); +pattern = /ab\z/m; +string = 'ab\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(159); +pattern = /ab\z/m; +string = 'b\nab\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(160); +pattern = /ab\Z/; +string = 'ac\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(161); +pattern = /ab\z/; +string = 'ac\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(162); +pattern = /ab$/; +string = 'ac\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(163); +pattern = /ab\Z/; +string = 'b\nac\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(164); +pattern = /ab\z/; +string = 'b\nac\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(165); +pattern = /ab$/; +string = 'b\nac\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(166); +pattern = /ab\Z/; +string = 'b\nac'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(167); +pattern = /ab\z/; +string = 'b\nac'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(168); +pattern = /ab$/; +string = 'b\nac'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(169); +pattern = /ab\Z/m; +string = 'ac\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(170); +pattern = /ab\z/m; +string = 'ac\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(171); +pattern = /ab$/m; +string = 'ac\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(172); +pattern = /ab\Z/m; +string = 'b\nac\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(173); +pattern = /ab\z/m; +string = 'b\nac\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(174); +pattern = /ab$/m; +string = 'b\nac\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(175); +pattern = /ab\Z/m; +string = 'b\nac'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(176); +pattern = /ab\z/m; +string = 'b\nac'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(177); +pattern = /ab$/m; +string = 'b\nac'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(178); +pattern = /ab\Z/; +string = 'ca\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(179); +pattern = /ab\z/; +string = 'ca\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(180); +pattern = /ab$/; +string = 'ca\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(181); +pattern = /ab\Z/; +string = 'b\nca\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(182); +pattern = /ab\z/; +string = 'b\nca\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(183); +pattern = /ab$/; +string = 'b\nca\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(184); +pattern = /ab\Z/; +string = 'b\nca'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(185); +pattern = /ab\z/; +string = 'b\nca'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(186); +pattern = /ab$/; +string = 'b\nca'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(187); +pattern = /ab\Z/m; +string = 'ca\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(188); +pattern = /ab\z/m; +string = 'ca\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(189); +pattern = /ab$/m; +string = 'ca\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(190); +pattern = /ab\Z/m; +string = 'b\nca\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(191); +pattern = /ab\z/m; +string = 'b\nca\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(192); +pattern = /ab$/m; +string = 'b\nca\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(193); +pattern = /ab\Z/m; +string = 'b\nca'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(194); +pattern = /ab\z/m; +string = 'b\nca'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(195); +pattern = /ab$/m; +string = 'b\nca'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(196); +pattern = /abb\Z/; +string = 'abb\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(197); +pattern = /abb\z/; +string = 'abb\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(198); +pattern = /abb$/; +string = 'abb\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(199); +pattern = /abb\z/; +string = 'b\nabb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(200); +pattern = /abb\z/m; +string = 'abb\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(201); +pattern = /abb\z/m; +string = 'b\nabb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(202); +pattern = /abb\Z/; +string = 'ac\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(203); +pattern = /abb\z/; +string = 'ac\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(204); +pattern = /abb$/; +string = 'ac\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(205); +pattern = /abb\Z/; +string = 'b\nac\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(206); +pattern = /abb\z/; +string = 'b\nac\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(207); +pattern = /abb$/; +string = 'b\nac\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(208); +pattern = /abb\Z/; +string = 'b\nac'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(209); +pattern = /abb\z/; +string = 'b\nac'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(210); +pattern = /abb$/; +string = 'b\nac'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(211); +pattern = /abb\Z/m; +string = 'ac\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(212); +pattern = /abb\z/m; +string = 'ac\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(213); +pattern = /abb$/m; +string = 'ac\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(214); +pattern = /abb\Z/m; +string = 'b\nac\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(215); +pattern = /abb\z/m; +string = 'b\nac\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(216); +pattern = /abb$/m; +string = 'b\nac\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(217); +pattern = /abb\Z/m; +string = 'b\nac'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(218); +pattern = /abb\z/m; +string = 'b\nac'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(219); +pattern = /abb$/m; +string = 'b\nac'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(220); +pattern = /abb\Z/; +string = 'ca\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(221); +pattern = /abb\z/; +string = 'ca\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(222); +pattern = /abb$/; +string = 'ca\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(223); +pattern = /abb\Z/; +string = 'b\nca\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(224); +pattern = /abb\z/; +string = 'b\nca\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(225); +pattern = /abb$/; +string = 'b\nca\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(226); +pattern = /abb\Z/; +string = 'b\nca'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(227); +pattern = /abb\z/; +string = 'b\nca'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(228); +pattern = /abb$/; +string = 'b\nca'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(229); +pattern = /abb\Z/m; +string = 'ca\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(230); +pattern = /abb\z/m; +string = 'ca\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(231); +pattern = /abb$/m; +string = 'ca\nb\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(232); +pattern = /abb\Z/m; +string = 'b\nca\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(233); +pattern = /abb\z/m; +string = 'b\nca\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(234); +pattern = /abb$/m; +string = 'b\nca\n'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(235); +pattern = /abb\Z/m; +string = 'b\nca'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(236); +pattern = /abb\z/m; +string = 'b\nca'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(237); +pattern = /abb$/m; +string = 'b\nca'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(238); +pattern = /a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/; +string = 'x'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(239); +pattern = /\GX.*X/; +string = 'aaaXbX'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(240); +pattern = /\.c(pp|xx|c)?$/i; +string = 'Changes'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(241); +pattern = /^([a-z]:)/; +string = 'C:/'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(242); +pattern = /(\w)?(abc)\1b/; +string = 'abcab'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +/* ECMA doesn't support (?( + status = inSection(243); + pattern = /^(a)?(?(1)a|b)+$/; + string = 'a'; + actualmatch = string.match(pattern); + expectedmatch = null; + addThis(); +*/ + + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + + + +function addThis() +{ + if(omitCurrentSection()) + return; + + statusmessages[i] = status; + patterns[i] = pattern; + strings[i] = string; + actualmatches[i] = actualmatch; + expectedmatches[i] = expectedmatch; + i++; +} + + +function omitCurrentSection() +{ + try + { + // current section number is in global status variable + var n = status.match(/(\d+)/)[1]; + return ((n < cnLBOUND) || (n > cnUBOUND)); + } + catch(e) + { + return false; + } +} + + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches); + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/RegExp/regress-100199.js b/js/src/tests/ecma_3/RegExp/regress-100199.js new file mode 100644 index 000000000..2c162677b --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-100199.js @@ -0,0 +1,273 @@ +/* -*- 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: 17 September 2001 + * + * SUMMARY: Regression test for Bugzilla bug 100199 + * See http://bugzilla.mozilla.org/show_bug.cgi?id=100199 + * + * The empty character class [] is a valid RegExp construct: the condition + * that a given character belong to a set containing no characters. As such, + * it can never be met and is always FALSE. Similarly, [^] is a condition + * that matches any given character and is always TRUE. + * + * Neither one of these conditions should cause syntax errors in a RegExp. + */ +//----------------------------------------------------------------------------- +var i = 0; +var BUGNUMBER = 100199; +var summary = '[], [^] are valid RegExp conditions. Should not cause errors -'; +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(); + + +pattern = /[]/; +string = 'abc'; +status = inSection(1); +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +string = ''; +status = inSection(2); +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +string = '['; +status = inSection(3); +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +string = '/'; +status = inSection(4); +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +string = '['; +status = inSection(5); +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +string = ']'; +status = inSection(6); +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +string = '[]'; +status = inSection(7); +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +string = '[ ]'; +status = inSection(8); +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +string = ']['; +status = inSection(9); +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + + +pattern = /a[]/; +string = 'abc'; +status = inSection(10); +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +string = ''; +status = inSection(11); +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +string = 'a['; +status = inSection(12); +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +string = 'a[]'; +status = inSection(13); +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +string = '['; +status = inSection(14); +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +string = ']'; +status = inSection(15); +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +string = '[]'; +status = inSection(16); +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +string = '[ ]'; +status = inSection(17); +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +string = ']['; +status = inSection(18); +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + + +pattern = /[^]/; +string = 'abc'; +status = inSection(19); +actualmatch = string.match(pattern); +expectedmatch = Array('a'); +addThis(); + +string = ''; +status = inSection(20); +actualmatch = string.match(pattern); +expectedmatch = null; //there are no characters to test against the condition +addThis(); + +string = '\/'; +status = inSection(21); +actualmatch = string.match(pattern); +expectedmatch = Array('/'); +addThis(); + +string = '\['; +status = inSection(22); +actualmatch = string.match(pattern); +expectedmatch = Array('['); +addThis(); + +string = '['; +status = inSection(23); +actualmatch = string.match(pattern); +expectedmatch = Array('['); +addThis(); + +string = ']'; +status = inSection(24); +actualmatch = string.match(pattern); +expectedmatch = Array(']'); +addThis(); + +string = '[]'; +status = inSection(25); +actualmatch = string.match(pattern); +expectedmatch = Array('['); +addThis(); + +string = '[ ]'; +status = inSection(26); +actualmatch = string.match(pattern); +expectedmatch = Array('['); +addThis(); + +string = ']['; +status = inSection(27); +actualmatch = string.match(pattern); +expectedmatch = Array(']'); +addThis(); + + +pattern = /a[^]/; +string = 'abc'; +status = inSection(28); +actualmatch = string.match(pattern); +expectedmatch = Array('ab'); +addThis(); + +string = ''; +status = inSection(29); +actualmatch = string.match(pattern); +expectedmatch = null; //there are no characters to test against the condition +addThis(); + +string = 'a['; +status = inSection(30); +actualmatch = string.match(pattern); +expectedmatch = Array('a['); +addThis(); + +string = 'a]'; +status = inSection(31); +actualmatch = string.match(pattern); +expectedmatch = Array('a]'); +addThis(); + +string = 'a[]'; +status = inSection(32); +actualmatch = string.match(pattern); +expectedmatch = Array('a['); +addThis(); + +string = 'a[ ]'; +status = inSection(33); +actualmatch = string.match(pattern); +expectedmatch = Array('a['); +addThis(); + +string = 'a]['; +status = inSection(34); +actualmatch = string.match(pattern); +expectedmatch = Array('a]'); +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/RegExp/regress-105972.js b/js/src/tests/ecma_3/RegExp/regress-105972.js new file mode 100644 index 000000000..4d08fa447 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-105972.js @@ -0,0 +1,123 @@ +/* -*- 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: 22 October 2001 + * + * SUMMARY: Regression test for Bugzilla bug 105972: + * "/^.*?$/ will not match anything" + * + * See http://bugzilla.mozilla.org/show_bug.cgi?id=105972 + */ +//----------------------------------------------------------------------------- +var i = 0; +var BUGNUMBER = 105972; +var summary = 'Regression test for Bugzilla bug 105972'; +var cnEmptyString = ''; +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(); + + +/* + * The bug: this match was coming up null in Rhino and SpiderMonkey. + * It should match the whole string. The reason: + * + * The * operator is greedy, but *? is non-greedy: it will stop + * at the simplest match it can find. But the pattern here asks us + * to match till the end of the string. So the simplest match must + * go all the way out to the end, and *? has no choice but to do it. + */ +status = inSection(1); +pattern = /^.*?$/; +string = 'Hello World'; +actualmatch = string.match(pattern); +expectedmatch = Array(string); +addThis(); + + +/* + * Leave off the '$' condition - here we expect the empty string. + * Unlike the above pattern, we don't have to match till the end of + * the string, so the non-greedy operator *? doesn't try to... + */ +status = inSection(2); +pattern = /^.*?/; +string = 'Hello World'; +actualmatch = string.match(pattern); +expectedmatch = Array(cnEmptyString); +addThis(); + + +/* + * Try '$' combined with an 'or' operator. + * + * The operator *? will consume the string from left to right, + * attempting to satisfy the condition (:|$). When it hits ':', + * the match will stop because the operator *? is non-greedy. + * + * The submatch $1 = (:|$) will contain the ':' + */ +status = inSection(3); +pattern = /^.*?(:|$)/; +string = 'Hello: World'; +actualmatch = string.match(pattern); +expectedmatch = Array('Hello:', ':'); +addThis(); + + +/* + * Again, '$' combined with an 'or' operator. + * + * The operator * will consume the string from left to right, + * attempting to satisfy the condition (:|$). When it hits ':', + * the match will not stop since * is greedy. The match will + * continue until it hits $, the end-of-string boundary. + * + * The submatch $1 = (:|$) will contain the empty string + * conceived to exist at the end-of-string boundary. + */ +status = inSection(4); +pattern = /^.*(:|$)/; +string = 'Hello: World'; +actualmatch = string.match(pattern); +expectedmatch = Array(string, cnEmptyString); +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/RegExp/regress-119909.js b/js/src/tests/ecma_3/RegExp/regress-119909.js new file mode 100644 index 000000000..f0d3d08f0 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-119909.js @@ -0,0 +1,58 @@ +/* -*- 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: 14 Jan 2002 + * SUMMARY: Shouldn't crash on regexps with many nested parentheses + * See http://bugzilla.mozilla.org/show_bug.cgi?id=119909 + * + */ +//----------------------------------------------------------------------------- +var BUGNUMBER = 119909; +var summary = "Shouldn't crash on regexps with many nested parentheses"; +var NO_BACKREFS = false; +var DO_BACKREFS = true; + + +//-------------------------------------------------- +test(); +//-------------------------------------------------- + + +function test() +{ + enterFunc('test'); + printBugNumber(BUGNUMBER); + printStatus(summary); + + testThis(500, NO_BACKREFS, 'hello', 'goodbye'); + testThis(500, DO_BACKREFS, 'hello', 'goodbye'); + + reportCompare('No Crash', 'No Crash', ''); + + exitFunc('test'); +} + + +/* + * Creates a regexp pattern like (((((((((hello))))))))) + * and tests str.search(), str.match(), str.replace() + */ +function testThis(numParens, doBackRefs, strOriginal, strReplace) +{ + var openParen = doBackRefs? '(' : '(?:'; + var closeParen = ')'; + var pattern = ''; + + for (var i=0; i<numParens; i++) {pattern += openParen;} + pattern += strOriginal; + for (i=0; i<numParens; i++) {pattern += closeParen;} + var re = new RegExp(pattern); + + var res = strOriginal.search(re); + res = strOriginal.match(re); + res = strOriginal.replace(re, strReplace); +} diff --git a/js/src/tests/ecma_3/RegExp/regress-122076.js b/js/src/tests/ecma_3/RegExp/regress-122076.js new file mode 100644 index 000000000..d4b16dbd9 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-122076.js @@ -0,0 +1,76 @@ +/* -*- 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: 12 Feb 2002 + * SUMMARY: Don't crash on invalid regexp literals / \\/ / + * + * See http://bugzilla.mozilla.org/show_bug.cgi?id=122076 + * The function checkURL() below sometimes caused a compile-time error: + * + * SyntaxError: unterminated parenthetical (: + * + * However, sometimes it would cause a crash instead. The presence of + * other functions below is merely fodder to help provoke the crash. + * The constant |STRESS| is number of times we'll try to crash on this. + * + */ +//----------------------------------------------------------------------------- +var BUGNUMBER = 122076; +var summary = "Don't crash on invalid regexp literals / \\/ /"; +var STRESS = 10; +var sEval = ''; + +printBugNumber(BUGNUMBER); +printStatus(summary); + + +sEval += 'function checkDate()' +sEval += '{' +sEval += 'return (this.value.search(/^[012]?\d\/[0123]?\d\/[0]\d$/) != -1);' +sEval += '}' + +sEval += 'function checkDNSName()' +sEval += '{' +sEval += ' return (this.value.search(/^([\w\-]+\.)+([\w\-]{2,3})$/) != -1);' +sEval += '}' + +sEval += 'function checkEmail()' +sEval += '{' +sEval += ' return (this.value.search(/^([\w\-]+\.)*[\w\-]+@([\w\-]+\.)+([\w\-]{2,3})$/) != -1);' +sEval += '}' + +sEval += 'function checkHostOrIP()' +sEval += '{' +sEval += ' if (this.value.search(/^([\w\-]+\.)+([\w\-]{2,3})$/) == -1)' +sEval += ' return (this.value.search(/^[1-2]?\d{1,2}\.[1-2]?\d{1,2}\.[1-2]?\d{1,2}\.[1-2]?\d{1,2}$/) != -1);' +sEval += ' else' +sEval += ' return true;' +sEval += '}' + +sEval += 'function checkIPAddress()' +sEval += '{' +sEval += ' return (this.value.search(/^[1-2]?\d{1,2}\.[1-2]?\d{1,2}\.[1-2]?\d{1,2}\.[1-2]?\d{1,2}$/) != -1);' +sEval += '}' + +sEval += 'function checkURL()' +sEval += '{' +sEval += ' return (this.value.search(/^(((https?)|(ftp)):\/\/([\-\w]+\.)+\w{2,4}(\/[%\-\w]+(\.\w{2,})?)*(([\w\-\.\?\\/\*\$+@&#;`~=%!]*)(\.\w{2,})?)*\/?)$/) != -1);' +sEval += '}' + + +for (var i=0; i<STRESS; i++) +{ + try + { + eval(sEval); + } + catch(e) + { + } +} + +reportCompare('No Crash', 'No Crash', ''); diff --git a/js/src/tests/ecma_3/RegExp/regress-123437.js b/js/src/tests/ecma_3/RegExp/regress-123437.js new file mode 100644 index 000000000..e3791d32e --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-123437.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: 04 Feb 2002 + * SUMMARY: regexp backreferences must hold |undefined| if not used + * + * See http://bugzilla.mozilla.org/show_bug.cgi?id=123437 (SpiderMonkey) + * See http://bugzilla.mozilla.org/show_bug.cgi?id=123439 (Rhino) + * + */ +//----------------------------------------------------------------------------- +var i = 0; +var BUGNUMBER = 123437; +var summary = 'regexp backreferences must hold |undefined| if not used'; +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(); + + +pattern = /(a)?a/; +string = 'a'; +status = inSection(1); +actualmatch = string.match(pattern); +expectedmatch = Array('a', undefined); +addThis(); + +pattern = /a|(b)/; +string = 'a'; +status = inSection(2); +actualmatch = string.match(pattern); +expectedmatch = Array('a', undefined); +addThis(); + +pattern = /(a)?(a)/; +string = 'a'; +status = inSection(3); +actualmatch = string.match(pattern); +expectedmatch = Array('a', undefined, 'a'); +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/RegExp/regress-165353.js b/js/src/tests/ecma_3/RegExp/regress-165353.js new file mode 100644 index 000000000..ba5acc15b --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-165353.js @@ -0,0 +1,88 @@ +/* -*- 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: 31 August 2002 + * SUMMARY: RegExp conformance test + * See http://bugzilla.mozilla.org/show_bug.cgi?id=165353 + * + */ +//----------------------------------------------------------------------------- +var i = 0; +var BUGNUMBER = 165353; +var summary = 'RegExp conformance test'; +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(); + + +pattern = /^([a-z]+)*[a-z]$/; +status = inSection(1); +string = 'a'; +actualmatch = string.match(pattern); +expectedmatch = Array('a', undefined); +addThis(); + +status = inSection(2); +string = 'ab'; +actualmatch = string.match(pattern); +expectedmatch = Array('ab', 'a'); +addThis(); + +status = inSection(3); +string = 'abc'; +actualmatch = string.match(pattern); +expectedmatch = Array('abc', 'ab'); +addThis(); + + +string = 'www.netscape.com'; +status = inSection(4); +pattern = /^(([a-z]+)*[a-z]\.)+[a-z]{2,}$/; +actualmatch = string.match(pattern); +expectedmatch = Array('www.netscape.com', 'netscape.', 'netscap'); +addThis(); + +// add one more capturing parens to the previous regexp - +status = inSection(5); +pattern = /^(([a-z]+)*([a-z])\.)+[a-z]{2,}$/; +actualmatch = string.match(pattern); +expectedmatch = Array('www.netscape.com', 'netscape.', 'netscap', 'e'); +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/RegExp/regress-169497.js b/js/src/tests/ecma_3/RegExp/regress-169497.js new file mode 100644 index 000000000..82959640b --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-169497.js @@ -0,0 +1,71 @@ +/* -*- 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: 31 August 2002 + * SUMMARY: RegExp conformance test + * See http://bugzilla.mozilla.org/show_bug.cgi?id=169497 + * + */ +//----------------------------------------------------------------------------- +var i = 0; +var BUGNUMBER = 169497; +var summary = 'RegExp conformance test'; +var status = ''; +var statusmessages = new Array(); +var pattern = ''; +var patterns = new Array(); +var sBody = ''; +var sHTML = ''; +var string = ''; +var strings = new Array(); +var actualmatch = ''; +var actualmatches = new Array(); +var expectedmatch = ''; +var expectedmatches = new Array(); + +sBody += '<body onXXX="alert(event.type);">\n'; +sBody += '<p>Kibology for all<\/p>\n'; +sBody += '<p>All for Kibology<\/p>\n'; +sBody += '<\/body>'; + +sHTML += '<html>\n'; +sHTML += sBody; +sHTML += '\n<\/html>'; + +status = inSection(1); +string = sHTML; +pattern = /<body.*>((.*\n?)*?)<\/body>/i; +actualmatch = string.match(pattern); +expectedmatch = Array(sBody, '\n<p>Kibology for all</p>\n<p>All for Kibology</p>\n', '<p>All for Kibology</p>\n'); +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/RegExp/regress-169534.js b/js/src/tests/ecma_3/RegExp/regress-169534.js new file mode 100644 index 000000000..7c9d62135 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-169534.js @@ -0,0 +1,61 @@ +/* -*- 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: 20 Sep 2002 + * SUMMARY: RegExp conformance test + * See http://bugzilla.mozilla.org/show_bug.cgi?id=169534 + * + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = 169534; +var summary = 'RegExp conformance test'; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; + + +status = inSection(1); +var re = /(\|)([\w\x81-\xff ]*)(\|)([\/a-z][\w:\/\.]*\.[a-z]{3,4})(\|)/ig; +var str = "To sign up click |here|https://www.xxxx.org/subscribe.htm|"; +actual = str.replace(re, '<a href="$4">$2</a>'); +expect = 'To sign up click <a href="https://www.xxxx.org/subscribe.htm">here</a>'; +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/RegExp/regress-187133.js b/js/src/tests/ecma_3/RegExp/regress-187133.js new file mode 100644 index 000000000..032b801fe --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-187133.js @@ -0,0 +1,108 @@ +/* -*- 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: 06 January 2003 + * SUMMARY: RegExp conformance test + * See http://bugzilla.mozilla.org/show_bug.cgi?id=187133 + * + * The tests here employ the regular expression construct: + * + * (?!pattern) + * + * This is a "zero-width lookahead negative assertion". + * From the Perl documentation: + * + * For example, /foo(?!bar)/ matches any occurrence + * of 'foo' that isn't followed by 'bar'. + * + * It is "zero-width" means that it does not consume any characters and that + * the parens are non-capturing. A non-null match array in the example above + * will have only have length 1, not 2. + * + */ +//----------------------------------------------------------------------------- +var i = 0; +var BUGNUMBER = 187133; +var summary = 'RegExp conformance test'; +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(); + + +pattern = /(\.(?!com|org)|\/)/; +status = inSection(1); +string = 'ah.info'; +actualmatch = string.match(pattern); +expectedmatch = ['.', '.']; +addThis(); + +status = inSection(2); +string = 'ah/info'; +actualmatch = string.match(pattern); +expectedmatch = ['/', '/']; +addThis(); + +status = inSection(3); +string = 'ah.com'; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + + +pattern = /(?!a|b)|c/; +status = inSection(4); +string = ''; +actualmatch = string.match(pattern); +expectedmatch = ['']; +addThis(); + +status = inSection(5); +string = 'bc'; +actualmatch = string.match(pattern); +expectedmatch = ['']; +addThis(); + +status = inSection(6); +string = 'd'; +actualmatch = string.match(pattern); +expectedmatch = ['']; +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/RegExp/regress-188206.js b/js/src/tests/ecma_3/RegExp/regress-188206.js new file mode 100644 index 000000000..506bdc9eb --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-188206.js @@ -0,0 +1,185 @@ +/* -*- 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: 21 January 2003 + * SUMMARY: Invalid use of regexp quantifiers should generate SyntaxErrors + * + * See http://bugzilla.mozilla.org/show_bug.cgi?id=188206 + * and http://bugzilla.mozilla.org/show_bug.cgi?id=85721#c48 etc. + * and http://bugzilla.mozilla.org/show_bug.cgi?id=190685 + * and http://bugzilla.mozilla.org/show_bug.cgi?id=197451 + */ +//----------------------------------------------------------------------------- +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 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 = []; + + +/* + * All the following are invalid uses of regexp quantifiers and + * should generate SyntaxErrors. That's what we're testing for. + * + * To allow the test to compile and run, we have to hide the errors + * inside eval strings, and check they are caught at run-time - + * + */ +status = inSection(1); +testThis(' /a**/ '); + +status = inSection(2); +testThis(' /a***/ '); + +status = inSection(3); +testThis(' /a++/ '); + +status = inSection(4); +testThis(' /a+++/ '); + +/* + * The ? quantifier, unlike * or +, may appear twice in succession. + * Thus we need at least three in a row to provoke a SyntaxError - + */ + +status = inSection(5); +testThis(' /a???/ '); + +status = inSection(6); +testThis(' /a????/ '); + + +/* + * Now do some weird things on the left side of the regexps - + */ +status = inSection(9); +testThis(' /+a/ '); + +status = inSection(10); +testThis(' /++a/ '); + +status = inSection(11); +testThis(' /?a/ '); + +status = inSection(12); +testThis(' /??a/ '); + + +/* + * Misusing the {DecmalDigits} quantifier - according to BOTH ECMA and Perl. + * + * Just as with the * and + quantifiers above, can't have two {DecmalDigits} + * quantifiers in succession - it's a SyntaxError. + */ +status = inSection(28); +testThis(' /x{1}{1}/ '); + +status = inSection(29); +testThis(' /x{1,}{1}/ '); + +status = inSection(30); +testThis(' /x{1,2}{1}/ '); + +status = inSection(31); +testThis(' /x{1}{1,}/ '); + +status = inSection(32); +testThis(' /x{1,}{1,}/ '); + +status = inSection(33); +testThis(' /x{1,2}{1,}/ '); + +status = inSection(34); +testThis(' /x{1}{1,2}/ '); + +status = inSection(35); +testThis(' /x{1,}{1,2}/ '); + +status = inSection(36); +testThis(' /x{1,2}{1,2}/ '); + + + +//----------------------------------------------------------------------------- +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++; +} + + +/* + * 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/RegExp/regress-191479.js b/js/src/tests/ecma_3/RegExp/regress-191479.js new file mode 100644 index 000000000..daa8d0da4 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-191479.js @@ -0,0 +1,164 @@ +/* -*- 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: 31 January 2003 + * SUMMARY: Testing regular expressions of form /(x|y){n,}/ + * + * See http://bugzilla.mozilla.org/show_bug.cgi?id=191479 + * + */ +//----------------------------------------------------------------------------- +var i = 0; +var BUGNUMBER = 191479; +var summary = 'Testing regular expressions of form /(x|y){n,}/'; +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(); + + +status = inSection(1); +string = '12 3 45'; +pattern = /(\d|\d\s){2,}/; +actualmatch = string.match(pattern); +expectedmatch = Array('12', '2'); +addThis(); + +status = inSection(2); +string = '12 3 45'; +pattern = /(\d|\d\s){4,}/; +actualmatch = string.match(pattern); +expectedmatch = Array(string, '5'); +addThis(); + +status = inSection(3); +string = '12 3 45'; +pattern = /(\d|\d\s)+/; +actualmatch = string.match(pattern); +expectedmatch = Array('12', '2'); +addThis(); + +status = inSection(4); +string = '12 3 45'; +pattern = /(\d\s?){4,}/; +actualmatch = string.match(pattern); +expectedmatch = Array(string, '5'); +addThis(); + +/* + * Let's reverse the operands in Sections 1-3 above - + */ +status = inSection(5); +string = '12 3 45'; +pattern = /(\d\s|\d){2,}/; +actualmatch = string.match(pattern); +expectedmatch = Array(string, '5'); +addThis(); + +status = inSection(6); +string = '12 3 45'; +pattern = /(\d\s|\d){4,}/; +actualmatch = string.match(pattern); +expectedmatch = Array(string, '5'); +addThis(); + +status = inSection(7); +string = '12 3 45'; +pattern = /(\d\s|\d)+/; +actualmatch = string.match(pattern); +expectedmatch = Array(string, '5'); +addThis(); + + +/* + * Let's take all 7 sections above and make each quantifer non-greedy. + * + * This is done by appending ? to it. It doesn't change the meaning of + * the quantifier, but makes it non-greedy, which affects the results - + */ +status = inSection(8); +string = '12 3 45'; +pattern = /(\d|\d\s){2,}?/; +actualmatch = string.match(pattern); +expectedmatch = Array('12', '2'); +addThis(); + +status = inSection(9); +string = '12 3 45'; +pattern = /(\d|\d\s){4,}?/; +actualmatch = string.match(pattern); +expectedmatch = Array('12 3 4', '4'); +addThis(); + +status = inSection(10); +string = '12 3 45'; +pattern = /(\d|\d\s)+?/; +actualmatch = string.match(pattern); +expectedmatch = Array('1', '1'); +addThis(); + +status = inSection(11); +string = '12 3 45'; +pattern = /(\d\s?){4,}?/; +actualmatch = string.match(pattern); +expectedmatch = Array('12 3 4', '4'); +addThis(); + +status = inSection(12); +string = '12 3 45'; +pattern = /(\d\s|\d){2,}?/; +actualmatch = string.match(pattern); +expectedmatch = Array('12 ', '2 '); +addThis(); + +status = inSection(13); +string = '12 3 45'; +pattern = /(\d\s|\d){4,}?/; +actualmatch = string.match(pattern); +expectedmatch = Array('12 3 4', '4'); +addThis(); + +status = inSection(14); +string = '12 3 45'; +pattern = /(\d\s|\d)+?/; +actualmatch = string.match(pattern); +expectedmatch = Array('1', '1'); +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/RegExp/regress-202564.js b/js/src/tests/ecma_3/RegExp/regress-202564.js new file mode 100644 index 000000000..48854d2c8 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-202564.js @@ -0,0 +1,67 @@ +/* -*- 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: 18 April 2003 + * SUMMARY: Testing regexp with many backreferences + * See http://bugzilla.mozilla.org/show_bug.cgi?id=202564 + * + * Note that in Section 1 below, we expect the 1st and 4th backreferences + * to hold |undefined| instead of the empty strings one gets in Perl and IE6. + * This is because per ECMA, regexp backreferences must hold |undefined| + * if not used. See http://bugzilla.mozilla.org/show_bug.cgi?id=123437. + * + */ +//----------------------------------------------------------------------------- +var i = 0; +var BUGNUMBER = 202564; +var summary = 'Testing regexp with many backreferences'; +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(); + + +status = inSection(1); +string = 'Seattle, WA to Buckley, WA'; +pattern = /(?:(.+), )?(.+), (..) to (?:(.+), )?(.+), (..)/; +actualmatch = string.match(pattern); +expectedmatch = Array(string, undefined, "Seattle", "WA", undefined, "Buckley", "WA"); +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/RegExp/regress-209067.js b/js/src/tests/ecma_3/RegExp/regress-209067.js new file mode 100644 index 000000000..efee909b2 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-209067.js @@ -0,0 +1,1072 @@ +/* -*- 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: 12 June 2003 + * SUMMARY: Testing complicated str.replace() + * + * See http://bugzilla.mozilla.org/show_bug.cgi?id=209067 + * + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = 209067; +var summary = 'Testing complicated str.replace()'; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; + + +function formatHTML(h) +{ + // a replace function used in the succeeding lines - + function S(s) + { + return s.replace(/</g,'<').replace(/>/g,'>'); + } + + h+='\n'; + h=h.replace(/&([^\s]+;)/g,'<&$1>'); + h=h.replace(new RegExp('<!-'+'-[\\s\\S]*-'+'->','g'), S); + h=h.replace(/"[^"]*"/g,S); + h=h.replace(/'[^']*'/g,S); + + + h=h.replace(/<([^>]*)>/g, + function(s,p) + { + if(s.match(/!doctype/i)) + return'<span class=doctype><' + p + '></span>'; + + p=p.replace(/\\'/g,'\\'').replace(/\\"/g,'\\"').replace(/^\s/,''); +p=p.replace(/(\s)([^<]+)$/g, + function(s,p1,p2) + { + p2=p2.replace(/(=)(\s*[^"'][^\s]*)(\s|$)/g,'$1<span class=attribute-value>$2</span>$3'); + p2=p2.replace(/("[^"]*")/g,'<span class=attribute-value>$1</span>'); + p2=p2.replace(/('[^']*')/g,'<span class=attribute-value>$1</span>'); + return p1 + '<span class=attribute-name>'+p2+'</span>'; + } + ) + + return'<<span class=' + (s.match(/<\s*\//)?'end-tag':'start-tag') + '>' + p + '</span>>'; + } + ) + + + h=h.replace(/<(&[^\s]+;)>/g,'<span class=entity>$1</span>'); + h=h.replace(/(<!--[\s\S]*-->)/g,'<span class=comment>$1</span>'); + + + numer=1; + h=h.replace(/(.*\n)/g, + function(s,p) + { + return (numer++) +'. ' + p; + } + ) + + + return'<span class=text>' + h + '</span>'; +} + + + +/* + * sanity check + */ +status = inSection(1); +actual = formatHTML('abc'); +expect = '<span class=text>1. abc\n</span>'; +addThis(); + + +/* + * The real test: can we run this without crashing? + * We are not validating the result, just running it. + */ +status = inSection(2); +var HUGE_TEST_STRING = hugeString(); +formatHTML(HUGE_TEST_STRING); + + + + +//----------------------------------------------------------------------------- +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'); +} + + +function hugeString() +{ +var s = ''; + +s += '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">'; +s += '<html lang="en">'; +s += '<head>'; +s += ' <meta http-equiv="content-type" content="text/html; charset=iso-8859-1">'; +s += ' <meta http-equiv="refresh" content="1800">'; +s += ' <title>CNN.com</title>'; +s += ' <link rel="Start" href="/">'; +s += ' <link rel="Search" href="/search/">'; +s += ' <link rel="stylesheet" href="http://i.cnn.net/cnn/.element/ssi/css/1.0/main.css" type="text/css">'; +s += ' <script language="JavaScript1.2" src="http://i.cnn.net/cnn/.element/ssi/js/1.0/main.js" type="text/javascript"></script>'; +s += '<script language="JavaScript1.1" src="http://ar.atwola.com/file/adsWrapper.js"></script>'; +s += '<style type="text/css">'; +s += '<!--'; +s += '.aoltextad { text-align: justify; font-size: 12px; color: black; font-family: Georgia, sans-serif }'; +s += '-->'; +s += '</style>'; +s += '<script language="JavaScript1.1" type="text/javascript" src="http://ar.atwola.com/file/adsPopup2.js"></script>'; +s += '<script language="JavaScript">'; +s += 'document.adoffset = 0;'; +s += 'document.adPopupDomain = "www.cnn.com";'; +s += 'document.adPopupFile = "/cnn_adspaces/adsPopup2.html";'; +s += 'document.adPopupInterval = "P24";'; +s += 'document.adPopunderInterval = "P24";'; +s += 'adSetOther("&TVAR="+escape("class=us.low"));'; +s += '</script>'; +s += ''; +s += ' '; +s += '</head>'; +s += '<body class="cnnMainPage">'; +s += ''; +s += ''; +s += ''; +s += '<a name="top_of_page"></a>'; +s += '<a href="#ContentArea"><img src="http://i.cnn.net/cnn/images/1.gif" alt="Click here to skip to main content." width="10" height="1" border="0" align="right"></a>'; +s += '<table width="770" border="0" cellpadding="0" cellspacing="0" style="speak: none">'; +s += ' <col width="229">'; +s += ' <col width="73">'; +s += ' <col width="468">'; +s += ' <tr>'; +s += ' <td colspan="3"><!--'; +s += '[[!~~ netscape hat ~~]][[table border="0" cellpadding="0" cellspacing="0" width="100%"]][[tr]][[td]][[script Language="Javascript" SRC="http://toolbar.aol.com/dashboard.twhat?dom=cnn" type="text/javascript"]][[/script]][[/td]][[/tr]][[/table]]'; +s += ''; +s += '[[div]][[img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="2" border="0"]][[/div]]'; +s += '-->'; +s += ' </td>'; +s += ' </tr>'; +s += ' <tr valign="bottom">'; +s += ' <td width="229" style="speak: normal"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/logo/cnn.gif" alt="CNN.com" width="229" height="52" border="0"></td>'; +s += ' <td width="73"></td>'; +s += ' <td width="468" align="right">'; +s += ' <!-- home/bottom.468x60 -->'; +s += '<script language="JavaScript1.1">'; +s += '<!--'; +s += 'adSetTarget("_top");'; +s += 'htmlAdWH( (new Array(93103287,93103287,93103300,93103300))[document.adoffset||0] , 468, 60);'; +s += '//-->'; + s += '</script>'; + s += '<noscript><a href="http://ar.atwola.com/link/93103287/aol" target="_top"><img src="http://ar.atwola.com/image/93103287/aol" alt="Click Here" width="468" height="60" border="0"></a></noscript> '; + s += ''; + s += ''; + s += ''; + s += ''; + s += ' </td>'; + s += ' </tr>'; + s += ' <tr><td colspan="3"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="2"></td></tr>'; + s += ' <tr>'; + s += ' <td colspan="3">'; + s += '</td>'; + s += ' </tr>'; + s += ' <tr><td colspan="3" bgcolor="#CC0000"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="3"></td></tr>'; + s += ' <tr>'; + s += ' <td colspan="3">'; + s += ''; + s += '<table width="770" border="0" cellpadding="0" cellspacing="0">'; + s += ' <form action="http://search.cnn.com/cnn/search" method="get" onsubmit="return CNN_validateSearchForm(this);">'; + s += '<input type="hidden" name="source" value="cnn">'; + s += '<input type="hidden" name="invocationType" value="search/top">'; + s += ' <tr><td colspan="4"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="1" border="0"></td></tr>'; + s += ' <tr><td colspan="4" bgcolor="#003366"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="3" border="0"></td></tr>'; + s += ' <tr>'; + s += ' <td rowspan="2"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/searchbar/bar.search.gif" alt="SEARCH" width="110" height="27" border="0"></td>'; + s += ' <td colspan="2"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/searchbar/bar.top.bevel.gif" alt="" width="653" height="3" border="0"></td>'; + s += ' <td rowspan="2"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/searchbar/bar.right.bevel.gif" alt="" width="7" height="27" border="0"></td>'; + s += ' </tr>'; + s += ' <tr bgcolor="#B6D8E0">'; + s += ' <td><table border="0" cellpadding="0" cellspacing="0">'; + s += ' <tr>'; + s += ' <td> </td>'; + s += ' <td nowrap><span class="cnnFormTextB" style="color:#369">The Web</span></td>'; + s += ' <td><input type="radio" name="sites" value="google" checked></td>'; + s += ' <td> </td>'; + s += ' <td><span class="cnnFormTextB" style="color:#369;">CNN.com</span></td>'; + s += ' <td><input type="radio" name="sites" value="cnn"></td>'; + s += ' <td> </td>'; + s += ' <td><input type="text" name="query" class="cnnFormText" value="" title="Enter text to search for and click Search" size="35" maxlength="40" style="width: 280px"></td>'; + s += ' <td> <input type="Submit" value="Search" class="cnnNavButton" style="padding: 0px; margin: 0px; width: 50px"></td>'; + s += ' </tr>'; + s += ' </table></td>'; + s += ' <td align="right"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/searchbar/bar.google.gif" alt="enhanced by Google" width="137" height="24" border="0"></td>'; + s += ' </tr>'; + s += ' <tr><td colspan="4"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/searchbar/bar.bottom.bevel.gif" alt="" width="770" height="3" border="0"></td></tr>'; + s += ' </form>'; + s += '</table>'; + s += ' </td>'; + s += ' </tr>'; + s += ''; + s += ''; + s += '</table>'; + s += ''; + s += '<table width="770" border="0" cellpadding="0" cellspacing="0">'; + s += ' <col width="126" align="left" valign="top">'; + s += ' <col width="10">'; + s += ' <col width="280">'; + s += ' <col width="10">'; + s += ' <col width="344">'; + s += ' <tr valign="top">'; + s += ' <td rowspan="5" width="126" style="speak: none"><table id="cnnNavBar" width="126" bgcolor="#EEEEEE" border="0" cellpadding="0" cellspacing="0" summary="CNN.com Navigation">'; + s += ' <col width="8" align="left" valign="top">'; + s += ' <col width="118" align="left" valign="top">'; + s += ' <tr bgcolor="#CCCCCC" class="cnnNavHiliteRow"><td width="8" class="swath"> </td>'; + s += ' <td class="cnnNavHilite" onClick="CNN_goTo("/")"><div class="cnnNavText"><a href="/">Home Page</a></div></td></tr>'; + s += ' <tr class="cnnNavRow"><td class="swath"> </td>'; + s += ' <td class="cnnNav" onMouseOver="CNN_navBar(this,1,1)" onMouseOut="CNN_navBar(this,0,1)" onClick="CNN_navBarClick(this,1,"/WORLD/")"><div class="cnnNavText"><a href="/WORLD/">World</a></div></td></tr>'; + s += ' <tr class="cnnNavRow"><td class="swath"> </td>'; + s += ' <td class="cnnNav" onMouseOver="CNN_navBar(this,1,1)" onMouseOut="CNN_navBar(this,0,1)" onClick="CNN_navBarClick(this,1,"/US/")"><div class="cnnNavText"><a href="/US/">U.S.</a></div></td></tr>'; + s += ' <tr class="cnnNavRow"><td class="swath"> </td>'; + s += ' <td class="cnnNav" onMouseOver="CNN_navBar(this,1,1)" onMouseOut="CNN_navBar(this,0,1)" onClick="CNN_navBarClick(this,1,"/WEATHER/")"><div class="cnnNavText"><a href="/WEATHER/">Weather</a></div></td></tr>'; + s += ' <tr class="cnnNavRow"><td class="swath"> </td>'; + s += ' <td class="cnnNav" onMouseOver="CNN_navBar(this,1,1)" onMouseOut="CNN_navBar(this,0,1)" onClick="CNN_navBarClick(this,1,"/money/")"><div class="cnnNavText"><a href="/money/">Business</a> <a href="/money/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/nav_at_money.gif" alt="at CNN/Money" width="51" height="5" border="0"></a></div></td></tr>'; + s += ' <tr class="cnnNavRow"><td class="swath"> </td>'; + s += ' <td class="cnnNav" onMouseOver="CNN_navBar(this,1,1)" onMouseOut="CNN_navBar(this,0,1)" onClick="CNN_navBarClick(this,1,"/cnnsi/")"><div class="cnnNavText"><a href="/si/">Sports</a> <a href="/si/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/nav_at_si.gif" alt="at SI.com" width="50" height="5" border="0"></a></div></td></tr>'; + s += ' <tr class="cnnNavRow"><td class="swath"> </td>'; + s += ' <td class="cnnNav" onMouseOver="CNN_navBar(this,1,1)" onMouseOut="CNN_navBar(this,0,1)" onClick="CNN_navBarClick(this,1,"/ALLPOLITICS/")"><div class="cnnNavText"><a href="/ALLPOLITICS/">Politics</a></div></td></tr>'; + s += ' <tr class="cnnNavRow"><td class="swath"> </td>'; + s += ' <td class="cnnNav" onMouseOver="CNN_navBar(this,1,1)" onMouseOut="CNN_navBar(this,0,1)" onClick="CNN_navBarClick(this,1,"/LAW/")"><div class="cnnNavText"><a href="/LAW/">Law</a></div></td></tr>'; + s += ' <tr class="cnnNavRow"><td class="swath"> </td>'; + s += ' <td class="cnnNav" onMouseOver="CNN_navBar(this,1,1)" onMouseOut="CNN_navBar(this,0,1)" onClick="CNN_navBarClick(this,1,"/TECH/")"><div class="cnnNavText"><a href="/TECH/">Technology</a></div></td></tr>'; + s += ' <tr class="cnnNavRow"><td class="swath"> </td>'; + s += ' <td class="cnnNav" onMouseOver="CNN_navBar(this,1,1)" onMouseOut="CNN_navBar(this,0,1)" onClick="CNN_navBarClick(this,1,"/TECH/space/")"><div class="cnnNavText"><a href="/TECH/space/">Science & Space</a></div></td></tr>'; + s += ' <tr class="cnnNavRow"><td class="swath"> </td>'; + s += ' <td class="cnnNav" onMouseOver="CNN_navBar(this,1,1)" onMouseOut="CNN_navBar(this,0,1)" onClick="CNN_navBarClick(this,1,"/HEALTH/")"><div class="cnnNavText"><a href="/HEALTH/">Health</a></div></td></tr>'; + s += ' <tr class="cnnNavRow"><td class="swath"> </td>'; + s += ' <td class="cnnNav" onMouseOver="CNN_navBar(this,1,1)" onMouseOut="CNN_navBar(this,0,1)" onClick="CNN_navBarClick(this,1,"/SHOWBIZ/")"><div class="cnnNavText"><a href="/SHOWBIZ/">Entertainment</a></div></td></tr>'; + s += ' <tr class="cnnNavRow"><td class="swath"> </td>'; + s += ' <td class="cnnNav" onMouseOver="CNN_navBar(this,1,1)" onMouseOut="CNN_navBar(this,0,1)" onClick="CNN_navBarClick(this,1,"/TRAVEL/")"><div class="cnnNavText"><a href="/TRAVEL/">Travel</a></div></td></tr>'; + s += ' <tr class="cnnNavRow"><td class="swath"> </td>'; + s += ' <td class="cnnNav" onMouseOver="CNN_navBar(this,1,1)" onMouseOut="CNN_navBar(this,0,1)" onClick="CNN_navBarClick(this,1,"/EDUCATION/")"><div class="cnnNavText"><a href="/EDUCATION/">Education</a></div></td></tr>'; + s += ' <tr class="cnnNavRow"><td class="swath"> </td>'; + s += ' <td class="cnnNav" onMouseOver="CNN_navBar(this,1,1)" onMouseOut="CNN_navBar(this,0,1)" onClick="CNN_navBarClick(this,1,"/SPECIALS/")"><div class="cnnNavText"><a href="/SPECIALS/">Special Reports</a></div></td></tr>'; + s += ' <tr bgcolor="#FFFFFF"><td class="cnnNavAd" colspan="2" align="center"><!-- home/left.120x90 -->'; + s += '<script language="JavaScript1.1">'; + s += '<!--'; + s += 'adSetTarget("_top");'; + s += 'htmlAdWH( (new Array(93166917,93166917,93170132,93170132))[document.adoffset||0] , 120, 90);'; + s += '//-->'; + s += '</script><noscript><a href="http://ar.atwola.com/link/93166917/aol" target="_top"><img src="http://ar.atwola.com/image/93166917/aol" alt="Click here for our advertiser" width="120" height="90" border="0"></a></noscript></td></tr>'; + s += ' <tr bgcolor="#999999" class="cnnNavGroupRow">'; + s += ' <td colspan="2" class="cnnNavGroup"><div class="cnnNavText">SERVICES</div></td></tr>'; + s += ' <tr class="cnnNavOtherRow"><td class="swath"> </td>'; + s += ' <td class="cnnNavOther" onMouseOver="CNN_navBar(this,1,0)" onMouseOut="CNN_navBar(this,0,0)" onClick="CNN_navBarClick(this,0,"/video/")"><div class="cnnNavText"><a href="/video/">Video</a></div></td></tr>'; + s += ' <tr class="cnnNavOtherRow"><td class="swath"> </td>'; + s += ' <td class="cnnNavOther" onMouseOver="CNN_navBar(this,1,0)" onMouseOut="CNN_navBar(this,0,0)" onClick="CNN_navBarClick(this,0,"/EMAIL/")"><div class="cnnNavText"><a href="/EMAIL/">E-Mail Services</a></div></td></tr>'; + s += ' <tr class="cnnNavOtherRow"><td class="swath"> </td>'; + s += ' <td class="cnnNavOther" onMouseOver="CNN_navBar(this,1,0)" onMouseOut="CNN_navBar(this,0,0)" onClick="CNN_navBarClick(this,0,"/mobile/CNNtoGO/")"><div class="cnnNavText"><a href="/mobile/CNNtoGO/">CNN To Go</a></div></td></tr>'; + s += ' <tr bgcolor="#999999" class="cnnNavGroupRow">'; + s += ' <td colspan="2" class="cnnNavGroup" style="background-color: #445B60"><div class="cnnNavText" style="color: #fff">SEARCH</div></td></tr>'; + s += ' <tr bgcolor="#CCCCCC"><td colspan="2" class="cnnNavSearch" style="background-color:#B6D8E0">'; + s += ''; + s += '<form action="http://search.cnn.com/cnn/search" method="get" name="nav_bottom_search" onSubmit="return CNN_validateSearchForm(this)" style="margin: 0px;">'; + s += ' <input type="hidden" name="sites" value="cnn">'; + s += ' <input type="hidden" name="source" value="cnn">'; + s += ' <input type="hidden" name="invocationType" value="side/bottom">'; + s += '<table width="100%" border="0" cellpadding="0" cellspacing="4">'; + s += ' <tr><td colspan="2"><table width="100%" border="0" cellpadding="0" cellspacing="0">'; + s += ' <tr>'; + s += ' <td align="left"><span class="cnnFormTextB" style="color: #369">Web</span></td>'; + s += ' <td><input type="radio" name="sites" value="google" checked></td>'; + s += ' <td align="right"><span class="cnnFormTextB" style="color: #369">CNN.com</span></td>'; + s += ' <td><input type="radio" name="sites" value="cnn"></td>'; + s += ' </tr>'; + s += ' </table></td></tr>'; + s += ' <tr><td colspan="2"><input type="text" name="query" class="cnnFormText" value="" title="Enter text to search for and click Search" size="7" maxlength="40" style="width: 100%"></td></tr>'; + s += ' <tr valign="top">'; + s += ' <td><input type="submit" value="Search" class="cnnNavButton" style="padding: 0px; margin: 0px; width: 50px"></td>'; + s += ' <td align="right"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/sect/SEARCH/nav.search.gif" alt="enhanced by Google" width="54" height="27"></td>'; + s += ' </tr>'; + s += '</table>'; + s += ''; + s += ''; + s += ''; + s += '</td></form></tr>'; + s += '</table>'; + s += ''; + s += ' </td>'; + s += ' <td rowspan="5" width="10"><a name="ContentArea"></a><img id="accessibilityPixel" src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="7" border="0"></td>'; + s += ' <td colspan="3" valign="middle">'; + s += ' <table border="0" cellpadding="0" cellspacing="0" width="100%">'; + s += ' <tr>'; + s += ' <td valign="top" nowrap><div class="cnnFinePrint" style="color: #333;padding:6px;padding-left:0px;">Updated: 05:53 p.m. EDT (2153 GMT) June 12, 2003</div></td>'; + s += ' <td align="right" nowrap class="cnnt1link"><a href="http://edition.cnn.com/">Visit International Edition</a> </td>'; + s += ' </tr><!--include virtual="/.element/ssi/sect/MAIN/1.0/banner.html"-->'; + s += ' </table>'; + s += ' </td>'; + s += ' </tr>'; + s += ' <tr valign="top">'; + s += ' <td rowspan="2" width="280" bgcolor="#EAEFF4">'; + s += ''; + s += '<!-- T1 -->'; + s += ' '; + s += ' <a href="/2003/SHOWBIZ/Movies/06/12/obit.peck/index.html"><img src="http://i.cnn.net/cnn/2003/SHOWBIZ/Movies/06/12/obit.peck/top.peck.obit.jpg" alt="Oscar-winner Peck dies" width="280" height="210" border="0" hspace="0" vspace="0"></a>'; + s += ''; + s += ' <div class="cnnMainT1">'; + s += ' <h2 style="font-size:20px;"><a href="/2003/SHOWBIZ/Movies/06/12/obit.peck/index.html">Oscar-winner Peck dies</a></h2>'; + s += '<p>'; + s += 'Actor Gregory Peck, who won an Oscar for his portrayal of upstanding lawyer Atticus Finch in 1962s "To Kill a Mockingbird," has died at age 87. Peck was best known for roles of dignified statesmen and people who followed a strong code of ethics. But he also could play against type. All told, Peck was nominated for five Academy Awards.'; + s += '</p>'; + s += ' <p>'; + s += ' <b><a href="/2003/SHOWBIZ/Movies/06/12/obit.peck/index.html" class="cnnt1link">FULL STORY</a></b>'; + s += ' </p>'; + s += ''; + s += ''; + s += ''; + s += '• <span class="cnnBodyText" style="font-weight:bold;color:#333;">Video: </span><img src="http://i.cnn.net/cnn/.element/img/1.0/misc/premium.gif" alt="premium content" width="9" height="11" hspace="0" vspace="0" border="0" align="absmiddle"> <a href="javascript:LaunchVideo("/showbiz/2003/06/12/peck.obit.affl.","300k");">A leading mans leading man</a><br>'; + s += ''; + s += ''; + s += ''; + s += ' '; + s += '• <span class="cnnBodyText" style="font-weight:bold;color:#333">Interactive: </span> <a href="javascript:CNN_openPopup("/interactive/entertainment/0306/peck.obit/frameset.exclude.html","620x430","toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,width=620,height=430")">Gregory Peck through the years</a><br>'; + s += ''; + s += ' '; + s += '• <a href="http://www.cnn.com/2003/SHOWBIZ/Movies/06/12/peck.filmography/index.html" target="new">Gregory Peck filmography</a><img src="http://i.cnn.net/cnn/.element/img/1.0/misc/icon.external.links.gif" alt="external link" width="20" height="13" vspace="1" hspace="4" border="0" align="top"><br>'; + s += ''; + s += ' '; + s += '• <a href="http://www.cnn.com/2003/SHOWBIZ/Movies/06/04/heroes.villains.ap/index.html" target="new">Pecks Finch chararcter AFIs top hero</a><img src="http://i.cnn.net/cnn/.element/img/1.0/misc/icon.external.links.gif" alt="external link" width="20" height="13" vspace="1" hspace="4" border="0" align="top"><br>'; + s += ' </div>'; + s += ''; + s += '<!-- /T1 -->'; + s += ' </td>'; + s += ' '; + s += ' <td rowspan="2" width="10"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="10" height="1"></td>'; + s += ' <td width="344">'; + s += ''; + s += ''; + s += ''; + s += ''; + s += '<!-- T2 -->'; + s += ''; + s += '<div><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/px_c00.gif" alt="" width="344" height="2"></div>'; + s += '<table width="344" border="0" cellpadding="0" cellspacing="0">'; + s += ' <tr>'; + s += ' <td width="285" class="cnnTabbedBoxHeader" style="padding-left:0px;"><span class="cnnBigPrint"><b>MORE TOP STORIES</b></span></td>'; + s += ' <td width="59" class="cnnTabbedBoxTab" align="right" bgcolor="#336699"><a href="/userpicks"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/userpicks.gif" alt=" Hot Stories " width="59" height="11" border="0"></a></td>'; + s += ' </tr>'; + s += '</table>'; + s += '<div style="padding:6px;padding-left:0px;">'; + s += ''; + s += ' '; + s += '<div class="cnnMainNewT2">• <a href="/2003/WORLD/meast/06/12/mideast/index.html">7 dead in new Gaza strike</a>'; + s += '| <img src="http://i.cnn.net/cnn/.element/img/1.0/misc/premium.gif" alt="premium content" width="9" height="11" hspace="0" vspace="0" border="0" align="absmiddle"> <a href="javascript:LaunchVideo("/world/2003/06/11/cb.bush.roadmap.ap.","300k");">Video</a><br></div>'; + s += ''; + s += ' '; + s += '<div class="cnnMainNewT2">• <a href="/2003/WORLD/meast/06/12/sprj.irq.main/index.html">U.S. helicopter, jet down in Iraqi raid</a>'; + s += '| <img src="http://i.cnn.net/cnn/.element/img/1.0/misc/premium.gif" alt="premium content" width="9" height="11" hspace="0" vspace="0" border="0" align="absmiddle"> <a href="javascript:LaunchVideo("/iraq/2003/06/11/bw.iraq.oil.cnn.","300k");">Video</a><br></div>'; + s += ''; + s += ' '; + s += '<div class="cnnMainNewT2">• <a href="/2003/SHOWBIZ/TV/06/12/obit.brinkley/index.html">Television icon David Brinkley dead at 82</a><br></div>'; + s += ''; + s += ' '; + s += '<div class="cnnMainNewT2">• <a href="/2003/LAW/06/12/peterson.case/index.html">Peterson search warrants will be made public in July</a><br></div>'; + s += ''; + s += ' '; + s += '<div class="cnnMainNewT2">• <a href="/2003/WORLD/asiapcf/east/06/12/okinawa.rape/index.html">U.S. Marine held in new Okinawa rape case</a><br></div>'; + s += ''; + s += ' '; + s += '<div class="cnnMainNewT2">• <a href="/2003/TECH/space/06/12/sprj.colu.bolts.ap/index.html">New threat discovered for shuttle launches</a><br></div>'; + s += ''; + s += ' '; + s += '<div class="cnnMainNewT2">• <a href="/2003/SHOWBIZ/TV/06/12/television.sopranos.reut/index.html">"Soprano" Gandolfini shares his wealth with castmates</a><br></div>'; + s += '<!--[[div class="cnnMainNewT2"]]• [[b]][[span style="color:#C00;"]]CNN[[/span]]Radio:[[/b]] [[a href="javascript:CNN_openPopup("/audio/radio/preferences.html","radioplayer","toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,width=200,height=124")"]]Bush on Medicare[[/a]] [[a href="javascript:CNN_openPopup("/audio/radio/preferences.html","radioplayer","toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,width=200,height=124")"]][[img src="http://i.a.cnn.net/cnn/.element/img/1.0/misc/live.video.gif" alt="" width="61" height="14" vspace="0" hspace="2" align="absmiddle" border="0"]][[/a]][[img src="http://i.a.cnn.net/cnn/.element/img/1.0/misc/audio.gif" alt="" width="10" height="10" vspace="0" hspace="2" align="absmiddle"]][[br]][[/div]]--></div>'; + s += ''; + s += '<!-- /T2 -->'; + s += '<div><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="10"></div>'; + s += ''; + s += '<!--include virtual="/.element/ssi/misc/1.0/war.zone.smmap.txt"-->'; + s += '<!-- =========== CNN Radio/Video Box =========== -->'; + s += '<!-- top line --> '; + s += '<div><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/px_ccc.gif" alt="" width="344" height="1"></div>'; + s += '<!-- /top line -->'; + s += ' <table width="344" border="0" cellpadding="0" cellspacing="0">'; + s += ' <tr valign="top">'; + s += '<!-- left-side line --> '; + s += ' <td bgcolor="#CCCCCC" width="1"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="30" hspace="0" vspace="0" border="0"></td>'; + s += '<!-- /left-side line --> '; + s += '<!-- CNNRadio cell -->'; + s += ' <td width="114"><div class="cnn6pxPad">'; + s += ' <span class="cnnBigPrint" style="color:#C00;font-weight:bold;">CNN</span><span class="cnnBigPrint" style="color:#000;font-weight:bold;">RADIO</span>'; + s += '<div class="cnnMainNewT2"><a href="javascript:CNN_openPopup("/audio/radio/preferences.html","radioplayer","toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,width=200,height=124")">Listen to latest updates</a><img src="http://i.a.cnn.net/cnn/.element/img/1.0/misc/audio.gif" alt="" width="10" height="10" vspace="0" hspace="2" align="absmiddle">'; + s += '<div><img src="http://i.a.cnn.net/cnn/images/1.gif" alt="" width="1" height="5" hspace="0" vspace="0"></div>'; + s += '<!--'; + s += '[[span class="cnnFinePrint"]]sponsored by:[[/span]][[br]][[center]]'; + s += '[[!~~#include virtual="/cnn_adspaces/home/war_in_iraq/sponsor.88x31.ad"~~]]'; + s += ' [[/center]]'; + s += '-->'; + s += ' </div></td>'; + s += '<!-- /CNNRadio cell --> '; + s += '<!-- center line --> '; + s += ' <td bgcolor="#CCCCCC" width="1"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="1" hspace="0" vspace="0" border="0"></td>'; + s += '<!-- /center line --> '; + s += '<!-- video cell --> '; + s += ' <td width="227"><div class="cnn6pxPad">'; + s += '<!-- video box --> '; + s += '<table width="215" border="0" cellpadding="0" cellspacing="0">'; + s += ' <tr valign="top">'; + s += ' <td width="144"><span class="cnnBigPrint" style="font-weight:bold;">VIDEO</span></td>'; + s += ' <td width="6"><img src="http://i.a.cnn.net/cnn/images/1.gif" alt="" width="6" height="1" hspace="0" vspace="0"></td>'; + s += ' <td width="65"><a href="/video/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/more.video.blue.gif" alt="MORE VIDEO" width="62" height="11" hspace="0" vspace="0" border="0"></a></td></tr>'; + s += ' <tr>'; + s += ' <td width="215" colspan="3"><img src="http://i.a.cnn.net/cnn/images/1.gif" alt="" width="1" height="2" hspace="0" vspace="0"></td></tr>'; + s += ' <tr valign="top">'; + s += ' <td><div class="cnnBodyText">'; + s += ' Soldier broke dozens of hearts over e-mail<br>'; + s += ' <img src="http://i.a.cnn.net/cnn/images/icons/premium.gif" align="middle" alt="premium content" width="9" height="11" hspace="0" vspace="1" border="0"> <a href="javascript:LaunchVideo("/offbeat/2003/06/12/ms.casanova.col.ap.","300k");" class="cnnVideoLink">PLAY VIDEO</a></div>'; + s += ' </td>'; + s += '<td width="3"><img src="http://i.a.cnn.net/cnn/images/1.gif" alt="" width="3" height="1" hspace="0" vspace="0"></td> '; + s += ' <td width="65" align="right">'; + s += ' <a href="javascript:LaunchVideo("/offbeat/2003/06/12/ms.casanova.col.ap.","300k");"><img src="http://i.cnn.net/cnn/video/offbeat/2003/06/12/ms.casanova.col.vs.kndu.jpg" alt="" width="65" height="49" border="0" vspace="2" hspace="0"></a>'; + s += ' </td></tr>'; + s += '</table>'; + s += ' <!-- /video box --> '; + s += ' </div></td>'; + s += '<!-- /video cell --> '; + s += '<!-- right-side line --> '; + s += '<td bgcolor="#CCCCCC" width="1"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="1" hspace="0" vspace="0" border="0"></td>'; + s += '<!-- /right-side line --> '; + s += ' </tr>'; + s += ' </table>'; + s += ''; + s += '<!-- bottom line -->'; + s += '<div><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/px_ccc.gif" alt="" width="344" height="1"></div>'; + s += '<!-- /bottom line -->'; + s += '<!-- =========== /CNN Radio/Video Box =========== -->'; + s += ''; + s += '<div><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="10"></div>'; + s += '<div><img src="http://i.cnn.net/cnn/.element/img/1.0/main/px_c00.gif" alt="" width="344" height="2"></div>'; + s += '<table width="344" border="0" cellpadding="0" cellspacing="0">'; + s += ' <tr>'; + s += ' <td width="260" class="cnnTabbedBoxHeader" style="padding-left:0px;"><span class="cnnBigPrint"><b>ON THE SCENE</b></span></td>'; + s += ' <td width="84" class="cnnTabbedBoxTab" align="right" bgcolor="#336699" style="padding: 0px 3px;"><a href="/LAW/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/superlinks/law.gif" alt="more reports" height="11" border="0" hspace="2" vspace="2" align="right"></a></td>'; + s += ' </tr>'; + s += '</table>'; + s += ''; + s += '<table width="344" border="0" cellpadding="5" cellspacing="0">'; + s += ' <tr valign="top">'; + s += ' <td style="padding-left:0px;"> <b>Jeffrey Toobin:</b> "It takes guts" for Peterson defense to subpoena judge over wiretap issue.'; + s += '<a href="/2003/LAW/06/12/otsc.toobin/index.html">Full Story</a></td>'; + s += ''; + s += '<td width="65" align="right" style="padding-left:6px;"><a href="/2003/LAW/06/12/otsc.toobin/index.html"><img src="http://i.cnn.net/cnn/2003/LAW/06/12/otsc.toobin/tz.toobin.jpg" alt="image" width="65" height="49" border="0" hspace="0" vspace="0"></a></td>'; + s += ' </tr>'; + s += '</table>'; + s += '<div><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="10"></div>'; + s += ' </td>'; + s += ' </tr>'; + s += ' <tr valign="bottom">'; + s += ' <td>'; + s += '<table width="344" border="0" cellpadding="0" cellspacing="0">'; + s += ' <tr>'; + s += ' <td width="267" nowrap style="color: #c00; padding-left: 6px"><span class="cnnBigPrint" style="vertical-align: top"><b>BUSINESS</b></span>'; + s += ' <a href="/money/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/at_cnnmoney.gif" alt=" at CNN/Money " width="100" height="15" border="0"></a></td>'; + s += ' <td width="77" align="right"><a href="/money/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/business.news.blue.gif" alt=" Business News " width="77" height="11" border="0"></a></td>'; + s += ' </tr>'; + s += '</table>'; + s += ''; + s += '<table width="344" bgcolor="#EEEEEE" border="0" cellpadding="0" cellspacing="0" style="border: solid 1px #ddd">'; + s += ' <tr valign="top">'; + s += ' <td>'; + s += ' <table width="100%" border="0" cellpadding="0" cellspacing="4">'; + s += ' <tr>'; + s += ' <td colspan="3"><span class="cnnMenuText"><b>STOCK/FUND QUOTES: </b></span></td>'; + s += ' </tr><form action="http://qs.money.cnn.com/tq/stockquote" method="get" style="margin: 0px;">'; + s += ' <tr>'; + s += ' <td><span class="cnnFinePrint">enter symbol</span></td>'; + s += ' <td><input type="text" name="symbols" size="7" maxlength="40" class="cnnMenuText" title="Enter stock/fund symbol or name to get a quote"></td>'; + s += ' <td><input type="submit" value="GET" class="cnnNavButton"></td>'; + s += ' </tr></form>'; + s += ' </table>'; + s += ' <table width="100%" border="0" cellpadding="0" cellspacing="4">'; + s += ' <tr valign="top">'; + s += ' <td><span class="cnnFinePrint">sponsored by:</span></td>'; + s += ' <td align="right"><!--<a href="/money/news/specials/rebuild_iraq/"><img src="http://i.a.cnn.net/cnn/2003/images/04/17/money.box.gif" ALT="" width="150" height="31" HSPACE="0" VSPACE="0" border="0" align="left"></a>--><a href="http://ar.atwola.com/link/93103306/aol"><img src="http://ar.atwola.com/image/93103306/aol" alt="Click Here" width="88" height="31" border="0" hspace="0" vspace="0"></a></td>'; + s += ' </tr>'; + s += ' </table>'; + s += ' </td>'; + s += ' <td class="cnnMainMarketBox"> <table width="100%" border="0" cellpadding="4" cellspacing="0" summary="Market data from CNNmoney">'; + s += ' <tr class="noBottomBorder">'; + s += ' <td colspan="5"><span class="cnnMainMarketCell"><span class="cnnMenuText"><b><a href="/money/markets/">MARKETS:</a></b></span> <!-- 16:30:15 -->'; + s += ''; + s += '4:30pm ET, 6/12</span></td>'; + s += ' </tr>'; + s += ' <tr class="noTopBorder">'; + s += ' <td><span class="cnnMainMarketCell"><a href="/money/markets/dow.html" title="Dow Jones Industrial Average">DJIA</a></span></td>'; + s += ' <td><img src="http://i.cnn.net/cnn/.element/img/1.0/main/arrow_up.gif" alt="" width="9" height="9"></td>'; + s += ' <td align="right" nowrap><span class="cnnMainMarketCell">+13.30</span></td>'; + s += ' <td align="right" nowrap><span class="cnnMainMarketCell">9196.50</span></td>'; + s += ' <td align="right" nowrap><span class="cnnMainMarketCell">+ 0.14%</span></td>'; + s += ''; + s += ' </tr>'; + s += ' <tr>'; + s += ' <td><span class="cnnMainMarketCell"><a href="/money/markets/nasdaq.html" title="NASDAQ">NAS</a></span></td>'; + s += ' <td><img src="http://i.cnn.net/cnn/.element/img/1.0/main/arrow_up.gif" alt="" width="9" height="9"></td>'; + s += ' <td align="right" nowrap><span class="cnnMainMarketCell">+ 7.60</span></td>'; + s += ' <td align="right" nowrap><span class="cnnMainMarketCell">1653.62</span></td>'; + s += ' <td align="right" nowrap><span class="cnnMainMarketCell">+ 0.46%</span></td>'; + s += ''; + s += ' </tr>'; + s += ' <tr class="noBottomBorder">'; + s += ' <td><span class="cnnMainMarketCell"><a href="/money/markets/sandp.html" title="S&P 500">S&P</a></span></td>'; + s += ' <td><img src="http://i.cnn.net/cnn/.element/img/1.0/main/arrow_up.gif" alt="" width="9" height="9"></td>'; + s += ' <td align="right" nowrap><span class="cnnMainMarketCell">+ 1.03</span></td>'; + s += ' <td align="right" nowrap><span class="cnnMainMarketCell">998.51</span></td>'; + s += ' <td align="right" nowrap><span class="cnnMainMarketCell">+ 0.10%</span></td>'; + s += ''; + s += ' </tr>'; + s += ' </table>'; + s += '</td>'; + s += ' </tr>'; + s += '</table>'; + s += ''; + s += '</td>'; + s += ' </tr>'; + s += ' <tr>'; + s += ' <td colspan="3"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="4"></td>'; + s += ' </tr>'; + s += ' <tr align="center" valign="bottom">'; + s += ' <td width="280" bgcolor="#EEEEEE"><a href="/linkto/ftn.nytimes1.html"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/ftn.280x32.ny.times.gif" width="255" height="32" alt="" border="0"></a></td>'; + s += '<td width="10"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="10" height="1"></td>'; + s += ' <td width="344" bgcolor="#EEEEEE"><a href="/linkto/ftn.bn3.html"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/ftn.345x32.breaking.news.gif" width="340" height="32" alt="" border="0"></a></td>'; + s += ' </tr>'; + s += ''; + s += '</table>'; + s += ''; + s += ''; + s += '<div><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="10"></div>'; + s += ''; + s += ''; + s += '<table width="770" border="0" cellpadding="0" cellspacing="0">'; + s += ' <col width="10">'; + s += ' <col width="483" align="left" valign="top">'; + s += ' <col width="10">'; + s += ' <col width="267" align="left" valign="top">'; + s += ' <tr valign="top">'; + s += ' <td rowspan="2"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="10" height="1"></td>'; + s += ' <td valign="top">'; + s += ' <table border="0" cellpadding="0" cellspacing="0">'; + s += ' <tr valign="top">'; + s += ' <td width="238">'; + s += ' <div><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/px_c00.gif" alt="" width="238" height="2"></div>'; + s += ''; + s += ''; + s += ''; + s += ''; + s += ''; + s += ''; + s += ' <table width="238" border="0" cellpadding="0" cellspacing="0">'; + s += ' <tr>'; + s += ' <td width="132" class="cnnTabbedBoxHeader" style="padding-left:0px;"><span class="cnnBigPrint"><b>MORE REAL TV</b></span></td>'; + s += ' <td width="106" class="cnnTabbedBoxTab" align="right" bgcolor="#336699" style="padding: 0px 3px;"><a href="/SHOWBIZ"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/entertainment.news.gif" alt="More Entertainment" border="0" width="102" height="11" hspace="2" vspace="2" align="right"></a></td>'; + s += ' </tr>'; + s += ' </table>'; + s += ' <div><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="238" height="5" vspace="0" hspace="0"></div>'; + s += ' <table width="238" border="0" cellpadding="0" cellspacing="0">'; + s += ' <tr valign="top">'; + s += ' <td><div class="cnn6pxTpad">'; + s += ' '; + s += ' <a href="/2003/SHOWBIZ/06/11/eye.ent.voyeurs/index.html">Go ahead, follow me</a><br>'; + s += 'New reality series and the movie debut of "Idol" finalists'; + s += ' </div></td>'; + s += ' <td width="71" align="right"><a href="/2003/SHOWBIZ/06/11/eye.ent.voyeurs/index.html"><img src="http://i.a.cnn.net/cnn/2003/SHOWBIZ/06/11/eye.ent.voyeurs/tz.movies.gif" alt="Go ahead, follow me" width="65" height="49" border="0" vspace="6"></a></td>'; + s += ' </tr>'; + s += ' </table>'; + s += ''; + s += ''; + s += ''; + s += ''; + s += ''; + s += ''; + s += ' '; + s += ' <div><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="238" height="5" vspace="0" hspace="0"></div>'; + s += '<!--include virtual="/.element/ssi/video/section_teases/topvideos_include.txt"-->'; + s += ' </td>'; + s += ' <td><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="7" height="1"></td>'; + s += ' <td width="238">'; + s += ' <div><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/px_c00.gif" alt="" width="238" height="2"></div>'; + s += ''; + s += ''; + s += ''; + s += ''; + s += ''; + s += ''; + s += ' <table width="238" border="0" cellpadding="0" cellspacing="0">'; + s += ' <tr>'; + s += ' <td width="157" class="cnnTabbedBoxHeader" style="padding-left:0px;"><span class="cnnBigPrint"><b>GIFT IDEAS</b></span></td>'; + s += ' <td width="81" class="cnnTabbedBoxTab" align="right" bgcolor="#336699" style="padding: 0px 3px;"><a href="/money"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/superlinks/business.gif" alt="Business News" border="0" width="77" height="11" hspace="2" vspace="2" align="right"></a></td>'; + s += ' </tr>'; + s += ' </table>'; + s += ' <div><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="238" height="5" vspace="0" hspace="0"></div>'; + s += ' <table width="238" border="0" cellpadding="0" cellspacing="0">'; + s += ' <tr valign="top">'; + s += ' <td><div class="cnn6pxTpad">'; + s += ''; + s += ''; + s += '<span class="cnnBodyText" style="font-weight:bold;">CNN/Money: </span> <a href="/money/2003/06/12/news/companies/fathers_day/index.htm?cnn=yes">Fathers Day</a><br>'; + s += 'Smaller is better --from digital cameras to iPod'; + s += ' </div></td>'; + s += ' <td width="71" align="right"><a href="/money/2003/06/12/news/companies/fathers_day/index.htm?cnn=yes"><img src="http://i.a.cnn.net/cnn/images/programming.boxes/tz.money.dads.day.watch.jpg" alt="Fathers Day" width="65" height="49" border="0" vspace="6"></a></td>'; + s += ' </tr>'; + s += ' </table>'; + s += ' </td>'; + s += ' </tr>'; + s += ' </table>'; + s += ' <div><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="238" height="10" vspace="0" hspace="0"></div> '; + s += '<table width="483" border="0" cellspacing="0" cellpadding="0">'; + s += ' <tr valign="top">'; + s += ' <td rowspan="9"><br></td>'; + s += ' <td width="238"><a href="/US/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/us.gif" alt="U.S. News: " width="238" height="15" border="0"></a><br><div class="cnnMainSections">'; + s += ''; + s += ' '; + s += '• <a href="/2003/US/South/06/11/miami.rapist/index.html">Miami police link 4 rapes to serial rapist</a><br>'; + s += ''; + s += ' '; + s += '• <a href="/2003/LAW/06/12/mistaken.identity.ap/index.html">Woman mistaken for fugitive jailed</a><br>'; + s += ''; + s += ' '; + s += '• <a href="/2003/US/Northeast/06/12/woman.impaled.ap/index.html">Pregnant woman impaled on mic stand</a><br>'; + s += ' </div></td>'; + s += ' <td rowspan="7" width="7"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="7" height="1"></td>'; + s += ' <td width="238"><a href="/WORLD/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/world.gif" alt="World News: " width="238" height="15" border="0"></a><br><div class="cnnMainSections">'; + s += ''; + s += ' '; + s += '• <a href="/2003/WORLD/europe/06/12/nato.bases/index.html">NATO reshapes for new era</a><br>'; + s += ''; + s += ' '; + s += '• <a href="/2003/WORLD/africa/06/12/congo.democratic/index.html">U.N. reviews Bunia peace force</a><br>'; + s += ''; + s += ''; + s += ''; + s += '• <span class="cnnBodyText" style="font-weight:bold;color:#900;">TIME.com: </span><a href="/time/magazine/article/0,9171,1101030616-457361,00.html?CNN=yes" target="new">Saddams curtain trail</a><img src="http://i.cnn.net/cnn/.element/img/1.0/misc/icon.external.links.gif" alt="external link" width="20" height="13" vspace="1" hspace="4" border="0" align="top"><br>'; + s += ' </div></td>'; + s += ' </tr><tr valign="top">'; + s += ' <td width="238"><a href="/TECH/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/technology.gif" alt="Sci-Tech News: " width="238" height="15" border="0"></a><br><div class="cnnMainSections">'; + s += ''; + s += ' '; + s += '• <a href="/2003/TECH/ptech/06/11/bus2.ptech.dvd.maker/index.html">Another reason to throw out your VCR</a><br>'; + s += ''; + s += ' '; + s += '• <a href="/2003/TECH/ptech/06/12/korea.samsung.reut/index.html">Flat screen TV prices dropping</a><br>'; + s += ' </div></td>'; + s += ' <td width="238"><a href="/SHOWBIZ/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/entertainment.gif" alt="Entertainment News: " width="238" height="15" border="0"></a><br><div class="cnnMainSections">'; + s += ''; + s += ' '; + s += '• <a href="/2003/SHOWBIZ/TV/06/12/cnn.obrien/index.html">CNN hires Soledad OBrien for "AM"</a><br>'; + s += ''; + s += ' '; + s += '• <a href="/2003/SHOWBIZ/TV/06/11/batchelor.troubles.ap/index.html">Dating show star let go by law firm</a><br>'; + s += ' </div></td>'; + s += ' </tr><tr valign="top">'; + s += ' <td width="238"><a href="/ALLPOLITICS/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/politics.gif" alt="Politics News: " width="238" height="15" border="0"></a><br><div class="cnnMainSections">'; + s += ''; + s += ' '; + s += '• <a href="/2003/ALLPOLITICS/06/11/schwarzenegger.ap/index.html">Schwarzenegger on California politics</a><br>'; + s += ''; + s += ' '; + s += '• <a href="/2003/ALLPOLITICS/06/12/tax.credit.ap/index.html">House approves extension on child tax credit</a><br>'; + s += ' </div></td>'; + s += ' <td width="238"><a href="/LAW/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/law.gif" alt="Law News: " width="238" height="15" border="0"></a><br><div class="cnnMainSections">'; + s += ''; + s += ' '; + s += '• <a href="/2003/LAW/06/12/plaintiff.advances.ap/index.html">Court bars cash advances to plaintiffs</a><br>'; + s += ''; + s += ' '; + s += '• <a href="/2003/LAW/06/11/jackson.lawsuit.ap/index.html">Lawsuit against Jackson settled</a><br>'; + s += ' </div></td>'; + s += ' </tr><tr valign="top">'; + s += ' <td width="238"><a href="/HEALTH/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/health.gif" alt="Health News: " width="238" height="15" border="0"></a><br><div class="cnnMainSections">'; + s += ''; + s += ' '; + s += '• <a href="/2003/HEALTH/06/12/monkeypox.ap/index.html">Monkeypox spreading person-to-person?</a><br>'; + s += ''; + s += ' '; + s += '• <a href="/2003/HEALTH/06/12/quick.xray.ap/index.html">A full body X-ray in 13 seconds</a><br>'; + s += ' </div></td>'; + s += ' <td width="238"><a href="/TECH/space/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/space.gif" alt="Space News: " width="238" height="15" border="0"></a><br><div class="cnnMainSections">'; + s += ''; + s += ' '; + s += '• <a href="/2003/TECH/science/06/12/hydrogen.ozone.ap/index.html">Hydrogen fuel may disturb ozone layer</a><br>'; + s += ''; + s += ' '; + s += '• <a href="/2003/TECH/space/06/12/sprj.colu.bolts.ap/index.html">New threat found for shuttle launches</a><br>'; + s += ' </div></td>'; + s += ' </tr><tr valign="top">'; + s += ' <td width="238"><a href="/TRAVEL/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/travel.gif" alt="Travel News: " width="238" height="15" border="0"></a><br><div class="cnnMainSections">'; + s += ''; + s += ' '; + s += '• <a href="/2003/TRAVEL/DESTINATIONS/06/12/walk.across.america.ap/index.html">Walking America from coast to coast</a><br>'; + s += ''; + s += ' '; + s += '• <a href="/2003/TRAVEL/06/11/bi.airlines.executives.reut/index.html">Airline execs not seeing sunny skies yet</a><br>'; + s += ' </div></td>'; + s += ' <td width="238"><a href="/EDUCATION/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/education.gif" alt="Education News: " width="238" height="15" border="0"></a><br><div class="cnnMainSections">'; + s += ''; + s += ' '; + s += '• <a href="/2003/EDUCATION/06/12/arabs.prom.ap/index.html">Arab students seek prom balance</a><br>'; + s += ''; + s += ' '; + s += '• <a href="/2003/EDUCATION/06/11/school.fundraising.ap/index.html">Public schools turn to upscale fundraising</a><br>'; + s += ' </div></td>'; + s += ' </tr><tr valign="top">'; + s += ' <td width="238"><a href="/si/index.html?cnn=yes"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/sports.gif" alt="Sports News: " width="238" height="15" border="0"></a><br><div class="cnnMainSections">'; + s += ''; + s += '• <a href="/cnnsi/golfonline/2003/us_open/news/2003/06/12/open_thursday_ap">Woods eyes third U.S. Open title</a><br>'; + s += '• <a href="/cnnsi/basketball/news/2003/06/12/jordan_ruling_ap">Judge denies Jordan's former lover $5M payoff</a><br>'; + s += ' </div></td>'; + s += ' <td width="238"><a href="/money/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/business.gif" alt="Business News: " width="238" height="15" border="0"></a><br><div class="cnnMainSections">'; + s += '• <a href="/money/2003/06/12/pf/saving/duppies/index.htm">Here come the "Duppies"</a><br>'; + s += '• <a href="/money/2003/06/12/technology/oracle/index.htm">Oracle beats estimates</a><br>'; + s += ' </div></td>'; + s += ' </tr>'; + s += '</table>'; + s += ' </td>'; + s += ' <td><img src="http://i.cnn.net/cnn/images/1.gif" width="10" hspace="0" vspace="0" alt=""></td>'; + s += ' <td valign="top">'; + s += ' <div><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/px_c00.gif" alt="" width="267" height="2"></div>'; + s += ' '; + s += '<table width="267" border="0" cellpadding="0" cellspacing="0">'; + s += ' <tr>'; + s += ' <td width="173" bgcolor="#003366"><div class="cnnBlueBoxHeader"><span class="cnnBigPrint"><b>WATCH CNN TV</b></span></div></td>'; + s += ' <td width="25" class="cnnBlueBoxHeader" align="right"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/misc/diagonal.gif" width="25" height="19" alt=""></td>'; + s += ' <td width="69" class="cnnBlueBoxTab" align="right" bgcolor="#336699"><a href="/CNN/Programs/"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/tv.schedule.gif" alt="On CNN TV" border="0" width="65" height="11" hspace="2" vspace="2" align="right"></a></td>'; + s += ' </tr>'; + s += '</table>'; + s += '<table width="267" bgcolor="#EEEEEE" border="0" cellpadding="4" cellspacing="0">'; + s += ' <tr valign="top">'; + s += ' <td><a href="/CNN/Programs/american.morning/"><img src="http://i.cnn.net/cnn/CNN/Programs/includes/showbox/images/2003/05/tz.hemmer.jpg" alt="American Morning, 7 a.m. ET" width="65" height="49" border="0" align="right"></a><a href="/CNN/Programs/american.morning/"><b>American Morning (7 a.m. ET):</b></a> Tomorrow, singer Carnie Wilson talks about her new book, "Im Still Hungry."'; + s += ' </td>'; + s += ' </tr>'; + s += '</table>'; + s += ''; + s += '<!--'; + s += '[[table width="267" border="0" cellpadding="0" cellspacing="0"]]'; + s += '[[tr]][[td width="173" bgcolor="#003366"]][[div class="cnnBlueBoxHeader"]][[span class="cnnBigPrint"]][[b]]WATCH CNN TV[[/b]][[/span]][[/div]][[/td]][[td width="25" class="cnnBlueBoxHeader" align="right"]][[img src="http://i.a.cnn.net/cnn/.element/img/1.0/misc/diagonal.gif" width="25" height="19" alt=""]][[/td]][[td width="69" class="cnnBlueBoxTab" align="right" bgcolor="#336699"]][[a href="/CNN/Programs/"]][[img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/tv.schedule.gif" alt="On CNN TV" border="0" width="65" height="11" hspace="2" vspace="2" align="right"]][[/a]][[/td]][[/tr]][[/table]][[table width="267" bgcolor="#EEEEEE" border="0" cellpadding="4" cellspacing="0"]][[tr valign="top"]][[td]]'; + s += '[[img src="http://i.cnn.net/cnn/2003/images/05/31/tz.bw.jpg" alt="" width="65" height="49" border="0" align="right"]]'; + s += ' '; + s += '[[b]] CNN Presents: The Hunt for Eric Robert Rudolph (8 p.m. ET)[[/b]][[br]]Latest on his capture.'; + s += ' [[/td]]'; + s += ' [[/tr]]'; + s += ' [[/table]]'; + s += '-->'; + s += ''; + s += ' <div><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="10"></div> '; + s += ''; + s += ''; + s += ''; + s += ''; + s += ''; + s += ''; + s += ' <div><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/px_c00.gif" alt="" width="267" height="2"></div>'; + s += ' <table width="267" border="0" cellpadding="0" cellspacing="0">'; + s += ' <tr>'; + s += ' <td width="184" bgcolor="#003366"><div class="cnnBlueBoxHeader"><span class="cnnBigPrint"><b>ANALYSIS</b></span></div></td>'; + s += ' <td width="25" class="cnnBlueBoxHeader" align="right"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/misc/diagonal.gif" width="25" height="19" alt=""></td>'; + s += ' <td width="58" class="cnnBlueBoxTab" align="right" bgcolor="#336699"><a href="/US"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/superlinks/us.gif" alt="U.S. News" border="0" width="54" height="11" hspace="2" vspace="2" align="right"></a></td>'; + s += ' </tr>'; + s += ' </table>'; + s += ' <table width="267" bgcolor="#EEEEEE" border="0" cellpadding="4" cellspacing="0">'; + s += ' <tr valign="top">'; + s += ' <td>'; + s += '<a href="/2003/US/06/12/nyt.safire/index.html"><img src="http://i.a.cnn.net/cnn/2003/US/06/12/nyt.safire/tz.stewart.jpg" alt="Fight It, Martha" width="65" height="49" border="0" align="right"></a>'; + s += ''; + s += ''; + s += '<span class="cnnBodyText" style="font-weight:bold;color:#000;">NYTimes: </span> <a href="/2003/US/06/12/nyt.safire/index.html">Fight It, Martha</a><br>'; + s += 'William Safire: I hope Martha Stewart beats this bum rap'; + s += ''; + s += ''; + s += ''; + s += ''; + s += ' </td>'; + s += ' </tr>'; + s += ' </table>'; + s += ' <div><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="10"></div>'; + s += ' <div><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/px_c00.gif" alt="" width="267" height="2"></div>'; + s += ' <table width="267" border="0" cellpadding="0" cellspacing="0">'; + s += ' <tr>'; + s += ' <td width="164" bgcolor="#003366"><div class="cnnBlueBoxHeader"><span class="cnnBigPrint"><b>OFFBEAT</b></span></div></td>'; + s += ' <td width="25" class="cnnBlueBoxHeader" align="right"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/misc/diagonal.gif" width="25" height="19" alt=""></td>'; + s += ' <td width="78" class="cnnBlueBoxTab" align="right" bgcolor="#336699"><a href="/offbeat"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/superlinks/offbeat.gif" alt="more offbeat" width="74" height="11" border="0" hspace="2" vspace="2" align="right"></a></td>'; + s += ' </tr>'; + s += ' </table>'; + s += ' <table width="267" bgcolor="#DDDDDD" border="0" cellpadding="4" cellspacing="0">'; + s += ' <tr valign="top">'; + s += ' <td>'; + s += '<a href="/2003/HEALTH/06/12/offbeat.china.sperm.ap/index.html"><img src="http://i.a.cnn.net/cnn/2003/HEALTH/06/12/offbeat.china.sperm.ap/tz.china.sperm.jpg" alt="Waiting list" width="65" height="49" border="0" align="right"></a>'; + s += ' '; + s += ' <a href="/2003/HEALTH/06/12/offbeat.china.sperm.ap/index.html">Waiting list</a><br>'; + s += 'Chinas "smart sperm" bank needs donors'; + s += ' </td>'; + s += ' </tr>'; + s += ' </table>'; + s += ' <div><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="10"></div>'; + s += ''; + s += ' <table width="267" bgcolor="#999999" border="0" cellpadding="0" cellspacing="0">'; + s += ' <tr>'; + s += ' <td>'; + s += ' <table width="100%" border="0" cellpadding="4" cellspacing="1">'; + s += ' <tr>'; + s += ' <td bgcolor="#EEEEEE" class="cnnMainWeatherBox"><a name="weatherBox"></a>'; + s += ''; + s += ''; + s += ''; + s += ''; + s += ''; + s += ''; + s += '<table width="257" border="0" cellpadding="1" cellspacing="0">'; + s += '<form method="get" action="http://weather.cnn.com/weather/search" style="margin: 0px">'; + s += '<input type="hidden" name="mode" value="hplwp">'; + s += ' <tr>'; + s += ' <td bgcolor="#FFFFFF"><table width="255" bgcolor="#EAEFF4" border="0" cellpadding="4" cellspacing="0">'; + s += ' <tr>'; + s += ' <td colspan="2" class="cnnWEATHERrow"> <span class="cnnBigPrint">WEATHER</span></td>'; + s += ' </tr>'; + s += ' <tr>'; + s += ' <td colspan="2" class="cnnBodyText">Get your hometown weather on the home page! <b>Enter city name or U.S. Zip Code:</b></td>'; + s += ' </tr>'; + s += ' <tr>'; + s += ' <td><input class="cnnFormText" type="text" size="12" name="wsearch" value="" style="width:100px;"></td>'; + s += ' <td><input class="cnnNavButton" type="submit" value="PERSONALIZE"></td>'; + s += ' </tr>'; + s += ' <tr>'; + s += ' <td class="cnnBodyText" colspan="2">Or <a href="javascript:CNN_openPopup("http://weather.cnn.com/weather/select.popup/content2.jsp?mode=hplwp", "weather", "toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,width=260,height=250")"><b>select location from a list</b></a></td>'; + s += ' </tr>'; + s += ' </table></td>'; + s += ' </tr>'; + s += '</form>'; + s += '</table>'; + s += ''; + s += ''; + s += ''; + s += ' </td>'; + s += ' </tr>'; + s += ' <tr>'; + s += ' <td bgcolor="#EEEEEE">'; + s += ' <table width="100%" border="0" cellpadding="0" cellspacing="2">'; + s += ' <tr>'; + s += ' <td><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/quickvote.gif" alt="Quick Vote" width="107" height="24" border="0"></td>'; + s += ' <td width="88" align="right"><!-- ad home/quickvote/sponsor.88x31 -->'; + s += '<!-- ad commented while aol investigates 3/31/03 5:40 a.m. lk -->'; + s += '<a href="http://ar.atwola.com/link/93101912/aol"><img src="http://ar.atwola.com/image/93101912/aol" alt="Click Here" width="88" height="31" border="0" hspace="0" vspace="0"></a>'; + s += '</td>'; + s += ' </tr>'; + s += ' </table>'; + s += '<table width="100%" cellspacing="0" cellpadding="1" border="0"><form target="popuppoll" method="post" action="http://polls.cnn.com/poll">'; + s += '<INPUT TYPE=HIDDEN NAME="poll_id" VALUE="3966">'; + s += '<tr><td colspan="2" align="left"><span class="cnnBodyText">Should an international peacekeeping force be sent to the Mideast?<br></span></td></tr>'; + s += '<tr valign="top">'; + s += '<td><span class="cnnBodyText">Yes</span>'; + s += '</td><td align="right"><input value="1" type="radio" name="question_1"></td></tr>'; + s += '<tr valign="top">'; + s += '<td><span class="cnnBodyText">No</span>'; + s += '</td><td align="right"><input value="2" type="radio" name="question_1"></td></tr>'; + s += '<!-- /end Question 1 -->'; + s += '<tr>'; + s += '<td colspan="2">'; + s += '<table width="100%" cellspacing="0" cellpadding="0" border="0"><tr><td><span class="cnnInterfaceLink"><nobr><a href="javascript:CNN_openPopup("/POLLSERVER/results/3966.html","popuppoll","toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,width=510,height=400")">VIEW RESULTS</a></nobr></span></td>'; + s += '<td align="right"><input class="cnnFormButton" onclick="CNN_openPopup("","popuppoll","toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,width=510,height=400")" value="VOTE" type="SUBMIT"></td></tr></table></td></tr>'; + s += '</form></table>'; + s += ''; + s += ' </td>'; + s += ' </tr>'; + s += '</table>'; + s += ''; + s += ' </td>'; + s += ' </tr>'; + s += ' </table>'; + s += ' <!-- /right --></td>'; + s += ' </tr>'; + s += ' <tr>'; + s += ' <td colspan="3" valign="bottom"> <img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/px_ccc.gif" alt="" width="483" height="1"> </td>'; + s += ' </tr>'; + s += '</table>'; + s += '<table width="770" border="0" cellpadding="0" cellspacing="0" summary="Links to stories from CNN partners">'; + s += ' <col width="10">'; + s += ' <col width="250" align="left" valign="top">'; + s += ' <col width="5">'; + s += ' <col width="250" align="left" valign="top">'; + s += ' <col width="5">'; + s += ' <col width="250" align="left" valign="top">'; + s += ' <tr><td colspan="6"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="2"></td></tr>'; + s += ' <tr valign="top">'; + s += ' <td rowspan="6" width="10"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="10" height="1"></td>'; + s += ' <td colspan="3"><span class="cnnMenuText" style="font-size: 12px"><b style="color: #c00">From our Partners</b></span>'; + s += ' <img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/icon_external.gif" alt=" External site icon " width="20" height="13" border="0" align="middle"></td>'; + s += ' <td colspan="2"></td>'; + s += ' </tr>'; + s += ' <tr><td colspan="5"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="2"></td></tr>'; + s += ' <tr><td colspan="5" bgcolor="#CCCCCC"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="1"></td></tr>'; + s += ' <tr><td colspan="5"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="2"></td></tr>'; + s += ' <tr valign="top">'; + s += ' <td class="cnnMainSections" width="250">'; + s += '<a href="/time/" target="new"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/partner_time.gif" alt="Time: " width="70" height="17" border="0"></a><br><div style="margin-top: 4px"> • <a target="new" href="/time/magazine/article/0,9171,1101030616-457387,00.html?CNN=yes">Where the Jobs Are</a><br> • <a target="new" href="/time/magazine/article/0,9171,1101030616-457373,00.html?CNN=yes">Of Dogs and Men</a><br> • <a target="new" href="/time/photoessays/gunmen/?CNN=yes">Photo Essay: Fighting the Peace</a><br></div><table border="0"><tr><td><img height="1" width="1" alt="" src="http://i.cnn.net/cnn/images/1.gif"/></td></tr><tr bgcolor="#dddddd"><td> <a target="new" href="/linkto/time.main.html">Subscribe to TIME</a> </td></tr></table> </td>'; + s += ' <td width="5"><br></td>'; + s += ' <td class="cnnMainSections" width="250">'; + s += '<a href="/cnnsi/index.html?cnn=yes"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/partner_si.gif" alt="CNNsi.com: " width="138" height="17" border="0"></a><br><div style="margin-top: 4px">'; + s += '• Marty Burns: <a target="new" href="/cnnsi/inside_game/marty_burns/news/2003/06/11/burns_game4/">Nets pull out all stops</a><br>'; + s += '• Michael Farber: <a target="new" href="/cnnsi/inside_game/michael_farber/news/2003/06/11/farber_wrapup/">Sens look good for "04</a><br>'; + s += '• Tim Layden: <a target="new" href="/cnnsi/inside_game/tim_layden/news/2003/06/11/layden_neuheisel/">NFL or bust for Neuheisel</a><br>'; + s += '</div>'; + s += '<table border="0"><tr><td><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="1"></td></tr><tr bgcolor="#dddddd"><td> <a href="http://subs.timeinc.net/CampaignHandler/si_cnnsi?source_id=19">Subscribe to Sports Illustrated</a> </td></tr></table>'; + s += ' </td>'; + s += ' <td width="5"><br></td>'; + s += ' <td class="cnnMainSections" width="250">'; + s += '<a href="/linkto/nyt/main.banner.html" target="new"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/partners_nyt.gif" alt="New York Times: " width="105" height="17" border="0"></a><br><div style="margin-top: 4px"> • <a target="new" href="/linkto/nyt/story/1.0612.html">U.S. Widens Checks at Foreign Ports</a><br> • <a target="new" href="/linkto/nyt/story/2.0612.html">Rumsfeld: Iran Developing Nuclear Arms</a><br> • <a target="new" href="/linkto/nyt/story/3.0612.html">Vandalism, "Improvements" Mar Great Wall</a><br></div><table border="0"><tr><td><img height="1" width="1" alt="" src="http://i.cnn.net/cnn/images/1.gif"/></td></tr><tr bgcolor="#dddddd"><td> <a target="new" href="/linkto/nyt.main.html">Get 50% OFF the NY Times</a> </td></tr></table> </td>'; + s += ' </tr>'; + s += ''; + s += '</table>'; + s += '<div><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="2"></div>'; + s += ''; + s += '<table width="770" border="0" cellpadding="0" cellspacing="0">'; + s += ' <tr>'; + s += ' <td width="10"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="10" height="10"></td>'; + s += ' <td width="760">'; + s += '<!-- floor -->'; + s += ''; + s += '<table width="100%" border="0" cellpadding="0" cellspacing="0"><tr><td bgcolor="#999999"><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="1"></td></tr></table>'; + s += ''; + s += '<div><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="1"></div>'; + s += ''; + s += '<table width="100%" bgcolor="#DEDEDE" border="0" cellpadding="3" cellspacing="0">'; + s += ' <tr> '; + s += ' <td><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="5" height="5"></td>'; + s += ' <td><a href="http://edition.cnn.com/" class="cnnFormTextB" onClick="clickEdLink()" style="color:#000;">International Edition</a></td>'; + s += '<form>'; + s += ' <td><select title="CNN.com is available in different languages" class="cnnMenuText" name="languages" size="1" style="font-weight: bold; vertical-align: middle" onChange="if (this.options[selectedIndex].value != "") location.href=this.options[selectedIndex].value">'; + s += ' <option value="" disabled selected>Languages</option>'; + s += ' <option value="" disabled>---------</option>'; + s += ' <option value="/cnnes/">Spanish</option>'; + s += ' <option value="http://cnn.de/">German</option>'; + s += ' <option value="http://cnnitalia.it/">Italian</option>'; + s += ' <option value="http://www.joins.com/cnn/">Korean</option>'; + s += ' <option value="http://arabic.cnn.com/">Arabic</option>'; + s += ' <option value="http://www.CNN.co.jp/">Japanese</option>'; + s += ' </select></td>'; + s += '</form>'; + s += ' <td><a href="/CNN/Programs/" class="cnnFormTextB" style="color:#000;">CNN TV</a></td>'; + s += ' <td><a href="/CNNI/" class="cnnFormTextB" style="color:#000;">CNN International</a></td>'; + s += ' <td><a href="/HLN/" class="cnnFormTextB" style="color:#000;">Headline News</a></td>'; + s += ' <td><a href="/TRANSCRIPTS/" class="cnnFormTextB" style="color:#000;">Transcripts</a></td>'; + s += ' <td><a href="/services/preferences/" title="Customize your CNN.com experience" class="cnnFormTextB" style="color:#000;">Preferences</a></td>'; + s += ' <td><a href="/INDEX/about.us/" class="cnnFormTextB" style="color:#000;">About CNN.com</a></td>'; + s += ' </tr>'; + s += '</table>'; + s += ''; + s += '<div><img src="http://i.cnn.net/cnn/images/1.gif" alt="" width="1" height="1"></div>'; + s += ''; + s += '<table width="100%" bgcolor="#EFEFEF" border="0" cellpadding="4" cellspacing="0">'; + s += ' <tr valign="top"> '; + s += ' <td style="padding-left:10px"><div class="cnnSectCopyright">'; + s += '<b>© 2003 Cable News Network LP, LLLP.</b><br>'; + s += 'An AOL Time Warner Company. All Rights Reserved.<br>'; + s += '<a href="/interactive_legal.html">Terms</a> under which this service is provided to you.<br>'; + s += 'Read our <a href="/privacy.html">privacy guidelines</a>. <a href="/feedback/">Contact us</a>.'; + s += ' </div></td>'; + s += ' <td align="right"><table border="0" cellpadding="4" cellspacing="0">'; + s += ' <tr> '; + s += ' <td rowspan="2" align="middle"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/sect/SEARCH/dotted.line.gif" alt="" width="7" height="46"></td>'; + s += ' <td><img src="http://i.a.cnn.net/cnn/.element/img/1.0/misc/icon.external.links.gif" alt="external link" width="20" height="13"></td>'; + s += ' <td><div class="cnnSectExtSites">All external sites will open in a new browser.<br>'; + s += ' CNN.com does not endorse external sites.</div></td>'; + s += ' <td rowspan="2" align="middle"><img src="http://i.a.cnn.net/cnn/.element/img/1.0/sect/SEARCH/dotted.line.gif" alt="" width="7" height="46"></td>'; + s += ' <td rowspan="2"><!-- home/powered_by/sponsor.88x31 -->'; + s += '<script language="JavaScript1.1">'; + s += '<!--'; + s += 'adSetTarget("_top");'; + s += 'htmlAdWH( (new Array(93103308,93103308,93103308,93103308))[document.adoffset||0] , 88, 31);'; + s += '//-->'; + s += '</script><noscript><a href="http://ar.atwola.com/link/93103308/aol" target="_top"><img src="http://ar.atwola.com/image/93103308/aol" alt="Click here for our advertiser" width="88" height="31" border="0"></a></noscript>'; + s += '</td>'; + s += ' </tr>'; + s += ' <tr valign="top"> '; + s += ' <td><img src="http://i.a.cnn.net/cnn/.element/img/1.0/main/icon_premium.gif" alt=" Premium content icon " width="9" height="11"></td>'; + s += ' <td><span class="cnnSectExtSites">Denotes premium content.</span></td>'; + s += ' </tr>'; + s += ' </table></td>'; + s += ' </tr>'; + s += '</table>'; + s += ''; + s += '<!-- /floor --></td>'; + s += ' </tr>'; + s += '</table>'; + s += ''; + s += ''; + s += ''; + s += '<!-- popunder ad generic/popunder_launch.720x300 -->'; + s += '<script language="JavaScript1.1" type="text/javascript">'; + s += '<!--'; + s += 'if (document.adPopupFile) {'; + s += ' if (document.adPopupInterval == null) {'; + s += ' document.adPopupInterval = "0";'; + s += ' }'; + s += ' if (document.adPopunderInterval == null) {'; + s += ' document.adPopunderInterval = document.adPopupInterval;'; + s += ' }'; + s += ' if (document.adPopupDomain != null) {'; + s += ' adSetPopDm(document.adPopupDomain);'; + s += ' }'; + s += ' adSetPopupWH("93162673", "720", "300", document.adPopupFile, document.adPopunderInterval, 20, 50, -1);'; + s += '}'; + s += '// -->'; + s += '</script>'; + s += ' '; + s += '<!-- home/bottom.eyeblaster -->'; + s += '<script language="JavaScript1.1" type="text/javascript">'; + s += '<!--'; + s += 'var MacPPC = (navigator.platform == "MacPPC") ? true : false;'; + s += 'if (!MacPPC) {'; + s += 'adSetType("J");'; + s += 'htmlAdWH( (new Array(93137910,93137910,93137910,93137910))[document.adoffset||0], 101, 1);'; + s += 'adSetType("");'; + s += '}'; + s += '// -->'; + s += '</script>'; + s += ''; + s += '<script language="JavaScript1.1" src="http://ar.atwola.com/file/adsEnd.js"></script>'; + s += ''; + s += '<img src="/cookie.crumb" alt="" width="1" height="1">'; + s += '<!--include virtual="/virtual/2002/main/survey.html"-->'; + s += '</body>'; + s += '</html>'; + + return s; + } diff --git a/js/src/tests/ecma_3/RegExp/regress-209919.js b/js/src/tests/ecma_3/RegExp/regress-209919.js new file mode 100644 index 000000000..369b63df5 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-209919.js @@ -0,0 +1,140 @@ +/* -*- 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: 19 June 2003 + * SUMMARY: Testing regexp submatches with quantifiers + * + * See http://bugzilla.mozilla.org/show_bug.cgi?id=209919 + * + */ +//----------------------------------------------------------------------------- +var i = 0; +var BUGNUMBER = 209919; +var summary = 'Testing regexp submatches with quantifiers'; +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(); + + +/* + * Waldemar: "ECMA-262 15.10.2.5, third algorithm, step 2.1 states that + * once the minimum repeat count (which is 0 for *, 1 for +, etc.) has + * been satisfied, an atom being repeated must not match the empty string." + * + * In this example, the minimum repeat count is 0, so the last thing the + * capturing parens is permitted to contain is the 'a'. It may NOT go on + * to capture the '' at the $ position of 'a', even though '' satifies + * the condition b* + * + */ +status = inSection(1); +string = 'a'; +pattern = /(a|b*)*/; +actualmatch = string.match(pattern); +expectedmatch = Array(string, 'a'); +addThis(); + + +/* + * In this example, the minimum repeat count is 5, so the capturing parens + * captures the 'a', then goes on to capture the '' at the $ position of 'a' + * 4 times before it has to stop. Therefore the last thing it contains is ''. + */ +status = inSection(2); +string = 'a'; +pattern = /(a|b*){5,}/; +actualmatch = string.match(pattern); +expectedmatch = Array(string, ''); +addThis(); + + +/* + * Reduction of the above examples to contain only the condition b* + * inside the capturing parens. This can be even harder to grasp! + * + * The global match is the '' at the ^ position of 'a', but the parens + * is NOT permitted to capture it since the minimum repeat count is 0! + */ +status = inSection(3); +string = 'a'; +pattern = /(b*)*/; +actualmatch = string.match(pattern); +expectedmatch = Array('', undefined); +addThis(); + + +/* + * Here we have used the + quantifier (repeat count 1) outside the parens. + * Therefore the parens must capture at least once before stopping, so it + * does capture the '' this time - + */ +status = inSection(4); +string = 'a'; +pattern = /(b*)+/; +actualmatch = string.match(pattern); +expectedmatch = Array('', ''); +addThis(); + + +/* + * More complex examples - + */ +pattern = /^\-?(\d{1,}|\.{0,})*(\,\d{1,})?$/; + +status = inSection(5); +string = '100.00'; +actualmatch = string.match(pattern); +expectedmatch = Array(string, '00', undefined); +addThis(); + +status = inSection(6); +string = '100,00'; +actualmatch = string.match(pattern); +expectedmatch = Array(string, '100', ',00'); +addThis(); + +status = inSection(7); +string = '1.000,00'; +actualmatch = string.match(pattern); +expectedmatch = Array(string, '000', ',00'); +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/RegExp/regress-216591.js b/js/src/tests/ecma_3/RegExp/regress-216591.js new file mode 100644 index 000000000..4c293559c --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-216591.js @@ -0,0 +1,83 @@ +/* -*- 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: 19 August 2003 + * SUMMARY: Regexp conformance test + * + * See http://bugzilla.mozilla.org/show_bug.cgi?id=216591 + * + */ +//----------------------------------------------------------------------------- +var i = 0; +var BUGNUMBER = 216591; +var summary = 'Regexp conformance test'; +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(); + + +status = inSection(1); +string = 'a {result.data.DATA} b'; +pattern = /\{(([a-z0-9\-_]+?\.)+?)([a-z0-9\-_]+?)\}/i; +actualmatch = string.match(pattern); +expectedmatch = Array('{result.data.DATA}', 'result.data.', 'data.', 'DATA'); +addThis(); + +/* + * Add a global flag to the regexp. In Perl 5, this gives the same results as above. Compare: + * + * [ ] perl -e '"a {result.data.DATA} b" =~ /\{(([a-z0-9\-_]+?\.)+?)([a-z0-9\-_]+?)\}/i; print("$&, $1, $2, $3");' + * {result.data.DATA}, result.data., data., DATA + * + * [ ] perl -e '"a {result.data.DATA} b" =~ /\{(([a-z0-9\-_]+?\.)+?)([a-z0-9\-_]+?)\}/gi; print("$&, $1, $2, $3");' + * {result.data.DATA}, result.data., data., DATA + * + * + * But in JavaScript, there will no longer be any sub-captures: + */ +status = inSection(2); +string = 'a {result.data.DATA} b'; +pattern = /\{(([a-z0-9\-_]+?\.)+?)([a-z0-9\-_]+?)\}/gi; +actualmatch = string.match(pattern); +expectedmatch = Array('{result.data.DATA}'); +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/RegExp/regress-220367-001.js b/js/src/tests/ecma_3/RegExp/regress-220367-001.js new file mode 100644 index 000000000..05ef72106 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-220367-001.js @@ -0,0 +1,70 @@ +/* -*- 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 i = 0; +var BUGNUMBER = 220367; +var summary = 'Regexp conformance test'; +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(); + + +status = inSection(1); +string = 'a'; +pattern = /(a)|(b)/; +actualmatch = string.match(pattern); +expectedmatch = Array(string, 'a', undefined); +addThis(); + +status = inSection(2); +string = 'b'; +pattern = /(a)|(b)/; +actualmatch = string.match(pattern); +expectedmatch = Array(string, undefined, 'b'); +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/RegExp/regress-223273.js b/js/src/tests/ecma_3/RegExp/regress-223273.js new file mode 100644 index 000000000..0d88d1015 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-223273.js @@ -0,0 +1,245 @@ +/* -*- 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: 23 October 2003 + * SUMMARY: Unescaped, unbalanced parens in a regexp should cause SyntaxError. + * + * The same would also be true for unescaped, unbalanced brackets or braces + * if we followed the ECMA-262 Ed. 3 spec on this. But it was decided for + * backward compatibility reasons to follow Perl 5, which permits + * + * 1. an unescaped, unbalanced right bracket ] + * 2. an unescaped, unbalanced left brace { + * 3. an unescaped, unbalanced right brace } + * + * If any of these should occur, Perl treats each as a literal + * character. Therefore we permit all three of these cases, even + * though not ECMA-compliant. Note Perl errors on an unescaped, + * unbalanced left bracket; so will we. + * + * See http://bugzilla.mozilla.org/show_bug.cgi?id=223273 + * + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = 223273; +var summary = 'Unescaped, unbalanced parens in regexp should be a SyntaxError'; +var TEST_PASSED = 'SyntaxError'; +var TEST_FAILED = 'Generated an error, but NOT a SyntaxError!'; +var TEST_FAILED_BADLY = 'Did not generate ANY error!!!'; +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 = []; + + +/* + * All the following contain unescaped, unbalanced parens and + * should generate SyntaxErrors. That's what we're testing for. + * + * To allow the test to compile and run, we have to hide the errors + * inside eval strings, and check they are caught at run-time. + * + * Inside such strings, remember to escape any escape character! + */ +status = inSection(1); +testThis(' /(/ '); + +status = inSection(2); +testThis(' /)/ '); + +status = inSection(3); +testThis(' /(abc\\)def(g/ '); + +status = inSection(4); +testThis(' /\\(abc)def)g/ '); + + +/* + * These regexp patterns are correct and should not generate + * any errors. Note we use checkThis() instead of testThis(). + */ +status = inSection(5); +checkThis(' /\\(/ '); + +status = inSection(6); +checkThis(' /\\)/ '); + +status = inSection(7); +checkThis(' /(abc)def\\(g/ '); + +status = inSection(8); +checkThis(' /(abc\\)def)g/ '); + +status = inSection(9); +checkThis(' /(abc(\\))def)g/ '); + +status = inSection(10); +checkThis(' /(abc([x\\)yz]+)def)g/ '); + + + +/* + * Unescaped, unbalanced left brackets should be a SyntaxError + */ +status = inSection(11); +testThis(' /[/ '); + +status = inSection(12); +testThis(' /[abc\\]def[g/ '); + + +/* + * We permit unescaped, unbalanced right brackets, as does Perl. + * No error should result, even though this is not ECMA-compliant. + * Note we use checkThis() instead of testThis(). + */ +status = inSection(13); +checkThis(' /]/ '); + +status = inSection(14); +checkThis(' /\\[abc]def]g/ '); + + +/* + * These regexp patterns are correct and should not generate + * any errors. Note we use checkThis() instead of testThis(). + */ +status = inSection(15); +checkThis(' /\\[/ '); + +status = inSection(16); +checkThis(' /\\]/ '); + +status = inSection(17); +checkThis(' /[abc]def\\[g/ '); + +status = inSection(18); +checkThis(' /[abc\\]def]g/ '); + +status = inSection(19); +checkThis(' /(abc[\\]]def)g/ '); + +status = inSection(20); +checkThis(' /[abc(x\\]yz+)def]g/ '); + + + +/* + * Run some tests for unbalanced braces. We again follow Perl, and + * thus permit unescaped unbalanced braces - both left and right, + * even though this is not ECMA-compliant. + * + * Note we use checkThis() instead of testThis(). + */ +status = inSection(21); +checkThis(' /abc{def/ '); + +status = inSection(22); +checkThis(' /abc}def/ '); + +status = inSection(23); +checkThis(' /a{2}bc{def/ '); + +status = inSection(24); +checkThis(' /a}b{3}c}def/ '); + + +/* + * These regexp patterns are correct and should not generate + * any errors. Note we use checkThis() instead of testThis(). + */ +status = inSection(25); +checkThis(' /abc\\{def/ '); + +status = inSection(26); +checkThis(' /abc\\}def/ '); + +status = inSection(27); +checkThis(' /a{2}bc\\{def/ '); + +status = inSection(28); +checkThis(' /a\\}b{3}c\\}def/ '); + + + + +//----------------------------------------------------------------------------- +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++; +} + + +/* + * Valid syntax shouldn't generate any errors + */ +function checkThis(sValidSyntax) +{ + expect = CHECK_PASSED; + actual = CHECK_PASSED; + + try + { + eval(sValidSyntax); + } + 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/RegExp/regress-223535.js b/js/src/tests/ecma_3/RegExp/regress-223535.js new file mode 100644 index 000000000..1648087df --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-223535.js @@ -0,0 +1,99 @@ +/* -*- 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: 24 October 2003 + * SUMMARY: Testing regexps with empty alternatives + * + * See http://bugzilla.mozilla.org/show_bug.cgi?id=223535 + * + */ +//----------------------------------------------------------------------------- +var i = 0; +var BUGNUMBER = 223535; +var summary = 'Testing regexps with empty alternatives'; +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(); + + +string = 'a'; +status = inSection(1); +pattern = /a|/; +actualmatch = string.match(pattern); +expectedmatch = Array('a'); +addThis(); + +status = inSection(2); +pattern = /|a/; +actualmatch = string.match(pattern); +expectedmatch = Array(''); +addThis(); + +status = inSection(3); +pattern = /|/; +actualmatch = string.match(pattern); +expectedmatch = Array(''); +addThis(); + +status = inSection(4); +pattern = /(a|)/; +actualmatch = string.match(pattern); +expectedmatch = Array('a', 'a'); +addThis(); + +status = inSection(5); +pattern = /(a||)/; +actualmatch = string.match(pattern); +expectedmatch = Array('a', 'a'); +addThis(); + +status = inSection(6); +pattern = /(|a)/; +actualmatch = string.match(pattern); +expectedmatch = Array('', ''); +addThis(); + +status = inSection(7); +pattern = /(|a|)/; +actualmatch = string.match(pattern); +expectedmatch = Array('', ''); +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/RegExp/regress-224676.js b/js/src/tests/ecma_3/RegExp/regress-224676.js new file mode 100644 index 000000000..37185da42 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-224676.js @@ -0,0 +1,192 @@ +/* -*- 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 November 2003 + * SUMMARY: Testing regexps with various disjunction + character class patterns + * + * See http://bugzilla.mozilla.org/show_bug.cgi?id=224676 + * + */ +//----------------------------------------------------------------------------- +var i = 0; +var BUGNUMBER = 224676; +var summary = 'Regexps with various disjunction + character class patterns'; +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(); + + +string = 'ZZZxZZZ'; +status = inSection(1); +pattern = /[x]|x/; +actualmatch = string.match(pattern); +expectedmatch = Array('x'); +addThis(); + +status = inSection(2); +pattern = /x|[x]/; +actualmatch = string.match(pattern); +expectedmatch = Array('x'); +addThis(); + + +string = 'ZZZxbZZZ'; +status = inSection(3); +pattern = /a|[x]b/; +actualmatch = string.match(pattern); +expectedmatch = Array('xb'); +addThis(); + +status = inSection(4); +pattern = /[x]b|a/; +actualmatch = string.match(pattern); +expectedmatch = Array('xb'); +addThis(); + +status = inSection(5); +pattern = /([x]b|a)/; +actualmatch = string.match(pattern); +expectedmatch = Array('xb', 'xb'); +addThis(); + +status = inSection(6); +pattern = /([x]b|a)|a/; +actualmatch = string.match(pattern); +expectedmatch = Array('xb', 'xb'); +addThis(); + +status = inSection(7); +pattern = /^[x]b|a/; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + + +string = 'xb'; +status = inSection(8); +pattern = /^[x]b|a/; +actualmatch = string.match(pattern); +expectedmatch = Array('xb'); +addThis(); + + +string = 'ZZZxbZZZ'; +status = inSection(9); +pattern = /([x]b)|a/; +actualmatch = string.match(pattern); +expectedmatch = Array('xb', 'xb'); +addThis(); + +status = inSection(10); +pattern = /()[x]b|a/; +actualmatch = string.match(pattern); +expectedmatch = Array('xb', ''); +addThis(); + +status = inSection(11); +pattern = /x[b]|a/; +actualmatch = string.match(pattern); +expectedmatch = Array('xb'); +addThis(); + +status = inSection(12); +pattern = /[x]{1}b|a/; +actualmatch = string.match(pattern); +expectedmatch = Array('xb'); +addThis(); + +status = inSection(13); +pattern = /[x]b|a|a/; +actualmatch = string.match(pattern); +expectedmatch = Array('xb'); +addThis(); + +status = inSection(14); +pattern = /[x]b|[a]/; +actualmatch = string.match(pattern); +expectedmatch = Array('xb'); +addThis(); + +status = inSection(15); +pattern = /[x]b|a+/; +actualmatch = string.match(pattern); +expectedmatch = Array('xb'); +addThis(); + +status = inSection(16); +pattern = /[x]b|a{1}/; +actualmatch = string.match(pattern); +expectedmatch = Array('xb'); +addThis(); + +status = inSection(17); +pattern = /[x]b|(a)/; +actualmatch = string.match(pattern); +expectedmatch = Array('xb', undefined); +addThis(); + +status = inSection(18); +pattern = /[x]b|()a/; +actualmatch = string.match(pattern); +expectedmatch = Array('xb', undefined); +addThis(); + +status = inSection(19); +pattern = /[x]b|^a/; +actualmatch = string.match(pattern); +expectedmatch = Array('xb'); +addThis(); + +status = inSection(20); +pattern = /a|[^b]b/; +actualmatch = string.match(pattern); +expectedmatch = Array('xb'); +addThis(); + +status = inSection(21); +pattern = /a|[^b]{1}b/; +actualmatch = string.match(pattern); +expectedmatch = Array('xb'); +addThis(); + + +string = 'hallo\";'; +status = inSection(22); +pattern = /^((\\[^\x00-\x1f]|[^\x00-\x1f"\\])*)"/; +actualmatch = string.match(pattern); +expectedmatch = Array('hallo"', 'hallo', 'o'); +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/RegExp/regress-225289.js b/js/src/tests/ecma_3/RegExp/regress-225289.js new file mode 100644 index 000000000..8e65718c3 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-225289.js @@ -0,0 +1,142 @@ +/* -*- 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: 10 November 2003 + * SUMMARY: Testing regexps with complementary alternatives + * + * See http://bugzilla.mozilla.org/show_bug.cgi?id=225289 + * + */ +//----------------------------------------------------------------------------- +var i = 0; +var BUGNUMBER = 225289; +var summary = 'Testing regexps with complementary alternatives'; +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(); + + +// this pattern should match any string! +pattern = /a|[^a]/; + +status = inSection(1); +string = 'a'; +actualmatch = string.match(pattern); +expectedmatch = Array('a'); +addThis(); + +status = inSection(2); +string = ''; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(3); +string = '()'; +actualmatch = string.match(pattern); +expectedmatch = Array('('); +addThis(); + + +pattern = /(a|[^a])/; + +status = inSection(4); +string = 'a'; +actualmatch = string.match(pattern); +expectedmatch = Array('a', 'a'); +addThis(); + +status = inSection(5); +string = ''; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(6); +string = '()'; +actualmatch = string.match(pattern); +expectedmatch = Array('(', '('); +addThis(); + + +pattern = /(a)|([^a])/; + +status = inSection(7); +string = 'a'; +actualmatch = string.match(pattern); +expectedmatch = Array('a', 'a', undefined); +addThis(); + +status = inSection(8); +string = ''; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(9); +string = '()'; +actualmatch = string.match(pattern); +expectedmatch = Array('(', undefined, '('); +addThis(); + + +// note this pattern has one non-capturing parens +pattern = /((?:a|[^a])*)/g; + +status = inSection(10); +string = 'a'; +actualmatch = string.match(pattern); +expectedmatch = Array('a', ''); // see bug 225289 comment 6 +addThis(); + +status = inSection(11); +string = ''; +actualmatch = string.match(pattern); +expectedmatch = Array(''); // see bug 225289 comment 9 +addThis(); + +status = inSection(12); +string = '()'; +actualmatch = string.match(pattern); +expectedmatch = Array('()', ''); // see bug 225289 comment 6 +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/RegExp/regress-225343.js b/js/src/tests/ecma_3/RegExp/regress-225343.js new file mode 100644 index 000000000..bade22df1 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-225343.js @@ -0,0 +1,91 @@ +/* -*- 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 November 2003 + * SUMMARY: Testing regexp character classes and the case-insensitive flag + * + * See http://bugzilla.mozilla.org/show_bug.cgi?id=225343 + * + */ +//----------------------------------------------------------------------------- +var i = 0; +var BUGNUMBER = 225343; +var summary = 'Testing regexp character classes and the case-insensitive flag'; +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(); + + +status = inSection(1); +string = 'a'; +pattern = /[A]/i; +actualmatch = string.match(pattern); +expectedmatch = Array('a'); +addThis(); + +status = inSection(2); +string = 'A'; +pattern = /[a]/i; +actualmatch = string.match(pattern); +expectedmatch = Array('A'); +addThis(); + +status = inSection(3); +string = '123abc123'; +pattern = /([A-Z]+)/i; +actualmatch = string.match(pattern); +expectedmatch = Array('abc', 'abc'); +addThis(); + +status = inSection(4); +string = '123abc123'; +pattern = /([A-Z])+/i; +actualmatch = string.match(pattern); +expectedmatch = Array('abc', 'c'); +addThis(); + +status = inSection(5); +string = 'abc@test.com'; +pattern = /^[-!#$%&\'*+\.\/0-9=?A-Z^_`{|}~]+@([-0-9A-Z]+\.)+([0-9A-Z]){2,4}$/i; +actualmatch = string.match(pattern); +expectedmatch = Array('abc@test.com', 'test.', 'm'); +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/RegExp/regress-24712.js b/js/src/tests/ecma_3/RegExp/regress-24712.js new file mode 100644 index 000000000..e0089fd50 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-24712.js @@ -0,0 +1,23 @@ +/* -*- 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/. */ + + +test(); + +function test() +{ + enterFunc ("test"); + + printBugNumber (24712); + + var re = /([\S]+([ \t]+[\S]+)*)[ \t]*=[ \t]*[\S]+/; + var result = re.exec("Course_Creator = Test") + ''; + + reportCompare('Course_Creator = Test,Course_Creator,', result, 'exec() returned null'); + + exitFunc ("test"); + +} + diff --git a/js/src/tests/ecma_3/RegExp/regress-285219.js b/js/src/tests/ecma_3/RegExp/regress-285219.js new file mode 100644 index 000000000..a73308d9b --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-285219.js @@ -0,0 +1,18 @@ +/* -*- 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 = 285219; +var summary = 'Do not crash on RangeError: reserved slot out of range'; +var actual = 'No Crash'; +var expect = 'No Crash'; + +printBugNumber(BUGNUMBER); +printStatus (summary); + +var o = {hi: 'there'}; +eval("var r = /re(1)(2)(3)/g", o); + +reportCompare(expect, actual, summary); diff --git a/js/src/tests/ecma_3/RegExp/regress-28686.js b/js/src/tests/ecma_3/RegExp/regress-28686.js new file mode 100644 index 000000000..d63fc2256 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-28686.js @@ -0,0 +1,21 @@ +/* -*- tab-width: 8; 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/. */ + + +test(); + +function test() +{ + enterFunc ("test"); + + printBugNumber (28686); + + var str = 'foo "bar" baz'; + reportCompare ('foo \\"bar\\" baz', str.replace(/([\'\"])/g, "\\$1"), + "str.replace failed."); + + exitFunc ("test"); + +} diff --git a/js/src/tests/ecma_3/RegExp/regress-307456.js b/js/src/tests/ecma_3/RegExp/regress-307456.js new file mode 100644 index 000000000..56f15b6a5 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-307456.js @@ -0,0 +1,22 @@ +// |reftest| skip -- slow +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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 = 307456; +var summary = 'Do not Freeze with RegExp'; +var actual = 'No Crash'; +var expect = 'No Crash'; + +printBugNumber(BUGNUMBER); +printStatus (summary); + +var data='<!---<->---->\n\n<><>--!!!<><><><><><>\n!!<>\n\n<>\n<><><><>!\n\n\n\n--\n--\n--\n\n--\n--\n\n\n-------\n--\n--\n\n\n--\n\n\n\n----\n\n\n\n--\n\n\n-\n\n\n-\n\n-\n\n-\n\n-\n-\n\n----\n\n-\n\n\n\n\n-\n\n\n\n\n\n\n\n\n-----\n\n\n-\n------\n-------\n\n----\n\n\n\n!\n\n\n\n\n\n\n\n!!!\n\n\n--------\n\n\n\n-\n\n\n-\n--\n\n----\n\n\n\n\n\n-\n\n\n----\n\n\n\n\n\n--------\n!\n\n\n\n\n-\n---\n--\n\n----\n\n-\n\n-\n\n-\n\n\n\n-----\n\n\n\n-\n\n\n-\n\n\n--\n-\n\n\n-\n\n----\n\n---\n\n---\n\n----\n\n\n\n---\n\n-++\n\n-------<>\n\n-!\n\n--\n\n----!-\n\n\n\n'; + +printStatus(data); +data=data.replace(RegExp('<!--(\\n[^\\n]|[^-]|-[^-]|--[^>])*-->', 'g'), ''); +printStatus(data); + +reportCompare(expect, actual, summary); diff --git a/js/src/tests/ecma_3/RegExp/regress-309840.js b/js/src/tests/ecma_3/RegExp/regress-309840.js new file mode 100644 index 000000000..ff1e5927c --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-309840.js @@ -0,0 +1,24 @@ +/* -*- 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 = 309840; +var summary = 'Treat / in a literal regexp class as valid'; +var actual = 'No error'; +var expect = 'No error'; + +printBugNumber(BUGNUMBER); +printStatus (summary); + +try +{ + var re = eval('/[/]/'); +} +catch(e) +{ + actual = e.toString(); +} + +reportCompare(expect, actual, summary); diff --git a/js/src/tests/ecma_3/RegExp/regress-312351.js b/js/src/tests/ecma_3/RegExp/regress-312351.js new file mode 100644 index 000000000..72a52a183 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-312351.js @@ -0,0 +1,17 @@ +/* -*- 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 = 312351; +var summary = 'Do not crash on RegExp(null)'; +var actual = 'No Crash'; +var expect = 'No Crash'; + +printBugNumber(BUGNUMBER); +printStatus (summary); + +var x = RegExp(null); + +reportCompare(expect, actual, summary); diff --git a/js/src/tests/ecma_3/RegExp/regress-31316.js b/js/src/tests/ecma_3/RegExp/regress-31316.js new file mode 100644 index 000000000..fc6fd94e3 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-31316.js @@ -0,0 +1,62 @@ +/* -*- 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: 01 May 2001 + * + * SUMMARY: Regression test for Bugzilla bug 31316: + * "Rhino: Regexp matches return garbage" + * + * See http://bugzilla.mozilla.org/show_bug.cgi?id=31316 + */ +//----------------------------------------------------------------------------- +var i = 0; +var BUGNUMBER = 31316; +var summary = 'Regression test for Bugzilla bug 31316'; +var cnEmptyString = ''; +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(); + + +status = inSection(1); +pattern = /<([^\/<>][^<>]*[^\/])>|<([^\/<>])>/; +string = '<p>Some<br />test</p>'; +actualmatch = string.match(pattern); +expectedmatch = Array('<p>', undefined, 'p'); +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/RegExp/regress-330684.js b/js/src/tests/ecma_3/RegExp/regress-330684.js new file mode 100644 index 000000000..f6a3bb760 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-330684.js @@ -0,0 +1,21 @@ +// |reftest| skip -- slow +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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 = 330684; +var summary = 'Do not hang on RegExp'; +var actual = 'Do not hang on RegExp'; +var expect = ''; + +printBugNumber(BUGNUMBER); +printStatus (summary); + +var re = /^(?:(?:%[0-9A-Fa-f]{2})*[!\$&'\*-;=\?-Z_a-z]*)+$/; +var url = "http://tw.yimg.com/a/tw/wenchuan/cam_240x400_381615_030806_2.swf?clickTAG=javascript:VRECopenWindow(1)"; + +printStatus(re.test(url)); + +reportCompare(expect, actual, summary); diff --git a/js/src/tests/ecma_3/RegExp/regress-334158.js b/js/src/tests/ecma_3/RegExp/regress-334158.js new file mode 100644 index 000000000..a56144553 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-334158.js @@ -0,0 +1,25 @@ +/* -*- 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 = 334158; +var summary = 'Parse error in control letter escapes (RegExp)'; +var actual = ''; +var expect = ''; + +printBugNumber(BUGNUMBER); +printStatus (summary); + +expect = true; +actual = /\ca/.test( "\x01" ); +reportCompare(expect, actual, summary + ':/\ca/.test( "\x01" )'); + +expect = false + actual = /\ca/.test( "\\ca" ); +reportCompare(expect, actual, summary + ': /\ca/.test( "\\ca" )'); + +expect = false + actual = /\c[a/]/.test( "\x1ba/]" ); +reportCompare(expect, actual, summary + ': /\c[a/]/.test( "\x1ba/]" )'); diff --git a/js/src/tests/ecma_3/RegExp/regress-346090.js b/js/src/tests/ecma_3/RegExp/regress-346090.js new file mode 100644 index 000000000..265c3e8d8 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-346090.js @@ -0,0 +1,29 @@ +/* -*- 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 = 346090; +var summary = 'Do not crash with this regexp'; +var actual = 'No Crash'; +var expect = 'No Crash'; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + var r = /%((h[^l]+)|(l[^h]+)){0,2}?a/g; + r.exec('%lld %d'); + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/RegExp/regress-367888.js b/js/src/tests/ecma_3/RegExp/regress-367888.js new file mode 100644 index 000000000..d2e7529b6 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-367888.js @@ -0,0 +1,29 @@ +/* -*- 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 = 367888; +var summary = 'RegExp /(|)??x/g.exec("y") barfs'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + expect = null; + actual = /(|)??x/g.exec("y"); + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/RegExp/regress-375642.js b/js/src/tests/ecma_3/RegExp/regress-375642.js new file mode 100644 index 000000000..267abde7a --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-375642.js @@ -0,0 +1,28 @@ +/* -*- 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 = 375642; +var summary = 'RegExp /(?:a??)+?/.exec("")'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + /(?:a??)+?/.exec("") + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/RegExp/regress-375651.js b/js/src/tests/ecma_3/RegExp/regress-375651.js new file mode 100644 index 000000000..8c8aa05c7 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-375651.js @@ -0,0 +1,29 @@ +/* -*- 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 = 375651; +var summary = 'Do not assert with regexp quantifiers'; +var actual = 'No Crash'; +var expect = 'No Crash'; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + /(.{2,3}){0,2}?t/.exec("abt"); + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/RegExp/regress-375711.js b/js/src/tests/ecma_3/RegExp/regress-375711.js new file mode 100644 index 000000000..420b8ba49 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-375711.js @@ -0,0 +1,85 @@ +/* -*- 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 = 375711; +var summary = 'Do not assert with /[Q-b]/i.exec("")'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + var s; + + // see bug 416933 + print('see bug 416933 for changed behavior on Gecko 1.9'); + + try + { + s = '/[Q-b]/.exec("")'; + expect = 'No Error'; + print(s + ' expect ' + expect); + eval(s); + actual = 'No Error'; + } + catch(ex) + { + actual = ex + ''; + } + reportCompare(expect, actual, summary + ': ' + s); + + try + { + s ='/[Q-b]/i.exec("")'; + expect = 'No Error'; + print(s + ' expect ' + expect); + eval(s); + actual = 'No Error'; + } + catch(ex) + { + actual = ex + ''; + } + reportCompare(expect, actual, summary + ': ' + s); + + try + { + s = '/[q-b]/.exec("")'; + expect = 'SyntaxError: invalid range in character class'; + print(s + ' expect ' + expect); + eval(s); + actual = 'No Error'; + } + catch(ex) + { + actual = ex + ''; + } + reportCompare(expect, actual, summary + ': ' + s); + + try + { + s ='/[q-b]/i.exec("")'; + expect = 'SyntaxError: invalid range in character class'; + print(s + ' expect ' + expect); + eval(s); + actual = 'No Error'; + } + catch(ex) + { + actual = ex + ''; + } + reportCompare(expect, actual, summary + ': ' + s); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/RegExp/regress-375715-01-n.js b/js/src/tests/ecma_3/RegExp/regress-375715-01-n.js new file mode 100644 index 000000000..dbb988ea7 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-375715-01-n.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 = 375715; +var summary = 'Do not assert: (c2 <= cs->length) && (c1 <= c2)'; +var actual = ''; +var expect = ''; + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + // note that the assertion does not fire if the regexp is + // evald or used in new RegExp, so this test must be an -n + // with uncaught SyntaxError. + + /[\Wb-G]/.exec(""); + reportCompare(expect, actual, summary + ' /[\Wb-G]/.exec("")'); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/RegExp/regress-375715-02.js b/js/src/tests/ecma_3/RegExp/regress-375715-02.js new file mode 100644 index 000000000..7d1965ab6 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-375715-02.js @@ -0,0 +1,27 @@ +/* -*- 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 = 375715; +var summary = 'Do not assert: (c2 <= cs->length) && (c1 <= c2)'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + /[\s-:]/; + reportCompare(expect, actual, summary + '/[\s-:]/'); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/RegExp/regress-375715-03.js b/js/src/tests/ecma_3/RegExp/regress-375715-03.js new file mode 100644 index 000000000..f701997e6 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-375715-03.js @@ -0,0 +1,27 @@ +/* -*- 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 = 375715; +var summary = 'Do not assert: (c2 <= cs->length) && (c1 <= c2)'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + /[_-t]/i.exec(""); + reportCompare(expect, actual, summary + '/[_-t]/i.exec("")'); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/RegExp/regress-375715-04.js b/js/src/tests/ecma_3/RegExp/regress-375715-04.js new file mode 100644 index 000000000..bb37474b3 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-375715-04.js @@ -0,0 +1,35 @@ +/* -*- 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 = 375715; +var summary = 'Do not assert: (c2 <= cs->length) && (c1 <= c2)'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + try + { + expect = 'SyntaxError: invalid range in character class'; + (new RegExp("[\xDF-\xC7]]", "i")).exec(""); + } + catch(ex) + { + actual = ex + ''; + } + reportCompare(expect, actual, summary + '(new RegExp("[\xDF-\xC7]]", "i")).exec("")'); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/RegExp/regress-436700.js b/js/src/tests/ecma_3/RegExp/regress-436700.js new file mode 100644 index 000000000..d595b0182 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-436700.js @@ -0,0 +1,34 @@ +/* -*- 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 = 436700; +var summary = 'Do not assert: 1 <= num && num <= 0x10000'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + try + { + /\2147483648/.exec(String.fromCharCode(140) + "7483648").toString(); + } + catch(ex) + { + } + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/RegExp/regress-465862.js b/js/src/tests/ecma_3/RegExp/regress-465862.js new file mode 100644 index 000000000..e771e68f1 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-465862.js @@ -0,0 +1,82 @@ +/* -*- 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 = 465862; +var summary = 'Do case-insensitive matching correctly in JIT for non-ASCII-letters'; + +var i = 0; +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(); + +// Note: we must call the RegExp constructor here instead of using +// literals. Otherwise, because the regexps are compiled at parse +// time, they will not be compiled to native code and we will not +// actually be testing jitted regexps. + + +status = inSection(1); +string = '@'; +pattern = new RegExp('@', 'i'); +actualmatch = string.match(pattern); +expectedmatch = Array(string); +addThis(); + +status = inSection(2); +string = '`'; +pattern = new RegExp('`', 'i'); +actualmatch = string.match(pattern); +expectedmatch = Array(string); +addThis(); + +status = inSection(3); +string = '@'; +pattern = new RegExp('`', 'i'); +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(4); +string = '`'; +pattern = new RegExp('@', 'i'); +print(string + ' ' + pattern); +actualmatch = string.match(pattern); +print('z ' + actualmatch); +print('`'.match(/@/i)); +expectedmatch = null; +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/RegExp/regress-57572.js b/js/src/tests/ecma_3/RegExp/regress-57572.js new file mode 100644 index 000000000..3f1383f10 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-57572.js @@ -0,0 +1,116 @@ +/* -*- 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: 28 December 2000 + * + * SUMMARY: Testing regular expressions containing the ? character. + * Arose from Bugzilla bug 57572: "RegExp with ? matches incorrectly" + * + * See http://bugzilla.mozilla.org/show_bug.cgi?id=57572 + * + */ +//----------------------------------------------------------------------------- +var i = 0; +var BUGNUMBER = 57572; +var summary = 'Testing regular expressions containing "?"'; +var cnEmptyString = ''; var cnSingleSpace = ' '; +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(); + + +status = inSection(1); +pattern = /(\S+)?(.*)/; +string = 'Test this'; +actualmatch = string.match(pattern); +expectedmatch = Array(string, 'Test', ' this'); //single space in front of 'this' +addThis(); + +status = inSection(2); +pattern = /(\S+)? ?(.*)/; //single space between the ? characters +string= 'Test this'; +actualmatch = string.match(pattern); +expectedmatch = Array(string, 'Test', 'this'); //NO space in front of 'this' +addThis(); + +status = inSection(3); +pattern = /(\S+)?(.*)/; +string = 'Stupid phrase, with six - (short) words'; +actualmatch = string.match(pattern); +expectedmatch = Array(string, 'Stupid', ' phrase, with six - (short) words'); //single space in front of 'phrase' +addThis(); + +status = inSection(4); +pattern = /(\S+)? ?(.*)/; //single space between the ? characters +string = 'Stupid phrase, with six - (short) words'; +actualmatch = string.match(pattern); +expectedmatch = Array(string, 'Stupid', 'phrase, with six - (short) words'); //NO space in front of 'phrase' +addThis(); + + +// let's add an extra back-reference this time - three instead of two - +status = inSection(5); +pattern = /(\S+)?( ?)(.*)/; //single space before second ? character +string = 'Stupid phrase, with six - (short) words'; +actualmatch = string.match(pattern); +expectedmatch = Array(string, 'Stupid', cnSingleSpace, 'phrase, with six - (short) words'); +addThis(); + +status = inSection(6); +pattern = /^(\S+)?( ?)(B+)$/; //single space before second ? character +string = 'AAABBB'; +actualmatch = string.match(pattern); +expectedmatch = Array(string, 'AAABB', cnEmptyString, 'B'); +addThis(); + +status = inSection(7); +pattern = /(\S+)?(!?)(.*)/; +string = 'WOW !!! !!!'; +actualmatch = string.match(pattern); +expectedmatch = Array(string, 'WOW', cnEmptyString, ' !!! !!!'); +addThis(); + +status = inSection(8); +pattern = /(.+)?(!?)(!+)/; +string = 'WOW !!! !!!'; +actualmatch = string.match(pattern); +expectedmatch = Array(string, 'WOW !!! !!', cnEmptyString, '!'); +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/RegExp/regress-57631.js b/js/src/tests/ecma_3/RegExp/regress-57631.js new file mode 100644 index 000000000..5995fe496 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-57631.js @@ -0,0 +1,118 @@ +/* -*- 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: 26 November 2000 + * + * + * SUMMARY: This test arose from Bugzilla bug 57631: + * "RegExp with invalid pattern or invalid flag causes segfault" + * + * Either error should throw an exception of type SyntaxError, + * and we check to see that it does... + */ +//----------------------------------------------------------------------------- +var BUGNUMBER = '57631'; +var summary = 'Testing new RegExp(pattern,flag) with illegal pattern or flag'; +var statprefix = 'Testing for error creating illegal RegExp object on pattern '; +var statsuffix = 'and flag '; +var cnSUCCESS = 'SyntaxError'; +var cnFAILURE = 'not a SyntaxError'; +var singlequote = "'"; +var i = -1; var j = -1; var s = ''; var f = ''; +var obj = {}; +var status = ''; var actual = ''; var expect = ''; var msg = ''; +var legalpatterns = new Array(); var illegalpatterns = new Array(); +var legalflags = new Array(); var illegalflags = new Array(); + + +// valid regular expressions to try - +legalpatterns[0] = ''; +legalpatterns[1] = 'abc'; +legalpatterns[2] = '(.*)(3-1)\s\w'; +legalpatterns[3] = '(.*)(...)\\s\\w'; +legalpatterns[4] = '[^A-Za-z0-9_]'; +legalpatterns[5] = '[^\f\n\r\t\v](123.5)([4 - 8]$)'; + +// invalid regular expressions to try - +illegalpatterns[0] = '(?)'; +illegalpatterns[1] = '(a'; +illegalpatterns[2] = '( ]'; +//illegalpatterns[3] = '\d{1,s}'; + +// valid flags to try - +legalflags[0] = 'i'; +legalflags[1] = 'g'; +legalflags[2] = 'm'; +legalflags[3] = undefined; + +// invalid flags to try - +illegalflags[0] = 'a'; +illegalflags[1] = 123; +illegalflags[2] = new RegExp(); + + + +//------------------------------------------------------------------------------------------------- +test(); +//------------------------------------------------------------------------------------------------- + + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + testIllegalRegExps(legalpatterns, illegalflags); + testIllegalRegExps(illegalpatterns, legalflags); + testIllegalRegExps(illegalpatterns, illegalflags); + + exitFunc ('test'); +} + + +// This function will only be called where all the patterns are illegal, or all the flags +function testIllegalRegExps(patterns, flags) +{ + for (i in patterns) + { + s = patterns[i]; + + for (j in flags) + { + f = flags[j]; + status = getStatus(s, f); + actual = cnFAILURE; + expect = cnSUCCESS; + + try + { + // This should cause an exception if either s or f is illegal - + eval('obj = new RegExp(s, f);'); + } + catch(e) + { + // We expect to get a SyntaxError - test for this: + if (e instanceof SyntaxError) + actual = cnSUCCESS; + } + + reportCompare(expect, actual, status); + } + } +} + + +function getStatus(regexp, flag) +{ + return (statprefix + quote(regexp) + statsuffix + quote(flag)); +} + + +function quote(text) +{ + return (singlequote + text + singlequote); +} diff --git a/js/src/tests/ecma_3/RegExp/regress-67773.js b/js/src/tests/ecma_3/RegExp/regress-67773.js new file mode 100644 index 000000000..68cdae681 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-67773.js @@ -0,0 +1,177 @@ +/* -*- 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: 06 February 2001 + * + * SUMMARY: Arose from Bugzilla bug 67773: + * "Regular subexpressions followed by + failing to run to completion" + * + * See http://bugzilla.mozilla.org/show_bug.cgi?id=67773 + * See http://bugzilla.mozilla.org/show_bug.cgi?id=69989 + */ +//----------------------------------------------------------------------------- +var i = 0; +var BUGNUMBER = 67773; +var summary = 'Testing regular subexpressions followed by ? or +\n'; +var cnSingleSpace = ' '; +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(); + + +pattern = /^(\S+)?( ?)(B+)$/; //single space before second ? character +status = inSection(1); +string = 'AAABBB AAABBB '; //single space at middle and at end - +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(2); +string = 'AAABBB BBB'; //single space in the middle +actualmatch = string.match(pattern); +expectedmatch = Array(string, 'AAABBB', cnSingleSpace, 'BBB'); +addThis(); + +status = inSection(3); +string = 'AAABBB AAABBB'; //single space in the middle +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + + +pattern = /^(A+B)+$/; +status = inSection(4); +string = 'AABAAB'; +actualmatch = string.match(pattern); +expectedmatch = Array(string, 'AAB'); +addThis(); + +status = inSection(5); +string = 'ABAABAAAAAAB'; +actualmatch = string.match(pattern); +expectedmatch = Array(string, 'AAAAAAB'); +addThis(); + +status = inSection(6); +string = 'ABAABAABAB'; +actualmatch = string.match(pattern); +expectedmatch = Array(string, 'AB'); +addThis(); + +status = inSection(7); +string = 'ABAABAABABB'; +actualmatch = string.match(pattern); +expectedmatch = null; // because string doesn't match at end +addThis(); + + +pattern = /^(A+1)+$/; +status = inSection(8); +string = 'AA1AA1'; +actualmatch = string.match(pattern); +expectedmatch = Array(string, 'AA1'); +addThis(); + + +pattern = /^(\w+\-)+$/; +status = inSection(9); +string = ''; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(10); +string = 'bla-'; +actualmatch = string.match(pattern); +expectedmatch = Array(string, string); +addThis(); + +status = inSection(11); +string = 'bla-bla'; // hyphen missing at end - +actualmatch = string.match(pattern); +expectedmatch = null; //because string doesn't match at end +addThis(); + +status = inSection(12); +string = 'bla-bla-'; +actualmatch = string.match(pattern); +expectedmatch = Array(string, 'bla-'); +addThis(); + + +pattern = /^(\S+)+(A+)$/; +status = inSection(13); +string = 'asdldflkjAAA'; +actualmatch = string.match(pattern); +expectedmatch = Array(string, 'asdldflkjAA', 'A'); +addThis(); + +status = inSection(14); +string = 'asdldflkj AAA'; // space in middle +actualmatch = string.match(pattern); +expectedmatch = null; //because of the space +addThis(); + + +pattern = /^(\S+)+(\d+)$/; +status = inSection(15); +string = 'asdldflkj122211'; +actualmatch = string.match(pattern); +expectedmatch = Array(string, 'asdldflkj12221', '1'); +addThis(); + +status = inSection(16); +string = 'asdldflkj1111111aaa1'; +actualmatch = string.match(pattern); +expectedmatch = Array(string, 'asdldflkj1111111aaa', '1'); +addThis(); + + +/* + * This one comes from Stephen Ostermiller. + * See http://bugzilla.mozilla.org/show_bug.cgi?id=69989 + */ +pattern = /^[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)+$/; +status = inSection(17); +string = 'some.host.tld'; +actualmatch = string.match(pattern); +expectedmatch = Array(string, '.tld', '.'); +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/RegExp/regress-72964.js b/js/src/tests/ecma_3/RegExp/regress-72964.js new file mode 100644 index 000000000..b41b74c32 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-72964.js @@ -0,0 +1,87 @@ +/* -*- 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: 2001-07-17 + * + * SUMMARY: Regression test for Bugzilla bug 72964: + * "String method for pattern matching failed for Chinese Simplified (GB2312)" + * + * See http://bugzilla.mozilla.org/show_bug.cgi?id=72964 + */ +//----------------------------------------------------------------------------- +var i = 0; +var BUGNUMBER = 72964; +var summary = 'Testing regular expressions containing non-Latin1 characters'; +var cnSingleSpace = ' '; +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(); + + +pattern = /[\S]+/; +// 4 low Unicode chars = Latin1; whole string should match +status = inSection(1); +string = '\u00BF\u00CD\u00BB\u00A7'; +actualmatch = string.match(pattern); +expectedmatch = Array(string); +addThis(); + +// Now put a space in the middle; first half of string should match +status = inSection(2); +string = '\u00BF\u00CD \u00BB\u00A7'; +actualmatch = string.match(pattern); +expectedmatch = Array('\u00BF\u00CD'); +addThis(); + + +// 4 high Unicode chars = non-Latin1; whole string should match +status = inSection(3); +string = '\u4e00\uac00\u4e03\u4e00'; +actualmatch = string.match(pattern); +expectedmatch = Array(string); +addThis(); + +// Now put a space in the middle; first half of string should match +status = inSection(4); +string = '\u4e00\uac00 \u4e03\u4e00'; +actualmatch = string.match(pattern); +expectedmatch = Array('\u4e00\uac00'); +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/RegExp/regress-76683.js b/js/src/tests/ecma_3/RegExp/regress-76683.js new file mode 100644 index 000000000..8b8406441 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-76683.js @@ -0,0 +1,80 @@ +/* -*- 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: 01 May 2001 + * + * SUMMARY: Regression test for Bugzilla bug 76683 on Rhino: + * "RegExp regression (NullPointerException)" + * + * See http://bugzilla.mozilla.org/show_bug.cgi?id=76683 + */ +//----------------------------------------------------------------------------- +var i = 0; +var BUGNUMBER = 76683; +var summary = 'Regression test for Bugzilla bug 76683'; +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(); + + +/* + * Rhino (2001-04-19) crashed on the 3rd regular expression below. + * It didn't matter what the string was. No problem in SpiderMonkey - + */ +string = 'abc'; +status = inSection(1); +pattern = /(<!--([^-]|-[^-]|--[^>])*-->)|(<([\$\w:\.\-]+)((([ ][^\/>]*)?\/>)|(([ ][^>]*)?>)))/; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +status = inSection(2); +pattern = /(<!--([^-]|-[^-]|--[^>])*-->)|(<(tagPattern)((([ ][^\/>]*)?\/>)|(([ ][^>]*)?>)))/; +actualmatch = string.match(pattern); +expectedmatch = null; +addThis(); + +// This was the one causing a Rhino crash - +status = inSection(3); +pattern = /(<!--([^-]|-[^-]|--[^>])*-->)|(<(tagPattern)((([ ][^\/>]*)?\/>)|(([ ][^>]*)?>)))|(<\/tagPattern[^>]*>)/; +actualmatch = string.match(pattern); +expectedmatch = null; +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/RegExp/regress-78156.js b/js/src/tests/ecma_3/RegExp/regress-78156.js new file mode 100644 index 000000000..0bd990977 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-78156.js @@ -0,0 +1,89 @@ +/* -*- 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: 06 February 2001 + * + * SUMMARY: Arose from Bugzilla bug 78156: + * "m flag of regular expression does not work with $" + * + * See http://bugzilla.mozilla.org/show_bug.cgi?id=78156 + * + * The m flag means a regular expression should search strings + * across multiple lines, i.e. across '\n', '\r'. + */ +//----------------------------------------------------------------------------- +var i = 0; +var BUGNUMBER = 78156; +var summary = 'Testing regular expressions with ^, $, and the m flag -'; +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(); + +/* + * All patterns have an m flag; all strings are multiline. + * Looking for digit characters at beginning/end of lines. + */ + +string = 'aaa\n789\r\nccc\r\n345'; +status = inSection(1); +pattern = /^\d/gm; +actualmatch = string.match(pattern); +expectedmatch = ['7','3']; +addThis(); + +status = inSection(2); +pattern = /\d$/gm; +actualmatch = string.match(pattern); +expectedmatch = ['9','5']; +addThis(); + +string = 'aaa\n789\r\nccc\r\nddd'; +status = inSection(3); +pattern = /^\d/gm; +actualmatch = string.match(pattern); +expectedmatch = ['7']; +addThis(); + +status = inSection(4); +pattern = /\d$/gm; +actualmatch = string.match(pattern); +expectedmatch = ['9']; +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/RegExp/regress-85721.js b/js/src/tests/ecma_3/RegExp/regress-85721.js new file mode 100644 index 000000000..e04ae97f3 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-85721.js @@ -0,0 +1,243 @@ +// |reftest| random -- bogus perf test (bug 467263) +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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: 14 Feb 2002 + * SUMMARY: Performance: Regexp performance degraded from 4.7 + * See http://bugzilla.mozilla.org/show_bug.cgi?id=85721 + * + * Adjust this testcase if necessary. The FAST constant defines + * an upper bound in milliseconds for any execution to take. + * + */ +//----------------------------------------------------------------------------- +var BUGNUMBER = 85721; +var summary = 'Performance: execution of regular expression'; +var FAST = 100; // execution should be 100 ms or less to pass the test +var MSG_FAST = 'Execution took less than ' + FAST + ' ms'; +var MSG_SLOW = 'Execution took '; +var MSG_MS = ' ms'; +var str = ''; +var re = ''; +var status = ''; +var actual = ''; +var expect= ''; + +printBugNumber(BUGNUMBER); +printStatus (summary); + + +function elapsedTime(startTime) +{ + return new Date() - startTime; +} + + +function isThisFast(ms) +{ + if (ms <= FAST) + return MSG_FAST; + return MSG_SLOW + ms + MSG_MS; +} + + + +/* + * The first regexp. We'll test for performance (Section 1) and accuracy (Section 2). + */ +str='<sql:connection id="conn1"> <sql:url>www.m.com</sql:url> <sql:driver>drive.class</sql:driver>\n<sql:userId>foo</sql:userId> <sql:password>goo</sql:password> </sql:connection>'; +re = /<sql:connection id="([^\r\n]*?)">\s*<sql:url>\s*([^\r\n]*?)\s*<\/sql:url>\s*<sql:driver>\s*([^\r\n]*?)\s*<\/sql:driver>\s*(\s*<sql:userId>\s*([^\r\n]*?)\s*<\/sql:userId>\s*)?\s*(\s*<sql:password>\s*([^\r\n]*?)\s*<\/sql:password>\s*)?\s*<\/sql:connection>/; +expect = Array("<sql:connection id=\"conn1\"> <sql:url>www.m.com</sql:url> <sql:driver>drive.class</sql:driver>\n<sql:userId>foo</sql:userId> <sql:password>goo</sql:password> </sql:connection>","conn1","www.m.com","drive.class","<sql:userId>foo</sql:userId> ","foo","<sql:password>goo</sql:password> ","goo"); + +/* + * Check performance - + */ +status = inSection(1); +var start = new Date(); +var result = re.exec(str); +actual = elapsedTime(start); +reportCompare(isThisFast(FAST), isThisFast(actual), status); + +/* + * Check accuracy - + */ +status = inSection(2); +testRegExp([status], [re], [str], [result], [expect]); + + + +/* + * The second regexp (HUGE!). We'll test for performance (Section 3) and accuracy (Section 4). + * It comes from the O'Reilly book "Mastering Regular Expressions" by Jeffrey Friedl, Appendix B + */ + +//# Some things for avoiding backslashitis later on. +$esc = '\\\\'; +$Period = '\.'; +$space = '\040'; $tab = '\t'; +$OpenBR = '\\['; $CloseBR = '\\]'; +$OpenParen = '\\('; $CloseParen = '\\)'; +$NonASCII = '\x80-\xff'; $ctrl = '\000-\037'; +$CRlist = '\n\015'; //# note: this should really be only \015. +// Items 19, 20, 21 +$qtext = '[^' + $esc + $NonASCII + $CRlist + '\"]'; // # for within "..." +$dtext = '[^' + $esc + $NonASCII + $CRlist + $OpenBR + $CloseBR + ']'; // # for within [...] +$quoted_pair = $esc + '[^' + $NonASCII + ']'; // # an escaped character + +//############################################################################## +//# Items 22 and 23, comment. +//# Impossible to do properly with a regex, I make do by allowing at most one level of nesting. +$ctext = '[^' + $esc + $NonASCII + $CRlist + '()]'; + +//# $Cnested matches one non-nested comment. +//# It is unrolled, with normal of $ctext, special of $quoted_pair. +$Cnested = + $OpenParen + // # ( + $ctext + '*' + // # normal* + '(?:' + $quoted_pair + $ctext + '*)*' + // # (special normal*)* + $CloseParen; // # ) + + +//# $comment allows one level of nested parentheses +//# It is unrolled, with normal of $ctext, special of ($quoted_pair|$Cnested) +$comment = + $OpenParen + // # ( + $ctext + '*' + // # normal* + '(?:' + // # ( + '(?:' + $quoted_pair + '|' + $Cnested + ')' + // # special + $ctext + '*' + // # normal* + ')*' + // # )* + $CloseParen; // # ) + + +//############################################################################## +//# $X is optional whitespace/comments. +$X = + '[' + $space + $tab + ']*' + // # Nab whitespace. + '(?:' + $comment + '[' + $space + $tab + ']*)*'; // # If comment found, allow more spaces. + + +//# Item 10: atom +$atom_char = '[^(' + $space + '<>\@,;:\".' + $esc + $OpenBR + $CloseBR + $ctrl + $NonASCII + ']'; +$atom = + $atom_char + '+' + // # some number of atom characters... + '(?!' + $atom_char + ')'; // # ..not followed by something that could be part of an atom + +// # Item 11: doublequoted string, unrolled. +$quoted_str = + '\"' + // # " + $qtext + '*' + // # normal + '(?:' + $quoted_pair + $qtext + '*)*' + // # ( special normal* )* + '\"'; // # " + +//# Item 7: word is an atom or quoted string +$word = + '(?:' + + $atom + // # Atom + '|' + // # or + $quoted_str + // # Quoted string + ')' + +//# Item 12: domain-ref is just an atom + $domain_ref = $atom; + +//# Item 13: domain-literal is like a quoted string, but [...] instead of "..." +$domain_lit = + $OpenBR + // # [ + '(?:' + $dtext + '|' + $quoted_pair + ')*' + // # stuff + $CloseBR; // # ] + +// # Item 9: sub-domain is a domain-ref or domain-literal +$sub_domain = + '(?:' + + $domain_ref + + '|' + + $domain_lit + + ')' + + $X; // # optional trailing comments + +// # Item 6: domain is a list of subdomains separated by dots. +$domain = + $sub_domain + + '(?:' + + $Period + $X + $sub_domain + + ')*'; + +//# Item 8: a route. A bunch of "@ $domain" separated by commas, followed by a colon. +$route = + '\@' + $X + $domain + + '(?:,' + $X + '\@' + $X + $domain + ')*' + // # additional domains + ':' + + $X; // # optional trailing comments + +//# Item 6: local-part is a bunch of $word separated by periods +$local_part = + $word + $X + '(?:' + + $Period + $X + $word + $X + // # additional words + ')*'; + +// # Item 2: addr-spec is local@domain +$addr_spec = + $local_part + '\@' + $X + $domain; + +//# Item 4: route-addr is <route? addr-spec> +$route_addr = + '<' + $X + // # < + '(?:' + $route + ')?' + // # optional route + $addr_spec + // # address spec + '>'; // # > + +//# Item 3: phrase........ +$phrase_ctrl = '\000-\010\012-\037'; // # like ctrl, but without tab + +//# Like atom-char, but without listing space, and uses phrase_ctrl. +//# Since the class is negated, this matches the same as atom-char plus space and tab +$phrase_char = + '[^()<>\@,;:\".' + $esc + $OpenBR + $CloseBR + $NonASCII + $phrase_ctrl + ']'; + +// # We've worked it so that $word, $comment, and $quoted_str to not consume trailing $X +// # because we take care of it manually. +$phrase = + $word + // # leading word + $phrase_char + '*' + // # "normal" atoms and/or spaces + '(?:' + + '(?:' + $comment + '|' + $quoted_str + ')' + // # "special" comment or quoted string + $phrase_char + '*' + // # more "normal" + ')*'; + +// ## Item #1: mailbox is an addr_spec or a phrase/route_addr +$mailbox = + $X + // # optional leading comment + '(?:' + + $phrase + $route_addr + // # name and address + '|' + // # or + $addr_spec + // # address + ')'; + + +//########################################################################### + + +re = new RegExp($mailbox, "g"); +str = 'Jeffy<"That Tall Guy"@ora.com (this address is no longer active)>'; +expect = Array('Jeffy<"That Tall Guy"@ora.com (this address is no longer active)>'); + +/* + * Check performance - + */ +status = inSection(3); +var start = new Date(); +var result = re.exec(str); +actual = elapsedTime(start); +reportCompare(isThisFast(FAST), isThisFast(actual), status); + +/* + * Check accuracy - + */ +status = inSection(4); +testRegExp([status], [re], [str], [result], [expect]); diff --git a/js/src/tests/ecma_3/RegExp/regress-87231.js b/js/src/tests/ecma_3/RegExp/regress-87231.js new file mode 100644 index 000000000..7f36519c1 --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-87231.js @@ -0,0 +1,111 @@ +/* -*- 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: 22 June 2001 + * + * SUMMARY: Regression test for Bugzilla bug 87231: + * "Regular expression /(A)?(A.*)/ picks 'A' twice" + * + * See http://bugzilla.mozilla.org/show_bug.cgi?id=87231 + * Key case: + * + * pattern = /^(A)?(A.*)$/; + * string = 'A'; + * expectedmatch = Array('A', '', 'A'); + * + * + * We expect the 1st subexpression (A)? NOT to consume the single 'A'. + * Recall that "?" means "match 0 or 1 times". Here, it should NOT do + * greedy matching: it should match 0 times instead of 1. This allows + * the 2nd subexpression to make the only match it can: the single 'A'. + * Such "altruism" is the only way there can be a successful global match... + */ +//----------------------------------------------------------------------------- +var i = 0; +var BUGNUMBER = 87231; +var cnEmptyString = ''; +var summary = 'Testing regular expression /(A)?(A.*)/'; +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(); + + +pattern = /^(A)?(A.*)$/; +status = inSection(1); +string = 'AAA'; +actualmatch = string.match(pattern); +expectedmatch = Array('AAA', 'A', 'AA'); +addThis(); + +status = inSection(2); +string = 'AA'; +actualmatch = string.match(pattern); +expectedmatch = Array('AA', 'A', 'A'); +addThis(); + +status = inSection(3); +string = 'A'; +actualmatch = string.match(pattern); +expectedmatch = Array('A', undefined, 'A'); // 'altruistic' case: see above +addThis(); + + +pattern = /(A)?(A.*)/; +var strL = 'zxcasd;fl\\\ ^'; +var strR = 'aaAAaaaf;lrlrzs'; + +status = inSection(4); +string = strL + 'AAA' + strR; +actualmatch = string.match(pattern); +expectedmatch = Array('AAA' + strR, 'A', 'AA' + strR); +addThis(); + +status = inSection(5); +string = strL + 'AA' + strR; +actualmatch = string.match(pattern); +expectedmatch = Array('AA' + strR, 'A', 'A' + strR); +addThis(); + +status = inSection(6); +string = strL + 'A' + strR; +actualmatch = string.match(pattern); +expectedmatch = Array('A' + strR, undefined, 'A' + strR); // 'altruistic' case: see above +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/RegExp/regress-98306.js b/js/src/tests/ecma_3/RegExp/regress-98306.js new file mode 100644 index 000000000..fbe315acd --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/regress-98306.js @@ -0,0 +1,65 @@ +/* -*- 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 September 2001 + * + * SUMMARY: Regression test for Bugzilla bug 98306 + * "JS parser crashes in ParseAtom for script using Regexp()" + * + * See http://bugzilla.mozilla.org/show_bug.cgi?id=98306 + */ +//----------------------------------------------------------------------------- +var BUGNUMBER = 98306; +var summary = "Testing that we don't crash on this code -"; +var cnUBOUND = 10; +var re; +var s; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + s = '"Hello".match(/[/]/)'; + tryThis(s); + + s = 're = /[/'; + tryThis(s); + + s = 're = /[/]/'; + tryThis(s); + + s = 're = /[//]/'; + tryThis(s); + + reportCompare('No Crash', 'No Crash', ''); + exitFunc ('test'); +} + + +// Try to provoke a crash - +function tryThis(sCode) +{ + // sometimes more than one attempt is necessary - + for (var i=0; i<cnUBOUND; i++) + { + try + { + eval(sCode); + } + catch(e) + { + // do nothing; keep going - + } + } +} diff --git a/js/src/tests/ecma_3/RegExp/shell.js b/js/src/tests/ecma_3/RegExp/shell.js new file mode 100644 index 000000000..857d06c3e --- /dev/null +++ b/js/src/tests/ecma_3/RegExp/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; +} + diff --git a/js/src/tests/ecma_3/Regress/browser.js b/js/src/tests/ecma_3/Regress/browser.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/ecma_3/Regress/browser.js diff --git a/js/src/tests/ecma_3/Regress/regress-385393-04.js b/js/src/tests/ecma_3/Regress/regress-385393-04.js new file mode 100644 index 000000000..bee6ec7e2 --- /dev/null +++ b/js/src/tests/ecma_3/Regress/regress-385393-04.js @@ -0,0 +1,33 @@ +/* -*- 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 = 'No Crash'; +var expect = 'No Crash'; + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + try + { + 'a'.replace(/a/g, eval); + } + catch(ex) + { + } + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/Regress/regress-419152.js b/js/src/tests/ecma_3/Regress/regress-419152.js new file mode 100644 index 000000000..b8823d027 --- /dev/null +++ b/js/src/tests/ecma_3/Regress/regress-419152.js @@ -0,0 +1,57 @@ +/* -*- 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 = 419152; +var summary = 'Shaver can not contain himself'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + var a = [1,2,3]; + + a[5] = 6; + expect = '1,2,3,,,6:6'; + actual = a + ':' + a.length; + reportCompare(expect, actual, summary + ': 1'); + + a = [1,2,3,4]; + expect = 'undefined'; + actual = a[-1] + ''; + reportCompare(expect, actual, summary + ': 2'); + + a = [1,2,3]; + a[-1] = 55; + + expect = 3; + actual = a.length; + reportCompare(expect, actual, summary + ': 3'); + + expect = '1,2,3'; + actual = a + ''; + reportCompare(expect, actual, summary + ': 4'); + + expect = 55; + actual = a[-1]; + reportCompare(expect, actual, summary + ': 5'); + + var s = "abcdef"; + + expect = 'undefined'; + actual = s[-2] + ''; + reportCompare(expect, actual, summary + ': 6'); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/Regress/regress-420087.js b/js/src/tests/ecma_3/Regress/regress-420087.js new file mode 100644 index 000000000..c4730a9e0 --- /dev/null +++ b/js/src/tests/ecma_3/Regress/regress-420087.js @@ -0,0 +1,31 @@ +/* -*- 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 = 420087; +var summary = 'Do not assert: PCVCAP_MAKE(sprop->shape, 0, 0) == entry->vcap'; +var actual = 'No Crash'; +var expect = 'No Crash'; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + var dict; + + for (var i = 0; i < 2; i++) + dict = {p: 1, q: 1, p:1}; + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/Regress/regress-420610.js b/js/src/tests/ecma_3/Regress/regress-420610.js new file mode 100644 index 000000000..a74d21655 --- /dev/null +++ b/js/src/tests/ecma_3/Regress/regress-420610.js @@ -0,0 +1,17 @@ +/* -*- 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 = 420610; +var summary = 'Do not crash with eval("this.x")'; +var actual = 'No Crash'; +var expect = 'No Crash'; + +printBugNumber(BUGNUMBER); +printStatus (summary); + +(function(){ eval("this.x") })(); + +reportCompare(expect, actual, summary); diff --git a/js/src/tests/ecma_3/Regress/regress-441477-01.js b/js/src/tests/ecma_3/Regress/regress-441477-01.js new file mode 100644 index 000000000..101abdbda --- /dev/null +++ b/js/src/tests/ecma_3/Regress/regress-441477-01.js @@ -0,0 +1,42 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + * Contributor: Jason Orendorff + */ + +//----------------------------------------------------------------------------- +var BUGNUMBER = 441477-01; +var summary = ''; +var actual = 'No Exception'; +var expect = 'No Exception'; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + try + { + for (i = 0; i < 5;) + { + if (i > 5) + throw "bad"; + i++; + continue; + } + } + catch(ex) + { + actual = ex + ''; + } + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/Regress/regress-469937.js b/js/src/tests/ecma_3/Regress/regress-469937.js new file mode 100644 index 000000000..753735c15 --- /dev/null +++ b/js/src/tests/ecma_3/Regress/regress-469937.js @@ -0,0 +1,27 @@ +/* -*- 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 = 469937; +var summary = 'Properties without DontEnum are sometimes not enumerated'; +var actual = false; +var expect = true; + +printBugNumber(BUGNUMBER); +printStatus (summary); + +(function(){ + var o = { } + o.PageLeft = 1; + o.Rect2 = 6; + delete o.Rect2; + for (var p in o); + o.Rect3 = 7; + found = false; + for (var p in o) if (p == 'Rect3') found = true; + actual = found; +})(); + +reportCompare(expect, actual, summary); diff --git a/js/src/tests/ecma_3/Regress/regress-580544.js b/js/src/tests/ecma_3/Regress/regress-580544.js new file mode 100644 index 000000000..4e0ca92f8 --- /dev/null +++ b/js/src/tests/ecma_3/Regress/regress-580544.js @@ -0,0 +1,30 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/licenses/publicdomain/ + +var gTestfile = 'regress-580544.js'; +//----------------------------------------------------------------------------- +var BUGNUMBER = 580544; +var summary = 'Do not assert: new (this.prototype = this)'; +var actual = 'No Crash'; +var expect = 'No Crash'; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + try { + new (this.prototype = this); + } catch (e) { + } + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/Regress/shell.js b/js/src/tests/ecma_3/Regress/shell.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/ecma_3/Regress/shell.js diff --git a/js/src/tests/ecma_3/Statements/12.10-01.js b/js/src/tests/ecma_3/Statements/12.10-01.js new file mode 100644 index 000000000..031aac4ef --- /dev/null +++ b/js/src/tests/ecma_3/Statements/12.10-01.js @@ -0,0 +1,35 @@ +/* -*- 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 = 462734; +var summary = 'evaluating lhs "Reference" *before* evaluating rhs'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + var x = 1; + var o = {}; + with (o) + x = o.x = 2; + print(x); + + expect = 4; + actual = x + o.x; + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/Statements/12.6.3.js b/js/src/tests/ecma_3/Statements/12.6.3.js new file mode 100644 index 000000000..a5092d750 --- /dev/null +++ b/js/src/tests/ecma_3/Statements/12.6.3.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 = 292731; +var summary = 'for-in should not call valueOf method'; +var actual = ''; +var expect = ''; +var i; + +printBugNumber(BUGNUMBER); +printStatus (summary); + +function MyObject() +{ +} + +MyObject.prototype.valueOf = function() +{ + actual += 'MyObject.prototype.valueOf called. '; +} + + var myobject = new MyObject(); + +var myfunction = new function() +{ + this.valueOf = function() + { + actual += 'this.valueOf called. '; + } +} + + actual = ''; +for (i in myobject) +{ + //calls valueOf +} +reportCompare(expect, actual, 'for-in custom object'); + +actual = ''; +for (i in myfunction) +{ + //calls valueOf +} +reportCompare(expect, actual, 'for-in function expression'); diff --git a/js/src/tests/ecma_3/Statements/browser.js b/js/src/tests/ecma_3/Statements/browser.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/ecma_3/Statements/browser.js diff --git a/js/src/tests/ecma_3/Statements/regress-121744.js b/js/src/tests/ecma_3/Statements/regress-121744.js new file mode 100644 index 000000000..369bc03cc --- /dev/null +++ b/js/src/tests/ecma_3/Statements/regress-121744.js @@ -0,0 +1,184 @@ +// |reftest| skip -- obsolete test +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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: 30 Jan 2002 + * Revised: 10 Apr 2002 + * Revised: 14 July 2002 + * + * SUMMARY: JS should error on |for(i in undefined)|, |for(i in null)| + * See http://bugzilla.mozilla.org/show_bug.cgi?id=121744 + * + * ECMA-262 3rd Edition Final spec says such statements should error. See: + * + * Section 12.6.4 The for-in Statement + * Section 9.9 ToObject + * + * + * BUT: SpiderMonkey has decided NOT to follow this; it's a bug in the spec. + * See http://bugzilla.mozilla.org/show_bug.cgi?id=131348 + * + * UPDATE: Rhino has also decided not to follow the spec on this. + * See http://bugzilla.mozilla.org/show_bug.cgi?id=136893 + * + + |--------------------------------------------------------------------| + | | + | So for now, adding an early return for this test so it won't run. | + | | + |--------------------------------------------------------------------| + + * + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = 121744; +var summary = 'JS should error on |for(i in undefined)|, |for(i in null)|'; +var TEST_PASSED = 'TypeError'; +var TEST_FAILED = 'Generated an error, but NOT a TypeError!'; +var TEST_FAILED_BADLY = 'Did not generate ANY error!!!'; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; + +/* + * AS OF 14 JULY 2002, DON'T RUN THIS TEST IN EITHER RHINO OR SPIDERMONKEY - + */ +quit(); + + +status = inSection(1); +expect = TEST_PASSED; +actual = TEST_FAILED_BADLY; +/* + * OK, this should generate a TypeError + */ +try +{ + for (var i in undefined) + { + print(i); + } +} +catch(e) +{ + if (e instanceof TypeError) + actual = TEST_PASSED; + else + actual = TEST_FAILED; +} +addThis(); + + + +status = inSection(2); +expect = TEST_PASSED; +actual = TEST_FAILED_BADLY; +/* + * OK, this should generate a TypeError + */ +try +{ + for (var i in null) + { + print(i); + } +} +catch(e) +{ + if (e instanceof TypeError) + actual = TEST_PASSED; + else + actual = TEST_FAILED; +} +addThis(); + + + +status = inSection(3); +expect = TEST_PASSED; +actual = TEST_FAILED_BADLY; +/* + * Variable names that cannot be looked up generate ReferenceErrors; however, + * property names like obj.ZZZ that cannot be looked up are set to |undefined| + * + * Therefore, this should indirectly test | for (var i in undefined) | + */ +try +{ + for (var i in this.ZZZ) + { + print(i); + } +} +catch(e) +{ + if(e instanceof TypeError) + actual = TEST_PASSED; + else + actual = TEST_FAILED; +} +addThis(); + + + +status = inSection(4); +expect = TEST_PASSED; +actual = TEST_FAILED_BADLY; +/* + * The result of an unsuccessful regexp match is the null value + * Therefore, this should indirectly test | for (var i in null) | + */ +try +{ + for (var i in 'bbb'.match(/aaa/)) + { + print(i); + } +} +catch(e) +{ + if(e instanceof TypeError) + actual = TEST_PASSED; + else + actual = TEST_FAILED; +} +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/Statements/regress-131348.js b/js/src/tests/ecma_3/Statements/regress-131348.js new file mode 100644 index 000000000..17ecd7075 --- /dev/null +++ b/js/src/tests/ecma_3/Statements/regress-131348.js @@ -0,0 +1,150 @@ +/* -*- 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: 10 Apr 2002 + * Revised: 14 July 2002 + * + * SUMMARY: JS should NOT error on |for(i in undefined)|, |for(i in null)| + * + * ECMA-262 3rd Edition Final spec says such statements SHOULD error. See: + * + * Section 12.6.4 The for-in Statement + * Section 9.9 ToObject + * + * + * But SpiderMonkey has decided NOT to follow this; it's a bug in the spec. + * See http://bugzilla.mozilla.org/show_bug.cgi?id=131348 + * + * Update: Rhino has also decided not to follow the spec on this + * See http://bugzilla.mozilla.org/show_bug.cgi?id=136893 + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = 131348; +var summary = 'JS should not error on |for(i in undefined)|, |for(i in null)|'; +var TEST_PASSED = 'No error'; +var TEST_FAILED = 'An error was generated!!!'; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; + + + +status = inSection(1); +expect = TEST_PASSED; +actual = TEST_PASSED; +try +{ + for (var i in undefined) + { + print(i); + } +} +catch(e) +{ + actual = TEST_FAILED; +} +addThis(); + + + +status = inSection(2); +expect = TEST_PASSED; +actual = TEST_PASSED; +try +{ + for (var i in null) + { + print(i); + } +} +catch(e) +{ + actual = TEST_FAILED; +} +addThis(); + + + +status = inSection(3); +expect = TEST_PASSED; +actual = TEST_PASSED; +/* + * Variable names that cannot be looked up generate ReferenceErrors; however, + * property names like obj.ZZZ that cannot be looked up are set to |undefined| + * + * Therefore, this should indirectly test | for (var i in undefined) | + */ +try +{ + for (var i in this.ZZZ) + { + print(i); + } +} +catch(e) +{ + actual = TEST_FAILED; +} +addThis(); + + + +status = inSection(4); +expect = TEST_PASSED; +actual = TEST_PASSED; +/* + * The result of an unsuccessful regexp match is the null value + * Therefore, this should indirectly test | for (var i in null) | + */ +try +{ + for (var i in 'bbb'.match(/aaa/)) + { + print(i); + } +} +catch(e) +{ + actual = TEST_FAILED; +} +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/Statements/regress-157509.js b/js/src/tests/ecma_3/Statements/regress-157509.js new file mode 100644 index 000000000..847dcda1f --- /dev/null +++ b/js/src/tests/ecma_3/Statements/regress-157509.js @@ -0,0 +1,77 @@ +/* -*- 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: 15 July 2002 + * SUMMARY: Testing for SyntaxError on usage of '\' in identifiers + * See http://bugzilla.mozilla.org/show_bug.cgi?id=157509 + * + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = 157509; +var summary = "Testing for SyntaxError on usage of '\\' in identifiers"; +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 = []; + + +status = inSection(1); +expect = TEST_PASSED; +actual = TEST_FAILED_BADLY; +/* + * OK, this should generate a SyntaxError + */ +try +{ + eval('var a\\1 = 0;'); +} +catch(e) +{ + if (e instanceof SyntaxError) + actual = TEST_PASSED; + else + actual = TEST_FAILED; +} +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/Statements/regress-194364.js b/js/src/tests/ecma_3/Statements/regress-194364.js new file mode 100644 index 000000000..24ed1f4ae --- /dev/null +++ b/js/src/tests/ecma_3/Statements/regress-194364.js @@ -0,0 +1,118 @@ +/* -*- 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: 21 February 2003 + * SUMMARY: Testing eval statements containing conditional function expressions + * + * See http://bugzilla.mozilla.org/show_bug.cgi?id=194364 + * + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = 194364; +var summary = 'Testing eval statements with conditional function expressions'; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; + +/* + From ECMA-262 Edition 3, 12.4: + + 12.4 Expression Statement + + Syntax + ExpressionStatement : [lookahead not in {{, function}] Expression ; + + Note that an ExpressionStatement cannot start with an opening curly brace + because that might make it ambiguous with a Block. Also, an ExpressionStatement + cannot start with the function keyword because that might make it ambiguous with + a FunctionDeclaration. +*/ + +status = inSection(1); +actual = eval('(function() {}); 1'); +expect = 1; +addThis(); + +status = inSection(2); +actual = eval('(function f() {}); 2'); +expect = 2; +addThis(); + +status = inSection(3); +actual = eval('if (true) (function() {}); 3'); +expect = 3; +addThis(); + +status = inSection(4); +actual = eval('if (true) (function f() {}); 4'); +expect = 4; +addThis(); + +status = inSection(5); +actual = eval('if (false) (function() {}); 5'); +expect = 5; +addThis(); + +status = inSection(6); +actual = eval('if (false) (function f() {}); 6'); +expect = 6; +addThis(); + +status = inSection(7); +actual = eval('switch(true) { case true: (function() {}) }; 7'); +expect = 7; +addThis(); + +status = inSection(8); +actual = eval('switch(true) { case true: (function f() {}) }; 8'); +expect = 8; +addThis(); + +status = inSection(9); +actual = eval('switch(false) { case false: (function() {}) }; 9'); +expect = 9; +addThis(); + +status = inSection(10); +actual = eval('switch(false) { case false: (function f() {}) }; 10'); +expect = 10; +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/Statements/regress-226517.js b/js/src/tests/ecma_3/Statements/regress-226517.js new file mode 100644 index 000000000..ea71c3efb --- /dev/null +++ b/js/src/tests/ecma_3/Statements/regress-226517.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: 04 Dec 2003 + * SUMMARY: |finally| statement should execute even after a |return| + * + * See http://bugzilla.mozilla.org/show_bug.cgi?id=226517 + * + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = 226517; +var summary = '|finally| statement should execute even after a |return|'; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; + + +/* + * We can only use a return statement within a function. + * That makes the testcase more complicated to set up - + */ +function f() +{ + var return_expression_was_calculated = false; + try + { + return (return_expression_was_calculated = true); + } + finally + { + actual = return_expression_was_calculated; + } +} + + +status = inSection(1); +f(); // sets |actual| +expect = true; +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/Statements/regress-302439.js b/js/src/tests/ecma_3/Statements/regress-302439.js new file mode 100644 index 000000000..a94bfa8ee --- /dev/null +++ b/js/src/tests/ecma_3/Statements/regress-302439.js @@ -0,0 +1,1335 @@ +/* -*- 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 = 302439; +var summary = 'spandep fu should skip unused JSOP_TABLESWITCH jump table entries'; +var actual = 'No Crash'; +var expect = 'No Crash'; + +printBugNumber(BUGNUMBER); +printStatus (summary); + +function productList(catID,famID) { + clearBox(document.Support_Form.Product_ID); + + switch(parseInt(catID)) { + + case 1 : // Sound Blaster + switch(parseInt(famID)) { + + case 434 : // Audigy 4 + break; + + case 204 : // Audigy 2 + break; + + case 205 : // Audigy + + try { addBoxItem(document.Support_Form.Product_ID, 'Audigy Platinum eX', '45'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Audigy Platinum', '4846'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Audigy LS (SE)', '10365'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Audigy Digital Entertainment', '5085'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Audigy ES', '5086'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 206 : // Live! + try { addBoxItem(document.Support_Form.Product_ID, 'Live! 24-bit External', '10702'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster Live! MP3+ 5.1', '573'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Live! 5.1', '50'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Live! Digital Entertainment 5.1 (SE)', '4855'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Live! Platinum 5.1', '572'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster Live! 5.1 Digital (Dell)', '1853'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Live! Platinum', '3203'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster Live! Value', '4856'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster Live!', '4857'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 207 : // Others + try { addBoxItem(document.Support_Form.Product_ID, 'Extigy', '585'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Ensoniq AudioPCI', '420'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'PCI4.1 Digital', '681'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Vibra128 4D', '9032'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Digital Music', '154'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Vibra 128', '4851'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster 32', '1844'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'SB AWE64 Digital', '1821'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'SB PCI 5.1', '1828'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster\u00AE', '1841'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster\u00AE 16', '1842'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster 16 Wave Effects', '1843'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster AWE32', '1848'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster AWE64', '1849'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster AWE64 Gold', '1850'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster Microchannels', '1861'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster PCI 128', '1864'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster PCI 64', '1865'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster Pro', '1866'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster Audio PCI', '1559'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 16 : // Accessories + try { addBoxItem(document.Support_Form.Product_ID, 'Live!Drive II', '9278'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster MIDI Adapter', '251'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Mini to Standard MIDI Adapter', '252'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + + } + break; + + case 210 : // Portable Media Players + switch(parseInt(famID)) { + + case 211 : // Zen + try { addBoxItem(document.Support_Form.Product_ID, 'Zen Portable Media Center', '9882'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 212 : // Accessories + try { addBoxItem(document.Support_Form.Product_ID, 'Zen PMC Docking Station', '10756'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Zen PMC Li-ion Polymer Battery', '10679'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Zen PMC FM Wired Remote', '10663'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + + } + break; + + case 213 : // MP3 Players + switch(parseInt(famID)) { + + case 214 : // Zen + try { addBoxItem(document.Support_Form.Product_ID, 'Zen Touch', '10274'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Zen Micro', '10795'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Zen', '11519'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Zen Xtra', '9288'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Zen NX', '4836'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Zen USB 2.0', '9019'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD Jukebox Zen', '117'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 215 : // MuVo + try { addBoxItem(document.Support_Form.Product_ID, 'MuVo Micro N200', '10737'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'MuVo\u00B2 X-Trainer', '5080'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'MuVo Slim', '10052'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'MuVo Sport C100', '10794'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'MuVo V200', '10732'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'MuVo TX FM', '9771'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'MuVo USB 2.0', '10919'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'MuVo', '110'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'MuVo NX', '4884'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'MuVo\u00B2', '4908'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'MuVo TX', '9672'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 216 : // Digital MP3 Player + try { addBoxItem(document.Support_Form.Product_ID, 'Zen Xtra', '9288'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Rhomba NX', '10302'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'MP3 Player FX120', '11010'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'DXT 200', '4996'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Zen USB 2.0', '9019'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Jukebox 3', '296'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Creative CD-MP3 Slim 600', '1582'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Zen NX', '4836'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'MP3 Player', '4983'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'MP3 Player 2', '4984'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'MP3 Player MX', '4985'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD Jukebox Zen', '117'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'JukeBox 2', '239'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD JukeBox', '241'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD JukeBox C', '242'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Jukebox 10GB', '261'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Creative CD-MP3 M100', '264'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 217 : // Accessories + try { addBoxItem(document.Support_Form.Product_ID, 'Zen Micro Battery', '11215'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Universal Travel Adapter for Zen Micro', '11711'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Zen Neeon Stik-On', '12982'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Zen Neeon Universal Travel Adapter', '12979'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Leather Case', '11511'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Zen Neeon Leather Case', '12978'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Home Kit - Jukebox 3', '497'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD Jukebox 3 Leather Case', '498'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Faceplates - Jukebox 3', '499'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'MuVo Armband', '511'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'NOMAD II MG Wired Remote', '515'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD Jukebox Accessory Kit', '533'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD Jukebox Battery Charger Kit', '538'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD Jukebox Battery Pack', '539'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'NOMAD II MG Travel Cable', '560'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Leather Case - Jukebox 2', '562'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Battery - Jukebox 2', '563'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'MuVo Battery Modules', '999'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'PlayDock PD200', '31'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'TravelSound', '80'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Li-Ion Battery - Jukebox 3', '86'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'FM Wired Remote - Jukebox 3/Jukebox Zen/MuVo\u00B2', '115'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD Jukebox Power Adapter', '125'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Cassette Adapter Kit', '401'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Car Kit - Jukebox 3/Jukebox 2/Jukebox Zen/MuVo\u00B2', '496'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Battery Pack', '4997'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Battery Modules - MuVo NX / TX / TX FM', '9217'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Armband - MuVo NX / TX / TX FM', '10126'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + + } + break; + + case 4 : // Speaker Systems + switch(parseInt(famID)) { + + case 113 : // 7.1 Systems + try { addBoxItem(document.Support_Form.Product_ID, 'Inspire T7700', '5076'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 24 : // 6.1 Systems + try { addBoxItem(document.Support_Form.Product_ID, 'Inspire 6.1 6600', '465'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 25 : // 5.1 Systems + try { addBoxItem(document.Support_Form.Product_ID, 'Creative Inspire 5.1 5100', '1704'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'PCWorks LX520', '9412'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'I-Trigue 5600', '10736'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Inspire T5900', '10323'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Inspire P5800', '10596'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Desktop Theater 5.1 DTT2200', '428'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Inspire 5.1 5700 Digital', '439'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Creative Inspire 5.1 Digital 5500', '990'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Inspire 5.1 5200', '55'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Creative Inspire 5.1 5300', '238'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'MegaWorks THX 5.1 550', '240'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Desktop Theater 5.1 DTT3500 Digital', '290'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'PlayWorks DTT2500 Digital', '291'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Creative Inspire 5.1 5600', '1705'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Inspire T5400', '5077'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'PlayWorks PS2000 Digital', '427'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Desktop Theater 5.1', '1628'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Desktop Theater 5.1 DTT2500 Digital', '1629'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Cambridge SoundWorks MegaWorks 510D', '478'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 26 : // 4.1 Systems + try { addBoxItem(document.Support_Form.Product_ID, 'FPS1600', '47'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'FPS2000 Digital', '297'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Inspire 4.1 4400', '446'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'FPS1800', '424'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'PC-Works FourPointSurround FPS1000', '378'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'FPS1500', '388'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 27 : // 2.1 Systems + try { addBoxItem(document.Support_Form.Product_ID, 'I-Trigue 3600', '10735'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Inspire T3000', '10329'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'I-Trigue 3400', '10733'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Inspire G380', '9276'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Creative I-Trigue 3200', '10327'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'PCWorks LX220', '9407'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Creative Inspire 2.1 Slim 2600', '434'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Inspire 2.1 2500', '461'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'I-Trigue L3500', '4912'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'I-Trigue L3450', '4913'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Inspire T2900', '9025'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Inspire P380', '9026'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'SoundWorks SW320', '48'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'MegaWorks THX 2.1 250D', '124'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'I-Trigue 2.1 3300', '139'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Creative SBS 2.1 350 Speakers', '281'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'SBS 370', '283'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'PCWorks', '284'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Creative Inspire Slim 500', '289'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Creative Inspire 2.1 2400', '298'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'SoundWorks Digital', '299'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'SoundWorks SW310', '304'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'I-Trigue i3350', '279'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 28 : // 2.0 Systems + try { addBoxItem(document.Support_Form.Product_ID, 'Inspire Monitor M85-D', '4910'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Inspire 2.0 1300', '4918'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'SBS 230 Speakers', '4905'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'SBS52', '1'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'SBS16', '2'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Cambridge SBS20', '3'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'SBS50', '1834'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'SBS10', '1831'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Creative SBS15', '4906'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 29 : // Portable Systems + try { addBoxItem(document.Support_Form.Product_ID, 'TravelSound 200', '10164'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'TravelSound MP3', '1874'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'PlayDock PD200', '31'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'TravelSound', '80'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'TravelSound i-300', '9022'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Creative TravelSound MP3 Titanium', '991'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 136 : // Decoders + try { addBoxItem(document.Support_Form.Product_ID, 'Decoder DDTS-100', '9468'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 30 : // Accessories + try { addBoxItem(document.Support_Form.Product_ID, 'MT-1100 Speaker Stands', '166'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Headphones HQ-1700', '11164'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Headphones HQ-1300', '4936'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Headphones HN-505', '4938'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Backphones HQ-65', '4916'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Backphones HQ-60', '4937'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Earphones EP-880', '11156'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Earphones EP-480', '11708'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Headset HE-100', '11023'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Headset HS-300', '4939'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'MT-1200 Speaker Stands', '9515'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'SurroundStation', '32'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Creative HQ-2000 Headphones', '4'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'MT-500 Speaker Tripods', '399'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Inspire 2600 Spkr Grilles', '636'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Inspire 5300 Spkr Grilles', '637'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Inspire 5700 Spkr Grilles', '664'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Creative HQ-1000 Headphones', '4988'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + + } + break; + + case 218 : // Web Cameras + switch(parseInt(famID)) { + + case 219 : // WebCam + try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Live! Ultra for Notebooks', '11491'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Live! Ultra', '10451'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Live! Pro', '10450'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Live!', '10412'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Instant', '10410'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'WebCam NX Ultra', '9340'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'WebCam NX Pro', '628'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'WebCam NX', '627'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'WebCam PRO eX', '243'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'WebCam PRO', '616'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Go Plus', '15'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Webcam Go ES', '1898'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Go Mini', '1900'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Go', '17'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Video Blaster WebCam Plus', '16'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Notebook', '629'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Mobile', '4890'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'WebCam 5', '1896'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Vista Pro', '11053'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Vista Plus', '11043'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'WebCam', '65'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'WebCam II', '4900'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'WebCam 3', '1908'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Vista', '1907'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 220 : // PC-CAM + try { addBoxItem(document.Support_Form.Product_ID, 'PC-CAM 900', '10119'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'PC-CAM 930 Slim', '11431'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'PC-CAM 920 Slim', '10823'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'PC-CAM 880', '308'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'PC-CAM 750', '4878'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'PC-CAM 850', '4879'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Creative PC-CAM 300', '49'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'PC-CAM 350', '106'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'PC-CAM 550', '107'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'CardCam Value', '116'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'PC-CAM 600', '260'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + + } + break; + + case 437 : // Headphones & Headsets + switch(parseInt(famID)) { + + case 438 : // Headphones + try { addBoxItem(document.Support_Form.Product_ID, 'Headphones HQ-1700', '11164'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Headphones HQ-1300', '4936'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Headphones CB2530', '11644'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 439 : // Noise-Cancelling Headphones + try { addBoxItem(document.Support_Form.Product_ID, 'Headphones HN-505', '4938'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 440 : // Backphones + try { addBoxItem(document.Support_Form.Product_ID, 'Backphones HQ-65', '4916'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Backphones HQ-60', '4937'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 441 : // Earphones + try { addBoxItem(document.Support_Form.Product_ID, 'Earphones EP-880', '11156'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Earphones EP-630', '11397'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Earphones EP-480', '11708'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Earphones EP-380', '11229'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 442 : // Headsets + try { addBoxItem(document.Support_Form.Product_ID, 'Headset HE-100', '11023'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Headset HS-300', '4939'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + + } + break; + + case 9 : // Storage Devices + switch(parseInt(famID)) { + + case 259 : // DVD±RW Drive + try { addBoxItem(document.Support_Form.Product_ID, 'DVD±RW Dual 8X', '9599'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'DVD±RW Dual 8x8', '10305'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'DVD+RW Dual External 8x8', '10583'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 47 : // Combo Drive + try { addBoxItem(document.Support_Form.Product_ID, 'Combo Drive 52.32.52x/16x', '11712'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Combo Drive 40-12-40/16', '4998'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Combo Drive NS', '9454'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 46 : // CD-RW Drive + try { addBoxItem(document.Support_Form.Product_ID, 'CD-RW External 52-32-52x', '9481'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'CD-RW Blaster 12-10-32', '8'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'CD-RW 52.24.52', '1590'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'CD-RW Blaster 24-10-40 External', '4944'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'CD-RW External 52-24-52x', '9027'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'CD-RW 52-32-52x', '9453'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'CD-RW Blaster 48-12-48 External', '9020'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'CD-RW Blaster 48-12-48', '4941'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 45 : // PC-DVD Drive + try { addBoxItem(document.Support_Form.Product_ID, 'PC-DVD Encore 12x', '6'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'PC-DVD ROM 12x', '1486'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'PC-DVD DVD-ROM 16x', '1490'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'PC-DVD MPEG-1 Decoder Board', '1801'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 44 : // CD-ROM Drive + try { addBoxItem(document.Support_Form.Product_ID, 'CD-ROM Blaster Digital iR52X', '3562'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'CD-ROM Blaster 52X', '11'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, '12x CD-ROM Drives', '1485'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, '16x CD-ROM Drives', '1489'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, '48x CD-ROM Drives', '1548'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, '1x & 2x CD-ROM Drives', '1493'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, '24x CD-ROM Drives', '1495'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, '2x & 3x CD-ROM (SCSI)', '1496'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, '32x CD-ROM Drives', '1498'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, '36x CD-ROM Drives', '1499'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, '40x CD-Rom Drives', '1547'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, '4x CD-ROM Drives', '1549'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, '6x CD-ROM Drives', '1552'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, '8x CD-ROM Drives', '1554'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 49 : // Portable Harddisk + try { addBoxItem(document.Support_Form.Product_ID, 'Storage Blaster Portable Harddisk', '8996'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 265 : // Portable Storage + try { addBoxItem(document.Support_Form.Product_ID, 'ThumbDrive', '10681'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + + } + break; + + case 12 : // PC Barebone + switch(parseInt(famID)) { + + case 54 : // SLiX PC + try { addBoxItem(document.Support_Form.Product_ID, 'SLiX PC MPC61Y0', '11766'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + + } + break; + + case 11 : // Monitors + switch(parseInt(famID)) { + + case 53 : // LCD + try { addBoxItem(document.Support_Form.Product_ID, '17" TFT LCD Monitor With DVI', '9980'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + + } + break; + + case 60 : // Video + switch(parseInt(famID)) { + + case 96 : // Video Editing + try { addBoxItem(document.Support_Form.Product_ID, 'Video Blaster MovieMaker', '13'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + + } + break; + + case 13 : // Accessories + switch(parseInt(famID)) { + + case 55 : // Sound Blaster + try { addBoxItem(document.Support_Form.Product_ID, 'Optical Digital I/O Card II', '30'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster MIDI Adapter', '251'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Mini to Standard MIDI Adapter', '252'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Live!Drive II', '9278'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster Audigy Internal Drive', '88'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Sound Blaster Audigy External Drive', '89'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Live! Drive IR', '26'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Live! Drive I', '27'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Remote Controller SBLive', '1816'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 449 : // Zen Micro + try { addBoxItem(document.Support_Form.Product_ID, 'Universal Travel Adapter for Zen Micro', '11711'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Leather Case', '11511'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 483 : // Zen Neeon + try { addBoxItem(document.Support_Form.Product_ID, 'Zen Neeon Stik-On', '12982'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Zen Neeon Leather Case', '12978'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Zen Neeon Universal Travel Adapter', '12979'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 264 : // Portable Media Center + try { addBoxItem(document.Support_Form.Product_ID, 'Zen PMC Docking Station', '10756'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Zen PMC Li-ion Polymer Battery', '10679'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Zen PMC FM Wired Remote', '10663'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 57 : // MP3 Players + try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD JukeBox 3 Car Kit', '4894'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Home Kit - Jukebox 3', '497'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD Jukebox 3 Leather Case', '498'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Faceplates - Jukebox 3', '499'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'MuVo Armband', '511'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD Jukebox Accessory Kit', '533'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD Jukebox Battery Charger Kit', '538'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD Jukebox Battery Pack', '539'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Leather Case - Jukebox 2', '562'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Battery - Jukebox 2', '563'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Li-Ion Battery - Jukebox 3', '86'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'FM Wired Remote - Jukebox 3/Jukebox Zen/MuVo\u00B2', '115'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Creative NOMAD Jukebox Power Adapter', '125'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Cassette Adapter Kit', '401'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Car Kit - Jukebox 3/Jukebox 2/Jukebox Zen/MuVo\u00B2', '496'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Battery Modules - MuVo NX / TX / TX FM', '9217'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Armband - MuVo NX / TX / TX FM', '10126'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 58 : // Speaker Systems + try { addBoxItem(document.Support_Form.Product_ID, 'MT-1100 Speaker Stands', '166'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Headphones HQ-1700', '11164'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Earphones EP-880', '11156'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Headset HE-100', '11023'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'MT-500 Speaker Tripods', '399'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Speaker Extension Cables', '415'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Inspire 5300 Spkr Grilles', '637'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Inspire 5700 Spkr Grilles', '664'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 256 : // Wireless + try { addBoxItem(document.Support_Form.Product_ID, 'Wireless Headset for Bluetooth', '10287'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Headset CB2455', '11394'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Headphones CB2530', '11644'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 59 : // Storage + try { addBoxItem(document.Support_Form.Product_ID, 'S-Video Cable Coupler', '250'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'IDE Cable Set', '255'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Dxr2 Decoder Board', '1648'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Dxr3 Decoder Card', '12'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + + } + break; + + case 118 : // Digital Cameras + switch(parseInt(famID)) { + + case 117 : // Digital Still Cameras + try { addBoxItem(document.Support_Form.Product_ID, 'DC-CAM 4200ZS', '10822'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'DC-CAM 3200Z', '9762'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'DC-CAM 3000Z', '9028'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'CardCam', '120'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'CardCam Value', '116'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 309 : // Digital Video Cameras + try { addBoxItem(document.Support_Form.Product_ID, 'DiVi CAM 316', '11175'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + + } + break; + + case 10 : // Mice & Keyboards + switch(parseInt(famID)) { + + case 223 : // Wired Mice + try { addBoxItem(document.Support_Form.Product_ID, 'Mouse 5500', '11387'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Mouse 3500', '11388'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Mouse Classic', '4919'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Mouse Optical Lite', '4920'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Mouse Optical 3000', '4924'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Creative Optical Mouse', '262'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Mouse Notebook Optical', '9147'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 224 : // Wireless Mice + try { addBoxItem(document.Support_Form.Product_ID, 'FreePoint Travel', '11165'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'FreePoint Travel Mini', '11166'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'FreePoint 5500', '11178'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'FreePoint 3500', '11386'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Mouse Wireless Optical 5000', '9145'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Mouse Wireless Optical', '263'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Mouse Wireless Optical 3000', '4923'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 227 : // Wireless Mice & Keyboards + try { addBoxItem(document.Support_Form.Product_ID, 'Desktop Wireless 9000 Pro', '11493'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Desktop Wireless 8000', '10104'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Desktop Wireless 6000', '5039'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 228 : // Wired PC & MIDI Keyboards + try { addBoxItem(document.Support_Form.Product_ID, 'Prodikeys DM', '9389'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Prodikeys DM Value', '9600'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Prodikeys', '504'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 52 : // Gaming Devices + try { addBoxItem(document.Support_Form.Product_ID, 'Avant Force NX', '9394'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Cobra Force 3D', '9396'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Gamepad I', '1658'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + + } + break; + + case 8 : // Musical Keyboards + switch(parseInt(famID)) { + + case 234 : // PC & MIDI Keyboards + try { addBoxItem(document.Support_Form.Product_ID, 'Prodikeys DM', '9389'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Prodikeys DM Value', '9600'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Prodikeys', '504'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 231 : // MIDI Keyboards + try { addBoxItem(document.Support_Form.Product_ID, 'Creative Blasterkeys', '40'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + + } + break; + + case 237 : // Creative Professional + switch(parseInt(famID)) { + + case 239 : // Digital Audio Systems + try { addBoxItem(document.Support_Form.Product_ID, 'E-MU 1820M', '10496'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'E-MU 1212M', '10500'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'E-MU 1820', '10494'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'E-MU 0404', '10498'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 240 : // Desktop Sampling Systems + try { addBoxItem(document.Support_Form.Product_ID, 'Emulator X', '10502'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Emulator X Studio', '10504'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Proteus X', '11074'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 421 : // Desktop Sound Modules + try { addBoxItem(document.Support_Form.Product_ID, 'Proteus X', '11074'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 258 : // Accessories and Upgrades + try { addBoxItem(document.Support_Form.Product_ID, 'Proteus X Software Upgrade', '11073'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Emulator X OS Upgrade', '10225'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Mo\'Phatt X', '11329'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Planet Earth X', '11330'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Virtuoso X', '11332'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Vintage X Pro Collection', '11072'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Street Kits', '11331'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'AudioDock M', '10229'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Audio Dock', '10230'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Beat Shop 2', '10404'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'EDI Cable', '10227'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Sync Daughter Card', '10576'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + + } + break; + + case 243 : // Wireless + switch(parseInt(famID)) { + + case 246 : // Mice & Keyboards + try { addBoxItem(document.Support_Form.Product_ID, 'FreePoint 5500', '11178'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'FreePoint 3500', '11386'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Mouse Wireless Optical 5000', '9145'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Desktop Wireless 8000', '10104'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Desktop Wireless 6000', '5039'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Mouse Wireless Optical', '263'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Mouse Wireless Optical 3000', '4923'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 248 : // Accessories + try { addBoxItem(document.Support_Form.Product_ID, 'Headset CB2460', '11238'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Headset CB2455', '11394'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Wireless Headset for Bluetooth', '10287'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Headphones CB2530', '11644'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + + } + break; + + case 244 : // Notebook Products + switch(parseInt(famID)) { + + case 250 : // PCMCIA Sound Blaster + try { addBoxItem(document.Support_Form.Product_ID, 'Audigy 2 ZS Notebook', '10769'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 249 : // USB Sound Blaster + try { addBoxItem(document.Support_Form.Product_ID, 'Audigy 2 NX', '9103'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Live! 24-bit External', '10702'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Digital Music LX', '10246'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Digital Music', '154'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Extigy', '585'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 251 : // Portable Speaker Systems + try { addBoxItem(document.Support_Form.Product_ID, 'TravelSound 200', '10164'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'TravelSound i-300', '9022'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'TravelSound MP3', '1874'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 252 : // Mice & Keyboards + try { addBoxItem(document.Support_Form.Product_ID, 'Mouse Wireless NoteBook Optical', '10188'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Mouse Notebook Optical', '9147'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 253 : // Web Cameras + try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Live! Ultra for Notebooks', '11491'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Notebook', '629'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'WebCam Mobile', '4890'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + + } + break; + + case 6 : // Graphics + switch(parseInt(famID)) { + + case 37 : // ATI Radeon 9000 series + try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster RX9250', '11489'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster RX9250 Xtreme', '11490'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 230 : // 3D Labs + try { addBoxItem(document.Support_Form.Product_ID, 'Graphics Blaster Picture Perfect', '164'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 99 : // NVIDIA GeForce + try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster GeForce', '1500'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster GeForce 2', '1501'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster GeForce Pro', '1505'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster GeForce2 ULTRA 64MB AGP', '1512'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 98 : // NVIDIA Riva TNT Series + try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster RIVA TNT2 Pro', '1527'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Graphics Blaster RIVA128ZX', '1689'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster Riva TNT2', '4841'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster RIVA TNT2 Value', '4842'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster TNT2 Ultra', '4843'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 73 : // 3D Blaster + try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster 4 Titanium 4200', '1516'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster 5 RX9700 Pro', '1524'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster 4 MX440', '1539'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster 5 RX9000 64MB', '1540'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster 5 RX9000 Pro', '1541'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster 4 MX420', '4869'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster 5 RX9800 Pro', '4917'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster 4 MX460', '4969'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster 5 RX9600', '4973'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster 5 RX9000 Pro 128MB', '8995'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster 5 RX9200 SE', '9024'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster 5 RX9600 Pro', '9576'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster 5 RX9600 XT', '10311'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster 5 RX9600 SE', '10335'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster Savage 4', '1536'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster VLB', '1537'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster Voodoo 2', '1538'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster PCI', '1523'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster Banshee', '1506'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, '3D Blaster Banshee AGP', '1507'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + + } + break; + + case 7 : // Modems & Networking + switch(parseInt(famID)) { + + case 41 : // Wireless + try { addBoxItem(document.Support_Form.Product_ID, 'USB Adapter CB2431', '10863'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Network Blaster Wireless PCMCIA Card', '3868'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 42 : // Broadband + try { addBoxItem(document.Support_Form.Product_ID, 'Broadband Blaster DSL Router 8015U', '11176'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Broadband Blaster Router 8110', '10280'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Broadband Blaster ADSL Bridge ', '4873'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Broadband Blaster USB Modem', '4871'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Broadband Blaster DSL', '4921'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 40 : // Analog + try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster PCMCIA', '24'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster V.92 PCI', '52'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster V.92 Serial', '258'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster V.92 USB', '266'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Modem 56k Internal', '1715'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster Flash 56II ISA', '18'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster V.90 ISA', '19'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster Flash 56 PCI', '21'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster V.90 USB', '22'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster V.90 External', '23'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster USB (DE5675)', '8992'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster USB (DE5673)', '8991'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster PCI (DI5663)', '4999'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster PCI (DI5656)', '8988'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster PCI (DI5655)', '8989'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster External (DE5625)', '8990'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Modem Blaster 28.8 External', '5000'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'CT5451 Modem Blaster Voice PnP', '5001'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'Phone Blaster', '1809'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + + } + break; + + case 106 : // Software + switch(parseInt(famID)) { + + case 241 : // HansVision DXT + try { addBoxItem(document.Support_Form.Product_ID, 'HansVision DXT 2005 Edition', '12218'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 242 : // Children\'s Multimedia Educational + try { addBoxItem(document.Support_Form.Product_ID, 'WaWaYaYa Happy Mandarin Series', '11269'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + try { addBoxItem(document.Support_Form.Product_ID, 'WaWaYaYa Happy English Series', '4932'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 107 : // HansVision + try { addBoxItem(document.Support_Form.Product_ID, 'HansVision DXT', '4928'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 108 : // WaWaYaYa + try { addBoxItem(document.Support_Form.Product_ID, 'WaWaYaYa Comprehensive Ability Series', '4930'); } catch(e) {addBoxItem(document.Support_Form.Product_ID, '1', '2'); } // + + break; + + case 109 : // Others + + break; + + + } + break; + + } + // addBoxItem(document.Support_Form.Product_ID, 'Zen Portable Media Center', 'DUMMYPREFIX_ZenPMC_Temp|9882'); +} + +try +{ + productList(0,0); +} +catch(e) +{ +} + +reportCompare(expect, actual, summary); diff --git a/js/src/tests/ecma_3/Statements/regress-324650.js b/js/src/tests/ecma_3/Statements/regress-324650.js new file mode 100644 index 000000000..d4314582a --- /dev/null +++ b/js/src/tests/ecma_3/Statements/regress-324650.js @@ -0,0 +1,5427 @@ +/* -*- 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 = 324650; +var summary = 'Switch Statement with many cases'; +var actual = 'No Hang'; +var expect = 'No Hang'; + +printBugNumber(BUGNUMBER); +printStatus (summary); + +var notevil = "z1"; +var notevil2 = "z2"; +var notevil3 = "z3"; +var dut = 7; +var dut2 = 7; +var dut3 = 7; + +/* shouldn't be evil */ + +switch ( notevil ) { +case "z1": dut = 2; + break; +case "z2": + notevil = (notevil + 2)/2; + break; +case "z3": + notevil = (notevil + 3)/2; + break; +case "z4": + notevil = (notevil + 4)/2; + break; +case "z5": + notevil = (notevil + 5)/2; + break; +case "z6": + notevil = (notevil + 6)/2; + break; +case "z7": + notevil = (notevil + 7)/2; + break; +case "z8": + notevil = (notevil + 8)/2; + break; +case "z9": + notevil = (notevil + 9)/2; + break; +case "z10": + notevil = (notevil + 10)/2; + break; +case "z11": + notevil = (notevil + 11)/2; + break; +case "z12": + notevil = (notevil + 12)/2; + break; +case "z13": + notevil = (notevil + 13)/2; + break; +case "z14": + notevil = (notevil + 14)/2; + break; +case "z15": + notevil = (notevil + 15)/2; + break; +case "z16": + notevil = (notevil + 16)/2; + break; +case "z17": + notevil = (notevil + 17)/2; + break; +case "z18": + notevil = (notevil + 18)/2; + break; +case "z19": + notevil = (notevil + 19)/2; + break; +case "z20": + notevil = (notevil + 20)/2; + break; +case "z21": + notevil = (notevil + 21)/2; + break; +case "z22": + notevil = (notevil + 22)/2; + break; +case "z23": + notevil = (notevil + 23)/2; + break; +case "z24": + notevil = (notevil + 24)/2; + break; +case "z25": + notevil = (notevil + 25)/2; + break; +case "z26": + notevil = (notevil + 26)/2; + break; +case "z27": + notevil = (notevil + 27)/2; + break; +case "z28": + notevil = (notevil + 28)/2; + break; +case "z29": + notevil = (notevil + 29)/2; + break; +case "z30": + notevil = (notevil + 30)/2; + break; +case "z31": + notevil = (notevil + 31)/2; + break; +case "z32": + notevil = (notevil + 32)/2; + break; +case "z33": + notevil = (notevil + 33)/2; + break; +case "z34": + notevil = (notevil + 34)/2; + break; +case "z35": + notevil = (notevil + 35)/2; + break; +case "z36": + notevil = (notevil + 36)/2; + break; +case "z37": + notevil = (notevil + 37)/2; + break; +case "z38": + notevil = (notevil + 38)/2; + break; +case "z39": + notevil = (notevil + 39)/2; + break; +case "z40": + notevil = (notevil + 40)/2; + break; +case "z41": + notevil = (notevil + 41)/2; + break; +case "z42": + notevil = (notevil + 42)/2; + break; +case "z43": + notevil = (notevil + 43)/2; + break; +case "z44": + notevil = (notevil + 44)/2; + break; +case "z45": + notevil = (notevil + 45)/2; + break; +case "z46": + notevil = (notevil + 46)/2; + break; +case "z47": + notevil = (notevil + 47)/2; + break; +case "z48": + notevil = (notevil + 48)/2; + break; +case "z49": + notevil = (notevil + 49)/2; + break; +case "z50": + notevil = (notevil + 50)/2; + break; +case "z51": + notevil = (notevil + 51)/2; + break; +case "z52": + notevil = (notevil + 52)/2; + break; +case "z53": + notevil = (notevil + 53)/2; + break; +case "z54": + notevil = (notevil + 54)/2; + break; +case "z55": + notevil = (notevil + 55)/2; + break; +case "z56": + notevil = (notevil + 56)/2; + break; +case "z57": + notevil = (notevil + 57)/2; + break; +case "z58": + notevil = (notevil + 58)/2; + break; +case "z59": + notevil = (notevil + 59)/2; + break; +case "z60": + notevil = (notevil + 60)/2; + break; +case "z61": + notevil = (notevil + 61)/2; + break; +case "z62": + notevil = (notevil + 62)/2; + break; +case "z63": + notevil = (notevil + 63)/2; + break; +case "z64": + notevil = (notevil + 64)/2; + break; +case "z65": + notevil = (notevil + 65)/2; + break; +case "z66": + notevil = (notevil + 66)/2; + break; +case "z67": + notevil = (notevil + 67)/2; + break; +case "z68": + notevil = (notevil + 68)/2; + break; +case "z69": + notevil = (notevil + 69)/2; + break; +case "z70": + notevil = (notevil + 70)/2; + break; +case "z71": + notevil = (notevil + 71)/2; + break; +case "z72": + notevil = (notevil + 72)/2; + break; +case "z73": + notevil = (notevil + 73)/2; + break; +case "z74": + notevil = (notevil + 74)/2; + break; +case "z75": + notevil = (notevil + 75)/2; + break; +case "z76": + notevil = (notevil + 76)/2; + break; +case "z77": + notevil = (notevil + 77)/2; + break; +case "z78": + notevil = (notevil + 78)/2; + break; +case "z79": + notevil = (notevil + 79)/2; + break; +case "z80": + notevil = (notevil + 80)/2; + break; +case "z81": + notevil = (notevil + 81)/2; + break; +case "z82": + notevil = (notevil + 82)/2; + break; +case "z83": + notevil = (notevil + 83)/2; + break; +case "z84": + notevil = (notevil + 84)/2; + break; +case "z85": + notevil = (notevil + 85)/2; + break; +case "z86": + notevil = (notevil + 86)/2; + break; +case "z87": + notevil = (notevil + 87)/2; + break; +case "z88": + notevil = (notevil + 88)/2; + break; +case "z89": + notevil = (notevil + 89)/2; + break; +case "z90": + notevil = (notevil + 90)/2; + break; +case "z91": + notevil = (notevil + 91)/2; + break; +case "z92": + notevil = (notevil + 92)/2; + break; +case "z93": + notevil = (notevil + 93)/2; + break; +case "z94": + notevil = (notevil + 94)/2; + break; +case "z95": + notevil = (notevil + 95)/2; + break; +case "z96": + notevil = (notevil + 96)/2; + break; +case "z97": + notevil = (notevil + 97)/2; + break; +case "z98": + notevil = (notevil + 98)/2; + break; +case "z99": + notevil = (notevil + 99)/2; + break; +case "z100": + notevil = (notevil + 100)/2; + break; +case "z101": + notevil = (notevil + 101)/2; + break; +case "z102": + notevil = (notevil + 102)/2; + break; +case "z103": + notevil = (notevil + 103)/2; + break; +case "z104": + notevil = (notevil + 104)/2; + break; +case "z105": + notevil = (notevil + 105)/2; + break; +case "z106": + notevil = (notevil + 106)/2; + break; +case "z107": + notevil = (notevil + 107)/2; + break; +case "z108": + notevil = (notevil + 108)/2; + break; +case "z109": + notevil = (notevil + 109)/2; + break; +case "z110": + notevil = (notevil + 110)/2; + break; +case "z111": + notevil = (notevil + 111)/2; + break; +case "z112": + notevil = (notevil + 112)/2; + break; +case "z113": + notevil = (notevil + 113)/2; + break; +case "z114": + notevil = (notevil + 114)/2; + break; +case "z115": + notevil = (notevil + 115)/2; + break; +case "z116": + notevil = (notevil + 116)/2; + break; +case "z117": + notevil = (notevil + 117)/2; + break; +case "z118": + notevil = (notevil + 118)/2; + break; +case "z119": + notevil = (notevil + 119)/2; + break; +case "z120": + notevil = (notevil + 120)/2; + break; +case "z121": + notevil = (notevil + 121)/2; + break; +case "z122": + notevil = (notevil + 122)/2; + break; +case "z123": + notevil = (notevil + 123)/2; + break; +case "z124": + notevil = (notevil + 124)/2; + break; +case "z125": + notevil = (notevil + 125)/2; + break; +case "z126": + notevil = (notevil + 126)/2; + break; +case "z127": + notevil = (notevil + 127)/2; + break; +case "z128": + notevil = (notevil + 128)/2; + break; +case "z129": + notevil = (notevil + 129)/2; + break; +case "z130": + notevil = (notevil + 130)/2; + break; +case "z131": + notevil = (notevil + 131)/2; + break; +case "z132": + notevil = (notevil + 132)/2; + break; +case "z133": + notevil = (notevil + 133)/2; + break; +case "z134": + notevil = (notevil + 134)/2; + break; +case "z135": + notevil = (notevil + 135)/2; + break; +case "z136": + notevil = (notevil + 136)/2; + break; +case "z137": + notevil = (notevil + 137)/2; + break; +case "z138": + notevil = (notevil + 138)/2; + break; +case "z139": + notevil = (notevil + 139)/2; + break; +case "z140": + notevil = (notevil + 140)/2; + break; +case "z141": + notevil = (notevil + 141)/2; + break; +case "z142": + notevil = (notevil + 142)/2; + break; +case "z143": + notevil = (notevil + 143)/2; + break; +case "z144": + notevil = (notevil + 144)/2; + break; +case "z145": + notevil = (notevil + 145)/2; + break; +case "z146": + notevil = (notevil + 146)/2; + break; +case "z147": + notevil = (notevil + 147)/2; + break; +case "z148": + notevil = (notevil + 148)/2; + break; +case "z149": + notevil = (notevil + 149)/2; + break; +case "z150": + notevil = (notevil + 150)/2; + break; +case "z151": + notevil = (notevil + 151)/2; + break; +case "z152": + notevil = (notevil + 152)/2; + break; +case "z153": + notevil = (notevil + 153)/2; + break; +case "z154": + notevil = (notevil + 154)/2; + break; +case "z155": + notevil = (notevil + 155)/2; + break; +case "z156": + notevil = (notevil + 156)/2; + break; +case "z157": + notevil = (notevil + 157)/2; + break; +case "z158": + notevil = (notevil + 158)/2; + break; +case "z159": + notevil = (notevil + 159)/2; + break; +case "z160": + notevil = (notevil + 160)/2; + break; +case "z161": + notevil = (notevil + 161)/2; + break; +case "z162": + notevil = (notevil + 162)/2; + break; +case "z163": + notevil = (notevil + 163)/2; + break; +case "z164": + notevil = (notevil + 164)/2; + break; +case "z165": + notevil = (notevil + 165)/2; + break; +case "z166": + notevil = (notevil + 166)/2; + break; +case "z167": + notevil = (notevil + 167)/2; + break; +case "z168": + notevil = (notevil + 168)/2; + break; +case "z169": + notevil = (notevil + 169)/2; + break; +case "z170": + notevil = (notevil + 170)/2; + break; +case "z171": + notevil = (notevil + 171)/2; + break; +case "z172": + notevil = (notevil + 172)/2; + break; +case "z173": + notevil = (notevil + 173)/2; + break; +case "z174": + notevil = (notevil + 174)/2; + break; +case "z175": + notevil = (notevil + 175)/2; + break; +case "z176": + notevil = (notevil + 176)/2; + break; +case "z177": + notevil = (notevil + 177)/2; + break; +case "z178": + notevil = (notevil + 178)/2; + break; +case "z179": + notevil = (notevil + 179)/2; + break; +case "z180": + notevil = (notevil + 180)/2; + break; +case "z181": + notevil = (notevil + 181)/2; + break; +case "z182": + notevil = (notevil + 182)/2; + break; +case "z183": + notevil = (notevil + 183)/2; + break; +case "z184": + notevil = (notevil + 184)/2; + break; +case "z185": + notevil = (notevil + 185)/2; + break; +case "z186": + notevil = (notevil + 186)/2; + break; +case "z187": + notevil = (notevil + 187)/2; + break; +case "z188": + notevil = (notevil + 188)/2; + break; +case "z189": + notevil = (notevil + 189)/2; + break; +case "z190": + notevil = (notevil + 190)/2; + break; +case "z191": + notevil = (notevil + 191)/2; + break; +case "z192": + notevil = (notevil + 192)/2; + break; +case "z193": + notevil = (notevil + 193)/2; + break; +case "z194": + notevil = (notevil + 194)/2; + break; +case "z195": + notevil = (notevil + 195)/2; + break; +case "z196": + notevil = (notevil + 196)/2; + break; +case "z197": + notevil = (notevil + 197)/2; + break; +case "z198": + notevil = (notevil + 198)/2; + break; +case "z199": + notevil = (notevil + 199)/2; + break; +case "z200": + notevil = (notevil + 200)/2; + break; +case "z201": + notevil = (notevil + 201)/2; + break; +case "z202": + notevil = (notevil + 202)/2; + break; +case "z203": + notevil = (notevil + 203)/2; + break; +case "z204": + notevil = (notevil + 204)/2; + break; +case "z205": + notevil = (notevil + 205)/2; + break; +case "z206": + notevil = (notevil + 206)/2; + break; +case "z207": + notevil = (notevil + 207)/2; + break; +case "z208": + notevil = (notevil + 208)/2; + break; +case "z209": + notevil = (notevil + 209)/2; + break; +case "z210": + notevil = (notevil + 210)/2; + break; +case "z211": + notevil = (notevil + 211)/2; + break; +case "z212": + notevil = (notevil + 212)/2; + break; +case "z213": + notevil = (notevil + 213)/2; + break; +case "z214": + notevil = (notevil + 214)/2; + break; +case "z215": + notevil = (notevil + 215)/2; + break; +case "z216": + notevil = (notevil + 216)/2; + break; +case "z217": + notevil = (notevil + 217)/2; + break; +case "z218": + notevil = (notevil + 218)/2; + break; +case "z219": + notevil = (notevil + 219)/2; + break; +case "z220": + notevil = (notevil + 220)/2; + break; +case "z221": + notevil = (notevil + 221)/2; + break; +case "z222": + notevil = (notevil + 222)/2; + break; +case "z223": + notevil = (notevil + 223)/2; + break; +case "z224": + notevil = (notevil + 224)/2; + break; +case "z225": + notevil = (notevil + 225)/2; + break; +case "z226": + notevil = (notevil + 226)/2; + break; +case "z227": + notevil = (notevil + 227)/2; + break; +case "z228": + notevil = (notevil + 228)/2; + break; +case "z229": + notevil = (notevil + 229)/2; + break; +case "z230": + notevil = (notevil + 230)/2; + break; +case "z231": + notevil = (notevil + 231)/2; + break; +case "z232": + notevil = (notevil + 232)/2; + break; +case "z233": + notevil = (notevil + 233)/2; + break; +case "z234": + notevil = (notevil + 234)/2; + break; +case "z235": + notevil = (notevil + 235)/2; + break; +case "z236": + notevil = (notevil + 236)/2; + break; +case "z237": + notevil = (notevil + 237)/2; + break; +case "z238": + notevil = (notevil + 238)/2; + break; +case "z239": + notevil = (notevil + 239)/2; + break; +case "z240": + notevil = (notevil + 240)/2; + break; +case "z241": + notevil = (notevil + 241)/2; + break; +case "z242": + notevil = (notevil + 242)/2; + break; +case "z243": + notevil = (notevil + 243)/2; + break; +case "z244": + notevil = (notevil + 244)/2; + break; +case "z245": + notevil = (notevil + 245)/2; + break; +case "z246": + notevil = (notevil + 246)/2; + break; +case "z247": + notevil = (notevil + 247)/2; + break; +case "z248": + notevil = (notevil + 248)/2; + break; +case "z249": + notevil = (notevil + 249)/2; + break; +case "z250": + notevil = (notevil + 250)/2; + break; +case "z251": + notevil = (notevil + 251)/2; + break; +case "z252": + notevil = (notevil + 252)/2; + break; +case "z253": + notevil = (notevil + 253)/2; + break; +case "z254": + notevil = (notevil + 254)/2; + break; +case "z255": + notevil = (notevil + 255)/2; + break; +case "z256": + notevil = (notevil + 256)/2; + break; +case "z257": + notevil = (notevil + 257)/2; + break; +case "z258": + notevil = (notevil + 258)/2; + break; +case "z259": + notevil = (notevil + 259)/2; + break; +case "z260": + notevil = (notevil + 260)/2; + break; +case "z261": + notevil = (notevil + 261)/2; + break; +case "z262": + notevil = (notevil + 262)/2; + break; +case "z263": + notevil = (notevil + 263)/2; + break; +case "z264": + notevil = (notevil + 264)/2; + break; +case "z265": + notevil = (notevil + 265)/2; + break; +case "z266": + notevil = (notevil + 266)/2; + break; +case "z267": + notevil = (notevil + 267)/2; + break; +case "z268": + notevil = (notevil + 268)/2; + break; +case "z269": + notevil = (notevil + 269)/2; + break; +case "z270": + notevil = (notevil + 270)/2; + break; +case "z271": + notevil = (notevil + 271)/2; + break; +case "z272": + notevil = (notevil + 272)/2; + break; +case "z273": + notevil = (notevil + 273)/2; + break; +case "z274": + notevil = (notevil + 274)/2; + break; +case "z275": + notevil = (notevil + 275)/2; + break; +case "z276": + notevil = (notevil + 276)/2; + break; +case "z277": + notevil = (notevil + 277)/2; + break; +case "z278": + notevil = (notevil + 278)/2; + break; +case "z279": + notevil = (notevil + 279)/2; + break; +case "z280": + notevil = (notevil + 280)/2; + break; +case "z281": + notevil = (notevil + 281)/2; + break; +case "z282": + notevil = (notevil + 282)/2; + break; +case "z283": + notevil = (notevil + 283)/2; + break; +case "z284": + notevil = (notevil + 284)/2; + break; +case "z285": + notevil = (notevil + 285)/2; + break; +case "z286": + notevil = (notevil + 286)/2; + break; +case "z287": + notevil = (notevil + 287)/2; + break; +case "z288": + notevil = (notevil + 288)/2; + break; +case "z289": + notevil = (notevil + 289)/2; + break; +case "z290": + notevil = (notevil + 290)/2; + break; +case "z291": + notevil = (notevil + 291)/2; + break; +case "z292": + notevil = (notevil + 292)/2; + break; +case "z293": + notevil = (notevil + 293)/2; + break; +case "z294": + notevil = (notevil + 294)/2; + break; +case "z295": + notevil = (notevil + 295)/2; + break; +case "z296": + notevil = (notevil + 296)/2; + break; +case "z297": + notevil = (notevil + 297)/2; + break; +case "z298": + notevil = (notevil + 298)/2; + break; +case "z299": + notevil = (notevil + 299)/2; + break; +case "z300": + notevil = (notevil + 300)/2; + break; +case "z301": + notevil = (notevil + 301)/2; + break; +case "z302": + notevil = (notevil + 302)/2; + break; +case "z303": + notevil = (notevil + 303)/2; + break; +case "z304": + notevil = (notevil + 304)/2; + break; +case "z305": + notevil = (notevil + 305)/2; + break; +case "z306": + notevil = (notevil + 306)/2; + break; +case "z307": + notevil = (notevil + 307)/2; + break; +case "z308": + notevil = (notevil + 308)/2; + break; +case "z309": + notevil = (notevil + 309)/2; + break; +case "z310": + notevil = (notevil + 310)/2; + break; +case "z311": + notevil = (notevil + 311)/2; + break; +case "z312": + notevil = (notevil + 312)/2; + break; +case "z313": + notevil = (notevil + 313)/2; + break; +case "z314": + notevil = (notevil + 314)/2; + break; +case "z315": + notevil = (notevil + 315)/2; + break; +case "z316": + notevil = (notevil + 316)/2; + break; +case "z317": + notevil = (notevil + 317)/2; + break; +case "z318": + notevil = (notevil + 318)/2; + break; +case "z319": + notevil = (notevil + 319)/2; + break; +case "z320": + notevil = (notevil + 320)/2; + break; +case "z321": + notevil = (notevil + 321)/2; + break; +case "z322": + notevil = (notevil + 322)/2; + break; +case "z323": + notevil = (notevil + 323)/2; + break; +case "z324": + notevil = (notevil + 324)/2; + break; +case "z325": + notevil = (notevil + 325)/2; + break; +case "z326": + notevil = (notevil + 326)/2; + break; +case "z327": + notevil = (notevil + 327)/2; + break; +case "z328": + notevil = (notevil + 328)/2; + break; +case "z329": + notevil = (notevil + 329)/2; + break; +case "z330": + notevil = (notevil + 330)/2; + break; +case "z331": + notevil = (notevil + 331)/2; + break; +case "z332": + notevil = (notevil + 332)/2; + break; +case "z333": + notevil = (notevil + 333)/2; + break; +case "z334": + notevil = (notevil + 334)/2; + break; +case "z335": + notevil = (notevil + 335)/2; + break; +case "z336": + notevil = (notevil + 336)/2; + break; +case "z337": + notevil = (notevil + 337)/2; + break; +case "z338": + notevil = (notevil + 338)/2; + break; +case "z339": + notevil = (notevil + 339)/2; + break; +case "z340": + notevil = (notevil + 340)/2; + break; +case "z341": + notevil = (notevil + 341)/2; + break; +case "z342": + notevil = (notevil + 342)/2; + break; +case "z343": + notevil = (notevil + 343)/2; + break; +case "z344": + notevil = (notevil + 344)/2; + break; +case "z345": + notevil = (notevil + 345)/2; + break; +case "z346": + notevil = (notevil + 346)/2; + break; +case "z347": + notevil = (notevil + 347)/2; + break; +case "z348": + notevil = (notevil + 348)/2; + break; +case "z349": + notevil = (notevil + 349)/2; + break; +case "z350": + notevil = (notevil + 350)/2; + break; +case "z351": + notevil = (notevil + 351)/2; + break; +case "z352": + notevil = (notevil + 352)/2; + break; +case "z353": + notevil = (notevil + 353)/2; + break; +case "z354": + notevil = (notevil + 354)/2; + break; +case "z355": + notevil = (notevil + 355)/2; + break; +case "z356": + notevil = (notevil + 356)/2; + break; +case "z357": + notevil = (notevil + 357)/2; + break; +case "z358": + notevil = (notevil + 358)/2; + break; +case "z359": + notevil = (notevil + 359)/2; + break; +case "z360": + notevil = (notevil + 360)/2; + break; +case "z361": + notevil = (notevil + 361)/2; + break; +case "z362": + notevil = (notevil + 362)/2; + break; +case "z363": + notevil = (notevil + 363)/2; + break; +case "z364": + notevil = (notevil + 364)/2; + break; +case "z365": + notevil = (notevil + 365)/2; + break; +case "z366": + notevil = (notevil + 366)/2; + break; +case "z367": + notevil = (notevil + 367)/2; + break; +case "z368": + notevil = (notevil + 368)/2; + break; +case "z369": + notevil = (notevil + 369)/2; + break; +case "z370": + notevil = (notevil + 370)/2; + break; +case "z371": + notevil = (notevil + 371)/2; + break; +case "z372": + notevil = (notevil + 372)/2; + break; +case "z373": + notevil = (notevil + 373)/2; + break; +case "z374": + notevil = (notevil + 374)/2; + break; +case "z375": + notevil = (notevil + 375)/2; + break; +case "z376": + notevil = (notevil + 376)/2; + break; +case "z377": + notevil = (notevil + 377)/2; + break; +case "z378": + notevil = (notevil + 378)/2; + break; +case "z379": + notevil = (notevil + 379)/2; + break; +case "z380": + notevil = (notevil + 380)/2; + break; +case "z381": + notevil = (notevil + 381)/2; + break; +case "z382": + notevil = (notevil + 382)/2; + break; +case "z383": + notevil = (notevil + 383)/2; + break; +case "z384": + notevil = (notevil + 384)/2; + break; +case "z385": + notevil = (notevil + 385)/2; + break; +case "z386": + notevil = (notevil + 386)/2; + break; +case "z387": + notevil = (notevil + 387)/2; + break; +case "z388": + notevil = (notevil + 388)/2; + break; +case "z389": + notevil = (notevil + 389)/2; + break; +case "z390": + notevil = (notevil + 390)/2; + break; +case "z391": + notevil = (notevil + 391)/2; + break; +case "z392": + notevil = (notevil + 392)/2; + break; +case "z393": + notevil = (notevil + 393)/2; + break; +case "z394": + notevil = (notevil + 394)/2; + break; +case "z395": + notevil = (notevil + 395)/2; + break; +case "z396": + notevil = (notevil + 396)/2; + break; +case "z397": + notevil = (notevil + 397)/2; + break; +case "z398": + notevil = (notevil + 398)/2; + break; +case "z399": + notevil = (notevil + 399)/2; + break; +case "z400": + notevil = (notevil + 400)/2; + break; +case "z401": + notevil = (notevil + 401)/2; + break; +case "z402": + notevil = (notevil + 402)/2; + break; +case "z403": + notevil = (notevil + 403)/2; + break; +case "z404": + notevil = (notevil + 404)/2; + break; +case "z405": + notevil = (notevil + 405)/2; + break; +case "z406": + notevil = (notevil + 406)/2; + break; +case "z407": + notevil = (notevil + 407)/2; + break; +case "z408": + notevil = (notevil + 408)/2; + break; +case "z409": + notevil = (notevil + 409)/2; + break; +case "z410": + notevil = (notevil + 410)/2; + break; +case "z411": + notevil = (notevil + 411)/2; + break; +case "z412": + notevil = (notevil + 412)/2; + break; +case "z413": + notevil = (notevil + 413)/2; + break; +case "z414": + notevil = (notevil + 414)/2; + break; +case "z415": + notevil = (notevil + 415)/2; + break; +case "z416": + notevil = (notevil + 416)/2; + break; +case "z417": + notevil = (notevil + 417)/2; + break; +case "z418": + notevil = (notevil + 418)/2; + break; +case "z419": + notevil = (notevil + 419)/2; + break; +case "z420": + notevil = (notevil + 420)/2; + break; +case "z421": + notevil = (notevil + 421)/2; + break; +case "z422": + notevil = (notevil + 422)/2; + break; +case "z423": + notevil = (notevil + 423)/2; + break; +case "z424": + notevil = (notevil + 424)/2; + break; +case "z425": + notevil = (notevil + 425)/2; + break; +case "z426": + notevil = (notevil + 426)/2; + break; +case "z427": + notevil = (notevil + 427)/2; + break; +case "z428": + notevil = (notevil + 428)/2; + break; +case "z429": + notevil = (notevil + 429)/2; + break; +case "z430": + notevil = (notevil + 430)/2; + break; +case "z431": + notevil = (notevil + 431)/2; + break; +case "z432": + notevil = (notevil + 432)/2; + break; +case "z433": + notevil = (notevil + 433)/2; + break; +case "z434": + notevil = (notevil + 434)/2; + break; +case "z435": + notevil = (notevil + 435)/2; + break; +case "z436": + notevil = (notevil + 436)/2; + break; +case "z437": + notevil = (notevil + 437)/2; + break; +case "z438": + notevil = (notevil + 438)/2; + break; +case "z439": + notevil = (notevil + 439)/2; + break; +case "z440": + notevil = (notevil + 440)/2; + break; +case "z441": + notevil = (notevil + 441)/2; + break; +case "z442": + notevil = (notevil + 442)/2; + break; +case "z443": + notevil = (notevil + 443)/2; + break; +case "z444": + notevil = (notevil + 444)/2; + break; +case "z445": + notevil = (notevil + 445)/2; + break; +case "z446": + notevil = (notevil + 446)/2; + break; +case "z447": + notevil = (notevil + 447)/2; + break; +case "z448": + notevil = (notevil + 448)/2; + break; +case "z449": + notevil = (notevil + 449)/2; + break; +case "z450": + notevil = (notevil + 450)/2; + break; +case "z451": + notevil = (notevil + 451)/2; + break; +case "z452": + notevil = (notevil + 452)/2; + break; +case "z453": + notevil = (notevil + 453)/2; + break; +case "z454": + notevil = (notevil + 454)/2; + break; +case "z455": + notevil = (notevil + 455)/2; + break; +case "z456": + notevil = (notevil + 456)/2; + break; +case "z457": + notevil = (notevil + 457)/2; + break; +case "z458": + notevil = (notevil + 458)/2; + break; +case "z459": + notevil = (notevil + 459)/2; + break; +case "z460": + notevil = (notevil + 460)/2; + break; +case "z461": + notevil = (notevil + 461)/2; + break; +case "z462": + notevil = (notevil + 462)/2; + break; +case "z463": + notevil = (notevil + 463)/2; + break; +case "z464": + notevil = (notevil + 464)/2; + break; +case "z465": + notevil = (notevil + 465)/2; + break; +case "z466": + notevil = (notevil + 466)/2; + break; +case "z467": + notevil = (notevil + 467)/2; + break; +case "z468": + notevil = (notevil + 468)/2; + break; +case "z469": + notevil = (notevil + 469)/2; + break; +case "z470": + notevil = (notevil + 470)/2; + break; +case "z471": + notevil = (notevil + 471)/2; + break; +case "z472": + notevil = (notevil + 472)/2; + break; +case "z473": + notevil = (notevil + 473)/2; + break; +case "z474": + notevil = (notevil + 474)/2; + break; +case "z475": + notevil = (notevil + 475)/2; + break; +case "z476": + notevil = (notevil + 476)/2; + break; +case "z477": + notevil = (notevil + 477)/2; + break; +case "z478": + notevil = (notevil + 478)/2; + break; +case "z479": + notevil = (notevil + 479)/2; + break; +case "z480": + notevil = (notevil + 480)/2; + break; +case "z481": + notevil = (notevil + 481)/2; + break; +case "z482": + notevil = (notevil + 482)/2; + break; +case "z483": + notevil = (notevil + 483)/2; + break; +case "z484": + notevil = (notevil + 484)/2; + break; +case "z485": + notevil = (notevil + 485)/2; + break; +case "z486": + notevil = (notevil + 486)/2; + break; +case "z487": + notevil = (notevil + 487)/2; + break; +case "z488": + notevil = (notevil + 488)/2; + break; +case "z489": + notevil = (notevil + 489)/2; + break; +case "z490": + notevil = (notevil + 490)/2; + break; +case "z491": + notevil = (notevil + 491)/2; + break; +case "z492": + notevil = (notevil + 492)/2; + break; +case "z493": + notevil = (notevil + 493)/2; + break; +case "z494": + notevil = (notevil + 494)/2; + break; +case "z495": + notevil = (notevil + 495)/2; + break; +case "z496": + notevil = (notevil + 496)/2; + break; +case "z497": + notevil = (notevil + 497)/2; + break; +case "z498": + notevil = (notevil + 498)/2; + break; +case "z499": + notevil = (notevil + 499)/2; + break; +case "z500": + notevil = (notevil + 500)/2; + break; +case "z501": + notevil = (notevil + 501)/2; + break; +case "z502": + notevil = (notevil + 502)/2; + break; +case "z503": + notevil = (notevil + 503)/2; + break; +case "z504": + notevil = (notevil + 504)/2; + break; +case "z505": + notevil = (notevil + 505)/2; + break; +case "z506": + notevil = (notevil + 506)/2; + break; +case "z507": + notevil = (notevil + 507)/2; + break; +case "z508": + notevil = (notevil + 508)/2; + break; +case "z509": + notevil = (notevil + 509)/2; + break; +case "z510": + notevil = (notevil + 510)/2; + break; +case "z511": + notevil = (notevil + 511)/2; + break; +case "z512": + notevil = (notevil + 512)/2; + break; +case "z513": + notevil = (notevil + 513)/2; + break; +case "z514": + notevil = (notevil + 514)/2; + break; +case "z515": + notevil = (notevil + 515)/2; + break; +case "z516": + notevil = (notevil + 516)/2; + break; +case "z517": + notevil = (notevil + 517)/2; + break; +case "z518": + notevil = (notevil + 518)/2; + break; +case "z519": + notevil = (notevil + 519)/2; + break; +case "z520": + notevil = (notevil + 520)/2; + break; +case "z521": + notevil = (notevil + 521)/2; + break; +case "z522": + notevil = (notevil + 522)/2; + break; +case "z523": + notevil = (notevil + 523)/2; + break; +case "z524": + notevil = (notevil + 524)/2; + break; +case "z525": + notevil = (notevil + 525)/2; + break; +case "z526": + notevil = (notevil + 526)/2; + break; +case "z527": + notevil = (notevil + 527)/2; + break; +case "z528": + notevil = (notevil + 528)/2; + break; +case "z529": + notevil = (notevil + 529)/2; + break; +case "z530": + notevil = (notevil + 530)/2; + break; +case "z531": + notevil = (notevil + 531)/2; + break; +case "z532": + notevil = (notevil + 532)/2; + break; +case "z533": + notevil = (notevil + 533)/2; + break; +case "z534": + notevil = (notevil + 534)/2; + break; +case "z535": + notevil = (notevil + 535)/2; + break; +case "z536": + notevil = (notevil + 536)/2; + break; +case "z537": + notevil = (notevil + 537)/2; + break; +case "z538": + notevil = (notevil + 538)/2; + break; +case "z539": + notevil = (notevil + 539)/2; + break; +case "z540": + notevil = (notevil + 540)/2; + break; +case "z541": + notevil = (notevil + 541)/2; + break; +case "z542": + notevil = (notevil + 542)/2; + break; +case "z543": + notevil = (notevil + 543)/2; + break; +case "z544": + notevil = (notevil + 544)/2; + break; +case "z545": + notevil = (notevil + 545)/2; + break; +case "z546": + notevil = (notevil + 546)/2; + break; +case "z547": + notevil = (notevil + 547)/2; + break; +case "z548": + notevil = (notevil + 548)/2; + break; +case "z549": + notevil = (notevil + 549)/2; + break; +case "z550": + notevil = (notevil + 550)/2; + break; +case "z551": + notevil = (notevil + 551)/2; + break; +case "z552": + notevil = (notevil + 552)/2; + break; +case "z553": + notevil = (notevil + 553)/2; + break; +case "z554": + notevil = (notevil + 554)/2; + break; +case "z555": + notevil = (notevil + 555)/2; + break; +case "z556": + notevil = (notevil + 556)/2; + break; +case "z557": + notevil = (notevil + 557)/2; + break; +case "z558": + notevil = (notevil + 558)/2; + break; +case "z559": + notevil = (notevil + 559)/2; + break; +case "z560": + notevil = (notevil + 560)/2; + break; +case "z561": + notevil = (notevil + 561)/2; + break; +case "z562": + notevil = (notevil + 562)/2; + break; +case "z563": + notevil = (notevil + 563)/2; + break; +case "z564": + notevil = (notevil + 564)/2; + break; +case "z565": + notevil = (notevil + 565)/2; + break; +case "z566": + notevil = (notevil + 566)/2; + break; +case "z567": + notevil = (notevil + 567)/2; + break; +case "z568": + notevil = (notevil + 568)/2; + break; +case "z569": + notevil = (notevil + 569)/2; + break; +case "z570": + notevil = (notevil + 570)/2; + break; +case "z571": + notevil = (notevil + 571)/2; + break; +case "z572": + notevil = (notevil + 572)/2; + break; +case "z573": + notevil = (notevil + 573)/2; + break; +case "z574": + notevil = (notevil + 574)/2; + break; +case "z575": + notevil = (notevil + 575)/2; + break; +case "z576": + notevil = (notevil + 576)/2; + break; +case "z577": + notevil = (notevil + 577)/2; + break; +case "z578": + notevil = (notevil + 578)/2; + break; +case "z579": + notevil = (notevil + 579)/2; + break; +case "z580": + notevil = (notevil + 580)/2; + break; +case "z581": + notevil = (notevil + 581)/2; + break; +case "z582": + notevil = (notevil + 582)/2; + break; +case "z583": + notevil = (notevil + 583)/2; + break; +case "z584": + notevil = (notevil + 584)/2; + break; +case "z585": + notevil = (notevil + 585)/2; + break; +case "z586": + notevil = (notevil + 586)/2; + break; +case "z587": + notevil = (notevil + 587)/2; + break; +case "z588": + notevil = (notevil + 588)/2; + break; +case "z589": + notevil = (notevil + 589)/2; + break; +case "z590": + notevil = (notevil + 590)/2; + break; +case "z591": + notevil = (notevil + 591)/2; + break; +case "z592": + notevil = (notevil + 592)/2; + break; +case "z593": + notevil = (notevil + 593)/2; + break; +case "z594": + notevil = (notevil + 594)/2; + break; +case "z595": + notevil = (notevil + 595)/2; + break; +case "z596": + notevil = (notevil + 596)/2; + break; +case "z597": + notevil = (notevil + 597)/2; + break; +case "z598": + notevil = (notevil + 598)/2; + break; +case "z599": + notevil = (notevil + 599)/2; + break; +case "z600": + notevil = (notevil + 600)/2; + break; +case "z601": + notevil = (notevil + 601)/2; + break; +case "z602": + notevil = (notevil + 602)/2; + break; +case "z603": + notevil = (notevil + 603)/2; + break; +case "z604": + notevil = (notevil + 604)/2; + break; +case "z605": + notevil = (notevil + 605)/2; + break; +case "z606": + notevil = (notevil + 606)/2; + break; +case "z607": + notevil = (notevil + 607)/2; + break; +case "z608": + notevil = (notevil + 608)/2; + break; +case "z609": + notevil = (notevil + 609)/2; + break; +case "z610": + notevil = (notevil + 610)/2; + break; +case "z611": + notevil = (notevil + 611)/2; + break; +case "z612": + notevil = (notevil + 612)/2; + break; +case "z613": + notevil = (notevil + 613)/2; + break; +case "z614": + notevil = (notevil + 614)/2; + break; +case "z615": + notevil = (notevil + 615)/2; + break; +case "z616": + notevil = (notevil + 616)/2; + break; +case "z617": + notevil = (notevil + 617)/2; + break; +case "z618": + notevil = (notevil + 618)/2; + break; +case "z619": + notevil = (notevil + 619)/2; + break; +case "z620": + notevil = (notevil + 620)/2; + break; +case "z621": + notevil = (notevil + 621)/2; + break; +case "z622": + notevil = (notevil + 622)/2; + break; +case "z623": + notevil = (notevil + 623)/2; + break; +case "z624": + notevil = (notevil + 624)/2; + break; +case "z625": + notevil = (notevil + 625)/2; + break; +case "z626": + notevil = (notevil + 626)/2; + break; +case "z627": + notevil = (notevil + 627)/2; + break; +case "z628": + notevil = (notevil + 628)/2; + break; +case "z629": + notevil = (notevil + 629)/2; + break; +case "z630": + notevil = (notevil + 630)/2; + break; +case "z631": + notevil = (notevil + 631)/2; + break; +case "z632": + notevil = (notevil + 632)/2; + break; +case "z633": + notevil = (notevil + 633)/2; + break; +case "z634": + notevil = (notevil + 634)/2; + break; +case "z635": + notevil = (notevil + 635)/2; + break; +case "z636": + notevil = (notevil + 636)/2; + break; +case "z637": + notevil = (notevil + 637)/2; + break; +case "z638": + notevil = (notevil + 638)/2; + break; +case "z639": + notevil = (notevil + 639)/2; + break; +case "z640": + notevil = (notevil + 640)/2; + break; +case "z641": + notevil = (notevil + 641)/2; + break; +case "z642": + notevil = (notevil + 642)/2; + break; +case "z643": + notevil = (notevil + 643)/2; + break; +case "z644": + notevil = (notevil + 644)/2; + break; +case "z645": + notevil = (notevil + 645)/2; + break; +case "z646": + notevil = (notevil + 646)/2; + break; +case "z647": + notevil = (notevil + 647)/2; + break; +case "z648": + notevil = (notevil + 648)/2; + break; +case "z649": + notevil = (notevil + 649)/2; + break; +case "z650": + notevil = (notevil + 650)/2; + break; +case "z651": + notevil = (notevil + 651)/2; + break; +case "z652": + notevil = (notevil + 652)/2; + break; +case "z653": + notevil = (notevil + 653)/2; + break; +case "z654": + notevil = (notevil + 654)/2; + break; +case "z655": + notevil = (notevil + 655)/2; + break; +case "z656": + notevil = (notevil + 656)/2; + break; +case "z657": + notevil = (notevil + 657)/2; + break; +case "z658": + notevil = (notevil + 658)/2; + break; +case "z659": + notevil = (notevil + 659)/2; + break; +case "z660": + notevil = (notevil + 660)/2; + break; +case "z661": + notevil = (notevil + 661)/2; + break; +case "z662": + notevil = (notevil + 662)/2; + break; +case "z663": + notevil = (notevil + 663)/2; + break; +case "z664": + notevil = (notevil + 664)/2; + break; +case "z665": + notevil = (notevil + 665)/2; + break; +case "z666": + notevil = (notevil + 666)/2; + break; +case "z667": + notevil = (notevil + 667)/2; + break; +case "z668": + notevil = (notevil + 668)/2; + break; +case "z669": + notevil = (notevil + 669)/2; + break; +case "z670": + notevil = (notevil + 670)/2; + break; +case "z671": + notevil = (notevil + 671)/2; + break; +case "z672": + notevil = (notevil + 672)/2; + break; +case "z673": + notevil = (notevil + 673)/2; + break; +case "z674": + notevil = (notevil + 674)/2; + break; +case "z675": + notevil = (notevil + 675)/2; + break; +case "z676": + notevil = (notevil + 676)/2; + break; +case "z677": + notevil = (notevil + 677)/2; + break; +case "z678": + notevil = (notevil + 678)/2; + break; +case "z679": + notevil = (notevil + 679)/2; + break; +case "z680": + notevil = (notevil + 680)/2; + break; +case "z681": + notevil = (notevil + 681)/2; + break; +case "z682": + notevil = (notevil + 682)/2; + break; +case "z683": + notevil = (notevil + 683)/2; + break; +case "z684": + notevil = (notevil + 684)/2; + break; +case "z685": + notevil = (notevil + 685)/2; + break; +case "z686": + notevil = (notevil + 686)/2; + break; +case "z687": + notevil = (notevil + 687)/2; + break; +case "z688": + notevil = (notevil + 688)/2; + break; +case "z689": + notevil = (notevil + 689)/2; + break; +case "z690": + notevil = (notevil + 690)/2; + break; +case "z691": + notevil = (notevil + 691)/2; + break; +case "z692": + notevil = (notevil + 692)/2; + break; +case "z693": + notevil = (notevil + 693)/2; + break; +case "z694": + notevil = (notevil + 694)/2; + break; +case "z695": + notevil = (notevil + 695)/2; + break; +case "z696": + notevil = (notevil + 696)/2; + break; +case "z697": + notevil = (notevil + 697)/2; + break; +case "z698": + notevil = (notevil + 698)/2; + break; +case "z699": + notevil = (notevil + 699)/2; + break; +case "z700": + notevil = (notevil + 700)/2; + break; +case "z701": + notevil = (notevil + 701)/2; + break; +case "z702": + notevil = (notevil + 702)/2; + break; +case "z703": + notevil = (notevil + 703)/2; + break; +case "z704": + notevil = (notevil + 704)/2; + break; +case "z705": + notevil = (notevil + 705)/2; + break; +case "z706": + notevil = (notevil + 706)/2; + break; +case "z707": + notevil = (notevil + 707)/2; + break; +case "z708": + notevil = (notevil + 708)/2; + break; +case "z709": + notevil = (notevil + 709)/2; + break; +case "z710": + notevil = (notevil + 710)/2; + break; +case "z711": + notevil = (notevil + 711)/2; + break; +case "z712": + notevil = (notevil + 712)/2; + break; +case "z713": + notevil = (notevil + 713)/2; + break; +case "z714": + notevil = (notevil + 714)/2; + break; +case "z715": + notevil = (notevil + 715)/2; + break; +case "z716": + notevil = (notevil + 716)/2; + break; +case "z717": + notevil = (notevil + 717)/2; + break; +case "z718": + notevil = (notevil + 718)/2; + break; +case "z719": + notevil = (notevil + 719)/2; + break; +case "z720": + notevil = (notevil + 720)/2; + break; +case "z721": + notevil = (notevil + 721)/2; + break; +case "z722": + notevil = (notevil + 722)/2; + break; +case "z723": + notevil = (notevil + 723)/2; + break; +case "z724": + notevil = (notevil + 724)/2; + break; +case "z725": + notevil = (notevil + 725)/2; + break; +case "z726": + notevil = (notevil + 726)/2; + break; +case "z727": + notevil = (notevil + 727)/2; + break; +case "z728": + notevil = (notevil + 728)/2; + break; +case "z729": + notevil = (notevil + 729)/2; + break; +case "z730": + notevil = (notevil + 730)/2; + break; +case "z731": + notevil = (notevil + 731)/2; + break; +case "z732": + notevil = (notevil + 732)/2; + break; +case "z733": + notevil = (notevil + 733)/2; + break; +case "z734": + notevil = (notevil + 734)/2; + break; +case "z735": + notevil = (notevil + 735)/2; + break; +case "z736": + notevil = (notevil + 736)/2; + break; +case "z737": + notevil = (notevil + 737)/2; + break; +case "z738": + notevil = (notevil + 738)/2; + break; +case "z739": + notevil = (notevil + 739)/2; + break; +case "z740": + notevil = (notevil + 740)/2; + break; +case "z741": + notevil = (notevil + 741)/2; + break; +case "z742": + notevil = (notevil + 742)/2; + break; +case "z743": + notevil = (notevil + 743)/2; + break; +case "z744": + notevil = (notevil + 744)/2; + break; +case "z745": + notevil = (notevil + 745)/2; + break; +case "z746": + notevil = (notevil + 746)/2; + break; +case "z747": + notevil = (notevil + 747)/2; + break; +case "z748": + notevil = (notevil + 748)/2; + break; +case "z749": + notevil = (notevil + 749)/2; + break; +case "z750": + notevil = (notevil + 750)/2; + break; +case "z751": + notevil = (notevil + 751)/2; + break; +case "z752": + notevil = (notevil + 752)/2; + break; +case "z753": + notevil = (notevil + 753)/2; + break; +case "z754": + notevil = (notevil + 754)/2; + break; +case "z755": + notevil = (notevil + 755)/2; + break; +case "z756": + notevil = (notevil + 756)/2; + break; +case "z757": + notevil = (notevil + 757)/2; + break; +case "z758": + notevil = (notevil + 758)/2; + break; +case "z759": + notevil = (notevil + 759)/2; + break; +case "z760": + notevil = (notevil + 760)/2; + break; +case "z761": + notevil = (notevil + 761)/2; + break; +case "z762": + notevil = (notevil + 762)/2; + break; +case "z763": + notevil = (notevil + 763)/2; + break; +case "z764": + notevil = (notevil + 764)/2; + break; +case "z765": + notevil = (notevil + 765)/2; + break; +case "z766": + notevil = (notevil + 766)/2; + break; +case "z767": + notevil = (notevil + 767)/2; + break; +case "z768": + notevil = (notevil + 768)/2; + break; +case "z769": + notevil = (notevil + 769)/2; + break; +case "z770": + notevil = (notevil + 770)/2; + break; +case "z771": + notevil = (notevil + 771)/2; + break; +case "z772": + notevil = (notevil + 772)/2; + break; +case "z773": + notevil = (notevil + 773)/2; + break; +case "z774": + notevil = (notevil + 774)/2; + break; +case "z775": + notevil = (notevil + 775)/2; + break; +case "z776": + notevil = (notevil + 776)/2; + break; +case "z777": + notevil = (notevil + 777)/2; + break; +case "z778": + notevil = (notevil + 778)/2; + break; +case "z779": + notevil = (notevil + 779)/2; + break; +case "z780": + notevil = (notevil + 780)/2; + break; +case "z781": + notevil = (notevil + 781)/2; + break; +case "z782": + notevil = (notevil + 782)/2; + break; +case "z783": + notevil = (notevil + 783)/2; + break; +case "z784": + notevil = (notevil + 784)/2; + break; +case "z785": + notevil = (notevil + 785)/2; + break; +case "z786": + notevil = (notevil + 786)/2; + break; +case "z787": + notevil = (notevil + 787)/2; + break; +case "z788": + notevil = (notevil + 788)/2; + break; +case "z789": + notevil = (notevil + 789)/2; + break; +case "z790": + notevil = (notevil + 790)/2; + break; +case "z791": + notevil = (notevil + 791)/2; + break; +case "z792": + notevil = (notevil + 792)/2; + break; +case "z793": + notevil = (notevil + 793)/2; + break; +case "z794": + notevil = (notevil + 794)/2; + break; +case "z795": + notevil = (notevil + 795)/2; + break; +case "z796": + notevil = (notevil + 796)/2; + break; +case "z797": + notevil = (notevil + 797)/2; + break; +case "z798": + notevil = (notevil + 798)/2; + break; +case "z799": + notevil = (notevil + 799)/2; + break; +case "z800": + notevil = (notevil + 800)/2; + break; +case "z801": + notevil = (notevil + 801)/2; + break; +case "z802": + notevil = (notevil + 802)/2; + break; +case "z803": + notevil = (notevil + 803)/2; + break; +case "z804": + notevil = (notevil + 804)/2; + break; +case "z805": + notevil = (notevil + 805)/2; + break; +case "z806": + notevil = (notevil + 806)/2; + break; +case "z807": + notevil = (notevil + 807)/2; + break; +case "z808": + notevil = (notevil + 808)/2; + break; +case "z809": + notevil = (notevil + 809)/2; + break; +case "z810": + notevil = (notevil + 810)/2; + break; +case "z811": + notevil = (notevil + 811)/2; + break; +case "z812": + notevil = (notevil + 812)/2; + break; +case "z813": + notevil = (notevil + 813)/2; + break; +case "z814": + notevil = (notevil + 814)/2; + break; +case "z815": + notevil = (notevil + 815)/2; + break; +case "z816": + notevil = (notevil + 816)/2; + break; +case "z817": + notevil = (notevil + 817)/2; + break; +case "z818": + notevil = (notevil + 818)/2; + break; +case "z819": + notevil = (notevil + 819)/2; + break; +case "z820": + notevil = (notevil + 820)/2; + break; +case "z821": + notevil = (notevil + 821)/2; + break; +case "z822": + notevil = (notevil + 822)/2; + break; +case "z823": + notevil = (notevil + 823)/2; + break; +case "z824": + notevil = (notevil + 824)/2; + break; +case "z825": + notevil = (notevil + 825)/2; + break; +case "z826": + notevil = (notevil + 826)/2; + break; +case "z827": + notevil = (notevil + 827)/2; + break; +case "z828": + notevil = (notevil + 828)/2; + break; +case "z829": + notevil = (notevil + 829)/2; + break; +case "z830": + notevil = (notevil + 830)/2; + break; +case "z831": + notevil = (notevil + 831)/2; + break; +case "z832": + notevil = (notevil + 832)/2; + break; +case "z833": + notevil = (notevil + 833)/2; + break; +case "z834": + notevil = (notevil + 834)/2; + break; +case "z835": + notevil = (notevil + 835)/2; + break; +case "z836": + notevil = (notevil + 836)/2; + break; +case "z837": + notevil = (notevil + 837)/2; + break; +case "z838": + notevil = (notevil + 838)/2; + break; +case "z839": + notevil = (notevil + 839)/2; + break; +case "z840": + notevil = (notevil + 840)/2; + break; +case "z841": + notevil = (notevil + 841)/2; + break; +case "z842": + notevil = (notevil + 842)/2; + break; +case "z843": + notevil = (notevil + 843)/2; + break; +case "z844": + notevil = (notevil + 844)/2; + break; +case "z845": + notevil = (notevil + 845)/2; + break; +case "z846": + notevil = (notevil + 846)/2; + break; +case "z847": + notevil = (notevil + 847)/2; + break; +case "z848": + notevil = (notevil + 848)/2; + break; +case "z849": + notevil = (notevil + 849)/2; + break; +case "z850": + notevil = (notevil + 850)/2; + break; +case "z851": + notevil = (notevil + 851)/2; + break; +case "z852": + notevil = (notevil + 852)/2; + break; +case "z853": + notevil = (notevil + 853)/2; + break; +case "z854": + notevil = (notevil + 854)/2; + break; +case "z855": + notevil = (notevil + 855)/2; + break; +case "z856": + notevil = (notevil + 856)/2; + break; +case "z857": + notevil = (notevil + 857)/2; + break; +case "z858": + notevil = (notevil + 858)/2; + break; +case "z859": + notevil = (notevil + 859)/2; + break; +case "z860": + notevil = (notevil + 860)/2; + break; +case "z861": + notevil = (notevil + 861)/2; + break; +case "z862": + notevil = (notevil + 862)/2; + break; +case "z863": + notevil = (notevil + 863)/2; + break; +case "z864": + notevil = (notevil + 864)/2; + break; +case "z865": + notevil = (notevil + 865)/2; + break; +case "z866": + notevil = (notevil + 866)/2; + break; +case "z867": + notevil = (notevil + 867)/2; + break; +case "z868": + notevil = (notevil + 868)/2; + break; +case "z869": + notevil = (notevil + 869)/2; + break; +case "z870": + notevil = (notevil + 870)/2; + break; +case "z871": + notevil = (notevil + 871)/2; + break; +case "z872": + notevil = (notevil + 872)/2; + break; +case "z873": + notevil = (notevil + 873)/2; + break; +case "z874": + notevil = (notevil + 874)/2; + break; +case "z875": + notevil = (notevil + 875)/2; + break; +case "z876": + notevil = (notevil + 876)/2; + break; +case "z877": + notevil = (notevil + 877)/2; + break; +case "z878": + notevil = (notevil + 878)/2; + break; +case "z879": + notevil = (notevil + 879)/2; + break; +case "z880": + notevil = (notevil + 880)/2; + break; +case "z881": + notevil = (notevil + 881)/2; + break; +case "z882": + notevil = (notevil + 882)/2; + break; +case "z883": + notevil = (notevil + 883)/2; + break; +case "z884": + notevil = (notevil + 884)/2; + break; +case "z885": + notevil = (notevil + 885)/2; + break; +case "z886": + notevil = (notevil + 886)/2; + break; +case "z887": + notevil = (notevil + 887)/2; + break; +case "z888": + notevil = (notevil + 888)/2; + break; +case "z889": + notevil = (notevil + 889)/2; + break; +case "z890": + notevil = (notevil + 890)/2; + break; +case "z891": + notevil = (notevil + 891)/2; + break; +case "z892": + notevil = (notevil + 892)/2; + break; +case "z893": + notevil = (notevil + 893)/2; + break; +case "z894": + notevil = (notevil + 894)/2; + break; +case "z895": + notevil = (notevil + 895)/2; + break; +case "z896": + notevil = (notevil + 896)/2; + break; +case "z897": + notevil = (notevil + 897)/2; + break; +case "z898": + notevil = (notevil + 898)/2; + break; +case "z899": + notevil = (notevil + 899)/2; + break; +case "z900": + notevil = (notevil + 900)/2; + break; +case "z901": + notevil = (notevil + 901)/2; + break; +case "z902": + notevil = (notevil + 902)/2; + break; +case "z903": + notevil = (notevil + 903)/2; + break; +case "z904": + notevil = (notevil + 904)/2; + break; +case "z905": + notevil = (notevil + 905)/2; + break; +case "z906": + notevil = (notevil + 906)/2; + break; +case "z907": + notevil = (notevil + 907)/2; + break; +case "z908": + notevil = (notevil + 908)/2; + break; +case "z909": + notevil = (notevil + 909)/2; + break; +case "z910": + notevil = (notevil + 910)/2; + break; +case "z911": + notevil = (notevil + 911)/2; + break; +case "z912": + notevil = (notevil + 912)/2; + break; +case "z913": + notevil = (notevil + 913)/2; + break; +case "z914": + notevil = (notevil + 914)/2; + break; +case "z915": + notevil = (notevil + 915)/2; + break; +case "z916": + notevil = (notevil + 916)/2; + break; +case "z917": + notevil = (notevil + 917)/2; + break; +case "z918": + notevil = (notevil + 918)/2; + break; +case "z919": + notevil = (notevil + 919)/2; + break; +case "z920": + notevil = (notevil + 920)/2; + break; +case "z921": + notevil = (notevil + 921)/2; + break; +case "z922": + notevil = (notevil + 922)/2; + break; +case "z923": + notevil = (notevil + 923)/2; + break; +case "z924": + notevil = (notevil + 924)/2; + break; +case "z925": + notevil = (notevil + 925)/2; + break; +case "z926": + notevil = (notevil + 926)/2; + break; +case "z927": + notevil = (notevil + 927)/2; + break; +case "z928": + notevil = (notevil + 928)/2; + break; +case "z929": + notevil = (notevil + 929)/2; + break; +case "z930": + notevil = (notevil + 930)/2; + break; +case "z931": + notevil = (notevil + 931)/2; + break; +case "z932": + notevil = (notevil + 932)/2; + break; +case "z933": + notevil = (notevil + 933)/2; + break; +case "z934": + notevil = (notevil + 934)/2; + break; +case "z935": + notevil = (notevil + 935)/2; + break; +case "z936": + notevil = (notevil + 936)/2; + break; +case "z937": + notevil = (notevil + 937)/2; + break; +case "z938": + notevil = (notevil + 938)/2; + break; +case "z939": + notevil = (notevil + 939)/2; + break; +case "z940": + notevil = (notevil + 940)/2; + break; +case "z941": + notevil = (notevil + 941)/2; + break; +case "z942": + notevil = (notevil + 942)/2; + break; +case "z943": + notevil = (notevil + 943)/2; + break; +case "z944": + notevil = (notevil + 944)/2; + break; +case "z945": + notevil = (notevil + 945)/2; + break; +case "z946": + notevil = (notevil + 946)/2; + break; +case "z947": + notevil = (notevil + 947)/2; + break; +case "z948": + notevil = (notevil + 948)/2; + break; +case "z949": + notevil = (notevil + 949)/2; + break; +case "z950": + notevil = (notevil + 950)/2; + break; +case "z951": + notevil = (notevil + 951)/2; + break; +case "z952": + notevil = (notevil + 952)/2; + break; +case "z953": + notevil = (notevil + 953)/2; + break; +case "z954": + notevil = (notevil + 954)/2; + break; +case "z955": + notevil = (notevil + 955)/2; + break; +case "z956": + notevil = (notevil + 956)/2; + break; +case "z957": + notevil = (notevil + 957)/2; + break; +case "z958": + notevil = (notevil + 958)/2; + break; +case "z959": + notevil = (notevil + 959)/2; + break; +case "z960": + notevil = (notevil + 960)/2; + break; +case "z961": + notevil = (notevil + 961)/2; + break; +case "z962": + notevil = (notevil + 962)/2; + break; +case "z963": + notevil = (notevil + 963)/2; + break; +case "z964": + notevil = (notevil + 964)/2; + break; +case "z965": + notevil = (notevil + 965)/2; + break; +case "z966": + notevil = (notevil + 966)/2; + break; +case "z967": + notevil = (notevil + 967)/2; + break; +case "z968": + notevil = (notevil + 968)/2; + break; +case "z969": + notevil = (notevil + 969)/2; + break; +case "z970": + notevil = (notevil + 970)/2; + break; +case "z971": + notevil = (notevil + 971)/2; + break; +case "z972": + notevil = (notevil + 972)/2; + break; +case "z973": + notevil = (notevil + 973)/2; + break; +case "z974": + notevil = (notevil + 974)/2; + break; +case "z975": + notevil = (notevil + 975)/2; + break; +case "z976": + notevil = (notevil + 976)/2; + break; +case "z977": + notevil = (notevil + 977)/2; + break; +case "z978": + notevil = (notevil + 978)/2; + break; +case "z979": + notevil = (notevil + 979)/2; + break; +case "z980": + notevil = (notevil + 980)/2; + break; +case "z981": + notevil = (notevil + 981)/2; + break; +case "z982": + notevil = (notevil + 982)/2; + break; +case "z983": + notevil = (notevil + 983)/2; + break; +case "z984": + notevil = (notevil + 984)/2; + break; +case "z985": + notevil = (notevil + 985)/2; + break; +case "z986": + notevil = (notevil + 986)/2; + break; +case "z987": + notevil = (notevil + 987)/2; + break; +case "z988": + notevil = (notevil + 988)/2; + break; +case "z989": + notevil = (notevil + 989)/2; + break; +case "z990": + notevil = (notevil + 990)/2; + break; +case "z991": + notevil = (notevil + 991)/2; + break; +case "z992": + notevil = (notevil + 992)/2; + break; +case "z993": + notevil = (notevil + 993)/2; + break; +case "z994": + notevil = (notevil + 994)/2; + break; +case "z995": + notevil = (notevil + 995)/2; + break; +case "z996": + notevil = (notevil + 996)/2; + break; +case "z997": + notevil = (notevil + 997)/2; + break; +case "z998": + notevil = (notevil + 998)/2; + break; +case "z999": + notevil = (notevil + 999)/2; + break; +case "z1000": + notevil = (notevil + 1000)/2; + break; +case "z1001": + notevil = (notevil + 1001)/2; + break; +case "z1002": + notevil = (notevil + 1002)/2; + break; +case "z1003": + notevil = (notevil + 1003)/2; + break; +case "z1004": + notevil = (notevil + 1004)/2; + break; +case "z1005": + notevil = (notevil + 1005)/2; + break; +case "z1006": + notevil = (notevil + 1006)/2; + break; +case "z1007": + notevil = (notevil + 1007)/2; + break; +case "z1008": + notevil = (notevil + 1008)/2; + break; +case "z1009": + notevil = (notevil + 1009)/2; + break; +case "z1010": + notevil = (notevil + 1010)/2; + break; +case "z1011": + notevil = (notevil + 1011)/2; + break; +case "z1012": + notevil = (notevil + 1012)/2; + break; +case "z1013": + notevil = (notevil + 1013)/2; + break; +case "z1014": + notevil = (notevil + 1014)/2; + break; +case "z1015": + notevil = (notevil + 1015)/2; + break; +case "z1016": + notevil = (notevil + 1016)/2; + break; +case "z1017": + notevil = (notevil + 1017)/2; + break; +case "z1018": + notevil = (notevil + 1018)/2; + break; +case "z1019": + notevil = (notevil + 1019)/2; + break; +case "z1020": + notevil = (notevil + 1020)/2; + break; +case "z1021": + notevil = (notevil + 1021)/2; + break; +case "z1022": + notevil = (notevil + 1022)/2; + break; +case "z1023": + notevil = (notevil + 1023)/2; + break; +case "z1024": + notevil = (notevil + 1024)/2; + break; +case "z1025": + notevil = (notevil + 1025)/2; + break; +case "z1026": + notevil = (notevil + 1026)/2; + break; +case "z1027": + notevil = (notevil + 1027)/2; + break; +case "z1028": + notevil = (notevil + 1028)/2; + break; +case "z1029": + notevil = (notevil + 1029)/2; + break; +case "z1030": + notevil = (notevil + 1030)/2; + break; +case "z1031": + notevil = (notevil + 1031)/2; + break; +case "z1032": + notevil = (notevil + 1032)/2; + break; +case "z1033": + notevil = (notevil + 1033)/2; + break; +case "z1034": + notevil = (notevil + 1034)/2; + break; +case "z1035": + notevil = (notevil + 1035)/2; + break; +case "z1036": + notevil = (notevil + 1036)/2; + break; +case "z1037": + notevil = (notevil + 1037)/2; + break; +case "z1038": + notevil = (notevil + 1038)/2; + break; +case "z1039": + notevil = (notevil + 1039)/2; + break; +case "z1040": + notevil = (notevil + 1040)/2; + break; +case "z1041": + notevil = (notevil + 1041)/2; + break; +case "z1042": + notevil = (notevil + 1042)/2; + break; +case "z1043": + notevil = (notevil + 1043)/2; + break; +case "z1044": + notevil = (notevil + 1044)/2; + break; +case "z1045": + notevil = (notevil + 1045)/2; + break; +case "z1046": + notevil = (notevil + 1046)/2; + break; +case "z1047": + notevil = (notevil + 1047)/2; + break; +case "z1048": + notevil = (notevil + 1048)/2; + break; +case "z1049": + notevil = (notevil + 1049)/2; + break; +case "z1050": + notevil = (notevil + 1050)/2; + break; +case "z1051": + notevil = (notevil + 1051)/2; + break; +case "z1052": + notevil = (notevil + 1052)/2; + break; +case "z1053": + notevil = (notevil + 1053)/2; + break; +case "z1054": + notevil = (notevil + 1054)/2; + break; +case "z1055": + notevil = (notevil + 1055)/2; + break; +case "z1056": + notevil = (notevil + 1056)/2; + break; +case "z1057": + notevil = (notevil + 1057)/2; + break; +case "z1058": + notevil = (notevil + 1058)/2; + break; +case "z1059": + notevil = (notevil + 1059)/2; + break; +case "z1060": + notevil = (notevil + 1060)/2; + break; +case "z1061": + notevil = (notevil + 1061)/2; + break; +case "z1062": + notevil = (notevil + 1062)/2; + break; +case "z1063": + notevil = (notevil + 1063)/2; + break; +case "z1064": + notevil = (notevil + 1064)/2; + break; +case "z1065": + notevil = (notevil + 1065)/2; + break; +case "z1066": + notevil = (notevil + 1066)/2; + break; +case "z1067": + notevil = (notevil + 1067)/2; + break; +case "z1068": + notevil = (notevil + 1068)/2; + break; +case "z1069": + notevil = (notevil + 1069)/2; + break; +case "z1070": + notevil = (notevil + 1070)/2; + break; +case "z1071": + notevil = (notevil + 1071)/2; + break; +case "z1072": + notevil = (notevil + 1072)/2; + break; +case "z1073": + notevil = (notevil + 1073)/2; + break; +case "z1074": + notevil = (notevil + 1074)/2; + break; +case "z1075": + notevil = (notevil + 1075)/2; + break; +case "z1076": + notevil = (notevil + 1076)/2; + break; +case "z1077": + notevil = (notevil + 1077)/2; + break; +case "z1078": + notevil = (notevil + 1078)/2; + break; +case "z1079": + notevil = (notevil + 1079)/2; + break; +case "z1080": + notevil = (notevil + 1080)/2; + break; +case "z1081": + notevil = (notevil + 1081)/2; + break; +case "z1082": + notevil = (notevil + 1082)/2; + break; +case "z1083": + notevil = (notevil + 1083)/2; + break; +case "z1084": + notevil = (notevil + 1084)/2; + break; +case "z1085": + notevil = (notevil + 1085)/2; + break; +case "z1086": + notevil = (notevil + 1086)/2; + break; +case "z1087": + notevil = (notevil + 1087)/2; + break; +case "z1088": + notevil = (notevil + 1088)/2; + break; +case "z1089": + notevil = (notevil + 1089)/2; + break; +case "z1090": + notevil = (notevil + 1090)/2; + break; +case "z1091": + notevil = (notevil + 1091)/2; + break; +case "z1092": + notevil = (notevil + 1092)/2; + break; +case "z1093": + notevil = (notevil + 1093)/2; + break; +case "z1094": + notevil = (notevil + 1094)/2; + break; +case "z1095": + notevil = (notevil + 1095)/2; + break; +case "z1096": + notevil = (notevil + 1096)/2; + break; +case "z1097": + notevil = (notevil + 1097)/2; + break; +case "z1098": + notevil = (notevil + 1098)/2; + break; +case "z1099": + notevil = (notevil + 1099)/2; + break; +case "z1100": + notevil = (notevil + 1100)/2; + break; +case "z1101": + notevil = (notevil + 1101)/2; + break; +case "z1102": + notevil = (notevil + 1102)/2; + break; +case "z1103": + notevil = (notevil + 1103)/2; + break; +case "z1104": + notevil = (notevil + 1104)/2; + break; +case "z1105": + notevil = (notevil + 1105)/2; + break; +case "z1106": + notevil = (notevil + 1106)/2; + break; +case "z1107": + notevil = (notevil + 1107)/2; + break; +case "z1108": + notevil = (notevil + 1108)/2; + break; +case "z1109": + notevil = (notevil + 1109)/2; + break; +case "z1110": + notevil = (notevil + 1110)/2; + break; +case "z1111": + notevil = (notevil + 1111)/2; + break; +case "z1112": + notevil = (notevil + 1112)/2; + break; +case "z1113": + notevil = (notevil + 1113)/2; + break; +case "z1114": + notevil = (notevil + 1114)/2; + break; +case "z1115": + notevil = (notevil + 1115)/2; + break; +case "z1116": + notevil = (notevil + 1116)/2; + break; +case "z1117": + notevil = (notevil + 1117)/2; + break; +case "z1118": + notevil = (notevil + 1118)/2; + break; +case "z1119": + notevil = (notevil + 1119)/2; + break; +case "z1120": + notevil = (notevil + 1120)/2; + break; +case "z1121": + notevil = (notevil + 1121)/2; + break; +case "z1122": + notevil = (notevil + 1122)/2; + break; +case "z1123": + notevil = (notevil + 1123)/2; + break; +case "z1124": + notevil = (notevil + 1124)/2; + break; +case "z1125": + notevil = (notevil + 1125)/2; + break; +case "z1126": + notevil = (notevil + 1126)/2; + break; +case "z1127": + notevil = (notevil + 1127)/2; + break; +case "z1128": + notevil = (notevil + 1128)/2; + break; +case "z1129": + notevil = (notevil + 1129)/2; + break; +case "z1130": + notevil = (notevil + 1130)/2; + break; +case "z1131": + notevil = (notevil + 1131)/2; + break; +case "z1132": + notevil = (notevil + 1132)/2; + break; +case "z1133": + notevil = (notevil + 1133)/2; + break; +case "z1134": + notevil = (notevil + 1134)/2; + break; +case "z1135": + notevil = (notevil + 1135)/2; + break; +case "z1136": + notevil = (notevil + 1136)/2; + break; +case "z1137": + notevil = (notevil + 1137)/2; + break; +case "z1138": + notevil = (notevil + 1138)/2; + break; +case "z1139": + notevil = (notevil + 1139)/2; + break; +case "z1140": + notevil = (notevil + 1140)/2; + break; +case "z1141": + notevil = (notevil + 1141)/2; + break; +case "z1142": + notevil = (notevil + 1142)/2; + break; +case "z1143": + notevil = (notevil + 1143)/2; + break; +case "z1144": + notevil = (notevil + 1144)/2; + break; +case "z1145": + notevil = (notevil + 1145)/2; + break; +case "z1146": + notevil = (notevil + 1146)/2; + break; +case "z1147": + notevil = (notevil + 1147)/2; + break; +case "z1148": + notevil = (notevil + 1148)/2; + break; +case "z1149": + notevil = (notevil + 1149)/2; + break; +case "z1150": + notevil = (notevil + 1150)/2; + break; +case "z1151": + notevil = (notevil + 1151)/2; + break; +case "z1152": + notevil = (notevil + 1152)/2; + break; +case "z1153": + notevil = (notevil + 1153)/2; + break; +case "z1154": + notevil = (notevil + 1154)/2; + break; +case "z1155": + notevil = (notevil + 1155)/2; + break; +case "z1156": + notevil = (notevil + 1156)/2; + break; +case "z1157": + notevil = (notevil + 1157)/2; + break; +case "z1158": + notevil = (notevil + 1158)/2; + break; +case "z1159": + notevil = (notevil + 1159)/2; + break; +case "z1160": + notevil = (notevil + 1160)/2; + break; +case "z1161": + notevil = (notevil + 1161)/2; + break; +case "z1162": + notevil = (notevil + 1162)/2; + break; +case "z1163": + notevil = (notevil + 1163)/2; + break; +case "z1164": + notevil = (notevil + 1164)/2; + break; +case "z1165": + notevil = (notevil + 1165)/2; + break; +case "z1166": + notevil = (notevil + 1166)/2; + break; +case "z1167": + notevil = (notevil + 1167)/2; + break; +case "z1168": + notevil = (notevil + 1168)/2; + break; +case "z1169": + notevil = (notevil + 1169)/2; + break; +case "z1170": + notevil = (notevil + 1170)/2; + break; +case "z1171": + notevil = (notevil + 1171)/2; + break; +case "z1172": + notevil = (notevil + 1172)/2; + break; +case "z1173": + notevil = (notevil + 1173)/2; + break; +case "z1174": + notevil = (notevil + 1174)/2; + break; +case "z1175": + notevil = (notevil + 1175)/2; + break; +case "z1176": + notevil = (notevil + 1176)/2; + break; +case "z1177": + notevil = (notevil + 1177)/2; + break; +case "z1178": + notevil = (notevil + 1178)/2; + break; +case "z1179": + notevil = (notevil + 1179)/2; + break; +case "z1180": + notevil = (notevil + 1180)/2; + break; +case "z1181": + notevil = (notevil + 1181)/2; + break; +case "z1182": + notevil = (notevil + 1182)/2; + break; +case "z1183": + notevil = (notevil + 1183)/2; + break; +case "z1184": + notevil = (notevil + 1184)/2; + break; +case "z1185": + notevil = (notevil + 1185)/2; + break; +case "z1186": + notevil = (notevil + 1186)/2; + break; +case "z1187": + notevil = (notevil + 1187)/2; + break; +case "z1188": + notevil = (notevil + 1188)/2; + break; +case "z1189": + notevil = (notevil + 1189)/2; + break; +case "z1190": + notevil = (notevil + 1190)/2; + break; +case "z1191": + notevil = (notevil + 1191)/2; + break; +case "z1192": + notevil = (notevil + 1192)/2; + break; +case "z1193": + notevil = (notevil + 1193)/2; + break; +case "z1194": + notevil = (notevil + 1194)/2; + break; +case "z1195": + notevil = (notevil + 1195)/2; + break; +case "z1196": + notevil = (notevil + 1196)/2; + break; +case "z1197": + notevil = (notevil + 1197)/2; + break; +case "z1198": + notevil = (notevil + 1198)/2; + break; +case "z1199": + notevil = (notevil + 1199)/2; + break; +case "z1200": + notevil = (notevil + 1200)/2; + break; +case "z1201": + notevil = (notevil + 1201)/2; + break; +case "z1202": + notevil = (notevil + 1202)/2; + break; +case "z1203": + notevil = (notevil + 1203)/2; + break; +case "z1204": + notevil = (notevil + 1204)/2; + break; +case "z1205": + notevil = (notevil + 1205)/2; + break; +case "z1206": + notevil = (notevil + 1206)/2; + break; +case "z1207": + notevil = (notevil + 1207)/2; + break; +case "z1208": + notevil = (notevil + 1208)/2; + break; +case "z1209": + notevil = (notevil + 1209)/2; + break; +case "z1210": + notevil = (notevil + 1210)/2; + break; +case "z1211": + notevil = (notevil + 1211)/2; + break; +case "z1212": + notevil = (notevil + 1212)/2; + break; +case "z1213": + notevil = (notevil + 1213)/2; + break; +case "z1214": + notevil = (notevil + 1214)/2; + break; +case "z1215": + notevil = (notevil + 1215)/2; + break; +case "z1216": + notevil = (notevil + 1216)/2; + break; +case "z1217": + notevil = (notevil + 1217)/2; + break; +case "z1218": + notevil = (notevil + 1218)/2; + break; +case "z1219": + notevil = (notevil + 1219)/2; + break; +case "z1220": + notevil = (notevil + 1220)/2; + break; +case "z1221": + notevil = (notevil + 1221)/2; + break; +case "z1222": + notevil = (notevil + 1222)/2; + break; +case "z1223": + notevil = (notevil + 1223)/2; + break; +case "z1224": + notevil = (notevil + 1224)/2; + break; +case "z1225": + notevil = (notevil + 1225)/2; + break; +case "z1226": + notevil = (notevil + 1226)/2; + break; +case "z1227": + notevil = (notevil + 1227)/2; + break; +case "z1228": + notevil = (notevil + 1228)/2; + break; +case "z1229": + notevil = (notevil + 1229)/2; + break; +case "z1230": + notevil = (notevil + 1230)/2; + break; +case "z1231": + notevil = (notevil + 1231)/2; + break; +case "z1232": + notevil = (notevil + 1232)/2; + break; +case "z1233": + notevil = (notevil + 1233)/2; + break; +case "z1234": + notevil = (notevil + 1234)/2; + break; +case "z1235": + notevil = (notevil + 1235)/2; + break; +case "z1236": + notevil = (notevil + 1236)/2; + break; +case "z1237": + notevil = (notevil + 1237)/2; + break; +case "z1238": + notevil = (notevil + 1238)/2; + break; +case "z1239": + notevil = (notevil + 1239)/2; + break; +case "z1240": + notevil = (notevil + 1240)/2; + break; +case "z1241": + notevil = (notevil + 1241)/2; + break; +case "z1242": + notevil = (notevil + 1242)/2; + break; +case "z1243": + notevil = (notevil + 1243)/2; + break; +case "z1244": + notevil = (notevil + 1244)/2; + break; +case "z1245": + notevil = (notevil + 1245)/2; + break; +case "z1246": + notevil = (notevil + 1246)/2; + break; +case "z1247": + notevil = (notevil + 1247)/2; + break; +case "z1248": + notevil = (notevil + 1248)/2; + break; +case "z1249": + notevil = (notevil + 1249)/2; + break; +case "z1250": + notevil = (notevil + 1250)/2; + break; +case "z1251": + notevil = (notevil + 1251)/2; + break; +case "z1252": + notevil = (notevil + 1252)/2; + break; +case "z1253": + notevil = (notevil + 1253)/2; + break; +case "z1254": + notevil = (notevil + 1254)/2; + break; +case "z1255": + notevil = (notevil + 1255)/2; + break; +case "z1256": + notevil = (notevil + 1256)/2; + break; +case "z1257": + notevil = (notevil + 1257)/2; + break; +case "z1258": + notevil = (notevil + 1258)/2; + break; +case "z1259": + notevil = (notevil + 1259)/2; + break; +case "z1260": + notevil = (notevil + 1260)/2; + break; +case "z1261": + notevil = (notevil + 1261)/2; + break; +case "z1262": + notevil = (notevil + 1262)/2; + break; +case "z1263": + notevil = (notevil + 1263)/2; + break; +case "z1264": + notevil = (notevil + 1264)/2; + break; +case "z1265": + notevil = (notevil + 1265)/2; + break; +case "z1266": + notevil = (notevil + 1266)/2; + break; +case "z1267": + notevil = (notevil + 1267)/2; + break; +case "z1268": + notevil = (notevil + 1268)/2; + break; +case "z1269": + notevil = (notevil + 1269)/2; + break; +case "z1270": + notevil = (notevil + 1270)/2; + break; +case "z1271": + notevil = (notevil + 1271)/2; + break; +case "z1272": + notevil = (notevil + 1272)/2; + break; +case "z1273": + notevil = (notevil + 1273)/2; + break; +case "z1274": + notevil = (notevil + 1274)/2; + break; +case "z1275": + notevil = (notevil + 1275)/2; + break; +case "z1276": + notevil = (notevil + 1276)/2; + break; +case "z1277": + notevil = (notevil + 1277)/2; + break; +case "z1278": + notevil = (notevil + 1278)/2; + break; +case "z1279": + notevil = (notevil + 1279)/2; + break; +case "z1280": + notevil = (notevil + 1280)/2; + break; +case "z1281": + notevil = (notevil + 1281)/2; + break; +case "z1282": + notevil = (notevil + 1282)/2; + break; +case "z1283": + notevil = (notevil + 1283)/2; + break; +case "z1284": + notevil = (notevil + 1284)/2; + break; +case "z1285": + notevil = (notevil + 1285)/2; + break; +case "z1286": + notevil = (notevil + 1286)/2; + break; +case "z1287": + notevil = (notevil + 1287)/2; + break; +case "z1288": + notevil = (notevil + 1288)/2; + break; +case "z1289": + notevil = (notevil + 1289)/2; + break; +case "z1290": + notevil = (notevil + 1290)/2; + break; +case "z1291": + notevil = (notevil + 1291)/2; + break; +case "z1292": + notevil = (notevil + 1292)/2; + break; +case "z1293": + notevil = (notevil + 1293)/2; + break; +case "z1294": + notevil = (notevil + 1294)/2; + break; +case "z1295": + notevil = (notevil + 1295)/2; + break; +case "z1296": + notevil = (notevil + 1296)/2; + break; +case "z1297": + notevil = (notevil + 1297)/2; + break; +case "z1298": + notevil = (notevil + 1298)/2; + break; +case "z1299": + notevil = (notevil + 1299)/2; + break; +case "z1300": + notevil = (notevil + 1300)/2; + break; +case "z1301": + notevil = (notevil + 1301)/2; + break; +case "z1302": + notevil = (notevil + 1302)/2; + break; +case "z1303": + notevil = (notevil + 1303)/2; + break; +case "z1304": + notevil = (notevil + 1304)/2; + break; +case "z1305": + notevil = (notevil + 1305)/2; + break; +case "z1306": + notevil = (notevil + 1306)/2; + break; +case "z1307": + notevil = (notevil + 1307)/2; + break; +case "z1308": + notevil = (notevil + 1308)/2; + break; +case "z1309": + notevil = (notevil + 1309)/2; + break; +case "z1310": + notevil = (notevil + 1310)/2; + break; +case "z1311": + notevil = (notevil + 1311)/2; + break; +case "z1312": + notevil = (notevil + 1312)/2; + break; +case "z1313": + notevil = (notevil + 1313)/2; + break; +case "z1314": + notevil = (notevil + 1314)/2; + break; +case "z1315": + notevil = (notevil + 1315)/2; + break; +case "z1316": + notevil = (notevil + 1316)/2; + break; +case "z1317": + notevil = (notevil + 1317)/2; + break; +case "z1318": + notevil = (notevil + 1318)/2; + break; +case "z1319": + notevil = (notevil + 1319)/2; + break; +case "z1320": + notevil = (notevil + 1320)/2; + break; +case "z1321": + notevil = (notevil + 1321)/2; + break; +case "z1322": + notevil = (notevil + 1322)/2; + break; +case "z1323": + notevil = (notevil + 1323)/2; + break; +case "z1324": + notevil = (notevil + 1324)/2; + break; +case "z1325": + notevil = (notevil + 1325)/2; + break; +case "z1326": + notevil = (notevil + 1326)/2; + break; +case "z1327": + notevil = (notevil + 1327)/2; + break; +case "z1328": + notevil = (notevil + 1328)/2; + break; +case "z1329": + notevil = (notevil + 1329)/2; + break; +case "z1330": + notevil = (notevil + 1330)/2; + break; +case "z1331": + notevil = (notevil + 1331)/2; + break; +case "z1332": + notevil = (notevil + 1332)/2; + break; +case "z1333": + notevil = (notevil + 1333)/2; + break; +case "z1334": + notevil = (notevil + 1334)/2; + break; +case "z1335": + notevil = (notevil + 1335)/2; + break; +case "z1336": + notevil = (notevil + 1336)/2; + break; +case "z1337": + notevil = (notevil + 1337)/2; + break; +case "z1338": + notevil = (notevil + 1338)/2; + break; +case "z1339": + notevil = (notevil + 1339)/2; + break; +case "z1340": + notevil = (notevil + 1340)/2; + break; +case "z1341": + notevil = (notevil + 1341)/2; + break; +case "z1342": + notevil = (notevil + 1342)/2; + break; +case "z1343": + notevil = (notevil + 1343)/2; + break; +case "z1344": + notevil = (notevil + 1344)/2; + break; +case "z1345": + notevil = (notevil + 1345)/2; + break; +case "z1346": + notevil = (notevil + 1346)/2; + break; +case "z1347": + notevil = (notevil + 1347)/2; + break; +case "z1348": + notevil = (notevil + 1348)/2; + break; +case "z1349": + notevil = (notevil + 1349)/2; + break; +case "z1350": + notevil = (notevil + 1350)/2; + break; +case "z1351": + notevil = (notevil + 1351)/2; + break; +case "z1352": + notevil = (notevil + 1352)/2; + break; +case "z1353": + notevil = (notevil + 1353)/2; + break; +case "z1354": + notevil = (notevil + 1354)/2; + break; +case "z1355": + notevil = (notevil + 1355)/2; + break; +case "z1356": + notevil = (notevil + 1356)/2; + break; +case "z1357": + notevil = (notevil + 1357)/2; + break; +case "z1358": + notevil = (notevil + 1358)/2; + break; +case "z1359": + notevil = (notevil + 1359)/2; + break; +case "z1360": + notevil = (notevil + 1360)/2; + break; +case "z1361": + notevil = (notevil + 1361)/2; + break; +case "z1362": + notevil = (notevil + 1362)/2; + break; +case "z1363": + notevil = (notevil + 1363)/2; + break; +case "z1364": + notevil = (notevil + 1364)/2; + break; +case "z1365": + notevil = (notevil + 1365)/2; + break; +case "z1366": + notevil = (notevil + 1366)/2; + break; +case "z1367": + notevil = (notevil + 1367)/2; + break; +case "z1368": + notevil = (notevil + 1368)/2; + break; +case "z1369": + notevil = (notevil + 1369)/2; + break; +case "z1370": + notevil = (notevil + 1370)/2; + break; +case "z1371": + notevil = (notevil + 1371)/2; + break; +case "z1372": + notevil = (notevil + 1372)/2; + break; +case "z1373": + notevil = (notevil + 1373)/2; + break; +case "z1374": + notevil = (notevil + 1374)/2; + break; +case "z1375": + notevil = (notevil + 1375)/2; + break; +case "z1376": + notevil = (notevil + 1376)/2; + break; +case "z1377": + notevil = (notevil + 1377)/2; + break; +case "z1378": + notevil = (notevil + 1378)/2; + break; +case "z1379": + notevil = (notevil + 1379)/2; + break; +case "z1380": + notevil = (notevil + 1380)/2; + break; +case "z1381": + notevil = (notevil + 1381)/2; + break; +case "z1382": + notevil = (notevil + 1382)/2; + break; +case "z1383": + notevil = (notevil + 1383)/2; + break; +case "z1384": + notevil = (notevil + 1384)/2; + break; +case "z1385": + notevil = (notevil + 1385)/2; + break; +case "z1386": + notevil = (notevil + 1386)/2; + break; +case "z1387": + notevil = (notevil + 1387)/2; + break; +case "z1388": + notevil = (notevil + 1388)/2; + break; +case "z1389": + notevil = (notevil + 1389)/2; + break; +case "z1390": + notevil = (notevil + 1390)/2; + break; +case "z1391": + notevil = (notevil + 1391)/2; + break; +case "z1392": + notevil = (notevil + 1392)/2; + break; +case "z1393": + notevil = (notevil + 1393)/2; + break; +case "z1394": + notevil = (notevil + 1394)/2; + break; +case "z1395": + notevil = (notevil + 1395)/2; + break; +case "z1396": + notevil = (notevil + 1396)/2; + break; +case "z1397": + notevil = (notevil + 1397)/2; + break; +case "z1398": + notevil = (notevil + 1398)/2; + break; +case "z1399": + notevil = (notevil + 1399)/2; + break; +case "z1400": + notevil = (notevil + 1400)/2; + break; +case "z1401": + notevil = (notevil + 1401)/2; + break; +case "z1402": + notevil = (notevil + 1402)/2; + break; +case "z1403": + notevil = (notevil + 1403)/2; + break; +case "z1404": + notevil = (notevil + 1404)/2; + break; +case "z1405": + notevil = (notevil + 1405)/2; + break; +case "z1406": + notevil = (notevil + 1406)/2; + break; +case "z1407": + notevil = (notevil + 1407)/2; + break; +case "z1408": + notevil = (notevil + 1408)/2; + break; +case "z1409": + notevil = (notevil + 1409)/2; + break; +case "z1410": + notevil = (notevil + 1410)/2; + break; +case "z1411": + notevil = (notevil + 1411)/2; + break; +case "z1412": + notevil = (notevil + 1412)/2; + break; +case "z1413": + notevil = (notevil + 1413)/2; + break; +case "z1414": + notevil = (notevil + 1414)/2; + break; +case "z1415": + notevil = (notevil + 1415)/2; + break; +case "z1416": + notevil = (notevil + 1416)/2; + break; +case "z1417": + notevil = (notevil + 1417)/2; + break; +case "z1418": + notevil = (notevil + 1418)/2; + break; +case "z1419": + notevil = (notevil + 1419)/2; + break; +case "z1420": + notevil = (notevil + 1420)/2; + break; +case "z1421": + notevil = (notevil + 1421)/2; + break; +case "z1422": + notevil = (notevil + 1422)/2; + break; +case "z1423": + notevil = (notevil + 1423)/2; + break; +case "z1424": + notevil = (notevil + 1424)/2; + break; +case "z1425": + notevil = (notevil + 1425)/2; + break; +case "z1426": + notevil = (notevil + 1426)/2; + break; +case "z1427": + notevil = (notevil + 1427)/2; + break; +case "z1428": + notevil = (notevil + 1428)/2; + break; +case "z1429": + notevil = (notevil + 1429)/2; + break; +case "z1430": + notevil = (notevil + 1430)/2; + break; +case "z1431": + notevil = (notevil + 1431)/2; + break; +case "z1432": + notevil = (notevil + 1432)/2; + break; +case "z1433": + notevil = (notevil + 1433)/2; + break; +case "z1434": + notevil = (notevil + 1434)/2; + break; +case "z1435": + notevil = (notevil + 1435)/2; + break; +case "z1436": + notevil = (notevil + 1436)/2; + break; +case "z1437": + notevil = (notevil + 1437)/2; + break; +case "z1438": + notevil = (notevil + 1438)/2; + break; +case "z1439": + notevil = (notevil + 1439)/2; + break; +case "z1440": + notevil = (notevil + 1440)/2; + break; +case "z1441": + notevil = (notevil + 1441)/2; + break; +case "z1442": + notevil = (notevil + 1442)/2; + break; +case "z1443": + notevil = (notevil + 1443)/2; + break; +case "z1444": + notevil = (notevil + 1444)/2; + break; +case "z1445": + notevil = (notevil + 1445)/2; + break; +case "z1446": + notevil = (notevil + 1446)/2; + break; +case "z1447": + notevil = (notevil + 1447)/2; + break; +case "z1448": + notevil = (notevil + 1448)/2; + break; +case "z1449": + notevil = (notevil + 1449)/2; + break; +case "z1450": + notevil = (notevil + 1450)/2; + break; +case "z1451": + notevil = (notevil + 1451)/2; + break; +case "z1452": + notevil = (notevil + 1452)/2; + break; +case "z1453": + notevil = (notevil + 1453)/2; + break; +case "z1454": + notevil = (notevil + 1454)/2; + break; +case "z1455": + notevil = (notevil + 1455)/2; + break; +case "z1456": + notevil = (notevil + 1456)/2; + break; +case "z1457": + notevil = (notevil + 1457)/2; + break; +case "z1458": + notevil = (notevil + 1458)/2; + break; +case "z1459": + notevil = (notevil + 1459)/2; + break; +case "z1460": + notevil = (notevil + 1460)/2; + break; +case "z1461": + notevil = (notevil + 1461)/2; + break; +case "z1462": + notevil = (notevil + 1462)/2; + break; +case "z1463": + notevil = (notevil + 1463)/2; + break; +case "z1464": + notevil = (notevil + 1464)/2; + break; +case "z1465": + notevil = (notevil + 1465)/2; + break; +case "z1466": + notevil = (notevil + 1466)/2; + break; +case "z1467": + notevil = (notevil + 1467)/2; + break; +case "z1468": + notevil = (notevil + 1468)/2; + break; +case "z1469": + notevil = (notevil + 1469)/2; + break; +case "z1470": + notevil = (notevil + 1470)/2; + break; +case "z1471": + notevil = (notevil + 1471)/2; + break; +case "z1472": + notevil = (notevil + 1472)/2; + break; +case "z1473": + notevil = (notevil + 1473)/2; + break; +case "z1474": + notevil = (notevil + 1474)/2; + break; +case "z1475": + notevil = (notevil + 1475)/2; + break; +case "z1476": + notevil = (notevil + 1476)/2; + break; +case "z1477": + notevil = (notevil + 1477)/2; + break; +case "z1478": + notevil = (notevil + 1478)/2; + break; +case "z1479": + notevil = (notevil + 1479)/2; + break; +case "z1480": + notevil = (notevil + 1480)/2; + break; +case "z1481": + notevil = (notevil + 1481)/2; + break; +case "z1482": + notevil = (notevil + 1482)/2; + break; +case "z1483": + notevil = (notevil + 1483)/2; + break; +case "z1484": + notevil = (notevil + 1484)/2; + break; +case "z1485": + notevil = (notevil + 1485)/2; + break; +case "z1486": + notevil = (notevil + 1486)/2; + break; +case "z1487": + notevil = (notevil + 1487)/2; + break; +case "z1488": + notevil = (notevil + 1488)/2; + break; +case "z1489": + notevil = (notevil + 1489)/2; + break; +case "z1490": + notevil = (notevil + 1490)/2; + break; +case "z1491": + notevil = (notevil + 1491)/2; + break; +case "z1492": + notevil = (notevil + 1492)/2; + break; +case "z1493": + notevil = (notevil + 1493)/2; + break; +case "z1494": + notevil = (notevil + 1494)/2; + break; +case "z1495": + notevil = (notevil + 1495)/2; + break; +case "z1496": + notevil = (notevil + 1496)/2; + break; +case "z1497": + notevil = (notevil + 1497)/2; + break; +case "z1498": + notevil = (notevil + 1498)/2; + break; +case "z1499": + notevil = (notevil + 1499)/2; + break; +case "z1500": + notevil = (notevil + 1500)/2; + break; +case "z1501": + notevil = (notevil + 1501)/2; + break; +case "z1502": + notevil = (notevil + 1502)/2; + break; +case "z1503": + notevil = (notevil + 1503)/2; + break; +case "z1504": + notevil = (notevil + 1504)/2; + break; +case "z1505": + notevil = (notevil + 1505)/2; + break; +case "z1506": + notevil = (notevil + 1506)/2; + break; +case "z1507": + notevil = (notevil + 1507)/2; + break; +case "z1508": + notevil = (notevil + 1508)/2; + break; +case "z1509": + notevil = (notevil + 1509)/2; + break; +case "z1510": + notevil = (notevil + 1510)/2; + break; +case "z1511": + notevil = (notevil + 1511)/2; + break; +case "z1512": + notevil = (notevil + 1512)/2; + break; +case "z1513": + notevil = (notevil + 1513)/2; + break; +case "z1514": + notevil = (notevil + 1514)/2; + break; +case "z1515": + notevil = (notevil + 1515)/2; + break; +case "z1516": + notevil = (notevil + 1516)/2; + break; +case "z1517": + notevil = (notevil + 1517)/2; + break; +case "z1518": + notevil = (notevil + 1518)/2; + break; +case "z1519": + notevil = (notevil + 1519)/2; + break; +case "z1520": + notevil = (notevil + 1520)/2; + break; +case "z1521": + notevil = (notevil + 1521)/2; + break; +case "z1522": + notevil = (notevil + 1522)/2; + break; +case "z1523": + notevil = (notevil + 1523)/2; + break; +case "z1524": + notevil = (notevil + 1524)/2; + break; +case "z1525": + notevil = (notevil + 1525)/2; + break; +case "z1526": + notevil = (notevil + 1526)/2; + break; +case "z1527": + notevil = (notevil + 1527)/2; + break; +case "z1528": + notevil = (notevil + 1528)/2; + break; +case "z1529": + notevil = (notevil + 1529)/2; + break; +case "z1530": + notevil = (notevil + 1530)/2; + break; +case "z1531": + notevil = (notevil + 1531)/2; + break; +case "z1532": + notevil = (notevil + 1532)/2; + break; +case "z1533": + notevil = (notevil + 1533)/2; + break; +case "z1534": + notevil = (notevil + 1534)/2; + break; +case "z1535": + notevil = (notevil + 1535)/2; + break; +case "z1536": + notevil = (notevil + 1536)/2; + break; +case "z1537": + notevil = (notevil + 1537)/2; + break; +case "z1538": + notevil = (notevil + 1538)/2; + break; +case "z1539": + notevil = (notevil + 1539)/2; + break; +case "z1540": + notevil = (notevil + 1540)/2; + break; +case "z1541": + notevil = (notevil + 1541)/2; + break; +case "z1542": + notevil = (notevil + 1542)/2; + break; +case "z1543": + notevil = (notevil + 1543)/2; + break; +case "z1544": + notevil = (notevil + 1544)/2; + break; +case "z1545": + notevil = (notevil + 1545)/2; + break; +case "z1546": + notevil = (notevil + 1546)/2; + break; +case "z1547": + notevil = (notevil + 1547)/2; + break; +case "z1548": + notevil = (notevil + 1548)/2; + break; +case "z1549": + notevil = (notevil + 1549)/2; + break; +case "z1550": + notevil = (notevil + 1550)/2; + break; +case "z1551": + notevil = (notevil + 1551)/2; + break; +case "z1552": + notevil = (notevil + 1552)/2; + break; +case "z1553": + notevil = (notevil + 1553)/2; + break; +case "z1554": + notevil = (notevil + 1554)/2; + break; +case "z1555": + notevil = (notevil + 1555)/2; + break; +case "z1556": + notevil = (notevil + 1556)/2; + break; +case "z1557": + notevil = (notevil + 1557)/2; + break; +case "z1558": + notevil = (notevil + 1558)/2; + break; +case "z1559": + notevil = (notevil + 1559)/2; + break; +case "z1560": + notevil = (notevil + 1560)/2; + break; +case "z1561": + notevil = (notevil + 1561)/2; + break; +case "z1562": + notevil = (notevil + 1562)/2; + break; +case "z1563": + notevil = (notevil + 1563)/2; + break; +case "z1564": + notevil = (notevil + 1564)/2; + break; +case "z1565": + notevil = (notevil + 1565)/2; + break; +case "z1566": + notevil = (notevil + 1566)/2; + break; +case "z1567": + notevil = (notevil + 1567)/2; + break; +case "z1568": + notevil = (notevil + 1568)/2; + break; +case "z1569": + notevil = (notevil + 1569)/2; + break; +case "z1570": + notevil = (notevil + 1570)/2; + break; +case "z1571": + notevil = (notevil + 1571)/2; + break; +case "z1572": + notevil = (notevil + 1572)/2; + break; +case "z1573": + notevil = (notevil + 1573)/2; + break; +case "z1574": + notevil = (notevil + 1574)/2; + break; +case "z1575": + notevil = (notevil + 1575)/2; + break; +case "z1576": + notevil = (notevil + 1576)/2; + break; +case "z1577": + notevil = (notevil + 1577)/2; + break; +case "z1578": + notevil = (notevil + 1578)/2; + break; +case "z1579": + notevil = (notevil + 1579)/2; + break; +case "z1580": + notevil = (notevil + 1580)/2; + break; +case "z1581": + notevil = (notevil + 1581)/2; + break; +case "z1582": + notevil = (notevil + 1582)/2; + break; +case "z1583": + notevil = (notevil + 1583)/2; + break; +case "z1584": + notevil = (notevil + 1584)/2; + break; +case "z1585": + notevil = (notevil + 1585)/2; + break; +case "z1586": + notevil = (notevil + 1586)/2; + break; +case "z1587": + notevil = (notevil + 1587)/2; + break; +case "z1588": + notevil = (notevil + 1588)/2; + break; +case "z1589": + notevil = (notevil + 1589)/2; + break; +case "z1590": + notevil = (notevil + 1590)/2; + break; +case "z1591": + notevil = (notevil + 1591)/2; + break; +case "z1592": + notevil = (notevil + 1592)/2; + break; +case "z1593": + notevil = (notevil + 1593)/2; + break; +case "z1594": + notevil = (notevil + 1594)/2; + break; +case "z1595": + notevil = (notevil + 1595)/2; + break; +case "z1596": + notevil = (notevil + 1596)/2; + break; +case "z1597": + notevil = (notevil + 1597)/2; + break; +case "z1598": + notevil = (notevil + 1598)/2; + break; +case "z1599": + notevil = (notevil + 1599)/2; + break; +case "z1600": + notevil = (notevil + 1600)/2; + break; +case "z1601": + notevil = (notevil + 1601)/2; + break; +case "z1602": + notevil = (notevil + 1602)/2; + break; +case "z1603": + notevil = (notevil + 1603)/2; + break; +case "z1604": + notevil = (notevil + 1604)/2; + break; +case "z1605": + notevil = (notevil + 1605)/2; + break; +case "z1606": + notevil = (notevil + 1606)/2; + break; +case "z1607": + notevil = (notevil + 1607)/2; + break; +case "z1608": + notevil = (notevil + 1608)/2; + break; +case "z1609": + notevil = (notevil + 1609)/2; + break; +case "z1610": + notevil = (notevil + 1610)/2; + break; +case "z1611": + notevil = (notevil + 1611)/2; + break; +case "z1612": + notevil = (notevil + 1612)/2; + break; +case "z1613": + notevil = (notevil + 1613)/2; + break; +case "z1614": + notevil = (notevil + 1614)/2; + break; +case "z1615": + notevil = (notevil + 1615)/2; + break; +case "z1616": + notevil = (notevil + 1616)/2; + break; +case "z1617": + notevil = (notevil + 1617)/2; + break; +case "z1618": + notevil = (notevil + 1618)/2; + break; +case "z1619": + notevil = (notevil + 1619)/2; + break; +case "z1620": + notevil = (notevil + 1620)/2; + break; +case "z1621": + notevil = (notevil + 1621)/2; + break; +case "z1622": + notevil = (notevil + 1622)/2; + break; +case "z1623": + notevil = (notevil + 1623)/2; + break; +case "z1624": + notevil = (notevil + 1624)/2; + break; +case "z1625": + notevil = (notevil + 1625)/2; + break; +case "z1626": + notevil = (notevil + 1626)/2; + break; +case "z1627": + notevil = (notevil + 1627)/2; + break; +case "z1628": + notevil = (notevil + 1628)/2; + break; +case "z1629": + notevil = (notevil + 1629)/2; + break; +case "z1630": + notevil = (notevil + 1630)/2; + break; +case "z1631": + notevil = (notevil + 1631)/2; + break; +case "z1632": + notevil = (notevil + 1632)/2; + break; +case "z1633": + notevil = (notevil + 1633)/2; + break; +case "z1634": + notevil = (notevil + 1634)/2; + break; +case "z1635": + notevil = (notevil + 1635)/2; + break; +case "z1636": + notevil = (notevil + 1636)/2; + break; +case "z1637": + notevil = (notevil + 1637)/2; + break; +case "z1638": + notevil = (notevil + 1638)/2; + break; +case "z1639": + notevil = (notevil + 1639)/2; + break; +case "z1640": + notevil = (notevil + 1640)/2; + break; +case "z1641": + notevil = (notevil + 1641)/2; + break; +case "z1642": + notevil = (notevil + 1642)/2; + break; +case "z1643": + notevil = (notevil + 1643)/2; + break; +case "z1644": + notevil = (notevil + 1644)/2; + break; +case "z1645": + notevil = (notevil + 1645)/2; + break; +case "z1646": + notevil = (notevil + 1646)/2; + break; +case "z1647": + notevil = (notevil + 1647)/2; + break; +case "z1648": + notevil = (notevil + 1648)/2; + break; +case "z1649": + notevil = (notevil + 1649)/2; + break; +case "z1650": + notevil = (notevil + 1650)/2; + break; +case "z1651": + notevil = (notevil + 1651)/2; + break; +case "z1652": + notevil = (notevil + 1652)/2; + break; +case "z1653": + notevil = (notevil + 1653)/2; + break; +case "z1654": + notevil = (notevil + 1654)/2; + break; +case "z1655": + notevil = (notevil + 1655)/2; + break; +case "z1656": + notevil = (notevil + 1656)/2; + break; +case "z1657": + notevil = (notevil + 1657)/2; + break; +case "z1658": + notevil = (notevil + 1658)/2; + break; +case "z1659": + notevil = (notevil + 1659)/2; + break; +case "z1660": + notevil = (notevil + 1660)/2; + break; +case "z1661": + notevil = (notevil + 1661)/2; + break; +case "z1662": + notevil = (notevil + 1662)/2; + break; +case "z1663": + notevil = (notevil + 1663)/2; + break; +case "z1664": + notevil = (notevil + 1664)/2; + break; +case "z1665": + notevil = (notevil + 1665)/2; + break; +case "z1666": + notevil = (notevil + 1666)/2; + break; +case "z1667": + notevil = (notevil + 1667)/2; + break; +case "z1668": + notevil = (notevil + 1668)/2; + break; +case "z1669": + notevil = (notevil + 1669)/2; + break; +case "z1670": + notevil = (notevil + 1670)/2; + break; +case "z1671": + notevil = (notevil + 1671)/2; + break; +case "z1672": + notevil = (notevil + 1672)/2; + break; +case "z1673": + notevil = (notevil + 1673)/2; + break; +case "z1674": + notevil = (notevil + 1674)/2; + break; +case "z1675": + notevil = (notevil + 1675)/2; + break; +case "z1676": + notevil = (notevil + 1676)/2; + break; +case "z1677": + notevil = (notevil + 1677)/2; + break; +case "z1678": + notevil = (notevil + 1678)/2; + break; +case "z1679": + notevil = (notevil + 1679)/2; + break; +case "z1680": + notevil = (notevil + 1680)/2; + break; +case "z1681": + notevil = (notevil + 1681)/2; + break; +case "z1682": + notevil = (notevil + 1682)/2; + break; +case "z1683": + notevil = (notevil + 1683)/2; + break; +case "z1684": + notevil = (notevil + 1684)/2; + break; +case "z1685": + notevil = (notevil + 1685)/2; + break; +case "z1686": + notevil = (notevil + 1686)/2; + break; +case "z1687": + notevil = (notevil + 1687)/2; + break; +case "z1688": + notevil = (notevil + 1688)/2; + break; +case "z1689": + notevil = (notevil + 1689)/2; + break; +case "z1690": + notevil = (notevil + 1690)/2; + break; +case "z1691": + notevil = (notevil + 1691)/2; + break; +case "z1692": + notevil = (notevil + 1692)/2; + break; +case "z1693": + notevil = (notevil + 1693)/2; + break; +case "z1694": + notevil = (notevil + 1694)/2; + break; +case "z1695": + notevil = (notevil + 1695)/2; + break; +case "z1696": + notevil = (notevil + 1696)/2; + break; +case "z1697": + notevil = (notevil + 1697)/2; + break; +case "z1698": + notevil = (notevil + 1698)/2; + break; +case "z1699": + notevil = (notevil + 1699)/2; + break; +case "z1700": + notevil = (notevil + 1700)/2; + break; +case "z1701": + notevil = (notevil + 1701)/2; + break; +case "z1702": + notevil = (notevil + 1702)/2; + break; +case "z1703": + notevil = (notevil + 1703)/2; + break; +case "z1704": + notevil = (notevil + 1704)/2; + break; +case "z1705": + notevil = (notevil + 1705)/2; + break; +case "z1706": + notevil = (notevil + 1706)/2; + break; +case "z1707": + notevil = (notevil + 1707)/2; + break; +case "z1708": + notevil = (notevil + 1708)/2; + break; +case "z1709": + notevil = (notevil + 1709)/2; + break; +case "z1710": + notevil = (notevil + 1710)/2; + break; +case "z1711": + notevil = (notevil + 1711)/2; + break; +case "z1712": + notevil = (notevil + 1712)/2; + break; +case "z1713": + notevil = (notevil + 1713)/2; + break; +case "z1714": + notevil = (notevil + 1714)/2; + break; +case "z1715": + notevil = (notevil + 1715)/2; + break; +case "z1716": + notevil = (notevil + 1716)/2; + break; +case "z1717": + notevil = (notevil + 1717)/2; + break; +case "z1718": + notevil = (notevil + 1718)/2; + break; +case "z1719": + notevil = (notevil + 1719)/2; + break; +case "z1720": + notevil = (notevil + 1720)/2; + break; +case "z1721": + notevil = (notevil + 1721)/2; + break; +case "z1722": + notevil = (notevil + 1722)/2; + break; +case "z1723": + notevil = (notevil + 1723)/2; + break; +case "z1724": + notevil = (notevil + 1724)/2; + break; +case "z1725": + notevil = (notevil + 1725)/2; + break; +case "z1726": + notevil = (notevil + 1726)/2; + break; +case "z1727": + notevil = (notevil + 1727)/2; + break; +case "z1728": + notevil = (notevil + 1728)/2; + break; +case "z1729": + notevil = (notevil + 1729)/2; + break; +case "z1730": + notevil = (notevil + 1730)/2; + break; +case "z1731": + notevil = (notevil + 1731)/2; + break; +case "z1732": + notevil = (notevil + 1732)/2; + break; +case "z1733": + notevil = (notevil + 1733)/2; + break; +case "z1734": + notevil = (notevil + 1734)/2; + break; +case "z1735": + notevil = (notevil + 1735)/2; + break; +case "z1736": + notevil = (notevil + 1736)/2; + break; +case "z1737": + notevil = (notevil + 1737)/2; + break; +case "z1738": + notevil = (notevil + 1738)/2; + break; +case "z1739": + notevil = (notevil + 1739)/2; + break; +case "z1740": + notevil = (notevil + 1740)/2; + break; +case "z1741": + notevil = (notevil + 1741)/2; + break; +case "z1742": + notevil = (notevil + 1742)/2; + break; +case "z1743": + notevil = (notevil + 1743)/2; + break; +case "z1744": + notevil = (notevil + 1744)/2; + break; +case "z1745": + notevil = (notevil + 1745)/2; + break; +case "z1746": + notevil = (notevil + 1746)/2; + break; +case "z1747": + notevil = (notevil + 1747)/2; + break; +case "z1748": + notevil = (notevil + 1748)/2; + break; +case "z1749": + notevil = (notevil + 1749)/2; + break; +case "z1750": + notevil = (notevil + 1750)/2; + break; +case "z1751": + notevil = (notevil + 1751)/2; + break; +case "z1752": + notevil = (notevil + 1752)/2; + break; +case "z1753": + notevil = (notevil + 1753)/2; + break; +case "z1754": + notevil = (notevil + 1754)/2; + break; +case "z1755": + notevil = (notevil + 1755)/2; + break; +case "z1756": + notevil = (notevil + 1756)/2; + break; +case "z1757": + notevil = (notevil + 1757)/2; + break; +case "z1758": + notevil = (notevil + 1758)/2; + break; +case "z1759": + notevil = (notevil + 1759)/2; + break; +case "z1760": + notevil = (notevil + 1760)/2; + break; +case "z1761": + notevil = (notevil + 1761)/2; + break; +case "z1762": + notevil = (notevil + 1762)/2; + break; +case "z1763": + notevil = (notevil + 1763)/2; + break; +case "z1764": + notevil = (notevil + 1764)/2; + break; +case "z1765": + notevil = (notevil + 1765)/2; + break; +case "z1766": + notevil = (notevil + 1766)/2; + break; +case "z1767": + notevil = (notevil + 1767)/2; + break; +case "z1768": + notevil = (notevil + 1768)/2; + break; +case "z1769": + notevil = (notevil + 1769)/2; + break; +case "z1770": + notevil = (notevil + 1770)/2; + break; +case "z1771": + notevil = (notevil + 1771)/2; + break; +case "z1772": + notevil = (notevil + 1772)/2; + break; +case "z1773": + notevil = (notevil + 1773)/2; + break; +case "z1774": + notevil = (notevil + 1774)/2; + break; +case "z1775": + notevil = (notevil + 1775)/2; + break; +case "z1776": + notevil = (notevil + 1776)/2; + break; +case "z1777": + notevil = (notevil + 1777)/2; + break; +case "z1778": + notevil = (notevil + 1778)/2; + break; +case "z1779": + notevil = (notevil + 1779)/2; + break; +case "z1780": + notevil = (notevil + 1780)/2; + break; +case "z1781": + notevil = (notevil + 1781)/2; + break; +case "z1782": + notevil = (notevil + 1782)/2; + break; +case "z1783": + notevil = (notevil + 1783)/2; + break; +case "z1784": + notevil = (notevil + 1784)/2; + break; +case "z1785": + notevil = (notevil + 1785)/2; + break; +case "z1786": + notevil = (notevil + 1786)/2; + break; +case "z1787": + notevil = (notevil + 1787)/2; + break; +case "z1788": + notevil = (notevil + 1788)/2; + break; +case "z1789": + notevil = (notevil + 1789)/2; + break; +case "z1790": + notevil = (notevil + 1790)/2; + break; +case "z1791": + notevil = (notevil + 1791)/2; + break; +case "z1792": + notevil = (notevil + 1792)/2; + break; +case "z1793": + notevil = (notevil + 1793)/2; + break; +case "z1794": + notevil = (notevil + 1794)/2; + break; +case "z1795": + notevil = (notevil + 1795)/2; + break; +case "z1796": + notevil = (notevil + 1796)/2; + break; +case "z1797": + notevil = (notevil + 1797)/2; + break; +case "z1798": + notevil = (notevil + 1798)/2; + break; +case "z1799": + notevil = (notevil + 1799)/2; + break; + +default: + dut = 3; + break; +} + +reportCompare(expect, actual, summary); diff --git a/js/src/tests/ecma_3/Statements/regress-444979.js b/js/src/tests/ecma_3/Statements/regress-444979.js new file mode 100644 index 000000000..e4c729cdb --- /dev/null +++ b/js/src/tests/ecma_3/Statements/regress-444979.js @@ -0,0 +1,43 @@ +/* -*- 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 = 444979; +var summary = 'switch -0 is same as switch 0'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + expect = 'y==0'; + actual = ''; + + var shortSwitch = 'var y=-0;switch (y){case 0: actual="y==0"; break; default: actual="y!=0";}'; + eval(shortSwitch); + + reportCompare(expect, actual, summary + ': shortSwitch'); + + actual = ''; + + var longSwitch = 'var y=-0;var t=0;switch(y){case -1:'; + for (var i = 0; i < 64000; i++) { + longSwitch += ' t++;'; + } + longSwitch += ' break; case 0: actual = "y==0"; break; default: actual = "y!=0";}'; + eval(longSwitch); + + reportCompare(expect, actual, summary + ': longSwitch'); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/Statements/regress-642975.js b/js/src/tests/ecma_3/Statements/regress-642975.js new file mode 100644 index 000000000..f6180e7e8 --- /dev/null +++ b/js/src/tests/ecma_3/Statements/regress-642975.js @@ -0,0 +1,30 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +var x = 0; +var y = 1; +var g = 1; + +var expect = "y"; +var actual; + +try { + eval("y: while (x) break\n/y/g.exec('y')"); + actual = RegExp.lastMatch; +} catch (e) { + actual = '' + e; +} +assertEq(actual, expect); + +try { + eval("y: while (x) continue\n/y/g.exec('y')"); + actual = RegExp.lastMatch; +} catch (e) { + actual = '' + e; +} +assertEq(actual, expect); + +reportCompare(0, 0, "ok"); diff --git a/js/src/tests/ecma_3/Statements/regress-74474-001.js b/js/src/tests/ecma_3/Statements/regress-74474-001.js new file mode 100644 index 000000000..91527bff1 --- /dev/null +++ b/js/src/tests/ecma_3/Statements/regress-74474-001.js @@ -0,0 +1,105 @@ +/* -*- 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: 01 May 2001 + * + * SUMMARY: Regression test for Bugzilla bug 74474 + *"switch() misbehaves with duplicated labels" + * + * See ECMA3 Section 12.11, "The switch Statement" + * See http://bugzilla.mozilla.org/show_bug.cgi?id=74474 + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = 74474; +var summary = 'Testing switch statements with duplicate labels'; +var status = ''; +var statusitems = [ ]; +var actual = ''; +var actualvalues = [ ]; +var expect= ''; +var expectedvalues = [ ]; + + +status = 'Section A of test: the string literal "1" as a duplicate label'; +actual = ''; +switch ('1') +{ +case '1': + actual += 'a'; +case '1': + actual += 'b'; +} +expect = 'ab'; +addThis(); + + +status = 'Section B of test: the numeric literal 1 as a duplicate label'; +actual = ''; +switch (1) +{ +case 1: + actual += 'a'; +case 1: + actual += 'b'; +} +expect = 'ab'; +addThis(); + + +status = 'Section C of test: the numeric literal 1 as a duplicate label, via a function parameter'; +tryThis(1); +function tryThis(x) +{ + actual = ''; + + switch (x) + { + case x: + actual += 'a'; + case x: + actual += 'b'; + } +} +expect = 'ab'; +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], getStatus(i)); + } + + exitFunc ('test'); +} + + +function getStatus(i) +{ + return statusitems[i]; +} diff --git a/js/src/tests/ecma_3/Statements/regress-74474-002.js b/js/src/tests/ecma_3/Statements/regress-74474-002.js new file mode 100644 index 000000000..9eba26063 --- /dev/null +++ b/js/src/tests/ecma_3/Statements/regress-74474-002.js @@ -0,0 +1,9063 @@ +/* -*- 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: 09 May 2001 + * + * SUMMARY: Regression test for Bugzilla bug 74474 + * "switch() misbehaves with duplicated labels" + * + * See http://bugzilla.mozilla.org/show_bug.cgi?id=74474 + * See ECMA3 Section 12.11, "The switch Statement" + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = 74474; +var summary = 'Test of switch statement that overflows the stack-allocated bitmap'; +var status = '(No duplicated labels)'; +var statusitems = [ ]; +var actual = ''; +var actualvalues = [ ]; +var expect= ''; +var expectedvalues = [ ]; +var x = 3; + + +switch (x) +{ +case 0: +case 1: +case 2: +case 3: +case 4: +case 5: +case 6: +case 7: +case 8: +case 9: +case 10: +case 11: +case 12: +case 13: +case 14: +case 15: +case 16: +case 17: +case 18: +case 19: +case 20: +case 21: +case 22: +case 23: +case 24: +case 25: +case 26: +case 27: +case 28: +case 29: +case 30: +case 31: +case 32: +case 33: +case 34: +case 35: +case 36: +case 37: +case 38: +case 39: +case 40: +case 41: +case 42: +case 43: +case 44: +case 45: +case 46: +case 47: +case 48: +case 49: +case 50: +case 51: +case 52: +case 53: +case 54: +case 55: +case 56: +case 57: +case 58: +case 59: +case 60: +case 61: +case 62: +case 63: +case 64: +case 65: +case 66: +case 67: +case 68: +case 69: +case 70: +case 71: +case 72: +case 73: +case 74: +case 75: +case 76: +case 77: +case 78: +case 79: +case 80: +case 81: +case 82: +case 83: +case 84: +case 85: +case 86: +case 87: +case 88: +case 89: +case 90: +case 91: +case 92: +case 93: +case 94: +case 95: +case 96: +case 97: +case 98: +case 99: +case 100: +case 101: +case 102: +case 103: +case 104: +case 105: +case 106: +case 107: +case 108: +case 109: +case 110: +case 111: +case 112: +case 113: +case 114: +case 115: +case 116: +case 117: +case 118: +case 119: +case 120: +case 121: +case 122: +case 123: +case 124: +case 125: +case 126: +case 127: +case 128: +case 129: +case 130: +case 131: +case 132: +case 133: +case 134: +case 135: +case 136: +case 137: +case 138: +case 139: +case 140: +case 141: +case 142: +case 143: +case 144: +case 145: +case 146: +case 147: +case 148: +case 149: +case 150: +case 151: +case 152: +case 153: +case 154: +case 155: +case 156: +case 157: +case 158: +case 159: +case 160: +case 161: +case 162: +case 163: +case 164: +case 165: +case 166: +case 167: +case 168: +case 169: +case 170: +case 171: +case 172: +case 173: +case 174: +case 175: +case 176: +case 177: +case 178: +case 179: +case 180: +case 181: +case 182: +case 183: +case 184: +case 185: +case 186: +case 187: +case 188: +case 189: +case 190: +case 191: +case 192: +case 193: +case 194: +case 195: +case 196: +case 197: +case 198: +case 199: +case 200: +case 201: +case 202: +case 203: +case 204: +case 205: +case 206: +case 207: +case 208: +case 209: +case 210: +case 211: +case 212: +case 213: +case 214: +case 215: +case 216: +case 217: +case 218: +case 219: +case 220: +case 221: +case 222: +case 223: +case 224: +case 225: +case 226: +case 227: +case 228: +case 229: +case 230: +case 231: +case 232: +case 233: +case 234: +case 235: +case 236: +case 237: +case 238: +case 239: +case 240: +case 241: +case 242: +case 243: +case 244: +case 245: +case 246: +case 247: +case 248: +case 249: +case 250: +case 251: +case 252: +case 253: +case 254: +case 255: +case 256: +case 257: +case 258: +case 259: +case 260: +case 261: +case 262: +case 263: +case 264: +case 265: +case 266: +case 267: +case 268: +case 269: +case 270: +case 271: +case 272: +case 273: +case 274: +case 275: +case 276: +case 277: +case 278: +case 279: +case 280: +case 281: +case 282: +case 283: +case 284: +case 285: +case 286: +case 287: +case 288: +case 289: +case 290: +case 291: +case 292: +case 293: +case 294: +case 295: +case 296: +case 297: +case 298: +case 299: +case 300: +case 301: +case 302: +case 303: +case 304: +case 305: +case 306: +case 307: +case 308: +case 309: +case 310: +case 311: +case 312: +case 313: +case 314: +case 315: +case 316: +case 317: +case 318: +case 319: +case 320: +case 321: +case 322: +case 323: +case 324: +case 325: +case 326: +case 327: +case 328: +case 329: +case 330: +case 331: +case 332: +case 333: +case 334: +case 335: +case 336: +case 337: +case 338: +case 339: +case 340: +case 341: +case 342: +case 343: +case 344: +case 345: +case 346: +case 347: +case 348: +case 349: +case 350: +case 351: +case 352: +case 353: +case 354: +case 355: +case 356: +case 357: +case 358: +case 359: +case 360: +case 361: +case 362: +case 363: +case 364: +case 365: +case 366: +case 367: +case 368: +case 369: +case 370: +case 371: +case 372: +case 373: +case 374: +case 375: +case 376: +case 377: +case 378: +case 379: +case 380: +case 381: +case 382: +case 383: +case 384: +case 385: +case 386: +case 387: +case 388: +case 389: +case 390: +case 391: +case 392: +case 393: +case 394: +case 395: +case 396: +case 397: +case 398: +case 399: +case 400: +case 401: +case 402: +case 403: +case 404: +case 405: +case 406: +case 407: +case 408: +case 409: +case 410: +case 411: +case 412: +case 413: +case 414: +case 415: +case 416: +case 417: +case 418: +case 419: +case 420: +case 421: +case 422: +case 423: +case 424: +case 425: +case 426: +case 427: +case 428: +case 429: +case 430: +case 431: +case 432: +case 433: +case 434: +case 435: +case 436: +case 437: +case 438: +case 439: +case 440: +case 441: +case 442: +case 443: +case 444: +case 445: +case 446: +case 447: +case 448: +case 449: +case 450: +case 451: +case 452: +case 453: +case 454: +case 455: +case 456: +case 457: +case 458: +case 459: +case 460: +case 461: +case 462: +case 463: +case 464: +case 465: +case 466: +case 467: +case 468: +case 469: +case 470: +case 471: +case 472: +case 473: +case 474: +case 475: +case 476: +case 477: +case 478: +case 479: +case 480: +case 481: +case 482: +case 483: +case 484: +case 485: +case 486: +case 487: +case 488: +case 489: +case 490: +case 491: +case 492: +case 493: +case 494: +case 495: +case 496: +case 497: +case 498: +case 499: +case 500: +case 501: +case 502: +case 503: +case 504: +case 505: +case 506: +case 507: +case 508: +case 509: +case 510: +case 511: +case 512: +case 513: +case 514: +case 515: +case 516: +case 517: +case 518: +case 519: +case 520: +case 521: +case 522: +case 523: +case 524: +case 525: +case 526: +case 527: +case 528: +case 529: +case 530: +case 531: +case 532: +case 533: +case 534: +case 535: +case 536: +case 537: +case 538: +case 539: +case 540: +case 541: +case 542: +case 543: +case 544: +case 545: +case 546: +case 547: +case 548: +case 549: +case 550: +case 551: +case 552: +case 553: +case 554: +case 555: +case 556: +case 557: +case 558: +case 559: +case 560: +case 561: +case 562: +case 563: +case 564: +case 565: +case 566: +case 567: +case 568: +case 569: +case 570: +case 571: +case 572: +case 573: +case 574: +case 575: +case 576: +case 577: +case 578: +case 579: +case 580: +case 581: +case 582: +case 583: +case 584: +case 585: +case 586: +case 587: +case 588: +case 589: +case 590: +case 591: +case 592: +case 593: +case 594: +case 595: +case 596: +case 597: +case 598: +case 599: +case 600: +case 601: +case 602: +case 603: +case 604: +case 605: +case 606: +case 607: +case 608: +case 609: +case 610: +case 611: +case 612: +case 613: +case 614: +case 615: +case 616: +case 617: +case 618: +case 619: +case 620: +case 621: +case 622: +case 623: +case 624: +case 625: +case 626: +case 627: +case 628: +case 629: +case 630: +case 631: +case 632: +case 633: +case 634: +case 635: +case 636: +case 637: +case 638: +case 639: +case 640: +case 641: +case 642: +case 643: +case 644: +case 645: +case 646: +case 647: +case 648: +case 649: +case 650: +case 651: +case 652: +case 653: +case 654: +case 655: +case 656: +case 657: +case 658: +case 659: +case 660: +case 661: +case 662: +case 663: +case 664: +case 665: +case 666: +case 667: +case 668: +case 669: +case 670: +case 671: +case 672: +case 673: +case 674: +case 675: +case 676: +case 677: +case 678: +case 679: +case 680: +case 681: +case 682: +case 683: +case 684: +case 685: +case 686: +case 687: +case 688: +case 689: +case 690: +case 691: +case 692: +case 693: +case 694: +case 695: +case 696: +case 697: +case 698: +case 699: +case 700: +case 701: +case 702: +case 703: +case 704: +case 705: +case 706: +case 707: +case 708: +case 709: +case 710: +case 711: +case 712: +case 713: +case 714: +case 715: +case 716: +case 717: +case 718: +case 719: +case 720: +case 721: +case 722: +case 723: +case 724: +case 725: +case 726: +case 727: +case 728: +case 729: +case 730: +case 731: +case 732: +case 733: +case 734: +case 735: +case 736: +case 737: +case 738: +case 739: +case 740: +case 741: +case 742: +case 743: +case 744: +case 745: +case 746: +case 747: +case 748: +case 749: +case 750: +case 751: +case 752: +case 753: +case 754: +case 755: +case 756: +case 757: +case 758: +case 759: +case 760: +case 761: +case 762: +case 763: +case 764: +case 765: +case 766: +case 767: +case 768: +case 769: +case 770: +case 771: +case 772: +case 773: +case 774: +case 775: +case 776: +case 777: +case 778: +case 779: +case 780: +case 781: +case 782: +case 783: +case 784: +case 785: +case 786: +case 787: +case 788: +case 789: +case 790: +case 791: +case 792: +case 793: +case 794: +case 795: +case 796: +case 797: +case 798: +case 799: +case 800: +case 801: +case 802: +case 803: +case 804: +case 805: +case 806: +case 807: +case 808: +case 809: +case 810: +case 811: +case 812: +case 813: +case 814: +case 815: +case 816: +case 817: +case 818: +case 819: +case 820: +case 821: +case 822: +case 823: +case 824: +case 825: +case 826: +case 827: +case 828: +case 829: +case 830: +case 831: +case 832: +case 833: +case 834: +case 835: +case 836: +case 837: +case 838: +case 839: +case 840: +case 841: +case 842: +case 843: +case 844: +case 845: +case 846: +case 847: +case 848: +case 849: +case 850: +case 851: +case 852: +case 853: +case 854: +case 855: +case 856: +case 857: +case 858: +case 859: +case 860: +case 861: +case 862: +case 863: +case 864: +case 865: +case 866: +case 867: +case 868: +case 869: +case 870: +case 871: +case 872: +case 873: +case 874: +case 875: +case 876: +case 877: +case 878: +case 879: +case 880: +case 881: +case 882: +case 883: +case 884: +case 885: +case 886: +case 887: +case 888: +case 889: +case 890: +case 891: +case 892: +case 893: +case 894: +case 895: +case 896: +case 897: +case 898: +case 899: +case 900: +case 901: +case 902: +case 903: +case 904: +case 905: +case 906: +case 907: +case 908: +case 909: +case 910: +case 911: +case 912: +case 913: +case 914: +case 915: +case 916: +case 917: +case 918: +case 919: +case 920: +case 921: +case 922: +case 923: +case 924: +case 925: +case 926: +case 927: +case 928: +case 929: +case 930: +case 931: +case 932: +case 933: +case 934: +case 935: +case 936: +case 937: +case 938: +case 939: +case 940: +case 941: +case 942: +case 943: +case 944: +case 945: +case 946: +case 947: +case 948: +case 949: +case 950: +case 951: +case 952: +case 953: +case 954: +case 955: +case 956: +case 957: +case 958: +case 959: +case 960: +case 961: +case 962: +case 963: +case 964: +case 965: +case 966: +case 967: +case 968: +case 969: +case 970: +case 971: +case 972: +case 973: +case 974: +case 975: +case 976: +case 977: +case 978: +case 979: +case 980: +case 981: +case 982: +case 983: +case 984: +case 985: +case 986: +case 987: +case 988: +case 989: +case 990: +case 991: +case 992: +case 993: +case 994: +case 995: +case 996: +case 997: +case 998: +case 999: +case 1000: +case 1001: +case 1002: +case 1003: +case 1004: +case 1005: +case 1006: +case 1007: +case 1008: +case 1009: +case 1010: +case 1011: +case 1012: +case 1013: +case 1014: +case 1015: +case 1016: +case 1017: +case 1018: +case 1019: +case 1020: +case 1021: +case 1022: +case 1023: +case 1024: +case 1025: +case 1026: +case 1027: +case 1028: +case 1029: +case 1030: +case 1031: +case 1032: +case 1033: +case 1034: +case 1035: +case 1036: +case 1037: +case 1038: +case 1039: +case 1040: +case 1041: +case 1042: +case 1043: +case 1044: +case 1045: +case 1046: +case 1047: +case 1048: +case 1049: +case 1050: +case 1051: +case 1052: +case 1053: +case 1054: +case 1055: +case 1056: +case 1057: +case 1058: +case 1059: +case 1060: +case 1061: +case 1062: +case 1063: +case 1064: +case 1065: +case 1066: +case 1067: +case 1068: +case 1069: +case 1070: +case 1071: +case 1072: +case 1073: +case 1074: +case 1075: +case 1076: +case 1077: +case 1078: +case 1079: +case 1080: +case 1081: +case 1082: +case 1083: +case 1084: +case 1085: +case 1086: +case 1087: +case 1088: +case 1089: +case 1090: +case 1091: +case 1092: +case 1093: +case 1094: +case 1095: +case 1096: +case 1097: +case 1098: +case 1099: +case 1100: +case 1101: +case 1102: +case 1103: +case 1104: +case 1105: +case 1106: +case 1107: +case 1108: +case 1109: +case 1110: +case 1111: +case 1112: +case 1113: +case 1114: +case 1115: +case 1116: +case 1117: +case 1118: +case 1119: +case 1120: +case 1121: +case 1122: +case 1123: +case 1124: +case 1125: +case 1126: +case 1127: +case 1128: +case 1129: +case 1130: +case 1131: +case 1132: +case 1133: +case 1134: +case 1135: +case 1136: +case 1137: +case 1138: +case 1139: +case 1140: +case 1141: +case 1142: +case 1143: +case 1144: +case 1145: +case 1146: +case 1147: +case 1148: +case 1149: +case 1150: +case 1151: +case 1152: +case 1153: +case 1154: +case 1155: +case 1156: +case 1157: +case 1158: +case 1159: +case 1160: +case 1161: +case 1162: +case 1163: +case 1164: +case 1165: +case 1166: +case 1167: +case 1168: +case 1169: +case 1170: +case 1171: +case 1172: +case 1173: +case 1174: +case 1175: +case 1176: +case 1177: +case 1178: +case 1179: +case 1180: +case 1181: +case 1182: +case 1183: +case 1184: +case 1185: +case 1186: +case 1187: +case 1188: +case 1189: +case 1190: +case 1191: +case 1192: +case 1193: +case 1194: +case 1195: +case 1196: +case 1197: +case 1198: +case 1199: +case 1200: +case 1201: +case 1202: +case 1203: +case 1204: +case 1205: +case 1206: +case 1207: +case 1208: +case 1209: +case 1210: +case 1211: +case 1212: +case 1213: +case 1214: +case 1215: +case 1216: +case 1217: +case 1218: +case 1219: +case 1220: +case 1221: +case 1222: +case 1223: +case 1224: +case 1225: +case 1226: +case 1227: +case 1228: +case 1229: +case 1230: +case 1231: +case 1232: +case 1233: +case 1234: +case 1235: +case 1236: +case 1237: +case 1238: +case 1239: +case 1240: +case 1241: +case 1242: +case 1243: +case 1244: +case 1245: +case 1246: +case 1247: +case 1248: +case 1249: +case 1250: +case 1251: +case 1252: +case 1253: +case 1254: +case 1255: +case 1256: +case 1257: +case 1258: +case 1259: +case 1260: +case 1261: +case 1262: +case 1263: +case 1264: +case 1265: +case 1266: +case 1267: +case 1268: +case 1269: +case 1270: +case 1271: +case 1272: +case 1273: +case 1274: +case 1275: +case 1276: +case 1277: +case 1278: +case 1279: +case 1280: +case 1281: +case 1282: +case 1283: +case 1284: +case 1285: +case 1286: +case 1287: +case 1288: +case 1289: +case 1290: +case 1291: +case 1292: +case 1293: +case 1294: +case 1295: +case 1296: +case 1297: +case 1298: +case 1299: +case 1300: +case 1301: +case 1302: +case 1303: +case 1304: +case 1305: +case 1306: +case 1307: +case 1308: +case 1309: +case 1310: +case 1311: +case 1312: +case 1313: +case 1314: +case 1315: +case 1316: +case 1317: +case 1318: +case 1319: +case 1320: +case 1321: +case 1322: +case 1323: +case 1324: +case 1325: +case 1326: +case 1327: +case 1328: +case 1329: +case 1330: +case 1331: +case 1332: +case 1333: +case 1334: +case 1335: +case 1336: +case 1337: +case 1338: +case 1339: +case 1340: +case 1341: +case 1342: +case 1343: +case 1344: +case 1345: +case 1346: +case 1347: +case 1348: +case 1349: +case 1350: +case 1351: +case 1352: +case 1353: +case 1354: +case 1355: +case 1356: +case 1357: +case 1358: +case 1359: +case 1360: +case 1361: +case 1362: +case 1363: +case 1364: +case 1365: +case 1366: +case 1367: +case 1368: +case 1369: +case 1370: +case 1371: +case 1372: +case 1373: +case 1374: +case 1375: +case 1376: +case 1377: +case 1378: +case 1379: +case 1380: +case 1381: +case 1382: +case 1383: +case 1384: +case 1385: +case 1386: +case 1387: +case 1388: +case 1389: +case 1390: +case 1391: +case 1392: +case 1393: +case 1394: +case 1395: +case 1396: +case 1397: +case 1398: +case 1399: +case 1400: +case 1401: +case 1402: +case 1403: +case 1404: +case 1405: +case 1406: +case 1407: +case 1408: +case 1409: +case 1410: +case 1411: +case 1412: +case 1413: +case 1414: +case 1415: +case 1416: +case 1417: +case 1418: +case 1419: +case 1420: +case 1421: +case 1422: +case 1423: +case 1424: +case 1425: +case 1426: +case 1427: +case 1428: +case 1429: +case 1430: +case 1431: +case 1432: +case 1433: +case 1434: +case 1435: +case 1436: +case 1437: +case 1438: +case 1439: +case 1440: +case 1441: +case 1442: +case 1443: +case 1444: +case 1445: +case 1446: +case 1447: +case 1448: +case 1449: +case 1450: +case 1451: +case 1452: +case 1453: +case 1454: +case 1455: +case 1456: +case 1457: +case 1458: +case 1459: +case 1460: +case 1461: +case 1462: +case 1463: +case 1464: +case 1465: +case 1466: +case 1467: +case 1468: +case 1469: +case 1470: +case 1471: +case 1472: +case 1473: +case 1474: +case 1475: +case 1476: +case 1477: +case 1478: +case 1479: +case 1480: +case 1481: +case 1482: +case 1483: +case 1484: +case 1485: +case 1486: +case 1487: +case 1488: +case 1489: +case 1490: +case 1491: +case 1492: +case 1493: +case 1494: +case 1495: +case 1496: +case 1497: +case 1498: +case 1499: +case 1500: +case 1501: +case 1502: +case 1503: +case 1504: +case 1505: +case 1506: +case 1507: +case 1508: +case 1509: +case 1510: +case 1511: +case 1512: +case 1513: +case 1514: +case 1515: +case 1516: +case 1517: +case 1518: +case 1519: +case 1520: +case 1521: +case 1522: +case 1523: +case 1524: +case 1525: +case 1526: +case 1527: +case 1528: +case 1529: +case 1530: +case 1531: +case 1532: +case 1533: +case 1534: +case 1535: +case 1536: +case 1537: +case 1538: +case 1539: +case 1540: +case 1541: +case 1542: +case 1543: +case 1544: +case 1545: +case 1546: +case 1547: +case 1548: +case 1549: +case 1550: +case 1551: +case 1552: +case 1553: +case 1554: +case 1555: +case 1556: +case 1557: +case 1558: +case 1559: +case 1560: +case 1561: +case 1562: +case 1563: +case 1564: +case 1565: +case 1566: +case 1567: +case 1568: +case 1569: +case 1570: +case 1571: +case 1572: +case 1573: +case 1574: +case 1575: +case 1576: +case 1577: +case 1578: +case 1579: +case 1580: +case 1581: +case 1582: +case 1583: +case 1584: +case 1585: +case 1586: +case 1587: +case 1588: +case 1589: +case 1590: +case 1591: +case 1592: +case 1593: +case 1594: +case 1595: +case 1596: +case 1597: +case 1598: +case 1599: +case 1600: +case 1601: +case 1602: +case 1603: +case 1604: +case 1605: +case 1606: +case 1607: +case 1608: +case 1609: +case 1610: +case 1611: +case 1612: +case 1613: +case 1614: +case 1615: +case 1616: +case 1617: +case 1618: +case 1619: +case 1620: +case 1621: +case 1622: +case 1623: +case 1624: +case 1625: +case 1626: +case 1627: +case 1628: +case 1629: +case 1630: +case 1631: +case 1632: +case 1633: +case 1634: +case 1635: +case 1636: +case 1637: +case 1638: +case 1639: +case 1640: +case 1641: +case 1642: +case 1643: +case 1644: +case 1645: +case 1646: +case 1647: +case 1648: +case 1649: +case 1650: +case 1651: +case 1652: +case 1653: +case 1654: +case 1655: +case 1656: +case 1657: +case 1658: +case 1659: +case 1660: +case 1661: +case 1662: +case 1663: +case 1664: +case 1665: +case 1666: +case 1667: +case 1668: +case 1669: +case 1670: +case 1671: +case 1672: +case 1673: +case 1674: +case 1675: +case 1676: +case 1677: +case 1678: +case 1679: +case 1680: +case 1681: +case 1682: +case 1683: +case 1684: +case 1685: +case 1686: +case 1687: +case 1688: +case 1689: +case 1690: +case 1691: +case 1692: +case 1693: +case 1694: +case 1695: +case 1696: +case 1697: +case 1698: +case 1699: +case 1700: +case 1701: +case 1702: +case 1703: +case 1704: +case 1705: +case 1706: +case 1707: +case 1708: +case 1709: +case 1710: +case 1711: +case 1712: +case 1713: +case 1714: +case 1715: +case 1716: +case 1717: +case 1718: +case 1719: +case 1720: +case 1721: +case 1722: +case 1723: +case 1724: +case 1725: +case 1726: +case 1727: +case 1728: +case 1729: +case 1730: +case 1731: +case 1732: +case 1733: +case 1734: +case 1735: +case 1736: +case 1737: +case 1738: +case 1739: +case 1740: +case 1741: +case 1742: +case 1743: +case 1744: +case 1745: +case 1746: +case 1747: +case 1748: +case 1749: +case 1750: +case 1751: +case 1752: +case 1753: +case 1754: +case 1755: +case 1756: +case 1757: +case 1758: +case 1759: +case 1760: +case 1761: +case 1762: +case 1763: +case 1764: +case 1765: +case 1766: +case 1767: +case 1768: +case 1769: +case 1770: +case 1771: +case 1772: +case 1773: +case 1774: +case 1775: +case 1776: +case 1777: +case 1778: +case 1779: +case 1780: +case 1781: +case 1782: +case 1783: +case 1784: +case 1785: +case 1786: +case 1787: +case 1788: +case 1789: +case 1790: +case 1791: +case 1792: +case 1793: +case 1794: +case 1795: +case 1796: +case 1797: +case 1798: +case 1799: +case 1800: +case 1801: +case 1802: +case 1803: +case 1804: +case 1805: +case 1806: +case 1807: +case 1808: +case 1809: +case 1810: +case 1811: +case 1812: +case 1813: +case 1814: +case 1815: +case 1816: +case 1817: +case 1818: +case 1819: +case 1820: +case 1821: +case 1822: +case 1823: +case 1824: +case 1825: +case 1826: +case 1827: +case 1828: +case 1829: +case 1830: +case 1831: +case 1832: +case 1833: +case 1834: +case 1835: +case 1836: +case 1837: +case 1838: +case 1839: +case 1840: +case 1841: +case 1842: +case 1843: +case 1844: +case 1845: +case 1846: +case 1847: +case 1848: +case 1849: +case 1850: +case 1851: +case 1852: +case 1853: +case 1854: +case 1855: +case 1856: +case 1857: +case 1858: +case 1859: +case 1860: +case 1861: +case 1862: +case 1863: +case 1864: +case 1865: +case 1866: +case 1867: +case 1868: +case 1869: +case 1870: +case 1871: +case 1872: +case 1873: +case 1874: +case 1875: +case 1876: +case 1877: +case 1878: +case 1879: +case 1880: +case 1881: +case 1882: +case 1883: +case 1884: +case 1885: +case 1886: +case 1887: +case 1888: +case 1889: +case 1890: +case 1891: +case 1892: +case 1893: +case 1894: +case 1895: +case 1896: +case 1897: +case 1898: +case 1899: +case 1900: +case 1901: +case 1902: +case 1903: +case 1904: +case 1905: +case 1906: +case 1907: +case 1908: +case 1909: +case 1910: +case 1911: +case 1912: +case 1913: +case 1914: +case 1915: +case 1916: +case 1917: +case 1918: +case 1919: +case 1920: +case 1921: +case 1922: +case 1923: +case 1924: +case 1925: +case 1926: +case 1927: +case 1928: +case 1929: +case 1930: +case 1931: +case 1932: +case 1933: +case 1934: +case 1935: +case 1936: +case 1937: +case 1938: +case 1939: +case 1940: +case 1941: +case 1942: +case 1943: +case 1944: +case 1945: +case 1946: +case 1947: +case 1948: +case 1949: +case 1950: +case 1951: +case 1952: +case 1953: +case 1954: +case 1955: +case 1956: +case 1957: +case 1958: +case 1959: +case 1960: +case 1961: +case 1962: +case 1963: +case 1964: +case 1965: +case 1966: +case 1967: +case 1968: +case 1969: +case 1970: +case 1971: +case 1972: +case 1973: +case 1974: +case 1975: +case 1976: +case 1977: +case 1978: +case 1979: +case 1980: +case 1981: +case 1982: +case 1983: +case 1984: +case 1985: +case 1986: +case 1987: +case 1988: +case 1989: +case 1990: +case 1991: +case 1992: +case 1993: +case 1994: +case 1995: +case 1996: +case 1997: +case 1998: +case 1999: +case 2000: +case 2001: +case 2002: +case 2003: +case 2004: +case 2005: +case 2006: +case 2007: +case 2008: +case 2009: +case 2010: +case 2011: +case 2012: +case 2013: +case 2014: +case 2015: +case 2016: +case 2017: +case 2018: +case 2019: +case 2020: +case 2021: +case 2022: +case 2023: +case 2024: +case 2025: +case 2026: +case 2027: +case 2028: +case 2029: +case 2030: +case 2031: +case 2032: +case 2033: +case 2034: +case 2035: +case 2036: +case 2037: +case 2038: +case 2039: +case 2040: +case 2041: +case 2042: +case 2043: +case 2044: +case 2045: +case 2046: +case 2047: +case 2048: +case 2049: +case 2050: +case 2051: +case 2052: +case 2053: +case 2054: +case 2055: +case 2056: +case 2057: +case 2058: +case 2059: +case 2060: +case 2061: +case 2062: +case 2063: +case 2064: +case 2065: +case 2066: +case 2067: +case 2068: +case 2069: +case 2070: +case 2071: +case 2072: +case 2073: +case 2074: +case 2075: +case 2076: +case 2077: +case 2078: +case 2079: +case 2080: +case 2081: +case 2082: +case 2083: +case 2084: +case 2085: +case 2086: +case 2087: +case 2088: +case 2089: +case 2090: +case 2091: +case 2092: +case 2093: +case 2094: +case 2095: +case 2096: +case 2097: +case 2098: +case 2099: +case 2100: +case 2101: +case 2102: +case 2103: +case 2104: +case 2105: +case 2106: +case 2107: +case 2108: +case 2109: +case 2110: +case 2111: +case 2112: +case 2113: +case 2114: +case 2115: +case 2116: +case 2117: +case 2118: +case 2119: +case 2120: +case 2121: +case 2122: +case 2123: +case 2124: +case 2125: +case 2126: +case 2127: +case 2128: +case 2129: +case 2130: +case 2131: +case 2132: +case 2133: +case 2134: +case 2135: +case 2136: +case 2137: +case 2138: +case 2139: +case 2140: +case 2141: +case 2142: +case 2143: +case 2144: +case 2145: +case 2146: +case 2147: +case 2148: +case 2149: +case 2150: +case 2151: +case 2152: +case 2153: +case 2154: +case 2155: +case 2156: +case 2157: +case 2158: +case 2159: +case 2160: +case 2161: +case 2162: +case 2163: +case 2164: +case 2165: +case 2166: +case 2167: +case 2168: +case 2169: +case 2170: +case 2171: +case 2172: +case 2173: +case 2174: +case 2175: +case 2176: +case 2177: +case 2178: +case 2179: +case 2180: +case 2181: +case 2182: +case 2183: +case 2184: +case 2185: +case 2186: +case 2187: +case 2188: +case 2189: +case 2190: +case 2191: +case 2192: +case 2193: +case 2194: +case 2195: +case 2196: +case 2197: +case 2198: +case 2199: +case 2200: +case 2201: +case 2202: +case 2203: +case 2204: +case 2205: +case 2206: +case 2207: +case 2208: +case 2209: +case 2210: +case 2211: +case 2212: +case 2213: +case 2214: +case 2215: +case 2216: +case 2217: +case 2218: +case 2219: +case 2220: +case 2221: +case 2222: +case 2223: +case 2224: +case 2225: +case 2226: +case 2227: +case 2228: +case 2229: +case 2230: +case 2231: +case 2232: +case 2233: +case 2234: +case 2235: +case 2236: +case 2237: +case 2238: +case 2239: +case 2240: +case 2241: +case 2242: +case 2243: +case 2244: +case 2245: +case 2246: +case 2247: +case 2248: +case 2249: +case 2250: +case 2251: +case 2252: +case 2253: +case 2254: +case 2255: +case 2256: +case 2257: +case 2258: +case 2259: +case 2260: +case 2261: +case 2262: +case 2263: +case 2264: +case 2265: +case 2266: +case 2267: +case 2268: +case 2269: +case 2270: +case 2271: +case 2272: +case 2273: +case 2274: +case 2275: +case 2276: +case 2277: +case 2278: +case 2279: +case 2280: +case 2281: +case 2282: +case 2283: +case 2284: +case 2285: +case 2286: +case 2287: +case 2288: +case 2289: +case 2290: +case 2291: +case 2292: +case 2293: +case 2294: +case 2295: +case 2296: +case 2297: +case 2298: +case 2299: +case 2300: +case 2301: +case 2302: +case 2303: +case 2304: +case 2305: +case 2306: +case 2307: +case 2308: +case 2309: +case 2310: +case 2311: +case 2312: +case 2313: +case 2314: +case 2315: +case 2316: +case 2317: +case 2318: +case 2319: +case 2320: +case 2321: +case 2322: +case 2323: +case 2324: +case 2325: +case 2326: +case 2327: +case 2328: +case 2329: +case 2330: +case 2331: +case 2332: +case 2333: +case 2334: +case 2335: +case 2336: +case 2337: +case 2338: +case 2339: +case 2340: +case 2341: +case 2342: +case 2343: +case 2344: +case 2345: +case 2346: +case 2347: +case 2348: +case 2349: +case 2350: +case 2351: +case 2352: +case 2353: +case 2354: +case 2355: +case 2356: +case 2357: +case 2358: +case 2359: +case 2360: +case 2361: +case 2362: +case 2363: +case 2364: +case 2365: +case 2366: +case 2367: +case 2368: +case 2369: +case 2370: +case 2371: +case 2372: +case 2373: +case 2374: +case 2375: +case 2376: +case 2377: +case 2378: +case 2379: +case 2380: +case 2381: +case 2382: +case 2383: +case 2384: +case 2385: +case 2386: +case 2387: +case 2388: +case 2389: +case 2390: +case 2391: +case 2392: +case 2393: +case 2394: +case 2395: +case 2396: +case 2397: +case 2398: +case 2399: +case 2400: +case 2401: +case 2402: +case 2403: +case 2404: +case 2405: +case 2406: +case 2407: +case 2408: +case 2409: +case 2410: +case 2411: +case 2412: +case 2413: +case 2414: +case 2415: +case 2416: +case 2417: +case 2418: +case 2419: +case 2420: +case 2421: +case 2422: +case 2423: +case 2424: +case 2425: +case 2426: +case 2427: +case 2428: +case 2429: +case 2430: +case 2431: +case 2432: +case 2433: +case 2434: +case 2435: +case 2436: +case 2437: +case 2438: +case 2439: +case 2440: +case 2441: +case 2442: +case 2443: +case 2444: +case 2445: +case 2446: +case 2447: +case 2448: +case 2449: +case 2450: +case 2451: +case 2452: +case 2453: +case 2454: +case 2455: +case 2456: +case 2457: +case 2458: +case 2459: +case 2460: +case 2461: +case 2462: +case 2463: +case 2464: +case 2465: +case 2466: +case 2467: +case 2468: +case 2469: +case 2470: +case 2471: +case 2472: +case 2473: +case 2474: +case 2475: +case 2476: +case 2477: +case 2478: +case 2479: +case 2480: +case 2481: +case 2482: +case 2483: +case 2484: +case 2485: +case 2486: +case 2487: +case 2488: +case 2489: +case 2490: +case 2491: +case 2492: +case 2493: +case 2494: +case 2495: +case 2496: +case 2497: +case 2498: +case 2499: +case 2500: +case 2501: +case 2502: +case 2503: +case 2504: +case 2505: +case 2506: +case 2507: +case 2508: +case 2509: +case 2510: +case 2511: +case 2512: +case 2513: +case 2514: +case 2515: +case 2516: +case 2517: +case 2518: +case 2519: +case 2520: +case 2521: +case 2522: +case 2523: +case 2524: +case 2525: +case 2526: +case 2527: +case 2528: +case 2529: +case 2530: +case 2531: +case 2532: +case 2533: +case 2534: +case 2535: +case 2536: +case 2537: +case 2538: +case 2539: +case 2540: +case 2541: +case 2542: +case 2543: +case 2544: +case 2545: +case 2546: +case 2547: +case 2548: +case 2549: +case 2550: +case 2551: +case 2552: +case 2553: +case 2554: +case 2555: +case 2556: +case 2557: +case 2558: +case 2559: +case 2560: +case 2561: +case 2562: +case 2563: +case 2564: +case 2565: +case 2566: +case 2567: +case 2568: +case 2569: +case 2570: +case 2571: +case 2572: +case 2573: +case 2574: +case 2575: +case 2576: +case 2577: +case 2578: +case 2579: +case 2580: +case 2581: +case 2582: +case 2583: +case 2584: +case 2585: +case 2586: +case 2587: +case 2588: +case 2589: +case 2590: +case 2591: +case 2592: +case 2593: +case 2594: +case 2595: +case 2596: +case 2597: +case 2598: +case 2599: +case 2600: +case 2601: +case 2602: +case 2603: +case 2604: +case 2605: +case 2606: +case 2607: +case 2608: +case 2609: +case 2610: +case 2611: +case 2612: +case 2613: +case 2614: +case 2615: +case 2616: +case 2617: +case 2618: +case 2619: +case 2620: +case 2621: +case 2622: +case 2623: +case 2624: +case 2625: +case 2626: +case 2627: +case 2628: +case 2629: +case 2630: +case 2631: +case 2632: +case 2633: +case 2634: +case 2635: +case 2636: +case 2637: +case 2638: +case 2639: +case 2640: +case 2641: +case 2642: +case 2643: +case 2644: +case 2645: +case 2646: +case 2647: +case 2648: +case 2649: +case 2650: +case 2651: +case 2652: +case 2653: +case 2654: +case 2655: +case 2656: +case 2657: +case 2658: +case 2659: +case 2660: +case 2661: +case 2662: +case 2663: +case 2664: +case 2665: +case 2666: +case 2667: +case 2668: +case 2669: +case 2670: +case 2671: +case 2672: +case 2673: +case 2674: +case 2675: +case 2676: +case 2677: +case 2678: +case 2679: +case 2680: +case 2681: +case 2682: +case 2683: +case 2684: +case 2685: +case 2686: +case 2687: +case 2688: +case 2689: +case 2690: +case 2691: +case 2692: +case 2693: +case 2694: +case 2695: +case 2696: +case 2697: +case 2698: +case 2699: +case 2700: +case 2701: +case 2702: +case 2703: +case 2704: +case 2705: +case 2706: +case 2707: +case 2708: +case 2709: +case 2710: +case 2711: +case 2712: +case 2713: +case 2714: +case 2715: +case 2716: +case 2717: +case 2718: +case 2719: +case 2720: +case 2721: +case 2722: +case 2723: +case 2724: +case 2725: +case 2726: +case 2727: +case 2728: +case 2729: +case 2730: +case 2731: +case 2732: +case 2733: +case 2734: +case 2735: +case 2736: +case 2737: +case 2738: +case 2739: +case 2740: +case 2741: +case 2742: +case 2743: +case 2744: +case 2745: +case 2746: +case 2747: +case 2748: +case 2749: +case 2750: +case 2751: +case 2752: +case 2753: +case 2754: +case 2755: +case 2756: +case 2757: +case 2758: +case 2759: +case 2760: +case 2761: +case 2762: +case 2763: +case 2764: +case 2765: +case 2766: +case 2767: +case 2768: +case 2769: +case 2770: +case 2771: +case 2772: +case 2773: +case 2774: +case 2775: +case 2776: +case 2777: +case 2778: +case 2779: +case 2780: +case 2781: +case 2782: +case 2783: +case 2784: +case 2785: +case 2786: +case 2787: +case 2788: +case 2789: +case 2790: +case 2791: +case 2792: +case 2793: +case 2794: +case 2795: +case 2796: +case 2797: +case 2798: +case 2799: +case 2800: +case 2801: +case 2802: +case 2803: +case 2804: +case 2805: +case 2806: +case 2807: +case 2808: +case 2809: +case 2810: +case 2811: +case 2812: +case 2813: +case 2814: +case 2815: +case 2816: +case 2817: +case 2818: +case 2819: +case 2820: +case 2821: +case 2822: +case 2823: +case 2824: +case 2825: +case 2826: +case 2827: +case 2828: +case 2829: +case 2830: +case 2831: +case 2832: +case 2833: +case 2834: +case 2835: +case 2836: +case 2837: +case 2838: +case 2839: +case 2840: +case 2841: +case 2842: +case 2843: +case 2844: +case 2845: +case 2846: +case 2847: +case 2848: +case 2849: +case 2850: +case 2851: +case 2852: +case 2853: +case 2854: +case 2855: +case 2856: +case 2857: +case 2858: +case 2859: +case 2860: +case 2861: +case 2862: +case 2863: +case 2864: +case 2865: +case 2866: +case 2867: +case 2868: +case 2869: +case 2870: +case 2871: +case 2872: +case 2873: +case 2874: +case 2875: +case 2876: +case 2877: +case 2878: +case 2879: +case 2880: +case 2881: +case 2882: +case 2883: +case 2884: +case 2885: +case 2886: +case 2887: +case 2888: +case 2889: +case 2890: +case 2891: +case 2892: +case 2893: +case 2894: +case 2895: +case 2896: +case 2897: +case 2898: +case 2899: +case 2900: +case 2901: +case 2902: +case 2903: +case 2904: +case 2905: +case 2906: +case 2907: +case 2908: +case 2909: +case 2910: +case 2911: +case 2912: +case 2913: +case 2914: +case 2915: +case 2916: +case 2917: +case 2918: +case 2919: +case 2920: +case 2921: +case 2922: +case 2923: +case 2924: +case 2925: +case 2926: +case 2927: +case 2928: +case 2929: +case 2930: +case 2931: +case 2932: +case 2933: +case 2934: +case 2935: +case 2936: +case 2937: +case 2938: +case 2939: +case 2940: +case 2941: +case 2942: +case 2943: +case 2944: +case 2945: +case 2946: +case 2947: +case 2948: +case 2949: +case 2950: +case 2951: +case 2952: +case 2953: +case 2954: +case 2955: +case 2956: +case 2957: +case 2958: +case 2959: +case 2960: +case 2961: +case 2962: +case 2963: +case 2964: +case 2965: +case 2966: +case 2967: +case 2968: +case 2969: +case 2970: +case 2971: +case 2972: +case 2973: +case 2974: +case 2975: +case 2976: +case 2977: +case 2978: +case 2979: +case 2980: +case 2981: +case 2982: +case 2983: +case 2984: +case 2985: +case 2986: +case 2987: +case 2988: +case 2989: +case 2990: +case 2991: +case 2992: +case 2993: +case 2994: +case 2995: +case 2996: +case 2997: +case 2998: +case 2999: +case 3000: +case 3001: +case 3002: +case 3003: +case 3004: +case 3005: +case 3006: +case 3007: +case 3008: +case 3009: +case 3010: +case 3011: +case 3012: +case 3013: +case 3014: +case 3015: +case 3016: +case 3017: +case 3018: +case 3019: +case 3020: +case 3021: +case 3022: +case 3023: +case 3024: +case 3025: +case 3026: +case 3027: +case 3028: +case 3029: +case 3030: +case 3031: +case 3032: +case 3033: +case 3034: +case 3035: +case 3036: +case 3037: +case 3038: +case 3039: +case 3040: +case 3041: +case 3042: +case 3043: +case 3044: +case 3045: +case 3046: +case 3047: +case 3048: +case 3049: +case 3050: +case 3051: +case 3052: +case 3053: +case 3054: +case 3055: +case 3056: +case 3057: +case 3058: +case 3059: +case 3060: +case 3061: +case 3062: +case 3063: +case 3064: +case 3065: +case 3066: +case 3067: +case 3068: +case 3069: +case 3070: +case 3071: +case 3072: +case 3073: +case 3074: +case 3075: +case 3076: +case 3077: +case 3078: +case 3079: +case 3080: +case 3081: +case 3082: +case 3083: +case 3084: +case 3085: +case 3086: +case 3087: +case 3088: +case 3089: +case 3090: +case 3091: +case 3092: +case 3093: +case 3094: +case 3095: +case 3096: +case 3097: +case 3098: +case 3099: +case 3100: +case 3101: +case 3102: +case 3103: +case 3104: +case 3105: +case 3106: +case 3107: +case 3108: +case 3109: +case 3110: +case 3111: +case 3112: +case 3113: +case 3114: +case 3115: +case 3116: +case 3117: +case 3118: +case 3119: +case 3120: +case 3121: +case 3122: +case 3123: +case 3124: +case 3125: +case 3126: +case 3127: +case 3128: +case 3129: +case 3130: +case 3131: +case 3132: +case 3133: +case 3134: +case 3135: +case 3136: +case 3137: +case 3138: +case 3139: +case 3140: +case 3141: +case 3142: +case 3143: +case 3144: +case 3145: +case 3146: +case 3147: +case 3148: +case 3149: +case 3150: +case 3151: +case 3152: +case 3153: +case 3154: +case 3155: +case 3156: +case 3157: +case 3158: +case 3159: +case 3160: +case 3161: +case 3162: +case 3163: +case 3164: +case 3165: +case 3166: +case 3167: +case 3168: +case 3169: +case 3170: +case 3171: +case 3172: +case 3173: +case 3174: +case 3175: +case 3176: +case 3177: +case 3178: +case 3179: +case 3180: +case 3181: +case 3182: +case 3183: +case 3184: +case 3185: +case 3186: +case 3187: +case 3188: +case 3189: +case 3190: +case 3191: +case 3192: +case 3193: +case 3194: +case 3195: +case 3196: +case 3197: +case 3198: +case 3199: +case 3200: +case 3201: +case 3202: +case 3203: +case 3204: +case 3205: +case 3206: +case 3207: +case 3208: +case 3209: +case 3210: +case 3211: +case 3212: +case 3213: +case 3214: +case 3215: +case 3216: +case 3217: +case 3218: +case 3219: +case 3220: +case 3221: +case 3222: +case 3223: +case 3224: +case 3225: +case 3226: +case 3227: +case 3228: +case 3229: +case 3230: +case 3231: +case 3232: +case 3233: +case 3234: +case 3235: +case 3236: +case 3237: +case 3238: +case 3239: +case 3240: +case 3241: +case 3242: +case 3243: +case 3244: +case 3245: +case 3246: +case 3247: +case 3248: +case 3249: +case 3250: +case 3251: +case 3252: +case 3253: +case 3254: +case 3255: +case 3256: +case 3257: +case 3258: +case 3259: +case 3260: +case 3261: +case 3262: +case 3263: +case 3264: +case 3265: +case 3266: +case 3267: +case 3268: +case 3269: +case 3270: +case 3271: +case 3272: +case 3273: +case 3274: +case 3275: +case 3276: +case 3277: +case 3278: +case 3279: +case 3280: +case 3281: +case 3282: +case 3283: +case 3284: +case 3285: +case 3286: +case 3287: +case 3288: +case 3289: +case 3290: +case 3291: +case 3292: +case 3293: +case 3294: +case 3295: +case 3296: +case 3297: +case 3298: +case 3299: +case 3300: +case 3301: +case 3302: +case 3303: +case 3304: +case 3305: +case 3306: +case 3307: +case 3308: +case 3309: +case 3310: +case 3311: +case 3312: +case 3313: +case 3314: +case 3315: +case 3316: +case 3317: +case 3318: +case 3319: +case 3320: +case 3321: +case 3322: +case 3323: +case 3324: +case 3325: +case 3326: +case 3327: +case 3328: +case 3329: +case 3330: +case 3331: +case 3332: +case 3333: +case 3334: +case 3335: +case 3336: +case 3337: +case 3338: +case 3339: +case 3340: +case 3341: +case 3342: +case 3343: +case 3344: +case 3345: +case 3346: +case 3347: +case 3348: +case 3349: +case 3350: +case 3351: +case 3352: +case 3353: +case 3354: +case 3355: +case 3356: +case 3357: +case 3358: +case 3359: +case 3360: +case 3361: +case 3362: +case 3363: +case 3364: +case 3365: +case 3366: +case 3367: +case 3368: +case 3369: +case 3370: +case 3371: +case 3372: +case 3373: +case 3374: +case 3375: +case 3376: +case 3377: +case 3378: +case 3379: +case 3380: +case 3381: +case 3382: +case 3383: +case 3384: +case 3385: +case 3386: +case 3387: +case 3388: +case 3389: +case 3390: +case 3391: +case 3392: +case 3393: +case 3394: +case 3395: +case 3396: +case 3397: +case 3398: +case 3399: +case 3400: +case 3401: +case 3402: +case 3403: +case 3404: +case 3405: +case 3406: +case 3407: +case 3408: +case 3409: +case 3410: +case 3411: +case 3412: +case 3413: +case 3414: +case 3415: +case 3416: +case 3417: +case 3418: +case 3419: +case 3420: +case 3421: +case 3422: +case 3423: +case 3424: +case 3425: +case 3426: +case 3427: +case 3428: +case 3429: +case 3430: +case 3431: +case 3432: +case 3433: +case 3434: +case 3435: +case 3436: +case 3437: +case 3438: +case 3439: +case 3440: +case 3441: +case 3442: +case 3443: +case 3444: +case 3445: +case 3446: +case 3447: +case 3448: +case 3449: +case 3450: +case 3451: +case 3452: +case 3453: +case 3454: +case 3455: +case 3456: +case 3457: +case 3458: +case 3459: +case 3460: +case 3461: +case 3462: +case 3463: +case 3464: +case 3465: +case 3466: +case 3467: +case 3468: +case 3469: +case 3470: +case 3471: +case 3472: +case 3473: +case 3474: +case 3475: +case 3476: +case 3477: +case 3478: +case 3479: +case 3480: +case 3481: +case 3482: +case 3483: +case 3484: +case 3485: +case 3486: +case 3487: +case 3488: +case 3489: +case 3490: +case 3491: +case 3492: +case 3493: +case 3494: +case 3495: +case 3496: +case 3497: +case 3498: +case 3499: +case 3500: +case 3501: +case 3502: +case 3503: +case 3504: +case 3505: +case 3506: +case 3507: +case 3508: +case 3509: +case 3510: +case 3511: +case 3512: +case 3513: +case 3514: +case 3515: +case 3516: +case 3517: +case 3518: +case 3519: +case 3520: +case 3521: +case 3522: +case 3523: +case 3524: +case 3525: +case 3526: +case 3527: +case 3528: +case 3529: +case 3530: +case 3531: +case 3532: +case 3533: +case 3534: +case 3535: +case 3536: +case 3537: +case 3538: +case 3539: +case 3540: +case 3541: +case 3542: +case 3543: +case 3544: +case 3545: +case 3546: +case 3547: +case 3548: +case 3549: +case 3550: +case 3551: +case 3552: +case 3553: +case 3554: +case 3555: +case 3556: +case 3557: +case 3558: +case 3559: +case 3560: +case 3561: +case 3562: +case 3563: +case 3564: +case 3565: +case 3566: +case 3567: +case 3568: +case 3569: +case 3570: +case 3571: +case 3572: +case 3573: +case 3574: +case 3575: +case 3576: +case 3577: +case 3578: +case 3579: +case 3580: +case 3581: +case 3582: +case 3583: +case 3584: +case 3585: +case 3586: +case 3587: +case 3588: +case 3589: +case 3590: +case 3591: +case 3592: +case 3593: +case 3594: +case 3595: +case 3596: +case 3597: +case 3598: +case 3599: +case 3600: +case 3601: +case 3602: +case 3603: +case 3604: +case 3605: +case 3606: +case 3607: +case 3608: +case 3609: +case 3610: +case 3611: +case 3612: +case 3613: +case 3614: +case 3615: +case 3616: +case 3617: +case 3618: +case 3619: +case 3620: +case 3621: +case 3622: +case 3623: +case 3624: +case 3625: +case 3626: +case 3627: +case 3628: +case 3629: +case 3630: +case 3631: +case 3632: +case 3633: +case 3634: +case 3635: +case 3636: +case 3637: +case 3638: +case 3639: +case 3640: +case 3641: +case 3642: +case 3643: +case 3644: +case 3645: +case 3646: +case 3647: +case 3648: +case 3649: +case 3650: +case 3651: +case 3652: +case 3653: +case 3654: +case 3655: +case 3656: +case 3657: +case 3658: +case 3659: +case 3660: +case 3661: +case 3662: +case 3663: +case 3664: +case 3665: +case 3666: +case 3667: +case 3668: +case 3669: +case 3670: +case 3671: +case 3672: +case 3673: +case 3674: +case 3675: +case 3676: +case 3677: +case 3678: +case 3679: +case 3680: +case 3681: +case 3682: +case 3683: +case 3684: +case 3685: +case 3686: +case 3687: +case 3688: +case 3689: +case 3690: +case 3691: +case 3692: +case 3693: +case 3694: +case 3695: +case 3696: +case 3697: +case 3698: +case 3699: +case 3700: +case 3701: +case 3702: +case 3703: +case 3704: +case 3705: +case 3706: +case 3707: +case 3708: +case 3709: +case 3710: +case 3711: +case 3712: +case 3713: +case 3714: +case 3715: +case 3716: +case 3717: +case 3718: +case 3719: +case 3720: +case 3721: +case 3722: +case 3723: +case 3724: +case 3725: +case 3726: +case 3727: +case 3728: +case 3729: +case 3730: +case 3731: +case 3732: +case 3733: +case 3734: +case 3735: +case 3736: +case 3737: +case 3738: +case 3739: +case 3740: +case 3741: +case 3742: +case 3743: +case 3744: +case 3745: +case 3746: +case 3747: +case 3748: +case 3749: +case 3750: +case 3751: +case 3752: +case 3753: +case 3754: +case 3755: +case 3756: +case 3757: +case 3758: +case 3759: +case 3760: +case 3761: +case 3762: +case 3763: +case 3764: +case 3765: +case 3766: +case 3767: +case 3768: +case 3769: +case 3770: +case 3771: +case 3772: +case 3773: +case 3774: +case 3775: +case 3776: +case 3777: +case 3778: +case 3779: +case 3780: +case 3781: +case 3782: +case 3783: +case 3784: +case 3785: +case 3786: +case 3787: +case 3788: +case 3789: +case 3790: +case 3791: +case 3792: +case 3793: +case 3794: +case 3795: +case 3796: +case 3797: +case 3798: +case 3799: +case 3800: +case 3801: +case 3802: +case 3803: +case 3804: +case 3805: +case 3806: +case 3807: +case 3808: +case 3809: +case 3810: +case 3811: +case 3812: +case 3813: +case 3814: +case 3815: +case 3816: +case 3817: +case 3818: +case 3819: +case 3820: +case 3821: +case 3822: +case 3823: +case 3824: +case 3825: +case 3826: +case 3827: +case 3828: +case 3829: +case 3830: +case 3831: +case 3832: +case 3833: +case 3834: +case 3835: +case 3836: +case 3837: +case 3838: +case 3839: +case 3840: +case 3841: +case 3842: +case 3843: +case 3844: +case 3845: +case 3846: +case 3847: +case 3848: +case 3849: +case 3850: +case 3851: +case 3852: +case 3853: +case 3854: +case 3855: +case 3856: +case 3857: +case 3858: +case 3859: +case 3860: +case 3861: +case 3862: +case 3863: +case 3864: +case 3865: +case 3866: +case 3867: +case 3868: +case 3869: +case 3870: +case 3871: +case 3872: +case 3873: +case 3874: +case 3875: +case 3876: +case 3877: +case 3878: +case 3879: +case 3880: +case 3881: +case 3882: +case 3883: +case 3884: +case 3885: +case 3886: +case 3887: +case 3888: +case 3889: +case 3890: +case 3891: +case 3892: +case 3893: +case 3894: +case 3895: +case 3896: +case 3897: +case 3898: +case 3899: +case 3900: +case 3901: +case 3902: +case 3903: +case 3904: +case 3905: +case 3906: +case 3907: +case 3908: +case 3909: +case 3910: +case 3911: +case 3912: +case 3913: +case 3914: +case 3915: +case 3916: +case 3917: +case 3918: +case 3919: +case 3920: +case 3921: +case 3922: +case 3923: +case 3924: +case 3925: +case 3926: +case 3927: +case 3928: +case 3929: +case 3930: +case 3931: +case 3932: +case 3933: +case 3934: +case 3935: +case 3936: +case 3937: +case 3938: +case 3939: +case 3940: +case 3941: +case 3942: +case 3943: +case 3944: +case 3945: +case 3946: +case 3947: +case 3948: +case 3949: +case 3950: +case 3951: +case 3952: +case 3953: +case 3954: +case 3955: +case 3956: +case 3957: +case 3958: +case 3959: +case 3960: +case 3961: +case 3962: +case 3963: +case 3964: +case 3965: +case 3966: +case 3967: +case 3968: +case 3969: +case 3970: +case 3971: +case 3972: +case 3973: +case 3974: +case 3975: +case 3976: +case 3977: +case 3978: +case 3979: +case 3980: +case 3981: +case 3982: +case 3983: +case 3984: +case 3985: +case 3986: +case 3987: +case 3988: +case 3989: +case 3990: +case 3991: +case 3992: +case 3993: +case 3994: +case 3995: +case 3996: +case 3997: +case 3998: +case 3999: +case 4000: +case 4001: +case 4002: +case 4003: +case 4004: +case 4005: +case 4006: +case 4007: +case 4008: +case 4009: +case 4010: +case 4011: +case 4012: +case 4013: +case 4014: +case 4015: +case 4016: +case 4017: +case 4018: +case 4019: +case 4020: +case 4021: +case 4022: +case 4023: +case 4024: +case 4025: +case 4026: +case 4027: +case 4028: +case 4029: +case 4030: +case 4031: +case 4032: +case 4033: +case 4034: +case 4035: +case 4036: +case 4037: +case 4038: +case 4039: +case 4040: +case 4041: +case 4042: +case 4043: +case 4044: +case 4045: +case 4046: +case 4047: +case 4048: +case 4049: +case 4050: +case 4051: +case 4052: +case 4053: +case 4054: +case 4055: +case 4056: +case 4057: +case 4058: +case 4059: +case 4060: +case 4061: +case 4062: +case 4063: +case 4064: +case 4065: +case 4066: +case 4067: +case 4068: +case 4069: +case 4070: +case 4071: +case 4072: +case 4073: +case 4074: +case 4075: +case 4076: +case 4077: +case 4078: +case 4079: +case 4080: +case 4081: +case 4082: +case 4083: +case 4084: +case 4085: +case 4086: +case 4087: +case 4088: +case 4089: +case 4090: +case 4091: +case 4092: +case 4093: +case 4094: +case 4095: +case 4096: +case 4097: +case 4098: +case 4099: +case 4100: +case 4101: +case 4102: +case 4103: +case 4104: +case 4105: +case 4106: +case 4107: +case 4108: +case 4109: +case 4110: +case 4111: +case 4112: +case 4113: +case 4114: +case 4115: +case 4116: +case 4117: +case 4118: +case 4119: +case 4120: +case 4121: +case 4122: +case 4123: +case 4124: +case 4125: +case 4126: +case 4127: +case 4128: +case 4129: +case 4130: +case 4131: +case 4132: +case 4133: +case 4134: +case 4135: +case 4136: +case 4137: +case 4138: +case 4139: +case 4140: +case 4141: +case 4142: +case 4143: +case 4144: +case 4145: +case 4146: +case 4147: +case 4148: +case 4149: +case 4150: +case 4151: +case 4152: +case 4153: +case 4154: +case 4155: +case 4156: +case 4157: +case 4158: +case 4159: +case 4160: +case 4161: +case 4162: +case 4163: +case 4164: +case 4165: +case 4166: +case 4167: +case 4168: +case 4169: +case 4170: +case 4171: +case 4172: +case 4173: +case 4174: +case 4175: +case 4176: +case 4177: +case 4178: +case 4179: +case 4180: +case 4181: +case 4182: +case 4183: +case 4184: +case 4185: +case 4186: +case 4187: +case 4188: +case 4189: +case 4190: +case 4191: +case 4192: +case 4193: +case 4194: +case 4195: +case 4196: +case 4197: +case 4198: +case 4199: +case 4200: +case 4201: +case 4202: +case 4203: +case 4204: +case 4205: +case 4206: +case 4207: +case 4208: +case 4209: +case 4210: +case 4211: +case 4212: +case 4213: +case 4214: +case 4215: +case 4216: +case 4217: +case 4218: +case 4219: +case 4220: +case 4221: +case 4222: +case 4223: +case 4224: +case 4225: +case 4226: +case 4227: +case 4228: +case 4229: +case 4230: +case 4231: +case 4232: +case 4233: +case 4234: +case 4235: +case 4236: +case 4237: +case 4238: +case 4239: +case 4240: +case 4241: +case 4242: +case 4243: +case 4244: +case 4245: +case 4246: +case 4247: +case 4248: +case 4249: +case 4250: +case 4251: +case 4252: +case 4253: +case 4254: +case 4255: +case 4256: +case 4257: +case 4258: +case 4259: +case 4260: +case 4261: +case 4262: +case 4263: +case 4264: +case 4265: +case 4266: +case 4267: +case 4268: +case 4269: +case 4270: +case 4271: +case 4272: +case 4273: +case 4274: +case 4275: +case 4276: +case 4277: +case 4278: +case 4279: +case 4280: +case 4281: +case 4282: +case 4283: +case 4284: +case 4285: +case 4286: +case 4287: +case 4288: +case 4289: +case 4290: +case 4291: +case 4292: +case 4293: +case 4294: +case 4295: +case 4296: +case 4297: +case 4298: +case 4299: +case 4300: +case 4301: +case 4302: +case 4303: +case 4304: +case 4305: +case 4306: +case 4307: +case 4308: +case 4309: +case 4310: +case 4311: +case 4312: +case 4313: +case 4314: +case 4315: +case 4316: +case 4317: +case 4318: +case 4319: +case 4320: +case 4321: +case 4322: +case 4323: +case 4324: +case 4325: +case 4326: +case 4327: +case 4328: +case 4329: +case 4330: +case 4331: +case 4332: +case 4333: +case 4334: +case 4335: +case 4336: +case 4337: +case 4338: +case 4339: +case 4340: +case 4341: +case 4342: +case 4343: +case 4344: +case 4345: +case 4346: +case 4347: +case 4348: +case 4349: +case 4350: +case 4351: +case 4352: +case 4353: +case 4354: +case 4355: +case 4356: +case 4357: +case 4358: +case 4359: +case 4360: +case 4361: +case 4362: +case 4363: +case 4364: +case 4365: +case 4366: +case 4367: +case 4368: +case 4369: +case 4370: +case 4371: +case 4372: +case 4373: +case 4374: +case 4375: +case 4376: +case 4377: +case 4378: +case 4379: +case 4380: +case 4381: +case 4382: +case 4383: +case 4384: +case 4385: +case 4386: +case 4387: +case 4388: +case 4389: +case 4390: +case 4391: +case 4392: +case 4393: +case 4394: +case 4395: +case 4396: +case 4397: +case 4398: +case 4399: +case 4400: +case 4401: +case 4402: +case 4403: +case 4404: +case 4405: +case 4406: +case 4407: +case 4408: +case 4409: +case 4410: +case 4411: +case 4412: +case 4413: +case 4414: +case 4415: +case 4416: +case 4417: +case 4418: +case 4419: +case 4420: +case 4421: +case 4422: +case 4423: +case 4424: +case 4425: +case 4426: +case 4427: +case 4428: +case 4429: +case 4430: +case 4431: +case 4432: +case 4433: +case 4434: +case 4435: +case 4436: +case 4437: +case 4438: +case 4439: +case 4440: +case 4441: +case 4442: +case 4443: +case 4444: +case 4445: +case 4446: +case 4447: +case 4448: +case 4449: +case 4450: +case 4451: +case 4452: +case 4453: +case 4454: +case 4455: +case 4456: +case 4457: +case 4458: +case 4459: +case 4460: +case 4461: +case 4462: +case 4463: +case 4464: +case 4465: +case 4466: +case 4467: +case 4468: +case 4469: +case 4470: +case 4471: +case 4472: +case 4473: +case 4474: +case 4475: +case 4476: +case 4477: +case 4478: +case 4479: +case 4480: +case 4481: +case 4482: +case 4483: +case 4484: +case 4485: +case 4486: +case 4487: +case 4488: +case 4489: +case 4490: +case 4491: +case 4492: +case 4493: +case 4494: +case 4495: +case 4496: +case 4497: +case 4498: +case 4499: +case 4500: +case 4501: +case 4502: +case 4503: +case 4504: +case 4505: +case 4506: +case 4507: +case 4508: +case 4509: +case 4510: +case 4511: +case 4512: +case 4513: +case 4514: +case 4515: +case 4516: +case 4517: +case 4518: +case 4519: +case 4520: +case 4521: +case 4522: +case 4523: +case 4524: +case 4525: +case 4526: +case 4527: +case 4528: +case 4529: +case 4530: +case 4531: +case 4532: +case 4533: +case 4534: +case 4535: +case 4536: +case 4537: +case 4538: +case 4539: +case 4540: +case 4541: +case 4542: +case 4543: +case 4544: +case 4545: +case 4546: +case 4547: +case 4548: +case 4549: +case 4550: +case 4551: +case 4552: +case 4553: +case 4554: +case 4555: +case 4556: +case 4557: +case 4558: +case 4559: +case 4560: +case 4561: +case 4562: +case 4563: +case 4564: +case 4565: +case 4566: +case 4567: +case 4568: +case 4569: +case 4570: +case 4571: +case 4572: +case 4573: +case 4574: +case 4575: +case 4576: +case 4577: +case 4578: +case 4579: +case 4580: +case 4581: +case 4582: +case 4583: +case 4584: +case 4585: +case 4586: +case 4587: +case 4588: +case 4589: +case 4590: +case 4591: +case 4592: +case 4593: +case 4594: +case 4595: +case 4596: +case 4597: +case 4598: +case 4599: +case 4600: +case 4601: +case 4602: +case 4603: +case 4604: +case 4605: +case 4606: +case 4607: +case 4608: +case 4609: +case 4610: +case 4611: +case 4612: +case 4613: +case 4614: +case 4615: +case 4616: +case 4617: +case 4618: +case 4619: +case 4620: +case 4621: +case 4622: +case 4623: +case 4624: +case 4625: +case 4626: +case 4627: +case 4628: +case 4629: +case 4630: +case 4631: +case 4632: +case 4633: +case 4634: +case 4635: +case 4636: +case 4637: +case 4638: +case 4639: +case 4640: +case 4641: +case 4642: +case 4643: +case 4644: +case 4645: +case 4646: +case 4647: +case 4648: +case 4649: +case 4650: +case 4651: +case 4652: +case 4653: +case 4654: +case 4655: +case 4656: +case 4657: +case 4658: +case 4659: +case 4660: +case 4661: +case 4662: +case 4663: +case 4664: +case 4665: +case 4666: +case 4667: +case 4668: +case 4669: +case 4670: +case 4671: +case 4672: +case 4673: +case 4674: +case 4675: +case 4676: +case 4677: +case 4678: +case 4679: +case 4680: +case 4681: +case 4682: +case 4683: +case 4684: +case 4685: +case 4686: +case 4687: +case 4688: +case 4689: +case 4690: +case 4691: +case 4692: +case 4693: +case 4694: +case 4695: +case 4696: +case 4697: +case 4698: +case 4699: +case 4700: +case 4701: +case 4702: +case 4703: +case 4704: +case 4705: +case 4706: +case 4707: +case 4708: +case 4709: +case 4710: +case 4711: +case 4712: +case 4713: +case 4714: +case 4715: +case 4716: +case 4717: +case 4718: +case 4719: +case 4720: +case 4721: +case 4722: +case 4723: +case 4724: +case 4725: +case 4726: +case 4727: +case 4728: +case 4729: +case 4730: +case 4731: +case 4732: +case 4733: +case 4734: +case 4735: +case 4736: +case 4737: +case 4738: +case 4739: +case 4740: +case 4741: +case 4742: +case 4743: +case 4744: +case 4745: +case 4746: +case 4747: +case 4748: +case 4749: +case 4750: +case 4751: +case 4752: +case 4753: +case 4754: +case 4755: +case 4756: +case 4757: +case 4758: +case 4759: +case 4760: +case 4761: +case 4762: +case 4763: +case 4764: +case 4765: +case 4766: +case 4767: +case 4768: +case 4769: +case 4770: +case 4771: +case 4772: +case 4773: +case 4774: +case 4775: +case 4776: +case 4777: +case 4778: +case 4779: +case 4780: +case 4781: +case 4782: +case 4783: +case 4784: +case 4785: +case 4786: +case 4787: +case 4788: +case 4789: +case 4790: +case 4791: +case 4792: +case 4793: +case 4794: +case 4795: +case 4796: +case 4797: +case 4798: +case 4799: +case 4800: +case 4801: +case 4802: +case 4803: +case 4804: +case 4805: +case 4806: +case 4807: +case 4808: +case 4809: +case 4810: +case 4811: +case 4812: +case 4813: +case 4814: +case 4815: +case 4816: +case 4817: +case 4818: +case 4819: +case 4820: +case 4821: +case 4822: +case 4823: +case 4824: +case 4825: +case 4826: +case 4827: +case 4828: +case 4829: +case 4830: +case 4831: +case 4832: +case 4833: +case 4834: +case 4835: +case 4836: +case 4837: +case 4838: +case 4839: +case 4840: +case 4841: +case 4842: +case 4843: +case 4844: +case 4845: +case 4846: +case 4847: +case 4848: +case 4849: +case 4850: +case 4851: +case 4852: +case 4853: +case 4854: +case 4855: +case 4856: +case 4857: +case 4858: +case 4859: +case 4860: +case 4861: +case 4862: +case 4863: +case 4864: +case 4865: +case 4866: +case 4867: +case 4868: +case 4869: +case 4870: +case 4871: +case 4872: +case 4873: +case 4874: +case 4875: +case 4876: +case 4877: +case 4878: +case 4879: +case 4880: +case 4881: +case 4882: +case 4883: +case 4884: +case 4885: +case 4886: +case 4887: +case 4888: +case 4889: +case 4890: +case 4891: +case 4892: +case 4893: +case 4894: +case 4895: +case 4896: +case 4897: +case 4898: +case 4899: +case 4900: +case 4901: +case 4902: +case 4903: +case 4904: +case 4905: +case 4906: +case 4907: +case 4908: +case 4909: +case 4910: +case 4911: +case 4912: +case 4913: +case 4914: +case 4915: +case 4916: +case 4917: +case 4918: +case 4919: +case 4920: +case 4921: +case 4922: +case 4923: +case 4924: +case 4925: +case 4926: +case 4927: +case 4928: +case 4929: +case 4930: +case 4931: +case 4932: +case 4933: +case 4934: +case 4935: +case 4936: +case 4937: +case 4938: +case 4939: +case 4940: +case 4941: +case 4942: +case 4943: +case 4944: +case 4945: +case 4946: +case 4947: +case 4948: +case 4949: +case 4950: +case 4951: +case 4952: +case 4953: +case 4954: +case 4955: +case 4956: +case 4957: +case 4958: +case 4959: +case 4960: +case 4961: +case 4962: +case 4963: +case 4964: +case 4965: +case 4966: +case 4967: +case 4968: +case 4969: +case 4970: +case 4971: +case 4972: +case 4973: +case 4974: +case 4975: +case 4976: +case 4977: +case 4978: +case 4979: +case 4980: +case 4981: +case 4982: +case 4983: +case 4984: +case 4985: +case 4986: +case 4987: +case 4988: +case 4989: +case 4990: +case 4991: +case 4992: +case 4993: +case 4994: +case 4995: +case 4996: +case 4997: +case 4998: +case 4999: +case 5000: +case 5001: +case 5002: +case 5003: +case 5004: +case 5005: +case 5006: +case 5007: +case 5008: +case 5009: +case 5010: +case 5011: +case 5012: +case 5013: +case 5014: +case 5015: +case 5016: +case 5017: +case 5018: +case 5019: +case 5020: +case 5021: +case 5022: +case 5023: +case 5024: +case 5025: +case 5026: +case 5027: +case 5028: +case 5029: +case 5030: +case 5031: +case 5032: +case 5033: +case 5034: +case 5035: +case 5036: +case 5037: +case 5038: +case 5039: +case 5040: +case 5041: +case 5042: +case 5043: +case 5044: +case 5045: +case 5046: +case 5047: +case 5048: +case 5049: +case 5050: +case 5051: +case 5052: +case 5053: +case 5054: +case 5055: +case 5056: +case 5057: +case 5058: +case 5059: +case 5060: +case 5061: +case 5062: +case 5063: +case 5064: +case 5065: +case 5066: +case 5067: +case 5068: +case 5069: +case 5070: +case 5071: +case 5072: +case 5073: +case 5074: +case 5075: +case 5076: +case 5077: +case 5078: +case 5079: +case 5080: +case 5081: +case 5082: +case 5083: +case 5084: +case 5085: +case 5086: +case 5087: +case 5088: +case 5089: +case 5090: +case 5091: +case 5092: +case 5093: +case 5094: +case 5095: +case 5096: +case 5097: +case 5098: +case 5099: +case 5100: +case 5101: +case 5102: +case 5103: +case 5104: +case 5105: +case 5106: +case 5107: +case 5108: +case 5109: +case 5110: +case 5111: +case 5112: +case 5113: +case 5114: +case 5115: +case 5116: +case 5117: +case 5118: +case 5119: +case 5120: +case 5121: +case 5122: +case 5123: +case 5124: +case 5125: +case 5126: +case 5127: +case 5128: +case 5129: +case 5130: +case 5131: +case 5132: +case 5133: +case 5134: +case 5135: +case 5136: +case 5137: +case 5138: +case 5139: +case 5140: +case 5141: +case 5142: +case 5143: +case 5144: +case 5145: +case 5146: +case 5147: +case 5148: +case 5149: +case 5150: +case 5151: +case 5152: +case 5153: +case 5154: +case 5155: +case 5156: +case 5157: +case 5158: +case 5159: +case 5160: +case 5161: +case 5162: +case 5163: +case 5164: +case 5165: +case 5166: +case 5167: +case 5168: +case 5169: +case 5170: +case 5171: +case 5172: +case 5173: +case 5174: +case 5175: +case 5176: +case 5177: +case 5178: +case 5179: +case 5180: +case 5181: +case 5182: +case 5183: +case 5184: +case 5185: +case 5186: +case 5187: +case 5188: +case 5189: +case 5190: +case 5191: +case 5192: +case 5193: +case 5194: +case 5195: +case 5196: +case 5197: +case 5198: +case 5199: +case 5200: +case 5201: +case 5202: +case 5203: +case 5204: +case 5205: +case 5206: +case 5207: +case 5208: +case 5209: +case 5210: +case 5211: +case 5212: +case 5213: +case 5214: +case 5215: +case 5216: +case 5217: +case 5218: +case 5219: +case 5220: +case 5221: +case 5222: +case 5223: +case 5224: +case 5225: +case 5226: +case 5227: +case 5228: +case 5229: +case 5230: +case 5231: +case 5232: +case 5233: +case 5234: +case 5235: +case 5236: +case 5237: +case 5238: +case 5239: +case 5240: +case 5241: +case 5242: +case 5243: +case 5244: +case 5245: +case 5246: +case 5247: +case 5248: +case 5249: +case 5250: +case 5251: +case 5252: +case 5253: +case 5254: +case 5255: +case 5256: +case 5257: +case 5258: +case 5259: +case 5260: +case 5261: +case 5262: +case 5263: +case 5264: +case 5265: +case 5266: +case 5267: +case 5268: +case 5269: +case 5270: +case 5271: +case 5272: +case 5273: +case 5274: +case 5275: +case 5276: +case 5277: +case 5278: +case 5279: +case 5280: +case 5281: +case 5282: +case 5283: +case 5284: +case 5285: +case 5286: +case 5287: +case 5288: +case 5289: +case 5290: +case 5291: +case 5292: +case 5293: +case 5294: +case 5295: +case 5296: +case 5297: +case 5298: +case 5299: +case 5300: +case 5301: +case 5302: +case 5303: +case 5304: +case 5305: +case 5306: +case 5307: +case 5308: +case 5309: +case 5310: +case 5311: +case 5312: +case 5313: +case 5314: +case 5315: +case 5316: +case 5317: +case 5318: +case 5319: +case 5320: +case 5321: +case 5322: +case 5323: +case 5324: +case 5325: +case 5326: +case 5327: +case 5328: +case 5329: +case 5330: +case 5331: +case 5332: +case 5333: +case 5334: +case 5335: +case 5336: +case 5337: +case 5338: +case 5339: +case 5340: +case 5341: +case 5342: +case 5343: +case 5344: +case 5345: +case 5346: +case 5347: +case 5348: +case 5349: +case 5350: +case 5351: +case 5352: +case 5353: +case 5354: +case 5355: +case 5356: +case 5357: +case 5358: +case 5359: +case 5360: +case 5361: +case 5362: +case 5363: +case 5364: +case 5365: +case 5366: +case 5367: +case 5368: +case 5369: +case 5370: +case 5371: +case 5372: +case 5373: +case 5374: +case 5375: +case 5376: +case 5377: +case 5378: +case 5379: +case 5380: +case 5381: +case 5382: +case 5383: +case 5384: +case 5385: +case 5386: +case 5387: +case 5388: +case 5389: +case 5390: +case 5391: +case 5392: +case 5393: +case 5394: +case 5395: +case 5396: +case 5397: +case 5398: +case 5399: +case 5400: +case 5401: +case 5402: +case 5403: +case 5404: +case 5405: +case 5406: +case 5407: +case 5408: +case 5409: +case 5410: +case 5411: +case 5412: +case 5413: +case 5414: +case 5415: +case 5416: +case 5417: +case 5418: +case 5419: +case 5420: +case 5421: +case 5422: +case 5423: +case 5424: +case 5425: +case 5426: +case 5427: +case 5428: +case 5429: +case 5430: +case 5431: +case 5432: +case 5433: +case 5434: +case 5435: +case 5436: +case 5437: +case 5438: +case 5439: +case 5440: +case 5441: +case 5442: +case 5443: +case 5444: +case 5445: +case 5446: +case 5447: +case 5448: +case 5449: +case 5450: +case 5451: +case 5452: +case 5453: +case 5454: +case 5455: +case 5456: +case 5457: +case 5458: +case 5459: +case 5460: +case 5461: +case 5462: +case 5463: +case 5464: +case 5465: +case 5466: +case 5467: +case 5468: +case 5469: +case 5470: +case 5471: +case 5472: +case 5473: +case 5474: +case 5475: +case 5476: +case 5477: +case 5478: +case 5479: +case 5480: +case 5481: +case 5482: +case 5483: +case 5484: +case 5485: +case 5486: +case 5487: +case 5488: +case 5489: +case 5490: +case 5491: +case 5492: +case 5493: +case 5494: +case 5495: +case 5496: +case 5497: +case 5498: +case 5499: +case 5500: +case 5501: +case 5502: +case 5503: +case 5504: +case 5505: +case 5506: +case 5507: +case 5508: +case 5509: +case 5510: +case 5511: +case 5512: +case 5513: +case 5514: +case 5515: +case 5516: +case 5517: +case 5518: +case 5519: +case 5520: +case 5521: +case 5522: +case 5523: +case 5524: +case 5525: +case 5526: +case 5527: +case 5528: +case 5529: +case 5530: +case 5531: +case 5532: +case 5533: +case 5534: +case 5535: +case 5536: +case 5537: +case 5538: +case 5539: +case 5540: +case 5541: +case 5542: +case 5543: +case 5544: +case 5545: +case 5546: +case 5547: +case 5548: +case 5549: +case 5550: +case 5551: +case 5552: +case 5553: +case 5554: +case 5555: +case 5556: +case 5557: +case 5558: +case 5559: +case 5560: +case 5561: +case 5562: +case 5563: +case 5564: +case 5565: +case 5566: +case 5567: +case 5568: +case 5569: +case 5570: +case 5571: +case 5572: +case 5573: +case 5574: +case 5575: +case 5576: +case 5577: +case 5578: +case 5579: +case 5580: +case 5581: +case 5582: +case 5583: +case 5584: +case 5585: +case 5586: +case 5587: +case 5588: +case 5589: +case 5590: +case 5591: +case 5592: +case 5593: +case 5594: +case 5595: +case 5596: +case 5597: +case 5598: +case 5599: +case 5600: +case 5601: +case 5602: +case 5603: +case 5604: +case 5605: +case 5606: +case 5607: +case 5608: +case 5609: +case 5610: +case 5611: +case 5612: +case 5613: +case 5614: +case 5615: +case 5616: +case 5617: +case 5618: +case 5619: +case 5620: +case 5621: +case 5622: +case 5623: +case 5624: +case 5625: +case 5626: +case 5627: +case 5628: +case 5629: +case 5630: +case 5631: +case 5632: +case 5633: +case 5634: +case 5635: +case 5636: +case 5637: +case 5638: +case 5639: +case 5640: +case 5641: +case 5642: +case 5643: +case 5644: +case 5645: +case 5646: +case 5647: +case 5648: +case 5649: +case 5650: +case 5651: +case 5652: +case 5653: +case 5654: +case 5655: +case 5656: +case 5657: +case 5658: +case 5659: +case 5660: +case 5661: +case 5662: +case 5663: +case 5664: +case 5665: +case 5666: +case 5667: +case 5668: +case 5669: +case 5670: +case 5671: +case 5672: +case 5673: +case 5674: +case 5675: +case 5676: +case 5677: +case 5678: +case 5679: +case 5680: +case 5681: +case 5682: +case 5683: +case 5684: +case 5685: +case 5686: +case 5687: +case 5688: +case 5689: +case 5690: +case 5691: +case 5692: +case 5693: +case 5694: +case 5695: +case 5696: +case 5697: +case 5698: +case 5699: +case 5700: +case 5701: +case 5702: +case 5703: +case 5704: +case 5705: +case 5706: +case 5707: +case 5708: +case 5709: +case 5710: +case 5711: +case 5712: +case 5713: +case 5714: +case 5715: +case 5716: +case 5717: +case 5718: +case 5719: +case 5720: +case 5721: +case 5722: +case 5723: +case 5724: +case 5725: +case 5726: +case 5727: +case 5728: +case 5729: +case 5730: +case 5731: +case 5732: +case 5733: +case 5734: +case 5735: +case 5736: +case 5737: +case 5738: +case 5739: +case 5740: +case 5741: +case 5742: +case 5743: +case 5744: +case 5745: +case 5746: +case 5747: +case 5748: +case 5749: +case 5750: +case 5751: +case 5752: +case 5753: +case 5754: +case 5755: +case 5756: +case 5757: +case 5758: +case 5759: +case 5760: +case 5761: +case 5762: +case 5763: +case 5764: +case 5765: +case 5766: +case 5767: +case 5768: +case 5769: +case 5770: +case 5771: +case 5772: +case 5773: +case 5774: +case 5775: +case 5776: +case 5777: +case 5778: +case 5779: +case 5780: +case 5781: +case 5782: +case 5783: +case 5784: +case 5785: +case 5786: +case 5787: +case 5788: +case 5789: +case 5790: +case 5791: +case 5792: +case 5793: +case 5794: +case 5795: +case 5796: +case 5797: +case 5798: +case 5799: +case 5800: +case 5801: +case 5802: +case 5803: +case 5804: +case 5805: +case 5806: +case 5807: +case 5808: +case 5809: +case 5810: +case 5811: +case 5812: +case 5813: +case 5814: +case 5815: +case 5816: +case 5817: +case 5818: +case 5819: +case 5820: +case 5821: +case 5822: +case 5823: +case 5824: +case 5825: +case 5826: +case 5827: +case 5828: +case 5829: +case 5830: +case 5831: +case 5832: +case 5833: +case 5834: +case 5835: +case 5836: +case 5837: +case 5838: +case 5839: +case 5840: +case 5841: +case 5842: +case 5843: +case 5844: +case 5845: +case 5846: +case 5847: +case 5848: +case 5849: +case 5850: +case 5851: +case 5852: +case 5853: +case 5854: +case 5855: +case 5856: +case 5857: +case 5858: +case 5859: +case 5860: +case 5861: +case 5862: +case 5863: +case 5864: +case 5865: +case 5866: +case 5867: +case 5868: +case 5869: +case 5870: +case 5871: +case 5872: +case 5873: +case 5874: +case 5875: +case 5876: +case 5877: +case 5878: +case 5879: +case 5880: +case 5881: +case 5882: +case 5883: +case 5884: +case 5885: +case 5886: +case 5887: +case 5888: +case 5889: +case 5890: +case 5891: +case 5892: +case 5893: +case 5894: +case 5895: +case 5896: +case 5897: +case 5898: +case 5899: +case 5900: +case 5901: +case 5902: +case 5903: +case 5904: +case 5905: +case 5906: +case 5907: +case 5908: +case 5909: +case 5910: +case 5911: +case 5912: +case 5913: +case 5914: +case 5915: +case 5916: +case 5917: +case 5918: +case 5919: +case 5920: +case 5921: +case 5922: +case 5923: +case 5924: +case 5925: +case 5926: +case 5927: +case 5928: +case 5929: +case 5930: +case 5931: +case 5932: +case 5933: +case 5934: +case 5935: +case 5936: +case 5937: +case 5938: +case 5939: +case 5940: +case 5941: +case 5942: +case 5943: +case 5944: +case 5945: +case 5946: +case 5947: +case 5948: +case 5949: +case 5950: +case 5951: +case 5952: +case 5953: +case 5954: +case 5955: +case 5956: +case 5957: +case 5958: +case 5959: +case 5960: +case 5961: +case 5962: +case 5963: +case 5964: +case 5965: +case 5966: +case 5967: +case 5968: +case 5969: +case 5970: +case 5971: +case 5972: +case 5973: +case 5974: +case 5975: +case 5976: +case 5977: +case 5978: +case 5979: +case 5980: +case 5981: +case 5982: +case 5983: +case 5984: +case 5985: +case 5986: +case 5987: +case 5988: +case 5989: +case 5990: +case 5991: +case 5992: +case 5993: +case 5994: +case 5995: +case 5996: +case 5997: +case 5998: +case 5999: +case 6000: +case 6001: +case 6002: +case 6003: +case 6004: +case 6005: +case 6006: +case 6007: +case 6008: +case 6009: +case 6010: +case 6011: +case 6012: +case 6013: +case 6014: +case 6015: +case 6016: +case 6017: +case 6018: +case 6019: +case 6020: +case 6021: +case 6022: +case 6023: +case 6024: +case 6025: +case 6026: +case 6027: +case 6028: +case 6029: +case 6030: +case 6031: +case 6032: +case 6033: +case 6034: +case 6035: +case 6036: +case 6037: +case 6038: +case 6039: +case 6040: +case 6041: +case 6042: +case 6043: +case 6044: +case 6045: +case 6046: +case 6047: +case 6048: +case 6049: +case 6050: +case 6051: +case 6052: +case 6053: +case 6054: +case 6055: +case 6056: +case 6057: +case 6058: +case 6059: +case 6060: +case 6061: +case 6062: +case 6063: +case 6064: +case 6065: +case 6066: +case 6067: +case 6068: +case 6069: +case 6070: +case 6071: +case 6072: +case 6073: +case 6074: +case 6075: +case 6076: +case 6077: +case 6078: +case 6079: +case 6080: +case 6081: +case 6082: +case 6083: +case 6084: +case 6085: +case 6086: +case 6087: +case 6088: +case 6089: +case 6090: +case 6091: +case 6092: +case 6093: +case 6094: +case 6095: +case 6096: +case 6097: +case 6098: +case 6099: +case 6100: +case 6101: +case 6102: +case 6103: +case 6104: +case 6105: +case 6106: +case 6107: +case 6108: +case 6109: +case 6110: +case 6111: +case 6112: +case 6113: +case 6114: +case 6115: +case 6116: +case 6117: +case 6118: +case 6119: +case 6120: +case 6121: +case 6122: +case 6123: +case 6124: +case 6125: +case 6126: +case 6127: +case 6128: +case 6129: +case 6130: +case 6131: +case 6132: +case 6133: +case 6134: +case 6135: +case 6136: +case 6137: +case 6138: +case 6139: +case 6140: +case 6141: +case 6142: +case 6143: +case 6144: +case 6145: +case 6146: +case 6147: +case 6148: +case 6149: +case 6150: +case 6151: +case 6152: +case 6153: +case 6154: +case 6155: +case 6156: +case 6157: +case 6158: +case 6159: +case 6160: +case 6161: +case 6162: +case 6163: +case 6164: +case 6165: +case 6166: +case 6167: +case 6168: +case 6169: +case 6170: +case 6171: +case 6172: +case 6173: +case 6174: +case 6175: +case 6176: +case 6177: +case 6178: +case 6179: +case 6180: +case 6181: +case 6182: +case 6183: +case 6184: +case 6185: +case 6186: +case 6187: +case 6188: +case 6189: +case 6190: +case 6191: +case 6192: +case 6193: +case 6194: +case 6195: +case 6196: +case 6197: +case 6198: +case 6199: +case 6200: +case 6201: +case 6202: +case 6203: +case 6204: +case 6205: +case 6206: +case 6207: +case 6208: +case 6209: +case 6210: +case 6211: +case 6212: +case 6213: +case 6214: +case 6215: +case 6216: +case 6217: +case 6218: +case 6219: +case 6220: +case 6221: +case 6222: +case 6223: +case 6224: +case 6225: +case 6226: +case 6227: +case 6228: +case 6229: +case 6230: +case 6231: +case 6232: +case 6233: +case 6234: +case 6235: +case 6236: +case 6237: +case 6238: +case 6239: +case 6240: +case 6241: +case 6242: +case 6243: +case 6244: +case 6245: +case 6246: +case 6247: +case 6248: +case 6249: +case 6250: +case 6251: +case 6252: +case 6253: +case 6254: +case 6255: +case 6256: +case 6257: +case 6258: +case 6259: +case 6260: +case 6261: +case 6262: +case 6263: +case 6264: +case 6265: +case 6266: +case 6267: +case 6268: +case 6269: +case 6270: +case 6271: +case 6272: +case 6273: +case 6274: +case 6275: +case 6276: +case 6277: +case 6278: +case 6279: +case 6280: +case 6281: +case 6282: +case 6283: +case 6284: +case 6285: +case 6286: +case 6287: +case 6288: +case 6289: +case 6290: +case 6291: +case 6292: +case 6293: +case 6294: +case 6295: +case 6296: +case 6297: +case 6298: +case 6299: +case 6300: +case 6301: +case 6302: +case 6303: +case 6304: +case 6305: +case 6306: +case 6307: +case 6308: +case 6309: +case 6310: +case 6311: +case 6312: +case 6313: +case 6314: +case 6315: +case 6316: +case 6317: +case 6318: +case 6319: +case 6320: +case 6321: +case 6322: +case 6323: +case 6324: +case 6325: +case 6326: +case 6327: +case 6328: +case 6329: +case 6330: +case 6331: +case 6332: +case 6333: +case 6334: +case 6335: +case 6336: +case 6337: +case 6338: +case 6339: +case 6340: +case 6341: +case 6342: +case 6343: +case 6344: +case 6345: +case 6346: +case 6347: +case 6348: +case 6349: +case 6350: +case 6351: +case 6352: +case 6353: +case 6354: +case 6355: +case 6356: +case 6357: +case 6358: +case 6359: +case 6360: +case 6361: +case 6362: +case 6363: +case 6364: +case 6365: +case 6366: +case 6367: +case 6368: +case 6369: +case 6370: +case 6371: +case 6372: +case 6373: +case 6374: +case 6375: +case 6376: +case 6377: +case 6378: +case 6379: +case 6380: +case 6381: +case 6382: +case 6383: +case 6384: +case 6385: +case 6386: +case 6387: +case 6388: +case 6389: +case 6390: +case 6391: +case 6392: +case 6393: +case 6394: +case 6395: +case 6396: +case 6397: +case 6398: +case 6399: +case 6400: +case 6401: +case 6402: +case 6403: +case 6404: +case 6405: +case 6406: +case 6407: +case 6408: +case 6409: +case 6410: +case 6411: +case 6412: +case 6413: +case 6414: +case 6415: +case 6416: +case 6417: +case 6418: +case 6419: +case 6420: +case 6421: +case 6422: +case 6423: +case 6424: +case 6425: +case 6426: +case 6427: +case 6428: +case 6429: +case 6430: +case 6431: +case 6432: +case 6433: +case 6434: +case 6435: +case 6436: +case 6437: +case 6438: +case 6439: +case 6440: +case 6441: +case 6442: +case 6443: +case 6444: +case 6445: +case 6446: +case 6447: +case 6448: +case 6449: +case 6450: +case 6451: +case 6452: +case 6453: +case 6454: +case 6455: +case 6456: +case 6457: +case 6458: +case 6459: +case 6460: +case 6461: +case 6462: +case 6463: +case 6464: +case 6465: +case 6466: +case 6467: +case 6468: +case 6469: +case 6470: +case 6471: +case 6472: +case 6473: +case 6474: +case 6475: +case 6476: +case 6477: +case 6478: +case 6479: +case 6480: +case 6481: +case 6482: +case 6483: +case 6484: +case 6485: +case 6486: +case 6487: +case 6488: +case 6489: +case 6490: +case 6491: +case 6492: +case 6493: +case 6494: +case 6495: +case 6496: +case 6497: +case 6498: +case 6499: +case 6500: +case 6501: +case 6502: +case 6503: +case 6504: +case 6505: +case 6506: +case 6507: +case 6508: +case 6509: +case 6510: +case 6511: +case 6512: +case 6513: +case 6514: +case 6515: +case 6516: +case 6517: +case 6518: +case 6519: +case 6520: +case 6521: +case 6522: +case 6523: +case 6524: +case 6525: +case 6526: +case 6527: +case 6528: +case 6529: +case 6530: +case 6531: +case 6532: +case 6533: +case 6534: +case 6535: +case 6536: +case 6537: +case 6538: +case 6539: +case 6540: +case 6541: +case 6542: +case 6543: +case 6544: +case 6545: +case 6546: +case 6547: +case 6548: +case 6549: +case 6550: +case 6551: +case 6552: +case 6553: +case 6554: +case 6555: +case 6556: +case 6557: +case 6558: +case 6559: +case 6560: +case 6561: +case 6562: +case 6563: +case 6564: +case 6565: +case 6566: +case 6567: +case 6568: +case 6569: +case 6570: +case 6571: +case 6572: +case 6573: +case 6574: +case 6575: +case 6576: +case 6577: +case 6578: +case 6579: +case 6580: +case 6581: +case 6582: +case 6583: +case 6584: +case 6585: +case 6586: +case 6587: +case 6588: +case 6589: +case 6590: +case 6591: +case 6592: +case 6593: +case 6594: +case 6595: +case 6596: +case 6597: +case 6598: +case 6599: +case 6600: +case 6601: +case 6602: +case 6603: +case 6604: +case 6605: +case 6606: +case 6607: +case 6608: +case 6609: +case 6610: +case 6611: +case 6612: +case 6613: +case 6614: +case 6615: +case 6616: +case 6617: +case 6618: +case 6619: +case 6620: +case 6621: +case 6622: +case 6623: +case 6624: +case 6625: +case 6626: +case 6627: +case 6628: +case 6629: +case 6630: +case 6631: +case 6632: +case 6633: +case 6634: +case 6635: +case 6636: +case 6637: +case 6638: +case 6639: +case 6640: +case 6641: +case 6642: +case 6643: +case 6644: +case 6645: +case 6646: +case 6647: +case 6648: +case 6649: +case 6650: +case 6651: +case 6652: +case 6653: +case 6654: +case 6655: +case 6656: +case 6657: +case 6658: +case 6659: +case 6660: +case 6661: +case 6662: +case 6663: +case 6664: +case 6665: +case 6666: +case 6667: +case 6668: +case 6669: +case 6670: +case 6671: +case 6672: +case 6673: +case 6674: +case 6675: +case 6676: +case 6677: +case 6678: +case 6679: +case 6680: +case 6681: +case 6682: +case 6683: +case 6684: +case 6685: +case 6686: +case 6687: +case 6688: +case 6689: +case 6690: +case 6691: +case 6692: +case 6693: +case 6694: +case 6695: +case 6696: +case 6697: +case 6698: +case 6699: +case 6700: +case 6701: +case 6702: +case 6703: +case 6704: +case 6705: +case 6706: +case 6707: +case 6708: +case 6709: +case 6710: +case 6711: +case 6712: +case 6713: +case 6714: +case 6715: +case 6716: +case 6717: +case 6718: +case 6719: +case 6720: +case 6721: +case 6722: +case 6723: +case 6724: +case 6725: +case 6726: +case 6727: +case 6728: +case 6729: +case 6730: +case 6731: +case 6732: +case 6733: +case 6734: +case 6735: +case 6736: +case 6737: +case 6738: +case 6739: +case 6740: +case 6741: +case 6742: +case 6743: +case 6744: +case 6745: +case 6746: +case 6747: +case 6748: +case 6749: +case 6750: +case 6751: +case 6752: +case 6753: +case 6754: +case 6755: +case 6756: +case 6757: +case 6758: +case 6759: +case 6760: +case 6761: +case 6762: +case 6763: +case 6764: +case 6765: +case 6766: +case 6767: +case 6768: +case 6769: +case 6770: +case 6771: +case 6772: +case 6773: +case 6774: +case 6775: +case 6776: +case 6777: +case 6778: +case 6779: +case 6780: +case 6781: +case 6782: +case 6783: +case 6784: +case 6785: +case 6786: +case 6787: +case 6788: +case 6789: +case 6790: +case 6791: +case 6792: +case 6793: +case 6794: +case 6795: +case 6796: +case 6797: +case 6798: +case 6799: +case 6800: +case 6801: +case 6802: +case 6803: +case 6804: +case 6805: +case 6806: +case 6807: +case 6808: +case 6809: +case 6810: +case 6811: +case 6812: +case 6813: +case 6814: +case 6815: +case 6816: +case 6817: +case 6818: +case 6819: +case 6820: +case 6821: +case 6822: +case 6823: +case 6824: +case 6825: +case 6826: +case 6827: +case 6828: +case 6829: +case 6830: +case 6831: +case 6832: +case 6833: +case 6834: +case 6835: +case 6836: +case 6837: +case 6838: +case 6839: +case 6840: +case 6841: +case 6842: +case 6843: +case 6844: +case 6845: +case 6846: +case 6847: +case 6848: +case 6849: +case 6850: +case 6851: +case 6852: +case 6853: +case 6854: +case 6855: +case 6856: +case 6857: +case 6858: +case 6859: +case 6860: +case 6861: +case 6862: +case 6863: +case 6864: +case 6865: +case 6866: +case 6867: +case 6868: +case 6869: +case 6870: +case 6871: +case 6872: +case 6873: +case 6874: +case 6875: +case 6876: +case 6877: +case 6878: +case 6879: +case 6880: +case 6881: +case 6882: +case 6883: +case 6884: +case 6885: +case 6886: +case 6887: +case 6888: +case 6889: +case 6890: +case 6891: +case 6892: +case 6893: +case 6894: +case 6895: +case 6896: +case 6897: +case 6898: +case 6899: +case 6900: +case 6901: +case 6902: +case 6903: +case 6904: +case 6905: +case 6906: +case 6907: +case 6908: +case 6909: +case 6910: +case 6911: +case 6912: +case 6913: +case 6914: +case 6915: +case 6916: +case 6917: +case 6918: +case 6919: +case 6920: +case 6921: +case 6922: +case 6923: +case 6924: +case 6925: +case 6926: +case 6927: +case 6928: +case 6929: +case 6930: +case 6931: +case 6932: +case 6933: +case 6934: +case 6935: +case 6936: +case 6937: +case 6938: +case 6939: +case 6940: +case 6941: +case 6942: +case 6943: +case 6944: +case 6945: +case 6946: +case 6947: +case 6948: +case 6949: +case 6950: +case 6951: +case 6952: +case 6953: +case 6954: +case 6955: +case 6956: +case 6957: +case 6958: +case 6959: +case 6960: +case 6961: +case 6962: +case 6963: +case 6964: +case 6965: +case 6966: +case 6967: +case 6968: +case 6969: +case 6970: +case 6971: +case 6972: +case 6973: +case 6974: +case 6975: +case 6976: +case 6977: +case 6978: +case 6979: +case 6980: +case 6981: +case 6982: +case 6983: +case 6984: +case 6985: +case 6986: +case 6987: +case 6988: +case 6989: +case 6990: +case 6991: +case 6992: +case 6993: +case 6994: +case 6995: +case 6996: +case 6997: +case 6998: +case 6999: +case 7000: +case 7001: +case 7002: +case 7003: +case 7004: +case 7005: +case 7006: +case 7007: +case 7008: +case 7009: +case 7010: +case 7011: +case 7012: +case 7013: +case 7014: +case 7015: +case 7016: +case 7017: +case 7018: +case 7019: +case 7020: +case 7021: +case 7022: +case 7023: +case 7024: +case 7025: +case 7026: +case 7027: +case 7028: +case 7029: +case 7030: +case 7031: +case 7032: +case 7033: +case 7034: +case 7035: +case 7036: +case 7037: +case 7038: +case 7039: +case 7040: +case 7041: +case 7042: +case 7043: +case 7044: +case 7045: +case 7046: +case 7047: +case 7048: +case 7049: +case 7050: +case 7051: +case 7052: +case 7053: +case 7054: +case 7055: +case 7056: +case 7057: +case 7058: +case 7059: +case 7060: +case 7061: +case 7062: +case 7063: +case 7064: +case 7065: +case 7066: +case 7067: +case 7068: +case 7069: +case 7070: +case 7071: +case 7072: +case 7073: +case 7074: +case 7075: +case 7076: +case 7077: +case 7078: +case 7079: +case 7080: +case 7081: +case 7082: +case 7083: +case 7084: +case 7085: +case 7086: +case 7087: +case 7088: +case 7089: +case 7090: +case 7091: +case 7092: +case 7093: +case 7094: +case 7095: +case 7096: +case 7097: +case 7098: +case 7099: +case 7100: +case 7101: +case 7102: +case 7103: +case 7104: +case 7105: +case 7106: +case 7107: +case 7108: +case 7109: +case 7110: +case 7111: +case 7112: +case 7113: +case 7114: +case 7115: +case 7116: +case 7117: +case 7118: +case 7119: +case 7120: +case 7121: +case 7122: +case 7123: +case 7124: +case 7125: +case 7126: +case 7127: +case 7128: +case 7129: +case 7130: +case 7131: +case 7132: +case 7133: +case 7134: +case 7135: +case 7136: +case 7137: +case 7138: +case 7139: +case 7140: +case 7141: +case 7142: +case 7143: +case 7144: +case 7145: +case 7146: +case 7147: +case 7148: +case 7149: +case 7150: +case 7151: +case 7152: +case 7153: +case 7154: +case 7155: +case 7156: +case 7157: +case 7158: +case 7159: +case 7160: +case 7161: +case 7162: +case 7163: +case 7164: +case 7165: +case 7166: +case 7167: +case 7168: +case 7169: +case 7170: +case 7171: +case 7172: +case 7173: +case 7174: +case 7175: +case 7176: +case 7177: +case 7178: +case 7179: +case 7180: +case 7181: +case 7182: +case 7183: +case 7184: +case 7185: +case 7186: +case 7187: +case 7188: +case 7189: +case 7190: +case 7191: +case 7192: +case 7193: +case 7194: +case 7195: +case 7196: +case 7197: +case 7198: +case 7199: +case 7200: +case 7201: +case 7202: +case 7203: +case 7204: +case 7205: +case 7206: +case 7207: +case 7208: +case 7209: +case 7210: +case 7211: +case 7212: +case 7213: +case 7214: +case 7215: +case 7216: +case 7217: +case 7218: +case 7219: +case 7220: +case 7221: +case 7222: +case 7223: +case 7224: +case 7225: +case 7226: +case 7227: +case 7228: +case 7229: +case 7230: +case 7231: +case 7232: +case 7233: +case 7234: +case 7235: +case 7236: +case 7237: +case 7238: +case 7239: +case 7240: +case 7241: +case 7242: +case 7243: +case 7244: +case 7245: +case 7246: +case 7247: +case 7248: +case 7249: +case 7250: +case 7251: +case 7252: +case 7253: +case 7254: +case 7255: +case 7256: +case 7257: +case 7258: +case 7259: +case 7260: +case 7261: +case 7262: +case 7263: +case 7264: +case 7265: +case 7266: +case 7267: +case 7268: +case 7269: +case 7270: +case 7271: +case 7272: +case 7273: +case 7274: +case 7275: +case 7276: +case 7277: +case 7278: +case 7279: +case 7280: +case 7281: +case 7282: +case 7283: +case 7284: +case 7285: +case 7286: +case 7287: +case 7288: +case 7289: +case 7290: +case 7291: +case 7292: +case 7293: +case 7294: +case 7295: +case 7296: +case 7297: +case 7298: +case 7299: +case 7300: +case 7301: +case 7302: +case 7303: +case 7304: +case 7305: +case 7306: +case 7307: +case 7308: +case 7309: +case 7310: +case 7311: +case 7312: +case 7313: +case 7314: +case 7315: +case 7316: +case 7317: +case 7318: +case 7319: +case 7320: +case 7321: +case 7322: +case 7323: +case 7324: +case 7325: +case 7326: +case 7327: +case 7328: +case 7329: +case 7330: +case 7331: +case 7332: +case 7333: +case 7334: +case 7335: +case 7336: +case 7337: +case 7338: +case 7339: +case 7340: +case 7341: +case 7342: +case 7343: +case 7344: +case 7345: +case 7346: +case 7347: +case 7348: +case 7349: +case 7350: +case 7351: +case 7352: +case 7353: +case 7354: +case 7355: +case 7356: +case 7357: +case 7358: +case 7359: +case 7360: +case 7361: +case 7362: +case 7363: +case 7364: +case 7365: +case 7366: +case 7367: +case 7368: +case 7369: +case 7370: +case 7371: +case 7372: +case 7373: +case 7374: +case 7375: +case 7376: +case 7377: +case 7378: +case 7379: +case 7380: +case 7381: +case 7382: +case 7383: +case 7384: +case 7385: +case 7386: +case 7387: +case 7388: +case 7389: +case 7390: +case 7391: +case 7392: +case 7393: +case 7394: +case 7395: +case 7396: +case 7397: +case 7398: +case 7399: +case 7400: +case 7401: +case 7402: +case 7403: +case 7404: +case 7405: +case 7406: +case 7407: +case 7408: +case 7409: +case 7410: +case 7411: +case 7412: +case 7413: +case 7414: +case 7415: +case 7416: +case 7417: +case 7418: +case 7419: +case 7420: +case 7421: +case 7422: +case 7423: +case 7424: +case 7425: +case 7426: +case 7427: +case 7428: +case 7429: +case 7430: +case 7431: +case 7432: +case 7433: +case 7434: +case 7435: +case 7436: +case 7437: +case 7438: +case 7439: +case 7440: +case 7441: +case 7442: +case 7443: +case 7444: +case 7445: +case 7446: +case 7447: +case 7448: +case 7449: +case 7450: +case 7451: +case 7452: +case 7453: +case 7454: +case 7455: +case 7456: +case 7457: +case 7458: +case 7459: +case 7460: +case 7461: +case 7462: +case 7463: +case 7464: +case 7465: +case 7466: +case 7467: +case 7468: +case 7469: +case 7470: +case 7471: +case 7472: +case 7473: +case 7474: +case 7475: +case 7476: +case 7477: +case 7478: +case 7479: +case 7480: +case 7481: +case 7482: +case 7483: +case 7484: +case 7485: +case 7486: +case 7487: +case 7488: +case 7489: +case 7490: +case 7491: +case 7492: +case 7493: +case 7494: +case 7495: +case 7496: +case 7497: +case 7498: +case 7499: +case 7500: +case 7501: +case 7502: +case 7503: +case 7504: +case 7505: +case 7506: +case 7507: +case 7508: +case 7509: +case 7510: +case 7511: +case 7512: +case 7513: +case 7514: +case 7515: +case 7516: +case 7517: +case 7518: +case 7519: +case 7520: +case 7521: +case 7522: +case 7523: +case 7524: +case 7525: +case 7526: +case 7527: +case 7528: +case 7529: +case 7530: +case 7531: +case 7532: +case 7533: +case 7534: +case 7535: +case 7536: +case 7537: +case 7538: +case 7539: +case 7540: +case 7541: +case 7542: +case 7543: +case 7544: +case 7545: +case 7546: +case 7547: +case 7548: +case 7549: +case 7550: +case 7551: +case 7552: +case 7553: +case 7554: +case 7555: +case 7556: +case 7557: +case 7558: +case 7559: +case 7560: +case 7561: +case 7562: +case 7563: +case 7564: +case 7565: +case 7566: +case 7567: +case 7568: +case 7569: +case 7570: +case 7571: +case 7572: +case 7573: +case 7574: +case 7575: +case 7576: +case 7577: +case 7578: +case 7579: +case 7580: +case 7581: +case 7582: +case 7583: +case 7584: +case 7585: +case 7586: +case 7587: +case 7588: +case 7589: +case 7590: +case 7591: +case 7592: +case 7593: +case 7594: +case 7595: +case 7596: +case 7597: +case 7598: +case 7599: +case 7600: +case 7601: +case 7602: +case 7603: +case 7604: +case 7605: +case 7606: +case 7607: +case 7608: +case 7609: +case 7610: +case 7611: +case 7612: +case 7613: +case 7614: +case 7615: +case 7616: +case 7617: +case 7618: +case 7619: +case 7620: +case 7621: +case 7622: +case 7623: +case 7624: +case 7625: +case 7626: +case 7627: +case 7628: +case 7629: +case 7630: +case 7631: +case 7632: +case 7633: +case 7634: +case 7635: +case 7636: +case 7637: +case 7638: +case 7639: +case 7640: +case 7641: +case 7642: +case 7643: +case 7644: +case 7645: +case 7646: +case 7647: +case 7648: +case 7649: +case 7650: +case 7651: +case 7652: +case 7653: +case 7654: +case 7655: +case 7656: +case 7657: +case 7658: +case 7659: +case 7660: +case 7661: +case 7662: +case 7663: +case 7664: +case 7665: +case 7666: +case 7667: +case 7668: +case 7669: +case 7670: +case 7671: +case 7672: +case 7673: +case 7674: +case 7675: +case 7676: +case 7677: +case 7678: +case 7679: +case 7680: +case 7681: +case 7682: +case 7683: +case 7684: +case 7685: +case 7686: +case 7687: +case 7688: +case 7689: +case 7690: +case 7691: +case 7692: +case 7693: +case 7694: +case 7695: +case 7696: +case 7697: +case 7698: +case 7699: +case 7700: +case 7701: +case 7702: +case 7703: +case 7704: +case 7705: +case 7706: +case 7707: +case 7708: +case 7709: +case 7710: +case 7711: +case 7712: +case 7713: +case 7714: +case 7715: +case 7716: +case 7717: +case 7718: +case 7719: +case 7720: +case 7721: +case 7722: +case 7723: +case 7724: +case 7725: +case 7726: +case 7727: +case 7728: +case 7729: +case 7730: +case 7731: +case 7732: +case 7733: +case 7734: +case 7735: +case 7736: +case 7737: +case 7738: +case 7739: +case 7740: +case 7741: +case 7742: +case 7743: +case 7744: +case 7745: +case 7746: +case 7747: +case 7748: +case 7749: +case 7750: +case 7751: +case 7752: +case 7753: +case 7754: +case 7755: +case 7756: +case 7757: +case 7758: +case 7759: +case 7760: +case 7761: +case 7762: +case 7763: +case 7764: +case 7765: +case 7766: +case 7767: +case 7768: +case 7769: +case 7770: +case 7771: +case 7772: +case 7773: +case 7774: +case 7775: +case 7776: +case 7777: +case 7778: +case 7779: +case 7780: +case 7781: +case 7782: +case 7783: +case 7784: +case 7785: +case 7786: +case 7787: +case 7788: +case 7789: +case 7790: +case 7791: +case 7792: +case 7793: +case 7794: +case 7795: +case 7796: +case 7797: +case 7798: +case 7799: +case 7800: +case 7801: +case 7802: +case 7803: +case 7804: +case 7805: +case 7806: +case 7807: +case 7808: +case 7809: +case 7810: +case 7811: +case 7812: +case 7813: +case 7814: +case 7815: +case 7816: +case 7817: +case 7818: +case 7819: +case 7820: +case 7821: +case 7822: +case 7823: +case 7824: +case 7825: +case 7826: +case 7827: +case 7828: +case 7829: +case 7830: +case 7831: +case 7832: +case 7833: +case 7834: +case 7835: +case 7836: +case 7837: +case 7838: +case 7839: +case 7840: +case 7841: +case 7842: +case 7843: +case 7844: +case 7845: +case 7846: +case 7847: +case 7848: +case 7849: +case 7850: +case 7851: +case 7852: +case 7853: +case 7854: +case 7855: +case 7856: +case 7857: +case 7858: +case 7859: +case 7860: +case 7861: +case 7862: +case 7863: +case 7864: +case 7865: +case 7866: +case 7867: +case 7868: +case 7869: +case 7870: +case 7871: +case 7872: +case 7873: +case 7874: +case 7875: +case 7876: +case 7877: +case 7878: +case 7879: +case 7880: +case 7881: +case 7882: +case 7883: +case 7884: +case 7885: +case 7886: +case 7887: +case 7888: +case 7889: +case 7890: +case 7891: +case 7892: +case 7893: +case 7894: +case 7895: +case 7896: +case 7897: +case 7898: +case 7899: +case 7900: +case 7901: +case 7902: +case 7903: +case 7904: +case 7905: +case 7906: +case 7907: +case 7908: +case 7909: +case 7910: +case 7911: +case 7912: +case 7913: +case 7914: +case 7915: +case 7916: +case 7917: +case 7918: +case 7919: +case 7920: +case 7921: +case 7922: +case 7923: +case 7924: +case 7925: +case 7926: +case 7927: +case 7928: +case 7929: +case 7930: +case 7931: +case 7932: +case 7933: +case 7934: +case 7935: +case 7936: +case 7937: +case 7938: +case 7939: +case 7940: +case 7941: +case 7942: +case 7943: +case 7944: +case 7945: +case 7946: +case 7947: +case 7948: +case 7949: +case 7950: +case 7951: +case 7952: +case 7953: +case 7954: +case 7955: +case 7956: +case 7957: +case 7958: +case 7959: +case 7960: +case 7961: +case 7962: +case 7963: +case 7964: +case 7965: +case 7966: +case 7967: +case 7968: +case 7969: +case 7970: +case 7971: +case 7972: +case 7973: +case 7974: +case 7975: +case 7976: +case 7977: +case 7978: +case 7979: +case 7980: +case 7981: +case 7982: +case 7983: +case 7984: +case 7985: +case 7986: +case 7987: +case 7988: +case 7989: +case 7990: +case 7991: +case 7992: +case 7993: +case 7994: +case 7995: +case 7996: +case 7997: +case 7998: +case 7999: +case 8000: +case 8001: +case 8002: +case 8003: +case 8004: +case 8005: +case 8006: +case 8007: +case 8008: +case 8009: +case 8010: +case 8011: +case 8012: +case 8013: +case 8014: +case 8015: +case 8016: +case 8017: +case 8018: +case 8019: +case 8020: +case 8021: +case 8022: +case 8023: +case 8024: +case 8025: +case 8026: +case 8027: +case 8028: +case 8029: +case 8030: +case 8031: +case 8032: +case 8033: +case 8034: +case 8035: +case 8036: +case 8037: +case 8038: +case 8039: +case 8040: +case 8041: +case 8042: +case 8043: +case 8044: +case 8045: +case 8046: +case 8047: +case 8048: +case 8049: +case 8050: +case 8051: +case 8052: +case 8053: +case 8054: +case 8055: +case 8056: +case 8057: +case 8058: +case 8059: +case 8060: +case 8061: +case 8062: +case 8063: +case 8064: +case 8065: +case 8066: +case 8067: +case 8068: +case 8069: +case 8070: +case 8071: +case 8072: +case 8073: +case 8074: +case 8075: +case 8076: +case 8077: +case 8078: +case 8079: +case 8080: +case 8081: +case 8082: +case 8083: +case 8084: +case 8085: +case 8086: +case 8087: +case 8088: +case 8089: +case 8090: +case 8091: +case 8092: +case 8093: +case 8094: +case 8095: +case 8096: +case 8097: +case 8098: +case 8099: +case 8100: +case 8101: +case 8102: +case 8103: +case 8104: +case 8105: +case 8106: +case 8107: +case 8108: +case 8109: +case 8110: +case 8111: +case 8112: +case 8113: +case 8114: +case 8115: +case 8116: +case 8117: +case 8118: +case 8119: +case 8120: +case 8121: +case 8122: +case 8123: +case 8124: +case 8125: +case 8126: +case 8127: +case 8128: +case 8129: +case 8130: +case 8131: +case 8132: +case 8133: +case 8134: +case 8135: +case 8136: +case 8137: +case 8138: +case 8139: +case 8140: +case 8141: +case 8142: +case 8143: +case 8144: +case 8145: +case 8146: +case 8147: +case 8148: +case 8149: +case 8150: +case 8151: +case 8152: +case 8153: +case 8154: +case 8155: +case 8156: +case 8157: +case 8158: +case 8159: +case 8160: +case 8161: +case 8162: +case 8163: +case 8164: +case 8165: +case 8166: +case 8167: +case 8168: +case 8169: +case 8170: +case 8171: +case 8172: +case 8173: +case 8174: +case 8175: +case 8176: +case 8177: +case 8178: +case 8179: +case 8180: +case 8181: +case 8182: +case 8183: +case 8184: +case 8185: +case 8186: +case 8187: +case 8188: +case 8189: +case 8190: +case 8191: +case 8192: +case 8193: +case 8194: +case 8195: +case 8196: +case 8197: +case 8198: +case 8199: +case 8200: +case 8201: +case 8202: +case 8203: +case 8204: +case 8205: +case 8206: +case 8207: +case 8208: +case 8209: +case 8210: +case 8211: +case 8212: +case 8213: +case 8214: +case 8215: +case 8216: +case 8217: +case 8218: +case 8219: +case 8220: +case 8221: +case 8222: +case 8223: +case 8224: +case 8225: +case 8226: +case 8227: +case 8228: +case 8229: +case 8230: +case 8231: +case 8232: +case 8233: +case 8234: +case 8235: +case 8236: +case 8237: +case 8238: +case 8239: +case 8240: +case 8241: +case 8242: +case 8243: +case 8244: +case 8245: +case 8246: +case 8247: +case 8248: +case 8249: +case 8250: +case 8251: +case 8252: +case 8253: +case 8254: +case 8255: +case 8256: +case 8257: +case 8258: +case 8259: +case 8260: +case 8261: +case 8262: +case 8263: +case 8264: +case 8265: +case 8266: +case 8267: +case 8268: +case 8269: +case 8270: +case 8271: +case 8272: +case 8273: +case 8274: +case 8275: +case 8276: +case 8277: +case 8278: +case 8279: +case 8280: +case 8281: +case 8282: +case 8283: +case 8284: +case 8285: +case 8286: +case 8287: +case 8288: +case 8289: +case 8290: +case 8291: +case 8292: +case 8293: +case 8294: +case 8295: +case 8296: +case 8297: +case 8298: +case 8299: +case 8300: +case 8301: +case 8302: +case 8303: +case 8304: +case 8305: +case 8306: +case 8307: +case 8308: +case 8309: +case 8310: +case 8311: +case 8312: +case 8313: +case 8314: +case 8315: +case 8316: +case 8317: +case 8318: +case 8319: +case 8320: +case 8321: +case 8322: +case 8323: +case 8324: +case 8325: +case 8326: +case 8327: +case 8328: +case 8329: +case 8330: +case 8331: +case 8332: +case 8333: +case 8334: +case 8335: +case 8336: +case 8337: +case 8338: +case 8339: +case 8340: +case 8341: +case 8342: +case 8343: +case 8344: +case 8345: +case 8346: +case 8347: +case 8348: +case 8349: +case 8350: +case 8351: +case 8352: +case 8353: +case 8354: +case 8355: +case 8356: +case 8357: +case 8358: +case 8359: +case 8360: +case 8361: +case 8362: +case 8363: +case 8364: +case 8365: +case 8366: +case 8367: +case 8368: +case 8369: +case 8370: +case 8371: +case 8372: +case 8373: +case 8374: +case 8375: +case 8376: +case 8377: +case 8378: +case 8379: +case 8380: +case 8381: +case 8382: +case 8383: +case 8384: +case 8385: +case 8386: +case 8387: +case 8388: +case 8389: +case 8390: +case 8391: +case 8392: +case 8393: +case 8394: +case 8395: +case 8396: +case 8397: +case 8398: +case 8399: +case 8400: +case 8401: +case 8402: +case 8403: +case 8404: +case 8405: +case 8406: +case 8407: +case 8408: +case 8409: +case 8410: +case 8411: +case 8412: +case 8413: +case 8414: +case 8415: +case 8416: +case 8417: +case 8418: +case 8419: +case 8420: +case 8421: +case 8422: +case 8423: +case 8424: +case 8425: +case 8426: +case 8427: +case 8428: +case 8429: +case 8430: +case 8431: +case 8432: +case 8433: +case 8434: +case 8435: +case 8436: +case 8437: +case 8438: +case 8439: +case 8440: +case 8441: +case 8442: +case 8443: +case 8444: +case 8445: +case 8446: +case 8447: +case 8448: +case 8449: +case 8450: +case 8451: +case 8452: +case 8453: +case 8454: +case 8455: +case 8456: +case 8457: +case 8458: +case 8459: +case 8460: +case 8461: +case 8462: +case 8463: +case 8464: +case 8465: +case 8466: +case 8467: +case 8468: +case 8469: +case 8470: +case 8471: +case 8472: +case 8473: +case 8474: +case 8475: +case 8476: +case 8477: +case 8478: +case 8479: +case 8480: +case 8481: +case 8482: +case 8483: +case 8484: +case 8485: +case 8486: +case 8487: +case 8488: +case 8489: +case 8490: +case 8491: +case 8492: +case 8493: +case 8494: +case 8495: +case 8496: +case 8497: +case 8498: +case 8499: +case 8500: +case 8501: +case 8502: +case 8503: +case 8504: +case 8505: +case 8506: +case 8507: +case 8508: +case 8509: +case 8510: +case 8511: +case 8512: +case 8513: +case 8514: +case 8515: +case 8516: +case 8517: +case 8518: +case 8519: +case 8520: +case 8521: +case 8522: +case 8523: +case 8524: +case 8525: +case 8526: +case 8527: +case 8528: +case 8529: +case 8530: +case 8531: +case 8532: +case 8533: +case 8534: +case 8535: +case 8536: +case 8537: +case 8538: +case 8539: +case 8540: +case 8541: +case 8542: +case 8543: +case 8544: +case 8545: +case 8546: +case 8547: +case 8548: +case 8549: +case 8550: +case 8551: +case 8552: +case 8553: +case 8554: +case 8555: +case 8556: +case 8557: +case 8558: +case 8559: +case 8560: +case 8561: +case 8562: +case 8563: +case 8564: +case 8565: +case 8566: +case 8567: +case 8568: +case 8569: +case 8570: +case 8571: +case 8572: +case 8573: +case 8574: +case 8575: +case 8576: +case 8577: +case 8578: +case 8579: +case 8580: +case 8581: +case 8582: +case 8583: +case 8584: +case 8585: +case 8586: +case 8587: +case 8588: +case 8589: +case 8590: +case 8591: +case 8592: +case 8593: +case 8594: +case 8595: +case 8596: +case 8597: +case 8598: +case 8599: +case 8600: +case 8601: +case 8602: +case 8603: +case 8604: +case 8605: +case 8606: +case 8607: +case 8608: +case 8609: +case 8610: +case 8611: +case 8612: +case 8613: +case 8614: +case 8615: +case 8616: +case 8617: +case 8618: +case 8619: +case 8620: +case 8621: +case 8622: +case 8623: +case 8624: +case 8625: +case 8626: +case 8627: +case 8628: +case 8629: +case 8630: +case 8631: +case 8632: +case 8633: +case 8634: +case 8635: +case 8636: +case 8637: +case 8638: +case 8639: +case 8640: +case 8641: +case 8642: +case 8643: +case 8644: +case 8645: +case 8646: +case 8647: +case 8648: +case 8649: +case 8650: +case 8651: +case 8652: +case 8653: +case 8654: +case 8655: +case 8656: +case 8657: +case 8658: +case 8659: +case 8660: +case 8661: +case 8662: +case 8663: +case 8664: +case 8665: +case 8666: +case 8667: +case 8668: +case 8669: +case 8670: +case 8671: +case 8672: +case 8673: +case 8674: +case 8675: +case 8676: +case 8677: +case 8678: +case 8679: +case 8680: +case 8681: +case 8682: +case 8683: +case 8684: +case 8685: +case 8686: +case 8687: +case 8688: +case 8689: +case 8690: +case 8691: +case 8692: +case 8693: +case 8694: +case 8695: +case 8696: +case 8697: +case 8698: +case 8699: +case 8700: +case 8701: +case 8702: +case 8703: +case 8704: +case 8705: +case 8706: +case 8707: +case 8708: +case 8709: +case 8710: +case 8711: +case 8712: +case 8713: +case 8714: +case 8715: +case 8716: +case 8717: +case 8718: +case 8719: +case 8720: +case 8721: +case 8722: +case 8723: +case 8724: +case 8725: +case 8726: +case 8727: +case 8728: +case 8729: +case 8730: +case 8731: +case 8732: +case 8733: +case 8734: +case 8735: +case 8736: +case 8737: +case 8738: +case 8739: +case 8740: +case 8741: +case 8742: +case 8743: +case 8744: +case 8745: +case 8746: +case 8747: +case 8748: +case 8749: +case 8750: +case 8751: +case 8752: +case 8753: +case 8754: +case 8755: +case 8756: +case 8757: +case 8758: +case 8759: +case 8760: +case 8761: +case 8762: +case 8763: +case 8764: +case 8765: +case 8766: +case 8767: +case 8768: +case 8769: +case 8770: +case 8771: +case 8772: +case 8773: +case 8774: +case 8775: +case 8776: +case 8777: +case 8778: +case 8779: +case 8780: +case 8781: +case 8782: +case 8783: +case 8784: +case 8785: +case 8786: +case 8787: +case 8788: +case 8789: +case 8790: +case 8791: +case 8792: +case 8793: +case 8794: +case 8795: +case 8796: +case 8797: +case 8798: +case 8799: +case 8800: +case 8801: +case 8802: +case 8803: +case 8804: +case 8805: +case 8806: +case 8807: +case 8808: +case 8809: +case 8810: +case 8811: +case 8812: +case 8813: +case 8814: +case 8815: +case 8816: +case 8817: +case 8818: +case 8819: +case 8820: +case 8821: +case 8822: +case 8823: +case 8824: +case 8825: +case 8826: +case 8827: +case 8828: +case 8829: +case 8830: +case 8831: +case 8832: +case 8833: +case 8834: +case 8835: +case 8836: +case 8837: +case 8838: +case 8839: +case 8840: +case 8841: +case 8842: +case 8843: +case 8844: +case 8845: +case 8846: +case 8847: +case 8848: +case 8849: +case 8850: +case 8851: +case 8852: +case 8853: +case 8854: +case 8855: +case 8856: +case 8857: +case 8858: +case 8859: +case 8860: +case 8861: +case 8862: +case 8863: +case 8864: +case 8865: +case 8866: +case 8867: +case 8868: +case 8869: +case 8870: +case 8871: +case 8872: +case 8873: +case 8874: +case 8875: +case 8876: +case 8877: +case 8878: +case 8879: +case 8880: +case 8881: +case 8882: +case 8883: +case 8884: +case 8885: +case 8886: +case 8887: +case 8888: +case 8889: +case 8890: +case 8891: +case 8892: +case 8893: +case 8894: +case 8895: +case 8896: +case 8897: +case 8898: +case 8899: +case 8900: +case 8901: +case 8902: +case 8903: +case 8904: +case 8905: +case 8906: +case 8907: +case 8908: +case 8909: +case 8910: +case 8911: +case 8912: +case 8913: +case 8914: +case 8915: +case 8916: +case 8917: +case 8918: +case 8919: +case 8920: +case 8921: +case 8922: +case 8923: +case 8924: +case 8925: +case 8926: +case 8927: +case 8928: +case 8929: +case 8930: +case 8931: +case 8932: +case 8933: +case 8934: +case 8935: +case 8936: +case 8937: +case 8938: +case 8939: +case 8940: +case 8941: +case 8942: +case 8943: +case 8944: +case 8945: +case 8946: +case 8947: +case 8948: +case 8949: +case 8950: +case 8951: +case 8952: +case 8953: +case 8954: +case 8955: +case 8956: +case 8957: +case 8958: +case 8959: +case 8960: +case 8961: +case 8962: +case 8963: +case 8964: +case 8965: +case 8966: +case 8967: +case 8968: +case 8969: +case 8970: +case 8971: +case 8972: +case 8973: +case 8974: +case 8975: +case 8976: +case 8977: +case 8978: +case 8979: +case 8980: +case 8981: +case 8982: +case 8983: +case 8984: +case 8985: +case 8986: +case 8987: +case 8988: +case 8989: +case 8990: +case 8991: +case 8992: +case 8993: +case 8994: +case 8995: +case 8996: +case 8997: +case 8998: +case 8999: + actual += 'a'; +} +expect = 'a'; +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/Statements/regress-74474-003.js b/js/src/tests/ecma_3/Statements/regress-74474-003.js new file mode 100644 index 000000000..f944ed59f --- /dev/null +++ b/js/src/tests/ecma_3/Statements/regress-74474-003.js @@ -0,0 +1,9065 @@ +/* -*- 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: 09 May 2001 + * + * SUMMARY: Regression test for Bugzilla bug 74474 + * "switch() misbehaves with duplicated labels" + * + * See http://bugzilla.mozilla.org/show_bug.cgi?id=74474 + * See ECMA3 Section 12.11, "The switch Statement" + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = 74474; +var summary = 'Test of switch statement that overflows the stack-allocated bitmap'; +var status = '(One duplicated label [8998])'; +var statusitems = [ ]; +var actual = ''; +var actualvalues = [ ]; +var expect= ''; +var expectedvalues = [ ]; +var x = 3; + + +switch (x) +{ +case 0: +case 1: +case 2: +case 3: +case 4: +case 5: +case 6: +case 7: +case 8: +case 9: +case 10: +case 11: +case 12: +case 13: +case 14: +case 15: +case 16: +case 17: +case 18: +case 19: +case 20: +case 21: +case 22: +case 23: +case 24: +case 25: +case 26: +case 27: +case 28: +case 29: +case 30: +case 31: +case 32: +case 33: +case 34: +case 35: +case 36: +case 37: +case 38: +case 39: +case 40: +case 41: +case 42: +case 43: +case 44: +case 45: +case 46: +case 47: +case 48: +case 49: +case 50: +case 51: +case 52: +case 53: +case 54: +case 55: +case 56: +case 57: +case 58: +case 59: +case 60: +case 61: +case 62: +case 63: +case 64: +case 65: +case 66: +case 67: +case 68: +case 69: +case 70: +case 71: +case 72: +case 73: +case 74: +case 75: +case 76: +case 77: +case 78: +case 79: +case 80: +case 81: +case 82: +case 83: +case 84: +case 85: +case 86: +case 87: +case 88: +case 89: +case 90: +case 91: +case 92: +case 93: +case 94: +case 95: +case 96: +case 97: +case 98: +case 99: +case 100: +case 101: +case 102: +case 103: +case 104: +case 105: +case 106: +case 107: +case 108: +case 109: +case 110: +case 111: +case 112: +case 113: +case 114: +case 115: +case 116: +case 117: +case 118: +case 119: +case 120: +case 121: +case 122: +case 123: +case 124: +case 125: +case 126: +case 127: +case 128: +case 129: +case 130: +case 131: +case 132: +case 133: +case 134: +case 135: +case 136: +case 137: +case 138: +case 139: +case 140: +case 141: +case 142: +case 143: +case 144: +case 145: +case 146: +case 147: +case 148: +case 149: +case 150: +case 151: +case 152: +case 153: +case 154: +case 155: +case 156: +case 157: +case 158: +case 159: +case 160: +case 161: +case 162: +case 163: +case 164: +case 165: +case 166: +case 167: +case 168: +case 169: +case 170: +case 171: +case 172: +case 173: +case 174: +case 175: +case 176: +case 177: +case 178: +case 179: +case 180: +case 181: +case 182: +case 183: +case 184: +case 185: +case 186: +case 187: +case 188: +case 189: +case 190: +case 191: +case 192: +case 193: +case 194: +case 195: +case 196: +case 197: +case 198: +case 199: +case 200: +case 201: +case 202: +case 203: +case 204: +case 205: +case 206: +case 207: +case 208: +case 209: +case 210: +case 211: +case 212: +case 213: +case 214: +case 215: +case 216: +case 217: +case 218: +case 219: +case 220: +case 221: +case 222: +case 223: +case 224: +case 225: +case 226: +case 227: +case 228: +case 229: +case 230: +case 231: +case 232: +case 233: +case 234: +case 235: +case 236: +case 237: +case 238: +case 239: +case 240: +case 241: +case 242: +case 243: +case 244: +case 245: +case 246: +case 247: +case 248: +case 249: +case 250: +case 251: +case 252: +case 253: +case 254: +case 255: +case 256: +case 257: +case 258: +case 259: +case 260: +case 261: +case 262: +case 263: +case 264: +case 265: +case 266: +case 267: +case 268: +case 269: +case 270: +case 271: +case 272: +case 273: +case 274: +case 275: +case 276: +case 277: +case 278: +case 279: +case 280: +case 281: +case 282: +case 283: +case 284: +case 285: +case 286: +case 287: +case 288: +case 289: +case 290: +case 291: +case 292: +case 293: +case 294: +case 295: +case 296: +case 297: +case 298: +case 299: +case 300: +case 301: +case 302: +case 303: +case 304: +case 305: +case 306: +case 307: +case 308: +case 309: +case 310: +case 311: +case 312: +case 313: +case 314: +case 315: +case 316: +case 317: +case 318: +case 319: +case 320: +case 321: +case 322: +case 323: +case 324: +case 325: +case 326: +case 327: +case 328: +case 329: +case 330: +case 331: +case 332: +case 333: +case 334: +case 335: +case 336: +case 337: +case 338: +case 339: +case 340: +case 341: +case 342: +case 343: +case 344: +case 345: +case 346: +case 347: +case 348: +case 349: +case 350: +case 351: +case 352: +case 353: +case 354: +case 355: +case 356: +case 357: +case 358: +case 359: +case 360: +case 361: +case 362: +case 363: +case 364: +case 365: +case 366: +case 367: +case 368: +case 369: +case 370: +case 371: +case 372: +case 373: +case 374: +case 375: +case 376: +case 377: +case 378: +case 379: +case 380: +case 381: +case 382: +case 383: +case 384: +case 385: +case 386: +case 387: +case 388: +case 389: +case 390: +case 391: +case 392: +case 393: +case 394: +case 395: +case 396: +case 397: +case 398: +case 399: +case 400: +case 401: +case 402: +case 403: +case 404: +case 405: +case 406: +case 407: +case 408: +case 409: +case 410: +case 411: +case 412: +case 413: +case 414: +case 415: +case 416: +case 417: +case 418: +case 419: +case 420: +case 421: +case 422: +case 423: +case 424: +case 425: +case 426: +case 427: +case 428: +case 429: +case 430: +case 431: +case 432: +case 433: +case 434: +case 435: +case 436: +case 437: +case 438: +case 439: +case 440: +case 441: +case 442: +case 443: +case 444: +case 445: +case 446: +case 447: +case 448: +case 449: +case 450: +case 451: +case 452: +case 453: +case 454: +case 455: +case 456: +case 457: +case 458: +case 459: +case 460: +case 461: +case 462: +case 463: +case 464: +case 465: +case 466: +case 467: +case 468: +case 469: +case 470: +case 471: +case 472: +case 473: +case 474: +case 475: +case 476: +case 477: +case 478: +case 479: +case 480: +case 481: +case 482: +case 483: +case 484: +case 485: +case 486: +case 487: +case 488: +case 489: +case 490: +case 491: +case 492: +case 493: +case 494: +case 495: +case 496: +case 497: +case 498: +case 499: +case 500: +case 501: +case 502: +case 503: +case 504: +case 505: +case 506: +case 507: +case 508: +case 509: +case 510: +case 511: +case 512: +case 513: +case 514: +case 515: +case 516: +case 517: +case 518: +case 519: +case 520: +case 521: +case 522: +case 523: +case 524: +case 525: +case 526: +case 527: +case 528: +case 529: +case 530: +case 531: +case 532: +case 533: +case 534: +case 535: +case 536: +case 537: +case 538: +case 539: +case 540: +case 541: +case 542: +case 543: +case 544: +case 545: +case 546: +case 547: +case 548: +case 549: +case 550: +case 551: +case 552: +case 553: +case 554: +case 555: +case 556: +case 557: +case 558: +case 559: +case 560: +case 561: +case 562: +case 563: +case 564: +case 565: +case 566: +case 567: +case 568: +case 569: +case 570: +case 571: +case 572: +case 573: +case 574: +case 575: +case 576: +case 577: +case 578: +case 579: +case 580: +case 581: +case 582: +case 583: +case 584: +case 585: +case 586: +case 587: +case 588: +case 589: +case 590: +case 591: +case 592: +case 593: +case 594: +case 595: +case 596: +case 597: +case 598: +case 599: +case 600: +case 601: +case 602: +case 603: +case 604: +case 605: +case 606: +case 607: +case 608: +case 609: +case 610: +case 611: +case 612: +case 613: +case 614: +case 615: +case 616: +case 617: +case 618: +case 619: +case 620: +case 621: +case 622: +case 623: +case 624: +case 625: +case 626: +case 627: +case 628: +case 629: +case 630: +case 631: +case 632: +case 633: +case 634: +case 635: +case 636: +case 637: +case 638: +case 639: +case 640: +case 641: +case 642: +case 643: +case 644: +case 645: +case 646: +case 647: +case 648: +case 649: +case 650: +case 651: +case 652: +case 653: +case 654: +case 655: +case 656: +case 657: +case 658: +case 659: +case 660: +case 661: +case 662: +case 663: +case 664: +case 665: +case 666: +case 667: +case 668: +case 669: +case 670: +case 671: +case 672: +case 673: +case 674: +case 675: +case 676: +case 677: +case 678: +case 679: +case 680: +case 681: +case 682: +case 683: +case 684: +case 685: +case 686: +case 687: +case 688: +case 689: +case 690: +case 691: +case 692: +case 693: +case 694: +case 695: +case 696: +case 697: +case 698: +case 699: +case 700: +case 701: +case 702: +case 703: +case 704: +case 705: +case 706: +case 707: +case 708: +case 709: +case 710: +case 711: +case 712: +case 713: +case 714: +case 715: +case 716: +case 717: +case 718: +case 719: +case 720: +case 721: +case 722: +case 723: +case 724: +case 725: +case 726: +case 727: +case 728: +case 729: +case 730: +case 731: +case 732: +case 733: +case 734: +case 735: +case 736: +case 737: +case 738: +case 739: +case 740: +case 741: +case 742: +case 743: +case 744: +case 745: +case 746: +case 747: +case 748: +case 749: +case 750: +case 751: +case 752: +case 753: +case 754: +case 755: +case 756: +case 757: +case 758: +case 759: +case 760: +case 761: +case 762: +case 763: +case 764: +case 765: +case 766: +case 767: +case 768: +case 769: +case 770: +case 771: +case 772: +case 773: +case 774: +case 775: +case 776: +case 777: +case 778: +case 779: +case 780: +case 781: +case 782: +case 783: +case 784: +case 785: +case 786: +case 787: +case 788: +case 789: +case 790: +case 791: +case 792: +case 793: +case 794: +case 795: +case 796: +case 797: +case 798: +case 799: +case 800: +case 801: +case 802: +case 803: +case 804: +case 805: +case 806: +case 807: +case 808: +case 809: +case 810: +case 811: +case 812: +case 813: +case 814: +case 815: +case 816: +case 817: +case 818: +case 819: +case 820: +case 821: +case 822: +case 823: +case 824: +case 825: +case 826: +case 827: +case 828: +case 829: +case 830: +case 831: +case 832: +case 833: +case 834: +case 835: +case 836: +case 837: +case 838: +case 839: +case 840: +case 841: +case 842: +case 843: +case 844: +case 845: +case 846: +case 847: +case 848: +case 849: +case 850: +case 851: +case 852: +case 853: +case 854: +case 855: +case 856: +case 857: +case 858: +case 859: +case 860: +case 861: +case 862: +case 863: +case 864: +case 865: +case 866: +case 867: +case 868: +case 869: +case 870: +case 871: +case 872: +case 873: +case 874: +case 875: +case 876: +case 877: +case 878: +case 879: +case 880: +case 881: +case 882: +case 883: +case 884: +case 885: +case 886: +case 887: +case 888: +case 889: +case 890: +case 891: +case 892: +case 893: +case 894: +case 895: +case 896: +case 897: +case 898: +case 899: +case 900: +case 901: +case 902: +case 903: +case 904: +case 905: +case 906: +case 907: +case 908: +case 909: +case 910: +case 911: +case 912: +case 913: +case 914: +case 915: +case 916: +case 917: +case 918: +case 919: +case 920: +case 921: +case 922: +case 923: +case 924: +case 925: +case 926: +case 927: +case 928: +case 929: +case 930: +case 931: +case 932: +case 933: +case 934: +case 935: +case 936: +case 937: +case 938: +case 939: +case 940: +case 941: +case 942: +case 943: +case 944: +case 945: +case 946: +case 947: +case 948: +case 949: +case 950: +case 951: +case 952: +case 953: +case 954: +case 955: +case 956: +case 957: +case 958: +case 959: +case 960: +case 961: +case 962: +case 963: +case 964: +case 965: +case 966: +case 967: +case 968: +case 969: +case 970: +case 971: +case 972: +case 973: +case 974: +case 975: +case 976: +case 977: +case 978: +case 979: +case 980: +case 981: +case 982: +case 983: +case 984: +case 985: +case 986: +case 987: +case 988: +case 989: +case 990: +case 991: +case 992: +case 993: +case 994: +case 995: +case 996: +case 997: +case 998: +case 999: +case 1000: +case 1001: +case 1002: +case 1003: +case 1004: +case 1005: +case 1006: +case 1007: +case 1008: +case 1009: +case 1010: +case 1011: +case 1012: +case 1013: +case 1014: +case 1015: +case 1016: +case 1017: +case 1018: +case 1019: +case 1020: +case 1021: +case 1022: +case 1023: +case 1024: +case 1025: +case 1026: +case 1027: +case 1028: +case 1029: +case 1030: +case 1031: +case 1032: +case 1033: +case 1034: +case 1035: +case 1036: +case 1037: +case 1038: +case 1039: +case 1040: +case 1041: +case 1042: +case 1043: +case 1044: +case 1045: +case 1046: +case 1047: +case 1048: +case 1049: +case 1050: +case 1051: +case 1052: +case 1053: +case 1054: +case 1055: +case 1056: +case 1057: +case 1058: +case 1059: +case 1060: +case 1061: +case 1062: +case 1063: +case 1064: +case 1065: +case 1066: +case 1067: +case 1068: +case 1069: +case 1070: +case 1071: +case 1072: +case 1073: +case 1074: +case 1075: +case 1076: +case 1077: +case 1078: +case 1079: +case 1080: +case 1081: +case 1082: +case 1083: +case 1084: +case 1085: +case 1086: +case 1087: +case 1088: +case 1089: +case 1090: +case 1091: +case 1092: +case 1093: +case 1094: +case 1095: +case 1096: +case 1097: +case 1098: +case 1099: +case 1100: +case 1101: +case 1102: +case 1103: +case 1104: +case 1105: +case 1106: +case 1107: +case 1108: +case 1109: +case 1110: +case 1111: +case 1112: +case 1113: +case 1114: +case 1115: +case 1116: +case 1117: +case 1118: +case 1119: +case 1120: +case 1121: +case 1122: +case 1123: +case 1124: +case 1125: +case 1126: +case 1127: +case 1128: +case 1129: +case 1130: +case 1131: +case 1132: +case 1133: +case 1134: +case 1135: +case 1136: +case 1137: +case 1138: +case 1139: +case 1140: +case 1141: +case 1142: +case 1143: +case 1144: +case 1145: +case 1146: +case 1147: +case 1148: +case 1149: +case 1150: +case 1151: +case 1152: +case 1153: +case 1154: +case 1155: +case 1156: +case 1157: +case 1158: +case 1159: +case 1160: +case 1161: +case 1162: +case 1163: +case 1164: +case 1165: +case 1166: +case 1167: +case 1168: +case 1169: +case 1170: +case 1171: +case 1172: +case 1173: +case 1174: +case 1175: +case 1176: +case 1177: +case 1178: +case 1179: +case 1180: +case 1181: +case 1182: +case 1183: +case 1184: +case 1185: +case 1186: +case 1187: +case 1188: +case 1189: +case 1190: +case 1191: +case 1192: +case 1193: +case 1194: +case 1195: +case 1196: +case 1197: +case 1198: +case 1199: +case 1200: +case 1201: +case 1202: +case 1203: +case 1204: +case 1205: +case 1206: +case 1207: +case 1208: +case 1209: +case 1210: +case 1211: +case 1212: +case 1213: +case 1214: +case 1215: +case 1216: +case 1217: +case 1218: +case 1219: +case 1220: +case 1221: +case 1222: +case 1223: +case 1224: +case 1225: +case 1226: +case 1227: +case 1228: +case 1229: +case 1230: +case 1231: +case 1232: +case 1233: +case 1234: +case 1235: +case 1236: +case 1237: +case 1238: +case 1239: +case 1240: +case 1241: +case 1242: +case 1243: +case 1244: +case 1245: +case 1246: +case 1247: +case 1248: +case 1249: +case 1250: +case 1251: +case 1252: +case 1253: +case 1254: +case 1255: +case 1256: +case 1257: +case 1258: +case 1259: +case 1260: +case 1261: +case 1262: +case 1263: +case 1264: +case 1265: +case 1266: +case 1267: +case 1268: +case 1269: +case 1270: +case 1271: +case 1272: +case 1273: +case 1274: +case 1275: +case 1276: +case 1277: +case 1278: +case 1279: +case 1280: +case 1281: +case 1282: +case 1283: +case 1284: +case 1285: +case 1286: +case 1287: +case 1288: +case 1289: +case 1290: +case 1291: +case 1292: +case 1293: +case 1294: +case 1295: +case 1296: +case 1297: +case 1298: +case 1299: +case 1300: +case 1301: +case 1302: +case 1303: +case 1304: +case 1305: +case 1306: +case 1307: +case 1308: +case 1309: +case 1310: +case 1311: +case 1312: +case 1313: +case 1314: +case 1315: +case 1316: +case 1317: +case 1318: +case 1319: +case 1320: +case 1321: +case 1322: +case 1323: +case 1324: +case 1325: +case 1326: +case 1327: +case 1328: +case 1329: +case 1330: +case 1331: +case 1332: +case 1333: +case 1334: +case 1335: +case 1336: +case 1337: +case 1338: +case 1339: +case 1340: +case 1341: +case 1342: +case 1343: +case 1344: +case 1345: +case 1346: +case 1347: +case 1348: +case 1349: +case 1350: +case 1351: +case 1352: +case 1353: +case 1354: +case 1355: +case 1356: +case 1357: +case 1358: +case 1359: +case 1360: +case 1361: +case 1362: +case 1363: +case 1364: +case 1365: +case 1366: +case 1367: +case 1368: +case 1369: +case 1370: +case 1371: +case 1372: +case 1373: +case 1374: +case 1375: +case 1376: +case 1377: +case 1378: +case 1379: +case 1380: +case 1381: +case 1382: +case 1383: +case 1384: +case 1385: +case 1386: +case 1387: +case 1388: +case 1389: +case 1390: +case 1391: +case 1392: +case 1393: +case 1394: +case 1395: +case 1396: +case 1397: +case 1398: +case 1399: +case 1400: +case 1401: +case 1402: +case 1403: +case 1404: +case 1405: +case 1406: +case 1407: +case 1408: +case 1409: +case 1410: +case 1411: +case 1412: +case 1413: +case 1414: +case 1415: +case 1416: +case 1417: +case 1418: +case 1419: +case 1420: +case 1421: +case 1422: +case 1423: +case 1424: +case 1425: +case 1426: +case 1427: +case 1428: +case 1429: +case 1430: +case 1431: +case 1432: +case 1433: +case 1434: +case 1435: +case 1436: +case 1437: +case 1438: +case 1439: +case 1440: +case 1441: +case 1442: +case 1443: +case 1444: +case 1445: +case 1446: +case 1447: +case 1448: +case 1449: +case 1450: +case 1451: +case 1452: +case 1453: +case 1454: +case 1455: +case 1456: +case 1457: +case 1458: +case 1459: +case 1460: +case 1461: +case 1462: +case 1463: +case 1464: +case 1465: +case 1466: +case 1467: +case 1468: +case 1469: +case 1470: +case 1471: +case 1472: +case 1473: +case 1474: +case 1475: +case 1476: +case 1477: +case 1478: +case 1479: +case 1480: +case 1481: +case 1482: +case 1483: +case 1484: +case 1485: +case 1486: +case 1487: +case 1488: +case 1489: +case 1490: +case 1491: +case 1492: +case 1493: +case 1494: +case 1495: +case 1496: +case 1497: +case 1498: +case 1499: +case 1500: +case 1501: +case 1502: +case 1503: +case 1504: +case 1505: +case 1506: +case 1507: +case 1508: +case 1509: +case 1510: +case 1511: +case 1512: +case 1513: +case 1514: +case 1515: +case 1516: +case 1517: +case 1518: +case 1519: +case 1520: +case 1521: +case 1522: +case 1523: +case 1524: +case 1525: +case 1526: +case 1527: +case 1528: +case 1529: +case 1530: +case 1531: +case 1532: +case 1533: +case 1534: +case 1535: +case 1536: +case 1537: +case 1538: +case 1539: +case 1540: +case 1541: +case 1542: +case 1543: +case 1544: +case 1545: +case 1546: +case 1547: +case 1548: +case 1549: +case 1550: +case 1551: +case 1552: +case 1553: +case 1554: +case 1555: +case 1556: +case 1557: +case 1558: +case 1559: +case 1560: +case 1561: +case 1562: +case 1563: +case 1564: +case 1565: +case 1566: +case 1567: +case 1568: +case 1569: +case 1570: +case 1571: +case 1572: +case 1573: +case 1574: +case 1575: +case 1576: +case 1577: +case 1578: +case 1579: +case 1580: +case 1581: +case 1582: +case 1583: +case 1584: +case 1585: +case 1586: +case 1587: +case 1588: +case 1589: +case 1590: +case 1591: +case 1592: +case 1593: +case 1594: +case 1595: +case 1596: +case 1597: +case 1598: +case 1599: +case 1600: +case 1601: +case 1602: +case 1603: +case 1604: +case 1605: +case 1606: +case 1607: +case 1608: +case 1609: +case 1610: +case 1611: +case 1612: +case 1613: +case 1614: +case 1615: +case 1616: +case 1617: +case 1618: +case 1619: +case 1620: +case 1621: +case 1622: +case 1623: +case 1624: +case 1625: +case 1626: +case 1627: +case 1628: +case 1629: +case 1630: +case 1631: +case 1632: +case 1633: +case 1634: +case 1635: +case 1636: +case 1637: +case 1638: +case 1639: +case 1640: +case 1641: +case 1642: +case 1643: +case 1644: +case 1645: +case 1646: +case 1647: +case 1648: +case 1649: +case 1650: +case 1651: +case 1652: +case 1653: +case 1654: +case 1655: +case 1656: +case 1657: +case 1658: +case 1659: +case 1660: +case 1661: +case 1662: +case 1663: +case 1664: +case 1665: +case 1666: +case 1667: +case 1668: +case 1669: +case 1670: +case 1671: +case 1672: +case 1673: +case 1674: +case 1675: +case 1676: +case 1677: +case 1678: +case 1679: +case 1680: +case 1681: +case 1682: +case 1683: +case 1684: +case 1685: +case 1686: +case 1687: +case 1688: +case 1689: +case 1690: +case 1691: +case 1692: +case 1693: +case 1694: +case 1695: +case 1696: +case 1697: +case 1698: +case 1699: +case 1700: +case 1701: +case 1702: +case 1703: +case 1704: +case 1705: +case 1706: +case 1707: +case 1708: +case 1709: +case 1710: +case 1711: +case 1712: +case 1713: +case 1714: +case 1715: +case 1716: +case 1717: +case 1718: +case 1719: +case 1720: +case 1721: +case 1722: +case 1723: +case 1724: +case 1725: +case 1726: +case 1727: +case 1728: +case 1729: +case 1730: +case 1731: +case 1732: +case 1733: +case 1734: +case 1735: +case 1736: +case 1737: +case 1738: +case 1739: +case 1740: +case 1741: +case 1742: +case 1743: +case 1744: +case 1745: +case 1746: +case 1747: +case 1748: +case 1749: +case 1750: +case 1751: +case 1752: +case 1753: +case 1754: +case 1755: +case 1756: +case 1757: +case 1758: +case 1759: +case 1760: +case 1761: +case 1762: +case 1763: +case 1764: +case 1765: +case 1766: +case 1767: +case 1768: +case 1769: +case 1770: +case 1771: +case 1772: +case 1773: +case 1774: +case 1775: +case 1776: +case 1777: +case 1778: +case 1779: +case 1780: +case 1781: +case 1782: +case 1783: +case 1784: +case 1785: +case 1786: +case 1787: +case 1788: +case 1789: +case 1790: +case 1791: +case 1792: +case 1793: +case 1794: +case 1795: +case 1796: +case 1797: +case 1798: +case 1799: +case 1800: +case 1801: +case 1802: +case 1803: +case 1804: +case 1805: +case 1806: +case 1807: +case 1808: +case 1809: +case 1810: +case 1811: +case 1812: +case 1813: +case 1814: +case 1815: +case 1816: +case 1817: +case 1818: +case 1819: +case 1820: +case 1821: +case 1822: +case 1823: +case 1824: +case 1825: +case 1826: +case 1827: +case 1828: +case 1829: +case 1830: +case 1831: +case 1832: +case 1833: +case 1834: +case 1835: +case 1836: +case 1837: +case 1838: +case 1839: +case 1840: +case 1841: +case 1842: +case 1843: +case 1844: +case 1845: +case 1846: +case 1847: +case 1848: +case 1849: +case 1850: +case 1851: +case 1852: +case 1853: +case 1854: +case 1855: +case 1856: +case 1857: +case 1858: +case 1859: +case 1860: +case 1861: +case 1862: +case 1863: +case 1864: +case 1865: +case 1866: +case 1867: +case 1868: +case 1869: +case 1870: +case 1871: +case 1872: +case 1873: +case 1874: +case 1875: +case 1876: +case 1877: +case 1878: +case 1879: +case 1880: +case 1881: +case 1882: +case 1883: +case 1884: +case 1885: +case 1886: +case 1887: +case 1888: +case 1889: +case 1890: +case 1891: +case 1892: +case 1893: +case 1894: +case 1895: +case 1896: +case 1897: +case 1898: +case 1899: +case 1900: +case 1901: +case 1902: +case 1903: +case 1904: +case 1905: +case 1906: +case 1907: +case 1908: +case 1909: +case 1910: +case 1911: +case 1912: +case 1913: +case 1914: +case 1915: +case 1916: +case 1917: +case 1918: +case 1919: +case 1920: +case 1921: +case 1922: +case 1923: +case 1924: +case 1925: +case 1926: +case 1927: +case 1928: +case 1929: +case 1930: +case 1931: +case 1932: +case 1933: +case 1934: +case 1935: +case 1936: +case 1937: +case 1938: +case 1939: +case 1940: +case 1941: +case 1942: +case 1943: +case 1944: +case 1945: +case 1946: +case 1947: +case 1948: +case 1949: +case 1950: +case 1951: +case 1952: +case 1953: +case 1954: +case 1955: +case 1956: +case 1957: +case 1958: +case 1959: +case 1960: +case 1961: +case 1962: +case 1963: +case 1964: +case 1965: +case 1966: +case 1967: +case 1968: +case 1969: +case 1970: +case 1971: +case 1972: +case 1973: +case 1974: +case 1975: +case 1976: +case 1977: +case 1978: +case 1979: +case 1980: +case 1981: +case 1982: +case 1983: +case 1984: +case 1985: +case 1986: +case 1987: +case 1988: +case 1989: +case 1990: +case 1991: +case 1992: +case 1993: +case 1994: +case 1995: +case 1996: +case 1997: +case 1998: +case 1999: +case 2000: +case 2001: +case 2002: +case 2003: +case 2004: +case 2005: +case 2006: +case 2007: +case 2008: +case 2009: +case 2010: +case 2011: +case 2012: +case 2013: +case 2014: +case 2015: +case 2016: +case 2017: +case 2018: +case 2019: +case 2020: +case 2021: +case 2022: +case 2023: +case 2024: +case 2025: +case 2026: +case 2027: +case 2028: +case 2029: +case 2030: +case 2031: +case 2032: +case 2033: +case 2034: +case 2035: +case 2036: +case 2037: +case 2038: +case 2039: +case 2040: +case 2041: +case 2042: +case 2043: +case 2044: +case 2045: +case 2046: +case 2047: +case 2048: +case 2049: +case 2050: +case 2051: +case 2052: +case 2053: +case 2054: +case 2055: +case 2056: +case 2057: +case 2058: +case 2059: +case 2060: +case 2061: +case 2062: +case 2063: +case 2064: +case 2065: +case 2066: +case 2067: +case 2068: +case 2069: +case 2070: +case 2071: +case 2072: +case 2073: +case 2074: +case 2075: +case 2076: +case 2077: +case 2078: +case 2079: +case 2080: +case 2081: +case 2082: +case 2083: +case 2084: +case 2085: +case 2086: +case 2087: +case 2088: +case 2089: +case 2090: +case 2091: +case 2092: +case 2093: +case 2094: +case 2095: +case 2096: +case 2097: +case 2098: +case 2099: +case 2100: +case 2101: +case 2102: +case 2103: +case 2104: +case 2105: +case 2106: +case 2107: +case 2108: +case 2109: +case 2110: +case 2111: +case 2112: +case 2113: +case 2114: +case 2115: +case 2116: +case 2117: +case 2118: +case 2119: +case 2120: +case 2121: +case 2122: +case 2123: +case 2124: +case 2125: +case 2126: +case 2127: +case 2128: +case 2129: +case 2130: +case 2131: +case 2132: +case 2133: +case 2134: +case 2135: +case 2136: +case 2137: +case 2138: +case 2139: +case 2140: +case 2141: +case 2142: +case 2143: +case 2144: +case 2145: +case 2146: +case 2147: +case 2148: +case 2149: +case 2150: +case 2151: +case 2152: +case 2153: +case 2154: +case 2155: +case 2156: +case 2157: +case 2158: +case 2159: +case 2160: +case 2161: +case 2162: +case 2163: +case 2164: +case 2165: +case 2166: +case 2167: +case 2168: +case 2169: +case 2170: +case 2171: +case 2172: +case 2173: +case 2174: +case 2175: +case 2176: +case 2177: +case 2178: +case 2179: +case 2180: +case 2181: +case 2182: +case 2183: +case 2184: +case 2185: +case 2186: +case 2187: +case 2188: +case 2189: +case 2190: +case 2191: +case 2192: +case 2193: +case 2194: +case 2195: +case 2196: +case 2197: +case 2198: +case 2199: +case 2200: +case 2201: +case 2202: +case 2203: +case 2204: +case 2205: +case 2206: +case 2207: +case 2208: +case 2209: +case 2210: +case 2211: +case 2212: +case 2213: +case 2214: +case 2215: +case 2216: +case 2217: +case 2218: +case 2219: +case 2220: +case 2221: +case 2222: +case 2223: +case 2224: +case 2225: +case 2226: +case 2227: +case 2228: +case 2229: +case 2230: +case 2231: +case 2232: +case 2233: +case 2234: +case 2235: +case 2236: +case 2237: +case 2238: +case 2239: +case 2240: +case 2241: +case 2242: +case 2243: +case 2244: +case 2245: +case 2246: +case 2247: +case 2248: +case 2249: +case 2250: +case 2251: +case 2252: +case 2253: +case 2254: +case 2255: +case 2256: +case 2257: +case 2258: +case 2259: +case 2260: +case 2261: +case 2262: +case 2263: +case 2264: +case 2265: +case 2266: +case 2267: +case 2268: +case 2269: +case 2270: +case 2271: +case 2272: +case 2273: +case 2274: +case 2275: +case 2276: +case 2277: +case 2278: +case 2279: +case 2280: +case 2281: +case 2282: +case 2283: +case 2284: +case 2285: +case 2286: +case 2287: +case 2288: +case 2289: +case 2290: +case 2291: +case 2292: +case 2293: +case 2294: +case 2295: +case 2296: +case 2297: +case 2298: +case 2299: +case 2300: +case 2301: +case 2302: +case 2303: +case 2304: +case 2305: +case 2306: +case 2307: +case 2308: +case 2309: +case 2310: +case 2311: +case 2312: +case 2313: +case 2314: +case 2315: +case 2316: +case 2317: +case 2318: +case 2319: +case 2320: +case 2321: +case 2322: +case 2323: +case 2324: +case 2325: +case 2326: +case 2327: +case 2328: +case 2329: +case 2330: +case 2331: +case 2332: +case 2333: +case 2334: +case 2335: +case 2336: +case 2337: +case 2338: +case 2339: +case 2340: +case 2341: +case 2342: +case 2343: +case 2344: +case 2345: +case 2346: +case 2347: +case 2348: +case 2349: +case 2350: +case 2351: +case 2352: +case 2353: +case 2354: +case 2355: +case 2356: +case 2357: +case 2358: +case 2359: +case 2360: +case 2361: +case 2362: +case 2363: +case 2364: +case 2365: +case 2366: +case 2367: +case 2368: +case 2369: +case 2370: +case 2371: +case 2372: +case 2373: +case 2374: +case 2375: +case 2376: +case 2377: +case 2378: +case 2379: +case 2380: +case 2381: +case 2382: +case 2383: +case 2384: +case 2385: +case 2386: +case 2387: +case 2388: +case 2389: +case 2390: +case 2391: +case 2392: +case 2393: +case 2394: +case 2395: +case 2396: +case 2397: +case 2398: +case 2399: +case 2400: +case 2401: +case 2402: +case 2403: +case 2404: +case 2405: +case 2406: +case 2407: +case 2408: +case 2409: +case 2410: +case 2411: +case 2412: +case 2413: +case 2414: +case 2415: +case 2416: +case 2417: +case 2418: +case 2419: +case 2420: +case 2421: +case 2422: +case 2423: +case 2424: +case 2425: +case 2426: +case 2427: +case 2428: +case 2429: +case 2430: +case 2431: +case 2432: +case 2433: +case 2434: +case 2435: +case 2436: +case 2437: +case 2438: +case 2439: +case 2440: +case 2441: +case 2442: +case 2443: +case 2444: +case 2445: +case 2446: +case 2447: +case 2448: +case 2449: +case 2450: +case 2451: +case 2452: +case 2453: +case 2454: +case 2455: +case 2456: +case 2457: +case 2458: +case 2459: +case 2460: +case 2461: +case 2462: +case 2463: +case 2464: +case 2465: +case 2466: +case 2467: +case 2468: +case 2469: +case 2470: +case 2471: +case 2472: +case 2473: +case 2474: +case 2475: +case 2476: +case 2477: +case 2478: +case 2479: +case 2480: +case 2481: +case 2482: +case 2483: +case 2484: +case 2485: +case 2486: +case 2487: +case 2488: +case 2489: +case 2490: +case 2491: +case 2492: +case 2493: +case 2494: +case 2495: +case 2496: +case 2497: +case 2498: +case 2499: +case 2500: +case 2501: +case 2502: +case 2503: +case 2504: +case 2505: +case 2506: +case 2507: +case 2508: +case 2509: +case 2510: +case 2511: +case 2512: +case 2513: +case 2514: +case 2515: +case 2516: +case 2517: +case 2518: +case 2519: +case 2520: +case 2521: +case 2522: +case 2523: +case 2524: +case 2525: +case 2526: +case 2527: +case 2528: +case 2529: +case 2530: +case 2531: +case 2532: +case 2533: +case 2534: +case 2535: +case 2536: +case 2537: +case 2538: +case 2539: +case 2540: +case 2541: +case 2542: +case 2543: +case 2544: +case 2545: +case 2546: +case 2547: +case 2548: +case 2549: +case 2550: +case 2551: +case 2552: +case 2553: +case 2554: +case 2555: +case 2556: +case 2557: +case 2558: +case 2559: +case 2560: +case 2561: +case 2562: +case 2563: +case 2564: +case 2565: +case 2566: +case 2567: +case 2568: +case 2569: +case 2570: +case 2571: +case 2572: +case 2573: +case 2574: +case 2575: +case 2576: +case 2577: +case 2578: +case 2579: +case 2580: +case 2581: +case 2582: +case 2583: +case 2584: +case 2585: +case 2586: +case 2587: +case 2588: +case 2589: +case 2590: +case 2591: +case 2592: +case 2593: +case 2594: +case 2595: +case 2596: +case 2597: +case 2598: +case 2599: +case 2600: +case 2601: +case 2602: +case 2603: +case 2604: +case 2605: +case 2606: +case 2607: +case 2608: +case 2609: +case 2610: +case 2611: +case 2612: +case 2613: +case 2614: +case 2615: +case 2616: +case 2617: +case 2618: +case 2619: +case 2620: +case 2621: +case 2622: +case 2623: +case 2624: +case 2625: +case 2626: +case 2627: +case 2628: +case 2629: +case 2630: +case 2631: +case 2632: +case 2633: +case 2634: +case 2635: +case 2636: +case 2637: +case 2638: +case 2639: +case 2640: +case 2641: +case 2642: +case 2643: +case 2644: +case 2645: +case 2646: +case 2647: +case 2648: +case 2649: +case 2650: +case 2651: +case 2652: +case 2653: +case 2654: +case 2655: +case 2656: +case 2657: +case 2658: +case 2659: +case 2660: +case 2661: +case 2662: +case 2663: +case 2664: +case 2665: +case 2666: +case 2667: +case 2668: +case 2669: +case 2670: +case 2671: +case 2672: +case 2673: +case 2674: +case 2675: +case 2676: +case 2677: +case 2678: +case 2679: +case 2680: +case 2681: +case 2682: +case 2683: +case 2684: +case 2685: +case 2686: +case 2687: +case 2688: +case 2689: +case 2690: +case 2691: +case 2692: +case 2693: +case 2694: +case 2695: +case 2696: +case 2697: +case 2698: +case 2699: +case 2700: +case 2701: +case 2702: +case 2703: +case 2704: +case 2705: +case 2706: +case 2707: +case 2708: +case 2709: +case 2710: +case 2711: +case 2712: +case 2713: +case 2714: +case 2715: +case 2716: +case 2717: +case 2718: +case 2719: +case 2720: +case 2721: +case 2722: +case 2723: +case 2724: +case 2725: +case 2726: +case 2727: +case 2728: +case 2729: +case 2730: +case 2731: +case 2732: +case 2733: +case 2734: +case 2735: +case 2736: +case 2737: +case 2738: +case 2739: +case 2740: +case 2741: +case 2742: +case 2743: +case 2744: +case 2745: +case 2746: +case 2747: +case 2748: +case 2749: +case 2750: +case 2751: +case 2752: +case 2753: +case 2754: +case 2755: +case 2756: +case 2757: +case 2758: +case 2759: +case 2760: +case 2761: +case 2762: +case 2763: +case 2764: +case 2765: +case 2766: +case 2767: +case 2768: +case 2769: +case 2770: +case 2771: +case 2772: +case 2773: +case 2774: +case 2775: +case 2776: +case 2777: +case 2778: +case 2779: +case 2780: +case 2781: +case 2782: +case 2783: +case 2784: +case 2785: +case 2786: +case 2787: +case 2788: +case 2789: +case 2790: +case 2791: +case 2792: +case 2793: +case 2794: +case 2795: +case 2796: +case 2797: +case 2798: +case 2799: +case 2800: +case 2801: +case 2802: +case 2803: +case 2804: +case 2805: +case 2806: +case 2807: +case 2808: +case 2809: +case 2810: +case 2811: +case 2812: +case 2813: +case 2814: +case 2815: +case 2816: +case 2817: +case 2818: +case 2819: +case 2820: +case 2821: +case 2822: +case 2823: +case 2824: +case 2825: +case 2826: +case 2827: +case 2828: +case 2829: +case 2830: +case 2831: +case 2832: +case 2833: +case 2834: +case 2835: +case 2836: +case 2837: +case 2838: +case 2839: +case 2840: +case 2841: +case 2842: +case 2843: +case 2844: +case 2845: +case 2846: +case 2847: +case 2848: +case 2849: +case 2850: +case 2851: +case 2852: +case 2853: +case 2854: +case 2855: +case 2856: +case 2857: +case 2858: +case 2859: +case 2860: +case 2861: +case 2862: +case 2863: +case 2864: +case 2865: +case 2866: +case 2867: +case 2868: +case 2869: +case 2870: +case 2871: +case 2872: +case 2873: +case 2874: +case 2875: +case 2876: +case 2877: +case 2878: +case 2879: +case 2880: +case 2881: +case 2882: +case 2883: +case 2884: +case 2885: +case 2886: +case 2887: +case 2888: +case 2889: +case 2890: +case 2891: +case 2892: +case 2893: +case 2894: +case 2895: +case 2896: +case 2897: +case 2898: +case 2899: +case 2900: +case 2901: +case 2902: +case 2903: +case 2904: +case 2905: +case 2906: +case 2907: +case 2908: +case 2909: +case 2910: +case 2911: +case 2912: +case 2913: +case 2914: +case 2915: +case 2916: +case 2917: +case 2918: +case 2919: +case 2920: +case 2921: +case 2922: +case 2923: +case 2924: +case 2925: +case 2926: +case 2927: +case 2928: +case 2929: +case 2930: +case 2931: +case 2932: +case 2933: +case 2934: +case 2935: +case 2936: +case 2937: +case 2938: +case 2939: +case 2940: +case 2941: +case 2942: +case 2943: +case 2944: +case 2945: +case 2946: +case 2947: +case 2948: +case 2949: +case 2950: +case 2951: +case 2952: +case 2953: +case 2954: +case 2955: +case 2956: +case 2957: +case 2958: +case 2959: +case 2960: +case 2961: +case 2962: +case 2963: +case 2964: +case 2965: +case 2966: +case 2967: +case 2968: +case 2969: +case 2970: +case 2971: +case 2972: +case 2973: +case 2974: +case 2975: +case 2976: +case 2977: +case 2978: +case 2979: +case 2980: +case 2981: +case 2982: +case 2983: +case 2984: +case 2985: +case 2986: +case 2987: +case 2988: +case 2989: +case 2990: +case 2991: +case 2992: +case 2993: +case 2994: +case 2995: +case 2996: +case 2997: +case 2998: +case 2999: +case 3000: +case 3001: +case 3002: +case 3003: +case 3004: +case 3005: +case 3006: +case 3007: +case 3008: +case 3009: +case 3010: +case 3011: +case 3012: +case 3013: +case 3014: +case 3015: +case 3016: +case 3017: +case 3018: +case 3019: +case 3020: +case 3021: +case 3022: +case 3023: +case 3024: +case 3025: +case 3026: +case 3027: +case 3028: +case 3029: +case 3030: +case 3031: +case 3032: +case 3033: +case 3034: +case 3035: +case 3036: +case 3037: +case 3038: +case 3039: +case 3040: +case 3041: +case 3042: +case 3043: +case 3044: +case 3045: +case 3046: +case 3047: +case 3048: +case 3049: +case 3050: +case 3051: +case 3052: +case 3053: +case 3054: +case 3055: +case 3056: +case 3057: +case 3058: +case 3059: +case 3060: +case 3061: +case 3062: +case 3063: +case 3064: +case 3065: +case 3066: +case 3067: +case 3068: +case 3069: +case 3070: +case 3071: +case 3072: +case 3073: +case 3074: +case 3075: +case 3076: +case 3077: +case 3078: +case 3079: +case 3080: +case 3081: +case 3082: +case 3083: +case 3084: +case 3085: +case 3086: +case 3087: +case 3088: +case 3089: +case 3090: +case 3091: +case 3092: +case 3093: +case 3094: +case 3095: +case 3096: +case 3097: +case 3098: +case 3099: +case 3100: +case 3101: +case 3102: +case 3103: +case 3104: +case 3105: +case 3106: +case 3107: +case 3108: +case 3109: +case 3110: +case 3111: +case 3112: +case 3113: +case 3114: +case 3115: +case 3116: +case 3117: +case 3118: +case 3119: +case 3120: +case 3121: +case 3122: +case 3123: +case 3124: +case 3125: +case 3126: +case 3127: +case 3128: +case 3129: +case 3130: +case 3131: +case 3132: +case 3133: +case 3134: +case 3135: +case 3136: +case 3137: +case 3138: +case 3139: +case 3140: +case 3141: +case 3142: +case 3143: +case 3144: +case 3145: +case 3146: +case 3147: +case 3148: +case 3149: +case 3150: +case 3151: +case 3152: +case 3153: +case 3154: +case 3155: +case 3156: +case 3157: +case 3158: +case 3159: +case 3160: +case 3161: +case 3162: +case 3163: +case 3164: +case 3165: +case 3166: +case 3167: +case 3168: +case 3169: +case 3170: +case 3171: +case 3172: +case 3173: +case 3174: +case 3175: +case 3176: +case 3177: +case 3178: +case 3179: +case 3180: +case 3181: +case 3182: +case 3183: +case 3184: +case 3185: +case 3186: +case 3187: +case 3188: +case 3189: +case 3190: +case 3191: +case 3192: +case 3193: +case 3194: +case 3195: +case 3196: +case 3197: +case 3198: +case 3199: +case 3200: +case 3201: +case 3202: +case 3203: +case 3204: +case 3205: +case 3206: +case 3207: +case 3208: +case 3209: +case 3210: +case 3211: +case 3212: +case 3213: +case 3214: +case 3215: +case 3216: +case 3217: +case 3218: +case 3219: +case 3220: +case 3221: +case 3222: +case 3223: +case 3224: +case 3225: +case 3226: +case 3227: +case 3228: +case 3229: +case 3230: +case 3231: +case 3232: +case 3233: +case 3234: +case 3235: +case 3236: +case 3237: +case 3238: +case 3239: +case 3240: +case 3241: +case 3242: +case 3243: +case 3244: +case 3245: +case 3246: +case 3247: +case 3248: +case 3249: +case 3250: +case 3251: +case 3252: +case 3253: +case 3254: +case 3255: +case 3256: +case 3257: +case 3258: +case 3259: +case 3260: +case 3261: +case 3262: +case 3263: +case 3264: +case 3265: +case 3266: +case 3267: +case 3268: +case 3269: +case 3270: +case 3271: +case 3272: +case 3273: +case 3274: +case 3275: +case 3276: +case 3277: +case 3278: +case 3279: +case 3280: +case 3281: +case 3282: +case 3283: +case 3284: +case 3285: +case 3286: +case 3287: +case 3288: +case 3289: +case 3290: +case 3291: +case 3292: +case 3293: +case 3294: +case 3295: +case 3296: +case 3297: +case 3298: +case 3299: +case 3300: +case 3301: +case 3302: +case 3303: +case 3304: +case 3305: +case 3306: +case 3307: +case 3308: +case 3309: +case 3310: +case 3311: +case 3312: +case 3313: +case 3314: +case 3315: +case 3316: +case 3317: +case 3318: +case 3319: +case 3320: +case 3321: +case 3322: +case 3323: +case 3324: +case 3325: +case 3326: +case 3327: +case 3328: +case 3329: +case 3330: +case 3331: +case 3332: +case 3333: +case 3334: +case 3335: +case 3336: +case 3337: +case 3338: +case 3339: +case 3340: +case 3341: +case 3342: +case 3343: +case 3344: +case 3345: +case 3346: +case 3347: +case 3348: +case 3349: +case 3350: +case 3351: +case 3352: +case 3353: +case 3354: +case 3355: +case 3356: +case 3357: +case 3358: +case 3359: +case 3360: +case 3361: +case 3362: +case 3363: +case 3364: +case 3365: +case 3366: +case 3367: +case 3368: +case 3369: +case 3370: +case 3371: +case 3372: +case 3373: +case 3374: +case 3375: +case 3376: +case 3377: +case 3378: +case 3379: +case 3380: +case 3381: +case 3382: +case 3383: +case 3384: +case 3385: +case 3386: +case 3387: +case 3388: +case 3389: +case 3390: +case 3391: +case 3392: +case 3393: +case 3394: +case 3395: +case 3396: +case 3397: +case 3398: +case 3399: +case 3400: +case 3401: +case 3402: +case 3403: +case 3404: +case 3405: +case 3406: +case 3407: +case 3408: +case 3409: +case 3410: +case 3411: +case 3412: +case 3413: +case 3414: +case 3415: +case 3416: +case 3417: +case 3418: +case 3419: +case 3420: +case 3421: +case 3422: +case 3423: +case 3424: +case 3425: +case 3426: +case 3427: +case 3428: +case 3429: +case 3430: +case 3431: +case 3432: +case 3433: +case 3434: +case 3435: +case 3436: +case 3437: +case 3438: +case 3439: +case 3440: +case 3441: +case 3442: +case 3443: +case 3444: +case 3445: +case 3446: +case 3447: +case 3448: +case 3449: +case 3450: +case 3451: +case 3452: +case 3453: +case 3454: +case 3455: +case 3456: +case 3457: +case 3458: +case 3459: +case 3460: +case 3461: +case 3462: +case 3463: +case 3464: +case 3465: +case 3466: +case 3467: +case 3468: +case 3469: +case 3470: +case 3471: +case 3472: +case 3473: +case 3474: +case 3475: +case 3476: +case 3477: +case 3478: +case 3479: +case 3480: +case 3481: +case 3482: +case 3483: +case 3484: +case 3485: +case 3486: +case 3487: +case 3488: +case 3489: +case 3490: +case 3491: +case 3492: +case 3493: +case 3494: +case 3495: +case 3496: +case 3497: +case 3498: +case 3499: +case 3500: +case 3501: +case 3502: +case 3503: +case 3504: +case 3505: +case 3506: +case 3507: +case 3508: +case 3509: +case 3510: +case 3511: +case 3512: +case 3513: +case 3514: +case 3515: +case 3516: +case 3517: +case 3518: +case 3519: +case 3520: +case 3521: +case 3522: +case 3523: +case 3524: +case 3525: +case 3526: +case 3527: +case 3528: +case 3529: +case 3530: +case 3531: +case 3532: +case 3533: +case 3534: +case 3535: +case 3536: +case 3537: +case 3538: +case 3539: +case 3540: +case 3541: +case 3542: +case 3543: +case 3544: +case 3545: +case 3546: +case 3547: +case 3548: +case 3549: +case 3550: +case 3551: +case 3552: +case 3553: +case 3554: +case 3555: +case 3556: +case 3557: +case 3558: +case 3559: +case 3560: +case 3561: +case 3562: +case 3563: +case 3564: +case 3565: +case 3566: +case 3567: +case 3568: +case 3569: +case 3570: +case 3571: +case 3572: +case 3573: +case 3574: +case 3575: +case 3576: +case 3577: +case 3578: +case 3579: +case 3580: +case 3581: +case 3582: +case 3583: +case 3584: +case 3585: +case 3586: +case 3587: +case 3588: +case 3589: +case 3590: +case 3591: +case 3592: +case 3593: +case 3594: +case 3595: +case 3596: +case 3597: +case 3598: +case 3599: +case 3600: +case 3601: +case 3602: +case 3603: +case 3604: +case 3605: +case 3606: +case 3607: +case 3608: +case 3609: +case 3610: +case 3611: +case 3612: +case 3613: +case 3614: +case 3615: +case 3616: +case 3617: +case 3618: +case 3619: +case 3620: +case 3621: +case 3622: +case 3623: +case 3624: +case 3625: +case 3626: +case 3627: +case 3628: +case 3629: +case 3630: +case 3631: +case 3632: +case 3633: +case 3634: +case 3635: +case 3636: +case 3637: +case 3638: +case 3639: +case 3640: +case 3641: +case 3642: +case 3643: +case 3644: +case 3645: +case 3646: +case 3647: +case 3648: +case 3649: +case 3650: +case 3651: +case 3652: +case 3653: +case 3654: +case 3655: +case 3656: +case 3657: +case 3658: +case 3659: +case 3660: +case 3661: +case 3662: +case 3663: +case 3664: +case 3665: +case 3666: +case 3667: +case 3668: +case 3669: +case 3670: +case 3671: +case 3672: +case 3673: +case 3674: +case 3675: +case 3676: +case 3677: +case 3678: +case 3679: +case 3680: +case 3681: +case 3682: +case 3683: +case 3684: +case 3685: +case 3686: +case 3687: +case 3688: +case 3689: +case 3690: +case 3691: +case 3692: +case 3693: +case 3694: +case 3695: +case 3696: +case 3697: +case 3698: +case 3699: +case 3700: +case 3701: +case 3702: +case 3703: +case 3704: +case 3705: +case 3706: +case 3707: +case 3708: +case 3709: +case 3710: +case 3711: +case 3712: +case 3713: +case 3714: +case 3715: +case 3716: +case 3717: +case 3718: +case 3719: +case 3720: +case 3721: +case 3722: +case 3723: +case 3724: +case 3725: +case 3726: +case 3727: +case 3728: +case 3729: +case 3730: +case 3731: +case 3732: +case 3733: +case 3734: +case 3735: +case 3736: +case 3737: +case 3738: +case 3739: +case 3740: +case 3741: +case 3742: +case 3743: +case 3744: +case 3745: +case 3746: +case 3747: +case 3748: +case 3749: +case 3750: +case 3751: +case 3752: +case 3753: +case 3754: +case 3755: +case 3756: +case 3757: +case 3758: +case 3759: +case 3760: +case 3761: +case 3762: +case 3763: +case 3764: +case 3765: +case 3766: +case 3767: +case 3768: +case 3769: +case 3770: +case 3771: +case 3772: +case 3773: +case 3774: +case 3775: +case 3776: +case 3777: +case 3778: +case 3779: +case 3780: +case 3781: +case 3782: +case 3783: +case 3784: +case 3785: +case 3786: +case 3787: +case 3788: +case 3789: +case 3790: +case 3791: +case 3792: +case 3793: +case 3794: +case 3795: +case 3796: +case 3797: +case 3798: +case 3799: +case 3800: +case 3801: +case 3802: +case 3803: +case 3804: +case 3805: +case 3806: +case 3807: +case 3808: +case 3809: +case 3810: +case 3811: +case 3812: +case 3813: +case 3814: +case 3815: +case 3816: +case 3817: +case 3818: +case 3819: +case 3820: +case 3821: +case 3822: +case 3823: +case 3824: +case 3825: +case 3826: +case 3827: +case 3828: +case 3829: +case 3830: +case 3831: +case 3832: +case 3833: +case 3834: +case 3835: +case 3836: +case 3837: +case 3838: +case 3839: +case 3840: +case 3841: +case 3842: +case 3843: +case 3844: +case 3845: +case 3846: +case 3847: +case 3848: +case 3849: +case 3850: +case 3851: +case 3852: +case 3853: +case 3854: +case 3855: +case 3856: +case 3857: +case 3858: +case 3859: +case 3860: +case 3861: +case 3862: +case 3863: +case 3864: +case 3865: +case 3866: +case 3867: +case 3868: +case 3869: +case 3870: +case 3871: +case 3872: +case 3873: +case 3874: +case 3875: +case 3876: +case 3877: +case 3878: +case 3879: +case 3880: +case 3881: +case 3882: +case 3883: +case 3884: +case 3885: +case 3886: +case 3887: +case 3888: +case 3889: +case 3890: +case 3891: +case 3892: +case 3893: +case 3894: +case 3895: +case 3896: +case 3897: +case 3898: +case 3899: +case 3900: +case 3901: +case 3902: +case 3903: +case 3904: +case 3905: +case 3906: +case 3907: +case 3908: +case 3909: +case 3910: +case 3911: +case 3912: +case 3913: +case 3914: +case 3915: +case 3916: +case 3917: +case 3918: +case 3919: +case 3920: +case 3921: +case 3922: +case 3923: +case 3924: +case 3925: +case 3926: +case 3927: +case 3928: +case 3929: +case 3930: +case 3931: +case 3932: +case 3933: +case 3934: +case 3935: +case 3936: +case 3937: +case 3938: +case 3939: +case 3940: +case 3941: +case 3942: +case 3943: +case 3944: +case 3945: +case 3946: +case 3947: +case 3948: +case 3949: +case 3950: +case 3951: +case 3952: +case 3953: +case 3954: +case 3955: +case 3956: +case 3957: +case 3958: +case 3959: +case 3960: +case 3961: +case 3962: +case 3963: +case 3964: +case 3965: +case 3966: +case 3967: +case 3968: +case 3969: +case 3970: +case 3971: +case 3972: +case 3973: +case 3974: +case 3975: +case 3976: +case 3977: +case 3978: +case 3979: +case 3980: +case 3981: +case 3982: +case 3983: +case 3984: +case 3985: +case 3986: +case 3987: +case 3988: +case 3989: +case 3990: +case 3991: +case 3992: +case 3993: +case 3994: +case 3995: +case 3996: +case 3997: +case 3998: +case 3999: +case 4000: +case 4001: +case 4002: +case 4003: +case 4004: +case 4005: +case 4006: +case 4007: +case 4008: +case 4009: +case 4010: +case 4011: +case 4012: +case 4013: +case 4014: +case 4015: +case 4016: +case 4017: +case 4018: +case 4019: +case 4020: +case 4021: +case 4022: +case 4023: +case 4024: +case 4025: +case 4026: +case 4027: +case 4028: +case 4029: +case 4030: +case 4031: +case 4032: +case 4033: +case 4034: +case 4035: +case 4036: +case 4037: +case 4038: +case 4039: +case 4040: +case 4041: +case 4042: +case 4043: +case 4044: +case 4045: +case 4046: +case 4047: +case 4048: +case 4049: +case 4050: +case 4051: +case 4052: +case 4053: +case 4054: +case 4055: +case 4056: +case 4057: +case 4058: +case 4059: +case 4060: +case 4061: +case 4062: +case 4063: +case 4064: +case 4065: +case 4066: +case 4067: +case 4068: +case 4069: +case 4070: +case 4071: +case 4072: +case 4073: +case 4074: +case 4075: +case 4076: +case 4077: +case 4078: +case 4079: +case 4080: +case 4081: +case 4082: +case 4083: +case 4084: +case 4085: +case 4086: +case 4087: +case 4088: +case 4089: +case 4090: +case 4091: +case 4092: +case 4093: +case 4094: +case 4095: +case 4096: +case 4097: +case 4098: +case 4099: +case 4100: +case 4101: +case 4102: +case 4103: +case 4104: +case 4105: +case 4106: +case 4107: +case 4108: +case 4109: +case 4110: +case 4111: +case 4112: +case 4113: +case 4114: +case 4115: +case 4116: +case 4117: +case 4118: +case 4119: +case 4120: +case 4121: +case 4122: +case 4123: +case 4124: +case 4125: +case 4126: +case 4127: +case 4128: +case 4129: +case 4130: +case 4131: +case 4132: +case 4133: +case 4134: +case 4135: +case 4136: +case 4137: +case 4138: +case 4139: +case 4140: +case 4141: +case 4142: +case 4143: +case 4144: +case 4145: +case 4146: +case 4147: +case 4148: +case 4149: +case 4150: +case 4151: +case 4152: +case 4153: +case 4154: +case 4155: +case 4156: +case 4157: +case 4158: +case 4159: +case 4160: +case 4161: +case 4162: +case 4163: +case 4164: +case 4165: +case 4166: +case 4167: +case 4168: +case 4169: +case 4170: +case 4171: +case 4172: +case 4173: +case 4174: +case 4175: +case 4176: +case 4177: +case 4178: +case 4179: +case 4180: +case 4181: +case 4182: +case 4183: +case 4184: +case 4185: +case 4186: +case 4187: +case 4188: +case 4189: +case 4190: +case 4191: +case 4192: +case 4193: +case 4194: +case 4195: +case 4196: +case 4197: +case 4198: +case 4199: +case 4200: +case 4201: +case 4202: +case 4203: +case 4204: +case 4205: +case 4206: +case 4207: +case 4208: +case 4209: +case 4210: +case 4211: +case 4212: +case 4213: +case 4214: +case 4215: +case 4216: +case 4217: +case 4218: +case 4219: +case 4220: +case 4221: +case 4222: +case 4223: +case 4224: +case 4225: +case 4226: +case 4227: +case 4228: +case 4229: +case 4230: +case 4231: +case 4232: +case 4233: +case 4234: +case 4235: +case 4236: +case 4237: +case 4238: +case 4239: +case 4240: +case 4241: +case 4242: +case 4243: +case 4244: +case 4245: +case 4246: +case 4247: +case 4248: +case 4249: +case 4250: +case 4251: +case 4252: +case 4253: +case 4254: +case 4255: +case 4256: +case 4257: +case 4258: +case 4259: +case 4260: +case 4261: +case 4262: +case 4263: +case 4264: +case 4265: +case 4266: +case 4267: +case 4268: +case 4269: +case 4270: +case 4271: +case 4272: +case 4273: +case 4274: +case 4275: +case 4276: +case 4277: +case 4278: +case 4279: +case 4280: +case 4281: +case 4282: +case 4283: +case 4284: +case 4285: +case 4286: +case 4287: +case 4288: +case 4289: +case 4290: +case 4291: +case 4292: +case 4293: +case 4294: +case 4295: +case 4296: +case 4297: +case 4298: +case 4299: +case 4300: +case 4301: +case 4302: +case 4303: +case 4304: +case 4305: +case 4306: +case 4307: +case 4308: +case 4309: +case 4310: +case 4311: +case 4312: +case 4313: +case 4314: +case 4315: +case 4316: +case 4317: +case 4318: +case 4319: +case 4320: +case 4321: +case 4322: +case 4323: +case 4324: +case 4325: +case 4326: +case 4327: +case 4328: +case 4329: +case 4330: +case 4331: +case 4332: +case 4333: +case 4334: +case 4335: +case 4336: +case 4337: +case 4338: +case 4339: +case 4340: +case 4341: +case 4342: +case 4343: +case 4344: +case 4345: +case 4346: +case 4347: +case 4348: +case 4349: +case 4350: +case 4351: +case 4352: +case 4353: +case 4354: +case 4355: +case 4356: +case 4357: +case 4358: +case 4359: +case 4360: +case 4361: +case 4362: +case 4363: +case 4364: +case 4365: +case 4366: +case 4367: +case 4368: +case 4369: +case 4370: +case 4371: +case 4372: +case 4373: +case 4374: +case 4375: +case 4376: +case 4377: +case 4378: +case 4379: +case 4380: +case 4381: +case 4382: +case 4383: +case 4384: +case 4385: +case 4386: +case 4387: +case 4388: +case 4389: +case 4390: +case 4391: +case 4392: +case 4393: +case 4394: +case 4395: +case 4396: +case 4397: +case 4398: +case 4399: +case 4400: +case 4401: +case 4402: +case 4403: +case 4404: +case 4405: +case 4406: +case 4407: +case 4408: +case 4409: +case 4410: +case 4411: +case 4412: +case 4413: +case 4414: +case 4415: +case 4416: +case 4417: +case 4418: +case 4419: +case 4420: +case 4421: +case 4422: +case 4423: +case 4424: +case 4425: +case 4426: +case 4427: +case 4428: +case 4429: +case 4430: +case 4431: +case 4432: +case 4433: +case 4434: +case 4435: +case 4436: +case 4437: +case 4438: +case 4439: +case 4440: +case 4441: +case 4442: +case 4443: +case 4444: +case 4445: +case 4446: +case 4447: +case 4448: +case 4449: +case 4450: +case 4451: +case 4452: +case 4453: +case 4454: +case 4455: +case 4456: +case 4457: +case 4458: +case 4459: +case 4460: +case 4461: +case 4462: +case 4463: +case 4464: +case 4465: +case 4466: +case 4467: +case 4468: +case 4469: +case 4470: +case 4471: +case 4472: +case 4473: +case 4474: +case 4475: +case 4476: +case 4477: +case 4478: +case 4479: +case 4480: +case 4481: +case 4482: +case 4483: +case 4484: +case 4485: +case 4486: +case 4487: +case 4488: +case 4489: +case 4490: +case 4491: +case 4492: +case 4493: +case 4494: +case 4495: +case 4496: +case 4497: +case 4498: +case 4499: +case 4500: +case 4501: +case 4502: +case 4503: +case 4504: +case 4505: +case 4506: +case 4507: +case 4508: +case 4509: +case 4510: +case 4511: +case 4512: +case 4513: +case 4514: +case 4515: +case 4516: +case 4517: +case 4518: +case 4519: +case 4520: +case 4521: +case 4522: +case 4523: +case 4524: +case 4525: +case 4526: +case 4527: +case 4528: +case 4529: +case 4530: +case 4531: +case 4532: +case 4533: +case 4534: +case 4535: +case 4536: +case 4537: +case 4538: +case 4539: +case 4540: +case 4541: +case 4542: +case 4543: +case 4544: +case 4545: +case 4546: +case 4547: +case 4548: +case 4549: +case 4550: +case 4551: +case 4552: +case 4553: +case 4554: +case 4555: +case 4556: +case 4557: +case 4558: +case 4559: +case 4560: +case 4561: +case 4562: +case 4563: +case 4564: +case 4565: +case 4566: +case 4567: +case 4568: +case 4569: +case 4570: +case 4571: +case 4572: +case 4573: +case 4574: +case 4575: +case 4576: +case 4577: +case 4578: +case 4579: +case 4580: +case 4581: +case 4582: +case 4583: +case 4584: +case 4585: +case 4586: +case 4587: +case 4588: +case 4589: +case 4590: +case 4591: +case 4592: +case 4593: +case 4594: +case 4595: +case 4596: +case 4597: +case 4598: +case 4599: +case 4600: +case 4601: +case 4602: +case 4603: +case 4604: +case 4605: +case 4606: +case 4607: +case 4608: +case 4609: +case 4610: +case 4611: +case 4612: +case 4613: +case 4614: +case 4615: +case 4616: +case 4617: +case 4618: +case 4619: +case 4620: +case 4621: +case 4622: +case 4623: +case 4624: +case 4625: +case 4626: +case 4627: +case 4628: +case 4629: +case 4630: +case 4631: +case 4632: +case 4633: +case 4634: +case 4635: +case 4636: +case 4637: +case 4638: +case 4639: +case 4640: +case 4641: +case 4642: +case 4643: +case 4644: +case 4645: +case 4646: +case 4647: +case 4648: +case 4649: +case 4650: +case 4651: +case 4652: +case 4653: +case 4654: +case 4655: +case 4656: +case 4657: +case 4658: +case 4659: +case 4660: +case 4661: +case 4662: +case 4663: +case 4664: +case 4665: +case 4666: +case 4667: +case 4668: +case 4669: +case 4670: +case 4671: +case 4672: +case 4673: +case 4674: +case 4675: +case 4676: +case 4677: +case 4678: +case 4679: +case 4680: +case 4681: +case 4682: +case 4683: +case 4684: +case 4685: +case 4686: +case 4687: +case 4688: +case 4689: +case 4690: +case 4691: +case 4692: +case 4693: +case 4694: +case 4695: +case 4696: +case 4697: +case 4698: +case 4699: +case 4700: +case 4701: +case 4702: +case 4703: +case 4704: +case 4705: +case 4706: +case 4707: +case 4708: +case 4709: +case 4710: +case 4711: +case 4712: +case 4713: +case 4714: +case 4715: +case 4716: +case 4717: +case 4718: +case 4719: +case 4720: +case 4721: +case 4722: +case 4723: +case 4724: +case 4725: +case 4726: +case 4727: +case 4728: +case 4729: +case 4730: +case 4731: +case 4732: +case 4733: +case 4734: +case 4735: +case 4736: +case 4737: +case 4738: +case 4739: +case 4740: +case 4741: +case 4742: +case 4743: +case 4744: +case 4745: +case 4746: +case 4747: +case 4748: +case 4749: +case 4750: +case 4751: +case 4752: +case 4753: +case 4754: +case 4755: +case 4756: +case 4757: +case 4758: +case 4759: +case 4760: +case 4761: +case 4762: +case 4763: +case 4764: +case 4765: +case 4766: +case 4767: +case 4768: +case 4769: +case 4770: +case 4771: +case 4772: +case 4773: +case 4774: +case 4775: +case 4776: +case 4777: +case 4778: +case 4779: +case 4780: +case 4781: +case 4782: +case 4783: +case 4784: +case 4785: +case 4786: +case 4787: +case 4788: +case 4789: +case 4790: +case 4791: +case 4792: +case 4793: +case 4794: +case 4795: +case 4796: +case 4797: +case 4798: +case 4799: +case 4800: +case 4801: +case 4802: +case 4803: +case 4804: +case 4805: +case 4806: +case 4807: +case 4808: +case 4809: +case 4810: +case 4811: +case 4812: +case 4813: +case 4814: +case 4815: +case 4816: +case 4817: +case 4818: +case 4819: +case 4820: +case 4821: +case 4822: +case 4823: +case 4824: +case 4825: +case 4826: +case 4827: +case 4828: +case 4829: +case 4830: +case 4831: +case 4832: +case 4833: +case 4834: +case 4835: +case 4836: +case 4837: +case 4838: +case 4839: +case 4840: +case 4841: +case 4842: +case 4843: +case 4844: +case 4845: +case 4846: +case 4847: +case 4848: +case 4849: +case 4850: +case 4851: +case 4852: +case 4853: +case 4854: +case 4855: +case 4856: +case 4857: +case 4858: +case 4859: +case 4860: +case 4861: +case 4862: +case 4863: +case 4864: +case 4865: +case 4866: +case 4867: +case 4868: +case 4869: +case 4870: +case 4871: +case 4872: +case 4873: +case 4874: +case 4875: +case 4876: +case 4877: +case 4878: +case 4879: +case 4880: +case 4881: +case 4882: +case 4883: +case 4884: +case 4885: +case 4886: +case 4887: +case 4888: +case 4889: +case 4890: +case 4891: +case 4892: +case 4893: +case 4894: +case 4895: +case 4896: +case 4897: +case 4898: +case 4899: +case 4900: +case 4901: +case 4902: +case 4903: +case 4904: +case 4905: +case 4906: +case 4907: +case 4908: +case 4909: +case 4910: +case 4911: +case 4912: +case 4913: +case 4914: +case 4915: +case 4916: +case 4917: +case 4918: +case 4919: +case 4920: +case 4921: +case 4922: +case 4923: +case 4924: +case 4925: +case 4926: +case 4927: +case 4928: +case 4929: +case 4930: +case 4931: +case 4932: +case 4933: +case 4934: +case 4935: +case 4936: +case 4937: +case 4938: +case 4939: +case 4940: +case 4941: +case 4942: +case 4943: +case 4944: +case 4945: +case 4946: +case 4947: +case 4948: +case 4949: +case 4950: +case 4951: +case 4952: +case 4953: +case 4954: +case 4955: +case 4956: +case 4957: +case 4958: +case 4959: +case 4960: +case 4961: +case 4962: +case 4963: +case 4964: +case 4965: +case 4966: +case 4967: +case 4968: +case 4969: +case 4970: +case 4971: +case 4972: +case 4973: +case 4974: +case 4975: +case 4976: +case 4977: +case 4978: +case 4979: +case 4980: +case 4981: +case 4982: +case 4983: +case 4984: +case 4985: +case 4986: +case 4987: +case 4988: +case 4989: +case 4990: +case 4991: +case 4992: +case 4993: +case 4994: +case 4995: +case 4996: +case 4997: +case 4998: +case 4999: +case 5000: +case 5001: +case 5002: +case 5003: +case 5004: +case 5005: +case 5006: +case 5007: +case 5008: +case 5009: +case 5010: +case 5011: +case 5012: +case 5013: +case 5014: +case 5015: +case 5016: +case 5017: +case 5018: +case 5019: +case 5020: +case 5021: +case 5022: +case 5023: +case 5024: +case 5025: +case 5026: +case 5027: +case 5028: +case 5029: +case 5030: +case 5031: +case 5032: +case 5033: +case 5034: +case 5035: +case 5036: +case 5037: +case 5038: +case 5039: +case 5040: +case 5041: +case 5042: +case 5043: +case 5044: +case 5045: +case 5046: +case 5047: +case 5048: +case 5049: +case 5050: +case 5051: +case 5052: +case 5053: +case 5054: +case 5055: +case 5056: +case 5057: +case 5058: +case 5059: +case 5060: +case 5061: +case 5062: +case 5063: +case 5064: +case 5065: +case 5066: +case 5067: +case 5068: +case 5069: +case 5070: +case 5071: +case 5072: +case 5073: +case 5074: +case 5075: +case 5076: +case 5077: +case 5078: +case 5079: +case 5080: +case 5081: +case 5082: +case 5083: +case 5084: +case 5085: +case 5086: +case 5087: +case 5088: +case 5089: +case 5090: +case 5091: +case 5092: +case 5093: +case 5094: +case 5095: +case 5096: +case 5097: +case 5098: +case 5099: +case 5100: +case 5101: +case 5102: +case 5103: +case 5104: +case 5105: +case 5106: +case 5107: +case 5108: +case 5109: +case 5110: +case 5111: +case 5112: +case 5113: +case 5114: +case 5115: +case 5116: +case 5117: +case 5118: +case 5119: +case 5120: +case 5121: +case 5122: +case 5123: +case 5124: +case 5125: +case 5126: +case 5127: +case 5128: +case 5129: +case 5130: +case 5131: +case 5132: +case 5133: +case 5134: +case 5135: +case 5136: +case 5137: +case 5138: +case 5139: +case 5140: +case 5141: +case 5142: +case 5143: +case 5144: +case 5145: +case 5146: +case 5147: +case 5148: +case 5149: +case 5150: +case 5151: +case 5152: +case 5153: +case 5154: +case 5155: +case 5156: +case 5157: +case 5158: +case 5159: +case 5160: +case 5161: +case 5162: +case 5163: +case 5164: +case 5165: +case 5166: +case 5167: +case 5168: +case 5169: +case 5170: +case 5171: +case 5172: +case 5173: +case 5174: +case 5175: +case 5176: +case 5177: +case 5178: +case 5179: +case 5180: +case 5181: +case 5182: +case 5183: +case 5184: +case 5185: +case 5186: +case 5187: +case 5188: +case 5189: +case 5190: +case 5191: +case 5192: +case 5193: +case 5194: +case 5195: +case 5196: +case 5197: +case 5198: +case 5199: +case 5200: +case 5201: +case 5202: +case 5203: +case 5204: +case 5205: +case 5206: +case 5207: +case 5208: +case 5209: +case 5210: +case 5211: +case 5212: +case 5213: +case 5214: +case 5215: +case 5216: +case 5217: +case 5218: +case 5219: +case 5220: +case 5221: +case 5222: +case 5223: +case 5224: +case 5225: +case 5226: +case 5227: +case 5228: +case 5229: +case 5230: +case 5231: +case 5232: +case 5233: +case 5234: +case 5235: +case 5236: +case 5237: +case 5238: +case 5239: +case 5240: +case 5241: +case 5242: +case 5243: +case 5244: +case 5245: +case 5246: +case 5247: +case 5248: +case 5249: +case 5250: +case 5251: +case 5252: +case 5253: +case 5254: +case 5255: +case 5256: +case 5257: +case 5258: +case 5259: +case 5260: +case 5261: +case 5262: +case 5263: +case 5264: +case 5265: +case 5266: +case 5267: +case 5268: +case 5269: +case 5270: +case 5271: +case 5272: +case 5273: +case 5274: +case 5275: +case 5276: +case 5277: +case 5278: +case 5279: +case 5280: +case 5281: +case 5282: +case 5283: +case 5284: +case 5285: +case 5286: +case 5287: +case 5288: +case 5289: +case 5290: +case 5291: +case 5292: +case 5293: +case 5294: +case 5295: +case 5296: +case 5297: +case 5298: +case 5299: +case 5300: +case 5301: +case 5302: +case 5303: +case 5304: +case 5305: +case 5306: +case 5307: +case 5308: +case 5309: +case 5310: +case 5311: +case 5312: +case 5313: +case 5314: +case 5315: +case 5316: +case 5317: +case 5318: +case 5319: +case 5320: +case 5321: +case 5322: +case 5323: +case 5324: +case 5325: +case 5326: +case 5327: +case 5328: +case 5329: +case 5330: +case 5331: +case 5332: +case 5333: +case 5334: +case 5335: +case 5336: +case 5337: +case 5338: +case 5339: +case 5340: +case 5341: +case 5342: +case 5343: +case 5344: +case 5345: +case 5346: +case 5347: +case 5348: +case 5349: +case 5350: +case 5351: +case 5352: +case 5353: +case 5354: +case 5355: +case 5356: +case 5357: +case 5358: +case 5359: +case 5360: +case 5361: +case 5362: +case 5363: +case 5364: +case 5365: +case 5366: +case 5367: +case 5368: +case 5369: +case 5370: +case 5371: +case 5372: +case 5373: +case 5374: +case 5375: +case 5376: +case 5377: +case 5378: +case 5379: +case 5380: +case 5381: +case 5382: +case 5383: +case 5384: +case 5385: +case 5386: +case 5387: +case 5388: +case 5389: +case 5390: +case 5391: +case 5392: +case 5393: +case 5394: +case 5395: +case 5396: +case 5397: +case 5398: +case 5399: +case 5400: +case 5401: +case 5402: +case 5403: +case 5404: +case 5405: +case 5406: +case 5407: +case 5408: +case 5409: +case 5410: +case 5411: +case 5412: +case 5413: +case 5414: +case 5415: +case 5416: +case 5417: +case 5418: +case 5419: +case 5420: +case 5421: +case 5422: +case 5423: +case 5424: +case 5425: +case 5426: +case 5427: +case 5428: +case 5429: +case 5430: +case 5431: +case 5432: +case 5433: +case 5434: +case 5435: +case 5436: +case 5437: +case 5438: +case 5439: +case 5440: +case 5441: +case 5442: +case 5443: +case 5444: +case 5445: +case 5446: +case 5447: +case 5448: +case 5449: +case 5450: +case 5451: +case 5452: +case 5453: +case 5454: +case 5455: +case 5456: +case 5457: +case 5458: +case 5459: +case 5460: +case 5461: +case 5462: +case 5463: +case 5464: +case 5465: +case 5466: +case 5467: +case 5468: +case 5469: +case 5470: +case 5471: +case 5472: +case 5473: +case 5474: +case 5475: +case 5476: +case 5477: +case 5478: +case 5479: +case 5480: +case 5481: +case 5482: +case 5483: +case 5484: +case 5485: +case 5486: +case 5487: +case 5488: +case 5489: +case 5490: +case 5491: +case 5492: +case 5493: +case 5494: +case 5495: +case 5496: +case 5497: +case 5498: +case 5499: +case 5500: +case 5501: +case 5502: +case 5503: +case 5504: +case 5505: +case 5506: +case 5507: +case 5508: +case 5509: +case 5510: +case 5511: +case 5512: +case 5513: +case 5514: +case 5515: +case 5516: +case 5517: +case 5518: +case 5519: +case 5520: +case 5521: +case 5522: +case 5523: +case 5524: +case 5525: +case 5526: +case 5527: +case 5528: +case 5529: +case 5530: +case 5531: +case 5532: +case 5533: +case 5534: +case 5535: +case 5536: +case 5537: +case 5538: +case 5539: +case 5540: +case 5541: +case 5542: +case 5543: +case 5544: +case 5545: +case 5546: +case 5547: +case 5548: +case 5549: +case 5550: +case 5551: +case 5552: +case 5553: +case 5554: +case 5555: +case 5556: +case 5557: +case 5558: +case 5559: +case 5560: +case 5561: +case 5562: +case 5563: +case 5564: +case 5565: +case 5566: +case 5567: +case 5568: +case 5569: +case 5570: +case 5571: +case 5572: +case 5573: +case 5574: +case 5575: +case 5576: +case 5577: +case 5578: +case 5579: +case 5580: +case 5581: +case 5582: +case 5583: +case 5584: +case 5585: +case 5586: +case 5587: +case 5588: +case 5589: +case 5590: +case 5591: +case 5592: +case 5593: +case 5594: +case 5595: +case 5596: +case 5597: +case 5598: +case 5599: +case 5600: +case 5601: +case 5602: +case 5603: +case 5604: +case 5605: +case 5606: +case 5607: +case 5608: +case 5609: +case 5610: +case 5611: +case 5612: +case 5613: +case 5614: +case 5615: +case 5616: +case 5617: +case 5618: +case 5619: +case 5620: +case 5621: +case 5622: +case 5623: +case 5624: +case 5625: +case 5626: +case 5627: +case 5628: +case 5629: +case 5630: +case 5631: +case 5632: +case 5633: +case 5634: +case 5635: +case 5636: +case 5637: +case 5638: +case 5639: +case 5640: +case 5641: +case 5642: +case 5643: +case 5644: +case 5645: +case 5646: +case 5647: +case 5648: +case 5649: +case 5650: +case 5651: +case 5652: +case 5653: +case 5654: +case 5655: +case 5656: +case 5657: +case 5658: +case 5659: +case 5660: +case 5661: +case 5662: +case 5663: +case 5664: +case 5665: +case 5666: +case 5667: +case 5668: +case 5669: +case 5670: +case 5671: +case 5672: +case 5673: +case 5674: +case 5675: +case 5676: +case 5677: +case 5678: +case 5679: +case 5680: +case 5681: +case 5682: +case 5683: +case 5684: +case 5685: +case 5686: +case 5687: +case 5688: +case 5689: +case 5690: +case 5691: +case 5692: +case 5693: +case 5694: +case 5695: +case 5696: +case 5697: +case 5698: +case 5699: +case 5700: +case 5701: +case 5702: +case 5703: +case 5704: +case 5705: +case 5706: +case 5707: +case 5708: +case 5709: +case 5710: +case 5711: +case 5712: +case 5713: +case 5714: +case 5715: +case 5716: +case 5717: +case 5718: +case 5719: +case 5720: +case 5721: +case 5722: +case 5723: +case 5724: +case 5725: +case 5726: +case 5727: +case 5728: +case 5729: +case 5730: +case 5731: +case 5732: +case 5733: +case 5734: +case 5735: +case 5736: +case 5737: +case 5738: +case 5739: +case 5740: +case 5741: +case 5742: +case 5743: +case 5744: +case 5745: +case 5746: +case 5747: +case 5748: +case 5749: +case 5750: +case 5751: +case 5752: +case 5753: +case 5754: +case 5755: +case 5756: +case 5757: +case 5758: +case 5759: +case 5760: +case 5761: +case 5762: +case 5763: +case 5764: +case 5765: +case 5766: +case 5767: +case 5768: +case 5769: +case 5770: +case 5771: +case 5772: +case 5773: +case 5774: +case 5775: +case 5776: +case 5777: +case 5778: +case 5779: +case 5780: +case 5781: +case 5782: +case 5783: +case 5784: +case 5785: +case 5786: +case 5787: +case 5788: +case 5789: +case 5790: +case 5791: +case 5792: +case 5793: +case 5794: +case 5795: +case 5796: +case 5797: +case 5798: +case 5799: +case 5800: +case 5801: +case 5802: +case 5803: +case 5804: +case 5805: +case 5806: +case 5807: +case 5808: +case 5809: +case 5810: +case 5811: +case 5812: +case 5813: +case 5814: +case 5815: +case 5816: +case 5817: +case 5818: +case 5819: +case 5820: +case 5821: +case 5822: +case 5823: +case 5824: +case 5825: +case 5826: +case 5827: +case 5828: +case 5829: +case 5830: +case 5831: +case 5832: +case 5833: +case 5834: +case 5835: +case 5836: +case 5837: +case 5838: +case 5839: +case 5840: +case 5841: +case 5842: +case 5843: +case 5844: +case 5845: +case 5846: +case 5847: +case 5848: +case 5849: +case 5850: +case 5851: +case 5852: +case 5853: +case 5854: +case 5855: +case 5856: +case 5857: +case 5858: +case 5859: +case 5860: +case 5861: +case 5862: +case 5863: +case 5864: +case 5865: +case 5866: +case 5867: +case 5868: +case 5869: +case 5870: +case 5871: +case 5872: +case 5873: +case 5874: +case 5875: +case 5876: +case 5877: +case 5878: +case 5879: +case 5880: +case 5881: +case 5882: +case 5883: +case 5884: +case 5885: +case 5886: +case 5887: +case 5888: +case 5889: +case 5890: +case 5891: +case 5892: +case 5893: +case 5894: +case 5895: +case 5896: +case 5897: +case 5898: +case 5899: +case 5900: +case 5901: +case 5902: +case 5903: +case 5904: +case 5905: +case 5906: +case 5907: +case 5908: +case 5909: +case 5910: +case 5911: +case 5912: +case 5913: +case 5914: +case 5915: +case 5916: +case 5917: +case 5918: +case 5919: +case 5920: +case 5921: +case 5922: +case 5923: +case 5924: +case 5925: +case 5926: +case 5927: +case 5928: +case 5929: +case 5930: +case 5931: +case 5932: +case 5933: +case 5934: +case 5935: +case 5936: +case 5937: +case 5938: +case 5939: +case 5940: +case 5941: +case 5942: +case 5943: +case 5944: +case 5945: +case 5946: +case 5947: +case 5948: +case 5949: +case 5950: +case 5951: +case 5952: +case 5953: +case 5954: +case 5955: +case 5956: +case 5957: +case 5958: +case 5959: +case 5960: +case 5961: +case 5962: +case 5963: +case 5964: +case 5965: +case 5966: +case 5967: +case 5968: +case 5969: +case 5970: +case 5971: +case 5972: +case 5973: +case 5974: +case 5975: +case 5976: +case 5977: +case 5978: +case 5979: +case 5980: +case 5981: +case 5982: +case 5983: +case 5984: +case 5985: +case 5986: +case 5987: +case 5988: +case 5989: +case 5990: +case 5991: +case 5992: +case 5993: +case 5994: +case 5995: +case 5996: +case 5997: +case 5998: +case 5999: +case 6000: +case 6001: +case 6002: +case 6003: +case 6004: +case 6005: +case 6006: +case 6007: +case 6008: +case 6009: +case 6010: +case 6011: +case 6012: +case 6013: +case 6014: +case 6015: +case 6016: +case 6017: +case 6018: +case 6019: +case 6020: +case 6021: +case 6022: +case 6023: +case 6024: +case 6025: +case 6026: +case 6027: +case 6028: +case 6029: +case 6030: +case 6031: +case 6032: +case 6033: +case 6034: +case 6035: +case 6036: +case 6037: +case 6038: +case 6039: +case 6040: +case 6041: +case 6042: +case 6043: +case 6044: +case 6045: +case 6046: +case 6047: +case 6048: +case 6049: +case 6050: +case 6051: +case 6052: +case 6053: +case 6054: +case 6055: +case 6056: +case 6057: +case 6058: +case 6059: +case 6060: +case 6061: +case 6062: +case 6063: +case 6064: +case 6065: +case 6066: +case 6067: +case 6068: +case 6069: +case 6070: +case 6071: +case 6072: +case 6073: +case 6074: +case 6075: +case 6076: +case 6077: +case 6078: +case 6079: +case 6080: +case 6081: +case 6082: +case 6083: +case 6084: +case 6085: +case 6086: +case 6087: +case 6088: +case 6089: +case 6090: +case 6091: +case 6092: +case 6093: +case 6094: +case 6095: +case 6096: +case 6097: +case 6098: +case 6099: +case 6100: +case 6101: +case 6102: +case 6103: +case 6104: +case 6105: +case 6106: +case 6107: +case 6108: +case 6109: +case 6110: +case 6111: +case 6112: +case 6113: +case 6114: +case 6115: +case 6116: +case 6117: +case 6118: +case 6119: +case 6120: +case 6121: +case 6122: +case 6123: +case 6124: +case 6125: +case 6126: +case 6127: +case 6128: +case 6129: +case 6130: +case 6131: +case 6132: +case 6133: +case 6134: +case 6135: +case 6136: +case 6137: +case 6138: +case 6139: +case 6140: +case 6141: +case 6142: +case 6143: +case 6144: +case 6145: +case 6146: +case 6147: +case 6148: +case 6149: +case 6150: +case 6151: +case 6152: +case 6153: +case 6154: +case 6155: +case 6156: +case 6157: +case 6158: +case 6159: +case 6160: +case 6161: +case 6162: +case 6163: +case 6164: +case 6165: +case 6166: +case 6167: +case 6168: +case 6169: +case 6170: +case 6171: +case 6172: +case 6173: +case 6174: +case 6175: +case 6176: +case 6177: +case 6178: +case 6179: +case 6180: +case 6181: +case 6182: +case 6183: +case 6184: +case 6185: +case 6186: +case 6187: +case 6188: +case 6189: +case 6190: +case 6191: +case 6192: +case 6193: +case 6194: +case 6195: +case 6196: +case 6197: +case 6198: +case 6199: +case 6200: +case 6201: +case 6202: +case 6203: +case 6204: +case 6205: +case 6206: +case 6207: +case 6208: +case 6209: +case 6210: +case 6211: +case 6212: +case 6213: +case 6214: +case 6215: +case 6216: +case 6217: +case 6218: +case 6219: +case 6220: +case 6221: +case 6222: +case 6223: +case 6224: +case 6225: +case 6226: +case 6227: +case 6228: +case 6229: +case 6230: +case 6231: +case 6232: +case 6233: +case 6234: +case 6235: +case 6236: +case 6237: +case 6238: +case 6239: +case 6240: +case 6241: +case 6242: +case 6243: +case 6244: +case 6245: +case 6246: +case 6247: +case 6248: +case 6249: +case 6250: +case 6251: +case 6252: +case 6253: +case 6254: +case 6255: +case 6256: +case 6257: +case 6258: +case 6259: +case 6260: +case 6261: +case 6262: +case 6263: +case 6264: +case 6265: +case 6266: +case 6267: +case 6268: +case 6269: +case 6270: +case 6271: +case 6272: +case 6273: +case 6274: +case 6275: +case 6276: +case 6277: +case 6278: +case 6279: +case 6280: +case 6281: +case 6282: +case 6283: +case 6284: +case 6285: +case 6286: +case 6287: +case 6288: +case 6289: +case 6290: +case 6291: +case 6292: +case 6293: +case 6294: +case 6295: +case 6296: +case 6297: +case 6298: +case 6299: +case 6300: +case 6301: +case 6302: +case 6303: +case 6304: +case 6305: +case 6306: +case 6307: +case 6308: +case 6309: +case 6310: +case 6311: +case 6312: +case 6313: +case 6314: +case 6315: +case 6316: +case 6317: +case 6318: +case 6319: +case 6320: +case 6321: +case 6322: +case 6323: +case 6324: +case 6325: +case 6326: +case 6327: +case 6328: +case 6329: +case 6330: +case 6331: +case 6332: +case 6333: +case 6334: +case 6335: +case 6336: +case 6337: +case 6338: +case 6339: +case 6340: +case 6341: +case 6342: +case 6343: +case 6344: +case 6345: +case 6346: +case 6347: +case 6348: +case 6349: +case 6350: +case 6351: +case 6352: +case 6353: +case 6354: +case 6355: +case 6356: +case 6357: +case 6358: +case 6359: +case 6360: +case 6361: +case 6362: +case 6363: +case 6364: +case 6365: +case 6366: +case 6367: +case 6368: +case 6369: +case 6370: +case 6371: +case 6372: +case 6373: +case 6374: +case 6375: +case 6376: +case 6377: +case 6378: +case 6379: +case 6380: +case 6381: +case 6382: +case 6383: +case 6384: +case 6385: +case 6386: +case 6387: +case 6388: +case 6389: +case 6390: +case 6391: +case 6392: +case 6393: +case 6394: +case 6395: +case 6396: +case 6397: +case 6398: +case 6399: +case 6400: +case 6401: +case 6402: +case 6403: +case 6404: +case 6405: +case 6406: +case 6407: +case 6408: +case 6409: +case 6410: +case 6411: +case 6412: +case 6413: +case 6414: +case 6415: +case 6416: +case 6417: +case 6418: +case 6419: +case 6420: +case 6421: +case 6422: +case 6423: +case 6424: +case 6425: +case 6426: +case 6427: +case 6428: +case 6429: +case 6430: +case 6431: +case 6432: +case 6433: +case 6434: +case 6435: +case 6436: +case 6437: +case 6438: +case 6439: +case 6440: +case 6441: +case 6442: +case 6443: +case 6444: +case 6445: +case 6446: +case 6447: +case 6448: +case 6449: +case 6450: +case 6451: +case 6452: +case 6453: +case 6454: +case 6455: +case 6456: +case 6457: +case 6458: +case 6459: +case 6460: +case 6461: +case 6462: +case 6463: +case 6464: +case 6465: +case 6466: +case 6467: +case 6468: +case 6469: +case 6470: +case 6471: +case 6472: +case 6473: +case 6474: +case 6475: +case 6476: +case 6477: +case 6478: +case 6479: +case 6480: +case 6481: +case 6482: +case 6483: +case 6484: +case 6485: +case 6486: +case 6487: +case 6488: +case 6489: +case 6490: +case 6491: +case 6492: +case 6493: +case 6494: +case 6495: +case 6496: +case 6497: +case 6498: +case 6499: +case 6500: +case 6501: +case 6502: +case 6503: +case 6504: +case 6505: +case 6506: +case 6507: +case 6508: +case 6509: +case 6510: +case 6511: +case 6512: +case 6513: +case 6514: +case 6515: +case 6516: +case 6517: +case 6518: +case 6519: +case 6520: +case 6521: +case 6522: +case 6523: +case 6524: +case 6525: +case 6526: +case 6527: +case 6528: +case 6529: +case 6530: +case 6531: +case 6532: +case 6533: +case 6534: +case 6535: +case 6536: +case 6537: +case 6538: +case 6539: +case 6540: +case 6541: +case 6542: +case 6543: +case 6544: +case 6545: +case 6546: +case 6547: +case 6548: +case 6549: +case 6550: +case 6551: +case 6552: +case 6553: +case 6554: +case 6555: +case 6556: +case 6557: +case 6558: +case 6559: +case 6560: +case 6561: +case 6562: +case 6563: +case 6564: +case 6565: +case 6566: +case 6567: +case 6568: +case 6569: +case 6570: +case 6571: +case 6572: +case 6573: +case 6574: +case 6575: +case 6576: +case 6577: +case 6578: +case 6579: +case 6580: +case 6581: +case 6582: +case 6583: +case 6584: +case 6585: +case 6586: +case 6587: +case 6588: +case 6589: +case 6590: +case 6591: +case 6592: +case 6593: +case 6594: +case 6595: +case 6596: +case 6597: +case 6598: +case 6599: +case 6600: +case 6601: +case 6602: +case 6603: +case 6604: +case 6605: +case 6606: +case 6607: +case 6608: +case 6609: +case 6610: +case 6611: +case 6612: +case 6613: +case 6614: +case 6615: +case 6616: +case 6617: +case 6618: +case 6619: +case 6620: +case 6621: +case 6622: +case 6623: +case 6624: +case 6625: +case 6626: +case 6627: +case 6628: +case 6629: +case 6630: +case 6631: +case 6632: +case 6633: +case 6634: +case 6635: +case 6636: +case 6637: +case 6638: +case 6639: +case 6640: +case 6641: +case 6642: +case 6643: +case 6644: +case 6645: +case 6646: +case 6647: +case 6648: +case 6649: +case 6650: +case 6651: +case 6652: +case 6653: +case 6654: +case 6655: +case 6656: +case 6657: +case 6658: +case 6659: +case 6660: +case 6661: +case 6662: +case 6663: +case 6664: +case 6665: +case 6666: +case 6667: +case 6668: +case 6669: +case 6670: +case 6671: +case 6672: +case 6673: +case 6674: +case 6675: +case 6676: +case 6677: +case 6678: +case 6679: +case 6680: +case 6681: +case 6682: +case 6683: +case 6684: +case 6685: +case 6686: +case 6687: +case 6688: +case 6689: +case 6690: +case 6691: +case 6692: +case 6693: +case 6694: +case 6695: +case 6696: +case 6697: +case 6698: +case 6699: +case 6700: +case 6701: +case 6702: +case 6703: +case 6704: +case 6705: +case 6706: +case 6707: +case 6708: +case 6709: +case 6710: +case 6711: +case 6712: +case 6713: +case 6714: +case 6715: +case 6716: +case 6717: +case 6718: +case 6719: +case 6720: +case 6721: +case 6722: +case 6723: +case 6724: +case 6725: +case 6726: +case 6727: +case 6728: +case 6729: +case 6730: +case 6731: +case 6732: +case 6733: +case 6734: +case 6735: +case 6736: +case 6737: +case 6738: +case 6739: +case 6740: +case 6741: +case 6742: +case 6743: +case 6744: +case 6745: +case 6746: +case 6747: +case 6748: +case 6749: +case 6750: +case 6751: +case 6752: +case 6753: +case 6754: +case 6755: +case 6756: +case 6757: +case 6758: +case 6759: +case 6760: +case 6761: +case 6762: +case 6763: +case 6764: +case 6765: +case 6766: +case 6767: +case 6768: +case 6769: +case 6770: +case 6771: +case 6772: +case 6773: +case 6774: +case 6775: +case 6776: +case 6777: +case 6778: +case 6779: +case 6780: +case 6781: +case 6782: +case 6783: +case 6784: +case 6785: +case 6786: +case 6787: +case 6788: +case 6789: +case 6790: +case 6791: +case 6792: +case 6793: +case 6794: +case 6795: +case 6796: +case 6797: +case 6798: +case 6799: +case 6800: +case 6801: +case 6802: +case 6803: +case 6804: +case 6805: +case 6806: +case 6807: +case 6808: +case 6809: +case 6810: +case 6811: +case 6812: +case 6813: +case 6814: +case 6815: +case 6816: +case 6817: +case 6818: +case 6819: +case 6820: +case 6821: +case 6822: +case 6823: +case 6824: +case 6825: +case 6826: +case 6827: +case 6828: +case 6829: +case 6830: +case 6831: +case 6832: +case 6833: +case 6834: +case 6835: +case 6836: +case 6837: +case 6838: +case 6839: +case 6840: +case 6841: +case 6842: +case 6843: +case 6844: +case 6845: +case 6846: +case 6847: +case 6848: +case 6849: +case 6850: +case 6851: +case 6852: +case 6853: +case 6854: +case 6855: +case 6856: +case 6857: +case 6858: +case 6859: +case 6860: +case 6861: +case 6862: +case 6863: +case 6864: +case 6865: +case 6866: +case 6867: +case 6868: +case 6869: +case 6870: +case 6871: +case 6872: +case 6873: +case 6874: +case 6875: +case 6876: +case 6877: +case 6878: +case 6879: +case 6880: +case 6881: +case 6882: +case 6883: +case 6884: +case 6885: +case 6886: +case 6887: +case 6888: +case 6889: +case 6890: +case 6891: +case 6892: +case 6893: +case 6894: +case 6895: +case 6896: +case 6897: +case 6898: +case 6899: +case 6900: +case 6901: +case 6902: +case 6903: +case 6904: +case 6905: +case 6906: +case 6907: +case 6908: +case 6909: +case 6910: +case 6911: +case 6912: +case 6913: +case 6914: +case 6915: +case 6916: +case 6917: +case 6918: +case 6919: +case 6920: +case 6921: +case 6922: +case 6923: +case 6924: +case 6925: +case 6926: +case 6927: +case 6928: +case 6929: +case 6930: +case 6931: +case 6932: +case 6933: +case 6934: +case 6935: +case 6936: +case 6937: +case 6938: +case 6939: +case 6940: +case 6941: +case 6942: +case 6943: +case 6944: +case 6945: +case 6946: +case 6947: +case 6948: +case 6949: +case 6950: +case 6951: +case 6952: +case 6953: +case 6954: +case 6955: +case 6956: +case 6957: +case 6958: +case 6959: +case 6960: +case 6961: +case 6962: +case 6963: +case 6964: +case 6965: +case 6966: +case 6967: +case 6968: +case 6969: +case 6970: +case 6971: +case 6972: +case 6973: +case 6974: +case 6975: +case 6976: +case 6977: +case 6978: +case 6979: +case 6980: +case 6981: +case 6982: +case 6983: +case 6984: +case 6985: +case 6986: +case 6987: +case 6988: +case 6989: +case 6990: +case 6991: +case 6992: +case 6993: +case 6994: +case 6995: +case 6996: +case 6997: +case 6998: +case 6999: +case 7000: +case 7001: +case 7002: +case 7003: +case 7004: +case 7005: +case 7006: +case 7007: +case 7008: +case 7009: +case 7010: +case 7011: +case 7012: +case 7013: +case 7014: +case 7015: +case 7016: +case 7017: +case 7018: +case 7019: +case 7020: +case 7021: +case 7022: +case 7023: +case 7024: +case 7025: +case 7026: +case 7027: +case 7028: +case 7029: +case 7030: +case 7031: +case 7032: +case 7033: +case 7034: +case 7035: +case 7036: +case 7037: +case 7038: +case 7039: +case 7040: +case 7041: +case 7042: +case 7043: +case 7044: +case 7045: +case 7046: +case 7047: +case 7048: +case 7049: +case 7050: +case 7051: +case 7052: +case 7053: +case 7054: +case 7055: +case 7056: +case 7057: +case 7058: +case 7059: +case 7060: +case 7061: +case 7062: +case 7063: +case 7064: +case 7065: +case 7066: +case 7067: +case 7068: +case 7069: +case 7070: +case 7071: +case 7072: +case 7073: +case 7074: +case 7075: +case 7076: +case 7077: +case 7078: +case 7079: +case 7080: +case 7081: +case 7082: +case 7083: +case 7084: +case 7085: +case 7086: +case 7087: +case 7088: +case 7089: +case 7090: +case 7091: +case 7092: +case 7093: +case 7094: +case 7095: +case 7096: +case 7097: +case 7098: +case 7099: +case 7100: +case 7101: +case 7102: +case 7103: +case 7104: +case 7105: +case 7106: +case 7107: +case 7108: +case 7109: +case 7110: +case 7111: +case 7112: +case 7113: +case 7114: +case 7115: +case 7116: +case 7117: +case 7118: +case 7119: +case 7120: +case 7121: +case 7122: +case 7123: +case 7124: +case 7125: +case 7126: +case 7127: +case 7128: +case 7129: +case 7130: +case 7131: +case 7132: +case 7133: +case 7134: +case 7135: +case 7136: +case 7137: +case 7138: +case 7139: +case 7140: +case 7141: +case 7142: +case 7143: +case 7144: +case 7145: +case 7146: +case 7147: +case 7148: +case 7149: +case 7150: +case 7151: +case 7152: +case 7153: +case 7154: +case 7155: +case 7156: +case 7157: +case 7158: +case 7159: +case 7160: +case 7161: +case 7162: +case 7163: +case 7164: +case 7165: +case 7166: +case 7167: +case 7168: +case 7169: +case 7170: +case 7171: +case 7172: +case 7173: +case 7174: +case 7175: +case 7176: +case 7177: +case 7178: +case 7179: +case 7180: +case 7181: +case 7182: +case 7183: +case 7184: +case 7185: +case 7186: +case 7187: +case 7188: +case 7189: +case 7190: +case 7191: +case 7192: +case 7193: +case 7194: +case 7195: +case 7196: +case 7197: +case 7198: +case 7199: +case 7200: +case 7201: +case 7202: +case 7203: +case 7204: +case 7205: +case 7206: +case 7207: +case 7208: +case 7209: +case 7210: +case 7211: +case 7212: +case 7213: +case 7214: +case 7215: +case 7216: +case 7217: +case 7218: +case 7219: +case 7220: +case 7221: +case 7222: +case 7223: +case 7224: +case 7225: +case 7226: +case 7227: +case 7228: +case 7229: +case 7230: +case 7231: +case 7232: +case 7233: +case 7234: +case 7235: +case 7236: +case 7237: +case 7238: +case 7239: +case 7240: +case 7241: +case 7242: +case 7243: +case 7244: +case 7245: +case 7246: +case 7247: +case 7248: +case 7249: +case 7250: +case 7251: +case 7252: +case 7253: +case 7254: +case 7255: +case 7256: +case 7257: +case 7258: +case 7259: +case 7260: +case 7261: +case 7262: +case 7263: +case 7264: +case 7265: +case 7266: +case 7267: +case 7268: +case 7269: +case 7270: +case 7271: +case 7272: +case 7273: +case 7274: +case 7275: +case 7276: +case 7277: +case 7278: +case 7279: +case 7280: +case 7281: +case 7282: +case 7283: +case 7284: +case 7285: +case 7286: +case 7287: +case 7288: +case 7289: +case 7290: +case 7291: +case 7292: +case 7293: +case 7294: +case 7295: +case 7296: +case 7297: +case 7298: +case 7299: +case 7300: +case 7301: +case 7302: +case 7303: +case 7304: +case 7305: +case 7306: +case 7307: +case 7308: +case 7309: +case 7310: +case 7311: +case 7312: +case 7313: +case 7314: +case 7315: +case 7316: +case 7317: +case 7318: +case 7319: +case 7320: +case 7321: +case 7322: +case 7323: +case 7324: +case 7325: +case 7326: +case 7327: +case 7328: +case 7329: +case 7330: +case 7331: +case 7332: +case 7333: +case 7334: +case 7335: +case 7336: +case 7337: +case 7338: +case 7339: +case 7340: +case 7341: +case 7342: +case 7343: +case 7344: +case 7345: +case 7346: +case 7347: +case 7348: +case 7349: +case 7350: +case 7351: +case 7352: +case 7353: +case 7354: +case 7355: +case 7356: +case 7357: +case 7358: +case 7359: +case 7360: +case 7361: +case 7362: +case 7363: +case 7364: +case 7365: +case 7366: +case 7367: +case 7368: +case 7369: +case 7370: +case 7371: +case 7372: +case 7373: +case 7374: +case 7375: +case 7376: +case 7377: +case 7378: +case 7379: +case 7380: +case 7381: +case 7382: +case 7383: +case 7384: +case 7385: +case 7386: +case 7387: +case 7388: +case 7389: +case 7390: +case 7391: +case 7392: +case 7393: +case 7394: +case 7395: +case 7396: +case 7397: +case 7398: +case 7399: +case 7400: +case 7401: +case 7402: +case 7403: +case 7404: +case 7405: +case 7406: +case 7407: +case 7408: +case 7409: +case 7410: +case 7411: +case 7412: +case 7413: +case 7414: +case 7415: +case 7416: +case 7417: +case 7418: +case 7419: +case 7420: +case 7421: +case 7422: +case 7423: +case 7424: +case 7425: +case 7426: +case 7427: +case 7428: +case 7429: +case 7430: +case 7431: +case 7432: +case 7433: +case 7434: +case 7435: +case 7436: +case 7437: +case 7438: +case 7439: +case 7440: +case 7441: +case 7442: +case 7443: +case 7444: +case 7445: +case 7446: +case 7447: +case 7448: +case 7449: +case 7450: +case 7451: +case 7452: +case 7453: +case 7454: +case 7455: +case 7456: +case 7457: +case 7458: +case 7459: +case 7460: +case 7461: +case 7462: +case 7463: +case 7464: +case 7465: +case 7466: +case 7467: +case 7468: +case 7469: +case 7470: +case 7471: +case 7472: +case 7473: +case 7474: +case 7475: +case 7476: +case 7477: +case 7478: +case 7479: +case 7480: +case 7481: +case 7482: +case 7483: +case 7484: +case 7485: +case 7486: +case 7487: +case 7488: +case 7489: +case 7490: +case 7491: +case 7492: +case 7493: +case 7494: +case 7495: +case 7496: +case 7497: +case 7498: +case 7499: +case 7500: +case 7501: +case 7502: +case 7503: +case 7504: +case 7505: +case 7506: +case 7507: +case 7508: +case 7509: +case 7510: +case 7511: +case 7512: +case 7513: +case 7514: +case 7515: +case 7516: +case 7517: +case 7518: +case 7519: +case 7520: +case 7521: +case 7522: +case 7523: +case 7524: +case 7525: +case 7526: +case 7527: +case 7528: +case 7529: +case 7530: +case 7531: +case 7532: +case 7533: +case 7534: +case 7535: +case 7536: +case 7537: +case 7538: +case 7539: +case 7540: +case 7541: +case 7542: +case 7543: +case 7544: +case 7545: +case 7546: +case 7547: +case 7548: +case 7549: +case 7550: +case 7551: +case 7552: +case 7553: +case 7554: +case 7555: +case 7556: +case 7557: +case 7558: +case 7559: +case 7560: +case 7561: +case 7562: +case 7563: +case 7564: +case 7565: +case 7566: +case 7567: +case 7568: +case 7569: +case 7570: +case 7571: +case 7572: +case 7573: +case 7574: +case 7575: +case 7576: +case 7577: +case 7578: +case 7579: +case 7580: +case 7581: +case 7582: +case 7583: +case 7584: +case 7585: +case 7586: +case 7587: +case 7588: +case 7589: +case 7590: +case 7591: +case 7592: +case 7593: +case 7594: +case 7595: +case 7596: +case 7597: +case 7598: +case 7599: +case 7600: +case 7601: +case 7602: +case 7603: +case 7604: +case 7605: +case 7606: +case 7607: +case 7608: +case 7609: +case 7610: +case 7611: +case 7612: +case 7613: +case 7614: +case 7615: +case 7616: +case 7617: +case 7618: +case 7619: +case 7620: +case 7621: +case 7622: +case 7623: +case 7624: +case 7625: +case 7626: +case 7627: +case 7628: +case 7629: +case 7630: +case 7631: +case 7632: +case 7633: +case 7634: +case 7635: +case 7636: +case 7637: +case 7638: +case 7639: +case 7640: +case 7641: +case 7642: +case 7643: +case 7644: +case 7645: +case 7646: +case 7647: +case 7648: +case 7649: +case 7650: +case 7651: +case 7652: +case 7653: +case 7654: +case 7655: +case 7656: +case 7657: +case 7658: +case 7659: +case 7660: +case 7661: +case 7662: +case 7663: +case 7664: +case 7665: +case 7666: +case 7667: +case 7668: +case 7669: +case 7670: +case 7671: +case 7672: +case 7673: +case 7674: +case 7675: +case 7676: +case 7677: +case 7678: +case 7679: +case 7680: +case 7681: +case 7682: +case 7683: +case 7684: +case 7685: +case 7686: +case 7687: +case 7688: +case 7689: +case 7690: +case 7691: +case 7692: +case 7693: +case 7694: +case 7695: +case 7696: +case 7697: +case 7698: +case 7699: +case 7700: +case 7701: +case 7702: +case 7703: +case 7704: +case 7705: +case 7706: +case 7707: +case 7708: +case 7709: +case 7710: +case 7711: +case 7712: +case 7713: +case 7714: +case 7715: +case 7716: +case 7717: +case 7718: +case 7719: +case 7720: +case 7721: +case 7722: +case 7723: +case 7724: +case 7725: +case 7726: +case 7727: +case 7728: +case 7729: +case 7730: +case 7731: +case 7732: +case 7733: +case 7734: +case 7735: +case 7736: +case 7737: +case 7738: +case 7739: +case 7740: +case 7741: +case 7742: +case 7743: +case 7744: +case 7745: +case 7746: +case 7747: +case 7748: +case 7749: +case 7750: +case 7751: +case 7752: +case 7753: +case 7754: +case 7755: +case 7756: +case 7757: +case 7758: +case 7759: +case 7760: +case 7761: +case 7762: +case 7763: +case 7764: +case 7765: +case 7766: +case 7767: +case 7768: +case 7769: +case 7770: +case 7771: +case 7772: +case 7773: +case 7774: +case 7775: +case 7776: +case 7777: +case 7778: +case 7779: +case 7780: +case 7781: +case 7782: +case 7783: +case 7784: +case 7785: +case 7786: +case 7787: +case 7788: +case 7789: +case 7790: +case 7791: +case 7792: +case 7793: +case 7794: +case 7795: +case 7796: +case 7797: +case 7798: +case 7799: +case 7800: +case 7801: +case 7802: +case 7803: +case 7804: +case 7805: +case 7806: +case 7807: +case 7808: +case 7809: +case 7810: +case 7811: +case 7812: +case 7813: +case 7814: +case 7815: +case 7816: +case 7817: +case 7818: +case 7819: +case 7820: +case 7821: +case 7822: +case 7823: +case 7824: +case 7825: +case 7826: +case 7827: +case 7828: +case 7829: +case 7830: +case 7831: +case 7832: +case 7833: +case 7834: +case 7835: +case 7836: +case 7837: +case 7838: +case 7839: +case 7840: +case 7841: +case 7842: +case 7843: +case 7844: +case 7845: +case 7846: +case 7847: +case 7848: +case 7849: +case 7850: +case 7851: +case 7852: +case 7853: +case 7854: +case 7855: +case 7856: +case 7857: +case 7858: +case 7859: +case 7860: +case 7861: +case 7862: +case 7863: +case 7864: +case 7865: +case 7866: +case 7867: +case 7868: +case 7869: +case 7870: +case 7871: +case 7872: +case 7873: +case 7874: +case 7875: +case 7876: +case 7877: +case 7878: +case 7879: +case 7880: +case 7881: +case 7882: +case 7883: +case 7884: +case 7885: +case 7886: +case 7887: +case 7888: +case 7889: +case 7890: +case 7891: +case 7892: +case 7893: +case 7894: +case 7895: +case 7896: +case 7897: +case 7898: +case 7899: +case 7900: +case 7901: +case 7902: +case 7903: +case 7904: +case 7905: +case 7906: +case 7907: +case 7908: +case 7909: +case 7910: +case 7911: +case 7912: +case 7913: +case 7914: +case 7915: +case 7916: +case 7917: +case 7918: +case 7919: +case 7920: +case 7921: +case 7922: +case 7923: +case 7924: +case 7925: +case 7926: +case 7927: +case 7928: +case 7929: +case 7930: +case 7931: +case 7932: +case 7933: +case 7934: +case 7935: +case 7936: +case 7937: +case 7938: +case 7939: +case 7940: +case 7941: +case 7942: +case 7943: +case 7944: +case 7945: +case 7946: +case 7947: +case 7948: +case 7949: +case 7950: +case 7951: +case 7952: +case 7953: +case 7954: +case 7955: +case 7956: +case 7957: +case 7958: +case 7959: +case 7960: +case 7961: +case 7962: +case 7963: +case 7964: +case 7965: +case 7966: +case 7967: +case 7968: +case 7969: +case 7970: +case 7971: +case 7972: +case 7973: +case 7974: +case 7975: +case 7976: +case 7977: +case 7978: +case 7979: +case 7980: +case 7981: +case 7982: +case 7983: +case 7984: +case 7985: +case 7986: +case 7987: +case 7988: +case 7989: +case 7990: +case 7991: +case 7992: +case 7993: +case 7994: +case 7995: +case 7996: +case 7997: +case 7998: +case 7999: +case 8000: +case 8001: +case 8002: +case 8003: +case 8004: +case 8005: +case 8006: +case 8007: +case 8008: +case 8009: +case 8010: +case 8011: +case 8012: +case 8013: +case 8014: +case 8015: +case 8016: +case 8017: +case 8018: +case 8019: +case 8020: +case 8021: +case 8022: +case 8023: +case 8024: +case 8025: +case 8026: +case 8027: +case 8028: +case 8029: +case 8030: +case 8031: +case 8032: +case 8033: +case 8034: +case 8035: +case 8036: +case 8037: +case 8038: +case 8039: +case 8040: +case 8041: +case 8042: +case 8043: +case 8044: +case 8045: +case 8046: +case 8047: +case 8048: +case 8049: +case 8050: +case 8051: +case 8052: +case 8053: +case 8054: +case 8055: +case 8056: +case 8057: +case 8058: +case 8059: +case 8060: +case 8061: +case 8062: +case 8063: +case 8064: +case 8065: +case 8066: +case 8067: +case 8068: +case 8069: +case 8070: +case 8071: +case 8072: +case 8073: +case 8074: +case 8075: +case 8076: +case 8077: +case 8078: +case 8079: +case 8080: +case 8081: +case 8082: +case 8083: +case 8084: +case 8085: +case 8086: +case 8087: +case 8088: +case 8089: +case 8090: +case 8091: +case 8092: +case 8093: +case 8094: +case 8095: +case 8096: +case 8097: +case 8098: +case 8099: +case 8100: +case 8101: +case 8102: +case 8103: +case 8104: +case 8105: +case 8106: +case 8107: +case 8108: +case 8109: +case 8110: +case 8111: +case 8112: +case 8113: +case 8114: +case 8115: +case 8116: +case 8117: +case 8118: +case 8119: +case 8120: +case 8121: +case 8122: +case 8123: +case 8124: +case 8125: +case 8126: +case 8127: +case 8128: +case 8129: +case 8130: +case 8131: +case 8132: +case 8133: +case 8134: +case 8135: +case 8136: +case 8137: +case 8138: +case 8139: +case 8140: +case 8141: +case 8142: +case 8143: +case 8144: +case 8145: +case 8146: +case 8147: +case 8148: +case 8149: +case 8150: +case 8151: +case 8152: +case 8153: +case 8154: +case 8155: +case 8156: +case 8157: +case 8158: +case 8159: +case 8160: +case 8161: +case 8162: +case 8163: +case 8164: +case 8165: +case 8166: +case 8167: +case 8168: +case 8169: +case 8170: +case 8171: +case 8172: +case 8173: +case 8174: +case 8175: +case 8176: +case 8177: +case 8178: +case 8179: +case 8180: +case 8181: +case 8182: +case 8183: +case 8184: +case 8185: +case 8186: +case 8187: +case 8188: +case 8189: +case 8190: +case 8191: +case 8192: +case 8193: +case 8194: +case 8195: +case 8196: +case 8197: +case 8198: +case 8199: +case 8200: +case 8201: +case 8202: +case 8203: +case 8204: +case 8205: +case 8206: +case 8207: +case 8208: +case 8209: +case 8210: +case 8211: +case 8212: +case 8213: +case 8214: +case 8215: +case 8216: +case 8217: +case 8218: +case 8219: +case 8220: +case 8221: +case 8222: +case 8223: +case 8224: +case 8225: +case 8226: +case 8227: +case 8228: +case 8229: +case 8230: +case 8231: +case 8232: +case 8233: +case 8234: +case 8235: +case 8236: +case 8237: +case 8238: +case 8239: +case 8240: +case 8241: +case 8242: +case 8243: +case 8244: +case 8245: +case 8246: +case 8247: +case 8248: +case 8249: +case 8250: +case 8251: +case 8252: +case 8253: +case 8254: +case 8255: +case 8256: +case 8257: +case 8258: +case 8259: +case 8260: +case 8261: +case 8262: +case 8263: +case 8264: +case 8265: +case 8266: +case 8267: +case 8268: +case 8269: +case 8270: +case 8271: +case 8272: +case 8273: +case 8274: +case 8275: +case 8276: +case 8277: +case 8278: +case 8279: +case 8280: +case 8281: +case 8282: +case 8283: +case 8284: +case 8285: +case 8286: +case 8287: +case 8288: +case 8289: +case 8290: +case 8291: +case 8292: +case 8293: +case 8294: +case 8295: +case 8296: +case 8297: +case 8298: +case 8299: +case 8300: +case 8301: +case 8302: +case 8303: +case 8304: +case 8305: +case 8306: +case 8307: +case 8308: +case 8309: +case 8310: +case 8311: +case 8312: +case 8313: +case 8314: +case 8315: +case 8316: +case 8317: +case 8318: +case 8319: +case 8320: +case 8321: +case 8322: +case 8323: +case 8324: +case 8325: +case 8326: +case 8327: +case 8328: +case 8329: +case 8330: +case 8331: +case 8332: +case 8333: +case 8334: +case 8335: +case 8336: +case 8337: +case 8338: +case 8339: +case 8340: +case 8341: +case 8342: +case 8343: +case 8344: +case 8345: +case 8346: +case 8347: +case 8348: +case 8349: +case 8350: +case 8351: +case 8352: +case 8353: +case 8354: +case 8355: +case 8356: +case 8357: +case 8358: +case 8359: +case 8360: +case 8361: +case 8362: +case 8363: +case 8364: +case 8365: +case 8366: +case 8367: +case 8368: +case 8369: +case 8370: +case 8371: +case 8372: +case 8373: +case 8374: +case 8375: +case 8376: +case 8377: +case 8378: +case 8379: +case 8380: +case 8381: +case 8382: +case 8383: +case 8384: +case 8385: +case 8386: +case 8387: +case 8388: +case 8389: +case 8390: +case 8391: +case 8392: +case 8393: +case 8394: +case 8395: +case 8396: +case 8397: +case 8398: +case 8399: +case 8400: +case 8401: +case 8402: +case 8403: +case 8404: +case 8405: +case 8406: +case 8407: +case 8408: +case 8409: +case 8410: +case 8411: +case 8412: +case 8413: +case 8414: +case 8415: +case 8416: +case 8417: +case 8418: +case 8419: +case 8420: +case 8421: +case 8422: +case 8423: +case 8424: +case 8425: +case 8426: +case 8427: +case 8428: +case 8429: +case 8430: +case 8431: +case 8432: +case 8433: +case 8434: +case 8435: +case 8436: +case 8437: +case 8438: +case 8439: +case 8440: +case 8441: +case 8442: +case 8443: +case 8444: +case 8445: +case 8446: +case 8447: +case 8448: +case 8449: +case 8450: +case 8451: +case 8452: +case 8453: +case 8454: +case 8455: +case 8456: +case 8457: +case 8458: +case 8459: +case 8460: +case 8461: +case 8462: +case 8463: +case 8464: +case 8465: +case 8466: +case 8467: +case 8468: +case 8469: +case 8470: +case 8471: +case 8472: +case 8473: +case 8474: +case 8475: +case 8476: +case 8477: +case 8478: +case 8479: +case 8480: +case 8481: +case 8482: +case 8483: +case 8484: +case 8485: +case 8486: +case 8487: +case 8488: +case 8489: +case 8490: +case 8491: +case 8492: +case 8493: +case 8494: +case 8495: +case 8496: +case 8497: +case 8498: +case 8499: +case 8500: +case 8501: +case 8502: +case 8503: +case 8504: +case 8505: +case 8506: +case 8507: +case 8508: +case 8509: +case 8510: +case 8511: +case 8512: +case 8513: +case 8514: +case 8515: +case 8516: +case 8517: +case 8518: +case 8519: +case 8520: +case 8521: +case 8522: +case 8523: +case 8524: +case 8525: +case 8526: +case 8527: +case 8528: +case 8529: +case 8530: +case 8531: +case 8532: +case 8533: +case 8534: +case 8535: +case 8536: +case 8537: +case 8538: +case 8539: +case 8540: +case 8541: +case 8542: +case 8543: +case 8544: +case 8545: +case 8546: +case 8547: +case 8548: +case 8549: +case 8550: +case 8551: +case 8552: +case 8553: +case 8554: +case 8555: +case 8556: +case 8557: +case 8558: +case 8559: +case 8560: +case 8561: +case 8562: +case 8563: +case 8564: +case 8565: +case 8566: +case 8567: +case 8568: +case 8569: +case 8570: +case 8571: +case 8572: +case 8573: +case 8574: +case 8575: +case 8576: +case 8577: +case 8578: +case 8579: +case 8580: +case 8581: +case 8582: +case 8583: +case 8584: +case 8585: +case 8586: +case 8587: +case 8588: +case 8589: +case 8590: +case 8591: +case 8592: +case 8593: +case 8594: +case 8595: +case 8596: +case 8597: +case 8598: +case 8599: +case 8600: +case 8601: +case 8602: +case 8603: +case 8604: +case 8605: +case 8606: +case 8607: +case 8608: +case 8609: +case 8610: +case 8611: +case 8612: +case 8613: +case 8614: +case 8615: +case 8616: +case 8617: +case 8618: +case 8619: +case 8620: +case 8621: +case 8622: +case 8623: +case 8624: +case 8625: +case 8626: +case 8627: +case 8628: +case 8629: +case 8630: +case 8631: +case 8632: +case 8633: +case 8634: +case 8635: +case 8636: +case 8637: +case 8638: +case 8639: +case 8640: +case 8641: +case 8642: +case 8643: +case 8644: +case 8645: +case 8646: +case 8647: +case 8648: +case 8649: +case 8650: +case 8651: +case 8652: +case 8653: +case 8654: +case 8655: +case 8656: +case 8657: +case 8658: +case 8659: +case 8660: +case 8661: +case 8662: +case 8663: +case 8664: +case 8665: +case 8666: +case 8667: +case 8668: +case 8669: +case 8670: +case 8671: +case 8672: +case 8673: +case 8674: +case 8675: +case 8676: +case 8677: +case 8678: +case 8679: +case 8680: +case 8681: +case 8682: +case 8683: +case 8684: +case 8685: +case 8686: +case 8687: +case 8688: +case 8689: +case 8690: +case 8691: +case 8692: +case 8693: +case 8694: +case 8695: +case 8696: +case 8697: +case 8698: +case 8699: +case 8700: +case 8701: +case 8702: +case 8703: +case 8704: +case 8705: +case 8706: +case 8707: +case 8708: +case 8709: +case 8710: +case 8711: +case 8712: +case 8713: +case 8714: +case 8715: +case 8716: +case 8717: +case 8718: +case 8719: +case 8720: +case 8721: +case 8722: +case 8723: +case 8724: +case 8725: +case 8726: +case 8727: +case 8728: +case 8729: +case 8730: +case 8731: +case 8732: +case 8733: +case 8734: +case 8735: +case 8736: +case 8737: +case 8738: +case 8739: +case 8740: +case 8741: +case 8742: +case 8743: +case 8744: +case 8745: +case 8746: +case 8747: +case 8748: +case 8749: +case 8750: +case 8751: +case 8752: +case 8753: +case 8754: +case 8755: +case 8756: +case 8757: +case 8758: +case 8759: +case 8760: +case 8761: +case 8762: +case 8763: +case 8764: +case 8765: +case 8766: +case 8767: +case 8768: +case 8769: +case 8770: +case 8771: +case 8772: +case 8773: +case 8774: +case 8775: +case 8776: +case 8777: +case 8778: +case 8779: +case 8780: +case 8781: +case 8782: +case 8783: +case 8784: +case 8785: +case 8786: +case 8787: +case 8788: +case 8789: +case 8790: +case 8791: +case 8792: +case 8793: +case 8794: +case 8795: +case 8796: +case 8797: +case 8798: +case 8799: +case 8800: +case 8801: +case 8802: +case 8803: +case 8804: +case 8805: +case 8806: +case 8807: +case 8808: +case 8809: +case 8810: +case 8811: +case 8812: +case 8813: +case 8814: +case 8815: +case 8816: +case 8817: +case 8818: +case 8819: +case 8820: +case 8821: +case 8822: +case 8823: +case 8824: +case 8825: +case 8826: +case 8827: +case 8828: +case 8829: +case 8830: +case 8831: +case 8832: +case 8833: +case 8834: +case 8835: +case 8836: +case 8837: +case 8838: +case 8839: +case 8840: +case 8841: +case 8842: +case 8843: +case 8844: +case 8845: +case 8846: +case 8847: +case 8848: +case 8849: +case 8850: +case 8851: +case 8852: +case 8853: +case 8854: +case 8855: +case 8856: +case 8857: +case 8858: +case 8859: +case 8860: +case 8861: +case 8862: +case 8863: +case 8864: +case 8865: +case 8866: +case 8867: +case 8868: +case 8869: +case 8870: +case 8871: +case 8872: +case 8873: +case 8874: +case 8875: +case 8876: +case 8877: +case 8878: +case 8879: +case 8880: +case 8881: +case 8882: +case 8883: +case 8884: +case 8885: +case 8886: +case 8887: +case 8888: +case 8889: +case 8890: +case 8891: +case 8892: +case 8893: +case 8894: +case 8895: +case 8896: +case 8897: +case 8898: +case 8899: +case 8900: +case 8901: +case 8902: +case 8903: +case 8904: +case 8905: +case 8906: +case 8907: +case 8908: +case 8909: +case 8910: +case 8911: +case 8912: +case 8913: +case 8914: +case 8915: +case 8916: +case 8917: +case 8918: +case 8919: +case 8920: +case 8921: +case 8922: +case 8923: +case 8924: +case 8925: +case 8926: +case 8927: +case 8928: +case 8929: +case 8930: +case 8931: +case 8932: +case 8933: +case 8934: +case 8935: +case 8936: +case 8937: +case 8938: +case 8939: +case 8940: +case 8941: +case 8942: +case 8943: +case 8944: +case 8945: +case 8946: +case 8947: +case 8948: +case 8949: +case 8950: +case 8951: +case 8952: +case 8953: +case 8954: +case 8955: +case 8956: +case 8957: +case 8958: +case 8959: +case 8960: +case 8961: +case 8962: +case 8963: +case 8964: +case 8965: +case 8966: +case 8967: +case 8968: +case 8969: +case 8970: +case 8971: +case 8972: +case 8973: +case 8974: +case 8975: +case 8976: +case 8977: +case 8978: +case 8979: +case 8980: +case 8981: +case 8982: +case 8983: +case 8984: +case 8985: +case 8986: +case 8987: +case 8988: +case 8989: +case 8990: +case 8991: +case 8992: +case 8993: +case 8994: +case 8995: +case 8996: +case 8997: +case 8998: +case 8998: // DUPLICATE LABEL + actual += 'a'; +case 8999: + actual += 'b'; +} +expect = 'ab'; +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/Statements/regress-83532-001.js b/js/src/tests/ecma_3/Statements/regress-83532-001.js new file mode 100644 index 000000000..1783264fb --- /dev/null +++ b/js/src/tests/ecma_3/Statements/regress-83532-001.js @@ -0,0 +1,37 @@ +/* -*- 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: 01 June 2001 + * + * SUMMARY: Testing that we don't crash on switch case -1... + * See http://bugzilla.mozilla.org/show_bug.cgi?id=83532 + * + */ +//----------------------------------------------------------------------------- +var BUGNUMBER = 83532; +var summary = "Testing that we don't crash on switch case -1"; + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + // Just testing that we don't crash on these - + function f () {switch(1) {case -1:}} + function g(){switch(1){case (-1):}} + var h = function() {switch(1) {case -1:}} + f(); + g(); + h(); + reportCompare('No Crash', 'No Crash', ''); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/Statements/regress-83532-002.js b/js/src/tests/ecma_3/Statements/regress-83532-002.js new file mode 100644 index 000000000..49e34ea0e --- /dev/null +++ b/js/src/tests/ecma_3/Statements/regress-83532-002.js @@ -0,0 +1,40 @@ +/* -*- 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: 01 June 2001 + * + * SUMMARY: Testing that we don't crash on switch case -1... + * See http://bugzilla.mozilla.org/show_bug.cgi?id=83532 + * + */ +//----------------------------------------------------------------------------- +var BUGNUMBER = 83532; +var summary = "Testing that we don't crash on switch case -1"; +var sToEval = ''; + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + // Just testing that we don't crash on these - + sToEval += 'function f () {switch(1) {case -1:}};'; + sToEval += 'function g(){switch(1){case (-1):}};'; + sToEval += 'var h = function() {switch(1) {case -1:}};' + sToEval += 'f();'; + sToEval += 'g();'; + sToEval += 'h();'; + eval(sToEval); + + reportCompare('No Crash', 'No Crash', ''); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/Statements/shell.js b/js/src/tests/ecma_3/Statements/shell.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/ecma_3/Statements/shell.js diff --git a/js/src/tests/ecma_3/Statements/switch-001.js b/js/src/tests/ecma_3/Statements/switch-001.js new file mode 100644 index 000000000..20cb59d84 --- /dev/null +++ b/js/src/tests/ecma_3/Statements/switch-001.js @@ -0,0 +1,109 @@ +/* -*- 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 May 2001 + * + * SUMMARY: Testing the switch statement + * + * See ECMA3 Section 12.11, "The switch Statement" + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = '(none)'; +var summary = 'Testing the switch statement'; +var cnMatch = 'Match'; +var cnNoMatch = 'NoMatch'; +var status = ''; +var statusitems = [ ]; +var actual = ''; +var actualvalues = [ ]; +var expect= ''; +var expectedvalues = [ ]; + + +status = 'Section A of test'; +actual = match(17, f(fInverse(17)), f, fInverse); +expect = cnMatch; +addThis(); + +status = 'Section B of test'; +actual = match(17, 18, f, fInverse); +expect = cnNoMatch; +addThis(); + +status = 'Section C of test'; +actual = match(1, 1, Math.exp, Math.log); +expect = cnMatch; +addThis(); + +status = 'Section D of test'; +actual = match(1, 2, Math.exp, Math.log); +expect = cnNoMatch; +addThis(); + +status = 'Section E of test'; +actual = match(1, 1, Math.sin, Math.cos); +expect = cnNoMatch; +addThis(); + + + +//--------------------------------------------------------------------------------- +test(); +//--------------------------------------------------------------------------------- + + + +/* + * If F,G are inverse functions and x==y, this should return cnMatch - + */ +function match(x, y, F, G) +{ + switch (x) + { + case F(G(y)): + return cnMatch; + + default: + return cnNoMatch; + } +} + + +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'); +} + + +function f(m) +{ + return 2*(m+1); +} + + +function fInverse(n) +{ + return (n-2)/2; +} diff --git a/js/src/tests/ecma_3/Statements/switch-002.js b/js/src/tests/ecma_3/Statements/switch-002.js new file mode 100644 index 000000000..e6cf1dfbd --- /dev/null +++ b/js/src/tests/ecma_3/Statements/switch-002.js @@ -0,0 +1,19 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + * Contributor: Jeff Walden + */ + +var x = undefined; +var passed = false; +switch (x) +{ + case undefined: + passed = true; + default: + break; +} +assertEq(passed, true); + +reportCompare(true, true); diff --git a/js/src/tests/ecma_3/String/15.5.4.11.js b/js/src/tests/ecma_3/String/15.5.4.11.js new file mode 100644 index 000000000..0fd6caaf4 --- /dev/null +++ b/js/src/tests/ecma_3/String/15.5.4.11.js @@ -0,0 +1,498 @@ +/* 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 = 392378; +var summary = '15.5.4.11 - String.prototype.replace'; +var rex, f, a, i; + +reportCompare( + 2, + String.prototype.replace.length, + "Section 1" +); + +reportCompare( + "321", + String.prototype.replace.call(123, "123", "321"), + "Section 2" +); + +reportCompare( + "ok", + "ok".replace(), + "Section 3" +); + +reportCompare( + "undefined**", + "***".replace("*"), + "Section 4" +); + +reportCompare( + "xnullz", + "xyz".replace("y", null), + "Section 5" +); + +reportCompare( + "x123", + "xyz".replace("yz", 123), + "Section 6" +); + +reportCompare( + "/x/g/x/g/x/g", + "xxx".replace(/x/g, /x/g), + "Section 7" +); + +reportCompare( + "ok", + "undefined".replace(undefined, "ok"), + "Section 8" +); + +reportCompare( + "ok", + "null".replace(null, "ok"), + "Section 9" +); + +reportCompare( + "ok", + "123".replace(123, "ok"), + "Section 10" +); + +reportCompare( + "xzyxyz", + "xyzxyz".replace("yz", "zy"), + "Section 11" +); + +reportCompare( + "ok", + "(xyz)".replace("(xyz)", "ok"), + "Section 12" +); + +reportCompare( + "*$&yzxyz", + "xyzxyz".replace("x", "*$$&"), + "Section 13" +); + +reportCompare( + "xy*z*", + "xyz".replace("z", "*$&*"), + "Section 14" +); + +reportCompare( + "xyxyzxyz", + "xyzxyzxyz".replace("zxy", "$`"), + "Section 15" +); + +reportCompare( + "zxyzxyzzxyz", + "xyzxyz".replace("xy", "$'xyz"), + "Section 16" +); + +reportCompare( + "$", + "xyzxyz".replace("xyzxyz", "$"), + "Section 17" +); + +reportCompare( + "x$0$00xyz", + "xyzxyz".replace("yz", "$0$00"), + "Section 18" +); + +// Result for $1/$01 .. $99 is implementation-defined if searchValue is no +// regular expression. $+ is a non-standard Mozilla extension. + +reportCompare( + "$!$\"$-1$*$#$.$xyz$$", + "xyzxyz$$".replace("xyz", "$!$\"$-1$*$#$.$"), + "Section 19" +); + +reportCompare( + "$$$&$$$&$&", + "$$$&".replace("$$", "$$$$$$&$&$$&"), + "Section 20" +); + +reportCompare( + "yxx", + "xxx".replace(/x/, "y"), + "Section 21" +); + +reportCompare( + "yyy", + "xxx".replace(/x/g, "y"), + "Section 22" +); + +rex = /x/, rex.lastIndex = 1; +reportCompare( + "yxx1", + "xxx".replace(rex, "y") + rex.lastIndex, + "Section 23" +); + +rex = /x/g, rex.lastIndex = 1; +reportCompare( + "yyy0", + "xxx".replace(rex, "y") + rex.lastIndex, + "Section 24" +); + +rex = /y/, rex.lastIndex = 1; +reportCompare( + "xxx0", + "xxx".replace(rex, "y") + rex.lastIndex, + "Section 25" +); + +rex = /y/g, rex.lastIndex = 1; +reportCompare( + "xxx0", + "xxx".replace(rex, "y") + rex.lastIndex, + "Section 26" +); + +rex = /x?/, rex.lastIndex = 1; +reportCompare( + "(x)xx1", + "xxx".replace(rex, "($&)") + rex.lastIndex, + "Section 27" +); + +rex = /x?/g, rex.lastIndex = 1; +reportCompare( + "(x)(x)(x)()0", + "xxx".replace(rex, "($&)") + rex.lastIndex, + "Section 28" +); + +rex = /y?/, rex.lastIndex = 1; +reportCompare( + "()xxx1", + "xxx".replace(rex, "($&)") + rex.lastIndex, + "Section 29" +); + +rex = /y?/g, rex.lastIndex = 1; +reportCompare( + "()x()x()x()0", + "xxx".replace(rex, "($&)") + rex.lastIndex, + "Section 30" +); + +reportCompare( + "xy$0xy$zxy$zxyz$zxyz", + "xyzxyzxyz".replace(/zxy/, "$0$`$$$&$$$'$"), + "Section 31" +); + +reportCompare( + "xy$0xy$zxy$zxyz$$0xyzxy$zxy$z$z", + "xyzxyzxyz".replace(/zxy/g, "$0$`$$$&$$$'$"), + "Section 32" +); + +reportCompare( + "xyxyxyzxyxyxyz", + "xyzxyz".replace(/(((x)(y)()()))()()()(z)/g, "$01$2$3$04$5$6$7$8$09$10"), + "Section 33" +); + +rex = RegExp( + "()()()()()()()()()()" + + "()()()()()()()()()()" + + "()()()()()()()()()()" + + "()()()()()()()()()()" + + "()()()()()()()()()()" + + "()()()()()()()()()()" + + "()()()()()()()()()()" + + "()()()()()()()()()()" + + "()()()()()()()()()()" + + "()()()()()()()()(y)"); +reportCompare( + "x(y)z", + "xyz".replace(rex, "($99)"), + "Section 34" +); + +rex = RegExp( + "()()()()()()()()()(x)" + + "()()()()()()()()()()" + + "()()()()()()()()()()" + + "()()()()()()()()()()" + + "()()()()()()()()()()" + + "()()()()()()()()()()" + + "()()()()()()()()()()" + + "()()()()()()()()()()" + + "()()()()()()()()()()" + + "()()()()()()()()()(y)"); +reportCompare( + "(x0)z", + "xyz".replace(rex, "($100)"), + "Section 35" +); + +reportCompare( + "xyz(XYZ)", + "xyzXYZ".replace(/XYZ/g, "($&)"), + "Section 36" +); + +reportCompare( + "(xyz)(XYZ)", + "xyzXYZ".replace(/xYz/gi, "($&)"), + "Section 37" +); + +reportCompare( + "xyz\rxyz\n", + "xyz\rxyz\n".replace(/xyz$/g, "($&)"), + "Section 38" +); + +reportCompare( + "(xyz)\r(xyz)\n", + "xyz\rxyz\n".replace(/xyz$/gm, "($&)"), + "Section 39" +); + +f = function () { return "failure" }; + +reportCompare( + "ok", + "ok".replace("x", f), + "Section 40" +); + +reportCompare( + "ok", + "ok".replace(/(?=k)ok/, f), + "Section 41" +); + +reportCompare( + "ok", + "ok".replace(/(?!)ok/, f), + "Section 42" +); + +reportCompare( + "ok", + "ok".replace(/ok(?!$)/, f), + "Section 43" +); + +f = function (sub, offs, str) { + return ["", sub, typeof sub, offs, typeof offs, str, typeof str, ""] + .join("|"); +}; + +reportCompare( + "x|y|string|1|number|xyz|string|z", + "xyz".replace("y", f), + "Section 44" +); + +reportCompare( + "x|(y)|string|1|number|x(y)z|string|z", + "x(y)z".replace("(y)", f), + "Section 45" +); + +reportCompare( + "x|y*|string|1|number|xy*z|string|z", + "xy*z".replace("y*", f), + "Section 46" +); + +reportCompare( + "12|3|string|2|number|12345|string|45", + String.prototype.replace.call(1.2345e4, 3, f), + "Section 47" +); + +reportCompare( + "|x|string|0|number|xxx|string|xx", + "xxx".replace(/^x/g, f), + "Section 48" +); + +reportCompare( + "xx|x|string|2|number|xxx|string|", + "xxx".replace(/x$/g, f), + "Section 49" +); + +f = function (sub, paren, offs, str) { + return ["", sub, typeof sub, paren, typeof paren, offs, typeof offs, + str, typeof str, ""].join("|"); +}; + +reportCompare( + "xy|z|string|z|string|2|number|xyz|string|", + "xyz".replace(/(z)/g, f), + "Section 50" +); + +reportCompare( + "xyz||string||string|3|number|xyz|string|", + "xyz".replace(/($)/g, f), + "Section 51" +); + +reportCompare( + "|xy|string|y|string|0|number|xyz|string|z", + "xyz".replace(/(?:x)(y)/g, f), + "Section 52" +); + +reportCompare( + "|x|string|x|string|0|number|xyz|string|yz", + "xyz".replace(/((?=xy)x)/g, f), + "Section 53" +); + +reportCompare( + "|x|string|x|string|0|number|xyz|string|yz", + "xyz".replace(/(x(?=y))/g, f), + "Section 54" +); + +reportCompare( + "x|y|string|y|string|1|number|xyz|string|z", + "xyz".replace(/((?!x)y)/g, f), + "Section 55" +); + +reportCompare( + "|x|string|x|string|0|number|xyz|string|" + + "|y|string||undefined|1|number|xyz|string|z", + "xyz".replace(/y|(x)/g, f), + "Section 56" +); + +reportCompare( + "xy|z|string||string|2|number|xyz|string|", + "xyz".replace(/(z?)z/, f), + "Section 57" +); + +reportCompare( + "xy|z|string||undefined|2|number|xyz|string|", + "xyz".replace(/(z)?z/, f), + "Section 58" +); + +reportCompare( + "xy|z|string||undefined|2|number|xyz|string|", + "xyz".replace(/(z)?\1z/, f), + "Section 59" +); + +reportCompare( + "xy|z|string||undefined|2|number|xyz|string|", + "xyz".replace(/\1(z)?z/, f), + "Section 60" +); + +reportCompare( + "xy|z|string||string|2|number|xyz|string|", + "xyz".replace(/(z?\1)z/, f), + "Section 61" +); + +f = function (sub, paren1, paren2, offs, str) { + return ["", sub, typeof sub, paren1, typeof paren1, paren2, typeof paren2, + offs, typeof offs, str, typeof str, ""].join("|"); +}; + +reportCompare( + "x|y|string|y|string||undefined|1|number|xyz|string|z", + "xyz".replace(/(y)(\1)?/, f), + "Section 62" +); + +reportCompare( + "x|yy|string|y|string|y|string|1|number|xyyz|string|z", + "xyyz".replace(/(y)(\1)?/g, f), + "Section 63" +); + +reportCompare( + "x|y|string|y|string||undefined|1|number|xyyz|string|" + + "|y|string|y|string||undefined|2|number|xyyz|string|z", + "xyyz".replace(/(y)(\1)??/g, f), + "Section 64" +); + +reportCompare( + "x|y|string|y|string|y|string|1|number|xyz|string|z", + "xyz".replace(/(?=(y))(\1)?/, f), + "Section 65" +); + +reportCompare( + "xyy|z|string||undefined||string|3|number|xyyz|string|", + "xyyz".replace(/(?!(y)y)(\1)z/, f), + "Section 66" +); + +rex = RegExp( + "()()()()()()()()()()" + + "()()()()()()()()()()" + + "()()()()()()()()()()" + + "()()()()()()()()()()" + + "()()()()()()()()()()" + + "()()()()()()()()()()" + + "()()()()()()()()()()" + + "()()()()()()()()()()" + + "()()()()()()()()()()" + + "()()()()()()()()()()(z)?(y)"); +a = ["sub"]; +for (i = 1; i <= 102; ++i) + a[i] = "p" + i; +a[103] = "offs"; +a[104] = "str"; +a[105] = "return ['', sub, typeof sub, offs, typeof offs, str, typeof str, " + + "p100, typeof p100, p101, typeof p101, p102, typeof p102, ''].join('|');"; +f = Function.apply(null, a); +reportCompare( + "x|y|string|1|number|xyz|string||string||undefined|y|string|z", + "xyz".replace(rex, f), + "Section 67" +); + +reportCompare( + "undefined", + "".replace(/.*/g, function () {}), + "Section 68" +); + +reportCompare( + "nullxnullynullznull", + "xyz".replace(/.??/g, function () { return null; }), + "Section 69" +); + +reportCompare( + "111", + "xyz".replace(/./g, function () { return 1; }), + "Section 70" +); diff --git a/js/src/tests/ecma_3/String/15.5.4.14.js b/js/src/tests/ecma_3/String/15.5.4.14.js new file mode 100644 index 000000000..8542e84f4 --- /dev/null +++ b/js/src/tests/ecma_3/String/15.5.4.14.js @@ -0,0 +1,17 @@ +/* -*- 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 = 287630; +var summary = '15.5.4.14 - String.prototype.split(/()/)'; +var actual = ''; +var expect = ['a'].toString(); + +printBugNumber(BUGNUMBER); +printStatus (summary); + +actual = 'a'.split(/()/).toString(); + +reportCompare(expect, actual, summary); diff --git a/js/src/tests/ecma_3/String/browser.js b/js/src/tests/ecma_3/String/browser.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/ecma_3/String/browser.js diff --git a/js/src/tests/ecma_3/String/regress-104375.js b/js/src/tests/ecma_3/String/regress-104375.js new file mode 100644 index 000000000..97fa0f9e1 --- /dev/null +++ b/js/src/tests/ecma_3/String/regress-104375.js @@ -0,0 +1,82 @@ +/* -*- 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: 12 October 2001 + * + * SUMMARY: Regression test for string.replace bug 104375 + * See http://bugzilla.mozilla.org/show_bug.cgi?id=104375 + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = 104375; +var summary = 'Testing string.replace() with backreferences'; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; + + +/* + * Use the regexp to replace 'uid=31' with 'uid=15' + * + * In the second parameter of string.replace() method, + * "$1" refers to the first backreference: 'uid=' + */ +var str = 'uid=31'; +var re = /(uid=)(\d+)/; + +// try the numeric literal 15 +status = inSection(1); +actual = str.replace (re, "$1" + 15); +expect = 'uid=15'; +addThis(); + +// try the string literal '15' +status = inSection(2); +actual = str.replace (re, "$1" + '15'); +expect = 'uid=15'; +addThis(); + +// try a letter before the '15' +status = inSection(3); +actual = str.replace (re, "$1" + 'A15'); +expect = 'uid=A15'; +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/String/regress-189898.js b/js/src/tests/ecma_3/String/regress-189898.js new file mode 100644 index 000000000..ce207ede8 --- /dev/null +++ b/js/src/tests/ecma_3/String/regress-189898.js @@ -0,0 +1,123 @@ +/* -*- 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: 21 January 2003 + * SUMMARY: Regression test for bug 189898 + * See http://bugzilla.mozilla.org/show_bug.cgi?id=189898 + * + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = 189898; +var summary = 'Regression test for bug 189898'; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; + + +status = inSection(1); +actual = 'XaXY'.replace('XY', '--') + expect = 'Xa--'; +addThis(); + +status = inSection(2); +actual = '$a$^'.replace('$^', '--') + expect = '$a--'; +addThis(); + +status = inSection(3); +actual = 'ababc'.replace('abc', '--') + expect = 'ab--'; +addThis(); + +status = inSection(4); +actual = 'ababc'.replace('abc', '^$') + expect = 'ab^$'; +addThis(); + + + +/* + * Same as above, but providing a regexp in the first parameter + * to String.prototype.replace() instead of a string. + * + * See http://bugzilla.mozilla.org/show_bug.cgi?id=83293 + * for subtleties on this issue - + */ +status = inSection(5); +actual = 'XaXY'.replace(/XY/, '--') + expect = 'Xa--'; +addThis(); + +status = inSection(6); +actual = 'XaXY'.replace(/XY/g, '--') + expect = 'Xa--'; +addThis(); + +status = inSection(7); +actual = '$a$^'.replace(/\$\^/, '--') + expect = '$a--'; +addThis(); + +status = inSection(8); +actual = '$a$^'.replace(/\$\^/g, '--') + expect = '$a--'; +addThis(); + +status = inSection(9); +actual = 'ababc'.replace(/abc/, '--') + expect = 'ab--'; +addThis(); + +status = inSection(10); +actual = 'ababc'.replace(/abc/g, '--') + expect = 'ab--'; +addThis(); + +status = inSection(11); +actual = 'ababc'.replace(/abc/, '^$') + expect = 'ab^$'; +addThis(); + +status = inSection(12); +actual = 'ababc'.replace(/abc/g, '^$') + expect = 'ab^$'; +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/String/regress-304376.js b/js/src/tests/ecma_3/String/regress-304376.js new file mode 100644 index 000000000..d88c03c88 --- /dev/null +++ b/js/src/tests/ecma_3/String/regress-304376.js @@ -0,0 +1,34 @@ +/* -*- 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 = 304376; +var summary = 'String.prototype should be readonly and permanent'; +var actual = ''; +var expect = ''; +printBugNumber(BUGNUMBER); +printStatus (summary); + +expect = 'TypeError'; + +var saveString = String; + +String = Array; + +try +{ + // see if we can crash... + "".join(); + String = saveString; + actual = 'No Error'; +} +catch(ex) +{ + String = saveString; + actual = ex.name; + printStatus(ex + ''); +} + +reportCompare(expect, actual, summary); diff --git a/js/src/tests/ecma_3/String/regress-313567.js b/js/src/tests/ecma_3/String/regress-313567.js new file mode 100644 index 000000000..894a82175 --- /dev/null +++ b/js/src/tests/ecma_3/String/regress-313567.js @@ -0,0 +1,23 @@ +/* -*- 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 = 313567; +var summary = 'String.prototype.length should not be generic'; +var actual = ''; +var expect = ''; + +printBugNumber(BUGNUMBER); +printStatus (summary); + +var s = new String("1"); +s.toString = function() { + return "22"; +} + var expect = 1; +var actual = s.length; +printStatus("expect="+expect+" actual="+actual); + +reportCompare(expect, actual, summary); diff --git a/js/src/tests/ecma_3/String/regress-369778.js b/js/src/tests/ecma_3/String/regress-369778.js new file mode 100644 index 000000000..ad282eb46 --- /dev/null +++ b/js/src/tests/ecma_3/String/regress-369778.js @@ -0,0 +1,29 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +var BUGNUMBER = 369778; +var summary = + "RegExpStatics::makeMatch should make an undefined value when the last " + + "match had an undefined capture."; + +print(BUGNUMBER + ": " + summary); + +/************** + * BEGIN TEST * + **************/ + +var expected = undefined; +var actual; + +'x'.replace(/x(.)?/g, function(m, group) { actual = group; }) + +print("expected: " + expected) +print("actual: " + actual) + +assertEq(expected, actual) + +/******************************************************************************/ + +if (typeof reportCompare === "function") + reportCompare(true, true); + diff --git a/js/src/tests/ecma_3/String/regress-392378.js b/js/src/tests/ecma_3/String/regress-392378.js new file mode 100644 index 000000000..6bfdf8142 --- /dev/null +++ b/js/src/tests/ecma_3/String/regress-392378.js @@ -0,0 +1,44 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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 = 392378; +var summary = 'Regular Expression Non-participating Capture Groups are inaccurate in edge cases'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + expect = ["", undefined, ""] + ''; + actual = "y".split(/(x)?\1y/) + ''; + reportCompare(expect, actual, summary + ': "y".split(/(x)?\1y/)'); + + expect = ["", undefined, ""] + ''; + actual = "y".split(/(x)?y/) + ''; + reportCompare(expect, actual, summary + ': "y".split(/(x)?y/)'); + + expect = 'undefined'; + actual = "y".replace(/(x)?\1y/, function($0, $1){ return String($1); }) + ''; + reportCompare(expect, actual, summary + ': "y".replace(/(x)?\\1y/, function($0, $1){ return String($1); })'); + + expect = 'undefined'; + actual = "y".replace(/(x)?y/, function($0, $1){ return String($1); }) + ''; + reportCompare(expect, actual, summary + ': "y".replace(/(x)?y/, function($0, $1){ return String($1); })'); + + expect = 'undefined'; + actual = "y".replace(/(x)?y/, function($0, $1){ return $1; }) + ''; + reportCompare(expect, actual, summary + ': "y".replace(/(x)?y/, function($0, $1){ return $1; })'); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/String/regress-83293.js b/js/src/tests/ecma_3/String/regress-83293.js new file mode 100644 index 000000000..6bd17a725 --- /dev/null +++ b/js/src/tests/ecma_3/String/regress-83293.js @@ -0,0 +1,182 @@ +/* -*- 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/. */ + + +/* + * Creation Date: 30 May 2001 + * Correction Date: 14 Aug 2001 + * + * SUMMARY: Regression test for bugs 83293, 103351 + * See http://bugzilla.mozilla.org/show_bug.cgi?id=83293 + * http://bugzilla.mozilla.org/show_bug.cgi?id=103351 + * http://bugzilla.mozilla.org/show_bug.cgi?id=92942 + * + * + * ******************** CORRECTION !!! ***************************** + * + * When I originally wrote this test, I thought this was true: + * str.replace(strA, strB) == str.replace(new RegExp(strA),strB). + * See ECMA-262 Final Draft, 15.5.4.11 String.prototype.replace + * + * However, in http://bugzilla.mozilla.org/show_bug.cgi?id=83293 + * Jim Ley points out the ECMA-262 Final Edition changed on this. + * String.prototype.replace (searchValue, replaceValue), if provided + * a searchValue that is not a RegExp, is NO LONGER to replace it with + * + * new RegExp(searchValue) + * but rather: + * String(searchValue) + * + * This puts the replace() method at variance with search() and match(), + * which continue to follow the RegExp conversion of the Final Draft. + * It also makes most of this testcase, as originally written, invalid. + ********************************************************************** + */ + +//----------------------------------------------------------------------------- +var BUGNUMBER = 103351; // <--- (Outgrowth of original bug 83293) +var summ_OLD = 'Testing str.replace(strA, strB) == str.replace(new RegExp(strA),strB)'; +var summ_NEW = 'Testing String.prototype.replace(x,y) when x is a string'; +var summary = summ_NEW; +var status = ''; +var actual = ''; +var expect= ''; +var cnEmptyString = ''; +var str = 'abc'; +var strA = cnEmptyString; +var strB = 'Z'; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + + +/* + * In this test, it's important to reportCompare() each other case + * BEFORE the last two cases are attempted. Don't store all results + * in an array and reportCompare() them at the end, as we usually do. + * + * When this bug was filed, str.replace(strA, strB) would return no value + * whatsoever if strA == cnEmptyString, and no error, either - + */ +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + +/******************* THESE WERE INCORRECT; SEE ABOVE ************************ + status = 'Section A of test'; + strA = 'a'; + actual = str.replace(strA, strB); + expect = str.replace(new RegExp(strA), strB); + reportCompare(expect, actual, status); + + status = 'Section B of test'; + strA = 'x'; + actual = str.replace(strA, strB); + expect = str.replace(new RegExp(strA), strB); + reportCompare(expect, actual, status); + + status = 'Section C of test'; + strA = undefined; + actual = str.replace(strA, strB); + expect = str.replace(new RegExp(strA), strB); + reportCompare(expect, actual, status); + + status = 'Section D of test'; + strA = null; + actual = str.replace(strA, strB); + expect = str.replace(new RegExp(strA), strB); + reportCompare(expect, actual, status); + + + * This example is from jim@jibbering.com (see Bugzilla bug 92942) + * It is a variation on the example below. + * + * Namely, we are using the regexp /$/ instead of the regexp //. + * The regexp /$/ means we should match the "empty string" at the + * end-boundary of the word, instead of the one at the beginning. + * + status = 'Section E of test'; + var strJim = 'aa$aa'; + strA = '$'; + actual = strJim.replace(strA, strB); // bug -> 'aaZaa' + expect = strJim.replace(new RegExp(strA), strB); // expect 'aa$aaZ' + reportCompare(expect, actual, status); + + + * + * Note: 'Zabc' is the result we expect for 'abc'.replace('', 'Z'). + * + * The string '' is supposed to be equivalent to new RegExp('') = //. + * The regexp // means we should match the "empty string" conceived of + * at the beginning boundary of the word, before the first character. + * + status = 'Section F of test'; + strA = cnEmptyString; + actual = str.replace(strA, strB); + expect = 'Zabc'; + reportCompare(expect, actual, status); + + status = 'Section G of test'; + strA = cnEmptyString; + actual = str.replace(strA, strB); + expect = str.replace(new RegExp(strA), strB); + reportCompare(expect, actual, status); + + ************************* END OF INCORRECT CASES ****************************/ + + +////////////////////////// OK, LET'S START OVER ////////////////////////////// + + status = 'Section 1 of test'; + actual = 'abc'.replace('a', 'Z'); + expect = 'Zbc'; + reportCompare(expect, actual, status); + + status = 'Section 2 of test'; + actual = 'abc'.replace('b', 'Z'); + expect = 'aZc'; + reportCompare(expect, actual, status); + + status = 'Section 3 of test'; + actual = 'abc'.replace(undefined, 'Z'); + expect = 'abc'; // String(undefined) == 'undefined'; no replacement possible + reportCompare(expect, actual, status); + + status = 'Section 4 of test'; + actual = 'abc'.replace(null, 'Z'); + expect = 'abc'; // String(null) == 'null'; no replacement possible + reportCompare(expect, actual, status); + + status = 'Section 5 of test'; + actual = 'abc'.replace(true, 'Z'); + expect = 'abc'; // String(true) == 'true'; no replacement possible + reportCompare(expect, actual, status); + + status = 'Section 6 of test'; + actual = 'abc'.replace(false, 'Z'); + expect = 'abc'; // String(false) == 'false'; no replacement possible + reportCompare(expect, actual, status); + + status = 'Section 7 of test'; + actual = 'aa$aa'.replace('$', 'Z'); + expect = 'aaZaa'; // NOT 'aa$aaZ' as in ECMA Final Draft; see above + reportCompare(expect, actual, status); + + status = 'Section 8 of test'; + actual = 'abc'.replace('.*', 'Z'); + expect = 'abc'; // not 'Z' as in EMCA Final Draft + reportCompare(expect, actual, status); + + status = 'Section 9 of test'; + actual = 'abc'.replace('', 'Z'); + expect = 'Zabc'; // Still expect 'Zabc' for this + reportCompare(expect, actual, status); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/String/shell.js b/js/src/tests/ecma_3/String/shell.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/ecma_3/String/shell.js diff --git a/js/src/tests/ecma_3/Unicode/browser.js b/js/src/tests/ecma_3/Unicode/browser.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/ecma_3/Unicode/browser.js diff --git a/js/src/tests/ecma_3/Unicode/regress-352044-01.js b/js/src/tests/ecma_3/Unicode/regress-352044-01.js new file mode 100644 index 000000000..0c98d7267 --- /dev/null +++ b/js/src/tests/ecma_3/Unicode/regress-352044-01.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 = 352044; +var summary = 'issues with Unicode escape sequences in JavaScript source code'; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + expect = 'SyntaxError: illegal character'; + + try + { + var i = 1; + eval('i \\u002b= 1'); + print(i); + } + catch(ex) + { + actual = ex + ''; + } + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/Unicode/regress-352044-02-n.js b/js/src/tests/ecma_3/Unicode/regress-352044-02-n.js new file mode 100644 index 000000000..ea975d4a4 --- /dev/null +++ b/js/src/tests/ecma_3/Unicode/regress-352044-02-n.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 = 352044; +var summary = 'issues with Unicode escape sequences in JavaScript source code'; +var actual = 'No Error'; +var expect = 'SyntaxError'; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + print('This test case is expected to throw an uncaught SyntaxError'); + + try + { + var i = 1; + i \u002b= 1; + print(i); + } + catch(ex) + { + actual = ex + ''; + } + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} diff --git a/js/src/tests/ecma_3/Unicode/shell.js b/js/src/tests/ecma_3/Unicode/shell.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/ecma_3/Unicode/shell.js diff --git a/js/src/tests/ecma_3/Unicode/uc-001-n.js b/js/src/tests/ecma_3/Unicode/uc-001-n.js new file mode 100644 index 000000000..8ed4cfad6 --- /dev/null +++ b/js/src/tests/ecma_3/Unicode/uc-001-n.js @@ -0,0 +1,26 @@ +/* -*- tab-width: 8; 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/. */ + + +test(); + +function test() +{ + enterFunc ("test"); + + printStatus ("Unicode Characters 1C-1F negative test."); + printBugNumber (23612); + + reportCompare ("error", eval ("'no'\u001C+' error'"), + "Unicode whitespace test (1C.)"); + reportCompare ("error", eval ("'no'\u001D+' error'"), + "Unicode whitespace test (1D.)"); + reportCompare ("error", eval ("'no'\u001E+' error'"), + "Unicode whitespace test (1E.)"); + reportCompare ("error", eval ("'no'\u001F+' error'"), + "Unicode whitespace test (1F.)"); + + exitFunc ("test"); +} diff --git a/js/src/tests/ecma_3/Unicode/uc-001.js b/js/src/tests/ecma_3/Unicode/uc-001.js new file mode 100644 index 000000000..bfb8fd515 --- /dev/null +++ b/js/src/tests/ecma_3/Unicode/uc-001.js @@ -0,0 +1,21 @@ +// |reftest| skip -- obsolete test +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 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/. */ + + +test(); + +function test() +{ + enterFunc ("test"); + + printStatus ("Unicode format-control character (Category Cf) test."); + printBugNumber (23610); + + reportCompare ("no error", eval('"no\u200E error"'), + "Unicode format-control character test (Category Cf.)"); + + exitFunc ("test"); +} diff --git a/js/src/tests/ecma_3/Unicode/uc-002-n.js b/js/src/tests/ecma_3/Unicode/uc-002-n.js new file mode 100644 index 000000000..0bf64bad8 --- /dev/null +++ b/js/src/tests/ecma_3/Unicode/uc-002-n.js @@ -0,0 +1,19 @@ +/* -*- 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/. */ + + +DESCRIPTION = "Non-character escapes in identifiers negative test."; +EXPECTED = "error"; + +enterFunc ("test"); + +printStatus ("Non-character escapes in identifiers negative test."); +printBugNumber (23607); + +eval("\u0020 = 5"); +reportCompare('PASS', 'FAIL', "Previous statement should have thrown an error."); + +exitFunc ("test"); + diff --git a/js/src/tests/ecma_3/Unicode/uc-002.js b/js/src/tests/ecma_3/Unicode/uc-002.js new file mode 100644 index 000000000..6e33f1470 --- /dev/null +++ b/js/src/tests/ecma_3/Unicode/uc-002.js @@ -0,0 +1,24 @@ +/* -*- tab-width: 8; 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/. */ + + +test(); + +function test() +{ + enterFunc ("test"); + + printStatus ("Unicode non-breaking space character test."); + printBugNumber (23613); + + reportCompare ("no error", eval("'no'\u00A0+ ' error'"), + "Unicode non-breaking space character test."); + + var str = "\u00A0foo"; + reportCompare (0, str.search(/^\sfoo$/), + "Unicode non-breaking space character regexp test."); + + exitFunc ("test"); +} diff --git a/js/src/tests/ecma_3/Unicode/uc-003.js b/js/src/tests/ecma_3/Unicode/uc-003.js new file mode 100644 index 000000000..541cf36c6 --- /dev/null +++ b/js/src/tests/ecma_3/Unicode/uc-003.js @@ -0,0 +1,30 @@ +/* -*- tab-width: 8; 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/. */ + + +test(); + +function test() +{ + enterFunc ("test"); + + var \u0041 = 5; + var A\u03B2 = 15; + + printStatus ("Escapes in identifiers test."); + printBugNumber (23608); + printBugNumber (23607); + + reportCompare (5, eval("\u0041"), + "Escaped ASCII Identifier test."); + reportCompare (6, eval("++\u0041"), + "Escaped ASCII Identifier test"); + reportCompare (15, eval("A\u03B2"), + "Escaped non-ASCII Identifier test"); + reportCompare (16, eval("++A\u03B2"), + "Escaped non-ASCII Identifier test"); + + exitFunc ("test"); +} diff --git a/js/src/tests/ecma_3/Unicode/uc-004.js b/js/src/tests/ecma_3/Unicode/uc-004.js new file mode 100644 index 000000000..4c89a760e --- /dev/null +++ b/js/src/tests/ecma_3/Unicode/uc-004.js @@ -0,0 +1,29 @@ +/* -*- tab-width: 8; 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/. */ + + +test(); + +function test() +{ + enterFunc ("test"); + + printStatus ("Unicode Characters 1C-1F with regexps test."); + printBugNumber (23612); + + var ary = ["\u001Cfoo", "\u001Dfoo", "\u001Efoo", "\u001Ffoo"]; + + for (var i in ary) + { + reportCompare (0, ary[Number(i)].search(/^\Sfoo$/), + "Unicode characters 1C-1F in regexps, ary[" + + i + "] did not match \\S test (it should not.)"); + reportCompare (-1, ary[Number(i)].search(/^\sfoo$/), + "Unicode characters 1C-1F in regexps, ary[" + + i + "] matched \\s test (it should not.)"); + } + + exitFunc ("test"); +} diff --git a/js/src/tests/ecma_3/Unicode/uc-005.js b/js/src/tests/ecma_3/Unicode/uc-005.js new file mode 100644 index 000000000..4693d50cb --- /dev/null +++ b/js/src/tests/ecma_3/Unicode/uc-005.js @@ -0,0 +1,242 @@ +/* -*- 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: 15 July 2002 + * SUMMARY: Testing identifiers with double-byte names + * See http://bugzilla.mozilla.org/show_bug.cgi?id=58274 + * + * Here is a sample of the problem: + * + * js> function f\u02B1 () {} + * + * js> f\u02B1.toSource(); + * function f¦() {} + * + * js> f\u02B1.toSource().toSource(); + * (new String("function f\xB1() {}")) + * + * + * See how the high-byte information (the 02) has been lost? + * The same thing was happening with the toString() method: + * + * js> f\u02B1.toString(); + * + * function f¦() { + * } + * + * js> f\u02B1.toString().toSource(); + * (new String("\nfunction f\xB1() {\n}\n")) + * + */ +//----------------------------------------------------------------------------- +var UBound = 0; +var BUGNUMBER = 58274; +var summary = 'Testing identifiers with double-byte names'; +var status = ''; +var statusitems = []; +var actual = ''; +var actualvalues = []; +var expect= ''; +var expectedvalues = []; + + +/* + * Define a function that uses double-byte identifiers in + * "every possible way" + * + * Then recover each double-byte identifier via f.toString(). + * To make this easier, put a 'Z' token before every one. + * + * Our eval string will be: + * + * sEval = "function Z\u02b1(Z\u02b2, b) { + * try { Z\u02b3 : var Z\u02b4 = Z\u02b1; } + * catch (Z\u02b5) { for (var Z\u02b6 in Z\u02b5) + * {for (1; 1<0; Z\u02b7++) {new Array()[Z\u02b6] = 1;} };} }"; + * + * It will be helpful to build this string in stages: + */ +var s0 = 'function Z'; +var s1 = '\u02b1(Z'; +var s2 = '\u02b2, b) {try { Z'; +var s3 = '\u02b3 : var Z'; +var s4 = '\u02b4 = Z'; +var s5 = '\u02b1; } catch (Z' + var s6 = '\u02b5) { for (var Z'; +var s7 = '\u02b6 in Z'; +var s8 = '\u02b5){for (1; 1<0; Z'; +var s9 = '\u02b7++) {new Array()[Z'; +var s10 = '\u02b6] = 1;} };} }'; + + +/* + * Concatenate these and eval() to create the function Z\u02b1 + */ +var sEval = s0 + s1 + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9 + s10; +eval(sEval); + + +/* + * Recover all the double-byte identifiers via Z\u02b1.toString(). + * We'll recover the 1st one as arrID[1], the 2nd one as arrID[2], + * and so on ... + */ +var arrID = getIdentifiers(Z\u02b1); + + +/* + * Now check that we got back what we put in - + */ +status = inSection(1); +actual = arrID[1]; +expect = s1.charAt(0); +addThis(); + +status = inSection(2); +actual = arrID[2]; +expect = s2.charAt(0); +addThis(); + +status = inSection(3); +actual = arrID[3]; +expect = s3.charAt(0); +addThis(); + +status = inSection(4); +actual = arrID[4]; +expect = s4.charAt(0); +addThis(); + +status = inSection(5); +actual = arrID[5]; +expect = s5.charAt(0); +addThis(); + +status = inSection(6); +actual = arrID[6]; +expect = s6.charAt(0); +addThis(); + +status = inSection(7); +actual = arrID[7]; +expect = s7.charAt(0); +addThis(); + +status = inSection(8); +actual = arrID[8]; +expect = s8.charAt(0); +addThis(); + +status = inSection(9); +actual = arrID[9]; +expect = s9.charAt(0); +addThis(); + +status = inSection(10); +actual = arrID[10]; +expect = s10.charAt(0); +addThis(); + + + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + + + +/* + * Goal: recover the double-byte identifiers from f.toString() + * by getting the very next character after each 'Z' token. + * + * The return value will be an array |arr| indexed such that + * |arr[1]| is the 1st identifier, |arr[2]| the 2nd, and so on. + * + * Note, however, f.toString() is implementation-independent. + * For example, it may begin with '\nfunction' instead of 'function'. + * + * Rhino uses a Unicode representation for f.toString(); whereas + * SpiderMonkey uses an ASCII representation, putting escape sequences + * for non-ASCII characters. For example, if a function is called f\u02B1, + * then in Rhino the toString() method will present a 2-character Unicode + * string for its name, whereas SpiderMonkey will present a 7-character + * ASCII string for its name: the string literal 'f\u02B1'. + * + * So we force the lexer to condense the string before we use it. + * This will give uniform results in Rhino and SpiderMonkey. + */ +function getIdentifiers(f) +{ + var str = condenseStr(f.toString()); + var arr = str.split('Z'); + + /* + * The identifiers are the 1st char of each split substring + * EXCEPT the first one, which is just ('\n' +) 'function '. + * + * Thus note the 1st identifier will be stored in |arr[1]|, + * the 2nd one in |arr[2]|, etc., making the indexing easy - + */ + for (i in arr) + arr[i] = arr[i].charAt(0); + return arr; +} + + +/* + * This function is the opposite of a functions like escape(), which take + * Unicode characters and return escape sequences for them. Here, we force + * the lexer to turn escape sequences back into single characters. + * + * Note we can't simply do |eval(str)|, since in practice |str| will be an + * identifier somewhere in the program (e.g. a function name); thus |eval(str)| + * would return the object that the identifier represents: not what we want. + * + * So we surround |str| lexicographically with quotes to force the lexer to + * evaluate it as a string. Have to strip out any linefeeds first, however - + */ +function condenseStr(str) +{ + /* + * You won't be able to do the next step if |str| has + * any carriage returns or linefeeds in it. For example: + * + * js> eval("'" + '\nHello' + "'"); + * 1: SyntaxError: unterminated string literal: + * 1: ' + * 1: ^ + * + * So replace them with the empty string - + */ + str = str.replace(/[\r\n]/g, '') + return eval("'" + str + "'") + } + + +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/browser.js b/js/src/tests/ecma_3/browser.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/ecma_3/browser.js 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; +} + diff --git a/js/src/tests/ecma_3/shell.js b/js/src/tests/ecma_3/shell.js new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/js/src/tests/ecma_3/shell.js diff --git a/js/src/tests/ecma_3/template.js b/js/src/tests/ecma_3/template.js new file mode 100644 index 000000000..089aae2d6 --- /dev/null +++ b/js/src/tests/ecma_3/template.js @@ -0,0 +1,28 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + * Contributor: + */ + +//----------------------------------------------------------------------------- +var BUGNUMBER = 99999; +var summary = ''; +var actual = ''; +var expect = ''; + + +//----------------------------------------------------------------------------- +test(); +//----------------------------------------------------------------------------- + +function test() +{ + enterFunc ('test'); + printBugNumber(BUGNUMBER); + printStatus (summary); + + reportCompare(expect, actual, summary); + + exitFunc ('test'); +} |