|
|
@@ -1,7 +1,6 @@
|
|
|
package goyaml_test
|
|
|
|
|
|
import (
|
|
|
- "io/ioutil"
|
|
|
. "launchpad.net/gocheck"
|
|
|
"launchpad.net/goyaml"
|
|
|
"math"
|
|
|
@@ -14,140 +13,307 @@ var unmarshalTests = []struct {
|
|
|
data string
|
|
|
value interface{}
|
|
|
}{
|
|
|
- {"", &struct{}{}},
|
|
|
- {"{}", &struct{}{}},
|
|
|
-
|
|
|
- {"v: hi", map[string]string{"v": "hi"}},
|
|
|
- {"v: hi", map[string]interface{}{"v": "hi"}},
|
|
|
- {"v: true", map[string]string{"v": "true"}},
|
|
|
- {"v: true", map[string]interface{}{"v": true}},
|
|
|
- {"v: 10", map[string]interface{}{"v": 10}},
|
|
|
- {"v: 0b10", map[string]interface{}{"v": 2}},
|
|
|
- {"v: 0xA", map[string]interface{}{"v": 10}},
|
|
|
- {"v: 4294967296", map[string]int64{"v": 4294967296}},
|
|
|
- {"v: 0.1", map[string]interface{}{"v": 0.1}},
|
|
|
- {"v: .1", map[string]interface{}{"v": 0.1}},
|
|
|
- {"v: .Inf", map[string]interface{}{"v": math.Inf(+1)}},
|
|
|
- {"v: -.Inf", map[string]interface{}{"v": math.Inf(-1)}},
|
|
|
- {"v: -10", map[string]interface{}{"v": -10}},
|
|
|
- {"v: -.1", map[string]interface{}{"v": -0.1}},
|
|
|
+ {
|
|
|
+ "",
|
|
|
+ &struct{}{},
|
|
|
+ }, {
|
|
|
+ "{}", &struct{}{},
|
|
|
+ }, {
|
|
|
+ "v: hi",
|
|
|
+ map[string]string{"v": "hi"},
|
|
|
+ }, {
|
|
|
+ "v: hi", map[string]interface{}{"v": "hi"},
|
|
|
+ }, {
|
|
|
+ "v: true",
|
|
|
+ map[string]string{"v": "true"},
|
|
|
+ }, {
|
|
|
+ "v: true",
|
|
|
+ map[string]interface{}{"v": true},
|
|
|
+ }, {
|
|
|
+ "v: 10",
|
|
|
+ map[string]interface{}{"v": 10},
|
|
|
+ }, {
|
|
|
+ "v: 0b10",
|
|
|
+ map[string]interface{}{"v": 2},
|
|
|
+ }, {
|
|
|
+ "v: 0xA",
|
|
|
+ map[string]interface{}{"v": 10},
|
|
|
+ }, {
|
|
|
+ "v: 4294967296",
|
|
|
+ map[string]int64{"v": 4294967296},
|
|
|
+ }, {
|
|
|
+ "v: 0.1",
|
|
|
+ map[string]interface{}{"v": 0.1},
|
|
|
+ }, {
|
|
|
+ "v: .1",
|
|
|
+ map[string]interface{}{"v": 0.1},
|
|
|
+ }, {
|
|
|
+ "v: .Inf",
|
|
|
+ map[string]interface{}{"v": math.Inf(+1)},
|
|
|
+ }, {
|
|
|
+ "v: -.Inf",
|
|
|
+ map[string]interface{}{"v": math.Inf(-1)},
|
|
|
+ }, {
|
|
|
+ "v: -10",
|
|
|
+ map[string]interface{}{"v": -10},
|
|
|
+ }, {
|
|
|
+ "v: -.1",
|
|
|
+ map[string]interface{}{"v": -0.1},
|
|
|
+ },
|
|
|
|
|
|
// Simple values.
|
|
|
- {"123", &unmarshalIntTest},
|
|
|
+ {
|
|
|
+ "123",
|
|
|
+ &unmarshalIntTest,
|
|
|
+ },
|
|
|
|
|
|
// Floats from spec
|
|
|
- {"canonical: 6.8523e+5", map[string]interface{}{"canonical": 6.8523e+5}},
|
|
|
- {"expo: 685.230_15e+03", map[string]interface{}{"expo": 685.23015e+03}},
|
|
|
- {"fixed: 685_230.15", map[string]interface{}{"fixed": 685230.15}},
|
|
|
+ {
|
|
|
+ "canonical: 6.8523e+5",
|
|
|
+ map[string]interface{}{"canonical": 6.8523e+5},
|
|
|
+ }, {
|
|
|
+ "expo: 685.230_15e+03",
|
|
|
+ map[string]interface{}{"expo": 685.23015e+03},
|
|
|
+ }, {
|
|
|
+ "fixed: 685_230.15",
|
|
|
+ map[string]interface{}{"fixed": 685230.15},
|
|
|
+ }, {
|
|
|
+ "neginf: -.inf",
|
|
|
+ map[string]interface{}{"neginf": math.Inf(-1)},
|
|
|
+ }, {
|
|
|
+ "fixed: 685_230.15",
|
|
|
+ map[string]float64{"fixed": 685230.15},
|
|
|
+ },
|
|
|
//{"sexa: 190:20:30.15", map[string]interface{}{"sexa": 0}}, // Unsupported
|
|
|
- {"neginf: -.inf", map[string]interface{}{"neginf": math.Inf(-1)}},
|
|
|
//{"notanum: .NaN", map[string]interface{}{"notanum": math.NaN()}}, // Equality of NaN fails.
|
|
|
- {"fixed: 685_230.15", map[string]float64{"fixed": 685230.15}},
|
|
|
|
|
|
// Bools from spec
|
|
|
- {"canonical: y", map[string]interface{}{"canonical": true}},
|
|
|
- {"answer: NO", map[string]interface{}{"answer": false}},
|
|
|
- {"logical: True", map[string]interface{}{"logical": true}},
|
|
|
- {"option: on", map[string]interface{}{"option": true}},
|
|
|
- {"option: on", map[string]bool{"option": true}},
|
|
|
-
|
|
|
+ {
|
|
|
+ "canonical: y",
|
|
|
+ map[string]interface{}{"canonical": true},
|
|
|
+ }, {
|
|
|
+ "answer: NO",
|
|
|
+ map[string]interface{}{"answer": false},
|
|
|
+ }, {
|
|
|
+ "logical: True",
|
|
|
+ map[string]interface{}{"logical": true},
|
|
|
+ }, {
|
|
|
+ "option: on",
|
|
|
+ map[string]interface{}{"option": true},
|
|
|
+ }, {
|
|
|
+ "option: on",
|
|
|
+ map[string]bool{"option": true},
|
|
|
+ },
|
|
|
// Ints from spec
|
|
|
- {"canonical: 685230", map[string]interface{}{"canonical": 685230}},
|
|
|
- {"decimal: +685_230", map[string]interface{}{"decimal": 685230}},
|
|
|
- {"octal: 02472256", map[string]interface{}{"octal": 685230}},
|
|
|
- {"hexa: 0x_0A_74_AE", map[string]interface{}{"hexa": 685230}},
|
|
|
- {"bin: 0b1010_0111_0100_1010_1110", map[string]interface{}{"bin": 685230}},
|
|
|
- {"bin: -0b101010", map[string]interface{}{"bin": -42}},
|
|
|
+ {
|
|
|
+ "canonical: 685230",
|
|
|
+ map[string]interface{}{"canonical": 685230},
|
|
|
+ }, {
|
|
|
+ "decimal: +685_230",
|
|
|
+ map[string]interface{}{"decimal": 685230},
|
|
|
+ }, {
|
|
|
+ "octal: 02472256",
|
|
|
+ map[string]interface{}{"octal": 685230},
|
|
|
+ }, {
|
|
|
+ "hexa: 0x_0A_74_AE",
|
|
|
+ map[string]interface{}{"hexa": 685230},
|
|
|
+ }, {
|
|
|
+ "bin: 0b1010_0111_0100_1010_1110",
|
|
|
+ map[string]interface{}{"bin": 685230},
|
|
|
+ }, {
|
|
|
+ "bin: -0b101010",
|
|
|
+ map[string]interface{}{"bin": -42},
|
|
|
+ }, {
|
|
|
+ "decimal: +685_230",
|
|
|
+ map[string]int{"decimal": 685230},
|
|
|
+ },
|
|
|
+
|
|
|
//{"sexa: 190:20:30", map[string]interface{}{"sexa": 0}}, // Unsupported
|
|
|
- {"decimal: +685_230", map[string]int{"decimal": 685230}},
|
|
|
|
|
|
// Nulls from spec
|
|
|
- {"empty:", map[string]interface{}{"empty": nil}},
|
|
|
- {"canonical: ~", map[string]interface{}{"canonical": nil}},
|
|
|
- {"english: null", map[string]interface{}{"english": nil}},
|
|
|
- {"~: null key", map[interface{}]string{nil: "null key"}},
|
|
|
- {"empty:", map[string]*bool{"empty": nil}},
|
|
|
+ {
|
|
|
+ "empty:",
|
|
|
+ map[string]interface{}{"empty": nil},
|
|
|
+ }, {
|
|
|
+ "canonical: ~",
|
|
|
+ map[string]interface{}{"canonical": nil},
|
|
|
+ }, {
|
|
|
+ "english: null",
|
|
|
+ map[string]interface{}{"english": nil},
|
|
|
+ }, {
|
|
|
+ "~: null key",
|
|
|
+ map[interface{}]string{nil: "null key"},
|
|
|
+ }, {
|
|
|
+ "empty:",
|
|
|
+ map[string]*bool{"empty": nil},
|
|
|
+ },
|
|
|
|
|
|
// Flow sequence
|
|
|
- {"seq: [A,B]", map[string]interface{}{"seq": []interface{}{"A", "B"}}},
|
|
|
- {"seq: [A,B,C,]", map[string][]string{"seq": []string{"A", "B", "C"}}},
|
|
|
- {"seq: [A,1,C]", map[string][]string{"seq": []string{"A", "1", "C"}}},
|
|
|
- {"seq: [A,1,C]", map[string][]int{"seq": []int{1}}},
|
|
|
- {"seq: [A,1,C]", map[string]interface{}{"seq": []interface{}{"A", 1, "C"}}},
|
|
|
-
|
|
|
+ {
|
|
|
+ "seq: [A,B]",
|
|
|
+ map[string]interface{}{"seq": []interface{}{"A", "B"}},
|
|
|
+ }, {
|
|
|
+ "seq: [A,B,C,]",
|
|
|
+ map[string][]string{"seq": []string{"A", "B", "C"}},
|
|
|
+ }, {
|
|
|
+ "seq: [A,1,C]",
|
|
|
+ map[string][]string{"seq": []string{"A", "1", "C"}},
|
|
|
+ }, {
|
|
|
+ "seq: [A,1,C]",
|
|
|
+ map[string][]int{"seq": []int{1}},
|
|
|
+ }, {
|
|
|
+ "seq: [A,1,C]",
|
|
|
+ map[string]interface{}{"seq": []interface{}{"A", 1, "C"}},
|
|
|
+ },
|
|
|
// Block sequence
|
|
|
- {"seq:\n - A\n - B", map[string]interface{}{"seq": []interface{}{"A", "B"}}},
|
|
|
- {"seq:\n - A\n - B\n - C", map[string][]string{"seq": []string{"A", "B", "C"}}},
|
|
|
- {"seq:\n - A\n - 1\n - C", map[string][]string{"seq": []string{"A", "1", "C"}}},
|
|
|
- {"seq:\n - A\n - 1\n - C", map[string][]int{"seq": []int{1}}},
|
|
|
- {"seq:\n - A\n - 1\n - C", map[string]interface{}{"seq": []interface{}{"A", 1, "C"}}},
|
|
|
+ {
|
|
|
+ "seq:\n - A\n - B",
|
|
|
+ map[string]interface{}{"seq": []interface{}{"A", "B"}},
|
|
|
+ }, {
|
|
|
+ "seq:\n - A\n - B\n - C",
|
|
|
+ map[string][]string{"seq": []string{"A", "B", "C"}},
|
|
|
+ }, {
|
|
|
+ "seq:\n - A\n - 1\n - C",
|
|
|
+ map[string][]string{"seq": []string{"A", "1", "C"}},
|
|
|
+ }, {
|
|
|
+ "seq:\n - A\n - 1\n - C",
|
|
|
+ map[string][]int{"seq": []int{1}},
|
|
|
+ }, {
|
|
|
+ "seq:\n - A\n - 1\n - C",
|
|
|
+ map[string]interface{}{"seq": []interface{}{"A", 1, "C"}},
|
|
|
+ },
|
|
|
|
|
|
// Literal block scalar
|
|
|
- {"scalar: | # Comment\n\n literal\n\n \ttext\n\n",
|
|
|
- map[string]string{"scalar": "\nliteral\n\n\ttext\n"}},
|
|
|
+ {
|
|
|
+ "scalar: | # Comment\n\n literal\n\n \ttext\n\n",
|
|
|
+ map[string]string{"scalar": "\nliteral\n\n\ttext\n"},
|
|
|
+ },
|
|
|
|
|
|
// Folded block scalar
|
|
|
- {"scalar: > # Comment\n\n folded\n line\n \n next\n line\n * one\n * two\n\n last\n line\n\n",
|
|
|
- map[string]string{"scalar": "\nfolded line\nnext line\n * one\n * two\n\nlast line\n"}},
|
|
|
+ {
|
|
|
+ "scalar: > # Comment\n\n folded\n line\n \n next\n line\n * one\n * two\n\n last\n line\n\n",
|
|
|
+ map[string]string{"scalar": "\nfolded line\nnext line\n * one\n * two\n\nlast line\n"},
|
|
|
+ },
|
|
|
|
|
|
// Map inside interface with no type hints.
|
|
|
- {"a: {b: c}",
|
|
|
- map[string]interface{}{"a": map[interface{}]interface{}{"b": "c"}}},
|
|
|
+ {
|
|
|
+ "a: {b: c}",
|
|
|
+ map[string]interface{}{"a": map[interface{}]interface{}{"b": "c"}},
|
|
|
+ },
|
|
|
|
|
|
// Structs and type conversions.
|
|
|
- {"hello: world", &struct{ Hello string }{"world"}},
|
|
|
- {"a: {b: c}", &struct{ A struct{ B string } }{struct{ B string }{"c"}}},
|
|
|
- {"a: {b: c}", &struct{ A *struct{ B string } }{&struct{ B string }{"c"}}},
|
|
|
- {"a: {b: c}", &struct{ A map[string]string }{map[string]string{"b": "c"}}},
|
|
|
- {"a: {b: c}", &struct{ A *map[string]string }{&map[string]string{"b": "c"}}},
|
|
|
- {"a:", &struct{ A map[string]string }{}},
|
|
|
- {"a: 1", &struct{ A int }{1}},
|
|
|
- {"a: [1, 2]", &struct{ A []int }{[]int{1, 2}}},
|
|
|
- {"a: 1", &struct{ B int }{0}},
|
|
|
- {"a: 1", &struct {
|
|
|
- B int "a"
|
|
|
- }{1}},
|
|
|
- {"a: y", &struct{ A bool }{true}},
|
|
|
+ {
|
|
|
+ "hello: world",
|
|
|
+ &struct{ Hello string }{"world"},
|
|
|
+ }, {
|
|
|
+ "a: {b: c}",
|
|
|
+ &struct{ A struct{ B string } }{struct{ B string }{"c"}},
|
|
|
+ }, {
|
|
|
+ "a: {b: c}",
|
|
|
+ &struct{ A *struct{ B string } }{&struct{ B string }{"c"}},
|
|
|
+ }, {
|
|
|
+ "a: {b: c}",
|
|
|
+ &struct{ A map[string]string }{map[string]string{"b": "c"}},
|
|
|
+ }, {
|
|
|
+ "a: {b: c}",
|
|
|
+ &struct{ A *map[string]string }{&map[string]string{"b": "c"}},
|
|
|
+ }, {
|
|
|
+ "a:",
|
|
|
+ &struct{ A map[string]string }{},
|
|
|
+ }, {
|
|
|
+ "a: 1",
|
|
|
+ &struct{ A int }{1},
|
|
|
+ }, {
|
|
|
+ "a: [1, 2]",
|
|
|
+ &struct{ A []int }{[]int{1, 2}},
|
|
|
+ }, {
|
|
|
+ "a: 1",
|
|
|
+ &struct{ B int }{0},
|
|
|
+ }, {
|
|
|
+ "a: 1",
|
|
|
+ &struct {
|
|
|
+ B int "a"
|
|
|
+ }{1},
|
|
|
+ }, {
|
|
|
+ "a: y",
|
|
|
+ &struct{ A bool }{true},
|
|
|
+ },
|
|
|
|
|
|
// Some cross type conversions
|
|
|
- {"v: 42", map[string]uint{"v": 42}},
|
|
|
- {"v: -42", map[string]uint{}},
|
|
|
- {"v: 4294967296", map[string]uint64{"v": 4294967296}},
|
|
|
- {"v: -4294967296", map[string]uint64{}},
|
|
|
+ {
|
|
|
+ "v: 42",
|
|
|
+ map[string]uint{"v": 42},
|
|
|
+ }, {
|
|
|
+ "v: -42",
|
|
|
+ map[string]uint{},
|
|
|
+ }, {
|
|
|
+ "v: 4294967296",
|
|
|
+ map[string]uint64{"v": 4294967296},
|
|
|
+ }, {
|
|
|
+ "v: -4294967296",
|
|
|
+ map[string]uint64{},
|
|
|
+ },
|
|
|
|
|
|
// Overflow cases.
|
|
|
- {"v: 4294967297", map[string]int32{}},
|
|
|
- {"v: 128", map[string]int8{}},
|
|
|
+ {
|
|
|
+ "v: 4294967297",
|
|
|
+ map[string]int32{},
|
|
|
+ }, {
|
|
|
+ "v: 128",
|
|
|
+ map[string]int8{},
|
|
|
+ },
|
|
|
|
|
|
// Quoted values.
|
|
|
- {"'1': '\"2\"'", map[interface{}]interface{}{"1": "\"2\""}},
|
|
|
+ {
|
|
|
+ "'1': '\"2\"'",
|
|
|
+ map[interface{}]interface{}{"1": "\"2\""},
|
|
|
+ },
|
|
|
|
|
|
// Explicit tags.
|
|
|
- {"v: !!float '1.1'", map[string]interface{}{"v": 1.1}},
|
|
|
- {"v: !!null ''", map[string]interface{}{"v": nil}},
|
|
|
- {"%TAG !y! tag:yaml.org,2002:\n---\nv: !y!int '1'",
|
|
|
- map[string]interface{}{"v": 1}},
|
|
|
+ {
|
|
|
+ "v: !!float '1.1'",
|
|
|
+ map[string]interface{}{"v": 1.1},
|
|
|
+ }, {
|
|
|
+ "v: !!null ''",
|
|
|
+ map[string]interface{}{"v": nil},
|
|
|
+ }, {
|
|
|
+ "%TAG !y! tag:yaml.org,2002:\n---\nv: !y!int '1'",
|
|
|
+ map[string]interface{}{"v": 1},
|
|
|
+ },
|
|
|
|
|
|
// Anchors and aliases.
|
|
|
- {"a: &x 1\nb: &y 2\nc: *x\nd: *y\n", &struct{ A, B, C, D int }{1, 2, 1, 2}},
|
|
|
- {"a: &a {c: 1}\nb: *a",
|
|
|
+ {
|
|
|
+ "a: &x 1\nb: &y 2\nc: *x\nd: *y\n",
|
|
|
+ &struct{ A, B, C, D int }{1, 2, 1, 2},
|
|
|
+ }, {
|
|
|
+ "a: &a {c: 1}\nb: *a",
|
|
|
&struct {
|
|
|
A, B struct {
|
|
|
C int
|
|
|
}
|
|
|
- }{struct{ C int }{1}, struct{ C int }{1}}},
|
|
|
- {"a: &a [1, 2]\nb: *a", &struct{ B []int }{[]int{1, 2}}},
|
|
|
+ }{struct{ C int }{1}, struct{ C int }{1}},
|
|
|
+ }, {
|
|
|
+ "a: &a [1, 2]\nb: *a",
|
|
|
+ &struct{ B []int }{[]int{1, 2}},
|
|
|
+ },
|
|
|
|
|
|
// BUG #1133337
|
|
|
- {"foo: ''", map[string]*string{"foo": new(string)}},
|
|
|
- {"foo: null", map[string]string{}},
|
|
|
+ {
|
|
|
+ "foo: ''",
|
|
|
+ map[string]*string{"foo": new(string)},
|
|
|
+ }, {
|
|
|
+ "foo: null",
|
|
|
+ map[string]string{},
|
|
|
+ },
|
|
|
|
|
|
// Ignored field
|
|
|
- {"a: 1\nb: 2\n",
|
|
|
+ {
|
|
|
+ "a: 1\nb: 2\n",
|
|
|
&struct {
|
|
|
A int
|
|
|
B int "-"
|
|
|
- }{1, 0}},
|
|
|
+ }{1, 0},
|
|
|
+ },
|
|
|
}
|
|
|
|
|
|
func (s *S) TestUnmarshal(c *C) {
|
|
|
@@ -268,7 +434,6 @@ func (s *S) TestUnmarshalWithFalseSetterIgnoresValue(c *C) {
|
|
|
c.Assert(m["ghi"].value, Equals, 3)
|
|
|
}
|
|
|
|
|
|
-
|
|
|
//var data []byte
|
|
|
//func init() {
|
|
|
// var err error
|