summaryrefslogtreecommitdiffstats
path: root/generic/generic_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'generic/generic_test.go')
-rw-r--r--generic/generic_test.go149
1 files changed, 149 insertions, 0 deletions
diff --git a/generic/generic_test.go b/generic/generic_test.go
new file mode 100644
index 0000000..953f2ac
--- /dev/null
+++ b/generic/generic_test.go
@@ -0,0 +1,149 @@
+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)
+ }
+}