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 }