mirror of
https://github.com/abice/go-enum.git
synced 2026-10-29 00:56:10 +08:00
201 lines
4.8 KiB
Go
201 lines
4.8 KiB
Go
//go:build example
|
|
// +build example
|
|
|
|
package example
|
|
|
|
import (
|
|
"encoding/json"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestSQLExtras(t *testing.T) {
|
|
assert.Equal(t, "ProjectStatus(22)", ProjectStatus(22).String(), "String value is not correct")
|
|
|
|
_, err := ParseProjectStatus(`NotAStatus`)
|
|
assert.Error(t, err, "Should have had an error parsing a non status")
|
|
|
|
var (
|
|
intVal int = 3
|
|
strVal string = "completed"
|
|
strIntVal string = "2"
|
|
nullInt *int
|
|
nullInt64 *int64
|
|
nullFloat64 *float64
|
|
nullUint *uint
|
|
nullUint64 *uint64
|
|
nullString *string
|
|
nullProjectStatus *ProjectStatus
|
|
)
|
|
|
|
tests := map[string]struct {
|
|
input interface{}
|
|
result NullProjectStatus
|
|
}{
|
|
"nil": {},
|
|
"val": {
|
|
input: ProjectStatusRejected,
|
|
result: NullProjectStatus{
|
|
ProjectStatus: ProjectStatusRejected,
|
|
Valid: true,
|
|
},
|
|
},
|
|
"ptr": {
|
|
input: ProjectStatusCompleted.Ptr(),
|
|
result: NullProjectStatus{
|
|
ProjectStatus: ProjectStatusCompleted,
|
|
Valid: true,
|
|
},
|
|
},
|
|
"string": {
|
|
input: strVal,
|
|
result: NullProjectStatus{
|
|
ProjectStatus: ProjectStatusCompleted,
|
|
Valid: true,
|
|
},
|
|
},
|
|
"*string": {
|
|
input: &strVal,
|
|
result: NullProjectStatus{
|
|
ProjectStatus: ProjectStatusCompleted,
|
|
Valid: true,
|
|
},
|
|
},
|
|
"*string as int": {
|
|
input: &strIntVal,
|
|
result: NullProjectStatus{
|
|
ProjectStatus: ProjectStatusCompleted,
|
|
Valid: true,
|
|
},
|
|
},
|
|
"invalid string": {
|
|
input: "random value",
|
|
},
|
|
"[]byte": {
|
|
input: []byte(ProjectStatusInWork.String()),
|
|
result: NullProjectStatus{
|
|
ProjectStatus: ProjectStatusInWork,
|
|
Valid: true,
|
|
},
|
|
},
|
|
"int": {
|
|
input: intVal,
|
|
result: NullProjectStatus{
|
|
ProjectStatus: ProjectStatusRejected,
|
|
Valid: true,
|
|
},
|
|
},
|
|
"*int": {
|
|
input: &intVal,
|
|
result: NullProjectStatus{
|
|
ProjectStatus: ProjectStatusRejected,
|
|
Valid: true,
|
|
},
|
|
},
|
|
"nullInt": {
|
|
input: nullInt,
|
|
},
|
|
"nullInt64": {
|
|
input: nullInt64,
|
|
},
|
|
"nullUint": {
|
|
input: nullUint,
|
|
},
|
|
"nullUint64": {
|
|
input: nullUint64,
|
|
},
|
|
"nullFloat64": {
|
|
input: nullFloat64,
|
|
},
|
|
"nullString": {
|
|
input: nullString,
|
|
},
|
|
"nullProjectStatus": {
|
|
input: nullProjectStatus,
|
|
},
|
|
"int as []byte": {
|
|
input: []byte("1"),
|
|
result: NullProjectStatus{
|
|
ProjectStatus: ProjectStatusInWork,
|
|
Valid: true,
|
|
},
|
|
},
|
|
}
|
|
|
|
for name, tc := range tests {
|
|
t.Run(name, func(t *testing.T) {
|
|
status := NewNullProjectStatus(tc.input)
|
|
tc.result.Set = true
|
|
assert.Equal(t, tc.result, status)
|
|
})
|
|
}
|
|
}
|
|
|
|
type SQLMarshalType struct {
|
|
Status NullProjectStatus `json:"status"`
|
|
StatusStr NullProjectStatusStr `json:"status_str"`
|
|
Status2 *ProjectStatus `json:"status2,omitempty"`
|
|
}
|
|
|
|
func TestSQLMarshal(t *testing.T) {
|
|
var val SQLMarshalType
|
|
var val2 SQLMarshalType
|
|
|
|
result, err := json.Marshal(val)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, `{"status":null,"status_str":null}`, string(result))
|
|
|
|
require.NoError(t, json.Unmarshal([]byte(`{}`), &val2))
|
|
assert.Equal(t, val, val2)
|
|
|
|
require.NoError(t, json.Unmarshal(result, &val2))
|
|
val.Status.Set = true
|
|
val.StatusStr.Set = true
|
|
assert.Equal(t, val, val2)
|
|
|
|
val.Status = NewNullProjectStatus(1)
|
|
val.StatusStr = NewNullProjectStatusStr(2)
|
|
result, err = json.Marshal(val)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, `{"status":"inWork","status_str":"completed"}`, string(result))
|
|
|
|
require.NoError(t, json.Unmarshal(result, &val2))
|
|
assert.Equal(t, val, val2)
|
|
|
|
require.NoError(t, json.Unmarshal([]byte(`{"status":"inWork"}`), &val2))
|
|
assert.Equal(t, val, val2)
|
|
|
|
require.NoError(t, json.Unmarshal([]byte(`{"status":"2"}`), &val2))
|
|
val.Status = NewNullProjectStatus(2)
|
|
assert.Equal(t, val, val2)
|
|
|
|
require.NoError(t, json.Unmarshal([]byte(`{"status":3}`), &val2))
|
|
val.Status = NewNullProjectStatus(3)
|
|
assert.Equal(t, val, val2)
|
|
|
|
require.NoError(t, json.Unmarshal([]byte(`{"status":null}`), &val2))
|
|
val.Status = NullProjectStatus{Set: true}
|
|
assert.Equal(t, val, val2)
|
|
|
|
val2 = SQLMarshalType{} // reset it so that the `set` value is false.
|
|
|
|
require.NoError(t, json.Unmarshal([]byte(`{"status2":"rejected"}`), &val2))
|
|
val.Status = NullProjectStatus{}
|
|
val.StatusStr = NullProjectStatusStr{}
|
|
val.Status2 = ProjectStatusRejected.Ptr()
|
|
assert.Equal(t, val, val2)
|
|
|
|
require.Error(t, json.Unmarshal([]byte(`{"status2":"xyz"}`), &val2))
|
|
val2 = SQLMarshalType{} // reset it so that the `set` value is false.
|
|
|
|
require.NoError(t, json.Unmarshal([]byte(`{"status_str":"rejected"}`), &val2))
|
|
val.Status = NullProjectStatus{}
|
|
val.StatusStr = NewNullProjectStatusStr(3)
|
|
val.Status2 = nil
|
|
assert.Equal(t, val, val2)
|
|
|
|
require.Error(t, json.Unmarshal([]byte(`{"status2":"xyz"}`), &val2))
|
|
}
|