259 lines
6.4 KiB
Go
259 lines
6.4 KiB
Go
package enums
|
|
|
|
import (
|
|
"encoding/json"
|
|
"reflect"
|
|
"testing"
|
|
)
|
|
|
|
type mockEnum struct {
|
|
name string
|
|
}
|
|
|
|
func (m mockEnum) Valid() bool { return m.name != "" }
|
|
func (m mockEnum) ValuesAny() []any { return []any{mockEnum{name: "a"}, mockEnum{name: "b"}} }
|
|
func (m mockEnum) ValuesMeta() []EnumMetaValue { return nil }
|
|
func (m mockEnum) VarName() string { return m.name }
|
|
func (m mockEnum) TypeName() string { return "mockEnum" }
|
|
func (m mockEnum) PackageName() string { return "enums_test" }
|
|
func (m mockEnum) String() string { return "str:" + m.name }
|
|
func (m mockEnum) Description() string { return "desc:" + m.name }
|
|
func (m mockEnum) DescriptionMeta() EnumDescriptionMetaValue {
|
|
return EnumDescriptionMetaValue{VarName: m.name, Value: m, Description: "desc:" + m.name}
|
|
}
|
|
|
|
func (m mockEnum) MarshalJSON() ([]byte, error) {
|
|
return json.Marshal(m.name)
|
|
}
|
|
|
|
func TestMockEnumImplementsInterfaces(t *testing.T) {
|
|
var _ Enum = mockEnum{}
|
|
var _ StringEnum = mockEnum{}
|
|
var _ DescriptionEnum = mockEnum{}
|
|
}
|
|
|
|
func TestEnumValid(t *testing.T) {
|
|
if !(mockEnum{name: "x"}).Valid() {
|
|
t.Errorf("expected Valid() == true")
|
|
}
|
|
if (mockEnum{}).Valid() {
|
|
t.Errorf("expected Valid() == false for zero value")
|
|
}
|
|
}
|
|
|
|
func TestEnumMetaValueJSON(t *testing.T) {
|
|
desc := "the-description"
|
|
mv := EnumMetaValue{
|
|
VarName: "Foo",
|
|
Value: mockEnum{name: "foo"},
|
|
Description: &desc,
|
|
}
|
|
|
|
data, err := json.Marshal(mv)
|
|
if err != nil {
|
|
t.Fatalf("json.Marshal failed: %v", err)
|
|
}
|
|
|
|
var got map[string]any
|
|
if err := json.Unmarshal(data, &got); err != nil {
|
|
t.Fatalf("json.Unmarshal failed: %v", err)
|
|
}
|
|
|
|
if got["varName"] != "Foo" {
|
|
t.Errorf("varName == %v, want Foo", got["varName"])
|
|
}
|
|
if got["value"] != "foo" {
|
|
t.Errorf("value == %v, want foo", got["value"])
|
|
}
|
|
if got["description"] != "the-description" {
|
|
t.Errorf("description == %v, want the-description", got["description"])
|
|
}
|
|
}
|
|
|
|
func TestEnumMetaValueJSONNilDescription(t *testing.T) {
|
|
mv := EnumMetaValue{
|
|
VarName: "Foo",
|
|
Value: mockEnum{name: "foo"},
|
|
Description: nil,
|
|
}
|
|
|
|
data, err := json.Marshal(mv)
|
|
if err != nil {
|
|
t.Fatalf("json.Marshal failed: %v", err)
|
|
}
|
|
|
|
var got map[string]any
|
|
if err := json.Unmarshal(data, &got); err != nil {
|
|
t.Fatalf("json.Unmarshal failed: %v", err)
|
|
}
|
|
|
|
if got["description"] != nil {
|
|
t.Errorf("description == %v, want nil", got["description"])
|
|
}
|
|
}
|
|
|
|
func TestEnumDescriptionMetaValueJSON(t *testing.T) {
|
|
mv := EnumDescriptionMetaValue{
|
|
VarName: "Bar",
|
|
Value: mockEnum{name: "bar"},
|
|
Description: "bar-desc",
|
|
}
|
|
|
|
data, err := json.Marshal(mv)
|
|
if err != nil {
|
|
t.Fatalf("json.Marshal failed: %v", err)
|
|
}
|
|
|
|
var got map[string]any
|
|
if err := json.Unmarshal(data, &got); err != nil {
|
|
t.Fatalf("json.Unmarshal failed: %v", err)
|
|
}
|
|
|
|
expected := map[string]any{
|
|
"varName": "Bar",
|
|
"value": "bar",
|
|
"description": "bar-desc",
|
|
}
|
|
if !reflect.DeepEqual(got, expected) {
|
|
t.Errorf("json output == %v, want %v", got, expected)
|
|
}
|
|
}
|
|
|
|
func TestEnumDataMetaValueMarshalJSON(t *testing.T) {
|
|
desc := "data-desc"
|
|
mv := EnumDataMetaValue{
|
|
VarName: "Baz",
|
|
Value: mockEnum{name: "baz"},
|
|
Description: &desc,
|
|
Data: map[string]any{
|
|
"extra1": "hello",
|
|
"extra2": float64(42),
|
|
},
|
|
}
|
|
|
|
data, err := json.Marshal(mv)
|
|
if err != nil {
|
|
t.Fatalf("json.Marshal failed: %v", err)
|
|
}
|
|
|
|
var got map[string]any
|
|
if err := json.Unmarshal(data, &got); err != nil {
|
|
t.Fatalf("json.Unmarshal failed: %v", err)
|
|
}
|
|
|
|
if got["varName"] != "Baz" {
|
|
t.Errorf("varName == %v, want Baz", got["varName"])
|
|
}
|
|
if got["value"] != "baz" {
|
|
t.Errorf("value == %v, want baz", got["value"])
|
|
}
|
|
if got["description"] != "data-desc" {
|
|
t.Errorf("description == %v, want data-desc", got["description"])
|
|
}
|
|
if got["extra1"] != "hello" {
|
|
t.Errorf("extra1 == %v, want hello", got["extra1"])
|
|
}
|
|
if got["extra2"] != float64(42) {
|
|
t.Errorf("extra2 == %v, want 42", got["extra2"])
|
|
}
|
|
}
|
|
|
|
func TestEnumDataMetaValueMarshalJSONNilData(t *testing.T) {
|
|
mv := EnumDataMetaValue{
|
|
VarName: "Baz",
|
|
Value: mockEnum{name: "baz"},
|
|
Description: nil,
|
|
Data: nil,
|
|
}
|
|
|
|
data, err := json.Marshal(mv)
|
|
if err != nil {
|
|
t.Fatalf("json.Marshal failed: %v", err)
|
|
}
|
|
|
|
var got map[string]any
|
|
if err := json.Unmarshal(data, &got); err != nil {
|
|
t.Fatalf("json.Unmarshal failed: %v", err)
|
|
}
|
|
|
|
if got["varName"] != "Baz" {
|
|
t.Errorf("varName == %v, want Baz", got["varName"])
|
|
}
|
|
if got["value"] != "baz" {
|
|
t.Errorf("value == %v, want baz", got["value"])
|
|
}
|
|
if _, ok := got["description"]; !ok {
|
|
t.Errorf("description key missing in JSON output")
|
|
}
|
|
if got["description"] != nil {
|
|
t.Errorf("description == %v, want nil", got["description"])
|
|
}
|
|
if len(got) != 3 {
|
|
t.Errorf("expected 3 keys with nil Data, got %d: %v", len(got), got)
|
|
}
|
|
}
|
|
|
|
func TestEnumDataMetaValueMarshalJSONDataDoesNotOverrideStandardFields(t *testing.T) {
|
|
desc := "real-desc"
|
|
mv := EnumDataMetaValue{
|
|
VarName: "Real",
|
|
Value: mockEnum{name: "real"},
|
|
Description: &desc,
|
|
Data: map[string]any{
|
|
"varName": "ShouldBeOverwritten",
|
|
"value": "ShouldBeOverwritten",
|
|
"description": "ShouldBeOverwritten",
|
|
"keep": "kept",
|
|
},
|
|
}
|
|
|
|
data, err := json.Marshal(mv)
|
|
if err != nil {
|
|
t.Fatalf("json.Marshal failed: %v", err)
|
|
}
|
|
|
|
var got map[string]any
|
|
if err := json.Unmarshal(data, &got); err != nil {
|
|
t.Fatalf("json.Unmarshal failed: %v", err)
|
|
}
|
|
|
|
if got["varName"] != "Real" {
|
|
t.Errorf("varName == %v, want Real (standard field must override Data)", got["varName"])
|
|
}
|
|
if got["value"] != "real" {
|
|
t.Errorf("value == %v, want real (standard field must override Data)", got["value"])
|
|
}
|
|
if got["description"] != "real-desc" {
|
|
t.Errorf("description == %v, want real-desc (standard field must override Data)", got["description"])
|
|
}
|
|
if got["keep"] != "kept" {
|
|
t.Errorf("keep == %v, want kept", got["keep"])
|
|
}
|
|
}
|
|
|
|
func TestEnumDataMetaValueMarshalJSONEmptyData(t *testing.T) {
|
|
mv := EnumDataMetaValue{
|
|
VarName: "E",
|
|
Value: mockEnum{name: "e"},
|
|
Description: nil,
|
|
Data: map[string]any{},
|
|
}
|
|
|
|
data, err := json.Marshal(mv)
|
|
if err != nil {
|
|
t.Fatalf("json.Marshal failed: %v", err)
|
|
}
|
|
|
|
var got map[string]any
|
|
if err := json.Unmarshal(data, &got); err != nil {
|
|
t.Fatalf("json.Unmarshal failed: %v", err)
|
|
}
|
|
|
|
if got["varName"] != "E" {
|
|
t.Errorf("varName == %v, want E", got["varName"])
|
|
}
|
|
if got["value"] != "e" {
|
|
t.Errorf("value == %v, want e", got["value"])
|
|
}
|
|
}
|