1 package javascript 2 3 import ( 4 "errors" 5 "testing" 6 ) 7 8 func TestUnquote(t *testing.T) { 9 for n, test := range [...]struct { 10 Input, Output string 11 Err error 12 }{ 13 { // 1 14 "\"\"", 15 "", 16 nil, 17 }, 18 { // 2 19 "''", 20 "", 21 nil, 22 }, 23 { // 3 24 "\"a\"", 25 "a", 26 nil, 27 }, 28 { // 4 29 "'a'", 30 "a", 31 nil, 32 }, 33 { // 5 34 "\"\\'\\\"\\\\\\b\\f\\n\\r\\t\\v\"", 35 "'\"\\\b\f\n\r\t\v", 36 nil, 37 }, 38 { // 6 39 "\"\x41\"", 40 "A", 41 nil, 42 }, 43 { // 7 44 "", 45 "", 46 ErrInvalidQuoted, 47 }, 48 { // 8 49 "\"\\x41\"", 50 "A", 51 nil, 52 }, 53 { // 9 54 "\"\\x4G\"", 55 "", 56 ErrInvalidQuoted, 57 }, 58 { // 10 59 "\"\\xG1\"", 60 "", 61 ErrInvalidQuoted, 62 }, 63 { // 11 64 "\"\\u0041\"", 65 "A", 66 nil, 67 }, 68 { // 12 69 "\"\\u004G\"", 70 "", 71 ErrInvalidQuoted, 72 }, 73 { // 13 74 "\"\\u00G1\"", 75 "", 76 ErrInvalidQuoted, 77 }, 78 { // 14 79 "\"\\u0G41\"", 80 "", 81 ErrInvalidQuoted, 82 }, 83 { // 15 84 "\"\\uG041\"", 85 "", 86 ErrInvalidQuoted, 87 }, 88 { // 16 89 "\"\\c\"", 90 "c", 91 nil, 92 }, 93 { // 17 94 "\"\n\"", 95 "", 96 ErrInvalidQuoted, 97 }, 98 { // 18 99 "\"\\0\"", 100 "\000", 101 nil, 102 }, 103 { // 19 104 "\"\\01\"", 105 "", 106 ErrInvalidQuoted, 107 }, 108 { // 20 109 "\"\\u{41}\"", 110 "A", 111 nil, 112 }, 113 { // 21 114 "\"\\u{}\"", 115 "", 116 ErrInvalidQuoted, 117 }, 118 { // 22 119 "\"\\u{41G}\"", 120 "", 121 ErrInvalidQuoted, 122 }, 123 { // 23 124 "\"\\u{41\"", 125 "", 126 ErrInvalidQuoted, 127 }, 128 { // 24 129 "'\\'\\\"\\\\\\b\\f\\n\\r\\t\\v'", 130 "'\"\\\b\f\n\r\t\v", 131 nil, 132 }, 133 { // 25 134 "'\x41'", 135 "A", 136 nil, 137 }, 138 { // 26 139 "'\\x41'", 140 "A", 141 nil, 142 }, 143 { // 27 144 "'\\x4G'", 145 "", 146 ErrInvalidQuoted, 147 }, 148 { // 28 149 "'\\xG1'", 150 "", 151 ErrInvalidQuoted, 152 }, 153 { // 29 154 "'\\u0041'", 155 "A", 156 nil, 157 }, 158 { // 30 159 "'\\u004G'", 160 "", 161 ErrInvalidQuoted, 162 }, 163 { // 31 164 "'\\u00G1'", 165 "", 166 ErrInvalidQuoted, 167 }, 168 { // 32 169 "'\\u0G41'", 170 "", 171 ErrInvalidQuoted, 172 }, 173 { // 33 174 "'\\uG041'", 175 "", 176 ErrInvalidQuoted, 177 }, 178 { // 34 179 "'\\c'", 180 "c", 181 nil, 182 }, 183 { // 35 184 "'\n'", 185 "", 186 ErrInvalidQuoted, 187 }, 188 { // 36 189 "'\\0'", 190 "\000", 191 nil, 192 }, 193 { // 37 194 "'\\01'", 195 "", 196 ErrInvalidQuoted, 197 }, 198 { // 38 199 "'\\u{41}'", 200 "A", 201 nil, 202 }, 203 { // 39 204 "'\\u{}'", 205 "", 206 ErrInvalidQuoted, 207 }, 208 { // 40 209 "'\\u{41G}'", 210 "", 211 ErrInvalidQuoted, 212 }, 213 { // 41 214 "'\\u{41'", 215 "", 216 ErrInvalidQuoted, 217 }, 218 } { 219 o, err := Unquote(test.Input) 220 if !errors.Is(err, test.Err) { 221 t.Errorf("test %d: expecting error %q, got %q", n+1, test.Err, err) 222 } else if o != test.Output { 223 t.Errorf("test %d: from %s, expecting output %q, got %q", n+1, test.Input, test.Output, o) 224 } 225 } 226 } 227 228 func TestUnquoteTemplate(t *testing.T) { 229 for n, test := range [...]struct { 230 Input, Output string 231 Err error 232 }{ 233 { // 1 234 "``", 235 "", 236 nil, 237 }, 238 { // 2 239 "}`", 240 "", 241 nil, 242 }, 243 { // 3 244 "`${", 245 "", 246 nil, 247 }, 248 { // 4 249 "}${", 250 "", 251 nil, 252 }, 253 { // 5 254 "`", 255 "", 256 ErrInvalidQuoted, 257 }, 258 { // 6 259 "}", 260 "", 261 ErrInvalidQuoted, 262 }, 263 { // 7 264 "${", 265 "", 266 ErrInvalidQuoted, 267 }, 268 { // 8 269 "`a`", 270 "a", 271 nil, 272 }, 273 { // 9 274 "`\\'\\\"\\\\\\b\\f\\n\\r\\t\\v`", 275 "'\"\\\b\f\n\r\t\v", 276 nil, 277 }, 278 { // 10 279 "`\x41`", 280 "A", 281 nil, 282 }, 283 { // 11 284 "`\n`", 285 "\n", 286 nil, 287 }, 288 { // 12 289 "`\\x4G`", 290 "", 291 ErrInvalidQuoted, 292 }, 293 { // 13 294 "`\\u0041`", 295 "A", 296 nil, 297 }, 298 { // 14 299 "`\\u00G1`", 300 "", 301 ErrInvalidQuoted, 302 }, 303 { // 15 304 "`\\c`", 305 "c", 306 nil, 307 }, 308 { // 16 309 "`\\0`", 310 "\000", 311 nil, 312 }, 313 { // 17 314 "`\\u{41}`", 315 "A", 316 nil, 317 }, 318 { // 18 319 "`\\u{}`", 320 "", 321 ErrInvalidQuoted, 322 }, 323 { // 19 324 "`\\${`", 325 "${", 326 nil, 327 }, 328 } { 329 o, err := UnquoteTemplate(test.Input) 330 if !errors.Is(err, test.Err) { 331 t.Errorf("test %d: expecting error %q, got %q", n+1, test.Err, err) 332 } else if o != test.Output { 333 t.Errorf("test %d: from %s, expecting output %q, got %q", n+1, test.Input, test.Output, o) 334 } 335 } 336 } 337 338 func TestQuoteTemplate(t *testing.T) { 339 for n, test := range [...]struct { 340 Input, Output string 341 templateType TemplateType 342 }{ 343 { // 1 344 "", 345 "``", 346 TemplateNoSubstitution, 347 }, 348 { // 2 349 "a", 350 "`a`", 351 TemplateNoSubstitution, 352 }, 353 { // 3 354 "abc", 355 "`abc`", 356 TemplateNoSubstitution, 357 }, 358 { // 4 359 "a\nb c", 360 "`a\nb c`", 361 TemplateNoSubstitution, 362 }, 363 { // 5 364 "\\n", 365 "`\\\\n`", 366 TemplateNoSubstitution, 367 }, 368 { // 6 369 "a$b", 370 "`a$b`", 371 TemplateNoSubstitution, 372 }, 373 { // 7 374 "a${b", 375 "`a\\${b`", 376 TemplateNoSubstitution, 377 }, 378 { // 8 379 "`", 380 "`\\``", 381 TemplateNoSubstitution, 382 }, 383 { // 9 384 "", 385 "`${", 386 TemplateHead, 387 }, 388 { // 10 389 "a", 390 "`a${", 391 TemplateHead, 392 }, 393 { // 11 394 "abc", 395 "`abc${", 396 TemplateHead, 397 }, 398 { // 12 399 "a\nb c", 400 "`a\nb c${", 401 TemplateHead, 402 }, 403 { // 13 404 "\\n", 405 "`\\\\n${", 406 TemplateHead, 407 }, 408 { // 14 409 "a$b", 410 "`a$b${", 411 TemplateHead, 412 }, 413 { // 15 414 "a${b", 415 "`a\\${b${", 416 TemplateHead, 417 }, 418 { // 16 419 "`", 420 "`\\`${", 421 TemplateHead, 422 }, 423 { // 17 424 "", 425 "}${", 426 TemplateMiddle, 427 }, 428 { // 18 429 "a", 430 "}a${", 431 TemplateMiddle, 432 }, 433 { // 19 434 "abc", 435 "}abc${", 436 TemplateMiddle, 437 }, 438 { // 20 439 "a\nb c", 440 "}a\nb c${", 441 TemplateMiddle, 442 }, 443 { // 21 444 "\\n", 445 "}\\\\n${", 446 TemplateMiddle, 447 }, 448 { // 22 449 "a$b", 450 "}a$b${", 451 TemplateMiddle, 452 }, 453 { // 23 454 "a${b", 455 "}a\\${b${", 456 TemplateMiddle, 457 }, 458 { // 24 459 "`", 460 "}\\`${", 461 TemplateMiddle, 462 }, 463 { // 25 464 "", 465 "}`", 466 TemplateTail, 467 }, 468 { // 26 469 "a", 470 "}a`", 471 TemplateTail, 472 }, 473 { // 27 474 "abc", 475 "}abc`", 476 TemplateTail, 477 }, 478 { // 28 479 "a\nb c", 480 "}a\nb c`", 481 TemplateTail, 482 }, 483 { // 29 484 "\\n", 485 "}\\\\n`", 486 TemplateTail, 487 }, 488 { // 30 489 "a$b", 490 "}a$b`", 491 TemplateTail, 492 }, 493 { // 31 494 "a${b", 495 "}a\\${b`", 496 TemplateTail, 497 }, 498 { // 32 499 "`", 500 "}\\``", 501 TemplateTail, 502 }, 503 } { 504 if out := QuoteTemplate(test.Input, test.templateType); out != test.Output { 505 t.Errorf("test %d: expecting output %s, got %s", n+1, test.Output, out) 506 } 507 } 508 } 509