Skip to content

Commit 3b3b1c2

Browse files
authored
Merge pull request #136 from microsoft/andrueastman/validateEnumParsing
Validates cases for enum parsing
2 parents f1a6b5d + 024e4eb commit 3b3b1c2

4 files changed

+128
-6
lines changed

internal/test_entity.go

+29-4
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ import (
77
)
88

99
type TestEntity struct {
10-
additionalData map[string]interface{}
11-
id *string
12-
officeLocation *string
13-
//TODO test numbers enum
10+
additionalData map[string]interface{}
11+
id *string
12+
officeLocation *string
13+
sensitivity *TestSensitivity
1414
workDuration *absser.ISODuration
1515
birthDay *absser.DateOnly
1616
startWorkTime *absser.TimeOnly
@@ -35,6 +35,8 @@ type TestEntityable interface {
3535
SetEndWorkTime(value *absser.TimeOnly)
3636
GetCreatedDateTime() *time.Time
3737
SetCreatedDateTime(value *time.Time)
38+
GetSensitivity() *TestSensitivity
39+
SetSensitivity(value *TestSensitivity)
3840
}
3941

4042
func TestEntityDiscriminator(absser.ParseNode) (absser.Parsable, error) {
@@ -95,6 +97,12 @@ func (e *TestEntity) GetCreatedDateTime() *time.Time {
9597
func (e *TestEntity) SetCreatedDateTime(value *time.Time) {
9698
e.createdDateTime = value
9799
}
100+
func (e *TestEntity) GetSensitivity() *TestSensitivity {
101+
return e.sensitivity
102+
}
103+
func (e *TestEntity) SetSensitivity(value *TestSensitivity) {
104+
e.sensitivity = value
105+
}
98106

99107
func CreateTestEntityFromDiscriminator(parseNode absser.ParseNode) (absser.Parsable, error) {
100108
return NewTestEntity(), nil
@@ -172,6 +180,16 @@ func (e *TestEntity) GetFieldDeserializers() map[string]func(absser.ParseNode) e
172180
}
173181
return nil
174182
}
183+
res["sensitivity"] = func(n absser.ParseNode) error {
184+
val, err := n.GetEnumValue(ParseTestSensitivity)
185+
if err != nil {
186+
return err
187+
}
188+
if val != nil {
189+
e.SetSensitivity(val.(*TestSensitivity))
190+
}
191+
return nil
192+
}
175193
return res
176194
}
177195

@@ -218,5 +236,12 @@ func (m *TestEntity) Serialize(writer absser.SerializationWriter) error {
218236
return err
219237
}
220238
}
239+
if m.GetSensitivity() != nil {
240+
cast := (*m.GetSensitivity()).String()
241+
err := writer.WriteStringValue("sensitivity", &cast)
242+
if err != nil {
243+
return err
244+
}
245+
}
221246
return nil
222247
}

internal/test_sensitivity.go

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package internal
2+
3+
type TestSensitivity int
4+
5+
const (
6+
NORMAL_SENSITIVITY TestSensitivity = iota
7+
PERSONAL_SENSITIVITY
8+
PRIVATE_SENSITIVITY
9+
CONFIDENTIAL_SENSITIVITY
10+
)
11+
12+
func (i TestSensitivity) String() string {
13+
return []string{"normal", "personal", "private", "confidential"}[i]
14+
}
15+
func ParseTestSensitivity(v string) (any, error) {
16+
result := NORMAL_SENSITIVITY
17+
switch v {
18+
case "normal":
19+
result = NORMAL_SENSITIVITY
20+
case "personal":
21+
result = PERSONAL_SENSITIVITY
22+
case "private":
23+
result = PRIVATE_SENSITIVITY
24+
case "confidential":
25+
result = CONFIDENTIAL_SENSITIVITY
26+
default:
27+
return nil, nil
28+
}
29+
return &result, nil
30+
}
31+
func SerializeTestSensitivity(values []TestSensitivity) []string {
32+
result := make([]string, len(values))
33+
for i, v := range values {
34+
result[i] = v.String()
35+
}
36+
return result
37+
}
38+
func (i TestSensitivity) isMultiValue() bool {
39+
return false
40+
}

json_parse_node_test.go

+40-2
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,42 @@ func TestNestedGetRawValue(t *testing.T) {
122122
assert.Equal(t, expected, value)
123123
}
124124

125+
func TestValidEnumValue(t *testing.T) {
126+
source := `{
127+
"id": "acbb4e46-0aa9-11ee-be56-0242ac120002",
128+
"officeLocation": "Nairobi",
129+
"sensitivity": "normal"
130+
}`
131+
sourceArray := []byte(source)
132+
parseNode, err := NewJsonParseNode(sourceArray)
133+
if err != nil {
134+
t.Errorf("Error creating parse node: %s", err.Error())
135+
}
136+
parsable, err := parseNode.GetObjectValue(internal.CreateTestEntityFromDiscriminator)
137+
testEntity := parsable.(*internal.TestEntity)
138+
require.NoError(t, err)
139+
assert.Equal(t, "Nairobi", *testEntity.GetOfficeLocation())
140+
assert.Equal(t, internal.NORMAL_SENSITIVITY, *testEntity.GetSensitivity())
141+
}
142+
143+
func TestInvalidEnumValueReturnsNil(t *testing.T) {
144+
source := `{
145+
"id": "acbb4e46-0aa9-11ee-be56-0242ac120002",
146+
"officeLocation": "Nairobi",
147+
"sensitivity": "invalid"
148+
}`
149+
sourceArray := []byte(source)
150+
parseNode, err := NewJsonParseNode(sourceArray)
151+
if err != nil {
152+
t.Errorf("Error creating parse node: %s", err.Error())
153+
}
154+
parsable, err := parseNode.GetObjectValue(internal.CreateTestEntityFromDiscriminator)
155+
testEntity := parsable.(*internal.TestEntity)
156+
require.NoError(t, err)
157+
assert.Equal(t, "Nairobi", *testEntity.GetOfficeLocation())
158+
assert.Nil(t, testEntity.GetSensitivity())
159+
}
160+
125161
func TestNilValuesInCollections(t *testing.T) {
126162
source := `{
127163
"id": "2",
@@ -131,12 +167,14 @@ func TestNilValuesInCollections(t *testing.T) {
131167
"testEntities": [
132168
{
133169
"id": "acbb4e46-0aa9-11ee-be56-0242ac120002",
134-
"officeLocation": "Nairobi"
170+
"officeLocation": "Nairobi",
171+
"sensitivity": "personal"
135172
},
136173
null,
137174
{
138175
"id": "acbb4e46-0aa9-11ee-be56-0242ac120002",
139-
"officeLocation": "Nairobi"
176+
"officeLocation": "Nairobi",
177+
"sensitivity": "confidential"
140178
}
141179
]
142180
}`

json_serialization_writer_test.go

+19
Original file line numberDiff line numberDiff line change
@@ -535,6 +535,25 @@ func TestJsonSerializationWriter_WriteNullValue(t *testing.T) {
535535
assert.Equal(t, "\"name\":null", converted)
536536
}
537537

538+
func TestJsonSerializationWriter_WriteEnumValue(t *testing.T) {
539+
serializer := NewJsonSerializationWriter()
540+
541+
values := []internal.TestSensitivity{internal.NORMAL_SENSITIVITY, internal.PERSONAL_SENSITIVITY, internal.PRIVATE_SENSITIVITY, internal.CONFIDENTIAL_SENSITIVITY}
542+
valuesString := internal.SerializeTestSensitivity(values)
543+
assert.Equal(t, []string{"normal", "personal", "private", "confidential"}, valuesString) // validates the string representation of the enum values
544+
545+
test := internal.NewTestEntity()
546+
sensitivity := internal.NORMAL_SENSITIVITY
547+
test.SetSensitivity(&sensitivity)
548+
err := serializer.WriteObjectValue("name", test)
549+
assert.NoError(t, err)
550+
result, err := serializer.GetSerializedContent()
551+
assert.NoError(t, err)
552+
converted := string(result)
553+
554+
assert.Contains(t, converted, "\"sensitivity\":\"normal\"")
555+
}
556+
538557
func TestJsonSerializationWriter(t *testing.T) {
539558
serializer := NewJsonSerializationWriter()
540559
countBefore := 0

0 commit comments

Comments
 (0)