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 }