Edit

kc3-lang/libqrencode/tests/test_mmask.c

Branch :

  • Show log

    Commit

  • Author : Kentaro Fukuchi
    Date : 2011-11-24 02:21:14
    Hash : ac625373
    Message : Micro QR Code support is marked as 'experimental'. More tests and document updates.

  • tests/test_mmask.c
  • #include <stdio.h>
    #include <string.h>
    #include "common.h"
    #include "../mmask.h"
    #include "../mqrspec.h"
    
    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 */
    	"#_#_#_"
    	"___###"
    	"#___##"
    	"_#_#_#"
    	"###___"
    	"_###__"
    };
    
    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);
    }
    
    void print_masks(void)
    {
    	int i;
    
    	for(i=0; i<4; i++) {
    		print_mask(i);
    	}
    }
    
    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;
    }
    
    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();
    }
    
    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(void)
    {
    	//print_masks();
    	test_masks();
    	test_maskEvaluation();
    
    	report();
    
    	MQRspec_clearCache();
    
    	return 0;
    }