blob: b751f0f60f1e88eecb0e91b81bc943308603c898 [file] [log] [blame]
Steve Blocka7e24c12009-10-30 11:49:00 +00001// Copyright 2008 the V8 project authors. All rights reserved.
2// Redistribution and use in source and binary forms, with or without
3// modification, are permitted provided that the following conditions are
4// met:
5//
6// * Redistributions of source code must retain the above copyright
7// notice, this list of conditions and the following disclaimer.
8// * Redistributions in binary form must reproduce the above
9// copyright notice, this list of conditions and the following
10// disclaimer in the documentation and/or other materials provided
11// with the distribution.
12// * Neither the name of Google Inc. nor the names of its
13// contributors may be used to endorse or promote products derived
14// from this software without specific prior written permission.
15//
16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28// Tests handling of flags for regexps.
29
30// We should now allow duplicates of flags.
31// (See http://code.google.com/p/v8/issues/detail?id=219)
32
Ben Murdoch69a99ed2011-11-30 16:03:39 +000033// This has been reversed by issue 1628, since other browsers have also
34// tightened their syntax.
35// (See http://code.google.com/p/v8/issues/detail?id=1628)
36
Steve Blocka7e24c12009-10-30 11:49:00 +000037// Base tests: we recognize the basic flags
38
39function assertFlags(re, global, multiline, ignoreCase) {
40 var name = re + " flag: ";
41 (global ? assertTrue : assertFalse)(re.global, name + "g");
42 (multiline ? assertTrue : assertFalse)(re.multiline, name + "m");
43 (ignoreCase ? assertTrue : assertFalse)(re.ignoreCase, name + "i");
44}
45
46var re = /a/;
47assertFlags(re, false, false, false)
48
49re = /a/gim;
50assertFlags(re, true, true, true)
51
52re = RegExp("a","");
53assertFlags(re, false, false, false)
54
55re = RegExp("a", "gim");
56assertFlags(re, true, true, true)
57
58// Double i's
59
Ben Murdoch69a99ed2011-11-30 16:03:39 +000060assertThrows("/a/ii");
Steve Blocka7e24c12009-10-30 11:49:00 +000061
Ben Murdoch69a99ed2011-11-30 16:03:39 +000062assertThrows("/a/gii");
Steve Blocka7e24c12009-10-30 11:49:00 +000063
Ben Murdoch69a99ed2011-11-30 16:03:39 +000064assertThrows("/a/igi");
Steve Blocka7e24c12009-10-30 11:49:00 +000065
Ben Murdoch69a99ed2011-11-30 16:03:39 +000066assertThrows("/a/iig");
Steve Blocka7e24c12009-10-30 11:49:00 +000067
Ben Murdoch69a99ed2011-11-30 16:03:39 +000068assertThrows("/a/gimi");
Steve Blocka7e24c12009-10-30 11:49:00 +000069
Ben Murdoch69a99ed2011-11-30 16:03:39 +000070assertThrows("/a/giim");
Steve Blocka7e24c12009-10-30 11:49:00 +000071
Ben Murdoch69a99ed2011-11-30 16:03:39 +000072assertThrows("/a/igim");
Steve Blocka7e24c12009-10-30 11:49:00 +000073
Ben Murdoch69a99ed2011-11-30 16:03:39 +000074assertThrows(function(){ return RegExp("a", "ii"); })
Steve Blocka7e24c12009-10-30 11:49:00 +000075
Ben Murdoch69a99ed2011-11-30 16:03:39 +000076assertThrows(function(){ return RegExp("a", "gii"); })
Steve Blocka7e24c12009-10-30 11:49:00 +000077
Ben Murdoch69a99ed2011-11-30 16:03:39 +000078assertThrows(function(){ return RegExp("a", "igi"); })
Steve Blocka7e24c12009-10-30 11:49:00 +000079
Ben Murdoch69a99ed2011-11-30 16:03:39 +000080assertThrows(function(){ return RegExp("a", "iig"); })
Steve Blocka7e24c12009-10-30 11:49:00 +000081
Ben Murdoch69a99ed2011-11-30 16:03:39 +000082assertThrows(function(){ return RegExp("a", "gimi"); })
Steve Blocka7e24c12009-10-30 11:49:00 +000083
Ben Murdoch69a99ed2011-11-30 16:03:39 +000084assertThrows(function(){ return RegExp("a", "giim"); })
Steve Blocka7e24c12009-10-30 11:49:00 +000085
Ben Murdoch69a99ed2011-11-30 16:03:39 +000086assertThrows(function(){ return RegExp("a", "igim"); })
Steve Blocka7e24c12009-10-30 11:49:00 +000087
88// Tripple i's
89
Ben Murdoch69a99ed2011-11-30 16:03:39 +000090assertThrows("/a/iii");
Steve Blocka7e24c12009-10-30 11:49:00 +000091
Ben Murdoch69a99ed2011-11-30 16:03:39 +000092assertThrows("/a/giii");
Steve Blocka7e24c12009-10-30 11:49:00 +000093
Ben Murdoch69a99ed2011-11-30 16:03:39 +000094assertThrows("/a/igii");
Steve Blocka7e24c12009-10-30 11:49:00 +000095
Ben Murdoch69a99ed2011-11-30 16:03:39 +000096assertThrows("/a/iigi");
Steve Blocka7e24c12009-10-30 11:49:00 +000097
Ben Murdoch69a99ed2011-11-30 16:03:39 +000098assertThrows("/a/iiig");
Steve Blocka7e24c12009-10-30 11:49:00 +000099
Ben Murdoch69a99ed2011-11-30 16:03:39 +0000100assertThrows("/a/miiig");
Steve Blocka7e24c12009-10-30 11:49:00 +0000101
Ben Murdoch69a99ed2011-11-30 16:03:39 +0000102assertThrows(function(){ return RegExp("a", "iii"); })
Steve Blocka7e24c12009-10-30 11:49:00 +0000103
Ben Murdoch69a99ed2011-11-30 16:03:39 +0000104assertThrows(function(){ return RegExp("a", "giii"); })
Steve Blocka7e24c12009-10-30 11:49:00 +0000105
Ben Murdoch69a99ed2011-11-30 16:03:39 +0000106assertThrows(function(){ return RegExp("a", "igii"); })
Steve Blocka7e24c12009-10-30 11:49:00 +0000107
Ben Murdoch69a99ed2011-11-30 16:03:39 +0000108assertThrows(function(){ return RegExp("a", "iigi"); })
Steve Blocka7e24c12009-10-30 11:49:00 +0000109
Ben Murdoch69a99ed2011-11-30 16:03:39 +0000110assertThrows(function(){ return RegExp("a", "iiig"); })
Steve Blocka7e24c12009-10-30 11:49:00 +0000111
Ben Murdoch69a99ed2011-11-30 16:03:39 +0000112assertThrows(function(){ return RegExp("a", "miiig"); })
Steve Blocka7e24c12009-10-30 11:49:00 +0000113
Ben Murdoch69a99ed2011-11-30 16:03:39 +0000114// Illegal flags - valid flags late in string.
Steve Blocka7e24c12009-10-30 11:49:00 +0000115
Ben Murdoch69a99ed2011-11-30 16:03:39 +0000116assertThrows("/a/arglebargleglopglyf");
Steve Blocka7e24c12009-10-30 11:49:00 +0000117
Ben Murdoch69a99ed2011-11-30 16:03:39 +0000118assertThrows("/a/arglebargleglopglif");
Steve Blocka7e24c12009-10-30 11:49:00 +0000119
Ben Murdoch69a99ed2011-11-30 16:03:39 +0000120assertThrows("/a/arglebargleglopglym");
Steve Blocka7e24c12009-10-30 11:49:00 +0000121
Ben Murdoch69a99ed2011-11-30 16:03:39 +0000122assertThrows("/a/arglebargleglopglim");
Steve Blocka7e24c12009-10-30 11:49:00 +0000123
124// Case of flags still matters.
125
Ben Murdoch69a99ed2011-11-30 16:03:39 +0000126var re = /a/gmi;
Steve Blocka7e24c12009-10-30 11:49:00 +0000127assertFlags(re, true, true, true)
128
Ben Murdoch69a99ed2011-11-30 16:03:39 +0000129assertThrows("/a/Gmi");
Steve Blocka7e24c12009-10-30 11:49:00 +0000130
Ben Murdoch69a99ed2011-11-30 16:03:39 +0000131assertThrows("/a/gMi");
Steve Blocka7e24c12009-10-30 11:49:00 +0000132
Ben Murdoch69a99ed2011-11-30 16:03:39 +0000133assertThrows("/a/gmI");
Steve Blocka7e24c12009-10-30 11:49:00 +0000134
Ben Murdoch69a99ed2011-11-30 16:03:39 +0000135assertThrows("/a/GMi");
Steve Blocka7e24c12009-10-30 11:49:00 +0000136
Ben Murdoch69a99ed2011-11-30 16:03:39 +0000137assertThrows("/a/GmI");
Steve Blocka7e24c12009-10-30 11:49:00 +0000138
Ben Murdoch69a99ed2011-11-30 16:03:39 +0000139assertThrows("/a/gMI");
Steve Blocka7e24c12009-10-30 11:49:00 +0000140
Ben Murdoch69a99ed2011-11-30 16:03:39 +0000141assertThrows("/a/GMI");
142
143// Unicode escape sequences are not interpreted.
144
145assertThrows("/a/\\u0067");
146assertThrows("/a/\\u0069");
147assertThrows("/a/\\u006d");
148assertThrows("/a/\\u006D");