@@ -57,6 +57,19 @@ func parseWithDelimitersTest(_ input: String, _ expecting: AST) {
57
57
}
58
58
}
59
59
60
+ /// Make sure the AST for two regex strings get compared differently.
61
+ func parseNotEqualTest( _ lhs: String , _ rhs: String ,
62
+ syntax: SyntaxOptions = . traditional) {
63
+ let lhsAST = try ! parse ( lhs, syntax)
64
+ let rhsAST = try ! parse ( rhs, syntax)
65
+ if lhsAST == rhsAST || lhsAST. _dump ( ) == rhsAST. _dump ( ) {
66
+ XCTFail ( """
67
+ AST: \( lhsAST. _dump ( ) )
68
+ Should not be equal to: \( rhsAST. _dump ( ) )
69
+ """ )
70
+ }
71
+ }
72
+
60
73
extension RegexTests {
61
74
func testParse( ) {
62
75
parseTest (
@@ -194,6 +207,16 @@ extension RegexTests {
194
207
parseTest ( " [[:word:]] " , charClass ( posixProp_m ( . posix( . word) ) ) )
195
208
parseTest ( " [[:xdigit:]] " , charClass ( posixProp_m ( . posix( . xdigit) ) ) )
196
209
210
+ parseTest ( " [[:ascii:]] " , charClass ( posixProp_m ( . ascii) ) )
211
+ parseTest ( " [[:cntrl:]] " , charClass ( posixProp_m ( . generalCategory( . control) ) ) )
212
+ parseTest ( " [[:digit:]] " , charClass ( posixProp_m ( . generalCategory( . decimalNumber) ) ) )
213
+ parseTest ( " [[:lower:]] " , charClass ( posixProp_m ( . binary( . lowercase) ) ) )
214
+ parseTest ( " [[:punct:]] " , charClass ( posixProp_m ( . generalCategory( . punctuation) ) ) )
215
+ parseTest ( " [[:space:]] " , charClass ( posixProp_m ( . binary( . whitespace) ) ) )
216
+ parseTest ( " [[:upper:]] " , charClass ( posixProp_m ( . binary( . uppercase) ) ) )
217
+
218
+ parseTest ( " [[:UPPER:]] " , charClass ( posixProp_m ( . binary( . uppercase) ) ) )
219
+
197
220
parseTest ( " [[:isALNUM:]] " , charClass ( posixProp_m ( . posix( . alnum) ) ) )
198
221
parseTest ( " [[:AL_NUM:]] " , charClass ( posixProp_m ( . posix( . alnum) ) ) )
199
222
parseTest ( " [[:script=Greek:]] " , charClass ( posixProp_m ( . script( . greek) ) ) )
@@ -436,6 +459,24 @@ extension RegexTests {
436
459
parseWithDelimitersTest ( " '/a b/' " , concat ( " a " , " " , " b " ) )
437
460
parseWithDelimitersTest ( " '|a b|' " , concat ( " a " , " b " ) )
438
461
462
+ // Make sure dumping output correctly reflects differences in AST.
463
+ parseNotEqualTest ( #"abc"# , #"abd"# )
464
+
465
+ parseNotEqualTest ( #"[abc[:space:]\d]+"# ,
466
+ #"[abc[:upper:]\d]+"# )
467
+
468
+ parseNotEqualTest ( #"[abc[:space:]\d]+"# ,
469
+ #"[ac[:space:]\d]+"# )
470
+
471
+ parseNotEqualTest ( #"[abc[:space:]\d]+"# ,
472
+ #"[acc[:space:]\s]+"# )
473
+
474
+ parseNotEqualTest ( #"[abc[:space:]\d]+"# ,
475
+ #"[acc[:space:]\d]*"# )
476
+
477
+ parseNotEqualTest ( #"([a-c&&e]*)+"# ,
478
+ #"([a-d&&e]*)+"# )
479
+
439
480
// TODO: failure tests
440
481
}
441
482
0 commit comments