package generic import ( "maps" "slices" "testing" ) type X struct{} func TestZero(t *testing.T) { if Zero[int]() != 0 { t.Errorf("Zero[int]() != 0") } if Zero[string]() != "" { t.Errorf(`Zero[string]() != ""`) } if Zero[bool]() != false { t.Errorf("Zero[bool]() != false") } if Zero[*X]() != nil { t.Errorf("Zero[*X]() != nil") } } func TestIsZero(t *testing.T) { tests := []struct { name string val any want bool }{ { name: "int zero", val: 0, want: true, }, { "int non-zero", 1, false, }, { "string zero", "", true, }, { "string non-zero", "x", false, }, { "nil pointer", (*X)(nil), true, }, { "non-nil pointer", Ptr(X{}), false, }, } for _, tt := range tests { switch v := tt.val.(type) { case int: got := IsZero(v) if got != tt.want { t.Errorf("%s: got %v, want %v", tt.name, got, tt.want) } case string: got := IsZero(v) if got != tt.want { t.Errorf("%s: got %v, want %v", tt.name, got, tt.want) } case *X: got := IsZero(v) if got != tt.want { t.Errorf("%s: got %v, want %v", tt.name, got, tt.want) } } } } func TestPtr(t *testing.T) { v := 42 p := Ptr(v) if p == nil || *p != v { t.Errorf("Ptr(42) = %v, want pointer to 42", p) } } func TestKeys(t *testing.T) { m := map[string]int{"a": 1, "b": 2, "c": 3} seq := Keys(maps.All(m)) keys := slices.Collect(seq) want := slices.Collect(maps.Keys(m)) slices.Sort(keys) slices.Sort(want) if !slices.Equal(keys, want) { t.Errorf("Keys() = %v, want %v", keys, want) } } func TestValue(t *testing.T) { m := map[string]int{"a": 1, "b": 2, "c": 3} seq := Value(maps.All(m)) values := slices.Collect(seq) want := slices.Collect(maps.Values(m)) // unordered compare slices.Sort(values) slices.Sort(want) if !slices.Equal(values, want) { t.Errorf("Values() = %v, want %v", values, want) } } func TestSet_Add_Has_Del(t *testing.T) { s := NewSet[int]() if s.Has(10) { t.Errorf("Set should not contain 10 initially") } s.Add(10) if !s.Has(10) { t.Errorf("Set should contain 10 after Add") } s.Del(10) if s.Has(10) { t.Errorf("Set should not contain 10 after Del") } } func TestSet_All(t *testing.T) { s := NewSet[string]() s.Add("x") s.Add("y") s.Add("z") got := slices.Collect(s.All()) want := []string{"x", "y", "z"} slices.Sort(got) slices.Sort(want) if !slices.Equal(got, want) { t.Errorf("Set.All() = %v, want %v", got, want) } }