@@ -77,6 +77,26 @@ func TestUnmarshalWithoutTagNameWithCanonicalKey(t *testing.T) {
77
77
}
78
78
}
79
79
80
+ func TestUnmarshalWithoutTagNameWithCanonicalKeyOptionalDep (t * testing.T ) {
81
+ type inner struct {
82
+ FirstName string `key:",optional"`
83
+ LastName string `key:",optional=FirstName"`
84
+ }
85
+ m := map [string ]interface {}{
86
+ "firstname" : "go" ,
87
+ "lastname" : "zero" ,
88
+ }
89
+
90
+ var in inner
91
+ unmarshaler := NewUnmarshaler (defaultKeyName , WithCanonicalKeyFunc (func (s string ) string {
92
+ return strings .ToLower (s )
93
+ }))
94
+ if assert .NoError (t , unmarshaler .Unmarshal (m , & in )) {
95
+ assert .Equal (t , "go" , in .FirstName )
96
+ assert .Equal (t , "zero" , in .LastName )
97
+ }
98
+ }
99
+
80
100
func TestUnmarshalBool (t * testing.T ) {
81
101
type inner struct {
82
102
True bool `key:"yes"`
@@ -1099,6 +1119,66 @@ func TestUnmarshalStructOptionalDependsNotEnoughValue(t *testing.T) {
1099
1119
assert .Error (t , UnmarshalKey (m , & in ))
1100
1120
}
1101
1121
1122
+ func TestUnmarshalStructOptionalDependsMoreValues (t * testing.T ) {
1123
+ type address struct {
1124
+ Optional string `key:",optional"`
1125
+ OptionalDepends string `key:",optional=a=b"`
1126
+ }
1127
+ type inner struct {
1128
+ Name string `key:"name"`
1129
+ Address address `key:"address"`
1130
+ }
1131
+
1132
+ m := map [string ]interface {}{
1133
+ "name" : "kevin" ,
1134
+ "address" : map [string ]interface {}{},
1135
+ }
1136
+
1137
+ var in inner
1138
+ assert .Error (t , UnmarshalKey (m , & in ))
1139
+ }
1140
+
1141
+ func TestUnmarshalStructMissing (t * testing.T ) {
1142
+ type address struct {
1143
+ Optional string `key:",optional"`
1144
+ OptionalDepends string `key:",optional=a=b"`
1145
+ }
1146
+ type inner struct {
1147
+ Name string `key:"name"`
1148
+ Address address `key:"address"`
1149
+ }
1150
+
1151
+ m := map [string ]interface {}{
1152
+ "name" : "kevin" ,
1153
+ }
1154
+
1155
+ var in inner
1156
+ assert .Error (t , UnmarshalKey (m , & in ))
1157
+ }
1158
+
1159
+ func TestUnmarshalNestedStructMissing (t * testing.T ) {
1160
+ type mostInner struct {
1161
+ Name string `key:"name"`
1162
+ }
1163
+ type address struct {
1164
+ Optional string `key:",optional"`
1165
+ OptionalDepends string `key:",optional=a=b"`
1166
+ MostInner mostInner
1167
+ }
1168
+ type inner struct {
1169
+ Name string `key:"name"`
1170
+ Address address `key:"address"`
1171
+ }
1172
+
1173
+ m := map [string ]interface {}{
1174
+ "name" : "kevin" ,
1175
+ "address" : map [string ]interface {}{},
1176
+ }
1177
+
1178
+ var in inner
1179
+ assert .Error (t , UnmarshalKey (m , & in ))
1180
+ }
1181
+
1102
1182
func TestUnmarshalAnonymousStructOptionalDepends (t * testing.T ) {
1103
1183
type AnonAddress struct {
1104
1184
City string `key:"city"`
@@ -1422,6 +1502,18 @@ func TestUnmarshalOptionsOptionalWrongValue(t *testing.T) {
1422
1502
assert .Error (t , UnmarshalKey (m , & in ))
1423
1503
}
1424
1504
1505
+ func TestUnmarshalOptionsMissingValues (t * testing.T ) {
1506
+ type inner struct {
1507
+ Value string `key:"value,options"`
1508
+ }
1509
+ m := map [string ]interface {}{
1510
+ "value" : "first" ,
1511
+ }
1512
+
1513
+ var in inner
1514
+ assert .Error (t , UnmarshalKey (m , & in ))
1515
+ }
1516
+
1425
1517
func TestUnmarshalStringOptionsWithStringOptionsNotString (t * testing.T ) {
1426
1518
type inner struct {
1427
1519
Value string `key:"value,options=first|second"`
0 commit comments