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  }