expand_test.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. // Copyright 2016 Google Inc. All rights reserved.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package android
  15. import (
  16. "fmt"
  17. "testing"
  18. )
  19. var vars = map[string]string{
  20. "var1": "abc",
  21. "var2": "",
  22. "var3": "def",
  23. "💩": "😃",
  24. "escape": "${in}",
  25. }
  26. func expander(s string) (string, bool, error) {
  27. if val, ok := vars[s]; ok {
  28. return val, s == "escape", nil
  29. } else {
  30. return "", false, fmt.Errorf("unknown variable %q", s)
  31. }
  32. }
  33. var expandTestCases = []struct {
  34. in string
  35. out string
  36. out_escaped string
  37. err bool
  38. }{
  39. {
  40. in: "$(var1)",
  41. out: "abc",
  42. out_escaped: "abc",
  43. },
  44. {
  45. in: "$( var1 )",
  46. out: "abc",
  47. out_escaped: "abc",
  48. },
  49. {
  50. in: "def$(var1)",
  51. out: "defabc",
  52. out_escaped: "defabc",
  53. },
  54. {
  55. in: "$(var1)def",
  56. out: "abcdef",
  57. out_escaped: "abcdef",
  58. },
  59. {
  60. in: "def$(var1)def",
  61. out: "defabcdef",
  62. out_escaped: "defabcdef",
  63. },
  64. {
  65. in: "$(var2)",
  66. out: "",
  67. out_escaped: "",
  68. },
  69. {
  70. in: "def$(var2)",
  71. out: "def",
  72. out_escaped: "def",
  73. },
  74. {
  75. in: "$(var2)def",
  76. out: "def",
  77. out_escaped: "def",
  78. },
  79. {
  80. in: "def$(var2)def",
  81. out: "defdef",
  82. out_escaped: "defdef",
  83. },
  84. {
  85. in: "$(var1)$(var3)",
  86. out: "abcdef",
  87. out_escaped: "abcdef",
  88. },
  89. {
  90. in: "$(var1)g$(var3)",
  91. out: "abcgdef",
  92. out_escaped: "abcgdef",
  93. },
  94. {
  95. in: "$$",
  96. out: "$",
  97. out_escaped: "$$",
  98. },
  99. {
  100. in: "$$(var1)",
  101. out: "$(var1)",
  102. out_escaped: "$$(var1)",
  103. },
  104. {
  105. in: "$$$(var1)",
  106. out: "$abc",
  107. out_escaped: "$$abc",
  108. },
  109. {
  110. in: "$(var1)$$",
  111. out: "abc$",
  112. out_escaped: "abc$$",
  113. },
  114. {
  115. in: "$(💩)",
  116. out: "😃",
  117. out_escaped: "😃",
  118. },
  119. {
  120. in: "$$a$(escape)$$b",
  121. out: "$a${in}$b",
  122. out_escaped: "$$a${in}$$b",
  123. },
  124. // Errors
  125. {
  126. in: "$",
  127. err: true,
  128. },
  129. {
  130. in: "$$$",
  131. err: true,
  132. },
  133. {
  134. in: "$(var1)$",
  135. err: true,
  136. },
  137. {
  138. in: "$(var1)$",
  139. err: true,
  140. },
  141. {
  142. in: "$(var4)",
  143. err: true,
  144. },
  145. {
  146. in: "$var1",
  147. err: true,
  148. },
  149. {
  150. in: "$(var1",
  151. err: true,
  152. },
  153. {
  154. in: "$a💩c",
  155. err: true,
  156. },
  157. }
  158. func TestExpand(t *testing.T) {
  159. for _, test := range expandTestCases {
  160. got, err := Expand(test.in, func(s string) (string, error) {
  161. s, _, err := expander(s)
  162. return s, err
  163. })
  164. if err != nil && !test.err {
  165. t.Errorf("%q: unexpected error %s", test.in, err.Error())
  166. } else if err == nil && test.err {
  167. t.Errorf("%q: expected error, got %q", test.in, got)
  168. } else if !test.err && got != test.out {
  169. t.Errorf("%q: expected %q, got %q", test.in, test.out, got)
  170. }
  171. }
  172. }
  173. func TestExpandNinjaEscaped(t *testing.T) {
  174. for _, test := range expandTestCases {
  175. got, err := ExpandNinjaEscaped(test.in, expander)
  176. if err != nil && !test.err {
  177. t.Errorf("%q: unexpected error %s", test.in, err.Error())
  178. } else if err == nil && test.err {
  179. t.Errorf("%q: expected error, got %q", test.in, got)
  180. } else if !test.err && got != test.out_escaped {
  181. t.Errorf("%q: expected %q, got %q", test.in, test.out, got)
  182. }
  183. }
  184. }