/* 
 * Ensure that flat matches with metachars in them don't have their metachars
 * interpreted as special.
 */

function isPatternSyntaxError(pattern) {
    try {
        new RegExp(pattern);
        return false;
    } catch (e) {
        if (!(e instanceof SyntaxError))
            throw e;
        return true;
    }
}

// Bug example.
assertEq("1+2".replace("1+2", "$&+3"), "1+2+3");
assertEq("1112".replace("1+2", ""), "1112");

// ^
assertEq("leading text^my hat".replace("^my hat", ""), "leading text");
assertEq("my hat".replace("^my hat", ""), "my hat");

// $
assertEq("leading text$my money".replace("leading text$", ""), "my money");
assertEq("leading text".replace("leading text$", ""), "leading text");

// \
var BSL = '\\';
assertEq(("dir C:" + BSL + "Windoze").replace("C:" + BSL, ""),
         "dir Windoze");
assertEq(isPatternSyntaxError("C:" + BSL), true);

// .
assertEq("This is a sentence. It has words.".replace(".", "!"),
         "This is a sentence! It has words.");
assertEq("This is an unterminated sentence".replace(".", ""),
         "This is an unterminated sentence");

// *
assertEq("Video killed the radio *".replace(" *", ""), "Video killed the radio");
assertEq("aaa".replace("a*", ""), "aaa");

// +
assertEq("On the + side".replace(" +", ""), "On the side");
assertEq("1111111111111".replace("1+", ""), "1111111111111");

// \+
assertEq(("Inverse cone head: " + BSL + "++/").replace(BSL + "+", ""),
         "Inverse cone head: +/");
assertEq((BSL + BSL + BSL).replace(BSL + "+", ""),
         BSL + BSL + BSL);

// \\+
assertEq((BSL + BSL + "+").replace(BSL + BSL + "+", ""), "");
assertEq((BSL + BSL + BSL).replace(BSL + BSL + "+", ""), (BSL + BSL + BSL));

// \\\
assertEq((BSL + BSL + BSL + BSL).replace(BSL + BSL + BSL, ""), BSL);
assertEq(isPatternSyntaxError(BSL + BSL + BSL), true);

// \\\\
assertEq((BSL + BSL + BSL + BSL).replace(BSL + BSL + BSL + BSL, "", "i"), "");
assertEq((BSL + BSL).replace(BSL + BSL + BSL + BSL, ""), BSL + BSL);


// ?
assertEq("Pressing question?".replace("?", "."), "Pressing question.");
assertEq("a".replace("a?", ""), "a");

// (
assertEq("(a".replace("(", ""), "a");

// )
assertEq("a)".replace(")", ""), "a");

// ( and )
assertEq("(foo)".replace("(foo)", ""), "");
assertEq("a".replace("(a)", ""), "a");

// [
assertEq("[a".replace("[", ""), "a");

// ]
assertEq("a]".replace("]", ""), "a");

// [ and ]
assertEq("a".replace("[a-z]", ""), "a");
assertEq("You would write your regexp as [a-z]".replace("[a-z]", ""),
         "You would write your regexp as ");

// {
assertEq("Numbers may be specified in the interval {1,100}".replace("{1,", ""),
         "Numbers may be specified in the interval 100}");

// }
assertEq("Numbers may be specified in the interval {1,100}".replace(",100}", ""),
         "Numbers may be specified in the interval {1");

// { and }
assertEq("Numbers may be specified in the interval {1,100}".replace(" {1,100}", ""),
         "Numbers may be specified in the interval");
assertEq("aaa".replace("a{1,10}", ""), "aaa");

// |
assertEq("Mr. Gorbachev|Tear down this wall!".replace("|Tear down this wall!", ""),
         "Mr. Gorbachev");
assertEq("foobar".replace("foo|bar", ""), "foobar");

print("PASS");
