github.com/NeowayLabs/nash@v0.2.2-0.20200127205349-a227041ffd50/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  }