commit 89e2ace7efeb84780eda8a0021ad4a4d89d6f49a
parent 5539fb8d1c088e517344b55c7fa221f9c0667516
Author: Walther Chen <walther.chen@gmail.com>
Date:   Sun,  6 Nov 2022 21:03:44 -0500

parameterize interpret on mem, io; test hello world

Diffstat:
M.gitignore | 1-
Msrc/main.zig | 35++++++++++++++++++++++++-----------
2 files changed, 24 insertions(+), 12 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -1,2 +1 @@ zig-* -test.bz diff --git a/src/main.zig b/src/main.zig @@ -1,5 +1,6 @@ const std = @import("std"); const ArrayList = std.ArrayList; +const expectEqualSlices = std.testing.expectEqualSlices; const MEMORY_SIZE = 30000; @@ -18,15 +19,14 @@ pub fn main() anyerror!void { const src = try f.readToEndAlloc(alloc, 2048); std.debug.print("{s}", .{src}); - try interpret(src); -} - -fn interpret(src: []const u8) !void { - const stdin = std.io.getStdIn(); - const stdout = std.io.getStdOut(); - + var stdin = std.io.getStdIn(); + var stdout = std.io.getStdOut(); var memory = [_]u8{0} ** MEMORY_SIZE; + try interpret(src, &memory, stdin.reader(), stdout.writer()); +} + +fn interpret(src: []const u8, memory: []u8, rdr: anytype, wtr: anytype) !void { var pc: usize = 0; var dataptr: usize = 0; @@ -38,8 +38,8 @@ fn interpret(src: []const u8) !void { '<' => dataptr -= 1, '+' => memory[dataptr] += 1, '-' => memory[dataptr] -= 1, - ',' => memory[dataptr] = try stdin.reader().readByte(), - '.' => try stdout.writer().writeByte(memory[dataptr]), + ',' => memory[dataptr] = try rdr.readByte(), + '.' => try wtr.writeByte(memory[dataptr]), // jumps to next matching ']' if curr_data == 0 '[' => blk: { if (memory[dataptr] != 0) { @@ -93,6 +93,19 @@ fn interpret(src: []const u8) !void { } } -test "basic test" { - try std.testing.expectEqual(10, 3 + 7); +test "hello world" { + const hello_world = "++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++."; + + var list = ArrayList(u8).init(std.testing.allocator); + defer list.deinit(); + + var in_buf: [0]u8 = undefined; + var empty_in = std.io.fixedBufferStream(&in_buf); + + var memory = [_]u8{0} ** 30000; + var rdr = empty_in.reader(); + var wtr = list.writer(); + + try interpret(hello_world, &memory, rdr, wtr); + try expectEqualSlices(u8, "Hello World!\n", list.items); }