env_test.go 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394
  1. package env
  2. import (
  3. "reflect"
  4. "testing"
  5. )
  6. func TestString(t *testing.T) {
  7. t.Parallel()
  8. env := NewEnv()
  9. env.Define("a", "a")
  10. output := env.String()
  11. expected := `No parent
  12. a = "a"
  13. `
  14. if output != expected {
  15. t.Errorf("received: %v - expected: %v", output, expected)
  16. }
  17. env = env.NewEnv()
  18. env.Define("b", "b")
  19. output = env.String()
  20. expected = `Has parent
  21. b = "b"
  22. `
  23. if output != expected {
  24. t.Errorf("received: %v - expected: %v", output, expected)
  25. }
  26. env = NewEnv()
  27. env.Define("c", "c")
  28. env.DefineType("string", "a")
  29. output = env.String()
  30. expected = `No parent
  31. c = "c"
  32. string = string
  33. `
  34. if output != expected {
  35. t.Errorf("received: %v - expected: %v", output, expected)
  36. }
  37. }
  38. func TestGetEnvFromPath(t *testing.T) {
  39. t.Parallel()
  40. env := NewEnv()
  41. a, err := env.NewModule("a")
  42. if err != nil {
  43. t.Fatal("NewModule error:", err)
  44. }
  45. var b *Env
  46. b, err = a.NewModule("b")
  47. if err != nil {
  48. t.Fatal("NewModule error:", err)
  49. }
  50. var c *Env
  51. c, err = b.NewModule("c")
  52. if err != nil {
  53. t.Fatal("NewModule error:", err)
  54. }
  55. err = c.Define("d", "d")
  56. if err != nil {
  57. t.Fatal("Define error:", err)
  58. }
  59. e, err := env.GetEnvFromPath(nil)
  60. if err != nil {
  61. t.Fatal("GetEnvFromPath error:", err)
  62. }
  63. if e == nil {
  64. t.Fatal("GetEnvFromPath e nil")
  65. }
  66. e, err = env.GetEnvFromPath([]string{})
  67. if err != nil {
  68. t.Fatal("GetEnvFromPath error:", err)
  69. }
  70. if e == nil {
  71. t.Fatal("GetEnvFromPath e nil")
  72. }
  73. e, err = env.GetEnvFromPath([]string{"a", "c"})
  74. expected := "no namespace called: c"
  75. if err == nil || err.Error() != expected {
  76. t.Fatalf("GetEnvFromPath error - received: %v - expected: %v", err, expected)
  77. }
  78. if e != nil {
  79. t.Fatal("GetEnvFromPath e not nil")
  80. }
  81. // a.b.c
  82. e, err = env.GetEnvFromPath([]string{"a", "b", "c"})
  83. if err != nil {
  84. t.Fatal("GetEnvFromPath error:", err)
  85. }
  86. if e == nil {
  87. t.Fatal("GetEnvFromPath e nil")
  88. }
  89. var value interface{}
  90. value, err = e.Get("d")
  91. if err != nil {
  92. t.Fatal("Get error:", err)
  93. }
  94. v, ok := value.(string)
  95. if !ok {
  96. t.Fatal("value not string")
  97. }
  98. if v != "d" {
  99. t.Errorf("value - received: %v - expected: %v", v, "d")
  100. }
  101. e, err = a.GetEnvFromPath([]string{"a", "b", "c"})
  102. if err != nil {
  103. t.Fatal("GetEnvFromPath error:", err)
  104. }
  105. if e == nil {
  106. t.Fatal("GetEnvFromPath e nil")
  107. }
  108. value, err = e.Get("d")
  109. if err != nil {
  110. t.Fatal("Get error:", err)
  111. }
  112. v, ok = value.(string)
  113. if !ok {
  114. t.Fatal("value not string")
  115. }
  116. if v != "d" {
  117. t.Errorf("value - received: %v - expected: %v", v, "d")
  118. }
  119. e, err = b.GetEnvFromPath([]string{"a", "b", "c"})
  120. if err != nil {
  121. t.Fatal("GetEnvFromPath error:", err)
  122. }
  123. if e == nil {
  124. t.Fatal("GetEnvFromPath e nil")
  125. }
  126. value, err = e.Get("d")
  127. if err != nil {
  128. t.Fatal("Get error:", err)
  129. }
  130. v, ok = value.(string)
  131. if !ok {
  132. t.Fatal("value not string")
  133. }
  134. if v != "d" {
  135. t.Errorf("value - received: %v - expected: %v", v, "d")
  136. }
  137. e, err = c.GetEnvFromPath([]string{"a", "b", "c"})
  138. if err != nil {
  139. t.Fatal("GetEnvFromPath error:", err)
  140. }
  141. if e == nil {
  142. t.Fatal("GetEnvFromPath e nil")
  143. }
  144. value, err = e.Get("d")
  145. if err != nil {
  146. t.Fatal("Get error:", err)
  147. }
  148. v, ok = value.(string)
  149. if !ok {
  150. t.Fatal("value not string")
  151. }
  152. if v != "d" {
  153. t.Errorf("value - received: %v - expected: %v", v, "d")
  154. }
  155. // b.c
  156. e, err = env.GetEnvFromPath([]string{"b", "c"})
  157. expected = "no namespace called: b"
  158. if err == nil || err.Error() != expected {
  159. t.Fatalf("GetEnvFromPath error - received: %v - expected: %v", err, expected)
  160. }
  161. if e != nil {
  162. t.Fatal("GetEnvFromPath e not nil")
  163. }
  164. e, err = a.GetEnvFromPath([]string{"b", "c"})
  165. if err != nil {
  166. t.Fatal("GetEnvFromPath error:", err)
  167. }
  168. if e == nil {
  169. t.Fatal("GetEnvFromPath e nil")
  170. }
  171. value, err = e.Get("d")
  172. if err != nil {
  173. t.Fatal("Get error:", err)
  174. }
  175. v, ok = value.(string)
  176. if !ok {
  177. t.Fatal("value not string")
  178. }
  179. if v != "d" {
  180. t.Errorf("value - received: %v - expected: %v", v, "d")
  181. }
  182. e, err = b.GetEnvFromPath([]string{"b", "c"})
  183. if err != nil {
  184. t.Fatal("GetEnvFromPath error:", err)
  185. }
  186. if e == nil {
  187. t.Fatal("GetEnvFromPath e nil")
  188. }
  189. value, err = e.Get("d")
  190. if err != nil {
  191. t.Fatal("Get error:", err)
  192. }
  193. v, ok = value.(string)
  194. if !ok {
  195. t.Fatal("value not string")
  196. }
  197. if v != "d" {
  198. t.Errorf("value - received: %v - expected: %v", v, "d")
  199. }
  200. e, err = c.GetEnvFromPath([]string{"b", "c"})
  201. if err != nil {
  202. t.Fatal("GetEnvFromPath error:", err)
  203. }
  204. if e == nil {
  205. t.Fatal("GetEnvFromPath e nil")
  206. }
  207. value, err = e.Get("d")
  208. if err != nil {
  209. t.Fatal("Get error:", err)
  210. }
  211. v, ok = value.(string)
  212. if !ok {
  213. t.Fatal("value not string")
  214. }
  215. if v != "d" {
  216. t.Errorf("value - received: %v - expected: %v", v, "d")
  217. }
  218. // c
  219. e, err = env.GetEnvFromPath([]string{"c"})
  220. expected = "no namespace called: c"
  221. if err == nil || err.Error() != expected {
  222. t.Fatalf("GetEnvFromPath error - received: %v - expected: %v", err, expected)
  223. }
  224. if e != nil {
  225. t.Fatal("GetEnvFromPath e not nil")
  226. }
  227. e, err = b.GetEnvFromPath([]string{"c"})
  228. if err != nil {
  229. t.Fatal("GetEnvFromPath error:", err)
  230. }
  231. if e == nil {
  232. t.Fatal("GetEnvFromPath e nil")
  233. }
  234. value, err = e.Get("d")
  235. if err != nil {
  236. t.Fatal("Get error:", err)
  237. }
  238. v, ok = value.(string)
  239. if !ok {
  240. t.Fatal("value not string")
  241. }
  242. if v != "d" {
  243. t.Errorf("value - received: %v - expected: %v", v, "d")
  244. }
  245. e, err = c.GetEnvFromPath(nil)
  246. if err != nil {
  247. t.Fatal("GetEnvFromPath error:", err)
  248. }
  249. if e == nil {
  250. t.Fatal("GetEnvFromPath e nil")
  251. }
  252. value, err = e.Get("d")
  253. if err != nil {
  254. t.Fatal("Get error:", err)
  255. }
  256. v, ok = value.(string)
  257. if !ok {
  258. t.Fatal("value not string")
  259. }
  260. if v != "d" {
  261. t.Errorf("value - received: %v - expected: %v", v, "d")
  262. }
  263. }
  264. func TestCopy(t *testing.T) {
  265. t.Parallel()
  266. parent := NewEnv()
  267. parent.Define("a", "a")
  268. parent.DefineType("b", []bool{})
  269. child := parent.NewEnv()
  270. child.Define("c", "c")
  271. child.DefineType("d", []int64{})
  272. copy := child.Copy()
  273. if v, e := copy.Get("a"); e != nil || v != "a" {
  274. t.Errorf("copy missing value")
  275. }
  276. if v, e := copy.Type("b"); e != nil || v != reflect.TypeOf([]bool{}) {
  277. t.Errorf("copy missing type")
  278. }
  279. if v, e := copy.Get("c"); e != nil || v != "c" {
  280. t.Errorf("copy missing value")
  281. }
  282. if v, e := copy.Type("d"); e != nil || v != reflect.TypeOf([]int64{}) {
  283. t.Errorf("copy missing type")
  284. }
  285. // TODO: add more get type tests
  286. copy.Set("a", "i")
  287. if v, e := child.Get("a"); e != nil || v != "i" {
  288. t.Errorf("parent was not modified")
  289. }
  290. if v, e := copy.Get("a"); e != nil || v != "i" {
  291. t.Errorf("copy did not get parent value")
  292. }
  293. copy.Set("c", "j")
  294. if v, e := child.Get("c"); e != nil || v != "c" {
  295. t.Errorf("child was not modified")
  296. }
  297. if v, e := copy.Get("c"); e != nil || v != "j" {
  298. t.Errorf("copy child was not modified")
  299. }
  300. child.Set("a", "x")
  301. if v, e := child.Get("a"); e != nil || v != "x" {
  302. t.Errorf("parent was not modified")
  303. }
  304. if v, e := copy.Get("a"); e != nil || v != "x" {
  305. t.Errorf("copy did not get parent value")
  306. }
  307. child.Set("c", "z")
  308. if v, e := child.Get("c"); e != nil || v != "z" {
  309. t.Errorf("child was not modified")
  310. }
  311. if v, e := copy.Get("c"); e != nil || v != "j" {
  312. t.Errorf("copy child was modified")
  313. }
  314. parent.Set("a", "m")
  315. if v, e := child.Get("a"); e != nil || v != "m" {
  316. t.Errorf("parent was not modified")
  317. }
  318. if v, e := copy.Get("a"); e != nil || v != "m" {
  319. t.Errorf("copy did not get parent value")
  320. }
  321. parent.Define("x", "n")
  322. if v, e := child.Get("x"); e != nil || v != "n" {
  323. t.Errorf("child did not get parent value")
  324. }
  325. if v, e := copy.Get("x"); e != nil || v != "n" {
  326. t.Errorf("copy did not get parent value")
  327. }
  328. }
  329. func TestDeepCopy(t *testing.T) {
  330. t.Parallel()
  331. parent := NewEnv()
  332. parent.Define("a", "a")
  333. env := parent.NewEnv()
  334. copy := env.DeepCopy()
  335. // TODO: add more/better tests, like above
  336. if v, e := copy.Get("a"); e != nil || v != "a" {
  337. t.Errorf("copy doesn't retain original values")
  338. }
  339. parent.Set("a", "b")
  340. if v, e := env.Get("a"); e != nil || v != "b" {
  341. t.Errorf("son was not modified")
  342. }
  343. if v, e := copy.Get("a"); e != nil || v != "a" {
  344. t.Errorf("copy got the new value")
  345. }
  346. parent.Set("a", "c")
  347. if v, e := env.Get("a"); e != nil || v != "c" {
  348. t.Errorf("original was not modified")
  349. }
  350. if v, e := copy.Get("a"); e != nil || v != "a" {
  351. t.Errorf("copy was modified")
  352. }
  353. parent.Define("b", "b")
  354. if _, e := copy.Get("b"); e == nil {
  355. t.Errorf("copy parent was modified")
  356. }
  357. }