1 //  Copyright (c) 2001-2011 Hartmut Kaiser
2 //  Copyright (c) 2011 Jan Frederick Eick
3 //
4 //  Distributed under the Boost Software License, Version 1.0. (See accompanying
5 //  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 
7 #include <boost/config/warning_disable.hpp>
8 #include <boost/detail/lightweight_test.hpp>
9 #include <boost/spirit/include/karma_numeric.hpp>
10 
11 #include <boost/cstdint.hpp>
12 
13 #include "test.hpp"
14 
15 ///////////////////////////////////////////////////////////////////////////////
16 //
17 //  *** BEWARE PLATFORM DEPENDENT!!! ***
18 //  *** The following assumes 32 bit boost::uint32_tegers.
19 //  *** Modify these constants when appropriate.
20 //
21 ///////////////////////////////////////////////////////////////////////////////
22 
23 char const* max_unsigned_base2 =  "11111111111111111111111111111111";
24 char const* max_unsigned_base3 =  "102002022201221111210";
25 char const* max_unsigned_base4 =  "3333333333333333";
26 char const* max_unsigned_base5 =  "32244002423140";
27 char const* max_unsigned_base6 =  "1550104015503";
28 char const* max_unsigned_base7 =  "211301422353";
29 char const* max_unsigned_base8 =  "37777777777";
30 char const* max_unsigned_base9 =  "12068657453";
31 char const* max_unsigned_base11 = "1904440553";
32 char const* max_unsigned_base12 = "9ba461593";
33 char const* max_unsigned_base13 = "535a79888";
34 char const* max_unsigned_base14 = "2ca5b7463";
35 char const* max_unsigned_base15 = "1a20dcd80";
36 char const* max_unsigned_base16 = "ffffffff";
37 char const* max_unsigned_base17 = "a7ffda90";
38 char const* max_unsigned_base18 = "704he7g3";
39 char const* max_unsigned_base19 = "4f5aff65";
40 char const* max_unsigned_base20 = "3723ai4f";
41 char const* max_unsigned_base21 = "281d55i3";
42 char const* max_unsigned_base22 = "1fj8b183";
43 char const* max_unsigned_base23 = "1606k7ib";
44 char const* max_unsigned_base24 = "mb994af";
45 char const* max_unsigned_base25 = "hek2mgk";
46 char const* max_unsigned_base26 = "dnchbnl";
47 char const* max_unsigned_base27 = "b28jpdl";
48 char const* max_unsigned_base28 = "8pfgih3";
49 char const* max_unsigned_base29 = "76beigf";
50 char const* max_unsigned_base30 = "5qmcpqf";
51 char const* max_unsigned_base31 = "4q0jto3";
52 char const* max_unsigned_base32 = "3vvvvvv";
53 char const* max_unsigned_base33 = "3aokq93";
54 char const* max_unsigned_base34 = "2qhxjlh";
55 char const* max_unsigned_base35 = "2br45qa";
56 char const* max_unsigned_base36 = "1z141z3";
57 
58 int
main()59 main()
60 {
61     using spirit_test::test;
62     using boost::spirit::karma::uint_generator;
63 
64     ///////////////////////////////////////////////////////////////////////////
65     //  arbitrary radix test (base 2)
66     ///////////////////////////////////////////////////////////////////////////
67     {
68         uint_generator<boost::uint32_t, 2> base2_generator;
69 
70         BOOST_TEST(test("1100111100100110010", base2_generator(424242)));
71         BOOST_TEST(test("1100111100100110010", base2_generator, 424242));
72 
73         BOOST_TEST(test(max_unsigned_base2, base2_generator(0xffffffffu)));
74         BOOST_TEST(test(max_unsigned_base2, base2_generator, 0xffffffffu));
75     }
76 
77     ///////////////////////////////////////////////////////////////////////////
78     //  arbitrary radix test (base 3)
79     ///////////////////////////////////////////////////////////////////////////
80     {
81         uint_generator<boost::uint32_t, 3> base3_generator;
82 
83         BOOST_TEST(test("210112221200", base3_generator(424242)));
84         BOOST_TEST(test("210112221200", base3_generator, 424242));
85 
86         BOOST_TEST(test(max_unsigned_base3, base3_generator(0xffffffffu)));
87         BOOST_TEST(test(max_unsigned_base3, base3_generator, 0xffffffffu));
88     }
89 
90     ///////////////////////////////////////////////////////////////////////////
91     //  arbitrary radix test (base 4)
92     ///////////////////////////////////////////////////////////////////////////
93     {
94         uint_generator<boost::uint32_t, 4> base4_generator;
95 
96         BOOST_TEST(test("1213210302", base4_generator(424242)));
97         BOOST_TEST(test("1213210302", base4_generator, 424242));
98 
99         BOOST_TEST(test(max_unsigned_base4, base4_generator(0xffffffffu)));
100         BOOST_TEST(test(max_unsigned_base4, base4_generator, 0xffffffffu));
101     }
102 
103     ///////////////////////////////////////////////////////////////////////////
104     //  arbitrary radix test (base 5)
105     ///////////////////////////////////////////////////////////////////////////
106     {
107         uint_generator<boost::uint32_t, 5> base5_generator;
108 
109         BOOST_TEST(test("102033432", base5_generator(424242)));
110         BOOST_TEST(test("102033432", base5_generator, 424242));
111 
112         BOOST_TEST(test(max_unsigned_base5, base5_generator(0xffffffffu)));
113         BOOST_TEST(test(max_unsigned_base5, base5_generator, 0xffffffffu));
114     }
115 
116     ///////////////////////////////////////////////////////////////////////////
117     //  arbitrary radix test (base 6)
118     ///////////////////////////////////////////////////////////////////////////
119     {
120         uint_generator<boost::uint32_t, 6> base6_generator;
121 
122         BOOST_TEST(test("13032030", base6_generator(424242)));
123         BOOST_TEST(test("13032030", base6_generator, 424242));
124 
125         BOOST_TEST(test(max_unsigned_base6, base6_generator(0xffffffffu)));
126         BOOST_TEST(test(max_unsigned_base6, base6_generator, 0xffffffffu));
127     }
128 
129     ///////////////////////////////////////////////////////////////////////////
130     //  arbitrary radix test (base 7)
131     ///////////////////////////////////////////////////////////////////////////
132     {
133         uint_generator<boost::uint32_t, 7> base7_generator;
134 
135         BOOST_TEST(test("3414600", base7_generator(424242)));
136         BOOST_TEST(test("3414600", base7_generator, 424242));
137 
138         BOOST_TEST(test(max_unsigned_base7, base7_generator(0xffffffffu)));
139         BOOST_TEST(test(max_unsigned_base7, base7_generator, 0xffffffffu));
140     }
141 
142     ///////////////////////////////////////////////////////////////////////////
143     //  arbitrary radix test (base 8)
144     ///////////////////////////////////////////////////////////////////////////
145     {
146         uint_generator<boost::uint32_t, 8> base8_generator;
147 
148         BOOST_TEST(test("1474462", base8_generator(424242)));
149         BOOST_TEST(test("1474462", base8_generator, 424242));
150 
151         BOOST_TEST(test(max_unsigned_base8, base8_generator(0xffffffffu)));
152         BOOST_TEST(test(max_unsigned_base8, base8_generator, 0xffffffffu));
153     }
154 
155     ///////////////////////////////////////////////////////////////////////////
156     //  arbitrary radix test (base 9)
157     ///////////////////////////////////////////////////////////////////////////
158     {
159         uint_generator<boost::uint32_t, 9> base9_generator;
160 
161         BOOST_TEST(test("715850", base9_generator(424242)));
162         BOOST_TEST(test("715850", base9_generator, 424242));
163 
164         BOOST_TEST(test(max_unsigned_base9, base9_generator(0xffffffffu)));
165         BOOST_TEST(test(max_unsigned_base9, base9_generator, 0xffffffffu));
166     }
167 
168     ///////////////////////////////////////////////////////////////////////////
169     //  arbitrary radix test (base 11)
170     ///////////////////////////////////////////////////////////////////////////
171     {
172         uint_generator<boost::uint32_t, 11> base11_generator;
173 
174         BOOST_TEST(test("26a815", base11_generator(424242)));
175         BOOST_TEST(test("26a815", base11_generator, 424242));
176 
177         BOOST_TEST(test(max_unsigned_base11, base11_generator(0xffffffffu)));
178         BOOST_TEST(test(max_unsigned_base11, base11_generator, 0xffffffffu));
179     }
180 
181     ///////////////////////////////////////////////////////////////////////////
182     //  arbitrary radix test (base 12)
183     ///////////////////////////////////////////////////////////////////////////
184     {
185         uint_generator<boost::uint32_t, 12> base12_generator;
186 
187         BOOST_TEST(test("185616", base12_generator(424242)));
188         BOOST_TEST(test("185616", base12_generator, 424242));
189 
190         BOOST_TEST(test(max_unsigned_base12, base12_generator(0xffffffffu)));
191         BOOST_TEST(test(max_unsigned_base12, base12_generator, 0xffffffffu));
192     }
193 
194     ///////////////////////////////////////////////////////////////////////////
195     //  arbitrary radix test (base 13)
196     ///////////////////////////////////////////////////////////////////////////
197     {
198         uint_generator<boost::uint32_t, 13> base13_generator;
199 
200         BOOST_TEST(test("11b140", base13_generator(424242)));
201         BOOST_TEST(test("11b140", base13_generator, 424242));
202 
203         BOOST_TEST(test(max_unsigned_base13, base13_generator(0xffffffffu)));
204         BOOST_TEST(test(max_unsigned_base13, base13_generator, 0xffffffffu));
205     }
206 
207     ///////////////////////////////////////////////////////////////////////////
208     //  arbitrary radix test (base 14)
209     ///////////////////////////////////////////////////////////////////////////
210     {
211         uint_generator<boost::uint32_t, 14> base14_generator;
212 
213         BOOST_TEST(test("b0870", base14_generator(424242)));
214         BOOST_TEST(test("b0870", base14_generator, 424242));
215 
216         BOOST_TEST(test(max_unsigned_base14, base14_generator(0xffffffffu)));
217         BOOST_TEST(test(max_unsigned_base14, base14_generator, 0xffffffffu));
218     }
219 
220     ///////////////////////////////////////////////////////////////////////////
221     //  arbitrary radix test (base 15)
222     ///////////////////////////////////////////////////////////////////////////
223     {
224         uint_generator<boost::uint32_t, 15> base15_generator;
225 
226         BOOST_TEST(test("85a7c", base15_generator(424242)));
227         BOOST_TEST(test("85a7c", base15_generator, 424242));
228 
229         BOOST_TEST(test(max_unsigned_base15, base15_generator(0xffffffffu)));
230         BOOST_TEST(test(max_unsigned_base15, base15_generator, 0xffffffffu));
231     }
232 
233     ///////////////////////////////////////////////////////////////////////////
234     //  arbitrary radix test (base 16)
235     ///////////////////////////////////////////////////////////////////////////
236     {
237         uint_generator<boost::uint32_t, 16> base16_generator;
238 
239         BOOST_TEST(test("67932", base16_generator(424242)));
240         BOOST_TEST(test("67932", base16_generator, 424242));
241 
242         BOOST_TEST(test(max_unsigned_base16, base16_generator(0xffffffffu)));
243         BOOST_TEST(test(max_unsigned_base16, base16_generator, 0xffffffffu));
244     }
245 
246     ///////////////////////////////////////////////////////////////////////////
247     //  arbitrary radix test (base 17)
248     ///////////////////////////////////////////////////////////////////////////
249     {
250         uint_generator<boost::uint32_t, 17> base17_generator;
251 
252         BOOST_TEST(test("515g7", base17_generator(424242)));
253         BOOST_TEST(test("515g7", base17_generator, 424242));
254 
255         BOOST_TEST(test(max_unsigned_base17, base17_generator(0xffffffffu)));
256         BOOST_TEST(test(max_unsigned_base17, base17_generator, 0xffffffffu));
257     }
258 
259     ///////////////////////////////////////////////////////////////////////////
260     //  arbitrary radix test (base 18)
261     ///////////////////////////////////////////////////////////////////////////
262     {
263         uint_generator<boost::uint32_t, 18> base18_generator;
264 
265         BOOST_TEST(test("40d70", base18_generator(424242)));
266         BOOST_TEST(test("40d70", base18_generator, 424242));
267 
268         BOOST_TEST(test(max_unsigned_base18, base18_generator(0xffffffffu)));
269         BOOST_TEST(test(max_unsigned_base18, base18_generator, 0xffffffffu));
270     }
271 
272     ///////////////////////////////////////////////////////////////////////////
273     //  arbitrary radix test (base 19)
274     ///////////////////////////////////////////////////////////////////////////
275     {
276         uint_generator<boost::uint32_t, 19> base19_generator;
277 
278         BOOST_TEST(test("34g3a", base19_generator(424242)));
279         BOOST_TEST(test("34g3a", base19_generator, 424242));
280 
281         BOOST_TEST(test(max_unsigned_base19, base19_generator(0xffffffffu)));
282         BOOST_TEST(test(max_unsigned_base19, base19_generator, 0xffffffffu));
283     }
284 
285     ///////////////////////////////////////////////////////////////////////////
286     //  arbitrary radix test (base 20)
287     ///////////////////////////////////////////////////////////////////////////
288     {
289         uint_generator<boost::uint32_t, 20> base20_generator;
290 
291         BOOST_TEST(test("2d0c2", base20_generator(424242)));
292         BOOST_TEST(test("2d0c2", base20_generator, 424242));
293 
294         BOOST_TEST(test(max_unsigned_base20, base20_generator(0xffffffffu)));
295         BOOST_TEST(test(max_unsigned_base20, base20_generator, 0xffffffffu));
296     }
297 
298     ///////////////////////////////////////////////////////////////////////////
299     //  arbitrary radix test (base 21)
300     ///////////////////////////////////////////////////////////////////////////
301     {
302         uint_generator<boost::uint32_t, 21> base21_generator;
303 
304         BOOST_TEST(test("23h00", base21_generator(424242)));
305         BOOST_TEST(test("23h00", base21_generator, 424242));
306 
307         BOOST_TEST(test(max_unsigned_base21, base21_generator(0xffffffffu)));
308         BOOST_TEST(test(max_unsigned_base21, base21_generator, 0xffffffffu));
309     }
310 
311     ///////////////////////////////////////////////////////////////////////////
312     //  arbitrary radix test (base 22)
313     ///////////////////////////////////////////////////////////////////////////
314     {
315         uint_generator<boost::uint32_t, 22> base22_generator;
316 
317         BOOST_TEST(test("1hibg", base22_generator(424242)));
318         BOOST_TEST(test("1hibg", base22_generator, 424242));
319 
320         BOOST_TEST(test(max_unsigned_base22, base22_generator(0xffffffffu)));
321         BOOST_TEST(test(max_unsigned_base22, base22_generator, 0xffffffffu));
322     }
323 
324     ///////////////////////////////////////////////////////////////////////////
325     //  arbitrary radix test (base 23)
326     ///////////////////////////////////////////////////////////////////////////
327     {
328         uint_generator<boost::uint32_t, 23> base23_generator;
329 
330         BOOST_TEST(test("1bjm7", base23_generator(424242)));
331         BOOST_TEST(test("1bjm7", base23_generator, 424242));
332 
333         BOOST_TEST(test(max_unsigned_base23, base23_generator(0xffffffffu)));
334         BOOST_TEST(test(max_unsigned_base23, base23_generator, 0xffffffffu));
335     }
336 
337     ///////////////////////////////////////////////////////////////////////////
338     //  arbitrary radix test (base 24)
339     ///////////////////////////////////////////////////////////////////////////
340     {
341         uint_generator<boost::uint32_t, 24> base24_generator;
342 
343         BOOST_TEST(test("16gci", base24_generator(424242)));
344         BOOST_TEST(test("16gci", base24_generator, 424242));
345 
346         BOOST_TEST(test(max_unsigned_base24, base24_generator(0xffffffffu)));
347         BOOST_TEST(test(max_unsigned_base24, base24_generator, 0xffffffffu));
348     }
349 
350     ///////////////////////////////////////////////////////////////////////////
351     //  arbitrary radix test (base 25)
352     ///////////////////////////////////////////////////////////////////////////
353     {
354         uint_generator<boost::uint32_t, 25> base25_generator;
355 
356         BOOST_TEST(test("123jh", base25_generator(424242)));
357         BOOST_TEST(test("123jh", base25_generator, 424242));
358 
359         BOOST_TEST(test(max_unsigned_base25, base25_generator(0xffffffffu)));
360         BOOST_TEST(test(max_unsigned_base25, base25_generator, 0xffffffffu));
361     }
362 
363     ///////////////////////////////////////////////////////////////////////////
364     //  arbitrary radix test (base 26)
365     ///////////////////////////////////////////////////////////////////////////
366     {
367         uint_generator<boost::uint32_t, 26> base26_generator;
368 
369         BOOST_TEST(test("o3f0", base26_generator(424242)));
370         BOOST_TEST(test("o3f0", base26_generator, 424242));
371 
372         BOOST_TEST(test(max_unsigned_base26, base26_generator(0xffffffffu)));
373         BOOST_TEST(test(max_unsigned_base26, base26_generator, 0xffffffffu));
374     }
375 
376     ///////////////////////////////////////////////////////////////////////////
377     //  arbitrary radix test (base 27)
378     ///////////////////////////////////////////////////////////////////////////
379     {
380         uint_generator<boost::uint32_t, 27> base27_generator;
381 
382         BOOST_TEST(test("lepi", base27_generator(424242)));
383         BOOST_TEST(test("lepi", base27_generator, 424242));
384 
385         BOOST_TEST(test(max_unsigned_base27, base27_generator(0xffffffffu)));
386         BOOST_TEST(test(max_unsigned_base27, base27_generator, 0xffffffffu));
387     }
388 
389     ///////////////////////////////////////////////////////////////////////////
390     //  arbitrary radix test (base 28)
391     ///////////////////////////////////////////////////////////////////////////
392     {
393         uint_generator<boost::uint32_t, 28> base28_generator;
394 
395         BOOST_TEST(test("j93e", base28_generator(424242)));
396         BOOST_TEST(test("j93e", base28_generator, 424242));
397 
398         BOOST_TEST(test(max_unsigned_base28, base28_generator(0xffffffffu)));
399         BOOST_TEST(test(max_unsigned_base28, base28_generator, 0xffffffffu));
400     }
401 
402     ///////////////////////////////////////////////////////////////////////////
403     //  arbitrary radix test (base 29)
404     ///////////////////////////////////////////////////////////////////////////
405     {
406         uint_generator<boost::uint32_t, 29> base29_generator;
407 
408         BOOST_TEST(test("hbd1", base29_generator(424242)));
409         BOOST_TEST(test("hbd1", base29_generator, 424242));
410 
411         BOOST_TEST(test(max_unsigned_base29, base29_generator(0xffffffffu)));
412         BOOST_TEST(test(max_unsigned_base29, base29_generator, 0xffffffffu));
413     }
414 
415     ///////////////////////////////////////////////////////////////////////////
416     //  arbitrary radix test (base 30)
417     ///////////////////////////////////////////////////////////////////////////
418     {
419         uint_generator<boost::uint32_t, 30> base30_generator;
420 
421         BOOST_TEST(test("flbc", base30_generator(424242)));
422         BOOST_TEST(test("flbc", base30_generator, 424242));
423 
424         BOOST_TEST(test(max_unsigned_base30, base30_generator(0xffffffffu)));
425         BOOST_TEST(test(max_unsigned_base30, base30_generator, 0xffffffffu));
426     }
427 
428     ///////////////////////////////////////////////////////////////////////////
429     //  arbitrary radix test (base 31)
430     ///////////////////////////////////////////////////////////////////////////
431     {
432         uint_generator<boost::uint32_t, 31> base31_generator;
433 
434         BOOST_TEST(test("e7e7", base31_generator(424242)));
435         BOOST_TEST(test("e7e7", base31_generator, 424242));
436 
437         BOOST_TEST(test(max_unsigned_base31, base31_generator(0xffffffffu)));
438         BOOST_TEST(test(max_unsigned_base31, base31_generator, 0xffffffffu));
439     }
440 
441     ///////////////////////////////////////////////////////////////////////////
442     //  arbitrary radix test (base 32)
443     ///////////////////////////////////////////////////////////////////////////
444     {
445         uint_generator<boost::uint32_t, 32> base32_generator;
446 
447         BOOST_TEST(test("cu9i", base32_generator(424242)));
448         BOOST_TEST(test("cu9i", base32_generator, 424242));
449 
450         BOOST_TEST(test(max_unsigned_base32, base32_generator(0xffffffffu)));
451         BOOST_TEST(test(max_unsigned_base32, base32_generator, 0xffffffffu));
452     }
453 
454     ///////////////////////////////////////////////////////////////////////////
455     //  arbitrary radix test (base 33)
456     ///////////////////////////////////////////////////////////////////////////
457     {
458         uint_generator<boost::uint32_t, 33> base33_generator;
459 
460         BOOST_TEST(test("bqir", base33_generator(424242)));
461         BOOST_TEST(test("bqir", base33_generator, 424242));
462 
463         BOOST_TEST(test(max_unsigned_base33, base33_generator(0xffffffffu)));
464         BOOST_TEST(test(max_unsigned_base33, base33_generator, 0xffffffffu));
465     }
466 
467     ///////////////////////////////////////////////////////////////////////////
468     //  arbitrary radix test (base 34)
469     ///////////////////////////////////////////////////////////////////////////
470     {
471         uint_generator<boost::uint32_t, 34> base34_generator;
472 
473         BOOST_TEST(test("aqxo", base34_generator(424242)));
474         BOOST_TEST(test("aqxo", base34_generator, 424242));
475 
476         BOOST_TEST(test(max_unsigned_base34, base34_generator(0xffffffffu)));
477         BOOST_TEST(test(max_unsigned_base34, base34_generator, 0xffffffffu));
478     }
479 
480     ///////////////////////////////////////////////////////////////////////////
481     //  arbitrary radix test (base 35)
482     ///////////////////////////////////////////////////////////////////////////
483     {
484         uint_generator<boost::uint32_t, 35> base35_generator;
485 
486         BOOST_TEST(test("9vb7", base35_generator(424242)));
487         BOOST_TEST(test("9vb7", base35_generator, 424242));
488 
489         BOOST_TEST(test(max_unsigned_base35, base35_generator(0xffffffffu)));
490         BOOST_TEST(test(max_unsigned_base35, base35_generator, 0xffffffffu));
491     }
492 
493     ///////////////////////////////////////////////////////////////////////////
494     //  arbitrary radix test (base 36)
495     ///////////////////////////////////////////////////////////////////////////
496     {
497         uint_generator<boost::uint32_t, 36> base36_generator;
498 
499         BOOST_TEST(test("93ci", base36_generator(424242)));
500         BOOST_TEST(test("93ci", base36_generator, 424242));
501 
502         BOOST_TEST(test(max_unsigned_base36, base36_generator(0xffffffffu)));
503         BOOST_TEST(test(max_unsigned_base36, base36_generator, 0xffffffffu));
504     }
505 
506     return boost::report_errors();
507 }
508