mirror of
https://github.com/Ed94/Odin.git
synced 2026-07-28 18:30:06 +00:00
Merge pull request #4877 from laytan/os2-additions
os/os2: recursive directory walker, expose errors in read_directory, file clone
This commit is contained in:
@@ -5,6 +5,7 @@ import "core:log"
|
||||
import "core:path/filepath"
|
||||
import "core:slice"
|
||||
import "core:testing"
|
||||
import "core:strings"
|
||||
|
||||
@(test)
|
||||
test_read_dir :: proc(t: ^testing.T) {
|
||||
@@ -30,3 +31,76 @@ test_read_dir :: proc(t: ^testing.T) {
|
||||
testing.expect_value(t, fis[1].name, "sub")
|
||||
testing.expect_value(t, fis[1].type, os.File_Type.Directory)
|
||||
}
|
||||
|
||||
@(test)
|
||||
test_walker :: proc(t: ^testing.T) {
|
||||
path := filepath.join({#directory, "../dir"})
|
||||
defer delete(path)
|
||||
|
||||
w := os.walker_create(path)
|
||||
defer os.walker_destroy(&w)
|
||||
|
||||
test_walker_internal(t, &w)
|
||||
}
|
||||
|
||||
@(test)
|
||||
test_walker_file :: proc(t: ^testing.T) {
|
||||
path := filepath.join({#directory, "../dir"})
|
||||
defer delete(path)
|
||||
|
||||
f, err := os.open(path)
|
||||
testing.expect_value(t, err, nil)
|
||||
defer os.close(f)
|
||||
|
||||
w := os.walker_create(f)
|
||||
defer os.walker_destroy(&w)
|
||||
|
||||
test_walker_internal(t, &w)
|
||||
}
|
||||
|
||||
test_walker_internal :: proc(t: ^testing.T, w: ^os.Walker) {
|
||||
Seen :: struct {
|
||||
type: os.File_Type,
|
||||
path: string,
|
||||
}
|
||||
|
||||
expected := [?]Seen{
|
||||
{.Regular, filepath.join({"dir", "b.txt"})},
|
||||
{.Directory, filepath.join({"dir", "sub"})},
|
||||
{.Regular, filepath.join({"dir", "sub", ".gitkeep"})},
|
||||
}
|
||||
|
||||
seen: [dynamic]Seen
|
||||
defer delete(seen)
|
||||
|
||||
for info in os.walker_walk(w) {
|
||||
|
||||
errpath, err := os.walker_error(w)
|
||||
testing.expectf(t, err == nil, "walker error for %q: %v", errpath, err)
|
||||
|
||||
append(&seen, Seen{
|
||||
info.type,
|
||||
strings.clone(info.fullpath),
|
||||
})
|
||||
}
|
||||
|
||||
if _, err := os.walker_error(w); err == .Unsupported {
|
||||
log.warn("os2 directory functionality is unsupported, skipping test")
|
||||
return
|
||||
}
|
||||
|
||||
testing.expect_value(t, len(seen), len(expected))
|
||||
|
||||
for expectation in expected {
|
||||
found: bool
|
||||
for entry in seen {
|
||||
if strings.has_suffix(entry.path, expectation.path) {
|
||||
found = true
|
||||
testing.expect_value(t, entry.type, expectation.type)
|
||||
delete(entry.path)
|
||||
}
|
||||
}
|
||||
testing.expectf(t, found, "%q not found in %v", expectation, seen)
|
||||
delete(expectation.path)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
package tests_core_os_os2
|
||||
|
||||
import os "core:os/os2"
|
||||
import "core:testing"
|
||||
import "core:path/filepath"
|
||||
|
||||
@(test)
|
||||
test_clone :: proc(t: ^testing.T) {
|
||||
f, err := os.open(filepath.join({#directory, "file.odin"}, context.temp_allocator))
|
||||
testing.expect_value(t, err, nil)
|
||||
testing.expect(t, f != nil)
|
||||
|
||||
clone: ^os.File
|
||||
clone, err = os.clone(f)
|
||||
testing.expect_value(t, err, nil)
|
||||
testing.expect(t, clone != nil)
|
||||
|
||||
testing.expect_value(t, os.name(clone), os.name(f))
|
||||
testing.expect(t, os.fd(clone) != os.fd(f))
|
||||
|
||||
os.close(f)
|
||||
|
||||
buf: [128]byte
|
||||
n: int
|
||||
n, err = os.read(clone, buf[:])
|
||||
testing.expect_value(t, err, nil)
|
||||
testing.expect(t, n > 13)
|
||||
testing.expect_value(t, string(buf[:13]), "package tests")
|
||||
|
||||
os.close(clone)
|
||||
}
|
||||
Reference in New Issue
Block a user