| package dag |
| |
| import ( |
| "fmt" |
| "testing" |
| ) |
| |
| func TestSetDifference(t *testing.T) { |
| cases := []struct { |
| Name string |
| A, B []interface{} |
| Expected []interface{} |
| }{ |
| { |
| "same", |
| []interface{}{1, 2, 3}, |
| []interface{}{3, 1, 2}, |
| []interface{}{}, |
| }, |
| |
| { |
| "A has extra elements", |
| []interface{}{1, 2, 3}, |
| []interface{}{3, 2}, |
| []interface{}{1}, |
| }, |
| |
| { |
| "B has extra elements", |
| []interface{}{1, 2, 3}, |
| []interface{}{3, 2, 1, 4}, |
| []interface{}{}, |
| }, |
| { |
| "B is nil", |
| []interface{}{1, 2, 3}, |
| nil, |
| []interface{}{1, 2, 3}, |
| }, |
| } |
| |
| for i, tc := range cases { |
| t.Run(fmt.Sprintf("%d-%s", i, tc.Name), func(t *testing.T) { |
| one := make(Set) |
| two := make(Set) |
| expected := make(Set) |
| for _, v := range tc.A { |
| one.Add(v) |
| } |
| for _, v := range tc.B { |
| two.Add(v) |
| } |
| if tc.B == nil { |
| two = nil |
| } |
| for _, v := range tc.Expected { |
| expected.Add(v) |
| } |
| |
| actual := one.Difference(two) |
| match := actual.Intersection(expected) |
| if match.Len() != expected.Len() { |
| t.Fatalf("bad: %#v", actual.List()) |
| } |
| }) |
| } |
| } |
| |
| func TestSetFilter(t *testing.T) { |
| cases := []struct { |
| Input []interface{} |
| Expected []interface{} |
| }{ |
| { |
| []interface{}{1, 2, 3}, |
| []interface{}{1, 2, 3}, |
| }, |
| |
| { |
| []interface{}{4, 5, 6}, |
| []interface{}{4}, |
| }, |
| |
| { |
| []interface{}{7, 8, 9}, |
| []interface{}{}, |
| }, |
| } |
| |
| for i, tc := range cases { |
| t.Run(fmt.Sprintf("%d-%#v", i, tc.Input), func(t *testing.T) { |
| input := make(Set) |
| expected := make(Set) |
| for _, v := range tc.Input { |
| input.Add(v) |
| } |
| for _, v := range tc.Expected { |
| expected.Add(v) |
| } |
| |
| actual := input.Filter(func(v interface{}) bool { |
| return v.(int) < 5 |
| }) |
| match := actual.Intersection(expected) |
| if match.Len() != expected.Len() { |
| t.Fatalf("bad: %#v", actual.List()) |
| } |
| }) |
| } |
| } |
| |
| func TestSetCopy(t *testing.T) { |
| a := make(Set) |
| a.Add(1) |
| a.Add(2) |
| |
| b := a.Copy() |
| b.Add(3) |
| |
| diff := b.Difference(a) |
| |
| if diff.Len() != 1 { |
| t.Fatalf("expected single diff value, got %#v", diff) |
| } |
| |
| if !diff.Include(3) { |
| t.Fatalf("diff does not contain 3, got %#v", diff) |
| } |
| |
| } |
| |
| func makeSet(n int) Set { |
| ret := make(Set, n) |
| for i := 0; i < n; i++ { |
| ret.Add(i) |
| } |
| return ret |
| } |
| |
| func BenchmarkSetIntersection_100_100000(b *testing.B) { |
| small := makeSet(100) |
| large := makeSet(100000) |
| |
| b.ResetTimer() |
| for n := 0; n < b.N; n++ { |
| small.Intersection(large) |
| } |
| } |
| |
| func BenchmarkSetIntersection_100000_100(b *testing.B) { |
| small := makeSet(100) |
| large := makeSet(100000) |
| |
| b.ResetTimer() |
| for n := 0; n < b.N; n++ { |
| large.Intersection(small) |
| } |
| } |