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:
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);
}