@@ -90,16 +90,50 @@ class Operators_TestCase: XCTestCase {
9090 XCTAssertEqual ( try res1. unwrap ( ) , [ ] )
9191 }
9292
93- func test_fallback_operator( ) {
93+ func test_fallback_operator( ) throws {
9494 let p1 = char ( " a " ) ?? " b "
9595 let p2 = char ( " a " ) . fallback ( " b " )
9696
9797 let input = " cba "
9898 let res1 = p1. parse ( input)
9999 let res2 = p2. parse ( input)
100100 XCTAssertTrue ( res1 == res2)
101+
102+ let p3 = char ( " a " ) . map ( { $0. description } ) ?? digit. map ( { $0. description } )
103+ let res3 = p3. parse ( " 1 " )
104+ XCTAssertEqual ( try res3. unwrap ( ) , " 1 " )
105+ let res4 = p3. parse ( " a " )
106+ XCTAssertEqual ( try res4. unwrap ( ) , " a " )
107+ let res5 = p3. parse ( " b " )
108+ XCTAssertTrue ( res5. isFailed ( ) )
101109 }
102110
111+ func test_precedence( ) throws {
112+ // ~ has higher presedence than ^^
113+ let p = char ( " a " ) >~ char ( " b " ) <~ char ( " c " ) ^^ { String ( $0) }
114+ let res1 = p. parse ( " abcd " )
115+ XCTAssertEqual ( try res1. unwrap ( ) , " b " )
116+ XCTAssertEqual ( try res1. rest ( ) , " d " )
117+
118+ // >> has higher precedence than ^^
119+ let p2 = char ( " a " ) >> char ( " b " ) ^^ { L . asciiValue ( from: $0) }
120+ XCTAssertEqual ( try p2. parse ( " ab " ) . unwrap ( ) , L . asciiValue ( from: " b " ) )
121+
122+ // + and * have highest precedence
123+ let p3 = char ( " a " ) * ~ char( " b " ) + ^^ { ( $0. 0 . count, String ( $0. 1 ) ) }
124+ let res2 = try p3. parse ( " aaaaaaaaabbb " ) . unwrap ( )
125+ XCTAssertEqual ( res2. 0 , 9 )
126+ XCTAssertEqual ( res2. 1 , " bbb " )
127+
128+ // ?? has highest priority
129+ let p4 = char ( " a " ) ?? " a " ~ digit
130+ let res3 = try p4. parse ( " a4 " ) . unwrap ( )
131+ XCTAssertEqual ( res3. 0 , " a " )
132+ XCTAssertEqual ( res3. 1 , 4 )
133+ let res4 = try p4. parse ( " 4 " ) . unwrap ( )
134+ XCTAssertEqual ( res4. 0 , " a " )
135+ XCTAssertEqual ( res4. 1 , 4 )
136+ }
103137}
104138
105139#if os(Linux)
@@ -114,7 +148,8 @@ class Operators_TestCase: XCTestCase {
114148 ( " test_atLeastOnce_operator " , test_atLeastOnce_operator) ,
115149 ( " test_rep_operator " , test_rep_operator) ,
116150 ( " test_rep_fail_operator " , test_rep_fail_operator) ,
117- ( " test_fallback_operator " , test_fallback_operator)
151+ ( " test_fallback_operator " , test_fallback_operator) ,
152+ ( " test_precedence " , test_precedence)
118153 ]
119154 }
120155#endif
0 commit comments