diff --git a/lambda-test/Makefile b/lambda-test/Makefile index dfca381..7f70182 100644 --- a/lambda-test/Makefile +++ b/lambda-test/Makefile @@ -15,8 +15,8 @@ ## If you've split your program into multiple .c / .h files, ## include the additional source (in same directory) here LOCAL_SOURCE = avrjunit.c adc-test.c alert-test.c command-test.c \ -display-test.c integers-test.c interrupts-test.c sensors-test.c strings-test.c \ -usart-test.c +display-test.c integers-test.c interrupts-test.c rules-test.c sensors-test.c \ +strings-test.c usart-test.c ## Here you can link to one more directory (and multiple .c files) EXTRA_SOURCE_DIR = ../lambda/ diff --git a/lambda-test/lambda-test.c b/lambda-test/lambda-test.c index 00e08cd..edb063d 100644 --- a/lambda-test/lambda-test.c +++ b/lambda-test/lambda-test.c @@ -29,20 +29,22 @@ extern TestClass displayClass; extern TestClass integersClass; extern TestClass interruptsClass; + extern TestClass rulesClass; extern TestClass sensorsClass; extern TestClass stringsClass; extern TestClass usartClass; beginSuite("lambda"); - runClass(adcClass); - runClass(alertClass); - runClass(commandClass); - runClass(displayClass); - runClass(integersClass); - runClass(interruptsClass); - runClass(sensorsClass); - runClass(stringsClass); - runClass(usartClass); +// runClass(adcClass); +// runClass(alertClass); +// runClass(commandClass); +// runClass(displayClass); +// runClass(integersClass); +// runClass(interruptsClass); + runClass(rulesClass); +// runClass(sensorsClass); +// runClass(stringsClass); +// runClass(usartClass); endSuite(); return 0; diff --git a/lambda-test/rules-test.c b/lambda-test/rules-test.c new file mode 100644 index 0000000..dcac1ba --- /dev/null +++ b/lambda-test/rules-test.c @@ -0,0 +1,237 @@ +/* + * rules-test.c + * + * Unit tests for the lambda project. + * + * Created on: 28.05.2015 + * Author: dode@luniks.net + * + */ + +#include "avrjunit.h" +#include "rules.h" + +extern uint16_t age; +extern int8_t dir; +extern Rule rules[]; + +/* Module rules */ + +bool testAirgate50(void) { + + Measurement meas = {0, 0, 0}; + + resetRules(); + dir = -1; + reason(meas); + assertFalse(rules[0].fired); + + resetRules(); + dir = 0; + reason(meas); + assertFalse(rules[0].fired); + + resetRules(); + dir = 1; + reason(meas); + assertFalse(rules[0].fired); + + meas.tempI = 500; + + resetRules(); + dir = -1; + reason(meas); + assertFalse(rules[0].fired); + + resetRules(); + dir = 0; + reason(meas); + assertFalse(rules[0].fired); + + resetRules(); + dir = 1; + reason(meas); + assertTrue(rules[0].fired); + + return true; +} + +bool testAirgate25(void) { + + Measurement meas = {999, 0, 0}; + + resetRules(); + dir = 1; + reason(meas); + assertFalse(rules[1].fired); + + resetRules(); + dir = 0; + reason(meas); + assertFalse(rules[1].fired); + + resetRules(); + dir = -1; + reason(meas); + assertFalse(rules[1].fired); + + meas.tempI = 799; + + resetRules(); + dir = 1; + reason(meas); + assertFalse(rules[1].fired); + + resetRules(); + dir = 0; + reason(meas); + assertFalse(rules[1].fired); + + resetRules(); + dir = -1; + reason(meas); + assertTrue(rules[1].fired); + + return true; +} + +bool testAirgateClose(void) { + + Measurement meas = {999, 0, 0}; + + resetRules(); + dir = 1; + reason(meas); + assertFalse(rules[2].fired); + + resetRules(); + dir = 0; + reason(meas); + assertFalse(rules[2].fired); + + resetRules(); + dir = -1; + reason(meas); + assertFalse(rules[2].fired); + + meas.tempI = 399; + + resetRules(); + dir = 1; + reason(meas); + assertFalse(rules[2].fired); + + resetRules(); + dir = 0; + reason(meas); + assertFalse(rules[2].fired); + + resetRules(); + dir = -1; + reason(meas); + assertTrue(rules[2].fired); + + return true; +} + +bool testTooRich(void) { + + Measurement meas = {0, 0, 0}; + dir = 0; + + meas.tempI = 99; + meas.lambda = 2000; + + resetRules(); + reason(meas); + assertFalse(rules[3].fired); + + meas.tempI = 100; + meas.lambda = 2000; + + resetRules(); + reason(meas); + assertFalse(rules[3].fired); + + meas.tempI = 99; + meas.lambda = 1199; + + resetRules(); + reason(meas); + assertFalse(rules[3].fired); + + meas.tempI = 100; + meas.lambda = 1199; + + resetRules(); + reason(meas); + assertTrue(rules[3].fired); + + meas.lambda = 1300; + age = 0; + + reason(meas); + assertFalse(rules[3].fired); + + return true; +} + +bool testFireOut(void) { + + resetRules(); + Measurement meas = {0, 0, 0}; + dir = 1; + + meas.tempI = 50; + + age = 0; + reason(meas); + assertFalse(rules[4].fired); + + meas.tempI = 100; + + age = 0; + reason(meas); + assertFalse(rules[4].fired); + + meas.tempI = 125; + + age = 0; + reason(meas); + assertFalse(rules[4].fired); + + meas.tempI = 99; + + age = 0; + reason(meas); + assertTrue(rules[4].fired); + + meas.tempI = 125; + + age = 0; + reason(meas); + assertFalse(rules[4].fired); + + return true; +} + +/* Test "class" */ +static const char class[] PROGMEM = "rules"; + +/* Test names */ +static const char testAirgate50_P[] PROGMEM = "testAirgate50"; +static const char testAirgate25_P[] PROGMEM = "testAirgate25"; +static const char testAirgateClose_P[] PROGMEM = "testAirgateClose"; +static const char testTooRich_P[] PROGMEM = "testTooRich"; +static const char testFireOut_P[] PROGMEM = "testFireOut"; + +/* Tests */ +static TestCase const tests[] = { + {class, testAirgate50_P, testAirgate50}, + {class, testAirgate25_P, testAirgate25}, + {class, testAirgateClose_P, testAirgateClose}, + {class, testTooRich_P, testTooRich}, + {class, testFireOut_P, testFireOut} +}; + +TestClass rulesClass = {tests, sizeof(tests) / sizeof(tests[0])}; diff --git a/lambda/rules.c b/lambda/rules.c index 1ac3632..906c7b2 100644 --- a/lambda/rules.c +++ b/lambda/rules.c @@ -95,7 +95,7 @@ /** * Array of rules. */ -static Rule rules[] = { +Rule rules[] = { {false, airgate50}, {false, airgate25}, {false, airgateClose},