authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-11-10 14:02:45-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-11-10 14:17:23-05:00
log1ac46fac15953820948b77b94083828f84673641
tree057f8630fc4db8bc02e5e4a56d483d75fcc23fe9
parent336d81894da2c34a77cffd1bf903ad9e4dcaa7aa

add a std lib test for reading and writing files

* fix fstat wrong on darwin * move std.debug.global_allocator to std.debug.global_allocator_state and make it private * add std.debug.global_allocator as a pointer (to upgrade your zig code remove the '&')

13 files changed, 96 insertions(+), 42 deletions(-)

std/array_list.zig+1-1
......@@ -101,7 +101,7 @@ pub fn ArrayList(comptime T: type) -> type{
101101}
102102
103103test "basic ArrayList test" {
104 var list = ArrayList(i32).init(&debug.global_allocator);
104 var list = ArrayList(i32).init(debug.global_allocator);
105105 defer list.deinit();
106106
107107 {var i: usize = 0; while (i < 10) : (i += 1) {
std/buffer.zig+1-1
......@@ -135,7 +135,7 @@ pub const Buffer = struct {
135135test "simple Buffer" {
136136 const cstr = @import("cstr.zig");
137137
138 var buf = %%Buffer.init(&debug.global_allocator, "");
138 var buf = %%Buffer.init(debug.global_allocator, "");
139139 assert(buf.len() == 0);
140140 %%buf.append("hello");
141141 %%buf.appendByte(' ');
std/c/darwin.zig+14-12
......@@ -6,26 +6,28 @@ pub const _errno = __error;
66
77/// Renamed to Stat to not conflict with the stat function.
88pub const Stat = extern struct {
9 dev: u32,
9 dev: i32,
1010 mode: u16,
1111 nlink: u16,
1212 ino: u64,
1313 uid: u32,
1414 gid: u32,
15 rdev: u64,
16
17 atim: timespec,
18 mtim: timespec,
19 ctim: timespec,
20
21 size: u64,
22 blocks: u64,
23 blksize: u32,
15 rdev: i32,
16 atime: usize,
17 atimensec: usize,
18 mtime: usize,
19 mtimensec: usize,
20 ctime: usize,
21 ctimensec: usize,
22 birthtime: usize,
23 birthtimensec: usize,
24 size: i64,
25 blocks: i64,
26 blksize: i32,
2427 flags: u32,
2528 gen: u32,
2629 lspare: i32,
27 qspare: [2]u64,
28
30 qspare: [2]i64,
2931};
3032
3133pub const timespec = extern struct {
std/c/index.zig+1
......@@ -14,6 +14,7 @@ pub extern "c" fn exit(code: c_int) -> noreturn;
1414pub extern "c" fn isatty(fd: c_int) -> c_int;
1515pub extern "c" fn close(fd: c_int) -> c_int;
1616pub extern "c" fn fstat(fd: c_int, buf: &Stat) -> c_int;
17pub extern "c" fn @"fstat$INODE64"(fd: c_int, buf: &Stat) -> c_int;
1718pub extern "c" fn lseek(fd: c_int, offset: isize, whence: c_int) -> isize;
1819pub extern "c" fn open(path: &const u8, oflag: c_int, ...) -> c_int;
1920pub extern "c" fn raise(sig: c_int) -> c_int;
std/debug.zig+4-3
......@@ -38,7 +38,7 @@ fn getStderrStream() -> %&io.OutStream {
3838/// Tries to print a stack trace to stderr, unbuffered, and ignores any error returned.
3939pub fn dumpStackTrace() {
4040 const stderr = getStderrStream() %% return;
41 writeStackTrace(stderr, &global_allocator, stderr_file.isTty(), 1) %% return;
41 writeStackTrace(stderr, global_allocator, stderr_file.isTty(), 1) %% return;
4242}
4343
4444/// This function invokes undefined behavior when `ok` is `false`.
......@@ -86,7 +86,7 @@ pub fn panic(comptime format: []const u8, args: ...) -> noreturn {
8686
8787 const stderr = getStderrStream() %% os.abort();
8888 stderr.print(format ++ "\n", args) %% os.abort();
89 writeStackTrace(stderr, &global_allocator, stderr_file.isTty(), 1) %% os.abort();
89 writeStackTrace(stderr, global_allocator, stderr_file.isTty(), 1) %% os.abort();
9090
9191 os.abort();
9292}
......@@ -967,7 +967,8 @@ fn readILeb128(in_stream: &io.InStream) -> %i64 {
967967 }
968968}
969969
970pub var global_allocator = mem.Allocator {
970pub const global_allocator = &global_allocator_state;
971var global_allocator_state = mem.Allocator {
971972 .allocFn = globalAlloc,
972973 .reallocFn = globalRealloc,
973974 .freeFn = globalFree,
std/hash_map.zig+1-1
......@@ -232,7 +232,7 @@ pub fn HashMap(comptime K: type, comptime V: type,
232232}
233233
234234test "basicHashMapTest" {
235 var map = HashMap(i32, i32, hash_i32, eql_i32).init(&debug.global_allocator);
235 var map = HashMap(i32, i32, hash_i32, eql_i32).init(debug.global_allocator);
236236 defer map.deinit();
237237
238238 assert(%%map.put(1, 11) == null);
std/io.zig+6
......@@ -20,6 +20,12 @@ const fmt = std.fmt;
2020const is_posix = builtin.os != builtin.Os.windows;
2121const is_windows = builtin.os == builtin.Os.windows;
2222
23test "import io tests" {
24 comptime {
25 _ = @import("io_test.zig");
26 }
27}
28
2329/// The function received invalid input at runtime. An Invalid error means a
2430/// bug in the program that called the function.
2531error Invalid;
std/io_test.zig created+45
......@@ -0,0 +1,45 @@
1const std = @import("index.zig");
2const io = std.io;
3const allocator = std.debug.global_allocator;
4const Rand = std.rand.Rand;
5const assert = std.debug.assert;
6const mem = std.mem;
7const os = std.os;
8
9test "write a file, read it, then delete it" {
10 var data: [1024]u8 = undefined;
11 var rng = Rand.init(1234);
12 rng.fillBytes(data[0..]);
13 const tmp_file_name = "temp_test_file.txt";
14 {
15 var file = %%io.File.openWrite(tmp_file_name, allocator);
16 defer file.close();
17
18 var file_out_stream = io.FileOutStream.init(&file);
19 var buf_stream = io.BufferedOutStream.init(&file_out_stream.stream);
20 const st = &buf_stream.stream;
21 %%st.print("begin");
22 %%st.write(data[0..]);
23 %%st.print("end");
24 %%buf_stream.flush();
25 }
26 {
27 var file = %%io.File.openRead(tmp_file_name, allocator);
28 defer file.close();
29
30 const file_size = %%file.getEndPos();
31 const expected_file_size = "begin".len + data.len + "end".len;
32 assert(file_size == expected_file_size);
33
34 var file_in_stream = io.FileInStream.init(&file);
35 var buf_stream = io.BufferedInStream.init(&file_in_stream.stream);
36 const st = &buf_stream.stream;
37 const contents = %%st.readAllAlloc(allocator, 2 * 1024);
38 defer allocator.free(contents);
39
40 assert(mem.eql(u8, contents[0.."begin".len], "begin"));
41 assert(mem.eql(u8, contents["begin".len..contents.len - "end".len], data));
42 assert(mem.eql(u8, contents[contents.len - "end".len ..], "end"));
43 }
44 %%os.deleteFile(allocator, tmp_file_name);
45}
std/linked_list.zig+1-1
......@@ -195,7 +195,7 @@ pub fn LinkedList(comptime T: type) -> type {
195195}
196196
197197test "basic linked list test" {
198 const allocator = &debug.global_allocator;
198 const allocator = debug.global_allocator;
199199 var list = LinkedList(u32).init();
200200
201201 var one = %%list.createNode(1, allocator);
std/mem.zig+2-2
......@@ -331,8 +331,8 @@ pub fn join(allocator: &Allocator, sep: u8, strings: ...) -> %[]u8 {
331331}
332332
333333test "mem.join" {
334 assert(eql(u8, %%join(&debug.global_allocator, ',', "a", "b", "c"), "a,b,c"));
335 assert(eql(u8, %%join(&debug.global_allocator, ',', "a"), "a"));
334 assert(eql(u8, %%join(debug.global_allocator, ',', "a", "b", "c"), "a,b,c"));
335 assert(eql(u8, %%join(debug.global_allocator, ',', "a"), "a"));
336336}
337337
338338test "testStringEquality" {
std/os/darwin.zig+1-1
......@@ -129,7 +129,7 @@ pub fn isatty(fd: i32) -> bool {
129129}
130130
131131pub fn fstat(fd: i32, buf: &c.Stat) -> usize {
132 errnoWrap(c.fstat(fd, buf))
132 errnoWrap(c.@"fstat$INODE64"(fd, buf))
133133}
134134
135135pub fn lseek(fd: i32, offset: isize, whence: c_int) -> usize {
std/os/index.zig+3-4
......@@ -562,7 +562,7 @@ pub fn getCwd(allocator: &Allocator) -> %[]u8 {
562562
563563test "os.getCwd" {
564564 // at least call it so it gets compiled
565 _ = getCwd(&debug.global_allocator);
565 _ = getCwd(debug.global_allocator);
566566}
567567
568568pub fn symLink(allocator: &Allocator, existing_path: []const u8, new_path: []const u8) -> %void {
......@@ -1432,10 +1432,10 @@ test "windows arg parsing" {
14321432fn testWindowsCmdLine(input_cmd_line: &const u8, expected_args: []const []const u8) {
14331433 var it = ArgIteratorWindows.initWithCmdLine(input_cmd_line);
14341434 for (expected_args) |expected_arg| {
1435 const arg = %%??it.next(&debug.global_allocator);
1435 const arg = %%??it.next(debug.global_allocator);
14361436 assert(mem.eql(u8, arg, expected_arg));
14371437 }
1438 assert(it.next(&debug.global_allocator) == null);
1438 assert(it.next(debug.global_allocator) == null);
14391439}
14401440
14411441test "std.os" {
......@@ -1500,4 +1500,3 @@ pub fn isTty(handle: FileHandle) -> bool {
15001500 }
15011501 }
15021502}
1503
std/os/path.zig+16-16
......@@ -41,23 +41,23 @@ pub fn joinPosix(allocator: &Allocator, paths: ...) -> %[]u8 {
4141}
4242
4343test "os.path.join" {
44 assert(mem.eql(u8, %%joinWindows(&debug.global_allocator, "c:\\a\\b", "c"), "c:\\a\\b\\c"));
45 assert(mem.eql(u8, %%joinWindows(&debug.global_allocator, "c:\\a\\b\\", "c"), "c:\\a\\b\\c"));
44 assert(mem.eql(u8, %%joinWindows(debug.global_allocator, "c:\\a\\b", "c"), "c:\\a\\b\\c"));
45 assert(mem.eql(u8, %%joinWindows(debug.global_allocator, "c:\\a\\b\\", "c"), "c:\\a\\b\\c"));
4646
47 assert(mem.eql(u8, %%joinWindows(&debug.global_allocator, "c:\\", "a", "b\\", "c"), "c:\\a\\b\\c"));
48 assert(mem.eql(u8, %%joinWindows(&debug.global_allocator, "c:\\a\\", "b\\", "c"), "c:\\a\\b\\c"));
47 assert(mem.eql(u8, %%joinWindows(debug.global_allocator, "c:\\", "a", "b\\", "c"), "c:\\a\\b\\c"));
48 assert(mem.eql(u8, %%joinWindows(debug.global_allocator, "c:\\a\\", "b\\", "c"), "c:\\a\\b\\c"));
4949
50 assert(mem.eql(u8, %%joinWindows(&debug.global_allocator,
50 assert(mem.eql(u8, %%joinWindows(debug.global_allocator,
5151 "c:\\home\\andy\\dev\\zig\\build\\lib\\zig\\std", "io.zig"),
5252 "c:\\home\\andy\\dev\\zig\\build\\lib\\zig\\std\\io.zig"));
5353
54 assert(mem.eql(u8, %%joinPosix(&debug.global_allocator, "/a/b", "c"), "/a/b/c"));
55 assert(mem.eql(u8, %%joinPosix(&debug.global_allocator, "/a/b/", "c"), "/a/b/c"));
54 assert(mem.eql(u8, %%joinPosix(debug.global_allocator, "/a/b", "c"), "/a/b/c"));
55 assert(mem.eql(u8, %%joinPosix(debug.global_allocator, "/a/b/", "c"), "/a/b/c"));
5656
57 assert(mem.eql(u8, %%joinPosix(&debug.global_allocator, "/", "a", "b/", "c"), "/a/b/c"));
58 assert(mem.eql(u8, %%joinPosix(&debug.global_allocator, "/a/", "b/", "c"), "/a/b/c"));
57 assert(mem.eql(u8, %%joinPosix(debug.global_allocator, "/", "a", "b/", "c"), "/a/b/c"));
58 assert(mem.eql(u8, %%joinPosix(debug.global_allocator, "/a/", "b/", "c"), "/a/b/c"));
5959
60 assert(mem.eql(u8, %%joinPosix(&debug.global_allocator, "/home/andy/dev/zig/build/lib/zig/std", "io.zig"),
60 assert(mem.eql(u8, %%joinPosix(debug.global_allocator, "/home/andy/dev/zig/build/lib/zig/std", "io.zig"),
6161 "/home/andy/dev/zig/build/lib/zig/std/io.zig"));
6262}
6363
......@@ -453,7 +453,7 @@ pub fn resolvePosix(allocator: &Allocator, paths: []const []const u8) -> %[]u8 {
453453}
454454
455455test "os.path.resolve" {
456 const cwd = %%os.getCwd(&debug.global_allocator);
456 const cwd = %%os.getCwd(debug.global_allocator);
457457 if (is_windows) {
458458 assert(mem.eql(u8, testResolveWindows([][]const u8{"."}), cwd));
459459 } else {
......@@ -492,11 +492,11 @@ test "os.path.resolvePosix" {
492492}
493493
494494fn testResolveWindows(paths: []const []const u8) -> []u8 {
495 return %%resolveWindows(&debug.global_allocator, paths);
495 return %%resolveWindows(debug.global_allocator, paths);
496496}
497497
498498fn testResolvePosix(paths: []const []const u8) -> []u8 {
499 return %%resolvePosix(&debug.global_allocator, paths);
499 return %%resolvePosix(debug.global_allocator, paths);
500500}
501501
502502pub fn dirname(path: []const u8) -> []const u8 {
......@@ -899,12 +899,12 @@ test "os.path.relative" {
899899}
900900
901901fn testRelativePosix(from: []const u8, to: []const u8, expected_output: []const u8) {
902 const result = %%relativePosix(&debug.global_allocator, from, to);
902 const result = %%relativePosix(debug.global_allocator, from, to);
903903 assert(mem.eql(u8, result, expected_output));
904904}
905905
906906fn testRelativeWindows(from: []const u8, to: []const u8, expected_output: []const u8) {
907 const result = %%relativeWindows(&debug.global_allocator, from, to);
907 const result = %%relativeWindows(debug.global_allocator, from, to);
908908 assert(mem.eql(u8, result, expected_output));
909909}
910910
......@@ -1022,5 +1022,5 @@ pub fn real(allocator: &Allocator, pathname: []const u8) -> %[]u8 {
10221022
10231023test "os.path.real" {
10241024 // at least call it so it gets compiled
1025 _ = real(&debug.global_allocator, "some_path");
1025 _ = real(debug.global_allocator, "some_path");
10261026}