@@ -663,7 +663,7 @@ fn spec2(op: &Op) -> String {
663663 }
664664 Op :: Lookup2 ( oid) => {
665665 format ! ( ":lookup2={}" , oid. to_string( ) )
666- }
666+ }
667667 Op :: Stored ( path) => {
668668 format ! ( ":+{}" , parse:: quote_if( & path. to_string_lossy( ) ) )
669669 }
@@ -2310,4 +2310,52 @@ mod tests {
23102310 dst_path( parse( ":[a=:/x::y/,a/b=:/i]:prefix=c" ) . unwrap( ) )
23112311 ) ;
23122312 }
2313+
2314+ #[ test]
2315+ fn invert_filter_parsing_test ( ) {
2316+ // Test that :invert[X] syntax parses correctly
2317+ let filter = parse ( ":invert[:/sub1]" ) . unwrap ( ) ;
2318+ // Verify it's not empty
2319+ assert_ne ! ( filter, empty( ) ) ;
2320+
2321+ // Test with prefix filter (inverse of subdir)
2322+ let filter2 = parse ( ":invert[:prefix=sub1]" ) . unwrap ( ) ;
2323+ assert_ne ! ( filter2, empty( ) ) ;
2324+
2325+ // Test that it produces the correct inverse
2326+ let filter3 = parse ( ":invert[:/sub1]" ) . unwrap ( ) ;
2327+ let spec_str = spec ( filter3) ;
2328+ // Should produce prefix (inverse of subdir)
2329+ assert ! ( spec_str. contains( "prefix" ) || !spec_str. is_empty( ) ) ;
2330+
2331+ // Test with multiple filters in compose
2332+ let filter4 = parse ( ":invert[:/sub1,:/sub2]" ) . unwrap ( ) ;
2333+ assert_ne ! ( filter4, empty( ) ) ;
2334+ }
2335+
2336+ #[ test]
2337+ fn scope_filter_parsing_test ( ) {
2338+ // Test that :<X>[Y] syntax parses correctly
2339+ let filter = parse ( ":<:/sub1>[:/file1]" ) . unwrap ( ) ;
2340+ // Just verify parsing succeeds (filter may optimize to empty in some cases)
2341+ let _ = filter;
2342+
2343+ // Test with multiple filters in compose
2344+ let filter2 = parse ( ":<:/sub1>[:/file1,:/file2]" ) . unwrap ( ) ;
2345+ let _ = filter2;
2346+
2347+ // Test with prefix filter
2348+ let filter3 = parse ( ":<:prefix=sub1>[:prefix=file1]" ) . unwrap ( ) ;
2349+ let _ = filter3;
2350+
2351+ // Test with exclude
2352+ let filter4 = parse ( ":<:/sub1>[:exclude[::file1]]" ) . unwrap ( ) ;
2353+ let _ = filter4;
2354+
2355+ // Test that it expands to chain structure by checking spec output
2356+ let filter5 = parse ( ":<:/sub1>[:/file1]" ) . unwrap ( ) ;
2357+ let spec_str = spec ( filter5) ;
2358+ // The spec should contain the chain representation
2359+ assert ! ( !spec_str. is_empty( ) ) ;
2360+ }
23132361}
0 commit comments