1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/js/src/jit-test/tests/basic/bug593663-regexp.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,109 @@ 1.4 +/* 1.5 + * Ensure that flat matches with metachars in them don't have their metachars 1.6 + * interpreted as special. 1.7 + */ 1.8 + 1.9 +function isPatternSyntaxError(pattern) { 1.10 + try { 1.11 + new RegExp(pattern); 1.12 + return false; 1.13 + } catch (e if e instanceof SyntaxError) { 1.14 + return true; 1.15 + } 1.16 +} 1.17 + 1.18 +// Bug example. 1.19 +assertEq("1+2".replace("1+2", "$&+3", "g"), "1+2+3"); 1.20 +assertEq("1112".replace("1+2", "", "g"), "1112"); 1.21 + 1.22 +// ^ 1.23 +assertEq("leading text^my hat".replace("^my hat", "", "g"), "leading text"); 1.24 +assertEq("my hat".replace("^my hat", "", "g"), "my hat"); 1.25 + 1.26 +// $ 1.27 +assertEq("leading text$my money".replace("leading text$", "", "g"), "my money"); 1.28 +assertEq("leading text".replace("leading text$", "", "g"), "leading text"); 1.29 + 1.30 +// \ 1.31 +var BSL = '\\'; 1.32 +assertEq(("dir C:" + BSL + "Windoze").replace("C:" + BSL, "", "g"), 1.33 + "dir Windoze"); 1.34 +assertEq(isPatternSyntaxError("C:" + BSL), true); 1.35 + 1.36 +// . 1.37 +assertEq("This is a sentence. It has words.".replace(".", "!", "g"), 1.38 + "This is a sentence! It has words!"); 1.39 +assertEq("This is an unterminated sentence".replace(".", "", "g"), 1.40 + "This is an unterminated sentence"); 1.41 + 1.42 +// * 1.43 +assertEq("Video killed the radio *".replace(" *", "", "g"), "Video killed the radio"); 1.44 +assertEq("aaa".replace("a*", "", "g"), "aaa"); 1.45 + 1.46 +// + 1.47 +assertEq("On the + side".replace(" +", "", "g"), "On the side"); 1.48 +assertEq("1111111111111".replace("1+", "", "g"), "1111111111111"); 1.49 + 1.50 +// \+ 1.51 +assertEq(("Inverse cone head: " + BSL + "++/").replace(BSL + "+", "", "g"), 1.52 + "Inverse cone head: +/"); 1.53 +assertEq((BSL + BSL + BSL).replace(BSL + "+", "", "g"), 1.54 + BSL + BSL + BSL); 1.55 + 1.56 +// \\+ 1.57 +assertEq((BSL + BSL + "+").replace(BSL + BSL + "+", "", "g"), ""); 1.58 +assertEq((BSL + BSL + BSL).replace(BSL + BSL + "+", "", "g"), (BSL + BSL + BSL)); 1.59 + 1.60 +// \\\ 1.61 +assertEq((BSL + BSL + BSL + BSL).replace(BSL + BSL + BSL, "", "g"), BSL); 1.62 +assertEq(isPatternSyntaxError(BSL + BSL + BSL), true); 1.63 + 1.64 +// \\\\ 1.65 +assertEq((BSL + BSL + BSL + BSL).replace(BSL + BSL + BSL + BSL, "", "i"), ""); 1.66 +assertEq((BSL + BSL).replace(BSL + BSL + BSL + BSL, "", "g"), BSL + BSL); 1.67 + 1.68 + 1.69 +// ? 1.70 +assertEq("Pressing question?".replace("?", ".", "g"), "Pressing question."); 1.71 +assertEq("a".replace("a?", "", "g"), "a"); 1.72 + 1.73 +// ( 1.74 +assertEq("(a".replace("(", "", "g"), "a"); 1.75 + 1.76 +// ) 1.77 +assertEq("a)".replace(")", "", "g"), "a"); 1.78 + 1.79 +// ( and ) 1.80 +assertEq("(foo)".replace("(foo)", "", "g"), ""); 1.81 +assertEq("a".replace("(a)", "", "g"), "a"); 1.82 + 1.83 +// [ 1.84 +assertEq("[a".replace("[", "", "g"), "a"); 1.85 + 1.86 +// ] 1.87 +assertEq("a]".replace("]", "", "g"), "a"); 1.88 + 1.89 +// [ and ] 1.90 +assertEq("a".replace("[a-z]", "", "g"), "a"); 1.91 +assertEq("You would write your regexp as [a-z]".replace("[a-z]", "", "g"), 1.92 + "You would write your regexp as "); 1.93 + 1.94 +// { 1.95 +assertEq("Numbers may be specified in the interval {1,100}".replace("{1,", "", "g"), 1.96 + "Numbers may be specified in the interval 100}"); 1.97 + 1.98 +// } 1.99 +assertEq("Numbers may be specified in the interval {1,100}".replace(",100}", "", "g"), 1.100 + "Numbers may be specified in the interval {1"); 1.101 + 1.102 +// { and } 1.103 +assertEq("Numbers may be specified in the interval {1,100}".replace(" {1,100}", "", "g"), 1.104 + "Numbers may be specified in the interval"); 1.105 +assertEq("aaa".replace("a{1,10}", "", "g"), "aaa"); 1.106 + 1.107 +// | 1.108 +assertEq("Mr. Gorbachev|Tear down this wall!".replace("|Tear down this wall!", "", "g"), 1.109 + "Mr. Gorbachev"); 1.110 +assertEq("foobar".replace("foo|bar", "", "g"), "foobar"); 1.111 + 1.112 +print("PASS");