Ben Murdoch | 097c5b2 | 2016-05-18 11:27:45 +0100 | [diff] [blame] | 1 | // Copyright 2016 the V8 project authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
Ben Murdoch | 61f157c | 2016-09-16 13:49:30 +0100 | [diff] [blame] | 5 | // Flags: --harmony-regexp-lookbehind |
Ben Murdoch | 097c5b2 | 2016-05-18 11:27:45 +0100 | [diff] [blame] | 6 | |
| 7 | var r = /./ug; |
| 8 | assertEquals(["\ud800\udc00"], r.exec("\ud800\udc00\ud801\udc01")); |
| 9 | assertEquals(2, r.lastIndex); |
| 10 | r.lastIndex = 1; |
| 11 | assertEquals(["\ud800\udc00"], r.exec("\ud800\udc00\ud801\udc01")); |
| 12 | assertEquals(2, r.lastIndex); |
| 13 | assertEquals(["\ud801\udc01"], r.exec("\ud800\udc00\ud801\udc01")); |
| 14 | r.lastIndex = 3; |
| 15 | assertEquals(["\ud801\udc01"], r.exec("\ud800\udc00\ud801\udc01")); |
| 16 | assertEquals(4, r.lastIndex); |
| 17 | r.lastIndex = 4; |
| 18 | assertNull(r.exec("\ud800\udc00\ud801\udc01")); |
| 19 | assertEquals(0, r.lastIndex); |
| 20 | r.lastIndex = 5; |
| 21 | assertNull(r.exec("\ud800\udc00\ud801\udc01")); |
| 22 | assertEquals(0, r.lastIndex); |
| 23 | |
| 24 | r.lastIndex = 3; |
| 25 | assertEquals(["\ud802"], r.exec("\ud800\udc00\ud801\ud802")); |
| 26 | r.lastIndex = 4; |
| 27 | assertNull(r.exec("\ud800\udc00\ud801\ud802")); |
| 28 | |
| 29 | r = /./g; |
| 30 | assertEquals(["\ud800"], r.exec("\ud800\udc00\ud801\udc01")); |
| 31 | assertEquals(1, r.lastIndex); |
| 32 | assertEquals(["\udc00"], r.exec("\ud800\udc00\ud801\udc01")); |
| 33 | assertEquals(2, r.lastIndex); |
| 34 | assertEquals(["\ud801"], r.exec("\ud800\udc00\ud801\udc01")); |
| 35 | assertEquals(3, r.lastIndex); |
| 36 | assertEquals(["\udc01"], r.exec("\ud800\udc00\ud801\udc01")); |
| 37 | assertEquals(4, r.lastIndex); |
| 38 | assertNull(r.exec("\ud800\udc00\ud801\udc01")); |
| 39 | assertEquals(0, r.lastIndex); |
| 40 | r.lastIndex = 1; |
| 41 | assertEquals(["\udc00"], r.exec("\ud800\udc00\ud801\udc01")); |
| 42 | assertEquals(2, r.lastIndex); |
| 43 | |
| 44 | // ------------------------ |
| 45 | |
| 46 | r = /^./ug; |
| 47 | assertEquals(["\ud800\udc00"], r.exec("\ud800\udc00\ud801\udc01")); |
| 48 | assertEquals(2, r.lastIndex); |
| 49 | r.lastIndex = 1; |
| 50 | assertEquals(["\ud800\udc00"], r.exec("\ud800\udc00\ud801\udc01")); |
| 51 | assertEquals(2, r.lastIndex); |
| 52 | assertNull(r.exec("\ud800\udc00\ud801\udc01")); |
| 53 | assertEquals(0, r.lastIndex); |
| 54 | r.lastIndex = 3; |
| 55 | assertNull(r.exec("\ud800\udc00\ud801\udc01")); |
| 56 | assertEquals(0, r.lastIndex); |
| 57 | r.lastIndex = 4; |
| 58 | assertNull(r.exec("\ud800\udc00\ud801\udc01")); |
| 59 | assertEquals(0, r.lastIndex); |
| 60 | r.lastIndex = 5; |
| 61 | assertNull(r.exec("\ud800\udc00\ud801\udc01")); |
| 62 | assertEquals(0, r.lastIndex); |
| 63 | |
| 64 | r = /^./g; |
| 65 | assertEquals(["\ud800"], r.exec("\ud800\udc00\ud801\udc01")); |
| 66 | assertEquals(1, r.lastIndex); |
| 67 | assertNull(r.exec("\ud800\udc00\ud801\udc01")); |
| 68 | assertEquals(0, r.lastIndex); |
| 69 | r.lastIndex = 3; |
| 70 | assertNull(r.exec("\ud800\udc00\ud801\udc01")); |
| 71 | assertEquals(0, r.lastIndex); |
| 72 | |
| 73 | //------------------------ |
| 74 | |
| 75 | r = /(?:(^.)|.)/ug; |
| 76 | assertEquals(["\ud800\udc00", "\ud800\udc00"], |
| 77 | r.exec("\ud800\udc00\ud801\udc01")); |
| 78 | assertEquals(2, r.lastIndex); |
| 79 | r.lastIndex = 1; |
| 80 | assertEquals(["\ud800\udc00", "\ud800\udc00"], |
| 81 | r.exec("\ud800\udc00\ud801\udc01")); |
| 82 | assertEquals(2, r.lastIndex); |
| 83 | assertEquals(["\ud801\udc01", undefined], r.exec("\ud800\udc00\ud801\udc01")); |
| 84 | r.lastIndex = 3; |
| 85 | assertEquals(["\ud801\udc01", undefined], r.exec("\ud800\udc00\ud801\udc01")); |
| 86 | r.lastIndex = 4; |
| 87 | assertNull(r.exec("\ud800\udc00\ud801\udc01")); |
| 88 | r.lastIndex = 5; |
| 89 | assertNull(r.exec("\ud800\udc00\ud801\udc01")); |
| 90 | |
| 91 | r.lastIndex = 3; |
| 92 | assertEquals(["\ud802", undefined], r.exec("\ud800\udc00\ud801\ud802")); |
| 93 | r.lastIndex = 4; |
| 94 | assertNull(r.exec("\ud800\udc00\ud801\ud802")); |
| 95 | |
| 96 | r = /(?:(^.)|.)/g; |
| 97 | assertEquals(["\ud800", "\ud800"], |
| 98 | r.exec("\ud800\udc00\ud801\udc01")); |
| 99 | assertEquals(1, r.lastIndex); |
| 100 | assertEquals(["\udc00", undefined], r.exec("\ud800\udc00\ud801\udc01")); |
| 101 | assertEquals(2, r.lastIndex); |
| 102 | r.lastIndex = 3; |
| 103 | assertEquals(["\udc01", undefined], r.exec("\ud800\udc00\ud801\udc01")); |
| 104 | assertEquals(4, r.lastIndex); |