parser_test.go 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. package parser
  2. import (
  3. "testing"
  4. "github.com/stretchr/testify/assert"
  5. )
  6. func TestOption_Add(t *testing.T) {
  7. t.Parallel()
  8. type fields struct {
  9. Args []string
  10. }
  11. type args struct {
  12. arg string
  13. }
  14. tests := []struct {
  15. name string
  16. fields fields
  17. args args
  18. want []string
  19. }{
  20. {name: "simple add", fields: fields{
  21. Args: []string{"a", "b"},
  22. }, args: args{
  23. arg: "c",
  24. }, want: []string{"a", "b", "c"}},
  25. {name: "null add", fields: fields{
  26. Args: nil,
  27. }, args: args{
  28. arg: "c",
  29. }, want: []string{"c"}},
  30. }
  31. for _, tt := range tests {
  32. tt := tt
  33. t.Run(tt.name, func(t *testing.T) {
  34. t.Parallel()
  35. o := &Option{
  36. Args: tt.fields.Args,
  37. }
  38. o.Add(tt.args.arg)
  39. assert.ElementsMatch(t, tt.want, o.Args)
  40. })
  41. }
  42. }
  43. func TestOption_Set(t *testing.T) {
  44. t.Parallel()
  45. type fields struct {
  46. Args []string
  47. }
  48. type args struct {
  49. arg string
  50. }
  51. tests := []struct {
  52. name string
  53. fields fields
  54. args args
  55. want []string
  56. }{
  57. {name: "simple set", fields: fields{
  58. Args: []string{"a", "b"},
  59. }, args: args{
  60. arg: "c",
  61. }, want: []string{"c"}},
  62. {name: "null set", fields: fields{
  63. Args: nil,
  64. }, args: args{
  65. arg: "c",
  66. }, want: []string{"c"}},
  67. }
  68. for _, tt := range tests {
  69. tt := tt
  70. t.Run(tt.name, func(t *testing.T) {
  71. t.Parallel()
  72. o := &Option{
  73. Args: tt.fields.Args,
  74. }
  75. o.Set(tt.args.arg)
  76. assert.ElementsMatch(t, tt.want, o.Args)
  77. })
  78. }
  79. }
  80. func TestOption_First(t *testing.T) {
  81. t.Parallel()
  82. type fields struct {
  83. Args []string
  84. }
  85. tests := []struct {
  86. name string
  87. fields fields
  88. want string
  89. }{
  90. {name: "simple first", fields: fields{
  91. Args: []string{"a", "b"},
  92. }, want: "a"},
  93. {name: "null first", fields: fields{
  94. Args: nil,
  95. }, want: ""},
  96. }
  97. for _, tt := range tests {
  98. tt := tt
  99. t.Run(tt.name, func(t *testing.T) {
  100. t.Parallel()
  101. o := &Option{
  102. Args: tt.fields.Args,
  103. }
  104. assert.Equal(t, tt.want, o.First())
  105. })
  106. }
  107. }
  108. func TestMakeArguments(t *testing.T) {
  109. t.Parallel()
  110. args := MakeArguments()
  111. assert.NotNil(t, args)
  112. assert.Equal(t, "", args.Op)
  113. assert.Empty(t, args.Options)
  114. assert.Empty(t, args.Targets)
  115. }
  116. func TestArguments_CopyGlobal(t *testing.T) {
  117. t.Parallel()
  118. type fields struct {
  119. Op string
  120. Options map[string]*Option
  121. Targets []string
  122. }
  123. tests := []struct {
  124. name string
  125. fields fields
  126. want *Arguments
  127. }{
  128. {name: "simple", fields: fields{
  129. Op: "Q",
  130. Options: map[string]*Option{
  131. "a": {}, "arch": {
  132. Global: true,
  133. Args: []string{"x86_x64"},
  134. }, "boo": {Global: true, Args: []string{"a", "b"}},
  135. },
  136. Targets: []string{"a", "b"},
  137. }, want: &Arguments{
  138. Op: "",
  139. Options: map[string]*Option{
  140. "arch": {
  141. Global: true,
  142. Args: []string{"x86_x64"},
  143. }, "boo": {Global: true, Args: []string{"a", "b"}},
  144. },
  145. Targets: []string{},
  146. }},
  147. }
  148. for _, tt := range tests {
  149. tt := tt
  150. t.Run(tt.name, func(t *testing.T) {
  151. t.Parallel()
  152. cmdArgs := &Arguments{
  153. Op: tt.fields.Op,
  154. Options: tt.fields.Options,
  155. Targets: tt.fields.Targets,
  156. }
  157. got := cmdArgs.CopyGlobal()
  158. assert.NotEqualValues(t, tt.fields.Options, got.Options)
  159. assert.NotEqualValues(t, tt.fields.Targets, got.Targets)
  160. assert.NotEqual(t, tt.fields.Op, got.Op)
  161. assert.Equal(t, tt.want, got)
  162. })
  163. }
  164. }
  165. func TestArguments_Copy(t *testing.T) {
  166. t.Parallel()
  167. type fields struct {
  168. Op string
  169. Options map[string]*Option
  170. Targets []string
  171. }
  172. tests := []struct {
  173. name string
  174. fields fields
  175. want *Arguments
  176. }{
  177. {name: "simple", fields: fields{
  178. Op: "Q",
  179. Options: map[string]*Option{
  180. "a": {}, "arch": {
  181. Args: []string{"x86_x64"}, Global: true,
  182. }, "boo": {Args: []string{"a", "b"}, Global: true},
  183. },
  184. Targets: []string{"a", "b"},
  185. }, want: &Arguments{
  186. Op: "Q",
  187. Options: map[string]*Option{
  188. "a": {}, "arch": {
  189. Global: true,
  190. Args: []string{"x86_x64"},
  191. }, "boo": {Args: []string{"a", "b"}, Global: true},
  192. },
  193. Targets: []string{"a", "b"},
  194. }},
  195. }
  196. for _, tt := range tests {
  197. tt := tt
  198. t.Run(tt.name, func(t *testing.T) {
  199. t.Parallel()
  200. cmdArgs := &Arguments{
  201. Op: tt.fields.Op,
  202. Options: tt.fields.Options,
  203. Targets: tt.fields.Targets,
  204. }
  205. got := cmdArgs.Copy()
  206. assert.Equal(t, cmdArgs, got)
  207. assert.Equal(t, tt.want, got)
  208. })
  209. }
  210. }
  211. func TestArguments_DelArg(t *testing.T) {
  212. t.Parallel()
  213. args := MakeArguments()
  214. args.addParam("arch", "arg")
  215. args.addParam("ask", "arg")
  216. args.DelArg("arch", "ask")
  217. assert.Empty(t, args.Options)
  218. }
  219. func TestArguments_FormatArgs(t *testing.T) {
  220. t.Parallel()
  221. type fields struct {
  222. Op string
  223. Options map[string]*Option
  224. Targets []string
  225. }
  226. tests := []struct {
  227. name string
  228. fields fields
  229. wantArgs []string
  230. }{
  231. {name: "simple", fields: fields{
  232. Op: "S",
  233. Options: map[string]*Option{},
  234. Targets: []string{"yay", "yay-bin", "yay-git"},
  235. }, wantArgs: []string{"-S"}},
  236. {name: "only global", fields: fields{
  237. Op: "Y",
  238. Options: map[string]*Option{"noconfirm": {Global: true, Args: []string{""}}},
  239. Targets: []string{"yay", "yay-bin", "yay-git"},
  240. }, wantArgs: []string{"-Y"}},
  241. {name: "options single", fields: fields{
  242. Op: "Y",
  243. Options: map[string]*Option{"overwrite": {Args: []string{"/tmp/a"}}, "useask": {Args: []string{""}}},
  244. Targets: []string{},
  245. }, wantArgs: []string{"-Y", "--overwrite", "/tmp/a", "--useask"}},
  246. {name: "options doubles", fields: fields{
  247. Op: "Y",
  248. Options: map[string]*Option{"overwrite": {Args: []string{"/tmp/a", "/tmp/b", "/tmp/c"}}, "needed": {Args: []string{""}}},
  249. Targets: []string{},
  250. }, wantArgs: []string{"-Y", "--overwrite", "/tmp/a", "--overwrite", "/tmp/b", "--overwrite", "/tmp/c", "--needed"}},
  251. }
  252. for _, tt := range tests {
  253. tt := tt
  254. t.Run(tt.name, func(t *testing.T) {
  255. t.Parallel()
  256. cmdArgs := &Arguments{
  257. Op: tt.fields.Op,
  258. Options: tt.fields.Options,
  259. Targets: tt.fields.Targets,
  260. }
  261. gotArgs := cmdArgs.FormatArgs()
  262. assert.ElementsMatch(t, gotArgs, tt.wantArgs)
  263. })
  264. }
  265. }
  266. func TestArguments_FormatGlobalArgs(t *testing.T) {
  267. t.Parallel()
  268. type fields struct {
  269. Op string
  270. Options map[string]*Option
  271. Targets []string
  272. }
  273. tests := []struct {
  274. name string
  275. fields fields
  276. wantArgs []string
  277. }{
  278. {name: "simple", fields: fields{
  279. Op: "S",
  280. Options: map[string]*Option{"dbpath": {Global: true, Args: []string{"/tmp/a", "/tmp/b"}}},
  281. Targets: []string{"yay", "yay-bin", "yay-git"},
  282. }, wantArgs: []string{"--dbpath", "/tmp/a", "--dbpath", "/tmp/b"}},
  283. {name: "only global", fields: fields{
  284. Op: "Y",
  285. Options: map[string]*Option{"noconfirm": {Global: true, Args: []string{""}}},
  286. Targets: []string{"yay", "yay-bin", "yay-git"},
  287. }, wantArgs: []string{"--noconfirm"}},
  288. {name: "options single", fields: fields{
  289. Op: "Y",
  290. Options: map[string]*Option{"overwrite": {Args: []string{"/tmp/a"}}, "useask": {Args: []string{""}}},
  291. Targets: []string{},
  292. }, wantArgs: []string(nil)},
  293. {name: "options doubles", fields: fields{
  294. Op: "Y",
  295. Options: map[string]*Option{"overwrite": {Args: []string{"/tmp/a", "/tmp/b", "/tmp/c"}}, "needed": {Args: []string{""}}},
  296. Targets: []string{},
  297. }, wantArgs: []string(nil)},
  298. }
  299. for _, tt := range tests {
  300. tt := tt
  301. t.Run(tt.name, func(t *testing.T) {
  302. t.Parallel()
  303. cmdArgs := &Arguments{
  304. Op: tt.fields.Op,
  305. Options: tt.fields.Options,
  306. Targets: tt.fields.Targets,
  307. }
  308. gotArgs := cmdArgs.FormatGlobals()
  309. assert.ElementsMatch(t, tt.wantArgs, gotArgs)
  310. })
  311. }
  312. }
  313. func Test_isArg(t *testing.T) {
  314. t.Parallel()
  315. got := isArg("zorg")
  316. assert.False(t, got)
  317. got = isArg("dbpath")
  318. assert.True(t, got)
  319. }