summaryrefslogtreecommitdiffstats
path: root/js/src/tests/ecma_5/String/15.5.4.11-01.js
blob: 2125cbf8298cf5818f31c4f845fe31835b688c06 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/*
 * Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/licenses/publicdomain/
 */

var BUGNUMBER = 587366;
var summary = "String.prototype.replace with non-regexp searchValue";

print(BUGNUMBER + ": " + summary);

/**************
 * BEGIN TEST *
 **************/

/* 
 * Check that regexp statics are preserved across the whole test.
 * If the engine is trying to cheat by turning stuff into regexps,
 * we should catch it!
 */
/(a|(b)|c)+/.exec('abcabc');
var before = {
    "source" : RegExp.source,
    "$`": RegExp.leftContext,
    "$'": RegExp.rightContext,
    "$&": RegExp.lastMatch,
    "$1": RegExp.$1,
    "$2": RegExp.$2
};

var text = 'I once was lost but now am found.';
var searchValue = 'found';
var replaceValue;

/* Lambda substitution. */
replaceValue = function(matchStr, matchStart, textStr) {
    assertEq(matchStr, searchValue);
    assertEq(matchStart, 27);
    assertEq(textStr, text);
    return 'not watching that show anymore';
}
var result = text.replace(searchValue, replaceValue);
assertEq(result, 'I once was lost but now am not watching that show anymore.');

/* Dollar substitution. */
replaceValue = "...wait, where was I again? And where is all my $$$$$$? Oh right, $`$&$'" +
               " But with no $$$$$$"; /* Note the dot is not replaced and trails the end. */
result = text.replace(searchValue, replaceValue);
assertEq(result, 'I once was lost but now am ...wait, where was I again?' +
                 ' And where is all my $$$? Oh right, I once was lost but now am found.' +
                 ' But with no $$$.');

/* Missing capture group dollar substitution. */
replaceValue = "$1$&$2$'$3";
result = text.replace(searchValue, replaceValue);
assertEq(result, 'I once was lost but now am $1found$2.$3.');

/* Check RegExp statics haven't been mutated. */
for (var ident in before)
    assertEq(RegExp[ident], before[ident]);

/******************************************************************************/

if (typeof reportCompare === "function")
  reportCompare(true, true);

print("All tests passed!");