Added C test case for getModule(), setModule(), etc.
This commit is contained in:
parent
0bd7684198
commit
fffe81aeb1
|
@ -32,6 +32,7 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <time.h>
|
||||||
#include "qrcodegen.h"
|
#include "qrcodegen.h"
|
||||||
|
|
||||||
#define ARRAY_LENGTH(name) (sizeof(name) / sizeof(name[0]))
|
#define ARRAY_LENGTH(name) (sizeof(name) / sizeof(name[0]))
|
||||||
|
@ -50,6 +51,9 @@ void calcReedSolomonRemainder(const uint8_t data[], int dataLen, const uint8_t g
|
||||||
uint8_t finiteFieldMultiply(uint8_t x, uint8_t y);
|
uint8_t finiteFieldMultiply(uint8_t x, uint8_t y);
|
||||||
void initializeFunctionModules(int version, uint8_t qrcode[]);
|
void initializeFunctionModules(int version, uint8_t qrcode[]);
|
||||||
int getAlignmentPatternPositions(int version, uint8_t result[7]);
|
int getAlignmentPatternPositions(int version, uint8_t result[7]);
|
||||||
|
bool getModule(const uint8_t qrcode[], int x, int y);
|
||||||
|
void setModule(uint8_t qrcode[], int x, int y, bool isBlack);
|
||||||
|
void setModuleBounded(uint8_t qrcode[], int x, int y, bool isBlack);
|
||||||
|
|
||||||
|
|
||||||
/*---- Test cases ----*/
|
/*---- Test cases ----*/
|
||||||
|
@ -360,9 +364,90 @@ static void testGetAlignmentPatternPositions(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void testGetSetModule(void) {
|
||||||
|
uint8_t qrcode[qrcodegen_BUFFER_LEN_FOR_VERSION(23)];
|
||||||
|
initializeFunctionModules(23, qrcode);
|
||||||
|
int size = qrcodegen_getSize(qrcode);
|
||||||
|
|
||||||
|
for (int y = 0; y < size; y++) { // Clear all to white
|
||||||
|
for (int x = 0; x < size; x++)
|
||||||
|
setModule(qrcode, x, y, false);
|
||||||
|
}
|
||||||
|
for (int y = 0; y < size; y++) { // Check all white
|
||||||
|
for (int x = 0; x < size; x++)
|
||||||
|
assert(qrcodegen_getModule(qrcode, x, y) == false);
|
||||||
|
}
|
||||||
|
for (int y = 0; y < size; y++) { // Set all to black
|
||||||
|
for (int x = 0; x < size; x++)
|
||||||
|
setModule(qrcode, x, y, true);
|
||||||
|
}
|
||||||
|
for (int y = 0; y < size; y++) { // Check all black
|
||||||
|
for (int x = 0; x < size; x++)
|
||||||
|
assert(qrcodegen_getModule(qrcode, x, y) == true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set some out of bounds modules to white
|
||||||
|
setModuleBounded(qrcode, -1, -1, false);
|
||||||
|
setModuleBounded(qrcode, -1, 0, false);
|
||||||
|
setModuleBounded(qrcode, 0, -1, false);
|
||||||
|
setModuleBounded(qrcode, size, 5, false);
|
||||||
|
setModuleBounded(qrcode, 72, size, false);
|
||||||
|
setModuleBounded(qrcode, size, size, false);
|
||||||
|
for (int y = 0; y < size; y++) { // Check all black
|
||||||
|
for (int x = 0; x < size; x++)
|
||||||
|
assert(qrcodegen_getModule(qrcode, x, y) == true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set some modules to white
|
||||||
|
setModule(qrcode, 3, 8, false);
|
||||||
|
setModule(qrcode, 61, 49, false);
|
||||||
|
for (int y = 0; y < size; y++) { // Check most black
|
||||||
|
for (int x = 0; x < size; x++) {
|
||||||
|
bool white = (x == 3 && y == 8) || (x == 61 && y == 49);
|
||||||
|
assert(qrcodegen_getModule(qrcode, x, y) != white);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
numTestCases++;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void testGetSetModuleRandomly(void) {
|
||||||
|
uint8_t qrcode[qrcodegen_BUFFER_LEN_FOR_VERSION(1)];
|
||||||
|
initializeFunctionModules(1, qrcode);
|
||||||
|
int size = qrcodegen_getSize(qrcode);
|
||||||
|
|
||||||
|
bool modules[21][21];
|
||||||
|
for (int y = 0; y < size; y++) {
|
||||||
|
for (int x = 0; x < size; x++)
|
||||||
|
modules[y][x] = qrcodegen_getModule(qrcode, x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
long trials = 100000;
|
||||||
|
for (long i = 0; i < trials; i++) {
|
||||||
|
int x = rand() % (size * 2) - size / 2;
|
||||||
|
int y = rand() % (size * 2) - size / 2;
|
||||||
|
bool isInBounds = 0 <= x && x < size && 0 <= y && y < size;
|
||||||
|
bool oldColor = isInBounds && modules[y][x];
|
||||||
|
if (isInBounds)
|
||||||
|
assert(getModule(qrcode, x, y) == oldColor);
|
||||||
|
assert(qrcodegen_getModule(qrcode, x, y) == oldColor);
|
||||||
|
|
||||||
|
bool newColor = rand() % 2 == 0;
|
||||||
|
if (isInBounds)
|
||||||
|
modules[y][x] = newColor;
|
||||||
|
if (isInBounds && rand() % 2 == 0)
|
||||||
|
setModule(qrcode, x, y, newColor);
|
||||||
|
else
|
||||||
|
setModuleBounded(qrcode, x, y, newColor);
|
||||||
|
}
|
||||||
|
numTestCases++;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*---- Main runner ----*/
|
/*---- Main runner ----*/
|
||||||
|
|
||||||
int main(void) {
|
int main(void) {
|
||||||
|
srand(time(NULL));
|
||||||
testGetTextProperties();
|
testGetTextProperties();
|
||||||
testGetNumDataCodewords();
|
testGetNumDataCodewords();
|
||||||
testGetNumRawDataModules();
|
testGetNumRawDataModules();
|
||||||
|
@ -371,6 +456,8 @@ int main(void) {
|
||||||
testFiniteFieldMultiply();
|
testFiniteFieldMultiply();
|
||||||
testInitializeFunctionModulesEtc();
|
testInitializeFunctionModulesEtc();
|
||||||
testGetAlignmentPatternPositions();
|
testGetAlignmentPatternPositions();
|
||||||
|
testGetSetModule();
|
||||||
|
testGetSetModuleRandomly();
|
||||||
printf("All %d test cases passed\n", numTestCases);
|
printf("All %d test cases passed\n", numTestCases);
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,9 +66,9 @@ static void drawCodewords(const uint8_t data[], int dataLen, uint8_t qrcode[]);
|
||||||
static void applyMask(const uint8_t functionModules[], uint8_t qrcode[], enum qrcodegen_Mask mask);
|
static void applyMask(const uint8_t functionModules[], uint8_t qrcode[], enum qrcodegen_Mask mask);
|
||||||
static long getPenaltyScore(const uint8_t qrcode[]);
|
static long getPenaltyScore(const uint8_t qrcode[]);
|
||||||
|
|
||||||
static bool getModule(const uint8_t qrcode[], int x, int y);
|
testable bool getModule(const uint8_t qrcode[], int x, int y);
|
||||||
static void setModule(uint8_t qrcode[], int x, int y, bool isBlack);
|
testable void setModule(uint8_t qrcode[], int x, int y, bool isBlack);
|
||||||
static void setModuleBounded(uint8_t qrcode[], int x, int y, bool isBlack);
|
testable void setModuleBounded(uint8_t qrcode[], int x, int y, bool isBlack);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -795,7 +795,7 @@ bool qrcodegen_getModule(const uint8_t qrcode[], int x, int y) {
|
||||||
|
|
||||||
|
|
||||||
// Gets the module at the given coordinates, which must be in bounds.
|
// Gets the module at the given coordinates, which must be in bounds.
|
||||||
static bool getModule(const uint8_t qrcode[], int x, int y) {
|
testable bool getModule(const uint8_t qrcode[], int x, int y) {
|
||||||
int qrsize = qrcode[0];
|
int qrsize = qrcode[0];
|
||||||
assert(21 <= qrsize && qrsize <= 177 && 0 <= x && x < qrsize && 0 <= y && y < qrsize);
|
assert(21 <= qrsize && qrsize <= 177 && 0 <= x && x < qrsize && 0 <= y && y < qrsize);
|
||||||
int index = y * qrsize + x;
|
int index = y * qrsize + x;
|
||||||
|
@ -806,7 +806,7 @@ static bool getModule(const uint8_t qrcode[], int x, int y) {
|
||||||
|
|
||||||
|
|
||||||
// Sets the module at the given coordinates, which must be in bounds.
|
// Sets the module at the given coordinates, which must be in bounds.
|
||||||
static void setModule(uint8_t qrcode[], int x, int y, bool isBlack) {
|
testable void setModule(uint8_t qrcode[], int x, int y, bool isBlack) {
|
||||||
int qrsize = qrcode[0];
|
int qrsize = qrcode[0];
|
||||||
assert(21 <= qrsize && qrsize <= 177 && 0 <= x && x < qrsize && 0 <= y && y < qrsize);
|
assert(21 <= qrsize && qrsize <= 177 && 0 <= x && x < qrsize && 0 <= y && y < qrsize);
|
||||||
int index = y * qrsize + x;
|
int index = y * qrsize + x;
|
||||||
|
@ -820,7 +820,7 @@ static void setModule(uint8_t qrcode[], int x, int y, bool isBlack) {
|
||||||
|
|
||||||
|
|
||||||
// Sets the module at the given coordinates, doing nothing if out of bounds.
|
// Sets the module at the given coordinates, doing nothing if out of bounds.
|
||||||
static void setModuleBounded(uint8_t qrcode[], int x, int y, bool isBlack) {
|
testable void setModuleBounded(uint8_t qrcode[], int x, int y, bool isBlack) {
|
||||||
int qrsize = qrcode[0];
|
int qrsize = qrcode[0];
|
||||||
if (0 <= x && x < qrsize && 0 <= y && y < qrsize)
|
if (0 <= x && x < qrsize && 0 <= y && y < qrsize)
|
||||||
setModule(qrcode, x, y, isBlack);
|
setModule(qrcode, x, y, isBlack);
|
||||||
|
|
Loading…
Reference in New Issue