| @safe pure unittest |
| { |
| import std.format.write; |
| |
| import std.array : appender; |
| import std.format.spec : singleSpec; |
| |
| auto w1 = appender!string(); |
| auto spec1 = singleSpec("%s"); |
| formatValue(w1, true, spec1); |
| |
| assert(w1.data == "true"); |
| |
| auto w2 = appender!string(); |
| auto spec2 = singleSpec("%#x"); |
| formatValue(w2, true, spec2); |
| |
| assert(w2.data == "0x1"); |
| } |
| |
| @safe pure unittest |
| { |
| import std.format.write; |
| |
| import std.array : appender; |
| import std.format.spec : singleSpec; |
| |
| auto w = appender!string(); |
| auto spec = singleSpec("%s"); |
| formatValue(w, null, spec); |
| |
| assert(w.data == "null"); |
| } |
| |
| @safe pure unittest |
| { |
| import std.format.write; |
| |
| import std.array : appender; |
| import std.format.spec : singleSpec; |
| |
| auto w1 = appender!string(); |
| auto spec1 = singleSpec("%d"); |
| formatValue(w1, -1337, spec1); |
| |
| assert(w1.data == "-1337"); |
| |
| auto w2 = appender!string(); |
| auto spec2 = singleSpec("%x"); |
| formatValue(w2, -1337, spec2); |
| |
| assert(w2.data == "fffffac7"); |
| } |
| |
| @safe unittest |
| { |
| import std.format.write; |
| |
| import std.array : appender; |
| import std.format.spec : singleSpec; |
| |
| auto w1 = appender!string(); |
| auto spec1 = singleSpec("%.3f"); |
| formatValue(w1, 1337.7779, spec1); |
| |
| assert(w1.data == "1337.778"); |
| |
| auto w2 = appender!string(); |
| auto spec2 = singleSpec("%.3e"); |
| formatValue(w2, 1337.7779, spec2); |
| |
| assert(w2.data == "1.338e+03"); |
| |
| auto w3 = appender!string(); |
| auto spec3 = singleSpec("%.3g"); |
| formatValue(w3, 1337.7779, spec3); |
| |
| assert(w3.data == "1.34e+03"); |
| |
| auto w4 = appender!string(); |
| auto spec4 = singleSpec("%.3a"); |
| formatValue(w4, 1337.7779, spec4); |
| |
| assert(w4.data == "0x1.4e7p+10"); |
| } |
| |
| @safe pure unittest |
| { |
| import std.format.write; |
| |
| import std.array : appender; |
| import std.format.spec : singleSpec; |
| |
| auto w1 = appender!string(); |
| auto spec1 = singleSpec("%c"); |
| formatValue(w1, 'ì', spec1); |
| |
| assert(w1.data == "ì"); |
| |
| auto w2 = appender!string(); |
| auto spec2 = singleSpec("%#x"); |
| formatValue(w2, 'ì', spec2); |
| |
| assert(w2.data == "0xec"); |
| } |
| |
| @safe pure unittest |
| { |
| import std.format.write; |
| |
| import std.array : appender; |
| import std.format.spec : singleSpec; |
| |
| auto w1 = appender!string(); |
| auto spec1 = singleSpec("%s"); |
| formatValue(w1, "hello", spec1); |
| |
| assert(w1.data == "hello"); |
| |
| auto w2 = appender!string(); |
| auto spec2 = singleSpec("%(%#x%|/%)"); |
| formatValue(w2, "hello", spec2); |
| |
| assert(w2.data == "0x68/0x65/0x6c/0x6c/0x6f"); |
| } |
| |
| @safe pure unittest |
| { |
| import std.format.write; |
| |
| import std.array : appender; |
| import std.format.spec : singleSpec; |
| |
| auto w = appender!string(); |
| auto spec = singleSpec("%s"); |
| int[2] two = [1, 2]; |
| formatValue(w, two, spec); |
| |
| assert(w.data == "[1, 2]"); |
| } |
| |
| @safe pure unittest |
| { |
| import std.format.write; |
| |
| import std.array : appender; |
| import std.format.spec : singleSpec; |
| |
| auto w1 = appender!string(); |
| auto spec1 = singleSpec("%s"); |
| auto two = [1, 2]; |
| formatValue(w1, two, spec1); |
| |
| assert(w1.data == "[1, 2]"); |
| |
| auto w2 = appender!string(); |
| auto spec2 = singleSpec("%(%g%|, %)"); |
| auto consts = [3.1415926, 299792458, 6.67430e-11]; |
| formatValue(w2, consts, spec2); |
| |
| assert(w2.data == "3.14159, 2.99792e+08, 6.6743e-11"); |
| |
| // void[] is treated like ubyte[] |
| auto w3 = appender!string(); |
| auto spec3 = singleSpec("%s"); |
| void[] val = cast(void[]) cast(ubyte[])[1, 2, 3]; |
| formatValue(w3, val, spec3); |
| |
| assert(w3.data == "[1, 2, 3]"); |
| } |
| |
| @safe pure unittest |
| { |
| import std.format.write; |
| |
| import std.array : appender; |
| import std.format.spec : singleSpec; |
| |
| auto aa = [10:17.5, 20:9.99]; |
| |
| auto w1 = appender!string(); |
| auto spec1 = singleSpec("%s"); |
| formatValue(w1, aa, spec1); |
| |
| assert(w1.data == "[10:17.5, 20:9.99]" || w1.data == "[20:9.99, 10:17.5]"); |
| |
| auto w2 = appender!string(); |
| auto spec2 = singleSpec("%(%x = %.0e%| # %)"); |
| formatValue(w2, aa, spec2); |
| |
| assert(w2.data == "a = 2e+01 # 14 = 1e+01" || w2.data == "14 = 1e+01 # a = 2e+01"); |
| } |
| |
| @safe pure unittest |
| { |
| import std.format.write; |
| |
| import std.array : appender; |
| import std.format.spec : singleSpec; |
| |
| enum A { first, second, third } |
| |
| auto w1 = appender!string(); |
| auto spec1 = singleSpec("%s"); |
| formatValue(w1, A.second, spec1); |
| |
| assert(w1.data == "second"); |
| |
| auto w2 = appender!string(); |
| auto spec2 = singleSpec("%d"); |
| formatValue(w2, A.second, spec2); |
| |
| assert(w2.data == "1"); |
| |
| // values of an enum that have no name are formatted with %s using a cast |
| A a = A.third; |
| a++; |
| |
| auto w3 = appender!string(); |
| auto spec3 = singleSpec("%s"); |
| formatValue(w3, a, spec3); |
| |
| assert(w3.data == "cast(A)3"); |
| } |
| |
| @safe unittest |
| { |
| import std.format.write; |
| |
| import std.array : appender; |
| import std.format.spec : FormatSpec, singleSpec; |
| |
| // Using a `toString` with a writer |
| static struct Point1 |
| { |
| import std.range.primitives : isOutputRange, put; |
| |
| int x, y; |
| |
| void toString(W)(ref W writer, scope const ref FormatSpec!char f) |
| if (isOutputRange!(W, char)) |
| { |
| put(writer, "("); |
| formatValue(writer, x, f); |
| put(writer, ","); |
| formatValue(writer, y, f); |
| put(writer, ")"); |
| } |
| } |
| |
| auto w1 = appender!string(); |
| auto spec1 = singleSpec("%s"); |
| auto p1 = Point1(16, 11); |
| |
| formatValue(w1, p1, spec1); |
| assert(w1.data == "(16,11)"); |
| |
| // Using a `toString` with a sink |
| static struct Point2 |
| { |
| int x, y; |
| |
| void toString(scope void delegate(scope const(char)[]) @safe sink, |
| scope const FormatSpec!char fmt) const |
| { |
| sink("("); |
| sink.formatValue(x, fmt); |
| sink(","); |
| sink.formatValue(y, fmt); |
| sink(")"); |
| } |
| } |
| |
| auto w2 = appender!string(); |
| auto spec2 = singleSpec("%03d"); |
| auto p2 = Point2(16,11); |
| |
| formatValue(w2, p2, spec2); |
| assert(w2.data == "(016,011)"); |
| |
| // Using `string toString()` |
| static struct Point3 |
| { |
| int x, y; |
| |
| string toString() |
| { |
| import std.conv : to; |
| |
| return "(" ~ to!string(x) ~ "," ~ to!string(y) ~ ")"; |
| } |
| } |
| |
| auto w3 = appender!string(); |
| auto spec3 = singleSpec("%s"); // has to be %s |
| auto p3 = Point3(16,11); |
| |
| formatValue(w3, p3, spec3); |
| assert(w3.data == "(16,11)"); |
| |
| // without `toString` |
| static struct Point4 |
| { |
| int x, y; |
| } |
| |
| auto w4 = appender!string(); |
| auto spec4 = singleSpec("%s"); // has to be %s |
| auto p4 = Point4(16,11); |
| |
| formatValue(w4, p4, spec3); |
| assert(w4.data == "Point4(16, 11)"); |
| } |
| |
| @safe pure unittest |
| { |
| import std.format.write; |
| |
| import std.array : appender; |
| import std.format.spec : singleSpec; |
| |
| auto w1 = appender!string(); |
| auto spec1 = singleSpec("%s"); |
| auto p1 = () @trusted { return cast(void*) 0xFFEECCAA; } (); |
| formatValue(w1, p1, spec1); |
| |
| assert(w1.data == "FFEECCAA"); |
| |
| // null pointers are printed as `"null"` when used with `%s` and as hexadecimal integer else |
| auto w2 = appender!string(); |
| auto spec2 = singleSpec("%s"); |
| auto p2 = () @trusted { return cast(void*) 0x00000000; } (); |
| formatValue(w2, p2, spec2); |
| |
| assert(w2.data == "null"); |
| |
| auto w3 = appender!string(); |
| auto spec3 = singleSpec("%x"); |
| formatValue(w3, p2, spec3); |
| |
| assert(w3.data == "0"); |
| } |
| |
| @safe unittest |
| { |
| import std.format.write; |
| |
| import core.simd; // cannot be selective, because float4 might not be defined |
| import std.array : appender; |
| import std.format.spec : singleSpec; |
| |
| auto w = appender!string(); |
| auto spec = singleSpec("%s"); |
| |
| static if (is(float4)) |
| { |
| version (X86) {} |
| else |
| { |
| float4 f4; |
| f4.array[0] = 1; |
| f4.array[1] = 2; |
| f4.array[2] = 3; |
| f4.array[3] = 4; |
| |
| formatValue(w, f4, spec); |
| assert(w.data == "[1, 2, 3, 4]"); |
| } |
| } |
| } |
| |
| @safe pure unittest |
| { |
| import std.format.write; |
| |
| import std.array : appender; |
| |
| auto writer1 = appender!string(); |
| formattedWrite(writer1, "%s is the ultimate %s.", 42, "answer"); |
| assert(writer1[] == "42 is the ultimate answer."); |
| |
| auto writer2 = appender!string(); |
| formattedWrite(writer2, "Increase: %7.2f %%", 17.4285); |
| assert(writer2[] == "Increase: 17.43 %"); |
| } |
| |
| @safe pure unittest |
| { |
| import std.format.write; |
| |
| import std.array : appender; |
| |
| auto writer = appender!string(); |
| writer.formattedWrite!"%d is the ultimate %s."(42, "answer"); |
| assert(writer[] == "42 is the ultimate answer."); |
| |
| // This line doesn't compile, because 3.14 cannot be formatted with %d: |
| // writer.formattedWrite!"%d is the ultimate %s."(3.14, "answer"); |
| } |
| |
| @safe pure unittest |
| { |
| import std.format.write; |
| |
| import std.array : appender; |
| import std.format.spec : singleSpec; |
| |
| auto writer = appender!string(); |
| auto spec = singleSpec("%08b"); |
| writer.formatValue(42, spec); |
| assert(writer.data == "00101010"); |
| |
| spec = singleSpec("%2s"); |
| writer.formatValue('=', spec); |
| assert(writer.data == "00101010 ="); |
| |
| spec = singleSpec("%+14.6e"); |
| writer.formatValue(42.0, spec); |
| assert(writer.data == "00101010 = +4.200000e+01"); |
| } |
| |