+ }
+
+#define FIZZBUZZ_DECLS(var) \
+ int _i, _limit; \
+ char _buf[24]; \
+ const char *var
+#define FOR_FIZZBUZZ(var, base, limit) \
+ MC_TARGET(out, { ; }) \
+ MC_BEFORE(bounds, { _i = base; _limit = limit; }) \
+ for (; _i < _limit; _i++) \
+ MC_WRAP(wrap, \
+ { switch (_i%15) { \
+ case 0: var = "fizzbuzz"; break; \
+ case 3: case 6: case 9: case 12: var = "fizz"; break; \
+ case 5: case 10: var = "buzz"; break; \
+ default: sprintf(_buf, "%d", _i); var = _buf; break; \
+ } }, \
+ { ; }, \
+ { MC_GOTARGET(out); })
+
+ TESTGROUP("fizzbuzz") {
+ FIZZBUZZ_DECLS(fb);
+ unsigned i;
+ static const char *const ref[] = {
+ "19", "buzz", "fizz", "22", "23", "fizz", "buzz",
+ "26", "fizz", "28", "29", "fizzbuzz", "31", 0
+ };
+
+ i = 0;
+ FOR_FIZZBUZZ(fb, 19, 32)
+ TEST
+ if (TVEC_CLAIM(&tvstate, ref[i]))
+ { TVEC_CLAIMEQ_TEXTZ(&tvstate, fb, ref[i]); i++; }
+ TVEC_CLAIM(&tvstate, !ref[i]);
+ }