github.com/madlambda/nash@v0.2.2-0.20230113003044-f2284521680b/internal/sh/shell_var_test.go (about) 1 package sh_test 2 3 import ( 4 "fmt" 5 "testing" 6 7 "github.com/madlambda/nash/tests" 8 ) 9 10 func TestVarAssign(t *testing.T) { 11 for _, test := range []execTestCase{ 12 { 13 desc: "simple init", 14 code: `var a = "1"; echo -n $a`, 15 expectedStdout: "1", 16 }, 17 { 18 desc: "variable does not exists", 19 code: `a = "1"; echo -n $a`, 20 expectedErr: `<interactive>:1:0: Variable 'a' is not initialized. Use 'var a = <value>'`, 21 }, 22 { 23 desc: "variable already initialized", 24 code: `var a = "1"; var a = "2"; echo -n $a`, 25 expectedStdout: "2", 26 }, 27 { 28 desc: "variable set", 29 code: `var a = "1"; a = "2"; echo -n $a`, 30 expectedStdout: "2", 31 }, 32 { 33 desc: "global variable set", 34 code: `var global = "1" 35 fn somefunc() { global = "2" } 36 somefunc() 37 echo -n $global`, 38 expectedStdout: "2", 39 }, 40 } { 41 t.Run(test.desc, func(t *testing.T) { 42 testExec(t, test) 43 }) 44 } 45 } 46 47 func TestVarExecAssign(t *testing.T) { 48 49 for _, test := range []execTestCase{ 50 { 51 desc: "simple exec var", 52 code: `var heart <= echo -n "feed both wolves" 53 echo -n $heart`, 54 expectedStdout: "feed both wolves", 55 }, 56 { 57 desc: "var do not exists", 58 code: `__a <= echo -n "fury"`, 59 expectedErr: "<interactive>:1:0: Variable '__a' is not initialized. Use 'var __a = <value>'", 60 }, 61 { 62 desc: "multiple var same name", 63 code: `var a = "1" 64 var a = "2" 65 var a = "3" 66 echo -n $a`, 67 expectedStdout: "3", 68 }, 69 { 70 desc: "multiple var same name with exec", 71 code: `var a <= echo -n "1" 72 var a <= echo -n "hello" 73 echo -n $a`, 74 expectedStdout: "hello", 75 }, 76 { 77 desc: "first variable is stdout", 78 code: `var out <= echo -n "hello" 79 echo -n $out`, 80 expectedStdout: "hello", 81 }, 82 { 83 desc: "two variable, first stdout and second is status", 84 code: `var stdout, status <= echo -n "bleh" 85 echo -n $stdout $status`, 86 expectedStdout: "bleh 0", 87 }, 88 { 89 desc: "three variables, stdout empty, stderr with data, status", 90 code: fmt.Sprintf(`var out, err, st <= %s/write/write /dev/stderr "hello" 91 echo $out 92 echo $err 93 echo -n $st`, tests.Stdbindir), 94 expectedStdout: "\nhello\n0", 95 }, 96 { 97 desc: "three variables, stdout with data, stderr empty, status", 98 code: fmt.Sprintf(`var out, err, st <= %s/write/write /dev/stdout "hello" 99 echo $out 100 echo $err 101 echo -n $st`, tests.Stdbindir), 102 expectedStdout: "hello\n\n0", 103 }, 104 } { 105 t.Run(test.desc, func(t *testing.T) { 106 testExec(t, test) 107 }) 108 } 109 }