update standalone and incremental tests to new API
This commit is contained in:
@@ -17,15 +17,6 @@ pub fn addCases(cases: *tests.CompareOutputContext) void {
|
||||
\\}
|
||||
, "Hello, world!" ++ if (@import("builtin").os.tag == .windows) "\r\n" else "\n");
|
||||
|
||||
cases.add("hello world without libc",
|
||||
\\const io = @import("std").io;
|
||||
\\
|
||||
\\pub fn main() void {
|
||||
\\ const stdout = io.getStdOut().writer();
|
||||
\\ stdout.print("Hello, world!\n{d:4} {x:3} {c}\n", .{@as(u32, 12), @as(u16, 0x12), @as(u8, 'a')}) catch unreachable;
|
||||
\\}
|
||||
, "Hello, world!\n 12 12 a\n");
|
||||
|
||||
cases.addC("number literals",
|
||||
\\const std = @import("std");
|
||||
\\const builtin = @import("builtin");
|
||||
@@ -158,24 +149,6 @@ pub fn addCases(cases: *tests.CompareOutputContext) void {
|
||||
\\
|
||||
);
|
||||
|
||||
cases.add("order-independent declarations",
|
||||
\\const io = @import("std").io;
|
||||
\\const z = io.stdin_fileno;
|
||||
\\const x : @TypeOf(y) = 1234;
|
||||
\\const y : u16 = 5678;
|
||||
\\pub fn main() void {
|
||||
\\ var x_local : i32 = print_ok(x);
|
||||
\\ _ = &x_local;
|
||||
\\}
|
||||
\\fn print_ok(val: @TypeOf(x)) @TypeOf(foo) {
|
||||
\\ _ = val;
|
||||
\\ const stdout = io.getStdOut().writer();
|
||||
\\ stdout.print("OK\n", .{}) catch unreachable;
|
||||
\\ return 0;
|
||||
\\}
|
||||
\\const foo : i32 = 0;
|
||||
, "OK\n");
|
||||
|
||||
cases.addC("expose function pointer to C land",
|
||||
\\const c = @cImport(@cInclude("stdlib.h"));
|
||||
\\
|
||||
@@ -236,267 +209,11 @@ pub fn addCases(cases: *tests.CompareOutputContext) void {
|
||||
\\}
|
||||
, "3.25\n3\n3.00\n-0.40\n");
|
||||
|
||||
cases.add("same named methods in incomplete struct",
|
||||
\\const io = @import("std").io;
|
||||
\\
|
||||
\\const Foo = struct {
|
||||
\\ field1: Bar,
|
||||
\\
|
||||
\\ fn method(a: *const Foo) bool {
|
||||
\\ _ = a;
|
||||
\\ return true;
|
||||
\\ }
|
||||
\\};
|
||||
\\
|
||||
\\const Bar = struct {
|
||||
\\ field2: i32,
|
||||
\\
|
||||
\\ fn method(b: *const Bar) bool {
|
||||
\\ _ = b;
|
||||
\\ return true;
|
||||
\\ }
|
||||
\\};
|
||||
\\
|
||||
\\pub fn main() void {
|
||||
\\ const bar = Bar {.field2 = 13,};
|
||||
\\ const foo = Foo {.field1 = bar,};
|
||||
\\ const stdout = io.getStdOut().writer();
|
||||
\\ if (!foo.method()) {
|
||||
\\ stdout.print("BAD\n", .{}) catch unreachable;
|
||||
\\ }
|
||||
\\ if (!bar.method()) {
|
||||
\\ stdout.print("BAD\n", .{}) catch unreachable;
|
||||
\\ }
|
||||
\\ stdout.print("OK\n", .{}) catch unreachable;
|
||||
\\}
|
||||
, "OK\n");
|
||||
|
||||
cases.add("defer with only fallthrough",
|
||||
\\const io = @import("std").io;
|
||||
\\pub fn main() void {
|
||||
\\ const stdout = io.getStdOut().writer();
|
||||
\\ stdout.print("before\n", .{}) catch unreachable;
|
||||
\\ defer stdout.print("defer1\n", .{}) catch unreachable;
|
||||
\\ defer stdout.print("defer2\n", .{}) catch unreachable;
|
||||
\\ defer stdout.print("defer3\n", .{}) catch unreachable;
|
||||
\\ stdout.print("after\n", .{}) catch unreachable;
|
||||
\\}
|
||||
, "before\nafter\ndefer3\ndefer2\ndefer1\n");
|
||||
|
||||
cases.add("defer with return",
|
||||
\\const io = @import("std").io;
|
||||
\\const os = @import("std").os;
|
||||
\\pub fn main() void {
|
||||
\\ const stdout = io.getStdOut().writer();
|
||||
\\ stdout.print("before\n", .{}) catch unreachable;
|
||||
\\ defer stdout.print("defer1\n", .{}) catch unreachable;
|
||||
\\ defer stdout.print("defer2\n", .{}) catch unreachable;
|
||||
\\ var gpa: @import("std").heap.GeneralPurposeAllocator(.{}) = .init;
|
||||
\\ defer _ = gpa.deinit();
|
||||
\\ var arena = @import("std").heap.ArenaAllocator.init(gpa.allocator());
|
||||
\\ defer arena.deinit();
|
||||
\\ var args_it = @import("std").process.argsWithAllocator(arena.allocator()) catch unreachable;
|
||||
\\ if (args_it.skip() and !args_it.skip()) return;
|
||||
\\ defer stdout.print("defer3\n", .{}) catch unreachable;
|
||||
\\ stdout.print("after\n", .{}) catch unreachable;
|
||||
\\}
|
||||
, "before\ndefer2\ndefer1\n");
|
||||
|
||||
cases.add("errdefer and it fails",
|
||||
\\const io = @import("std").io;
|
||||
\\pub fn main() void {
|
||||
\\ do_test() catch return;
|
||||
\\}
|
||||
\\fn do_test() !void {
|
||||
\\ const stdout = io.getStdOut().writer();
|
||||
\\ stdout.print("before\n", .{}) catch unreachable;
|
||||
\\ defer stdout.print("defer1\n", .{}) catch unreachable;
|
||||
\\ errdefer stdout.print("deferErr\n", .{}) catch unreachable;
|
||||
\\ try its_gonna_fail();
|
||||
\\ defer stdout.print("defer3\n", .{}) catch unreachable;
|
||||
\\ stdout.print("after\n", .{}) catch unreachable;
|
||||
\\}
|
||||
\\fn its_gonna_fail() !void {
|
||||
\\ return error.IToldYouItWouldFail;
|
||||
\\}
|
||||
, "before\ndeferErr\ndefer1\n");
|
||||
|
||||
cases.add("errdefer and it passes",
|
||||
\\const io = @import("std").io;
|
||||
\\pub fn main() void {
|
||||
\\ do_test() catch return;
|
||||
\\}
|
||||
\\fn do_test() !void {
|
||||
\\ const stdout = io.getStdOut().writer();
|
||||
\\ stdout.print("before\n", .{}) catch unreachable;
|
||||
\\ defer stdout.print("defer1\n", .{}) catch unreachable;
|
||||
\\ errdefer stdout.print("deferErr\n", .{}) catch unreachable;
|
||||
\\ try its_gonna_pass();
|
||||
\\ defer stdout.print("defer3\n", .{}) catch unreachable;
|
||||
\\ stdout.print("after\n", .{}) catch unreachable;
|
||||
\\}
|
||||
\\fn its_gonna_pass() anyerror!void { }
|
||||
, "before\nafter\ndefer3\ndefer1\n");
|
||||
|
||||
cases.addCase(x: {
|
||||
var tc = cases.create("@embedFile",
|
||||
\\const foo_txt = @embedFile("foo.txt");
|
||||
\\const io = @import("std").io;
|
||||
\\
|
||||
\\pub fn main() void {
|
||||
\\ const stdout = io.getStdOut().writer();
|
||||
\\ stdout.print(foo_txt, .{}) catch unreachable;
|
||||
\\}
|
||||
, "1234\nabcd\n");
|
||||
|
||||
tc.addSourceFile("foo.txt", "1234\nabcd\n");
|
||||
|
||||
break :x tc;
|
||||
});
|
||||
|
||||
cases.addCase(x: {
|
||||
var tc = cases.create("parsing args",
|
||||
\\const std = @import("std");
|
||||
\\const io = std.io;
|
||||
\\const os = std.os;
|
||||
\\
|
||||
\\pub fn main() !void {
|
||||
\\ var gpa: std.heap.GeneralPurposeAllocator(.{}) = .init;
|
||||
\\ defer _ = gpa.deinit();
|
||||
\\ var arena = std.heap.ArenaAllocator.init(gpa.allocator());
|
||||
\\ defer arena.deinit();
|
||||
\\ var args_it = try std.process.argsWithAllocator(arena.allocator());
|
||||
\\ const stdout = io.getStdOut().writer();
|
||||
\\ var index: usize = 0;
|
||||
\\ _ = args_it.skip();
|
||||
\\ while (args_it.next()) |arg| : (index += 1) {
|
||||
\\ try stdout.print("{}: {s}\n", .{index, arg});
|
||||
\\ }
|
||||
\\}
|
||||
,
|
||||
\\0: first arg
|
||||
\\1: 'a' 'b' \
|
||||
\\2: bare
|
||||
\\3: ba""re
|
||||
\\4: "
|
||||
\\5: last arg
|
||||
\\
|
||||
);
|
||||
|
||||
tc.setCommandLineArgs(&[_][]const u8{
|
||||
"first arg",
|
||||
"'a' 'b' \\",
|
||||
"bare",
|
||||
"ba\"\"re",
|
||||
"\"",
|
||||
"last arg",
|
||||
});
|
||||
|
||||
break :x tc;
|
||||
});
|
||||
|
||||
cases.addCase(x: {
|
||||
var tc = cases.create("parsing args new API",
|
||||
\\const std = @import("std");
|
||||
\\const io = std.io;
|
||||
\\const os = std.os;
|
||||
\\
|
||||
\\pub fn main() !void {
|
||||
\\ var gpa: std.heap.GeneralPurposeAllocator(.{}) = .init;
|
||||
\\ defer _ = gpa.deinit();
|
||||
\\ var arena = std.heap.ArenaAllocator.init(gpa.allocator());
|
||||
\\ defer arena.deinit();
|
||||
\\ var args_it = try std.process.argsWithAllocator(arena.allocator());
|
||||
\\ const stdout = io.getStdOut().writer();
|
||||
\\ var index: usize = 0;
|
||||
\\ _ = args_it.skip();
|
||||
\\ while (args_it.next()) |arg| : (index += 1) {
|
||||
\\ try stdout.print("{}: {s}\n", .{index, arg});
|
||||
\\ }
|
||||
\\}
|
||||
,
|
||||
\\0: first arg
|
||||
\\1: 'a' 'b' \
|
||||
\\2: bare
|
||||
\\3: ba""re
|
||||
\\4: "
|
||||
\\5: last arg
|
||||
\\
|
||||
);
|
||||
|
||||
tc.setCommandLineArgs(&[_][]const u8{
|
||||
"first arg",
|
||||
"'a' 'b' \\",
|
||||
"bare",
|
||||
"ba\"\"re",
|
||||
"\"",
|
||||
"last arg",
|
||||
});
|
||||
|
||||
break :x tc;
|
||||
});
|
||||
|
||||
// It is required to override the log function in order to print to stdout instead of stderr
|
||||
cases.add("std.log per scope log level override",
|
||||
\\const std = @import("std");
|
||||
\\
|
||||
\\pub const std_options: std.Options = .{
|
||||
\\ .log_level = .debug,
|
||||
\\
|
||||
\\ .log_scope_levels = &.{
|
||||
\\ .{ .scope = .a, .level = .warn },
|
||||
\\ .{ .scope = .c, .level = .err },
|
||||
\\ },
|
||||
\\ .logFn = log,
|
||||
\\};
|
||||
\\
|
||||
\\const loga = std.log.scoped(.a);
|
||||
\\const logb = std.log.scoped(.b);
|
||||
\\const logc = std.log.scoped(.c);
|
||||
\\
|
||||
\\pub fn main() !void {
|
||||
\\ loga.debug("", .{});
|
||||
\\ logb.debug("", .{});
|
||||
\\ logc.debug("", .{});
|
||||
\\
|
||||
\\ loga.info("", .{});
|
||||
\\ logb.info("", .{});
|
||||
\\ logc.info("", .{});
|
||||
\\
|
||||
\\ loga.warn("", .{});
|
||||
\\ logb.warn("", .{});
|
||||
\\ logc.warn("", .{});
|
||||
\\
|
||||
\\ loga.err("", .{});
|
||||
\\ logb.err("", .{});
|
||||
\\ logc.err("", .{});
|
||||
\\}
|
||||
\\pub fn log(
|
||||
\\ comptime level: std.log.Level,
|
||||
\\ comptime scope: @TypeOf(.EnumLiteral),
|
||||
\\ comptime format: []const u8,
|
||||
\\ args: anytype,
|
||||
\\) void {
|
||||
\\ const level_txt = comptime level.asText();
|
||||
\\ const prefix2 = if (scope == .default) ": " else "(" ++ @tagName(scope) ++ "):";
|
||||
\\ const stdout = std.io.getStdOut().writer();
|
||||
\\ nosuspend stdout.print(level_txt ++ prefix2 ++ format ++ "\n", args) catch return;
|
||||
\\}
|
||||
,
|
||||
\\debug(b):
|
||||
\\info(b):
|
||||
\\warning(a):
|
||||
\\warning(b):
|
||||
\\error(a):
|
||||
\\error(b):
|
||||
\\error(c):
|
||||
\\
|
||||
);
|
||||
|
||||
cases.add("valid carriage return example", "const io = @import(\"std\").io;\r\n" ++ // Testing CRLF line endings are valid
|
||||
cases.add("valid carriage return example", "const std = @import(\"std\");\r\n" ++ // Testing CRLF line endings are valid
|
||||
"\r\n" ++
|
||||
"pub \r fn main() void {\r\n" ++ // Testing isolated carriage return as whitespace is valid
|
||||
" const stdout = io.getStdOut().writer();\r\n" ++
|
||||
" var file_writer = std.fs.File.stdout().writerStreaming(&.{});\r\n" ++
|
||||
" const stdout = &file_writer.interface;\r\n" ++
|
||||
" stdout.print(\\\\A Multiline\r\n" ++ // testing CRLF at end of multiline string line is valid and normalises to \n in the output
|
||||
" \\\\String\r\n" ++
|
||||
" , .{}) catch unreachable;\r\n" ++
|
||||
|
||||
Reference in New Issue
Block a user