Commit 706e0d739e

Jimmi Holst Christensen <jhc@liab.dk>
2018-04-10 13:49:52
std.zig.parser readded all tests * Ops!
1 parent 1b81e40
Changed files (1)
std
std/zig/parser.zig
@@ -1119,12 +1119,6 @@ pub const Parser = struct {
                 },
 
                 State.TypeExprBegin => |dest_ptr| {
-                    const token = self.getNextToken();
-                    if (token.id == Token.Id.Keyword_var) {
-                        @panic("TODO param with type var");
-                    }
-                    self.putBackToken(token);
-
                     stack.append(State { .TypeExprEnd = dest_ptr }) catch unreachable;
                     try stack.append(State { .PrefixOpExpression = dest_ptr });
                     continue;
@@ -1160,9 +1154,6 @@ pub const Parser = struct {
                             try stack.append(State { .AddrOfModifiers = &node.op.AddrOf });
                         }
                         continue;
-                        //Token.Id.Keyword_await => {
-                        //    @panic("TODO: await");
-                        //},
                     } else {
                         self.putBackToken(token);
                         stack.append(State { .SuffixOpExpressionBegin = dest_ptr }) catch unreachable;
@@ -1408,7 +1399,6 @@ pub const Parser = struct {
                             continue;
                         },
                         Token.Id.LBracket => {
-                            // TODO: option("align" "(" Expression option(":" Integer ":" Integer) ")")) option("const") option("volatile")
                             const rbracket_token = self.getNextToken();
                             if (rbracket_token.id == Token.Id.RBracket) {
                                 const node = try self.createPrefixOp(arena, token, ast.NodePrefixOp.PrefixOp{
@@ -4222,760 +4212,765 @@ fn testCanonical(source: []const u8) !void {
     }
 }
 
-//test "zig fmt: get stdout or fail" {
-//    try testCanonical(
-//        \\const std = @import("std");
-//        \\
-//        \\pub fn main() !void {
-//        \\    // If this program is run without stdout attached, exit with an error.
-//        \\    // another comment
-//        \\    var stdout_file = try std.io.getStdOut;
-//        \\}
-//        \\
-//    );
-//}
-//
-//test "zig fmt: preserve spacing" {
-//    try testCanonical(
-//        \\const std = @import("std");
-//        \\
-//        \\pub fn main() !void {
-//        \\    var stdout_file = try std.io.getStdOut;
-//        \\    var stdout_file = try std.io.getStdOut;
-//        \\
-//        \\    var stdout_file = try std.io.getStdOut;
-//        \\    var stdout_file = try std.io.getStdOut;
-//        \\}
-//        \\
-//    );
-//}
-//
-//test "zig fmt: return types" {
-//    try testCanonical(
-//        \\pub fn main() !void {}
-//        \\pub fn main() var {}
-//        \\pub fn main() i32 {}
-//        \\
-//    );
-//}
-//
-//test "zig fmt: imports" {
-//    try testCanonical(
-//        \\const std = @import("std");
-//        \\const std = @import();
-//        \\
-//    );
-//}
-//
-//test "zig fmt: global declarations" {
-//    try testCanonical(
-//        \\const a = b;
-//        \\pub const a = b;
-//        \\var a = b;
-//        \\pub var a = b;
-//        \\const a: i32 = b;
-//        \\pub const a: i32 = b;
-//        \\var a: i32 = b;
-//        \\pub var a: i32 = b;
-//        \\extern const a: i32 = b;
-//        \\pub extern const a: i32 = b;
-//        \\extern var a: i32 = b;
-//        \\pub extern var a: i32 = b;
-//        \\extern "a" const a: i32 = b;
-//        \\pub extern "a" const a: i32 = b;
-//        \\extern "a" var a: i32 = b;
-//        \\pub extern "a" var a: i32 = b;
-//        \\
-//    );
-//}
-//
-//test "zig fmt: extern declaration" {
-//    try testCanonical(
-//        \\extern var foo: c_int;
-//        \\
-//    );
-//}
-//
-//test "zig fmt: alignment" {
-//        try testCanonical(
-//        \\var foo: c_int align(1);
-//        \\
-//    );
-//}
-//
-//test "zig fmt: C main" {
-//    try testCanonical(
-//        \\fn main(argc: c_int, argv: &&u8) c_int {
-//        \\    const a = b;
-//        \\}
-//        \\
-//    );
-//}
-//
-//test "zig fmt: return" {
-//    try testCanonical(
-//        \\fn foo(argc: c_int, argv: &&u8) c_int {
-//        \\    return 0;
-//        \\}
-//        \\
-//        \\fn bar() void {
-//        \\    return;
-//        \\}
-//        \\
-//    );
-//}
-//
-//test "zig fmt: pointer attributes" {
-//    try testCanonical(
-//        \\extern fn f1(s: &align(&u8) u8) c_int;
-//        \\extern fn f2(s: &&align(1) &const &volatile u8) c_int;
-//        \\extern fn f3(s: &align(1) const &align(1) volatile &const volatile u8) c_int;
-//        \\extern fn f4(s: &align(1) const volatile u8) c_int;
-//        \\
-//    );
-//}
-//
-//test "zig fmt: slice attributes" {
-//    try testCanonical(
-//        \\extern fn f1(s: &align(&u8) u8) c_int;
-//        \\extern fn f2(s: &&align(1) &const &volatile u8) c_int;
-//        \\extern fn f3(s: &align(1) const &align(1) volatile &const volatile u8) c_int;
-//        \\extern fn f4(s: &align(1) const volatile u8) c_int;
-//        \\
-//    );
-//}
-//
-//test "zig fmt: test declaration" {
-//     try testCanonical(
-//        \\test "test name" {
-//        \\    const a = 1;
-//        \\    var b = 1;
-//        \\}
-//        \\
-//    );
-//}
-//
-//test "zig fmt: infix operators" {
-//    try testCanonical(
-//        \\test "infix operators" {
-//        \\    var i = undefined;
-//        \\    i = 2;
-//        \\    i *= 2;
-//        \\    i |= 2;
-//        \\    i ^= 2;
-//        \\    i <<= 2;
-//        \\    i >>= 2;
-//        \\    i &= 2;
-//        \\    i *= 2;
-//        \\    i *%= 2;
-//        \\    i -= 2;
-//        \\    i -%= 2;
-//        \\    i += 2;
-//        \\    i +%= 2;
-//        \\    i /= 2;
-//        \\    i %= 2;
-//        \\    _ = i == i;
-//        \\    _ = i != i;
-//        \\    _ = i != i;
-//        \\    _ = i.i;
-//        \\    _ = i || i;
-//        \\    _ = i!i;
-//        \\    _ = i ** i;
-//        \\    _ = i ++ i;
-//        \\    _ = i ?? i;
-//        \\    _ = i % i;
-//        \\    _ = i / i;
-//        \\    _ = i *% i;
-//        \\    _ = i * i;
-//        \\    _ = i -% i;
-//        \\    _ = i - i;
-//        \\    _ = i +% i;
-//        \\    _ = i + i;
-//        \\    _ = i << i;
-//        \\    _ = i >> i;
-//        \\    _ = i & i;
-//        \\    _ = i ^ i;
-//        \\    _ = i | i;
-//        \\    _ = i >= i;
-//        \\    _ = i <= i;
-//        \\    _ = i > i;
-//        \\    _ = i < i;
-//        \\    _ = i and i;
-//        \\    _ = i or i;
-//        \\}
-//        \\
-//    );
-//}
-//
-//test "zig fmt: precedence" {
-//    try testCanonical(
-//        \\test "precedence" {
-//        \\    a!b();
-//        \\    (a!b)();
-//        \\    !a!b;
-//        \\    !(a!b);
-//        \\    !a{ };
-//        \\    !(a{ });
-//        \\    a + b{ };
-//        \\    (a + b){ };
-//        \\    a << b + c;
-//        \\    (a << b) + c;
-//        \\    a & b << c;
-//        \\    (a & b) << c;
-//        \\    a ^ b & c;
-//        \\    (a ^ b) & c;
-//        \\    a | b ^ c;
-//        \\    (a | b) ^ c;
-//        \\    a == b | c;
-//        \\    (a == b) | c;
-//        \\    a and b == c;
-//        \\    (a and b) == c;
-//        \\    a or b and c;
-//        \\    (a or b) and c;
-//        \\    (a or b) and c;
-//        \\}
-//        \\
-//    );
-//}
-//
-//test "zig fmt: prefix operators" {
-//    try testCanonical(
-//        \\test "prefix operators" {
-//        \\    try return --%~??!*&0;
-//        \\}
-//        \\
-//    );
-//}
-//
-//test "zig fmt: call expression" {
-//    try testCanonical(
-//        \\test "test calls" {
-//        \\    a();
-//        \\    a(1);
-//        \\    a(1, 2);
-//        \\    a(1, 2) + a(1, 2);
-//        \\}
-//        \\
-//    );
-//}
-//
-//test "zig fmt: var args" {
-//    try testCanonical(
-//        \\fn print(args: ...) void {}
-//        \\
-//    );
-//}
-//
-//test "zig fmt: extern function" {
-//    try testCanonical(
-//        \\extern fn puts(s: &const u8) c_int;
-//        \\extern "c" fn puts(s: &const u8) c_int;
-//        \\
-//    );
-//}
-//
-//test "zig fmt: multiline string" {
-//    try testCanonical(
-//        \\const s = 
-//        \\    \\ something
-//        \\    \\ something else
-//        \\    ;
-//        \\
-//    );
-//}
-//
-//test "zig fmt: values" {
-//    try testCanonical(
-//        \\test "values" {
-//        \\    1;
-//        \\    1.0;
-//        \\    "string";
-//        \\    c"cstring";
-//        \\    'c';
-//        \\    true;
-//        \\    false;
-//        \\    null;
-//        \\    undefined;
-//        \\    error;
-//        \\    this;
-//        \\    unreachable;
-//        \\}
-//        \\
-//    );
-//}
-//
-//test "zig fmt: indexing" {
-//    try testCanonical(
-//        \\test "test index" {
-//        \\    a[0];
-//        \\    a[0 + 5];
-//        \\    a[0..];
-//        \\    a[0..5];
-//        \\    a[a[0]];
-//        \\    a[a[0..]];
-//        \\    a[a[0..5]];
-//        \\    a[a[0]..];
-//        \\    a[a[0..5]..];
-//        \\    a[a[0]..a[0]];
-//        \\    a[a[0..5]..a[0]];
-//        \\    a[a[0..5]..a[0..5]];
-//        \\}
-//        \\
-//    );
-//}
-//
-//test "zig fmt: struct declaration" {
-//    try testCanonical(
-//        \\const S = struct {
-//        \\    const Self = this;
-//        \\    f1: u8,
-//        \\
-//        \\    fn method(self: &Self) Self {
-//        \\        return *self;
-//        \\    }
-//        \\
-//        \\    f2: u8
-//        \\};
-//        \\
-//        \\const Ps = packed struct {
-//        \\    a: u8,
-//        \\    b: u8,
-//        \\
-//        \\    c: u8
-//        \\};
-//        \\
-//        \\const Es = extern struct {
-//        \\    a: u8,
-//        \\    b: u8,
-//        \\
-//        \\    c: u8
-//        \\};
-//        \\
-//    );
-//}
-//
-//test "zig fmt: enum declaration" {
-//      try testCanonical(
-//        \\const E = enum {
-//        \\    Ok,
-//        \\    SomethingElse = 0
-//        \\};
-//        \\
-//        \\const E2 = enum(u8) {
-//        \\    Ok,
-//        \\    SomethingElse = 255,
-//        \\    SomethingThird
-//        \\};
-//        \\
-//        \\const Ee = extern enum {
-//        \\    Ok,
-//        \\    SomethingElse,
-//        \\    SomethingThird
-//        \\};
-//        \\
-//        \\const Ep = packed enum {
-//        \\    Ok,
-//        \\    SomethingElse,
-//        \\    SomethingThird
-//        \\};
-//        \\
-//    );
-//}
-//
-//test "zig fmt: union declaration" {
-//      try testCanonical(
-//        \\const U = union {
-//        \\    Int: u8,
-//        \\    Float: f32,
-//        \\    None,
-//        \\    Bool: bool
-//        \\};
-//        \\
-//        \\const Ue = union(enum) {
-//        \\    Int: u8,
-//        \\    Float: f32,
-//        \\    None,
-//        \\    Bool: bool
-//        \\};
-//        \\
-//        \\const E = enum {
-//        \\    Int,
-//        \\    Float,
-//        \\    None,
-//        \\    Bool
-//        \\};
-//        \\
-//        \\const Ue2 = union(E) {
-//        \\    Int: u8,
-//        \\    Float: f32,
-//        \\    None,
-//        \\    Bool: bool
-//        \\};
-//        \\
-//        \\const Eu = extern union {
-//        \\    Int: u8,
-//        \\    Float: f32,
-//        \\    None,
-//        \\    Bool: bool
-//        \\};
-//        \\
-//    );
-//}
-//
-//test "zig fmt: error set declaration" {
-//      try testCanonical(
-//        \\const E = error {
-//        \\    A,
-//        \\    B,
-//        \\
-//        \\    C
-//        \\};
-//        \\
-//    );
-//}
-//
-//test "zig fmt: arrays" {
-//    try testCanonical(
-//        \\test "test array" {
-//        \\    const a: [2]u8 = [2]u8{ 1, 2 };
-//        \\    const a: [2]u8 = []u8{ 1, 2 };
-//        \\    const a: [0]u8 = []u8{ };
-//        \\}
-//        \\
-//    );
-//}
-//
-//test "zig fmt: container initializers" {
-//    try testCanonical(
-//        \\const a1 = []u8{ };
-//        \\const a2 = []u8{ 1, 2, 3, 4 };
-//        \\const s1 = S{ };
-//        \\const s2 = S{ .a = 1, .b = 2 };
-//        \\
-//    );
-//}
-//
-//test "zig fmt: catch" {
-//    try testCanonical(
-//        \\test "catch" {
-//        \\    const a: error!u8 = 0;
-//        \\    _ = a catch return;
-//        \\    _ = a catch |err| return;
-//        \\}
-//        \\
-//    );
-//}
-//
-//test "zig fmt: blocks" {
-//    try testCanonical(
-//        \\test "blocks" {
-//        \\    {
-//        \\        const a = 0;
-//        \\        const b = 0;
-//        \\    }
-//        \\
-//        \\    blk: {
-//        \\        const a = 0;
-//        \\        const b = 0;
-//        \\    }
-//        \\
-//        \\    const r = blk: {
-//        \\        const a = 0;
-//        \\        const b = 0;
-//        \\    };
-//        \\}
-//        \\
-//    );
-//}
-//
-//test "zig fmt: switch" {
-//    try testCanonical(
-//        \\test "switch" {
-//        \\    switch (0) {
-//        \\        0 => {},
-//        \\        1 => unreachable,
-//        \\        2, 3 => {},
-//        \\        4 ... 7 => {},
-//        \\        1 + 4 * 3 + 22 => {},
-//        \\        else => {
-//        \\            const a = 1;
-//        \\            const b = a;
-//        \\        }
-//        \\    }
-//        \\
-//        \\    const res = switch (0) {
-//        \\        0 => 0,
-//        \\        1 => 2,
-//        \\        else => 4
-//        \\    };
-//        \\
-//        \\    const Union = union(enum) {
-//        \\        Int: i64,
-//        \\        Float: f64
-//        \\    };
-//        \\
-//        \\    const u = Union{ .Int = 0 };
-//        \\    switch (u) {
-//        \\        Union.Int => |int| {},
-//        \\        Union.Float => |*float| unreachable
-//        \\    }
-//        \\}
-//        \\
-//    );
-//}
-//
-//test "zig fmt: while" {
-//    try testCanonical(
-//        \\test "while" {
-//        \\    while (10 < 1) {
-//        \\        unreachable;
-//        \\    }
-//        \\
-//        \\    while (10 < 1)
-//        \\        unreachable;
-//        \\
-//        \\    var i: usize = 0;
-//        \\    while (i < 10) : (i += 1) {
-//        \\        continue;
-//        \\    }
-//        \\
-//        \\    i = 0;
-//        \\    while (i < 10) : (i += 1)
-//        \\        continue;
-//        \\
-//        \\    i = 0;
-//        \\    var j: usize = 0;
-//        \\    while (i < 10) : ({
-//        \\        i += 1;
-//        \\        j += 1;
-//        \\    }) {
-//        \\        continue;
-//        \\    }
-//        \\
-//        \\    var a: ?u8 = 2;
-//        \\    while (a) |v| : (a = null) {
-//        \\        continue;
-//        \\    }
-//        \\
-//        \\    while (a) |v| : (a = null)
-//        \\        unreachable;
-//        \\
-//        \\    label: while (10 < 0) {
-//        \\        unreachable;
-//        \\    }
-//        \\
-//        \\    const res = while (0 < 10) {
-//        \\        break 7;
-//        \\    } else {
-//        \\        unreachable;
-//        \\    };
-//        \\
-//        \\    var a: error!u8 = 0;
-//        \\    while (a) |v| {
-//        \\        a = error.Err;
-//        \\    } else |err| {
-//        \\        i = 1;
-//        \\    }
-//        \\
-//        \\    comptime var k: usize = 0;
-//        \\    inline while (i < 10) : (i += 1)
-//        \\        j += 2;
-//        \\}
-//        \\
-//    );
-//}
-//
-//test "zig fmt: for" {
-//    try testCanonical(
-//        \\test "for" {
-//        \\    const a = []u8{ 1, 2, 3 };
-//        \\    for (a) |v| {
-//        \\        continue;
-//        \\    }
-//        \\
-//        \\    for (a) |v|
-//        \\        continue;
-//        \\
-//        \\    for (a) |*v|
-//        \\        continue;
-//        \\
-//        \\    for (a) |v, i| {
-//        \\        continue;
-//        \\    }
-//        \\
-//        \\    for (a) |v, i|
-//        \\        continue;
-//        \\
-//        \\    const res = for (a) |v, i| {
-//        \\        break v;
-//        \\    } else {
-//        \\        unreachable;
-//        \\    };
-//        \\
-//        \\    var num: usize = 0;
-//        \\    inline for (a) |v, i| {
-//        \\        num += v;
-//        \\        num += i;
-//        \\    }
-//        \\}
-//        \\
-//    );
-//}
-//
-//test "zig fmt: if" {
-//    try testCanonical(
-//        \\test "if" {
-//        \\    if (10 < 0) {
-//        \\        unreachable;
-//        \\    }
-//        \\
-//        \\    if (10 < 0) unreachable;
-//        \\
-//        \\    if (10 < 0) {
-//        \\        unreachable;
-//        \\    } else {
-//        \\        const a = 20;
-//        \\    }
-//        \\
-//        \\    if (10 < 0) {
-//        \\        unreachable;
-//        \\    } else if (5 < 0) {
-//        \\        unreachable;
-//        \\    } else {
-//        \\        const a = 20;
-//        \\    }
-//        \\
-//        \\    const is_world_broken = if (10 < 0) true else false;
-//        \\
-//        \\    const a: ?u8 = 10;
-//        \\    const b: ?u8 = null;
-//        \\    if (a) |v| {
-//        \\        const some = v;
-//        \\    } else if (b) |*v| {
-//        \\        unreachable;
-//        \\    } else {
-//        \\        const some = 10;
-//        \\    }
-//        \\
-//        \\    const non_null_a = if (a) |v| v else 0;
-//        \\
-//        \\    const a_err: error!u8 = 0;
-//        \\    if (a_err) |v| {
-//        \\        const p = v;
-//        \\    } else |err| {
-//        \\        unreachable;
-//        \\    }
-//        \\}
-//        \\
-//    );
-//}
-//
-//test "zig fmt: defer" {
-//    try testCanonical(
-//        \\test "defer" {
-//        \\    var i: usize = 0;
-//        \\    defer i = 1;
-//        \\    defer {
-//        \\        i += 2;
-//        \\        i *= i;
-//        \\    }
-//        \\
-//        \\    errdefer i += 3;
-//        \\    errdefer {
-//        \\        i += 2;
-//        \\        i /= i;
-//        \\    }
-//        \\}
-//        \\
-//    );
-//}
-//
-//test "zig fmt: comptime" {
-//    try testCanonical(
-//        \\fn a() u8 {
-//        \\    return 5;
-//        \\}
-//        \\
-//        \\fn b(comptime i: u8) u8 {
-//        \\    return i;
-//        \\}
-//        \\
-//        \\const av = comptime a();
-//        \\const av2 = comptime blk: {
-//        \\    var res = a();
-//        \\    res *= b(2);
-//        \\    break :blk res;
-//        \\};
-//        \\
-//        \\comptime {
-//        \\    _ = a();
-//        \\}
-//        \\
-//        \\test "comptime" {
-//        \\    const av3 = comptime a();
-//        \\    const av4 = comptime blk: {
-//        \\        var res = a();
-//        \\        res *= a();
-//        \\        break :blk res;
-//        \\    };
-//        \\
-//        \\    comptime var i = 0;
-//        \\    comptime {
-//        \\        i = a();
-//        \\        i += b(i);
-//        \\    }
-//        \\}
-//        \\
-//    );
-//}
-//
-//test "zig fmt: fn type" {
-//    try testCanonical(
-//        \\fn a(i: u8) u8 {
-//        \\    return i + 1;
-//        \\}
-//        \\
-//        \\const a: fn(u8) u8 = undefined;
-//        \\const b: extern fn(u8) u8 = undefined;
-//        \\const c: nakedcc fn(u8) u8 = undefined;
-//        \\const ap: fn(u8) u8 = a;
-//        \\
-//    );
-//}
-//
-//test "zig fmt: inline asm" {
-//    try testCanonical(
-//        \\pub fn syscall1(number: usize, arg1: usize) usize {
-//        \\    return asm volatile ("syscall"
-//        \\        : [ret] "={rax}" (-> usize)
-//        \\        : [number] "{rax}" (number),
-//        \\          [arg1] "{rdi}" (arg1)
-//        \\        : "rcx", "r11");
-//        \\}
-//        \\
-//    );
-//}
-//
-//test "zig fmt: coroutines" {
-//    try testCanonical(
-//        \\async fn simpleAsyncFn() void {
-//        \\    x += 1;
-//        \\    suspend;
-//        \\    x += 1;
-//        \\    suspend |p| {}
-//        \\    const p = async simpleAsyncFn() catch unreachable;
-//        \\    await p;
-//        \\}
-//        \\
-//        \\test "coroutine suspend, resume, cancel" {
-//        \\    const p = try async<std.debug.global_allocator> testAsyncSeq();
-//        \\    resume p;
-//        \\    cancel p;
-//        \\}
-//        \\
-//    );
-//}
+test "zig fmt: get stdout or fail" {
+    try testCanonical(
+        \\const std = @import("std");
+        \\
+        \\pub fn main() !void {
+        \\    // If this program is run without stdout attached, exit with an error.
+        \\    // another comment
+        \\    var stdout_file = try std.io.getStdOut;
+        \\}
+        \\
+    );
+}
+
+test "zig fmt: preserve spacing" {
+    try testCanonical(
+        \\const std = @import("std");
+        \\
+        \\pub fn main() !void {
+        \\    var stdout_file = try std.io.getStdOut;
+        \\    var stdout_file = try std.io.getStdOut;
+        \\
+        \\    var stdout_file = try std.io.getStdOut;
+        \\    var stdout_file = try std.io.getStdOut;
+        \\}
+        \\
+    );
+}
+
+test "zig fmt: return types" {
+    try testCanonical(
+        \\pub fn main() !void {}
+        \\pub fn main() var {}
+        \\pub fn main() i32 {}
+        \\
+    );
+}
+
+test "zig fmt: imports" {
+    try testCanonical(
+        \\const std = @import("std");
+        \\const std = @import();
+        \\
+    );
+}
+
+test "zig fmt: global declarations" {
+    try testCanonical(
+        \\const a = b;
+        \\pub const a = b;
+        \\var a = b;
+        \\pub var a = b;
+        \\const a: i32 = b;
+        \\pub const a: i32 = b;
+        \\var a: i32 = b;
+        \\pub var a: i32 = b;
+        \\extern const a: i32 = b;
+        \\pub extern const a: i32 = b;
+        \\extern var a: i32 = b;
+        \\pub extern var a: i32 = b;
+        \\extern "a" const a: i32 = b;
+        \\pub extern "a" const a: i32 = b;
+        \\extern "a" var a: i32 = b;
+        \\pub extern "a" var a: i32 = b;
+        \\
+    );
+}
+
+test "zig fmt: extern declaration" {
+    try testCanonical(
+        \\extern var foo: c_int;
+        \\
+    );
+}
+
+test "zig fmt: alignment" {
+        try testCanonical(
+        \\var foo: c_int align(1);
+        \\
+    );
+}
+
+test "zig fmt: C main" {
+    try testCanonical(
+        \\fn main(argc: c_int, argv: &&u8) c_int {
+        \\    const a = b;
+        \\}
+        \\
+    );
+}
+
+test "zig fmt: return" {
+    try testCanonical(
+        \\fn foo(argc: c_int, argv: &&u8) c_int {
+        \\    return 0;
+        \\}
+        \\
+        \\fn bar() void {
+        \\    return;
+        \\}
+        \\
+    );
+}
 
-test "1" {
-    try testCanonical(@embedFile("../array_list.zig"));
+test "zig fmt: pointer attributes" {
+    try testCanonical(
+        \\extern fn f1(s: &align(&u8) u8) c_int;
+        \\extern fn f2(s: &&align(1) &const &volatile u8) c_int;
+        \\extern fn f3(s: &align(1) const &align(1) volatile &const volatile u8) c_int;
+        \\extern fn f4(s: &align(1) const volatile u8) c_int;
+        \\
+    );
 }
+
+test "zig fmt: slice attributes" {
+    try testCanonical(
+        \\extern fn f1(s: &align(&u8) u8) c_int;
+        \\extern fn f2(s: &&align(1) &const &volatile u8) c_int;
+        \\extern fn f3(s: &align(1) const &align(1) volatile &const volatile u8) c_int;
+        \\extern fn f4(s: &align(1) const volatile u8) c_int;
+        \\
+    );
+}
+
+test "zig fmt: test declaration" {
+     try testCanonical(
+        \\test "test name" {
+        \\    const a = 1;
+        \\    var b = 1;
+        \\}
+        \\
+    );
+}
+
+test "zig fmt: infix operators" {
+    try testCanonical(
+        \\test "infix operators" {
+        \\    var i = undefined;
+        \\    i = 2;
+        \\    i *= 2;
+        \\    i |= 2;
+        \\    i ^= 2;
+        \\    i <<= 2;
+        \\    i >>= 2;
+        \\    i &= 2;
+        \\    i *= 2;
+        \\    i *%= 2;
+        \\    i -= 2;
+        \\    i -%= 2;
+        \\    i += 2;
+        \\    i +%= 2;
+        \\    i /= 2;
+        \\    i %= 2;
+        \\    _ = i == i;
+        \\    _ = i != i;
+        \\    _ = i != i;
+        \\    _ = i.i;
+        \\    _ = i || i;
+        \\    _ = i!i;
+        \\    _ = i ** i;
+        \\    _ = i ++ i;
+        \\    _ = i ?? i;
+        \\    _ = i % i;
+        \\    _ = i / i;
+        \\    _ = i *% i;
+        \\    _ = i * i;
+        \\    _ = i -% i;
+        \\    _ = i - i;
+        \\    _ = i +% i;
+        \\    _ = i + i;
+        \\    _ = i << i;
+        \\    _ = i >> i;
+        \\    _ = i & i;
+        \\    _ = i ^ i;
+        \\    _ = i | i;
+        \\    _ = i >= i;
+        \\    _ = i <= i;
+        \\    _ = i > i;
+        \\    _ = i < i;
+        \\    _ = i and i;
+        \\    _ = i or i;
+        \\}
+        \\
+    );
+}
+
+test "zig fmt: precedence" {
+    try testCanonical(
+        \\test "precedence" {
+        \\    a!b();
+        \\    (a!b)();
+        \\    !a!b;
+        \\    !(a!b);
+        \\    !a{ };
+        \\    !(a{ });
+        \\    a + b{ };
+        \\    (a + b){ };
+        \\    a << b + c;
+        \\    (a << b) + c;
+        \\    a & b << c;
+        \\    (a & b) << c;
+        \\    a ^ b & c;
+        \\    (a ^ b) & c;
+        \\    a | b ^ c;
+        \\    (a | b) ^ c;
+        \\    a == b | c;
+        \\    (a == b) | c;
+        \\    a and b == c;
+        \\    (a and b) == c;
+        \\    a or b and c;
+        \\    (a or b) and c;
+        \\    (a or b) and c;
+        \\}
+        \\
+    );
+}
+
+test "zig fmt: prefix operators" {
+    try testCanonical(
+        \\test "prefix operators" {
+        \\    try return --%~??!*&0;
+        \\}
+        \\
+    );
+}
+
+test "zig fmt: call expression" {
+    try testCanonical(
+        \\test "test calls" {
+        \\    a();
+        \\    a(1);
+        \\    a(1, 2);
+        \\    a(1, 2) + a(1, 2);
+        \\}
+        \\
+    );
+}
+
+test "zig fmt: var args" {
+    try testCanonical(
+        \\fn print(args: ...) void {}
+        \\
+    );
+}
+
+test "zig fmt: extern function" {
+    try testCanonical(
+        \\extern fn puts(s: &const u8) c_int;
+        \\extern "c" fn puts(s: &const u8) c_int;
+        \\
+    );
+}
+
+test "zig fmt: multiline string" {
+    try testCanonical(
+        \\const s = 
+        \\    \\ something
+        \\    \\ something else
+        \\    ;
+        \\
+    );
+}
+
+test "zig fmt: values" {
+    try testCanonical(
+        \\test "values" {
+        \\    1;
+        \\    1.0;
+        \\    "string";
+        \\    c"cstring";
+        \\    'c';
+        \\    true;
+        \\    false;
+        \\    null;
+        \\    undefined;
+        \\    error;
+        \\    this;
+        \\    unreachable;
+        \\}
+        \\
+    );
+}
+
+test "zig fmt: indexing" {
+    try testCanonical(
+        \\test "test index" {
+        \\    a[0];
+        \\    a[0 + 5];
+        \\    a[0..];
+        \\    a[0..5];
+        \\    a[a[0]];
+        \\    a[a[0..]];
+        \\    a[a[0..5]];
+        \\    a[a[0]..];
+        \\    a[a[0..5]..];
+        \\    a[a[0]..a[0]];
+        \\    a[a[0..5]..a[0]];
+        \\    a[a[0..5]..a[0..5]];
+        \\}
+        \\
+    );
+}
+
+test "zig fmt: struct declaration" {
+    try testCanonical(
+        \\const S = struct {
+        \\    const Self = this;
+        \\    f1: u8,
+        \\
+        \\    fn method(self: &Self) Self {
+        \\        return *self;
+        \\    }
+        \\
+        \\    f2: u8
+        \\};
+        \\
+        \\const Ps = packed struct {
+        \\    a: u8,
+        \\    b: u8,
+        \\
+        \\    c: u8
+        \\};
+        \\
+        \\const Es = extern struct {
+        \\    a: u8,
+        \\    b: u8,
+        \\
+        \\    c: u8
+        \\};
+        \\
+    );
+}
+
+test "zig fmt: enum declaration" {
+      try testCanonical(
+        \\const E = enum {
+        \\    Ok,
+        \\    SomethingElse = 0
+        \\};
+        \\
+        \\const E2 = enum(u8) {
+        \\    Ok,
+        \\    SomethingElse = 255,
+        \\    SomethingThird
+        \\};
+        \\
+        \\const Ee = extern enum {
+        \\    Ok,
+        \\    SomethingElse,
+        \\    SomethingThird
+        \\};
+        \\
+        \\const Ep = packed enum {
+        \\    Ok,
+        \\    SomethingElse,
+        \\    SomethingThird
+        \\};
+        \\
+    );
+}
+
+test "zig fmt: union declaration" {
+      try testCanonical(
+        \\const U = union {
+        \\    Int: u8,
+        \\    Float: f32,
+        \\    None,
+        \\    Bool: bool
+        \\};
+        \\
+        \\const Ue = union(enum) {
+        \\    Int: u8,
+        \\    Float: f32,
+        \\    None,
+        \\    Bool: bool
+        \\};
+        \\
+        \\const E = enum {
+        \\    Int,
+        \\    Float,
+        \\    None,
+        \\    Bool
+        \\};
+        \\
+        \\const Ue2 = union(E) {
+        \\    Int: u8,
+        \\    Float: f32,
+        \\    None,
+        \\    Bool: bool
+        \\};
+        \\
+        \\const Eu = extern union {
+        \\    Int: u8,
+        \\    Float: f32,
+        \\    None,
+        \\    Bool: bool
+        \\};
+        \\
+    );
+}
+
+test "zig fmt: error set declaration" {
+      try testCanonical(
+        \\const E = error {
+        \\    A,
+        \\    B,
+        \\
+        \\    C
+        \\};
+        \\
+    );
+}
+
+test "zig fmt: arrays" {
+    try testCanonical(
+        \\test "test array" {
+        \\    const a: [2]u8 = [2]u8{ 1, 2 };
+        \\    const a: [2]u8 = []u8{ 1, 2 };
+        \\    const a: [0]u8 = []u8{ };
+        \\}
+        \\
+    );
+}
+
+test "zig fmt: container initializers" {
+    try testCanonical(
+        \\const a1 = []u8{ };
+        \\const a2 = []u8{ 1, 2, 3, 4 };
+        \\const s1 = S{ };
+        \\const s2 = S{ .a = 1, .b = 2 };
+        \\
+    );
+}
+
+test "zig fmt: catch" {
+    try testCanonical(
+        \\test "catch" {
+        \\    const a: error!u8 = 0;
+        \\    _ = a catch return;
+        \\    _ = a catch |err| return;
+        \\}
+        \\
+    );
+}
+
+test "zig fmt: blocks" {
+    try testCanonical(
+        \\test "blocks" {
+        \\    {
+        \\        const a = 0;
+        \\        const b = 0;
+        \\    }
+        \\
+        \\    blk: {
+        \\        const a = 0;
+        \\        const b = 0;
+        \\    }
+        \\
+        \\    const r = blk: {
+        \\        const a = 0;
+        \\        const b = 0;
+        \\    };
+        \\}
+        \\
+    );
+}
+
+test "zig fmt: switch" {
+    try testCanonical(
+        \\test "switch" {
+        \\    switch (0) {
+        \\        0 => {},
+        \\        1 => unreachable,
+        \\        2, 3 => {},
+        \\        4 ... 7 => {},
+        \\        1 + 4 * 3 + 22 => {},
+        \\        else => {
+        \\            const a = 1;
+        \\            const b = a;
+        \\        }
+        \\    }
+        \\
+        \\    const res = switch (0) {
+        \\        0 => 0,
+        \\        1 => 2,
+        \\        else => 4
+        \\    };
+        \\
+        \\    const Union = union(enum) {
+        \\        Int: i64,
+        \\        Float: f64
+        \\    };
+        \\
+        \\    const u = Union{ .Int = 0 };
+        \\    switch (u) {
+        \\        Union.Int => |int| {},
+        \\        Union.Float => |*float| unreachable
+        \\    }
+        \\}
+        \\
+    );
+}
+
+test "zig fmt: while" {
+    try testCanonical(
+        \\test "while" {
+        \\    while (10 < 1) {
+        \\        unreachable;
+        \\    }
+        \\
+        \\    while (10 < 1)
+        \\        unreachable;
+        \\
+        \\    var i: usize = 0;
+        \\    while (i < 10) : (i += 1) {
+        \\        continue;
+        \\    }
+        \\
+        \\    i = 0;
+        \\    while (i < 10) : (i += 1)
+        \\        continue;
+        \\
+        \\    i = 0;
+        \\    var j: usize = 0;
+        \\    while (i < 10) : ({
+        \\        i += 1;
+        \\        j += 1;
+        \\    }) {
+        \\        continue;
+        \\    }
+        \\
+        \\    var a: ?u8 = 2;
+        \\    while (a) |v| : (a = null) {
+        \\        continue;
+        \\    }
+        \\
+        \\    while (a) |v| : (a = null)
+        \\        unreachable;
+        \\
+        \\    label: while (10 < 0) {
+        \\        unreachable;
+        \\    }
+        \\
+        \\    const res = while (0 < 10) {
+        \\        break 7;
+        \\    } else {
+        \\        unreachable;
+        \\    };
+        \\
+        \\    var a: error!u8 = 0;
+        \\    while (a) |v| {
+        \\        a = error.Err;
+        \\    } else |err| {
+        \\        i = 1;
+        \\    }
+        \\
+        \\    comptime var k: usize = 0;
+        \\    inline while (i < 10) : (i += 1)
+        \\        j += 2;
+        \\}
+        \\
+    );
+}
+
+test "zig fmt: for" {
+    try testCanonical(
+        \\test "for" {
+        \\    const a = []u8{ 1, 2, 3 };
+        \\    for (a) |v| {
+        \\        continue;
+        \\    }
+        \\
+        \\    for (a) |v|
+        \\        continue;
+        \\
+        \\    for (a) |*v|
+        \\        continue;
+        \\
+        \\    for (a) |v, i| {
+        \\        continue;
+        \\    }
+        \\
+        \\    for (a) |v, i|
+        \\        continue;
+        \\
+        \\    const res = for (a) |v, i| {
+        \\        break v;
+        \\    } else {
+        \\        unreachable;
+        \\    };
+        \\
+        \\    var num: usize = 0;
+        \\    inline for (a) |v, i| {
+        \\        num += v;
+        \\        num += i;
+        \\    }
+        \\}
+        \\
+    );
+}
+
+test "zig fmt: if" {
+    try testCanonical(
+        \\test "if" {
+        \\    if (10 < 0) {
+        \\        unreachable;
+        \\    }
+        \\
+        \\    if (10 < 0) unreachable;
+        \\
+        \\    if (10 < 0) {
+        \\        unreachable;
+        \\    } else {
+        \\        const a = 20;
+        \\    }
+        \\
+        \\    if (10 < 0) {
+        \\        unreachable;
+        \\    } else if (5 < 0) {
+        \\        unreachable;
+        \\    } else {
+        \\        const a = 20;
+        \\    }
+        \\
+        \\    const is_world_broken = if (10 < 0) true else false;
+        \\
+        \\    const a: ?u8 = 10;
+        \\    const b: ?u8 = null;
+        \\    if (a) |v| {
+        \\        const some = v;
+        \\    } else if (b) |*v| {
+        \\        unreachable;
+        \\    } else {
+        \\        const some = 10;
+        \\    }
+        \\
+        \\    const non_null_a = if (a) |v| v else 0;
+        \\
+        \\    const a_err: error!u8 = 0;
+        \\    if (a_err) |v| {
+        \\        const p = v;
+        \\    } else |err| {
+        \\        unreachable;
+        \\    }
+        \\}
+        \\
+    );
+}
+
+test "zig fmt: defer" {
+    try testCanonical(
+        \\test "defer" {
+        \\    var i: usize = 0;
+        \\    defer i = 1;
+        \\    defer {
+        \\        i += 2;
+        \\        i *= i;
+        \\    }
+        \\
+        \\    errdefer i += 3;
+        \\    errdefer {
+        \\        i += 2;
+        \\        i /= i;
+        \\    }
+        \\}
+        \\
+    );
+}
+
+test "zig fmt: comptime" {
+    try testCanonical(
+        \\fn a() u8 {
+        \\    return 5;
+        \\}
+        \\
+        \\fn b(comptime i: u8) u8 {
+        \\    return i;
+        \\}
+        \\
+        \\const av = comptime a();
+        \\const av2 = comptime blk: {
+        \\    var res = a();
+        \\    res *= b(2);
+        \\    break :blk res;
+        \\};
+        \\
+        \\comptime {
+        \\    _ = a();
+        \\}
+        \\
+        \\test "comptime" {
+        \\    const av3 = comptime a();
+        \\    const av4 = comptime blk: {
+        \\        var res = a();
+        \\        res *= a();
+        \\        break :blk res;
+        \\    };
+        \\
+        \\    comptime var i = 0;
+        \\    comptime {
+        \\        i = a();
+        \\        i += b(i);
+        \\    }
+        \\}
+        \\
+    );
+}
+
+test "zig fmt: fn type" {
+    try testCanonical(
+        \\fn a(i: u8) u8 {
+        \\    return i + 1;
+        \\}
+        \\
+        \\const a: fn(u8) u8 = undefined;
+        \\const b: extern fn(u8) u8 = undefined;
+        \\const c: nakedcc fn(u8) u8 = undefined;
+        \\const ap: fn(u8) u8 = a;
+        \\
+    );
+}
+
+test "zig fmt: inline asm" {
+    try testCanonical(
+        \\pub fn syscall1(number: usize, arg1: usize) usize {
+        \\    return asm volatile ("syscall"
+        \\        : [ret] "={rax}" (-> usize)
+        \\        : [number] "{rax}" (number),
+        \\          [arg1] "{rdi}" (arg1)
+        \\        : "rcx", "r11");
+        \\}
+        \\
+    );
+}
+
+test "zig fmt: coroutines" {
+    try testCanonical(
+        \\async fn simpleAsyncFn() void {
+        \\    x += 1;
+        \\    suspend;
+        \\    x += 1;
+        \\    suspend |p| {}
+        \\    const p = async simpleAsyncFn() catch unreachable;
+        \\    await p;
+        \\}
+        \\
+        \\test "coroutine suspend, resume, cancel" {
+        \\    const p = try async<std.debug.global_allocator> testAsyncSeq();
+        \\    resume p;
+        \\    cancel p;
+        \\}
+        \\
+    );
+}
+
+//{
+//    var it = self.link_libs.iterator();
+//    while (true) {
+//        const entry = it.next() ?? break;
+//        zig_args.append("--library") catch unreachable;
+//        zig_args.append(entry.key) catch unreachable;
+//    }
+//}