1 // 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 33 // 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 37 // Base tests: we recognize the basic flags 38 39 function 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 46 var re = /a/; 47 assertFlags(re, false, false, false) 48 49 re = /a/gim; 50 assertFlags(re, true, true, true) 51 52 re = RegExp("a",""); 53 assertFlags(re, false, false, false) 54 55 re = RegExp("a", "gim"); 56 assertFlags(re, true, true, true) 57 58 // Double i's 59 60 assertThrows("/a/ii"); 61 62 assertThrows("/a/gii"); 63 64 assertThrows("/a/igi"); 65 66 assertThrows("/a/iig"); 67 68 assertThrows("/a/gimi"); 69 70 assertThrows("/a/giim"); 71 72 assertThrows("/a/igim"); 73 74 assertThrows(function(){ return RegExp("a", "ii"); }) 75 76 assertThrows(function(){ return RegExp("a", "gii"); }) 77 78 assertThrows(function(){ return RegExp("a", "igi"); }) 79 80 assertThrows(function(){ return RegExp("a", "iig"); }) 81 82 assertThrows(function(){ return RegExp("a", "gimi"); }) 83 84 assertThrows(function(){ return RegExp("a", "giim"); }) 85 86 assertThrows(function(){ return RegExp("a", "igim"); }) 87 88 // Tripple i's 89 90 assertThrows("/a/iii"); 91 92 assertThrows("/a/giii"); 93 94 assertThrows("/a/igii"); 95 96 assertThrows("/a/iigi"); 97 98 assertThrows("/a/iiig"); 99 100 assertThrows("/a/miiig"); 101 102 assertThrows(function(){ return RegExp("a", "iii"); }) 103 104 assertThrows(function(){ return RegExp("a", "giii"); }) 105 106 assertThrows(function(){ return RegExp("a", "igii"); }) 107 108 assertThrows(function(){ return RegExp("a", "iigi"); }) 109 110 assertThrows(function(){ return RegExp("a", "iiig"); }) 111 112 assertThrows(function(){ return RegExp("a", "miiig"); }) 113 114 // Illegal flags - valid flags late in string. 115 116 assertThrows("/a/arglebargleglopglyf"); 117 118 assertThrows("/a/arglebargleglopglif"); 119 120 assertThrows("/a/arglebargleglopglym"); 121 122 assertThrows("/a/arglebargleglopglim"); 123 124 // Case of flags still matters. 125 126 var re = /a/gmi; 127 assertFlags(re, true, true, true) 128 129 assertThrows("/a/Gmi"); 130 131 assertThrows("/a/gMi"); 132 133 assertThrows("/a/gmI"); 134 135 assertThrows("/a/GMi"); 136 137 assertThrows("/a/GmI"); 138 139 assertThrows("/a/gMI"); 140 141 assertThrows("/a/GMI"); 142 143 // Unicode escape sequences are not interpreted. 144 145 assertThrows("/a/\\u0067"); 146 assertThrows("/a/\\u0069"); 147 assertThrows("/a/\\u006d"); 148 assertThrows("/a/\\u006D"); 149