github.com/NeowayLabs/nash@v0.2.2-0.20200127205349-a227041ffd50/internal/sh/builtin/append_test.go (about)

     1  package builtin_test
     2  
     3  import (
     4  	"bytes"
     5  	"testing"
     6  	
     7  	"github.com/madlambda/nash/internal/sh/internal/fixture"
     8  )
     9  
    10  type testcase struct {
    11  	name           string
    12  	code           string
    13  	expectedErr    string
    14  	expectedStdout string
    15  	expectedStderr string
    16  }
    17  
    18  func testAppend(t *testing.T, tc testcase) {
    19  	sh, teardown := fixture.SetupShell(t)
    20  	defer teardown()
    21  
    22  	var (
    23  		outb, errb bytes.Buffer
    24  	)
    25  	sh.SetStdout(&outb)
    26  	sh.SetStderr(&errb)
    27  
    28  	err := sh.Exec(tc.name, tc.code)
    29  	stdout := string(outb.Bytes())
    30  	stderr := errb.String()
    31  
    32  	if stdout != tc.expectedStdout {
    33  		t.Errorf("String differs: '%s' != '%s'", tc.expectedStdout, stdout)
    34  		return
    35  	}
    36  	if stderr != tc.expectedStderr {
    37  		t.Errorf("String differs: '%s' != '%s'", tc.expectedStderr, stderr)
    38  		return
    39  	}
    40  
    41  	if err != nil {
    42  		if err.Error() != tc.expectedErr {
    43  			t.Fatalf("Expected err '%s' but got '%s'", tc.expectedErr, err.Error())
    44  		}
    45  	} else if tc.expectedErr != "" {
    46  		t.Fatalf("Expected err '%s' but err is nil", tc.expectedErr)
    47  	}
    48  }
    49  
    50  func TestAppend(t *testing.T) {
    51  	for _, tc := range []testcase{
    52  		{
    53  			name:        "no argument fails",
    54  			code:        `append()`,
    55  			expectedErr: "<interactive>:1:0: append expects at least two arguments",
    56  		},
    57  		{
    58  			name:        "one argument fails",
    59  			code:        `append("1")`,
    60  			expectedErr: "<interactive>:1:0: append expects at least two arguments",
    61  		},
    62  		{
    63  			name: "simple append",
    64  			code: `var a = ()
    65  		 a <= append($a, "hello")
    66  		 a <= append($a, "world")
    67  		 echo -n $a...`,
    68  			expectedErr:    "",
    69  			expectedStdout: "hello world",
    70  			expectedStderr: "",
    71  		},
    72  		{
    73  			name: "append is for lists",
    74  			code: `var a = "something"
    75  		 a <= append($a, "other")
    76  		 echo -n $a...`,
    77  			expectedErr: "<interactive>:2:8: append expects a " +
    78  				"list as first argument, but a StringType was provided",
    79  			expectedStdout: "",
    80  			expectedStderr: "",
    81  		},
    82  		{
    83  			name: "var args",
    84  			code: `var a <= append((), "1", "2", "3", "4", "5", "6")
    85  				echo -n $a...`,
    86  			expectedErr:    "",
    87  			expectedStdout: "1 2 3 4 5 6",
    88  			expectedStderr: "",
    89  		},
    90  		{
    91  			name: "append of lists",
    92  			code: `var a <= append((), (), ())
    93  				if len($a) != "2" {
    94  					print("wrong")
    95  				} else if len($a[0]) != "0" {
    96  					print("wrong")
    97  				} else if len($a[1]) != "0" {
    98  					print("wrong")
    99  				} else { print("ok") }`,
   100  			expectedErr:    "",
   101  			expectedStdout: "ok",
   102  		},
   103  	} {
   104  		tc := tc
   105  		t.Run(tc.name, func(t *testing.T) {
   106  			testAppend(t, tc)
   107  		})
   108  	}
   109  
   110  }