encode_test.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. package goyaml_test
  2. import (
  3. . "launchpad.net/gocheck"
  4. "launchpad.net/goyaml"
  5. "math"
  6. //"reflect"
  7. )
  8. var marshalIntTest = 123
  9. var marshalTests = []struct {
  10. data string
  11. value interface{}
  12. }{
  13. {"{}\n", &struct{}{}},
  14. {"v: hi\n", map[string]string{"v": "hi"}},
  15. {"v: hi\n", map[string]interface{}{"v": "hi"}},
  16. {"v: \"true\"\n", map[string]string{"v": "true"}},
  17. {"v: \"false\"\n", map[string]string{"v": "false"}},
  18. {"v: true\n", map[string]interface{}{"v": true}},
  19. {"v: false\n", map[string]interface{}{"v": false}},
  20. {"v: 10\n", map[string]interface{}{"v": 10}},
  21. {"v: -10\n", map[string]interface{}{"v": -10}},
  22. {"v: 42\n", map[string]uint{"v": 42}},
  23. {"v: 4294967296\n", map[string]interface{}{"v": int64(4294967296)}},
  24. {"v: 4294967296\n", map[string]int64{"v": int64(4294967296)}},
  25. {"v: 4294967296\n", map[string]uint64{"v": 4294967296}},
  26. {"v: \"10\"\n", map[string]interface{}{"v": "10"}},
  27. {"v: 0.1\n", map[string]interface{}{"v": 0.1}},
  28. {"v: 0.1\n", map[string]interface{}{"v": float64(0.1)}},
  29. {"v: -0.1\n", map[string]interface{}{"v": -0.1}},
  30. {"v: .inf\n", map[string]interface{}{"v": math.Inf(+1)}},
  31. {"v: -.inf\n", map[string]interface{}{"v": math.Inf(-1)}},
  32. {"v: .nan\n", map[string]interface{}{"v": math.NaN()}},
  33. {"v: null\n", map[string]interface{}{"v": nil}},
  34. {"v: \"\"\n", map[string]interface{}{"v": ""}},
  35. {"v:\n- A\n- B\n", map[string][]string{"v": []string{"A", "B"}}},
  36. {"v:\n- A\n- 1\n", map[string][]interface{}{"v": []interface{}{"A", 1}}},
  37. {"a:\n b: c\n",
  38. map[string]interface{}{"a": map[interface{}]interface{}{"b": "c"}}},
  39. // Simple values.
  40. {"123\n", &marshalIntTest},
  41. // Structures
  42. {"hello: world\n", &struct{ Hello string }{"world"}},
  43. {"a:\n b: c\n", &struct {
  44. A struct {
  45. B string
  46. }
  47. }{struct{ B string }{"c"}}},
  48. {"a:\n b: c\n", &struct {
  49. A *struct {
  50. B string
  51. }
  52. }{&struct{ B string }{"c"}}},
  53. {"a: null\n", &struct {
  54. A *struct {
  55. B string
  56. }
  57. }{}},
  58. {"a: 1\n", &struct{ A int }{1}},
  59. {"a:\n- 1\n- 2\n", &struct{ A []int }{[]int{1, 2}}},
  60. {"a: 1\n", &struct {
  61. B int "a"
  62. }{1}},
  63. {"a: true\n", &struct{ A bool }{true}},
  64. // Conditional flag
  65. {"a: 1\n", &struct {
  66. A int "a/c"
  67. B int "b/c"
  68. }{1, 0}},
  69. {"{}\n", &struct {
  70. A int "a/c"
  71. B int "b/c"
  72. }{0, 0}},
  73. // Flow flag
  74. {"a: [1, 2]\n", &struct {
  75. A []int "a/f"
  76. }{[]int{1, 2}}},
  77. {"a: {b: c}\n",
  78. &struct {
  79. A map[string]string "a/f"
  80. }{map[string]string{"b": "c"}}},
  81. {"a: {b: c}\n",
  82. &struct {
  83. A struct {
  84. B string
  85. } "a/f"
  86. }{struct{ B string }{"c"}}},
  87. }
  88. func (s *S) TestMarshal(c *C) {
  89. for _, item := range marshalTests {
  90. data, err := goyaml.Marshal(item.value)
  91. c.Assert(err, IsNil)
  92. c.Assert(string(data), Equals, item.data)
  93. }
  94. }
  95. //var unmarshalErrorTests = []struct{data, error string}{
  96. // {"v: !!float 'error'", "Can't decode !!str 'error' as a !!float"},
  97. //}
  98. //
  99. //func (s *S) TestUnmarshalErrors(c *C) {
  100. // for _, item := range unmarshalErrorTests {
  101. // var value interface{}
  102. // err := goyaml.Unmarshal([]byte(item.data), &value)
  103. // c.Assert(err, Matches, item.error)
  104. // }
  105. //}
  106. var marshalTaggedIfaceTest interface{} = &struct{ A string }{"B"}
  107. var getterTests = []struct {
  108. data, tag string
  109. value interface{}
  110. }{
  111. {"_:\n hi: there\n", "", map[interface{}]interface{}{"hi": "there"}},
  112. {"_:\n- 1\n- A\n", "", []interface{}{1, "A"}},
  113. {"_: 10\n", "", 10},
  114. {"_: null\n", "", nil},
  115. {"_: !foo BAR!\n", "!foo", "BAR!"},
  116. {"_: !foo 1\n", "!foo", "1"},
  117. {"_: !foo '\"1\"'\n", "!foo", "\"1\""},
  118. {"_: !foo 1.1\n", "!foo", 1.1},
  119. {"_: !foo 1\n", "!foo", 1},
  120. {"_: !foo 1\n", "!foo", uint(1)},
  121. {"_: !foo true\n", "!foo", true},
  122. {"_: !foo\n- A\n- B\n", "!foo", []string{"A", "B"}},
  123. {"_: !foo\n A: B\n", "!foo", map[string]string{"A": "B"}},
  124. {"_: !foo\n a: B\n", "!foo", &marshalTaggedIfaceTest},
  125. }
  126. type typeWithGetter struct {
  127. tag string
  128. value interface{}
  129. }
  130. func (o typeWithGetter) GetYAML() (tag string, value interface{}) {
  131. return o.tag, o.value
  132. }
  133. type typeWithGetterField struct {
  134. Field typeWithGetter "_"
  135. }
  136. func (s *S) TestMashalWithGetter(c *C) {
  137. for _, item := range getterTests {
  138. obj := &typeWithGetterField{}
  139. obj.Field.tag = item.tag
  140. obj.Field.value = item.value
  141. data, err := goyaml.Marshal(obj)
  142. c.Assert(err, IsNil)
  143. c.Assert(string(data), Equals, string(item.data))
  144. }
  145. }
  146. func (s *S) TestUnmarshalWholeDocumentWithGetter(c *C) {
  147. obj := &typeWithGetter{}
  148. obj.tag = ""
  149. obj.value = map[string]string{"hello": "world!"}
  150. data, err := goyaml.Marshal(obj)
  151. c.Assert(err, IsNil)
  152. c.Assert(string(data), Equals, "hello: world!\n")
  153. }