diff options
Diffstat (limited to 'genqrcode/tests/test_mmask.c')
| -rw-r--r-- | genqrcode/tests/test_mmask.c | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/genqrcode/tests/test_mmask.c b/genqrcode/tests/test_mmask.c new file mode 100644 index 0000000000..c6cab14a6e --- /dev/null +++ b/genqrcode/tests/test_mmask.c @@ -0,0 +1,155 @@ +#include <stdio.h> +#include <string.h> +#include "common.h" +#include "../mmask.h" +#include "../mqrspec.h" + +static char dot[2] = {'_', '#'}; +static char *maskPatterns[4] = { + /* i mod 2 = 0 */ + "######" + "______" + "######" + "______" + "######" + "______", + /* ((i div 2) + (j div 3)) mod 2 = 0 */ + "###___" + "###___" + "___###" + "___###" + "###___" + "###___", + /* ((ij) mod 2 + (ij) mod 3) mod 2 = 0 */ + "######" + "###___" + "##_##_" + "#_#_#_" + "#_##_#" + "#___##", + /* ((ij) mod 3 + (i+j) mod 2) mod 2 = 0 */ + "#_#_#_" + "___###" + "#___##" + "_#_#_#" + "###___" + "_###__" +}; + +static void print_mask(int mask) +{ + const int w = 6; + unsigned char frame[w * w], *masked, *p; + int x, y; + + memset(frame, 0, w * w); + masked = MMask_makeMaskedFrame(w, frame, mask); + p = masked; + for(y=0; y<w; y++) { + for(x=0; x<w; x++) { + putchar(dot[*p&1]); + p++; + } + printf("\n"); + } + printf("\n"); + + free(masked); +} + +static void print_masks(void) +{ + int i; + + puts("\nPrinting mask patterns."); + for(i=0; i<4; i++) { + print_mask(i); + } +} + +static int test_mask(int mask) +{ + const int w = 6; + unsigned char frame[w * w], *masked, *p; + char *q; + int x, y; + int err = 0; + + memset(frame, 0, w * w); + masked = MMask_makeMaskedFrame(w, frame, mask); + p = masked; + q = maskPatterns[mask]; + for(y=0; y<w; y++) { + for(x=0; x<w; x++) { + if(dot[*p&1] != *q) { + err++; + } + p++; + q++; + } + } + + free(masked); + return err; +} + +static void test_masks(void) +{ + int i; + + testStart("Mask pattern checks"); + for(i=0; i<4; i++) { + assert_zero(test_mask(i), "Mask pattern %d incorrect.\n", i); + } + testFinish(); +} + +static void test_maskEvaluation(void) +{ + static const int w = 11; + unsigned char pattern[w * w]; + int i, score; + + memset(pattern, 0, w * w); + + testStart("Test mask evaluation"); + score = MMask_evaluateSymbol(w, pattern); + assert_equal(score, 0, "Mask score caluculation is incorrect. (score=%d (%d expected)\n", score, 0); + + for(i=0; i<w; i++) { + pattern[(w-1) * w + i] = 1; + } + score = MMask_evaluateSymbol(w, pattern); + assert_equal(score, 16 + w - 1, "Mask score caluculation is incorrect. (score=%d) (%d expected)\n", score, 16 + w - 1); + + for(i=0; i<w; i++) { + pattern[(w-1) * w + i] = 0; + pattern[i * w + w - 1] = 1; + } + score = MMask_evaluateSymbol(w, pattern); + assert_equal(score, 16 + w - 1, "Mask score caluculation is incorrect. (score=%d) (%d expected)\n", score, 16 + w - 1); + + for(i=0; i<w; i++) { + pattern[(w-1) * w + i] = 1; + pattern[i * w + w - 1] = 1; + } + score = MMask_evaluateSymbol(w, pattern); + assert_equal(score, 16 * (w - 1) + w - 1, "Mask score caluculation is incorrect. (score=%d) (%d expected)\n", score, 16 * (w - 1) + w - 1); + + testFinish(); +} + +int main(int argc, char **argv) +{ + int tests = 2; + testInit(tests); + test_masks(); + test_maskEvaluation(); + testReport(tests); + + if(argc > 1) { + print_masks(); + } + + return 0; +} |
