@@ -131,6 +131,12 @@ func BenchmarkFieldSet(b *testing.B) {
131131 randOperand ().Difference (randOperand ())
132132 }
133133 })
134+ b .Run (fmt .Sprintf ("recursive-difference-%v" , here .size ), func (b * testing.B ) {
135+ b .ReportAllocs ()
136+ for i := 0 ; i < b .N ; i ++ {
137+ randOperand ().RecursiveDifference (randOperand ())
138+ }
139+ })
134140 }
135141}
136142
@@ -447,6 +453,94 @@ func TestSetIntersectionDifference(t *testing.T) {
447453 })
448454}
449455
456+ func TestSetDifference (t * testing.T ) {
457+ table := []struct {
458+ name string
459+ a * Set
460+ b * Set
461+ expectDifference * Set
462+ expectRecursiveDifference * Set
463+ }{
464+ {
465+ name : "removes simple path" ,
466+ a : NewSet (MakePathOrDie ("a" )),
467+ b : NewSet (MakePathOrDie ("a" )),
468+ expectDifference : NewSet (),
469+ expectRecursiveDifference : NewSet (),
470+ },
471+ {
472+ name : "removes direct path" ,
473+ a : NewSet (MakePathOrDie ("a" , "b" , "c" )),
474+ b : NewSet (MakePathOrDie ("a" , "b" , "c" )),
475+ expectDifference : NewSet (),
476+ expectRecursiveDifference : NewSet (),
477+ },
478+ {
479+ name : "only removes matching child" ,
480+ a : NewSet (
481+ MakePathOrDie ("a" , "b" , "c" ),
482+ MakePathOrDie ("b" , "b" , "c" ),
483+ ),
484+ b : NewSet (MakePathOrDie ("a" , "b" , "c" )),
485+ expectDifference : NewSet (MakePathOrDie ("b" , "b" , "c" )),
486+ expectRecursiveDifference : NewSet (MakePathOrDie ("b" , "b" , "c" )),
487+ },
488+ {
489+ name : "does not remove parent of specific path" ,
490+ a : NewSet (
491+ MakePathOrDie ("a" ),
492+ ),
493+ b : NewSet (MakePathOrDie ("a" , "aa" )),
494+ expectDifference : NewSet (MakePathOrDie ("a" )),
495+ expectRecursiveDifference : NewSet (MakePathOrDie ("a" )),
496+ },
497+ {
498+ name : "RecursiveDifference removes nested path" ,
499+ a : NewSet (MakePathOrDie ("a" , "b" , "c" )),
500+ b : NewSet (MakePathOrDie ("a" )),
501+ expectDifference : NewSet (MakePathOrDie ("a" , "b" , "c" )),
502+ expectRecursiveDifference : NewSet (),
503+ },
504+ {
505+ name : "RecursiveDifference only removes nested path for matching children" ,
506+ a : NewSet (
507+ MakePathOrDie ("a" , "aa" , "aab" ),
508+ MakePathOrDie ("a" , "ab" , "aba" ),
509+ ),
510+ b : NewSet (MakePathOrDie ("a" , "aa" )),
511+ expectDifference : NewSet (
512+ MakePathOrDie ("a" , "aa" , "aab" ),
513+ MakePathOrDie ("a" , "ab" , "aba" ),
514+ ),
515+ expectRecursiveDifference : NewSet (MakePathOrDie ("a" , "ab" , "aba" )),
516+ },
517+ {
518+ name : "RecursiveDifference removes all matching children" ,
519+ a : NewSet (
520+ MakePathOrDie ("a" , "aa" , "aab" ),
521+ MakePathOrDie ("a" , "ab" , "aba" ),
522+ ),
523+ b : NewSet (MakePathOrDie ("a" )),
524+ expectDifference : NewSet (
525+ MakePathOrDie ("a" , "aa" , "aab" ),
526+ MakePathOrDie ("a" , "ab" , "aba" ),
527+ ),
528+ expectRecursiveDifference : NewSet (),
529+ },
530+ }
531+
532+ for _ , c := range table {
533+ t .Run (c .name , func (t * testing.T ) {
534+ if result := c .a .Difference (c .b ); ! result .Equals (c .expectDifference ) {
535+ t .Fatalf ("Difference expected: \n %v\n , got: \n %v\n " , c .expectDifference , result )
536+ }
537+ if result := c .a .RecursiveDifference (c .b ); ! result .Equals (c .expectRecursiveDifference ) {
538+ t .Fatalf ("RecursiveDifference expected: \n %v\n , got: \n %v\n " , c .expectRecursiveDifference , result )
539+ }
540+ })
541+ }
542+ }
543+
450544func TestSetNodeMapIterate (t * testing.T ) {
451545 set := & SetNodeMap {}
452546 toAdd := 5
0 commit comments