| @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"); | |
| } | |