File: args_test.go

package info (click to toggle)
golang-sourcehut-rjarry-go-opt 2.0.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 148 kB
  • sloc: makefile: 2
file content (133 lines) | stat: -rw-r--r-- 5,271 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
// SPDX-License-Identifier: MIT
// Copyright (c) 2023 Robin Jarry

package opt_test

import (
	"testing"

	"git.sr.ht/~rjarry/go-opt/v2"
	"github.com/stretchr/testify/assert"
)

func TestLexArgs(t *testing.T) {
	vectors := []struct {
		cmd             string
		args            []string
		lead            string
		trail           string
		shift           int
		shifted         []string
		shiftArgs       []string
		shiftString     string
		shiftLead       string
		shiftTrail      string
		prepend         string
		prependedArgs   []string
		prependedString string
		prependedLead   string
		prependedTrail  string
		cut             int
		cutted          []string
		cutArgs         []string
		cutString       string
		cutLead         string
		cutTrail        string
		extend          string
		extendedArgs    []string
		extendedString  string
		extendLead      string
		extendTrail     string
	}{
		{
			cmd:             "a b c",
			args:            []string{"a", "b", "c"},
			shift:           0,
			shifted:         []string{},
			shiftArgs:       []string{"a", "b", "c"},
			shiftString:     "a b c",
			prepend:         "z ",
			prependedArgs:   []string{"z", "a", "b", "c"},
			prependedString: "z a b c",
			cut:             0,
			cutted:          []string{},
			cutArgs:         []string{"z", "a", "b", "c"},
			cutString:       "z a b c",
			extend:          " x",
			extendedArgs:    []string{"z", "a", "b", "c", "x"},
			extendedString:  "z a b c x",
		},
		{
			cmd:             "   'foo'\t-bar c $d |   zz $bar 'x y z' ",
			args:            []string{"foo", "-bar", "c", "$d", "|", "zz", "$bar", "x y z"},
			lead:            "   ",
			trail:           " ",
			shift:           2,
			shifted:         []string{"foo", "-bar"},
			shiftArgs:       []string{"c", "$d", "|", "zz", "$bar", "x y z"},
			shiftString:     "c $d |   zz $bar 'x y z' ",
			shiftTrail:      " ",
			prepend:         `baz -p "$aeiouy noooo"`,
			prependedArgs:   []string{"baz", "-p", "$aeiouy noooo", "c", "$d", "|", "zz", "$bar", "x y z"},
			prependedString: `baz -p "$aeiouy noooo" c $d |   zz $bar 'x y z' `,
			prependedLead:   "",
			prependedTrail:  " ",
			cut:             1,
			cutted:          []string{"x y z"},
			cutArgs:         []string{"baz", "-p", "$aeiouy noooo", "c", "$d", "|", "zz", "$bar"},
			cutString:       `baz -p "$aeiouy noooo" c $d |   zz $bar`,
			extend:          "'eeeee eeee ",
			extendedArgs:    []string{"baz", "-p", "$aeiouy noooo", "c", "$d", "|", "zz", "$bar", "eeeee eeee "},
			extendedString:  `baz -p "$aeiouy noooo" c $d |   zz $bar 'eeeee eeee `,
			extendTrail:     "",
		},
		{
			cmd:             `foo -xz \"bar 'baz\"' "\$baz \" ok"`,
			args:            []string{"foo", "-xz", `"bar`, `baz\"`, `$baz " ok`},
			shift:           2,
			shifted:         []string{"foo", "-xz"},
			shiftArgs:       []string{`"bar`, `baz\"`, `$baz " ok`},
			shiftString:     `\"bar 'baz\"' "\$baz \" ok"`,
			prepend:         "find 'bleh' | xargs -uuuuu u",
			prependedArgs:   []string{"find", "bleh", "|", "xargs", "-uuuuu", "u", `"bar`, `baz\"`, `$baz " ok`},
			prependedString: `find 'bleh' | xargs -uuuuu u \"bar 'baz\"' "\$baz \" ok"`,
			cut:             2,
			cutted:          []string{`baz\"`, `$baz " ok`},
			cutArgs:         []string{"find", "bleh", "|", "xargs", "-uuuuu", "u", `"bar`},
			cutString:       `find 'bleh' | xargs -uuuuu u \"bar`,
			extend:          "|| rm -rf / &",
			extendedArgs:    []string{"find", "bleh", "|", "xargs", "-uuuuu", "u", `"bar`, "||", "rm", "-rf", "/", "&"},
			extendedString:  `find 'bleh' | xargs -uuuuu u \"bar || rm -rf / &`,
		},
	}
	for _, vec := range vectors {
		t.Run(vec.cmd, func(t *testing.T) {
			cmd := opt.LexArgs(vec.cmd)
			assert.Equal(t, vec.args, cmd.Args(), "args")
			assert.Equal(t, vec.lead, cmd.LeadingSpace(), "LeadingSpace")
			assert.Equal(t, vec.trail, cmd.TrailingSpace(), "TrailingSpace")
			shifted := cmd.Shift(vec.shift)
			assert.Equal(t, vec.shifted, shifted, "Shift")
			assert.Equal(t, vec.shiftArgs, cmd.Args(), "shifted.Args")
			assert.Equal(t, vec.shiftString, cmd.String(), "shifted.String")
			assert.Equal(t, vec.shiftLead, cmd.LeadingSpace(), "shifted.LeadingSpace")
			assert.Equal(t, vec.shiftTrail, cmd.TrailingSpace(), "shifted.TrailingSpace")
			cmd.Prepend(vec.prepend)
			assert.Equal(t, vec.prependedArgs, cmd.Args(), "prepended.Args")
			assert.Equal(t, vec.prependedString, cmd.String(), "prepended.String")
			assert.Equal(t, vec.prependedLead, cmd.LeadingSpace(), "prepended.LeadingSpace")
			assert.Equal(t, vec.prependedTrail, cmd.TrailingSpace(), "prepended.TrailingSpace")
			cutted := cmd.Cut(vec.cut)
			assert.Equal(t, vec.cutted, cutted, "Cut")
			assert.Equal(t, vec.cutArgs, cmd.Args(), "cut.Args")
			assert.Equal(t, vec.cutString, cmd.String(), "cut.String")
			assert.Equal(t, vec.cutLead, cmd.LeadingSpace(), "cut.LeadingSpace")
			assert.Equal(t, vec.cutTrail, cmd.TrailingSpace(), "cut.TrailingSpace")
			cmd.Extend(vec.extend)
			assert.Equal(t, vec.extendedArgs, cmd.Args(), "extend.Args")
			assert.Equal(t, vec.extendedString, cmd.String(), "extend.String")
			assert.Equal(t, vec.extendLead, cmd.LeadingSpace(), "extend.LeadingSpace")
			assert.Equal(t, vec.extendTrail, cmd.TrailingSpace(), "extend.TrailingSpace")
		})
	}
}