Add tests to I/O module
continuous-integration/drone/push Build is passing Details

This commit is contained in:
kayomn 2022-10-02 23:57:41 +01:00
parent 71d5d696bd
commit f68fbe16c7
2 changed files with 45 additions and 8 deletions

View File

@ -7,7 +7,28 @@ const std = @import("std");
/// ///
pub const Writer = struct { pub const Writer = struct {
context: *anyopaque, context: *anyopaque,
operation: fn (*anyopaque, []const u8) usize, writeContext: fn (*anyopaque, []const u8) usize,
///
///
///
pub const Radix = enum {
binary,
tinary,
quaternary,
quinary,
senary,
septenary,
octal,
nonary,
decimal,
undecimal,
duodecimal,
tridecimal,
tetradecimal,
pentadecimal,
hexadecimal,
};
/// ///
/// Wraps and returns a reference to `write_context` of type `WriteContext` and its associated /// Wraps and returns a reference to `write_context` of type `WriteContext` and its associated
@ -21,7 +42,7 @@ pub const Writer = struct {
return .{ return .{
.context = write_context, .context = write_context,
.operation = struct { .writeContext = struct {
fn write(context: *anyopaque, buffer: []const u8) usize { fn write(context: *anyopaque, buffer: []const u8) usize {
return writeContext(@ptrCast(*WriteContext, return writeContext(@ptrCast(*WriteContext,
@alignCast(@alignOf(WriteContext), context)), buffer); @alignCast(@alignOf(WriteContext), context)), buffer);
@ -35,7 +56,7 @@ pub const Writer = struct {
/// were successfully written. /// were successfully written.
/// ///
pub fn write(writer: Writer, buffer: []const u8) usize { pub fn write(writer: Writer, buffer: []const u8) usize {
return writer.operation(writer.context, buffer); return writer.writeContext(writer.context, buffer);
} }
/// ///
@ -43,7 +64,7 @@ pub const Writer = struct {
/// otherwise `false`. /// otherwise `false`.
/// ///
pub fn writeByte(writer: Writer, byte: u8) bool { pub fn writeByte(writer: Writer, byte: u8) bool {
return (writer.operation(writer.context, return (writer.writeContext(writer.context,
@ptrCast([*]const u8, &byte)[0 .. 1]) != 0); @ptrCast([*]const u8, &byte)[0 .. 1]) != 0);
} }
@ -51,10 +72,10 @@ pub const Writer = struct {
/// Writes `value` as a ASCII / UTF-8 encoded integer to `writer`, returning `true` if the full /// Writes `value` as a ASCII / UTF-8 encoded integer to `writer`, returning `true` if the full
/// sequence was successfully written, otherwise `false`. /// sequence was successfully written, otherwise `false`.
/// ///
/// The `base` argument identifies which base system to encode `value` as, with `10` being /// The `radix` argument identifies which base system to encode `value` as, with `10` being
/// decimal, `16` being hexadecimal, `8` being octal`, so on and so forth. /// decimal, `16` being hexadecimal, `8` being octal`, so on and so forth.
/// ///
pub fn writeInt(writer: Writer, value: anytype, base: u4) bool { pub fn writeInt(writer: Writer, radix: Radix, value: anytype) bool {
const Int = @TypeOf(value); const Int = @TypeOf(value);
const type_info = @typeInfo(Int); const type_info = @typeInfo(Int);
@ -62,6 +83,7 @@ pub const Writer = struct {
if (value == 0) return writer.writeByte('0'); if (value == 0) return writer.writeByte('0');
// TODO: Unhardcode this as it will break with large ints.
var buffer = std.mem.zeroes([28]u8); var buffer = std.mem.zeroes([28]u8);
var buffer_count = @as(usize, 0); var buffer_count = @as(usize, 0);
var n1 = value; var n1 = value;
@ -74,6 +96,8 @@ pub const Writer = struct {
} }
while (n1 != 0) { while (n1 != 0) {
const base = @enumToInt(radix);
buffer[buffer_count] = @intCast(u8, (n1 % base) + '0'); buffer[buffer_count] = @intCast(u8, (n1 % base) + '0');
n1 = (n1 / base); n1 = (n1 / base);
buffer_count += 1; buffer_count += 1;
@ -106,3 +130,16 @@ pub const null_writer = Writer{
} }
}.write, }.write,
}; };
test {
const testing = std.testing;
{
const sequence = "foo";
testing.expectEqual(null_writer.write(sequence), sequence.len);
}
testing.expect(null_writer.writeByte(0));
testing.expect(null_writer.writeInt(.decimal, 420));
}

View File

@ -15,7 +15,7 @@ pub fn main() anyerror!void {
} }
test { test {
_ = @import("./mem.zig");
} }
fn run(event_loop: *sys.EventLoop, graphics: *sys.GraphicsContext) anyerror!void { fn run(event_loop: *sys.EventLoop, graphics: *sys.GraphicsContext) anyerror!void {
@ -27,7 +27,7 @@ fn run(event_loop: *sys.EventLoop, graphics: *sys.GraphicsContext) anyerror!void
const file_access = try event_loop.open(.readonly, const file_access = try event_loop.open(.readonly,
try sys.FileSystem.data.joinedPath(&.{"data", "ona.lua"})); try sys.FileSystem.data.joinedPath(&.{"data", "ona.lua"}));
defer _ = event_loop.close(file_access); defer event_loop.close(file_access);
const file_size = try file_access.size(event_loop); const file_size = try file_access.size(event_loop);
const allocator = gpa.allocator(); const allocator = gpa.allocator();