IR: port more tests

master
Andrew Kelley 2016-12-26 01:37:33 -05:00
parent 2b5c7b1b8e
commit 1b5d1877ae
4 changed files with 84 additions and 32 deletions

View File

@ -1,31 +0,0 @@
const std = @import("std");
const assert = std.debug.assert;
const io = std.io;
const str = std.str;
enum ET {
SINT: i32,
UINT: u32,
pub fn print(a: &ET, buf: []u8) -> %usize {
return switch (*a) {
SINT => |x| { io.bufPrintInt(i32, buf, x) },
UINT => |x| { io.bufPrintInt(u32, buf, x) },
}
}
}
fn enumWithMembers() {
@setFnTest(this, true);
const a = ET.SINT { -42 };
const b = ET.UINT { 42 };
var buf: [20]u8 = undefined;
assert(%%a.print(buf) == 3);
assert(str.eql(buf[0...3], "-42"));
assert(%%b.print(buf) == 2);
assert(str.eql(buf[0...2], "42"));
}

View File

@ -0,0 +1,83 @@
const ET = enum {
SINT: i32,
UINT: u32,
pub fn print(a: &ET, buf: []u8) -> %usize {
return switch (*a) {
ET.SINT => |x| { bufPrintInt(i32, buf, x) },
ET.UINT => |x| { bufPrintInt(u32, buf, x) },
}
}
};
fn enumWithMembers() {
@setFnTest(this);
const a = ET.SINT { -42 };
const b = ET.UINT { 42 };
var buf: [20]u8 = undefined;
assert(%%a.print(buf) == 3);
assert(memeql(buf[0...3], "-42"));
assert(%%b.print(buf) == 2);
assert(memeql(buf[0...2], "42"));
}
// TODO all the below should be imported from std
const max_u64_base10_digits = 20;
pub fn bufPrintInt(inline T: type, out_buf: []u8, x: T) -> usize {
if (T.is_signed) bufPrintSigned(T, out_buf, x) else bufPrintUnsigned(T, out_buf, x)
}
fn bufPrintSigned(inline T: type, out_buf: []u8, x: T) -> usize {
const uint = @intType(false, T.bit_count);
if (x < 0) {
out_buf[0] = '-';
return 1 + bufPrintUnsigned(uint, out_buf[1...], uint(-(x + 1)) + 1);
} else {
return bufPrintUnsigned(uint, out_buf, uint(x));
}
}
fn bufPrintUnsigned(inline T: type, out_buf: []u8, x: T) -> usize {
var buf: [max_u64_base10_digits]u8 = undefined;
var a = x;
var index: usize = buf.len;
while (true) {
const digit = a % 10;
index -= 1;
buf[index] = '0' + u8(digit);
a /= 10;
if (a == 0)
break;
}
const len = buf.len - index;
@memcpy(&out_buf[0], &buf[index], len);
return len;
}
// TODO const assert = @import("std").debug.assert;
fn assert(ok: bool) {
if (!ok)
@unreachable();
}
// TODO import from std.str
pub fn memeql(a: []const u8, b: []const u8) -> bool {
sliceEql(u8, a, b)
}
// TODO import from std.str
pub fn sliceEql(inline T: type, a: []const T, b: []const T) -> bool {
if (a.len != b.len) return false;
for (a) |item, index| {
if (b[index] != item) return false;
}
return true;
}

View File

@ -2,7 +2,6 @@ const std = @import("std");
const assert = std.debug.assert;
const str = std.str;
const cstr = std.cstr;
const test_enum_with_members = @import("cases/enum_with_members.zig");
fn explicitCastMaybePointers() {

View File

@ -6,6 +6,7 @@ const test_cast= @import("cases3/cast.zig");
const test_const_slice_child = @import("cases3/const_slice_child.zig");
const test_defer = @import("cases3/defer.zig");
const test_enum = @import("cases3/enum.zig");
const test_enum_with_members = @import("cases3/enum_with_members.zig");
const test_error = @import("cases3/error.zig");
const test_eval = @import("cases3/eval.zig");
const test_fn = @import("cases3/fn.zig");