Merge pull request #414 from thockin/cleanups

Fix go idiom feedback
pull/6/head
brendandburns 2014-07-11 14:47:05 -07:00
commit 93d45c1e71
2 changed files with 46 additions and 84 deletions

View File

@ -85,14 +85,14 @@ const (
// SetYAML implements the yaml.Setter interface. // SetYAML implements the yaml.Setter interface.
func (intstr *IntOrString) SetYAML(tag string, value interface{}) bool { func (intstr *IntOrString) SetYAML(tag string, value interface{}) bool {
if intVal, ok := value.(int); ok { switch v := value.(type) {
case int:
intstr.Kind = IntstrInt intstr.Kind = IntstrInt
intstr.IntVal = intVal intstr.IntVal = v
return true return true
} case string:
if strVal, ok := value.(string); ok {
intstr.Kind = IntstrString intstr.Kind = IntstrString
intstr.StrVal = strVal intstr.StrVal = v
return true return true
} }
return false return false
@ -129,6 +129,6 @@ func (intstr IntOrString) MarshalJSON() ([]byte, error) {
case IntstrString: case IntstrString:
return json.Marshal(intstr.StrVal) return json.Marshal(intstr.StrVal)
default: default:
panic("impossible IntOrString.Kind") return []byte{}, fmt.Errorf("impossible IntOrString.Kind")
} }
} }

View File

@ -73,121 +73,83 @@ type IntOrStringHolder struct {
} }
func TestIntOrStringUnmarshalYAML(t *testing.T) { func TestIntOrStringUnmarshalYAML(t *testing.T) {
{ cases := []struct {
yamlCodeInt := "val: 123\n" input string
result IntOrString
var result IntOrStringHolder }{
if err := yaml.Unmarshal([]byte(yamlCodeInt), &result); err != nil { {"val: 123\n", IntOrString{Kind: IntstrInt, IntVal: 123}},
t.Errorf("Failed to unmarshal: %v", err) {"val: \"123\"\n", IntOrString{Kind: IntstrString, StrVal: "123"}},
}
if result.IOrS.Kind != IntstrInt || result.IOrS.IntVal != 123 {
t.Errorf("Failed to unmarshal int-typed IntOrString: %v", result)
}
} }
{ for _, c := range cases {
yamlCodeStr := "val: \"123\"\n"
var result IntOrStringHolder var result IntOrStringHolder
if err := yaml.Unmarshal([]byte(yamlCodeStr), &result); err != nil { if err := yaml.Unmarshal([]byte(c.input), &result); err != nil {
t.Errorf("Failed to unmarshal: %v", err) t.Errorf("Failed to unmarshal: %v", err)
} }
if result.IOrS.Kind != IntstrString || result.IOrS.StrVal != "123" { if result.IOrS != c.result {
t.Errorf("Failed to unmarshal string-typed IntOrString: %v", result) t.Errorf("Failed to unmarshal IntOrString: got %+v", result)
} }
} }
} }
func TestIntOrStringMarshalYAML(t *testing.T) { func TestIntOrStringMarshalYAML(t *testing.T) {
{ cases := []struct {
input := IntOrStringHolder{ input IntOrString
IOrS: IntOrString{ result string
Kind: IntstrInt, }{
IntVal: 123, {IntOrString{Kind: IntstrInt, IntVal: 123}, "val: 123\n"},
}, {IntOrString{Kind: IntstrString, StrVal: "123"}, "val: \"123\"\n"},
}
result, err := yaml.Marshal(&input)
if err != nil {
t.Errorf("Failed to marshal: %v", err)
}
if string(result) != "val: 123\n" {
t.Errorf("Failed to marshal int-typed IntOrString: %q", string(result))
}
} }
{ for _, c := range cases {
input := IntOrStringHolder{ input := IntOrStringHolder{c.input}
IOrS: IntOrString{
Kind: IntstrString,
StrVal: "123",
},
}
result, err := yaml.Marshal(&input) result, err := yaml.Marshal(&input)
if err != nil { if err != nil {
t.Errorf("Failed to marshal: %v", err) t.Errorf("Failed to marshal: %v", err)
} }
if string(result) != "val: \"123\"\n" { if string(result) != c.result {
t.Errorf("Failed to marshal string-typed IntOrString: %q", string(result)) t.Errorf("Failed to marshal IntOrString: got %q", string(result))
} }
} }
} }
func TestIntOrStringUnmarshalJSON(t *testing.T) { func TestIntOrStringUnmarshalJSON(t *testing.T) {
{ cases := []struct {
jsonCodeInt := "{\"val\": 123}" input string
result IntOrString
var result IntOrStringHolder }{
if err := json.Unmarshal([]byte(jsonCodeInt), &result); err != nil { {"{\"val\": 123}", IntOrString{Kind: IntstrInt, IntVal: 123}},
t.Errorf("Failed to unmarshal: %v", err) {"{\"val\": \"123\"}", IntOrString{Kind: IntstrString, StrVal: "123"}},
}
if result.IOrS.Kind != IntstrInt || result.IOrS.IntVal != 123 {
t.Errorf("Failed to unmarshal int-typed IntOrString: %v", result)
}
} }
{ for _, c := range cases {
jsonCodeStr := "{\"val\": \"123\"}"
var result IntOrStringHolder var result IntOrStringHolder
if err := json.Unmarshal([]byte(jsonCodeStr), &result); err != nil { if err := json.Unmarshal([]byte(c.input), &result); err != nil {
t.Errorf("Failed to unmarshal: %v", err) t.Errorf("Failed to unmarshal: %v", err)
} }
if result.IOrS.Kind != IntstrString || result.IOrS.StrVal != "123" { if result.IOrS != c.result {
t.Errorf("Failed to unmarshal string-typed IntOrString: %v", result) t.Errorf("Failed to unmarshal IntOrString: got %+v", result)
} }
} }
} }
func TestIntOrStringMarshalJSON(t *testing.T) { func TestIntOrStringMarshalJSON(t *testing.T) {
{ cases := []struct {
input := IntOrStringHolder{ input IntOrString
IOrS: IntOrString{ result string
Kind: IntstrInt, }{
IntVal: 123, {IntOrString{Kind: IntstrInt, IntVal: 123}, "{\"val\":123}"},
}, {IntOrString{Kind: IntstrString, StrVal: "123"}, "{\"val\":\"123\"}"},
}
result, err := json.Marshal(&input)
if err != nil {
t.Errorf("Failed to marshal: %v", err)
}
if string(result) != "{\"val\":123}" {
t.Errorf("Failed to marshal int-typed IntOrString: %q", string(result))
}
} }
{ for _, c := range cases {
input := IntOrStringHolder{ input := IntOrStringHolder{c.input}
IOrS: IntOrString{
Kind: IntstrString,
StrVal: "123",
},
}
result, err := json.Marshal(&input) result, err := json.Marshal(&input)
if err != nil { if err != nil {
t.Errorf("Failed to marshal: %v", err) t.Errorf("Failed to marshal: %v", err)
} }
if string(result) != "{\"val\":\"123\"}" { if string(result) != c.result {
t.Errorf("Failed to marshal string-typed IntOrString: %q", string(result)) t.Errorf("Failed to marshal IntOrString: got %q", string(result))
} }
} }
} }