annotate dynamin/core/format.d @ 109:7678554e75de

Add dynamin.core.format with parseFormatString().
author Jordan Miner <jminer7@gmail.com>
date Sat, 19 Jan 2013 20:50:41 -0600
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
109
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
1
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
2 /*
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
3 * Copyright Jordan Miner
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
4 *
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
5 * Distributed under the Boost Software License, Version 1.0.
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
6 * (See accompanying file BOOST_LICENSE.txt or copy at
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
7 * http://www.boost.org/LICENSE_1_0.txt)
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
8 *
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
9 */
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
10
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
11 module dynamin.core.format;
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
12
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
13 import dynamin.core.global;
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
14 import dynamin.core.string;
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
15 import dynamin.core.test;
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
16
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
17 private:
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
18
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
19 cstring parseFormatParam(cstring specifier, ref int paramIndex) {
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
20 // specifier is something like "1:x" or ":d"
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
21 int i;
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
22 for(i = 0; i < specifier.length && specifier[i] != ':'; ++i) {
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
23 }
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
24 if(i > 0) {
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
25 try {
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
26 paramIndex = to!int(specifier[0..i]);
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
27 } catch(Exception ex) {
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
28 throw new Exception("Invalid parameter index.");
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
29 }
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
30 }
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
31 return i >= specifier.length ? "" : specifier[i+1..$];
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
32 }
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
33
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
34 /**
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
35 * Parses `formatStr`, passing each part to `write` or `writeParam` as it is encountered.
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
36 * For example:
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
37 *
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
38 * parseFormatString("I am {0:x} years old!", writeParam, write);
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
39 * // will result in:
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
40 * write("I am ");
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
41 * writeParam(0, "x");
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
42 * write(" years old!");
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
43 *
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
44 */
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
45 public void parseFormatString( cstring formatStr,
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
46 void delegate(int param, cstring format) writeParam,
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
47 void delegate(scope cstring str) write) {
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
48
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
49 int paramIndex = 0; // param to write next, if not specified
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
50 cstring paramFormat;
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
51
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
52 uword start = 0;
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
53
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
54 for(int i = 0; i < formatStr.length; ++i) {
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
55 if(formatStr[i] == '{') {
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
56 write(formatStr[start..i]);
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
57 start = i + 1;
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
58
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
59 if(i + 1 >= formatStr.length)
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
60 throw new Exception("Unterminated format specifier.");
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
61 ++i;
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
62
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
63 if(formatStr[i] == '{') { // escaped open brace
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
64 // start already is the index of the second open brace
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
65 } else { // format specifier
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
66 while(formatStr[i] != '}') {
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
67 if(formatStr[i] == '{')
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
68 throw new Exception("Open brace in format specifier.");
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
69 if(++i >= formatStr.length)
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
70 throw new Exception("Unterminated format specifier.");
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
71 }
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
72 paramFormat = parseFormatParam(formatStr[start..i], paramIndex);
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
73 start = i + 1;
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
74 writeParam(paramIndex, paramFormat);
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
75 ++paramIndex;
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
76 }
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
77 } else if(formatStr[i] == '}') {
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
78 write(formatStr[start..i]);
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
79 start = i + 1;
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
80
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
81 if(i + 1 >= formatStr.length || formatStr[i + 1] != '}')
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
82 throw new Exception("Unescaped close brace.");
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
83 ++i; // escaped close brace
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
84 }
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
85 }
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
86 if(start < formatStr.length)
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
87 write(formatStr[start..$]);
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
88 }
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
89
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
90 unittest {
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
91 struct Call {
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
92 int index;
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
93 string str;
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
94 }
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
95 Call[] calls;
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
96 int callIndex;
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
97 void paramCallback(int param, cstring format) {
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
98 assertEqual(param, calls[callIndex].index); // crash if out of bounds
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
99 assertEqual(format, calls[callIndex].str);
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
100 ++callIndex;
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
101 };
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
102 void strCallback(scope cstring str) {
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
103 assertEqual(str, calls[callIndex].str); // crash if out of bounds
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
104 ++callIndex;
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
105 };
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
106
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
107 calls = [
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
108 Call(-1, "one"),
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
109 Call(0, ""),
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
110 Call(-1, "two"),
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
111 Call(1, ""),
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
112 Call(-1, "three")
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
113 ];
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
114 callIndex = 0;
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
115 parseFormatString("one{0}two{1}three", &paramCallback, &strCallback);
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
116 assertEqual(callIndex, calls.length);
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
117
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
118 calls = [
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
119 Call(-1, "one"),
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
120 Call(0, "abc12"),
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
121 Call(-1, "two"),
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
122 Call(1, "yyyy-mm-dd"),
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
123 Call(-1, "three")
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
124 ];
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
125 callIndex = 0;
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
126 parseFormatString("one{0:abc12}two{1:yyyy-mm-dd}three", &paramCallback, &strCallback);
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
127 assertEqual(callIndex, calls.length);
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
128
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
129 calls = [
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
130 Call(-1, "one"),
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
131 Call(0, "~!@#$%^&*()_+-=[]\\:\"<>?;',./"),
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
132 Call(-1, "two"),
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
133 ];
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
134 callIndex = 0;
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
135 parseFormatString("one{0:~!@#$%^&*()_+-=[]\\:\"<>?;',./}two", &paramCallback, &strCallback);
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
136 assertEqual(callIndex, calls.length);
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
137
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
138 calls = [
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
139 Call(-1, "one"),
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
140 Call(0, ""),
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
141 Call(-1, "two"),
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
142 Call(1, ""),
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
143 Call(-1, "three"),
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
144 Call(2, ""),
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
145 ];
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
146 callIndex = 0;
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
147 parseFormatString("one{}two{}three{}", &paramCallback, &strCallback);
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
148 assertEqual(callIndex, calls.length);
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
149
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
150 calls = [
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
151 Call(-1, "one"),
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
152 Call(4, ""),
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
153 Call(-1, "two"),
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
154 Call(5, ""),
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
155 Call(-1, "three"),
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
156 Call(2, ""),
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
157 Call(-1, "four"),
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
158 Call(3, "x"),
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
159 ];
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
160 callIndex = 0;
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
161 parseFormatString("one{4}two{}three{2}four{:x}", &paramCallback, &strCallback);
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
162 assertEqual(callIndex, calls.length);
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
163
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
164 string testStr;
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
165 parseFormatString( "on{{e}}{2}}}two{{{}}}",
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
166 delegate (i, f) { testStr ~= "P"; },
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
167 delegate (scope str) { testStr ~= str; });
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
168 assertEqual(testStr, "on{e}P}two{P}");
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
169
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
170 assertThrows!Exception(parseFormatString( "test{",
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
171 delegate (i, f) { },
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
172 delegate (scope str) { }));
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
173 assertThrows!Exception(parseFormatString( "test{0",
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
174 delegate (i, f) { },
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
175 delegate (scope str) { }));
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
176 assertThrows!Exception(parseFormatString( "test{0{}",
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
177 delegate (i, f) { },
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
178 delegate (scope str) { }));
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
179 assertThrows!Exception(parseFormatString( "test}ing",
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
180 delegate (i, f) { },
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
181 delegate (scope str) { }));
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
182 assertThrows!Exception(parseFormatString( "test{0x12}ing",
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
183 delegate (i, f) { },
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
184 delegate (scope str) { }));
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
185 }
7678554e75de Add dynamin.core.format with parseFormatString().
Jordan Miner <jminer7@gmail.com>
parents:
diff changeset
186