ref: 610852e18629b8a9a4c4f4ed6e6fc7a336152511
dir: /lib/std/test/fmt.myr/
use std pkg = type pair ;; const check = {expected, fmt, args : ... var buf : byte[2048] var sl, ap ap = std.vastart(&args) sl = std.bfmtv(buf[:], fmt, &ap) if !std.sleq(expected, sl) std.fatal("mismatched fmt: got \"{}\", expected \"{}\"\n", sl, expected) ;; } const main = { builtins() installed() } const builtins = { check(" abcd", "{w=10}", "abcd") check("00000bdcae", "{p=0,w=10}", "bdcae") check("abcdefghijkl", "{p=0,w=10}", "abcdefghijkl") check("a", "{w=0,p=1}", "a") check(" 10", "{w=10}", 10) check("0000000010", "{p=0,w=10}", 10) check("4294967295", "{p=0,w=10}", -1 castto(uint)) check("-000000001", "{p=0,w=10}", -1) check("xxxxxxxx-1", "{p=x,w=10}", -1) check(" -1", "{w=10}", -1) check("100000" , "{3}", 100000) check("foobarbaz", "{}bar{}", "foo", "baz") check("{}barbaz", "{{}}bar{}", "baz") check("{barbaz}", "{{bar{}}}", "baz") check("abcd", "{}", "abcd") check("123", "{}", 123) check("7b", "{x}", 123) check("0x7b", "0x{x}", 123) } const installed = { var x : int var p : pair std.fmtinstall(std.typeof(x), intfmt, [][:]) std.fmtinstall(std.typeof(p), pairfmt, [ ("x", true), ("y", false) ][:]) /* single value */ check("formatted an int: 0", "{}", 0) check("formatted an int: -10", "{}", -10) /* multiple values */ check("formatted an int: 0, formatted an int: 10", "{}, {}", 0, 10) check("formatted an int: -10, formatted an int: 20", "{}, {}", -10, 20) /* single value, no options */ p = [.x=0, .y=0] check("formatted a pair: [0, 0]", "{}", p) /* single value, option combos */ p = [.x=-10, .y=-10] check("formatted a pair: [-10, -10]", "{}", p) check("formatted a pair: [-10, -10] x=foo", "{x=foo}", p) check("formatted a pair: [-10, -10] y present", "{y}", p) check("formatted a pair: [-10, -10] x=bar y present", "{x=bar,y}", p) /* multiple values */ check("formatted a pair: [-10, -10], formatted a pair: [-10, -10]", "{}, {}", p, p) /* multiple values of different types */ check("11, formatted a pair: [-10, -10], formatted an int: 111", "{}, {}, {}", 11 castto(byte), p, 111) } type pair = struct x : int16 y : int32 ;; const intfmt = {sb, ap, opts var x : int std.assert(opts.len == 0, "options passed where none should be") x = std.vanext(ap) /* cast to other int type so we don't recurse */ std.sbfmt(sb, "formatted an int: {}", x castto(int32)) } const pairfmt = {sb, ap, opts var x : pair x = std.vanext(ap) std.sbfmt(sb, "formatted a pair: [{}, {}]", x.x, x.y) for opt in opts std.sbputc(sb, ' ') match opt | ("x", val): std.sbfmt(sb, "x={}", val) | ("y", ""): std.sbfmt(sb, "y present") | _: std.fatal("unknown option") ;; ;; }