summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2017-11-25 15:24:45 +0100
committerEugen Wissner <belka@caraus.de>2017-11-25 15:24:45 +0100
commitb612e978bfe1bf224cb35d7f57e893818cd57728 (patch)
treee6f1ff2991546607e79684fd74ca472082a87796
parent02d1d8218b1db1b2c817046d20b074a28e918075 (diff)
downloadtanya-b612e978bfe1bf224cb35d7f57e893818cd57728.tar.gz
format: Add format string tests
-rw-r--r--source/tanya/format/package.d100
1 files changed, 32 insertions, 68 deletions
diff --git a/source/tanya/format/package.d b/source/tanya/format/package.d
index 5c2ab7b..44572e3 100644
--- a/source/tanya/format/package.d
+++ b/source/tanya/format/package.d
@@ -840,7 +840,7 @@ pure nothrow @nogc
{
tail[2] = '+';
}
- n = (decimalPos>= 1000) ? 6 : ((decimalPos >= 100) ? 5 : ((decimalPos >= 10) ? 4 : 3));
+ n = (decimalPos >= 1000) ? 6 : ((decimalPos >= 100) ? 5 : ((decimalPos >= 10) ? 4 : 3));
tail[0] = cast(char) n;
for (;;)
{
@@ -1081,7 +1081,7 @@ pure nothrow @nogc
else
{
cs = (fl & Modifier.tripletComma) ? ((600 - cast(uint) decimalPos) % 3) : 0;
- if (cast(uint) decimalPos>= l)
+ if (cast(uint) decimalPos >= l)
{
// Handle xxxx000*000.0.
n = 0;
@@ -1637,7 +1637,7 @@ pure nothrow @nogc
return buf[0 .. tlen + cast(int) (bf - buf.ptr)];
}
-package(tanya) char[] format(string fmt)(return char[] buf, ...)
+char[] format(string fmt)(return char[] buf, ...)
nothrow
{
va_list va;
@@ -1758,56 +1758,13 @@ private nothrow unittest
assert(format!"%%k"(buffer) == "%k");
}
-private template FmtSpec(string spec)
+private struct FormatSpec
{
- template getModifier(char modifier)
- {
- static if (modifier == '+')
- {
- enum Modifier getModifier = Modifier.leadingPlus;
- }
- else static if (modifier == ' ')
- {
- enum Modifier getModifier = Modifier.leadingSpace;
- }
- else static if (modifier = '#')
- {
- enum Modifier getModifier = Modifier.leading0x;
- }
- else static if (modifier == '\'')
- {
- enum Modifier getModifier = Modifier.tripletComma;
- }
- else static if (modifier == '0')
- {
- enum Modifier getModifier = Modifier.leadingZero;
- }
- else
- {
- static assert(false, "Unknown modifier " ~ modifier);
- }
- }
-
- template parseModifiers(string modifiers)
- {
- static if (modifiers.length == 0)
- {
- enum uint parseModifiers = 0;
- }
- else
- {
- enum uint parseModifiers = getModifier!(modifiers[0])
- | parseModifiers!(modifiers[1 .. $]);
- }
- }
-
- struct FmtSpec
- {
- enum uint modifiers = parseModifiers!spec;
- }
}
-private enum size_t specPosition(string fmt, char tag)()
+// Returns the position of `tag` in `fmt`. If `tag` can't be found, returns the
+// length of `fmt`.
+private size_t specPosition(string fmt, char tag)()
{
foreach (i, c; fmt)
{
@@ -1819,7 +1776,7 @@ private enum size_t specPosition(string fmt, char tag)()
return fmt.length;
}
-private template ParseFmt(string fmt)
+private template ParseFmt(string fmt, size_t pos = 0)
{
static if (fmt.length == 0)
{
@@ -1827,33 +1784,40 @@ private template ParseFmt(string fmt)
}
else static if (fmt[0] == '{')
{
- enum size_t pos = specPosition!(fmt[1 .. $], '}');
- static if (pos < fmt.length - 1)
+ static if (fmt.length > 1 && fmt[1] == '{')
{
- alias ParseFmt = AliasSeq!(FmtSpec!(fmt[1 .. pos + 1]),
- ParseFmt!(fmt[pos + 2 .. $]));
+ enum size_t pos = specPosition!(fmt[2 .. $], '{') + 2;
+ alias ParseFmt = AliasSeq!(fmt[1 .. pos],
+ ParseFmt!(fmt[pos .. $], pos));
}
else
{
- static assert(false, "Enclosing '}' is missing");
+ enum size_t pos = specPosition!(fmt[1 .. $], '}') + 1;
+ static if (pos < fmt.length)
+ {
+ alias ParseFmt = AliasSeq!(FormatSpec(),
+ ParseFmt!(fmt[pos + 1 .. $], pos + 1));
+ }
+ else
+ {
+ static assert(false, "Enclosing '}' is missing");
+ }
}
}
else
{
enum size_t pos = specPosition!(fmt, '{');
- alias ParseFmt = AliasSeq!(fmt[0 .. pos], ParseFmt!(fmt[pos .. $]));
+ alias ParseFmt = AliasSeq!(fmt[0 .. pos],
+ ParseFmt!(fmt[pos .. $], pos));
}
}
-void fmt(string format)()
+@nogc nothrow pure @safe unittest
{
- foreach (e; ParseFmt!format)
- {
- static if (is(typeof(e) == string))
- {
- }
- else
- {
- }
- }
-} \ No newline at end of file
+ static assert(ParseFmt!"".length == 0);
+
+ static assert(ParseFmt!"asdf".length == 1);
+ static assert(ParseFmt!"asdf"[0] == "asdf");
+
+ static assert(ParseFmt!"{}".length == 1);
+}