1" Tests for regexp with backslash and other special characters inside [] 2" Also test backslash for hex/octal numbered character. 3" 4if !has('multi_byte') 5 finish 6endif 7 8scriptencoding utf-8 9 10function RunSTest(value, calls, expected) 11 new 12 call feedkeys("i" . a:value, "mx") 13 exec a:calls 14 call assert_equal(a:expected, getline(1), printf("wrong result for %s", a:calls)) 15 quit! 16endfunction 17 18function RunXTest(value, search_exp, expected) 19 new 20 call feedkeys("i" . a:value, "mx") 21 call feedkeys("gg" . a:search_exp . "\nx", "mx") 22 call assert_equal(a:expected, getline(1), printf("wrong result for %s", a:search_exp)) 23 quit! 24endfunction 25 26 27function Test_x_search() 28 let res = "test text test text" 29 call RunXTest("test \\text test text", "/[\\x]", res) 30 call RunXTest("test \ttext test text", "/[\\t\\]]", res) 31 call RunXTest("test text ]test text", "/[]y]", res) 32 call RunXTest("test ]text test text", "/[\\]]", res) 33 call RunXTest("test text te^st text", "/[y^]", res) 34 call RunXTest("test te$xt test text", "/[$y]", res) 35 call RunXTest("test taext test text", "/[\\x61]", res) 36 call RunXTest("test tbext test text","/[\\x60-\\x64]", res) 37 call RunXTest("test 5text test text","/[\\x785]", res) 38 call RunXTest("testc text test text","/[\\o143]", res) 39 call RunXTest("tesdt text test text","/[\\o140-\\o144]", res) 40 call RunXTest("test7 text test text", "/[\\o417]", res) 41 call RunXTest("test text tBest text", "/\\%x42", res) 42 call RunXTest("test text teCst text", "/\\%o103", res) 43 call RunXTest("test text \<C-V>x00test text", "/[\\x00]", res) 44endfunction 45 46function Test_s_search() 47 let res = "test text test text" 48 call RunSTest("test te\<C-V>x00xt t\<C-V>x04est t\<C-V>x10ext", "s/[\\x00-\\x10]//g", res) 49 call RunSTest("test \\xyztext test text", "s/[\\x-z]\\+//", res) 50 call RunSTest("test text tev\\uyst text", "s/[\\u-z]\\{2,}//", res) 51 call RunSTest("xx aaaaa xx a", "s/\\(a\\)\\+//", "xx xx a") 52 call RunSTest("xx aaaaa xx a", "s/\\(a*\\)\\+//", "xx aaaaa xx a") 53 call RunSTest("xx aaaaa xx a", "s/\\(a*\\)*//", "xx aaaaa xx a") 54 call RunSTest("xx aaaaa xx", "s/\\(a\\)\\{2,3}/A/", "xx Aaa xx") 55 call RunSTest("xx aaaaa xx", "s/\\(a\\)\\{-2,3}/A/", "xx Aaaa xx") 56 call RunSTest("xx aaa12aa xx", "s/\\(a\\)*\\(12\\)\\@>/A/", "xx Aaa xx") 57 call RunSTest("xx foobar xbar xx", "s/\\(foo\\)\\@<!bar/A/", "xx foobar xA xx") 58 call RunSTest("xx an file xx", "s/\\(an\\_s\\+\\)\\@<=file/A/", "xx an A xx") 59 call RunSTest("x= 9;", "s/^\\(\\h\\w*\\%(->\\|\\.\\)\\=\\)\\+=/XX/", "XX 9;") 60 call RunSTest("hh= 77;", "s/^\\(\\h\\w*\\%(->\\|\\.\\)\\=\\)\\+=/YY/", "YY 77;") 61 call RunSTest(" aaa ", "s/aaa/xyz/", " xyz ") 62 call RunSTest(" xyz", "s/~/bcd/", " bcd") 63 call RunSTest(" bcdbcdbcd", "s/~\\+/BB/", " BB") 64endfunction 65 66" Test character classes in regexp using regexpengine 0, 1, 2. 67func Test_regex_char_classes() 68 new 69 let save_enc = &encoding 70 set encoding=utf-8 71 72 let input = "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������" 73 74 " Format is [cmd_to_run, expected_output] 75 let tests = [ 76 \ [':s/\%#=0\d//g', 77 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 78 \ [':s/\%#=1\d//g', 79 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 80 \ [':s/\%#=2\d//g', 81 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 82 \ [':s/\%#=0[0-9]//g', 83 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 84 \ [':s/\%#=1[0-9]//g', 85 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 86 \ [':s/\%#=2[0-9]//g', 87 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 88 \ [':s/\%#=0\D//g', 89 \ "0123456789"], 90 \ [':s/\%#=1\D//g', 91 \ "0123456789"], 92 \ [':s/\%#=2\D//g', 93 \ "0123456789"], 94 \ [':s/\%#=0[^0-9]//g', 95 \ "0123456789"], 96 \ [':s/\%#=1[^0-9]//g', 97 \ "0123456789"], 98 \ [':s/\%#=2[^0-9]//g', 99 \ "0123456789"], 100 \ [':s/\%#=0\o//g', 101 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./89:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 102 \ [':s/\%#=1\o//g', 103 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./89:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 104 \ [':s/\%#=2\o//g', 105 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./89:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 106 \ [':s/\%#=0[0-7]//g', 107 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./89:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 108 \ [':s/\%#=1[0-7]//g', 109 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./89:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 110 \ [':s/\%#=2[0-7]//g', 111 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./89:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 112 \ [':s/\%#=0\O//g', 113 \ "01234567"], 114 \ [':s/\%#=1\O//g', 115 \ "01234567"], 116 \ [':s/\%#=2\O//g', 117 \ "01234567"], 118 \ [':s/\%#=0[^0-7]//g', 119 \ "01234567"], 120 \ [':s/\%#=1[^0-7]//g', 121 \ "01234567"], 122 \ [':s/\%#=2[^0-7]//g', 123 \ "01234567"], 124 \ [':s/\%#=0\x//g', 125 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./:;<=>?@GHIXYZ[\]^_`ghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 126 \ [':s/\%#=1\x//g', 127 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./:;<=>?@GHIXYZ[\]^_`ghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 128 \ [':s/\%#=2\x//g', 129 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./:;<=>?@GHIXYZ[\]^_`ghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 130 \ [':s/\%#=0[0-9A-Fa-f]//g', 131 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./:;<=>?@GHIXYZ[\]^_`ghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 132 \ [':s/\%#=1[0-9A-Fa-f]//g', 133 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./:;<=>?@GHIXYZ[\]^_`ghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 134 \ [':s/\%#=2[0-9A-Fa-f]//g', 135 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./:;<=>?@GHIXYZ[\]^_`ghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 136 \ [':s/\%#=0\X//g', 137 \ "0123456789ABCDEFabcdef"], 138 \ [':s/\%#=1\X//g', 139 \ "0123456789ABCDEFabcdef"], 140 \ [':s/\%#=2\X//g', 141 \ "0123456789ABCDEFabcdef"], 142 \ [':s/\%#=0[^0-9A-Fa-f]//g', 143 \ "0123456789ABCDEFabcdef"], 144 \ [':s/\%#=1[^0-9A-Fa-f]//g', 145 \ "0123456789ABCDEFabcdef"], 146 \ [':s/\%#=2[^0-9A-Fa-f]//g', 147 \ "0123456789ABCDEFabcdef"], 148 \ [':s/\%#=0\w//g', 149 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./:;<=>?@[\]^`{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 150 \ [':s/\%#=1\w//g', 151 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./:;<=>?@[\]^`{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 152 \ [':s/\%#=2\w//g', 153 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./:;<=>?@[\]^`{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 154 \ [':s/\%#=0[0-9A-Za-z_]//g', 155 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./:;<=>?@[\]^`{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 156 \ [':s/\%#=1[0-9A-Za-z_]//g', 157 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./:;<=>?@[\]^`{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 158 \ [':s/\%#=2[0-9A-Za-z_]//g', 159 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./:;<=>?@[\]^`{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 160 \ [':s/\%#=0\W//g', 161 \ "0123456789ABCDEFGHIXYZ_abcdefghiwxyz"], 162 \ [':s/\%#=1\W//g', 163 \ "0123456789ABCDEFGHIXYZ_abcdefghiwxyz"], 164 \ [':s/\%#=2\W//g', 165 \ "0123456789ABCDEFGHIXYZ_abcdefghiwxyz"], 166 \ [':s/\%#=0[^0-9A-Za-z_]//g', 167 \ "0123456789ABCDEFGHIXYZ_abcdefghiwxyz"], 168 \ [':s/\%#=1[^0-9A-Za-z_]//g', 169 \ "0123456789ABCDEFGHIXYZ_abcdefghiwxyz"], 170 \ [':s/\%#=2[^0-9A-Za-z_]//g', 171 \ "0123456789ABCDEFGHIXYZ_abcdefghiwxyz"], 172 \ [':s/\%#=0\h//g', 173 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@[\]^`{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 174 \ [':s/\%#=1\h//g', 175 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@[\]^`{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 176 \ [':s/\%#=2\h//g', 177 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@[\]^`{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 178 \ [':s/\%#=0[A-Za-z_]//g', 179 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@[\]^`{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 180 \ [':s/\%#=1[A-Za-z_]//g', 181 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@[\]^`{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 182 \ [':s/\%#=2[A-Za-z_]//g', 183 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@[\]^`{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 184 \ [':s/\%#=0\H//g', 185 \ "ABCDEFGHIXYZ_abcdefghiwxyz"], 186 \ [':s/\%#=1\H//g', 187 \ "ABCDEFGHIXYZ_abcdefghiwxyz"], 188 \ [':s/\%#=2\H//g', 189 \ "ABCDEFGHIXYZ_abcdefghiwxyz"], 190 \ [':s/\%#=0[^A-Za-z_]//g', 191 \ "ABCDEFGHIXYZ_abcdefghiwxyz"], 192 \ [':s/\%#=1[^A-Za-z_]//g', 193 \ "ABCDEFGHIXYZ_abcdefghiwxyz"], 194 \ [':s/\%#=2[^A-Za-z_]//g', 195 \ "ABCDEFGHIXYZ_abcdefghiwxyz"], 196 \ [':s/\%#=0\a//g', 197 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@[\]^_`{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 198 \ [':s/\%#=1\a//g', 199 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@[\]^_`{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 200 \ [':s/\%#=2\a//g', 201 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@[\]^_`{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 202 \ [':s/\%#=0[A-Za-z]//g', 203 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@[\]^_`{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 204 \ [':s/\%#=1[A-Za-z]//g', 205 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@[\]^_`{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 206 \ [':s/\%#=2[A-Za-z]//g', 207 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@[\]^_`{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 208 \ [':s/\%#=0\A//g', 209 \ "ABCDEFGHIXYZabcdefghiwxyz"], 210 \ [':s/\%#=1\A//g', 211 \ "ABCDEFGHIXYZabcdefghiwxyz"], 212 \ [':s/\%#=2\A//g', 213 \ "ABCDEFGHIXYZabcdefghiwxyz"], 214 \ [':s/\%#=0[^A-Za-z]//g', 215 \ "ABCDEFGHIXYZabcdefghiwxyz"], 216 \ [':s/\%#=1[^A-Za-z]//g', 217 \ "ABCDEFGHIXYZabcdefghiwxyz"], 218 \ [':s/\%#=2[^A-Za-z]//g', 219 \ "ABCDEFGHIXYZabcdefghiwxyz"], 220 \ [':s/\%#=0\l//g', 221 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 222 \ [':s/\%#=1\l//g', 223 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 224 \ [':s/\%#=2\l//g', 225 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 226 \ [':s/\%#=0[a-z]//g', 227 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 228 \ [':s/\%#=1[a-z]//g', 229 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 230 \ [':s/\%#=2[a-z]//g', 231 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 232 \ [':s/\%#=0\L//g', 233 \ "abcdefghiwxyz"], 234 \ [':s/\%#=1\L//g', 235 \ "abcdefghiwxyz"], 236 \ [':s/\%#=2\L//g', 237 \ "abcdefghiwxyz"], 238 \ [':s/\%#=0[^a-z]//g', 239 \ "abcdefghiwxyz"], 240 \ [':s/\%#=1[^a-z]//g', 241 \ "abcdefghiwxyz"], 242 \ [':s/\%#=2[^a-z]//g', 243 \ "abcdefghiwxyz"], 244 \ [':s/\%#=0\u//g', 245 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 246 \ [':s/\%#=1\u//g', 247 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 248 \ [':s/\%#=2\u//g', 249 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 250 \ [':s/\%#=0[A-Z]//g', 251 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 252 \ [':s/\%#=1[A-Z]//g', 253 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 254 \ [':s/\%#=2[A-Z]//g', 255 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 256 \ [':s/\%#=0\U//g', 257 \ "ABCDEFGHIXYZ"], 258 \ [':s/\%#=1\U//g', 259 \ "ABCDEFGHIXYZ"], 260 \ [':s/\%#=2\U//g', 261 \ "ABCDEFGHIXYZ"], 262 \ [':s/\%#=0[^A-Z]//g', 263 \ "ABCDEFGHIXYZ"], 264 \ [':s/\%#=1[^A-Z]//g', 265 \ "ABCDEFGHIXYZ"], 266 \ [':s/\%#=2[^A-Z]//g', 267 \ "ABCDEFGHIXYZ"], 268 \ [':s/\%#=0\%' . line('.') . 'l^\t...//g', 269 \ "!\"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 270 \ [':s/\%#=1\%' . line('.') . 'l^\t...//g', 271 \ "!\"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 272 \ [':s/\%#=2\%' . line('.') . 'l^\t...//g', 273 \ "!\"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 274 \ [':s/\%#=0[0-z]//g', 275 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 276 \ [':s/\%#=1[0-z]//g', 277 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 278 \ [':s/\%#=2[0-z]//g', 279 \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./{|}~\<C-?>\u0080\u0082\u0090\u009b������"], 280 \ [':s/\%#=0[^0-z]//g', 281 \ "0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz"], 282 \ [':s/\%#=1[^0-z]//g', 283 \ "0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz"], 284 \ [':s/\%#=2[^0-z]//g', 285 \ "0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz"] 286 \] 287 288 for [cmd, expected] in tests 289 call append(0, input) 290 call cursor(1, 1) 291 exe cmd 292 call assert_equal(expected, getline(1), cmd) 293 endfor 294 295 let &encoding = save_enc 296 enew! 297 close 298endfunc 299