package pairingcode import ( "strings" "testing" "github.com/stretchr/testify/assert" ) func TestNew(t *testing.T) { for _, length := range []int{DeviceCodeLength, InviteCodeLength} { seen := make(map[string]struct{}) for range 2000 { code := New(length) assert.Len(t, code, length) assert.Equal(t, strings.ToUpper(code), code, "code must be uppercase") assert.NotContains(t, code, "-", "canonical code has no separator") for _, r := range code { assert.Truef(t, strings.ContainsRune(Alphabet, r), "unexpected char %q", r) } for _, bad := range []string{"0", "O", "1", "I", "L", "U"} { assert.NotContains(t, code, bad) } seen[code] = struct{}{} } assert.Len(t, seen, 2000, "expected all generated codes to be unique") } } func TestNormalize(t *testing.T) { cases := []struct { in string expected string }{ {"WXYZ2K7Q", "WXYZ2K7Q"}, {"wxyz2k7q", "WXYZ2K7Q"}, {"wxyz-2k7q", "WXYZ2K7Q"}, {" WXYZ 2K7Q ", "WXYZ2K7Q"}, {"", ""}, } for _, tc := range cases { assert.Equal(t, tc.expected, Normalize(tc.in)) } } func TestIsValid(t *testing.T) { assert.True(t, IsValid("WXYZ2K7Q", DeviceCodeLength)) code := New(InviteCodeLength) assert.True(t, IsValid(code, InviteCodeLength)) assert.False(t, IsValid("", DeviceCodeLength)) assert.False(t, IsValid("WXYZ2K7", DeviceCodeLength)) assert.False(t, IsValid("WXYZ2K7QQ", DeviceCodeLength)) assert.False(t, IsValid("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", DeviceCodeLength)) assert.False(t, IsValid("WXYZ2K7O", DeviceCodeLength), "O not in alphabet") assert.False(t, IsValid("WXYZ2K71", DeviceCodeLength), "1 not in alphabet") assert.False(t, IsValid("wxyz2k7q", DeviceCodeLength), "lowercase is not canonical") assert.False(t, IsValid("WXYZ-2K7", DeviceCodeLength), "hyphen is not canonical") }