Mercurial > projects > dynamin
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 |
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", ¶mCallback, &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", ¶mCallback, &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", ¶mCallback, &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{}", ¶mCallback, &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}", ¶mCallback, &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 |