Home | History | Annotate | Download | only in regex
      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 
     24 description("This page tests toString conversion of RegExp objects, particularly wrt to '/' characters and RegExp.prototype.");
     25 
     26 function testForwardSlash(pattern, _string)
     27 {
     28     string = _string;
     29 
     30     re1 = new RegExp(pattern);
     31     re2 = eval(re1.toString());
     32 
     33     return re1.test(string) && re2.test(string);
     34 }
     35 
     36 function testLineTerminator(pattern)
     37 {
     38     re1 = new RegExp(pattern);
     39 
     40     return /\n|\r|\u2028|\u2029/.test(re1.toString());
     41 }
     42 
     43 shouldBe("RegExp('/').source", '"\\\\/"');
     44 shouldBe("RegExp('').source", '"(?:)"');
     45 shouldBe("RegExp.prototype.source", '"(?:)"');
     46 
     47 shouldBe("RegExp('/').toString()", '"/\\\\//"');
     48 shouldBe("RegExp('').toString()", '"/(?:)/"');
     49 shouldBe("RegExp.prototype.toString()", '"/(?:)/"');
     50 
     51 // These strings are equivalent, since the '\' is identity escaping the '/' at the string level.
     52 shouldBeTrue('testForwardSlash("^/$", "/");');
     53 shouldBeTrue('testForwardSlash("^\/$", "/");');
     54 // This string passes "^\/$" to the RegExp, so the '/' is escaped in the re!
     55 shouldBeTrue('testForwardSlash("^\\/$", "/");');
     56 // These strings pass "^\\/$" and "^\\\/$" respectively to the RegExp, giving one '\' to match.
     57 shouldBeTrue('testForwardSlash("^\\\\/$", "\\/");');
     58 shouldBeTrue('testForwardSlash("^\\\\\\/$", "\\/");');
     59 // These strings match two backslashes (the second with the '/' escaped).
     60 shouldBeTrue('testForwardSlash("^\\\\\\\\/$", "\\\\/");');
     61 shouldBeTrue('testForwardSlash("^\\\\\\\\\\/$", "\\\\/");');
     62 // Test that nothing goes wrongif there are multiple forward slashes!
     63 shouldBeTrue('testForwardSlash("x/x/x", "x\\/x\\/x");');
     64 shouldBeTrue('testForwardSlash("x\\/x/x", "x\\/x\\/x");');
     65 shouldBeTrue('testForwardSlash("x/x\\/x", "x\\/x\\/x");');
     66 shouldBeTrue('testForwardSlash("x\\/x\\/x", "x\\/x\\/x");');
     67 
     68 shouldBeFalse('testLineTerminator("\\n");');
     69 shouldBeFalse('testLineTerminator("\\\\n");');
     70 shouldBeFalse('testLineTerminator("\\r");');
     71 shouldBeFalse('testLineTerminator("\\\\r");');
     72 shouldBeFalse('testLineTerminator("\\u2028");');
     73 shouldBeFalse('testLineTerminator("\\\\u2028");');
     74 shouldBeFalse('testLineTerminator("\\u2029");');
     75 shouldBeFalse('testLineTerminator("\\\\u2029");');
     76 
     77 shouldBe("RegExp('[/]').source", "'[/]'");
     78 shouldBe("RegExp('\\\\[/]').source", "'\\\\[\\\\/]'");
     79 
     80 // See 15.10.6.4
     81 // The first half of this checks that:
     82 //     Return the String value formed by concatenating the Strings "/", the
     83 //     String value of the source property of this RegExp object, and "/";
     84 // The second half checks that:
     85 //     The returned String has the form of a RegularExpressionLiteral that
     86 //     evaluates to another RegExp object with the same behaviour as this object.
     87 shouldBe("var o = new RegExp(); o.toString() === '/'+o.source+'/' && eval(o.toString()+'.exec(String())')", '[""]');
     88