1// Copyright 2013 the V8 project authors. All rights reserved.
2// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
3//
4// Redistribution and use in source and binary forms, with or without
5// modification, are permitted provided that the following conditions
6// are met:
7// 1.  Redistributions of source code must retain the above copyright
8//     notice, this list of conditions and the following disclaimer.
9// 2.  Redistributions in binary form must reproduce the above copyright
10//     notice, this list of conditions and the following disclaimer in the
11//     documentation and/or other materials provided with the distribution.
12//
13// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
14// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
17// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23
24description("Test for bug 31689: RegExp#exec's returned Array-like object behaves differently from regular Arrays");
25
26var tests = [
27    [ /(a)(_)?.+(c)(_)?.+(e)(_)?.+/, 'abcdef', '["abcdef", "a", undefined, "c", undefined, "e", undefined]' ],
28    [ /(a)(_)?/, 'abcdef', '["a", "a", undefined]' ],
29    [ /(_)?.+(a)/, 'xabcdef', '["xa", undefined, "a"]' ],
30    [ /(_)?.+(a)(_)?/, 'xabcdef', '["xa", undefined, "a", undefined]' ],
31];
32
33function testRegExpMatchesArray(i)
34{
35    return tests[i][0].exec(tests[i][1]);
36}
37
38function testInOperator(i)
39{
40    var re = tests[i][0],
41        str = tests[i][1],
42        inArray = [],
43        matches = re.exec(str);
44
45    for (var j = 0; j < matches.length; j++) {
46        if (j in matches) {
47            inArray.push(matches[j]);
48        }
49    }
50    return inArray;
51}
52
53function testForEachFunction(i)
54{
55    var re = tests[i][0],
56        str = tests[i][1],
57        inArray = [],
58        matches = re.exec(str);
59
60    matches.forEach(function(m) {
61        inArray.push(m);
62    });
63    return inArray;
64
65}
66
67for (var i in tests) {
68    shouldBe('testRegExpMatchesArray(' + i + ')', tests[i][2]);
69    shouldBe('testInOperator(' + i + ')', tests[i][2]);
70    shouldBe('testForEachFunction(' + i + ')', tests[i][2]);
71}
72