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")
})
}
}
|