glom_test.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. package glom
  2. import (
  3. "fmt"
  4. "strings"
  5. "testing"
  6. )
  7. func TestGlomArray(t *testing.T) {
  8. var data []interface{}
  9. data = append(data, "Goose")
  10. test1 := make(map[string]interface{})
  11. test1a := make(map[string]interface{})
  12. test1a["name"] = "Ducky"
  13. test1a["age"] = 62
  14. test1a["race"] = "Duck"
  15. test1b := make(map[string]interface{})
  16. test1b["name"] = "Sir Meow"
  17. test1b["age"] = 12
  18. test1b["race"] = "Cat"
  19. var animals []interface{}
  20. animals = append(animals, test1a)
  21. animals = append(animals, test1b)
  22. test1["animals"] = animals
  23. data = append(data, test1)
  24. /*
  25. HJSON Representation of data
  26. data = [
  27. "Goose"
  28. {
  29. "animals": [
  30. {"name": "Ducky", "age": 62, "race": "Duck"}
  31. {"name": "Sir Meow", "age": 12, "race": "Cat"}
  32. ]
  33. }
  34. ]
  35. */
  36. test, err := Glom(data, "1.animals.1.name")
  37. if err != nil {
  38. t.Errorf("Unexpected Error: \"%v\"", err)
  39. } else if test != "Sir Meow" {
  40. t.Errorf("Failed getting 'Sir Meow' got \"%v\"", test)
  41. }
  42. }
  43. func TestGetPossible(t *testing.T) {
  44. var data []string
  45. data = append(data, "One")
  46. data = append(data, "Two")
  47. data = append(data, "Three")
  48. data = append(data, "Four")
  49. result := getPossible(data)
  50. if len(result) != len(data) {
  51. t.Errorf("Expected even size, %d != %d", len(result), len(data))
  52. }
  53. }
  54. func TestStruct(t *testing.T) {
  55. type Animal struct {
  56. Name string
  57. Lifespan int
  58. }
  59. cat := Animal{"Cat", 12}
  60. dog := Animal{"Dog", 13}
  61. var data []Animal
  62. data = append(data, cat)
  63. data = append(data, dog)
  64. test, err := Glom(data, "1.*")
  65. if err != nil {
  66. t.Errorf("TestStruct 1/3: Unexpected Error: \"%v\"", err)
  67. } else {
  68. if fmt.Sprintf("%v", test) != fmt.Sprintf("%v", dog) {
  69. t.Errorf("TestStruct 1/3: Failed getting '%v' got '%v'", dog, test)
  70. }
  71. }
  72. test2, err2 := Glom(cat, "Lifespan")
  73. if err2 != nil {
  74. t.Errorf("TestStruct 2/3: Unexpected Error: \"%v\"", err2)
  75. } else {
  76. if test2 != cat.Lifespan {
  77. t.Errorf("TestStruct 2/3: Failed getting '%v' got '%v'", cat.Lifespan, test2)
  78. }
  79. }
  80. data2 := make(map[string]Animal)
  81. data2["Squirrel"] = Animal{"Squirrel", 999}
  82. data2["Hamster"] = Animal{"Hamster", 4}
  83. test3, err3 := Glom(data2, "Squirrel.Name")
  84. if err3 != nil {
  85. t.Errorf("TestStruct 3/3: Unexpected Error: \"%v\"", err3)
  86. } else {
  87. if test3 != "Squirrel" {
  88. t.Errorf("TestStruct 3/3: Failed getting 'Squirrel' got '%v'", test3)
  89. }
  90. }
  91. }
  92. func TestListPossible(t *testing.T) {
  93. var list []string
  94. list = append(list, "One")
  95. list = append(list, "Two")
  96. list = append(list, "Three")
  97. result := list_possible(list)
  98. if strings.Join(result, ", ") != "'One', 'Two', 'Three'" {
  99. t.Errorf("Failed getting \"%s\" got \"%v\"", "'One', 'Two', 'Three'", strings.Join(result, ", "))
  100. }
  101. }
  102. func TestFail(t *testing.T) {
  103. data := make(map[string]interface{})
  104. data["Duck"] = "Quack"
  105. data["Cheese"] = 3
  106. data["Mouse"] = true
  107. test, err := Glom(data, "Moose")
  108. if err == nil {
  109. t.Errorf("Expected Error, got '%v'", test)
  110. }
  111. }
  112. func TestMapToInter(t *testing.T) {
  113. m := make(map[string]string)
  114. m["Duck"] = "Quack"
  115. m["Cheese"] = "Yes Please!"
  116. m["Mouse"] = "true"
  117. var s []string
  118. s = append(s, "Duck")
  119. s = append(s, "Cheese")
  120. s = append(s, "Mouse")
  121. var m2 map[string]int
  122. _, err1 := mapToInterface(m)
  123. if err1 != nil {
  124. t.Errorf("Unexpected Error given map: %v", err1)
  125. }
  126. test2, err2 := mapToInterface(s)
  127. if err2 == nil {
  128. t.Errorf("Expected Error given slice, got '%v'", test2)
  129. }
  130. test3, err3 := mapToInterface(m2)
  131. if err3 == nil {
  132. t.Errorf("Expected Error given invalid/empty map, got '%v'", test3)
  133. }
  134. }
  135. func TestSliceToInter(t *testing.T) {
  136. m := make(map[string]string)
  137. m["Duck"] = "Quack"
  138. m["Cheese"] = "Yes Please!"
  139. m["Mouse"] = "true"
  140. var s []string
  141. s = append(s, "Duck")
  142. s = append(s, "Cheese")
  143. s = append(s, "Mouse")
  144. var m2 map[string]int
  145. var s2 []int
  146. test1, err1 := sliceToInterface(m)
  147. if err1 == nil {
  148. t.Errorf("Expected Error given map, got '%v'", test1)
  149. }
  150. _, err2 := sliceToInterface(s)
  151. if err2 != nil {
  152. t.Errorf("Unexpected Error given slice: %v", err2)
  153. }
  154. test3, err3 := sliceToInterface(m2)
  155. if err3 == nil {
  156. t.Errorf("Expected Error given invalid/empty map, got '%v'", test3)
  157. }
  158. test4, err4 := sliceToInterface(s2)
  159. if err4 == nil {
  160. t.Errorf("Expected Error given invalid/empty slice, got '%v'", test4)
  161. }
  162. }
  163. func TestEdgeCasesMapNextLvl(t *testing.T) {
  164. // This doesn't work, I thought it would but it does not
  165. var m map[string]int
  166. m2 := make(map[string]int)
  167. m2["Cheese"] = 6
  168. m2["C"] = 1
  169. m2["h"] = 1
  170. m2["e"] = 3
  171. m2["s"] = 1
  172. test1, err1 := next_level(m, "failwhale")
  173. if err1 == nil {
  174. t.Errorf("Expected Error given invalid/empty map, got '%v'", test1)
  175. }
  176. test2, err2 := next_level(m2, "n")
  177. if err2 == nil {
  178. t.Errorf("Expected Error given map but invalid key, got '%v'", test2)
  179. }
  180. }
  181. func TestEdgeCasesGlom(t *testing.T) {
  182. // This is just a generic test, nothing fancy
  183. data := make(map[string]interface{})
  184. lvl2 := make(map[string]interface{})
  185. lvl2["Duck"] = "Quack"
  186. lvl2["Cheese"] = 6
  187. lvl2["Mouse"] = true
  188. data["part1"] = lvl2
  189. var lvl1 []interface{}
  190. lvl1 = append(lvl1, "Pig")
  191. lvl1 = append(lvl1, "Chicken")
  192. lvl1 = append(lvl1, "Cow")
  193. lvl1 = append(lvl1, "Dog")
  194. lvl1 = append(lvl1, "Cat")
  195. lvl1 = append(lvl1, "Horse")
  196. lvl1 = append(lvl1, true)
  197. lvl1 = append(lvl1, 42)
  198. data["part2"] = lvl1
  199. _, err1 := Glom(data, "part1.Mouse")
  200. if err1 != nil {
  201. t.Errorf("Unexpected Error (part1.Mouse = true): %v", err1)
  202. }
  203. _, err2 := Glom(data, "part2.3")
  204. if err2 != nil {
  205. t.Errorf("Unexpected Error (part2.3 = 'Dog'): %v", err2)
  206. }
  207. }