github.com/bengarrett/retrotxtgo@v0.0.38/lib/filesystem/filesystem_test.go (about)

     1  package filesystem_test
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"os"
     7  	"path/filepath"
     8  	"reflect"
     9  	"runtime"
    10  	"testing"
    11  
    12  	"github.com/bengarrett/retrotxtgo/lib/filesystem"
    13  	"github.com/bengarrett/retrotxtgo/lib/internal/mock"
    14  	"github.com/bengarrett/retrotxtgo/lib/internal/tmp"
    15  )
    16  
    17  const windows = "windows"
    18  
    19  func ExampleTar() {
    20  	tmpTar := tmp.File("tar_test.tar")
    21  	tmpFile, err := filesystem.SaveTemp(tmpTar, []byte("x")...)
    22  	if err != nil {
    23  		log.Fatal(err)
    24  	}
    25  	defer os.Remove(tmpFile)
    26  	if err = filesystem.Tar(tmpTar, tmpFile); err != nil {
    27  		log.Print(err)
    28  		return
    29  	}
    30  	f, err := os.Stat(tmpFile)
    31  	if err != nil {
    32  		log.Print(err)
    33  		return
    34  	}
    35  	fmt.Printf("%s, %d", f.Name(), f.Size())
    36  	// Output:tar_test.tar, 1536
    37  }
    38  
    39  func BenchmarkReadLarge(b *testing.B) {
    40  	large := mock.LargeExample()
    41  	if _, err := filesystem.Read(large); err != nil {
    42  		filesystem.Clean(large)
    43  		log.Fatal(err)
    44  	}
    45  	filesystem.Clean(large)
    46  }
    47  
    48  func BenchmarkReadMega(b *testing.B) {
    49  	mega := mock.MegaExample()
    50  	if _, err := filesystem.Read(mega); err != nil {
    51  		filesystem.Clean(mega)
    52  		log.Fatal(err)
    53  	}
    54  	filesystem.Clean(mega)
    55  }
    56  
    57  func ExampleClean() {
    58  	path, err := filesystem.SaveTemp("examplesave.txt", []byte("hello world")...)
    59  	if err != nil {
    60  		filesystem.Clean(path)
    61  		log.Fatal(err)
    62  	}
    63  	filesystem.Clean(path)
    64  	// Output:
    65  }
    66  
    67  func Test_DirExpansion(t *testing.T) {
    68  	h, err := os.UserHomeDir()
    69  	if err != nil {
    70  		t.Error(err)
    71  	}
    72  	hp := filepath.Dir(h)
    73  	w, err := os.Getwd()
    74  	if err != nil {
    75  		t.Error(err)
    76  	}
    77  	wp := filepath.Dir(w)
    78  	s := string(os.PathSeparator)
    79  
    80  	var tests mock.DirTests
    81  	if runtime.GOOS == windows {
    82  		tests = mock.WindowsTests(h, hp, s, w, wp)
    83  	} else {
    84  		tests = mock.NixTests(h, hp, s, w, wp)
    85  	}
    86  	for _, tt := range tests {
    87  		t.Run(tt.Name, func(t *testing.T) {
    88  			if gotDir := filesystem.DirExpansion(tt.Name); gotDir != tt.WantDir {
    89  				t.Errorf("DirExpansion(%v) = %v, want %v", tt.Name, gotDir, tt.WantDir)
    90  			}
    91  		})
    92  	}
    93  }
    94  
    95  func TestRead(t *testing.T) {
    96  	f := mock.FileExample("hello", 0)
    97  	large := mock.LargeExample()
    98  	type args struct {
    99  		name string
   100  	}
   101  	tests := []struct {
   102  		name    string
   103  		args    args
   104  		wantErr bool
   105  	}{
   106  		{"empty", args{""}, true},
   107  		{"invalid", args{"/invalid-file"}, true},
   108  		{"dir", args{os.TempDir()}, true},
   109  		{"valid", args{f}, false},
   110  		{"1.5MB", args{large}, false},
   111  	}
   112  	for _, tt := range tests {
   113  		t.Run(tt.name, func(t *testing.T) {
   114  			_, err := filesystem.Read(tt.args.name)
   115  			if (err != nil) != tt.wantErr {
   116  				t.Errorf("Read() error = %v, wantErr %v", err, tt.wantErr)
   117  			}
   118  		})
   119  	}
   120  	filesystem.Clean(f)
   121  	filesystem.Clean(large)
   122  }
   123  
   124  func TestReadAllBytes(t *testing.T) {
   125  	f2 := mock.FileExample(mock.T()["Symbols"], 2)
   126  	f3 := mock.FileExample(mock.T()["Tabs"], 3)
   127  	f4 := mock.FileExample(mock.T()["Escapes"], 4)
   128  	f5 := mock.FileExample(mock.T()["Digits"], 5)
   129  	large := mock.LargeExample()
   130  	type args struct {
   131  		name string
   132  	}
   133  	tests := []struct {
   134  		name     string
   135  		args     args
   136  		wantData []byte
   137  		wantErr  bool
   138  	}{
   139  		{"empty", args{""}, nil, true},
   140  		{"invalid", args{"/invalid-file"}, nil, true},
   141  		{"dir", args{os.TempDir()}, nil, true},
   142  		{"utf8", args{f2}, []byte(mock.T()["Symbols"]), false},
   143  		{"tabs", args{f3}, []byte(mock.T()["Tabs"]), false},
   144  		{"escs", args{f4}, []byte(mock.T()["Escapes"]), false},
   145  		{"digs", args{f5}, []byte(mock.T()["Digits"]), false},
   146  		{"1.5MB", args{large}, nil, false},
   147  	}
   148  	for _, tt := range tests {
   149  		t.Run(tt.name, func(t *testing.T) {
   150  			gotData, err := filesystem.ReadAllBytes(tt.args.name)
   151  			if (err != nil) != tt.wantErr {
   152  				t.Errorf("ReadAllBytes() error = %v, wantErr %v", err, tt.wantErr)
   153  				return
   154  			}
   155  			if tt.wantData != nil && !reflect.DeepEqual(gotData, tt.wantData) {
   156  				t.Errorf("ReadAllBytes() = %q, want %q", string(gotData), string(tt.wantData))
   157  			}
   158  		})
   159  	}
   160  	filesystem.Clean(f2)
   161  	filesystem.Clean(f3)
   162  	filesystem.Clean(f4)
   163  	filesystem.Clean(f5)
   164  	filesystem.Clean(large)
   165  }
   166  
   167  func TestReadChunk(t *testing.T) {
   168  	f1 := mock.FileExample(mock.T()["Newline"], 1)
   169  	f2 := mock.FileExample(mock.T()["Symbols"], 2)
   170  	f3 := mock.FileExample(mock.T()["Tabs"], 3)
   171  	f4 := mock.FileExample(mock.T()["Escapes"], 4)
   172  	large := mock.LargeExample()
   173  	type args struct {
   174  		name string
   175  		size int
   176  	}
   177  	tests := []struct {
   178  		name     string
   179  		args     args
   180  		wantData []byte
   181  		wantErr  bool
   182  	}{
   183  		{"empty", args{"", 0}, nil, true},
   184  		{"invalid", args{"/invalid-file", 0}, nil, true},
   185  		{"dir", args{os.TempDir(), 0}, nil, true},
   186  		{"range 0", args{"", 10}, nil, true},
   187  		{"range -", args{f2, -20}, []byte{}, false},
   188  		{"range +", args{f2, 20}, []byte(mock.T()["Symbols"]), false},
   189  		{"nl", args{f1, 4}, []byte("a\nb\n"), false},
   190  		{"utf8", args{f2, 4}, []byte("[☠|☮"), false},
   191  		{"tabs", args{f3, 7}, []byte("☠\tSkull"), false},
   192  		{"escs", args{f4, 13}, []byte("bell:\a,back:\b"), false},
   193  		{large, args{large, 100}, nil, false},
   194  	}
   195  	for _, tt := range tests {
   196  		t.Run(tt.name, func(t *testing.T) {
   197  			gotData, err := filesystem.ReadChunk(tt.args.name, tt.args.size)
   198  			if (err != nil) != tt.wantErr {
   199  				t.Errorf("ReadChunk() error = %v, wantErr %v", err, tt.wantErr)
   200  				return
   201  			}
   202  			if tt.name == large && len(gotData) != 100 {
   203  				t.Errorf("ReadChunk() length = %v, want %v", len(gotData), 100)
   204  			}
   205  			if tt.name != large && !reflect.DeepEqual(gotData, tt.wantData) {
   206  				t.Errorf("ReadChunk() = %v, want %v", gotData, tt.wantData)
   207  			}
   208  		})
   209  	}
   210  	filesystem.Clean(f1)
   211  	filesystem.Clean(f2)
   212  	filesystem.Clean(f3)
   213  	filesystem.Clean(f4)
   214  	filesystem.Clean(large)
   215  }
   216  
   217  func TestReadTail(t *testing.T) {
   218  	f1 := mock.FileExample(mock.T()["Newline"], 1)
   219  	f2 := mock.FileExample(mock.T()["Symbols"], 2)
   220  	f3 := mock.FileExample(mock.T()["Tabs"], 3)
   221  	f4 := mock.FileExample(mock.T()["Escapes"], 4)
   222  	large := mock.LargeExample()
   223  	type args struct {
   224  		name   string
   225  		offset int
   226  	}
   227  	tests := []struct {
   228  		name     string
   229  		args     args
   230  		wantData []byte
   231  		wantErr  bool
   232  	}{
   233  		{"empty", args{"", 0}, nil, true},
   234  		{"invalid", args{"/invalid-file", 0}, nil, true},
   235  		{"dir", args{os.TempDir(), 0}, nil, true},
   236  		{"range", args{"", 10}, nil, true},
   237  		{"utf8", args{f2, 4}, []byte("☮|♺]"), false},
   238  		{"tabs", args{f3, 11}, []byte("♺\tRecycling"), false},
   239  		{"escs", args{f4, 9}, []byte("\v,quote:\""), false},
   240  		{large, args{large, 100}, nil, false},
   241  	}
   242  	for _, tt := range tests {
   243  		t.Run(tt.name, func(t *testing.T) {
   244  			gotData, err := filesystem.ReadTail(tt.args.name, tt.args.offset)
   245  			if (err != nil) != tt.wantErr {
   246  				t.Errorf("ReadTail() error = %v, wantErr %v", err, tt.wantErr)
   247  				return
   248  			}
   249  			if tt.name == large && len(gotData) != 100 {
   250  				t.Errorf("ReadChunk() length = %v, want %v", len(gotData), 100)
   251  			}
   252  			if tt.name != large && !reflect.DeepEqual(gotData, tt.wantData) {
   253  				t.Errorf("ReadTail() = %q, want %q", string(gotData), string(tt.wantData))
   254  			}
   255  		})
   256  	}
   257  	filesystem.Clean(f1)
   258  	filesystem.Clean(f2)
   259  	filesystem.Clean(f3)
   260  	filesystem.Clean(f4)
   261  	filesystem.Clean(large)
   262  }
   263  
   264  func Test_word(t *testing.T) {
   265  	tests := []struct {
   266  		name string
   267  		s    string
   268  		want bool
   269  	}{
   270  		{"empty", "", false},
   271  		{"1", "something", true},
   272  		{"2", "some things", true},
   273  		{"!@#", "!@#", true},
   274  		{"1234.5", "1234.5", true},
   275  		{"你好世界", "你好世界", true},
   276  		{"😀", "😀", false},
   277  		{"😀smiley", "😀smiley", false},
   278  		{"▃▃▃▃▃", "▃▃▃▃▃", false},
   279  		{"nl", "hello\nworld", true},
   280  		{"nl😀", "hello\n😀", true},
   281  		{"😀nl", "😀\nsmiley", false},
   282  	}
   283  	for _, tt := range tests {
   284  		t.Run(tt.name, func(t *testing.T) {
   285  			if got := filesystem.Word(tt.s); got != tt.want {
   286  				t.Errorf("Word() = %v, want %v", got, tt.want)
   287  			}
   288  		})
   289  	}
   290  }
   291  
   292  func TestTouch(t *testing.T) {
   293  	type args struct {
   294  		name string
   295  	}
   296  	tmpFile := filepath.Join(os.TempDir(), "testtouch")
   297  	tests := []struct {
   298  		name     string
   299  		args     args
   300  		wantPath string
   301  		wantErr  bool
   302  	}{
   303  		{"empty", args{}, "", true},
   304  		{"tmp", args{tmpFile}, tmpFile, false},
   305  	}
   306  	for _, tt := range tests {
   307  		t.Run(tt.name, func(t *testing.T) {
   308  			gotPath, err := filesystem.Touch(tt.args.name)
   309  			if (err != nil) != tt.wantErr {
   310  				t.Errorf("Touch() error = %v, wantErr %v", err, tt.wantErr)
   311  				return
   312  			}
   313  			if gotPath != tt.wantPath {
   314  				t.Errorf("Touch() = %v, want %v", gotPath, tt.wantPath)
   315  			}
   316  		})
   317  	}
   318  	filesystem.Clean(tmpFile)
   319  }