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

     1  package builtin_test
     2  
     3  import (
     4  	"fmt"
     5  	"io/ioutil"
     6  	"os"
     7  	"strings"
     8  	"testing"
     9  )
    10  
    11  func setup(t *testing.T) (string, func()) {
    12  	dir, err := ioutil.TempDir("", "globtest")
    13  	if err != nil {
    14  		t.Fatalf("error on setup: %s", err)
    15  	}
    16  
    17  	return dir, func() {
    18  		os.RemoveAll(dir)
    19  	}
    20  }
    21  
    22  func createFile(t *testing.T, path string) {
    23  	f, err := os.Create(path)
    24  	if err != nil {
    25  		t.Fatal(err)
    26  	}
    27  	f.WriteString("hi")
    28  	f.Close()
    29  }
    30  
    31  func TestGlobNoResult(t *testing.T) {
    32  	dir, teardown := setup(t)
    33  	defer teardown()
    34  
    35  	pattern := dir + "/*.la"
    36  
    37  	out := execSuccess(t, fmt.Sprintf(`
    38  		var res, err <= glob("%s")
    39  		print($res)
    40  		print($err)
    41  		print(len($res))
    42  	`, pattern))
    43  
    44  	if out != "0" {
    45  		t.Fatalf("expected no results, got: %q", out)
    46  	}
    47  }
    48  
    49  func TestGlobOneResult(t *testing.T) {
    50  	dir, teardown := setup(t)
    51  	defer teardown()
    52  
    53  	filename := dir + "/whatever.go"
    54  	createFile(t, filename)
    55  	pattern := dir + "/*.go"
    56  
    57  	out := execSuccess(t, fmt.Sprintf(`
    58  		var res, err <= glob("%s")
    59  		print($res)
    60  		print($err)
    61  	`, pattern))
    62  
    63  	if out != filename {
    64  		t.Fatalf("expected %q, got: %q", filename, out)
    65  	}
    66  }
    67  
    68  func TestGlobMultipleResults(t *testing.T) {
    69  	dir, teardown := setup(t)
    70  	defer teardown()
    71  
    72  	filename1 := dir + "/whatever.h"
    73  	filename2 := dir + "/whatever2.h"
    74  
    75  	createFile(t, filename1)
    76  	createFile(t, filename2)
    77  
    78  	pattern := dir + "/*.h"
    79  
    80  	out := execSuccess(t, fmt.Sprintf(`
    81  		var res, err <= glob("%s")
    82  		print($res)
    83  		print($err)
    84  	`, pattern))
    85  
    86  	res := strings.Split(out, " ")
    87  	if len(res) != 2 {
    88  		t.Fatalf("expected 2 results, got: %d", len(res))
    89  	}
    90  
    91  	found1 := false
    92  	found2 := false
    93  
    94  	for _, r := range res {
    95  		if r == filename1 {
    96  			found1 = true
    97  		}
    98  		if r == filename2 {
    99  			found2 = true
   100  		}
   101  	}
   102  
   103  	if !found1 || !found2 {
   104  		t.Fatalf("unable to found all files, got: %q", out)
   105  	}
   106  }
   107  
   108  func TestGlobInvalidPatternError(t *testing.T) {
   109  	out := execSuccess(t, `
   110  		var res, err <= glob("*[.go")
   111  		print($res)
   112  		if $err != "" {
   113  			print("got error")
   114  		}
   115  	`)
   116  
   117  	if out != "got error" {
   118  		t.Fatalf("expected error message on glob, got nothing, output[%s]", out)
   119  	}
   120  }
   121  
   122  func TestFatalFailure(t *testing.T) {
   123  	type tcase struct {
   124  		name string
   125  		code string
   126  	}
   127  	cases := []tcase{
   128  		tcase{
   129  			name: "noParam",
   130  			code: `
   131  				var res <= glob()
   132  				print($res)
   133  			`,
   134  		},
   135  		tcase{
   136  			name: "multipleParams",
   137  			code: `
   138  				var res <= glob("/a/*", "/b/*")
   139  				print($res)
   140  			`,
   141  		},
   142  		tcase{
   143  			name: "wrongType",
   144  			code: `
   145  				var param = ("hi")
   146  				var res <= glob($param)
   147  				print($res)
   148  			`,
   149  		},
   150  	}
   151  
   152  	for _, c := range cases {
   153  		t.Run(c.name, func(t *testing.T) {
   154  			execFailure(t, c.code)
   155  		})
   156  	}
   157  }