github.com/mithrandie/csvq@v1.18.1/lib/excmd/args_splitter_test.go (about) 1 package excmd 2 3 import ( 4 "reflect" 5 "testing" 6 ) 7 8 var argsSplitterScanTests = []struct { 9 Args string 10 Expect []string 11 Error string 12 }{ 13 { 14 Args: "cmd -opt arg1 'arg 2' 'arg\\'3' \"arg\\\\4\" ", 15 Expect: []string{ 16 "cmd", 17 "-opt", 18 "arg1", 19 "'arg 2'", 20 "'arg\\'3'", 21 "\"arg\\\\4\"", 22 }, 23 }, 24 { 25 Args: "cmd arg1 arg2", 26 Expect: []string{ 27 "cmd", 28 "arg1", 29 "arg2", 30 }, 31 }, 32 { 33 Args: "cmd arg1 'arg 2'", 34 Expect: []string{ 35 "cmd", 36 "arg1", 37 "'arg 2'", 38 }, 39 }, 40 { 41 Args: "cmd arg1 'arg''2'", 42 Expect: []string{ 43 "cmd", 44 "arg1", 45 "'arg''2'", 46 }, 47 }, 48 { 49 Args: "cmd arg1 @var", 50 Expect: []string{ 51 "cmd", 52 "arg1", 53 "@var", 54 }, 55 }, 56 { 57 Args: "cmd arg1 @%var", 58 Expect: []string{ 59 "cmd", 60 "arg1", 61 "@%var", 62 }, 63 }, 64 { 65 Args: "cmd arg1 @%`var \\`2`", 66 Expect: []string{ 67 "cmd", 68 "arg1", 69 "@%`var \\`2`", 70 }, 71 }, 72 { 73 Args: "cmd arg1 @#var", 74 Expect: []string{ 75 "cmd", 76 "arg1", 77 "@#var", 78 }, 79 }, 80 { 81 Args: "cmd arg1 ${'arg''2'}", 82 Expect: []string{ 83 "cmd", 84 "arg1", 85 "${'arg''2'}", 86 }, 87 }, 88 { 89 Args: "sh -c ${format('echo %s | wc', @%HOME)}", 90 Expect: []string{ 91 "sh", 92 "-c", 93 "${format('echo %s | wc', @%HOME)}", 94 }, 95 }, 96 { 97 Args: "sh -c ${format('echo \"${\\\\\\}\"')}", 98 Expect: []string{ 99 "sh", 100 "-c", 101 "${format('echo \"${\\\\}\"')}", 102 }, 103 }, 104 { 105 Args: "cmd arg1 'arg2", 106 Error: "string not terminated", 107 }, 108 { 109 Args: "sh -c ${format('echo %s | wc', @%HOME)", 110 Error: "command not terminated", 111 }, 112 { 113 Args: "sh -c $format('echo %s | wc', @%HOME)", 114 Error: "invalid command symbol", 115 }, 116 { 117 Args: "cmd @%`var", 118 Error: "environment variable not terminated", 119 }, 120 } 121 122 func TestArgsSplitter_Scan(t *testing.T) { 123 for _, v := range argsSplitterScanTests { 124 splitter := new(ArgsSplitter).Init(v.Args) 125 var args = make([]string, 0) 126 for splitter.Scan() { 127 args = append(args, splitter.Text()) 128 } 129 err := splitter.Err() 130 131 if err != nil { 132 if v.Error == "" { 133 t.Errorf("unexpected error %q for %q", err.Error(), v.Args) 134 } else if v.Error != err.Error() { 135 t.Errorf("error %q, want error %q for %q", err.Error(), v.Error, v.Args) 136 } 137 continue 138 } 139 if v.Error != "" { 140 t.Errorf("no error, want error %q for %q", v.Error, v.Args) 141 continue 142 } 143 144 if !reflect.DeepEqual(args, v.Expect) { 145 t.Errorf("result = %#v, want %#v for %q", args, v.Expect, v.Args) 146 } 147 } 148 }