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:
gingerBill
2025-02-28 14:37:47 +00:00
committed by GitHub
14 changed files with 687 additions and 88 deletions
+74
View File
@@ -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)
}
}
+31
View File
@@ -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)
}