From 4371f11afb2a313b1bbe18329a9c29462041ffa0 Mon Sep 17 00:00:00 2001 From: Brian Park Date: Tue, 10 Apr 2018 14:18:56 -0700 Subject: [PATCH 01/15] better messages for assertTrue() and assertFalse(), fix for #17 --- README.md | 31 +++++++++++++++++++++- src/aunit/Assertion.cpp | 59 ++++++++++++++++++++++++++++++++++++++++- src/aunit/Assertion.h | 20 +++++++------- src/aunit/Test.h | 9 +++++++ 4 files changed, 107 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 6bbeff3..370d071 100644 --- a/README.md +++ b/README.md @@ -844,6 +844,31 @@ The error message (if enabled, which is the default) is: Assertion failed: (3) == (4), file AUnitTest.ino, line 134. ``` +Asserts with `bool` values produce customized messages, printing "true" or +"false" instead of using the Print class default conversion to `int`: +``` +assertEquals(true, false); + +Assertion failed: (true) == (false), file AUnitTest.ino, line 134. +``` + +Similarly, the `assertTrue()` and `assertFalse()` macros provide more customized +messages: +``` +bool ok = false; +assertTrue(ok); + +Assertion failed: (false) is true, file AUnitTest.ino, line 134. +``` + +and +``` +bool ok = true; +assertFalse(ok); + +Assertion failed: (true) is false, file AUnitTest.ino, line 134. +``` + ***ArduinoUnit Compatibility***: _ArduinoUnit captures the arguments of the `assertEqual()` macro and prints:_ @@ -854,7 +879,11 @@ Assertion failed: (expected=3) == (counter=4), file AUnitTest.ino, line 134. _Each capture of the parameter string consumes flash memory space. If the unit test has numerous `assertXxx()` statements, the flash memory cost is expensive. -AUnit omits the parameters to reduce flash memory space by about 33%_ +AUnit omits the parameters to reduce flash memory space by about 33%._ + +_The messages for asserts with bool values are customized for better clarity +(partially to compensate for the lack of capture of the string of the actual +arguments, and are different from ArduinoUnit._ ### Test Summary diff --git a/src/aunit/Assertion.cpp b/src/aunit/Assertion.cpp index 4c2c494..4123ae8 100644 --- a/src/aunit/Assertion.cpp +++ b/src/aunit/Assertion.cpp @@ -38,7 +38,7 @@ namespace aunit { // Assertion failed: (5) == (6), file Test.ino, line 820. // Assertion passed: (6) == (6), file Test.ino, line 820. template -void printAssertionMessage(bool ok, const char* file, uint16_t line, +static void printAssertionMessage(bool ok, const char* file, uint16_t line, const A& lhs, const char *opName, const B& rhs) { // Don't use F() strings here because flash memory strings are not deduped by @@ -64,11 +64,68 @@ void printAssertionMessage(bool ok, const char* file, uint16_t line, printer->println('.'); } +// Special version of (bool, bool) because Arduino Print.h converts +// bool into int, which prints out "(1) == (0)", which isn't as useful. +// This prints "(true) == (false)". +static void printAssertionMessage(bool ok, const char* file, uint16_t line, + bool lhs, const char *opName, bool rhs) { + + // Don't use F() strings here. Same reason as above. + Print* printer = Printer::getPrinter(); + printer->print("Assertion "); + printer->print(ok ? "passed" : "failed"); + printer->print(": ("); + printer->print(lhs ? "true" : "false"); + printer->print(") "); + printer->print(opName); + printer->print(" ("); + printer->print(rhs ? "true" : "false"); + printer->print(')'); + printer->print(", file "); + printer->print(file); + printer->print(", line "); + printer->print(line); + printer->println('.'); +} + +// Special version for assertTrue(arg) and assertFalse(arg). +// Prints: +// "Assertion passed/failed: (arg) is true" +// "Assertion passed/failed: (arg) is false" +static void printAssertionBoolMessage(bool ok, const char* file, uint16_t line, + bool arg, bool value) { + + // Don't use F() strings here. Same reason as above. + Print* printer = Printer::getPrinter(); + printer->print("Assertion "); + printer->print(ok ? "passed" : "failed"); + printer->print(": ("); + printer->print(arg ? "true" : "false"); + printer->print(") is "); + printer->print(value ? "true" : "false"); + printer->print(", file "); + printer->print(file); + printer->print(", line "); + printer->print(line); + printer->println('.'); +} + bool Assertion::isOutputEnabled(bool ok) { return (ok && isVerbosity(Verbosity::kAssertionPassed)) || (!ok && isVerbosity(Verbosity::kAssertionFailed)); } +bool Assertion::assertionBool(const char* file, uint16_t line, bool arg, + bool value) { + if (isDone()) return false; + bool ok = (arg == value); + if (isOutputEnabled(ok)) { + printAssertionBoolMessage(ok, file, line, arg, value); + } + setPassOrFail(ok); + return ok; +} + bool Assertion::assertion(const char* file, uint16_t line, bool lhs, const char* opName, bool (*op)(bool lhs, bool rhs), bool rhs) { diff --git a/src/aunit/Assertion.h b/src/aunit/Assertion.h index 640d7fb..2c1ba7a 100644 --- a/src/aunit/Assertion.h +++ b/src/aunit/Assertion.h @@ -60,10 +60,10 @@ SOFTWARE. assertOp(arg1,aunit::compareMoreOrEqual,">=",arg2) /** Assert that arg is true. */ -#define assertTrue(arg) assertEqual(arg,true) +#define assertTrue(arg) assertBool(arg,true) /** Assert that arg is false. */ -#define assertFalse(arg) assertEqual(arg,false) +#define assertFalse(arg) assertBool(arg,false) /** Internal helper macro, shouldn't be called directly by users. */ #define assertOp(arg1,op,opName,arg2) do {\ @@ -71,6 +71,12 @@ SOFTWARE. return;\ } while (false) +/** Internal helper macro, shouldn't be called directly by users. */ +#define assertBool(arg,value) do {\ + if (!assertionBool(__FILE__,__LINE__,(arg),(value)))\ + return;\ +} while (false) + class __FlashStringHelper; class String; @@ -103,14 +109,8 @@ class Assertion: public Test { /** Returns true if an assertion message should be printed. */ bool isOutputEnabled(bool ok); - // NOTE: Don't create a virtual destructor. That's the normal best practice - // for classes that will be used polymorphically. However, this class will - // never be deleted polymorphically (i.e. through its pointer) so it - // doesn't need a virtual destructor. In fact, adding it causes flash and - // static memory to increase dramatically because each test() and testing() - // macro creates a new subclass. AceButtonTest flash memory increases from - // 18928 to 20064 bytes, and static memory increases from 917 to 1055 - // bytes. + bool assertionBool(const char* file, uint16_t line, bool arg, + bool value); bool assertion(const char* file, uint16_t line, bool lhs, const char* opName, bool (*op)(bool lhs, bool rhs), diff --git a/src/aunit/Test.h b/src/aunit/Test.h index 4e3bf52..45cd527 100644 --- a/src/aunit/Test.h +++ b/src/aunit/Test.h @@ -125,6 +125,15 @@ class Test { /** Empty constructor. The name will be set later. */ Test(); + // NOTE: Don't create a virtual destructor. That's the normal best practice + // for classes that will be used polymorphically. However, this class will + // never be deleted polymorphically (i.e. through its pointer) so it + // doesn't need a virtual destructor. In fact, adding it causes flash and + // static memory to increase dramatically because each test() and testing() + // macro creates a new subclass. AceButtonTest flash memory increases from + // 18928 to 20064 bytes, and static memory increases from 917 to 1055 + // bytes. + /** * Optional method that performs any initialization. The assertXxx() macros, * as well as pass(), fail() and skip() functions can be called in here. From 9c7ef07d36206202e8500f19a4e06d40491d70e0 Mon Sep 17 00:00:00 2001 From: Brian Park Date: Wed, 11 Apr 2018 08:24:28 -0700 Subject: [PATCH 02/15] Move all macros into separate AssertMacros.h, MetaAssertMacros.h and TestMacros.h --- src/AUnit.h | 4 +- src/aunit/AssertMacros.h | 81 +++++++++ src/aunit/Assertion.h | 50 ------ src/aunit/MetaAssertMacros.h | 217 ++++++++++++++++++++++++ src/aunit/MetaAssertion.h | 183 -------------------- src/aunit/{TestMacro.h => TestMacros.h} | 11 +- 6 files changed, 307 insertions(+), 239 deletions(-) create mode 100644 src/aunit/AssertMacros.h create mode 100644 src/aunit/MetaAssertMacros.h rename src/aunit/{TestMacro.h => TestMacros.h} (95%) diff --git a/src/AUnit.h b/src/AUnit.h index 593658a..6ff8cd4 100644 --- a/src/AUnit.h +++ b/src/AUnit.h @@ -41,7 +41,9 @@ SOFTWARE. #include "aunit/TestOnce.h" #include "aunit/TestAgain.h" #include "aunit/TestRunner.h" -#include "aunit/TestMacro.h" +#include "aunit/AssertMacros.h" +#include "aunit/MetaAssertMacros.h" +#include "aunit/TestMacros.h" // Version format: xxyyzz == "xx.yy.zz" #define AUNIT_VERSION 000402 diff --git a/src/aunit/AssertMacros.h b/src/aunit/AssertMacros.h new file mode 100644 index 0000000..b5f6a73 --- /dev/null +++ b/src/aunit/AssertMacros.h @@ -0,0 +1,81 @@ +/* +MIT License + +Copyright (c) 2018 Brian T. Park + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +// Significant portions of the design and implementation of this file came from +// https://github.com/mmurdoch/arduinounit/blob/master/src/ArduinoUnit.h + +/** + * @file AssertMacros.h + * + * Various assertion macros (assertXxx()) are defined in this header. These + * macros can be used only in a subclass of TestOnce or TestAgain, which is + * true for all tests created by test(), testing(), testF() and testingF(). + */ + +#ifndef AUNIT_ASSERT_MACROS_H +#define AUNIT_ASSERT_MACROS_H + +/** Assert that arg1 is equal to arg2. */ +#define assertEqual(arg1,arg2) \ + assertOpInternal(arg1,aunit::compareEqual,"==",arg2) + +/** Assert that arg1 is not equal to arg2. */ +#define assertNotEqual(arg1,arg2) \ + assertOpInternal(arg1,aunit::compareNotEqual,"!=",arg2) + +/** Assert that arg1 is less than arg2. */ +#define assertLess(arg1,arg2) \ + assertOpInternal(arg1,aunit::compareLess,"<",arg2) + +/** Assert that arg1 is more than arg2. */ +#define assertMore(arg1,arg2) \ + assertOpInternal(arg1,aunit::compareMore,">",arg2) + +/** Assert that arg1 is less than or equal to arg2. */ +#define assertLessOrEqual(arg1,arg2) \ + assertOpInternal(arg1,aunit::compareLessOrEqual,"<=",arg2) + +/** Assert that arg1 is more than or equal to arg2. */ +#define assertMoreOrEqual(arg1,arg2) \ + assertOpInternal(arg1,aunit::compareMoreOrEqual,">=",arg2) + +/** Assert that arg is true. */ +#define assertTrue(arg) assertBoolInternal(arg,true) + +/** Assert that arg is false. */ +#define assertFalse(arg) assertBoolInternal(arg,false) + +/** Internal helper macro, shouldn't be called directly by users. */ +#define assertOpInternal(arg1,op,opName,arg2) do {\ + if (!assertion(__FILE__,__LINE__,(arg1),opName,op,(arg2)))\ + return;\ +} while (false) + +/** Internal helper macro, shouldn't be called directly by users. */ +#define assertBoolInternal(arg,value) do {\ + if (!assertionBool(__FILE__,__LINE__,(arg),(value)))\ + return;\ +} while (false) + +#endif diff --git a/src/aunit/Assertion.h b/src/aunit/Assertion.h index 2c1ba7a..7f6b500 100644 --- a/src/aunit/Assertion.h +++ b/src/aunit/Assertion.h @@ -22,61 +22,11 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -// Significant portions of the design and implementation of this file came from -// https://github.com/mmurdoch/arduinounit/blob/master/src/ArduinoUnit.h - -/** - * @file Assertion.h - * - * Various assertXxx() macros are defined in this header. They all go through - * another helper macro called assertOp(), eventually calling one of the - * methods on the Assertion class. - */ - #ifndef AUNIT_ASSERTION_H #define AUNIT_ASSERTION_H #include "Test.h" -/** Assert that arg1 is equal to arg2. */ -#define assertEqual(arg1,arg2) assertOp(arg1,aunit::compareEqual,"==",arg2) - -/** Assert that arg1 is not equal to arg2. */ -#define assertNotEqual(arg1,arg2) \ - assertOp(arg1,aunit::compareNotEqual,"!=",arg2) - -/** Assert that arg1 is less than arg2. */ -#define assertLess(arg1,arg2) assertOp(arg1,aunit::compareLess,"<",arg2) - -/** Assert that arg1 is more than arg2. */ -#define assertMore(arg1,arg2) assertOp(arg1,aunit::compareMore,">",arg2) - -/** Assert that arg1 is less than or equal to arg2. */ -#define assertLessOrEqual(arg1,arg2) \ - assertOp(arg1,aunit::compareLessOrEqual,"<=",arg2) - -/** Assert that arg1 is more than or equal to arg2. */ -#define assertMoreOrEqual(arg1,arg2) \ - assertOp(arg1,aunit::compareMoreOrEqual,">=",arg2) - -/** Assert that arg is true. */ -#define assertTrue(arg) assertBool(arg,true) - -/** Assert that arg is false. */ -#define assertFalse(arg) assertBool(arg,false) - -/** Internal helper macro, shouldn't be called directly by users. */ -#define assertOp(arg1,op,opName,arg2) do {\ - if (!assertion(__FILE__,__LINE__,(arg1),opName,op,(arg2)))\ - return;\ -} while (false) - -/** Internal helper macro, shouldn't be called directly by users. */ -#define assertBool(arg,value) do {\ - if (!assertionBool(__FILE__,__LINE__,(arg),(value)))\ - return;\ -} while (false) - class __FlashStringHelper; class String; diff --git a/src/aunit/MetaAssertMacros.h b/src/aunit/MetaAssertMacros.h new file mode 100644 index 0000000..c575c65 --- /dev/null +++ b/src/aunit/MetaAssertMacros.h @@ -0,0 +1,217 @@ +/* +MIT License + +Copyright (c) 2018 Brian T. Park + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +// Significant portions of the design and implementation of this file came from +// https://github.com/mmurdoch/arduinounit/blob/master/src/ArduinoUnit.h + +/** + * @file MetaAssertMacros.h + * + * Various assertTestXxx(), checkTestXxx(), assertTestXxxF() and + * checkTestXxxF() macros are defined in this header. + */ + +#ifndef AUNIT_META_ASSERT_MACROS_H +#define AUNIT_META_ASSERT_MACROS_H + +// Meta tests, same syntax as ArduinoUnit for compatibility. +// The checkTestXxx() macros return a boolean, and execution continues. + +/** Return true if test 'name' is done. */ +#define checkTestDone(name) (test_##name##_instance.isDone()) + +/** Return true if test 'name' is not done. */ +#define checkTestNotDone(name) (test_##name##_instance.isNotDone()) + +/** Return true if test 'name' has passed. */ +#define checkTestPass(name) (test_##name##_instance.isPassed()) + +/** Return true if test 'name' has not passed. */ +#define checkTestNotPass(name) (test_##name##_instance.isNotPassed()) + +/** Return true if test 'name' has failed. */ +#define checkTestFail(name) (test_##name##_instance.isFailed()) + +/** Return true if test 'name' has not failed. */ +#define checkTestNotFail(name) (test_##name##_instance.isNotFailed()) + +/** Return true if test 'name' has been skipped. */ +#define checkTestSkip(name) (test_##name##_instance.isSkipped()) + +/** Return true if test 'name' has not been skipped. */ +#define checkTestNotSkip(name) (test_##name##_instance.isNotSkipped()) + +/** Return true if test 'name' has timed out. */ +#define checkTestExpire(name) (test_##name##_instance.isExpired()) + +/** Return true if test 'name' has not timed out. */ +#define checkTestNotExpire(name) (test_##name##_instance.isNotExpired()) + +// If the assertTestXxx() macros fail, they generate an optional output, calls +// fail(), and returns from the current test case. + +/** Assert that test 'name' is done. */ +#define assertTestDone(name) \ + assertTestStatusInternal(name, isDone, kMessageDone) + +/** Assert that test 'name' is not done. */ +#define assertTestNotDone(name) \ + assertTestStatusInternal(name, isNotDone, kMessageNotDone) + +/** Assert that test 'name' has passed. */ +#define assertTestPass(name) \ + assertTestStatusInternal(name, isPassed, kMessagePassed) + +/** Assert that test 'name' has not passed. */ +#define assertTestNotPass(name) \ + assertTestStatusInternal(name, isNotPassed, kMessageNotPassed) + +/** Assert that test 'name' has failed. */ +#define assertTestFail(name) \ + assertTestStatusInternal(name, isFailed, kMessageFailed) + +/** Assert that test 'name' has not failed. */ +#define assertTestNotFail(name) \ + assertTestStatusInternal(name, isNotFailed, kMessageNotFailed) + +/** Assert that test 'name' has been skipped. */ +#define assertTestSkip(name) \ + assertTestStatusInternal(name, isSkipped, kMessageSkipped) + +/** Assert that test 'name' has not been skipped. */ +#define assertTestNotSkip(name) \ + assertTestStatusInternal(name, isNotSkipped, kMessageNotSkipped) + +/** Assert that test 'name' has timed out. */ +#define assertTestExpire(name) \ + assertTestStatusInternal(name, isExpired, kMessageExpired) + +/** Assert that test 'name' has not timed out. */ +#define assertTestNotExpire(name) \ + assertTestStatusInternal(name, isNotExpired, kMessageNotExpired) + +/** Internal helper macro, shouldn't be called directly by users. */ +#define assertTestStatusInternal(name,method,message) do {\ + if (!assertionTestStatus(\ + __FILE__,__LINE__,#name,FPSTR(message),test_##name##_instance.method()))\ + return;\ +} while (false) + +// Meta tests for testF() and testingF() are slightly different because +// the name of the fixture class is appended to the instance name. + +/** Return true if test 'name' is done. */ +#define checkTestDoneF(test_class,name) \ + (test_class##_##name##_instance.isDone()) + +/** Return true if test 'name' is not done. */ +#define checkTestNotDoneF(test_class,name) \ + (test_class##_##name##_instance.isNotDone()) + +/** Return true if test 'name' has passed. */ +#define checkTestPassF(test_class,name) \ + (test_class##_##name##_instance.isPassed()) + +/** Return true if test 'name' has not passed. */ +#define checkTestNotPassF(test_class,name) \ + (test_class##_##name##_instance.isNotPassed()) + +/** Return true if test 'name' has failed. */ +#define checkTestFailF(test_class,name) \ + (test_class##_##name##_instance.isFailed()) + +/** Return true if test 'name' has not failed. */ +#define checkTestNotFailF(test_class,name) \ + (test_class##_##name##_instance.isNotFailed()) + +/** Return true if test 'name' has been skipped. */ +#define checkTestSkipF(test_class,name) \ + (test_class##_##name##_instance.isSkipped()) + +/** Return true if test 'name' has not been skipped. */ +#define checkTestNotSkipF(test_class,name) \ + (test_class##_##name##_instance.isNotSkipped()) + +/** Return true if test 'name' has timed out. */ +#define checkTestExpireF(test_class,name) \ + (test_class##_##name##_instance.isExpired()) + +/** Return true if test 'name' has not timed out. */ +#define checkTestNotExpireF(test_class,name) \ + (test_class##_##name##_instance.isNotExpired()) + +// If the assertTestXxx() macros fail, they generate an optional output, calls +// fail(), and returns from the current test case. + +/** Assert that test 'name' is done. */ +#define assertTestDoneF(test_class,name) \ + assertTestStatusInternalF(test_class, name, isDone, kMessageDone) + +/** Assert that test 'name' is not done. */ +#define assertTestNotDoneF(test_class,name) \ + assertTestStatusInternalF(test_class, name, isNotDone, kMessageNotDone) + +/** Assert that test 'name' has passed. */ +#define assertTestPassF(test_class,name) \ + assertTestStatusInternalF(test_class, name, isPassed, kMessagePassed) + +/** Assert that test 'name' has not passed. */ +#define assertTestNotPassF(test_class,name) \ + assertTestStatusInternalF(test_class, name, isNotPassed, kMessageNotPassed) + +/** Assert that test 'name' has failed. */ +#define assertTestFailF(test_class,name) \ + assertTestStatusInternalF(test_class, name, isFailed, kMessageFailed) + +/** Assert that test 'name' has not failed. */ +#define assertTestNotFailF(test_class,name) \ + assertTestStatusInternalF(test_class, name, isNotFailed, kMessageNotFailed) + +/** Assert that test 'name' has been skipped. */ +#define assertTestSkipF(test_class,name) \ + assertTestStatusInternalF(test_class, name, isSkipped, kMessageSkipped) + +/** Assert that test 'name' has not been skipped. */ +#define assertTestNotSkipF(test_class,name) \ + assertTestStatusInternalF(test_class, name, isNotSkipped, \ + kMessageNotSkipped) + +/** Assert that test 'name' has timed out. */ +#define assertTestExpireF(test_class,name) \ + assertTestStatusInternalF(test_class, name, isExpired, kMessageExpired) + +/** Assert that test 'name' has not timed out. */ +#define assertTestNotExpireF(test_class,name) \ + assertTestStatusInternalF(test_class, name, isNotExpired, \ + kMessageNotExpired) + +/** Internal helper macro, shouldn't be called directly by users. */ +#define assertTestStatusInternalF(test_class,name,method,message) do {\ + if (!assertionTestStatus(\ + __FILE__,__LINE__,#name,FPSTR(message),\ + test_class##_##name##_instance.method()))\ + return;\ +} while (false) + +#endif diff --git a/src/aunit/MetaAssertion.h b/src/aunit/MetaAssertion.h index 7dc6847..036d42e 100644 --- a/src/aunit/MetaAssertion.h +++ b/src/aunit/MetaAssertion.h @@ -25,12 +25,6 @@ SOFTWARE. // Significant portions of the design and implementation of this file came from // https://github.com/mmurdoch/arduinounit/blob/master/src/ArduinoUnit.h -/** - * @file MetaAssertion.h - * - * Various assertTestXxx() and checkTestXxx() macros are defined in this header. - */ - #ifndef AUNIT_META_ASSERTION_H #define AUNIT_META_ASSERTION_H @@ -39,183 +33,6 @@ SOFTWARE. class __FlashStringHelper; -// Meta tests, same syntax as ArduinoUnit for compatibility. -// The checkTestXxx() macros return a boolean, and execution continues. - -/** Return true if test 'name' is done. */ -#define checkTestDone(name) (test_##name##_instance.isDone()) - -/** Return true if test 'name' is not done. */ -#define checkTestNotDone(name) (test_##name##_instance.isNotDone()) - -/** Return true if test 'name' has passed. */ -#define checkTestPass(name) (test_##name##_instance.isPassed()) - -/** Return true if test 'name' has not passed. */ -#define checkTestNotPass(name) (test_##name##_instance.isNotPassed()) - -/** Return true if test 'name' has failed. */ -#define checkTestFail(name) (test_##name##_instance.isFailed()) - -/** Return true if test 'name' has not failed. */ -#define checkTestNotFail(name) (test_##name##_instance.isNotFailed()) - -/** Return true if test 'name' has been skipped. */ -#define checkTestSkip(name) (test_##name##_instance.isSkipped()) - -/** Return true if test 'name' has not been skipped. */ -#define checkTestNotSkip(name) (test_##name##_instance.isNotSkipped()) - -/** Return true if test 'name' has timed out. */ -#define checkTestExpire(name) (test_##name##_instance.isExpired()) - -/** Return true if test 'name' has not timed out. */ -#define checkTestNotExpire(name) (test_##name##_instance.isNotExpired()) - -// If the assertTestXxx() macros fail, they generate an optional output, calls -// fail(), and returns from the current test case. - -/** Assert that test 'name' is done. */ -#define assertTestDone(name) \ - assertTestStatus(name, isDone, kMessageDone) - -/** Assert that test 'name' is not done. */ -#define assertTestNotDone(name) \ - assertTestStatus(name, isNotDone, kMessageNotDone) - -/** Assert that test 'name' has passed. */ -#define assertTestPass(name) \ - assertTestStatus(name, isPassed, kMessagePassed) - -/** Assert that test 'name' has not passed. */ -#define assertTestNotPass(name) \ - assertTestStatus(name, isNotPassed, kMessageNotPassed) - -/** Assert that test 'name' has failed. */ -#define assertTestFail(name) \ - assertTestStatus(name, isFailed, kMessageFailed) - -/** Assert that test 'name' has not failed. */ -#define assertTestNotFail(name) \ - assertTestStatus(name, isNotFailed, kMessageNotFailed) - -/** Assert that test 'name' has been skipped. */ -#define assertTestSkip(name) \ - assertTestStatus(name, isSkipped, kMessageSkipped) - -/** Assert that test 'name' has not been skipped. */ -#define assertTestNotSkip(name) \ - assertTestStatus(name, isNotSkipped, kMessageNotSkipped) - -/** Assert that test 'name' has timed out. */ -#define assertTestExpire(name) \ - assertTestStatus(name, isExpired, kMessageExpired) - -/** Assert that test 'name' has not timed out. */ -#define assertTestNotExpire(name) \ - assertTestStatus(name, isNotExpired, kMessageNotExpired) - -/** Internal helper macro, shouldn't be called directly by users. */ -#define assertTestStatus(name,method,message) do {\ - if (!assertionTestStatus(\ - __FILE__,__LINE__,#name,FPSTR(message),test_##name##_instance.method()))\ - return;\ -} while (false) - -// Meta tests for testF() and testingF() are slightly different because -// the name of the fixture class is appended to the instance name. - -/** Return true if test 'name' is done. */ -#define checkTestDoneF(test_class,name) \ - (test_class##_##name##_instance.isDone()) - -/** Return true if test 'name' is not done. */ -#define checkTestNotDoneF(test_class,name) \ - (test_class##_##name##_instance.isNotDone()) - -/** Return true if test 'name' has passed. */ -#define checkTestPassF(test_class,name) \ - (test_class##_##name##_instance.isPassed()) - -/** Return true if test 'name' has not passed. */ -#define checkTestNotPassF(test_class,name) \ - (test_class##_##name##_instance.isNotPassed()) - -/** Return true if test 'name' has failed. */ -#define checkTestFailF(test_class,name) \ - (test_class##_##name##_instance.isFailed()) - -/** Return true if test 'name' has not failed. */ -#define checkTestNotFailF(test_class,name) \ - (test_class##_##name##_instance.isNotFailed()) - -/** Return true if test 'name' has been skipped. */ -#define checkTestSkipF(test_class,name) \ - (test_class##_##name##_instance.isSkipped()) - -/** Return true if test 'name' has not been skipped. */ -#define checkTestNotSkipF(test_class,name) \ - (test_class##_##name##_instance.isNotSkipped()) - -/** Return true if test 'name' has timed out. */ -#define checkTestExpireF(test_class,name) \ - (test_class##_##name##_instance.isExpired()) - -/** Return true if test 'name' has not timed out. */ -#define checkTestNotExpireF(test_class,name) \ - (test_class##_##name##_instance.isNotExpired()) - -// If the assertTestXxx() macros fail, they generate an optional output, calls -// fail(), and returns from the current test case. - -/** Assert that test 'name' is done. */ -#define assertTestDoneF(test_class,name) \ - assertTestStatusF(test_class, name, isDone, kMessageDone) - -/** Assert that test 'name' is not done. */ -#define assertTestNotDoneF(test_class,name) \ - assertTestStatusF(test_class, name, isNotDone, kMessageNotDone) - -/** Assert that test 'name' has passed. */ -#define assertTestPassF(test_class,name) \ - assertTestStatusF(test_class, name, isPassed, kMessagePassed) - -/** Assert that test 'name' has not passed. */ -#define assertTestNotPassF(test_class,name) \ - assertTestStatusF(test_class, name, isNotPassed, kMessageNotPassed) - -/** Assert that test 'name' has failed. */ -#define assertTestFailF(test_class,name) \ - assertTestStatusF(test_class, name, isFailed, kMessageFailed) - -/** Assert that test 'name' has not failed. */ -#define assertTestNotFailF(test_class,name) \ - assertTestStatusF(test_class, name, isNotFailed, kMessageNotFailed) - -/** Assert that test 'name' has been skipped. */ -#define assertTestSkipF(test_class,name) \ - assertTestStatusF(test_class, name, isSkipped, kMessageSkipped) - -/** Assert that test 'name' has not been skipped. */ -#define assertTestNotSkipF(test_class,name) \ - assertTestStatusF(test_class, name, isNotSkipped, kMessageNotSkipped) - -/** Assert that test 'name' has timed out. */ -#define assertTestExpireF(test_class,name) \ - assertTestStatusF(test_class, name, isExpired, kMessageExpired) - -/** Assert that test 'name' has not timed out. */ -#define assertTestNotExpireF(test_class,name) \ - assertTestStatusF(test_class, name, isNotExpired, kMessageNotExpired) - -/** Internal helper macro, shouldn't be called directly by users. */ -#define assertTestStatusF(test_class,name,method,message) do {\ - if (!assertionTestStatus(\ - __FILE__,__LINE__,#name,FPSTR(message),\ - test_class##_##name##_instance.method()))\ - return;\ -} while (false) - namespace aunit { /** diff --git a/src/aunit/TestMacro.h b/src/aunit/TestMacros.h similarity index 95% rename from src/aunit/TestMacro.h rename to src/aunit/TestMacros.h index b46a7df..51d0409 100644 --- a/src/aunit/TestMacro.h +++ b/src/aunit/TestMacros.h @@ -22,15 +22,18 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +// Significant portions of the design and implementation of this file came from +// https://github.com/mmurdoch/arduinounit/blob/master/src/ArduinoUnit.h + /** - * @file TestMacro.h + * @file TestMacros.h * * Various macros (test(), testing(), externTest(), externTesting()) are * defined in this header. */ -#ifndef AUNIT_TEST_MACRO_H -#define AUNIT_TEST_MACRO_H +#ifndef AUNIT_TEST_MACROS_H +#define AUNIT_TEST_MACROS_H #include #include // F() macro @@ -38,8 +41,6 @@ SOFTWARE. #include "TestOnce.h" #include "TestAgain.h" -class __FlashStringHelper; - // On the ESP8266 platform, The F() string cannot be placed in an inline // context, because it interferes with other PROGMEM strings. See // https://github.com/esp8266/Arduino/issues/3369. The solution was to move the From fba9ae6a8997a652c294a5e825ae1a95179996ef Mon Sep 17 00:00:00 2001 From: Brian Park Date: Wed, 11 Apr 2018 08:40:57 -0700 Subject: [PATCH 03/15] Add elapsed time summary at the end of test run; fixes #18 --- src/aunit/TestRunner.cpp | 11 ++++++++--- src/aunit/TestRunner.h | 1 + 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/aunit/TestRunner.cpp b/src/aunit/TestRunner.cpp index 785e823..a94d248 100644 --- a/src/aunit/TestRunner.cpp +++ b/src/aunit/TestRunner.cpp @@ -102,7 +102,9 @@ void TestRunner::runTest() { // If no more test cases, then print out summary of run. if (*Test::getRoot() == nullptr) { if (!mIsResolved) { + mEndTime = millis(); resolveRun(); + mIsResolved = true; } return; } @@ -222,8 +224,13 @@ void TestRunner::printStartRunner() { void TestRunner::resolveRun() { if (!isVerbosity(Verbosity::kTestRunSummary)) return; - Print* printer = Printer::getPrinter(); + + unsigned long elapsedTime = mEndTime - mStartTime; + printer->print(F("TestRunner duration: ")); + printer->print((float) elapsedTime / 1000); + printer->println(" seconds."); + printer->print(F("TestRunner summary: ")); printer->print(mPassedCount); printer->print(F(" passed, ")); @@ -235,8 +242,6 @@ void TestRunner::resolveRun() { printer->print(F(" timed out, out of ")); printer->print(mCount); printer->println(F(" test(s).")); - - mIsResolved = true; } void TestRunner::listTests() { diff --git a/src/aunit/TestRunner.h b/src/aunit/TestRunner.h index 49d2bf2..6de7ea0 100644 --- a/src/aunit/TestRunner.h +++ b/src/aunit/TestRunner.h @@ -179,6 +179,7 @@ class TestRunner { uint16_t mStatusErrorCount; TimeoutType mTimeout; unsigned long mStartTime; + unsigned long mEndTime; }; } From 806dd2e1adc2e67c2dbb5ca63d1e5a6d9423d702 Mon Sep 17 00:00:00 2001 From: Brian Park Date: Wed, 11 Apr 2018 11:33:48 -0700 Subject: [PATCH 04/15] Add AUnitVerbose.h, a verbose variant of AUnit.h, fix for #8 --- examples/basic_verbose/basic_verbose.ino | 32 +++ src/AUnit.h | 2 +- src/AUnitVerbose.h | 54 ++++ src/aunit/AssertVerboseMacros.h | 82 ++++++ src/aunit/Assertion.cpp | 328 ++++++++++++++++++++++- src/aunit/Assertion.h | 90 +++++++ src/aunit/Compare.cpp | 8 +- src/aunit/Flash.h | 65 +++++ src/aunit/MetaAssertion.cpp | 6 +- src/aunit/Test.cpp | 7 +- src/aunit/Test.h | 6 - src/aunit/TestMacros.h | 1 + tests/AUnitTest/AUnitTest.h | 14 +- tests/AUnitTest/AUnitTest.ino | 6 +- 14 files changed, 672 insertions(+), 29 deletions(-) create mode 100644 examples/basic_verbose/basic_verbose.ino create mode 100644 src/AUnitVerbose.h create mode 100644 src/aunit/AssertVerboseMacros.h create mode 100644 src/aunit/Flash.h diff --git a/examples/basic_verbose/basic_verbose.ino b/examples/basic_verbose/basic_verbose.ino new file mode 100644 index 0000000..63b83d3 --- /dev/null +++ b/examples/basic_verbose/basic_verbose.ino @@ -0,0 +1,32 @@ +#line 2 "basic_verbose.ino" + +// Same as ../basic/basic.ino except this uses instead of +// to get the more verbose assertion messages containing the string +// fragment of the actual arguments in the assertXxx() macros. The cost is +// ~20-25% increase in flash memory to store those strings for moderate to +// large unit tests. But the verbose version may be helpful for debugging. + +#include + +test(correct) { + int x = 1; + assertEqual(x, 1); +} + +test(incorrect) { + int x = 1; + assertNotEqual(x, 1); +} + +void setup() { + delay(1000); // wait for stability on some boards to prevent garbage Serial + Serial.begin(115200); // ESP8266 default of 74880 not supported on Linux + while(!Serial); // for the Arduino Leonardo/Micro only +} + +void loop() { + // Should get: + // TestRunner summary: + // 1 passed, 1 failed, 0 skipped, 0 timed out, out of 2 test(s). + aunit::TestRunner::run(); +} diff --git a/src/AUnit.h b/src/AUnit.h index 6ff8cd4..58a685a 100644 --- a/src/AUnit.h +++ b/src/AUnit.h @@ -41,7 +41,7 @@ SOFTWARE. #include "aunit/TestOnce.h" #include "aunit/TestAgain.h" #include "aunit/TestRunner.h" -#include "aunit/AssertMacros.h" +#include "aunit/AssertMacros.h" // terse assertXxx() macros #include "aunit/MetaAssertMacros.h" #include "aunit/TestMacros.h" diff --git a/src/AUnitVerbose.h b/src/AUnitVerbose.h new file mode 100644 index 0000000..cc79010 --- /dev/null +++ b/src/AUnitVerbose.h @@ -0,0 +1,54 @@ +/* +MIT License + +Copyright (c) 2018 Brian T. Park + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +/** + * @file AUnitVerbose.h + * + * Same as AUnit.h except that the verbose versions of teh various assertXxx() + * macros are provided. These capture the strings of the actual arguments in + * the assert macros and print more verbose and helpful messages in the same + * format used by ArduinoUnit. The cost is 20-25% increase in flash memory to + * hold those strings for medium to large unit tests. + */ + +#ifndef AUNIT_AUNIT_VERBOSE_H +#define AUNIT_AUNIT_VERBOSE_H + +#include "aunit/Verbosity.h" +#include "aunit/Compare.h" +#include "aunit/Printer.h" +#include "aunit/Test.h" +#include "aunit/Assertion.h" +#include "aunit/MetaAssertion.h" +#include "aunit/TestOnce.h" +#include "aunit/TestAgain.h" +#include "aunit/TestRunner.h" +#include "aunit/AssertVerboseMacros.h" // verbose assertXxx() macros +#include "aunit/MetaAssertMacros.h" +#include "aunit/TestMacros.h" + +// Version format: xxyyzz == "xx.yy.zz" +#define AUNIT_VERSION 000402 + +#endif diff --git a/src/aunit/AssertVerboseMacros.h b/src/aunit/AssertVerboseMacros.h new file mode 100644 index 0000000..c36cf33 --- /dev/null +++ b/src/aunit/AssertVerboseMacros.h @@ -0,0 +1,82 @@ +/* +MIT License + +Copyright (c) 2018 Brian T. Park + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +// Significant portions of the design and implementation of this file came from +// https://github.com/mmurdoch/arduinounit/blob/master/src/ArduinoUnit.h + +/** + * @file AssertVerboseMacros.h + * + * Verbose versions of the macros in AssertMacros.h. These capture the string + * of the actual arguments and pass them to the respective assertionVerbose() + * methods so that verbose messages can be printed. + */ + +#ifndef AUNIT_ASSERT_VERBOSE_MACROS_H +#define AUNIT_ASSERT_VERBOSE_MACROS_H + +/** Assert that arg1 is equal to arg2. */ +#define assertEqual(arg1,arg2) \ + assertOpVerboseInternal(arg1,aunit::compareEqual,"==",arg2) + +/** Assert that arg1 is not equal to arg2. */ +#define assertNotEqual(arg1,arg2) \ + assertOpVerboseInternal(arg1,aunit::compareNotEqual,"!=",arg2) + +/** Assert that arg1 is less than arg2. */ +#define assertLess(arg1,arg2) \ + assertOpVerboseInternal(arg1,aunit::compareLess,"<",arg2) + +/** Assert that arg1 is more than arg2. */ +#define assertMore(arg1,arg2) \ + assertOpVerboseInternal(arg1,aunit::compareMore,">",arg2) + +/** Assert that arg1 is less than or equal to arg2. */ +#define assertLessOrEqual(arg1,arg2) \ + assertOpVerboseInternal(arg1,aunit::compareLessOrEqual,"<=",arg2) + +/** Assert that arg1 is more than or equal to arg2. */ +#define assertMoreOrEqual(arg1,arg2) \ + assertOpVerboseInternal(arg1,aunit::compareMoreOrEqual,">=",arg2) + +/** Assert that arg is true. */ +#define assertTrue(arg) assertBoolVerboseInternal(arg,true) + +/** Assert that arg is false. */ +#define assertFalse(arg) assertBoolVerboseInternal(arg,false) + +/** Internal helper macro, shouldn't be called directly by users. */ +#define assertOpVerboseInternal(arg1,op,opName,arg2) do {\ + if (!assertionVerbose(__FILE__,__LINE__,\ + (arg1),AUNIT_F(#arg1),opName,op,(arg2),AUNIT_F(#arg2)))\ + return;\ +} while (false) + +/** Internal helper macro, shouldn't be called directly by users. */ +#define assertBoolVerboseInternal(arg,value) do {\ + if (!assertionBoolVerbose(__FILE__,__LINE__,(arg),AUNIT_F(#arg),(value)))\ + return;\ +} while (false) + +#endif diff --git a/src/aunit/Assertion.cpp b/src/aunit/Assertion.cpp index 4123ae8..acb7a80 100644 --- a/src/aunit/Assertion.cpp +++ b/src/aunit/Assertion.cpp @@ -23,7 +23,7 @@ SOFTWARE. */ #include // definition of Print -#include "TestRunner.h" // seems like a circular reference but ok from cpp file +#include "Flash.h" #include "Printer.h" #include "Assertion.h" @@ -323,4 +323,330 @@ bool Assertion::assertion(const char* file, uint16_t line, return ok; } +// Verbose versions of above which accept the string arguments of the +// assertXxx() macros, so that the error messages are more verbose. + +template +static void printAssertionMessageVerbose(bool ok, const char* file, + uint16_t line, const A& lhs, AUNIT_FLASH_STRING_HELPER lhsString, + const char *opName, const B& rhs, AUNIT_FLASH_STRING_HELPER rhsString) { + + // Don't use F() strings here because flash memory strings are not deduped by + // the compiler, so each template instantiation of this method causes a + // duplication of all the strings below. See + // https://github.com/mmurdoch/arduinounit/issues/70 + // for more info. + Print* printer = Printer::getPrinter(); + printer->print("Assertion "); + printer->print(ok ? "passed" : "failed"); + printer->print(": ("); + printer->print(lhsString); + printer->print('='); + printer->print(lhs); + printer->print(") "); + printer->print(opName); + printer->print(" ("); + printer->print(rhsString); + printer->print('='); + printer->print(rhs); + printer->print(')'); + // reuse string in MataAssertion::printAssertionTestStatusMessage() + printer->print(", file "); + printer->print(file); + printer->print(", line "); + printer->print(line); + printer->println('.'); +} + +// Special version of (bool, bool) because Arduino Print.h converts +// bool into int, which prints out "(1) == (0)", which isn't as useful. +// This prints "(true) == (false)". +static void printAssertionMessageVerbose(bool ok, const char* file, + uint16_t line, bool lhs, AUNIT_FLASH_STRING_HELPER lhsString, + const char *opName, bool rhs, AUNIT_FLASH_STRING_HELPER rhsString) { + + // Don't use F() strings here. Same reason as above. + Print* printer = Printer::getPrinter(); + printer->print("Assertion "); + printer->print(ok ? "passed" : "failed"); + printer->print(": ("); + printer->print(lhsString); + printer->print('='); + printer->print(lhs ? "true" : "false"); + printer->print(") "); + printer->print(opName); + printer->print(" ("); + printer->print(rhsString); + printer->print('='); + printer->print(rhs ? "true" : "false"); + printer->print(')'); + printer->print(", file "); + printer->print(file); + printer->print(", line "); + printer->print(line); + printer->println('.'); +} + +// Special version for assertTrue(arg) and assertFalse(arg). +// Prints: +// "Assertion passed/failed: (arg) is true" +// "Assertion passed/failed: (arg) is false" +static void printAssertionBoolMessageVerbose(bool ok, const char* file, + uint16_t line, bool arg, AUNIT_FLASH_STRING_HELPER argString, bool value) { + + // Don't use F() strings here. Same reason as above. + Print* printer = Printer::getPrinter(); + printer->print("Assertion "); + printer->print(ok ? "passed" : "failed"); + printer->print(": ("); + printer->print(argString); + printer->print('='); + printer->print(arg ? "true" : "false"); + printer->print(") is "); + printer->print(value ? "true" : "false"); + printer->print(", file "); + printer->print(file); + printer->print(", line "); + printer->print(line); + printer->println('.'); +} + +bool Assertion::assertionBoolVerbose(const char* file, uint16_t line, bool arg, + AUNIT_FLASH_STRING_HELPER argString, bool value) { + if (isDone()) return false; + bool ok = (arg == value); + if (isOutputEnabled(ok)) { + printAssertionBoolMessageVerbose(ok, file, line, arg, argString, value); + } + setPassOrFail(ok); + return ok; +} + +bool Assertion::assertionVerbose(const char* file, uint16_t line, bool lhs, + AUNIT_FLASH_STRING_HELPER lhsString, const char* opName, + bool (*op)(bool lhs, bool rhs), bool rhs, + AUNIT_FLASH_STRING_HELPER rhsString) { + if (isDone()) return false; + bool ok = op(lhs, rhs); + if (isOutputEnabled(ok)) { + printAssertionMessageVerbose(ok, file, line, lhs, lhsString, opName, rhs, + rhsString); + } + setPassOrFail(ok); + return ok; +} + +bool Assertion::assertionVerbose(const char* file, uint16_t line, char lhs, + AUNIT_FLASH_STRING_HELPER lhsString, const char* opName, + bool (*op)(char lhs, char rhs), char rhs, + AUNIT_FLASH_STRING_HELPER rhsString) { + if (isDone()) return false; + bool ok = op(lhs, rhs); + if (isOutputEnabled(ok)) { + printAssertionMessageVerbose(ok, file, line, lhs, lhsString, opName, rhs, + rhsString); + } + setPassOrFail(ok); + return ok; +} + +bool Assertion::assertionVerbose(const char* file, uint16_t line, int lhs, + AUNIT_FLASH_STRING_HELPER lhsString, const char* opName, + bool (*op)(int lhs, int rhs), int rhs, + AUNIT_FLASH_STRING_HELPER rhsString) { + if (isDone()) return false; + bool ok = op(lhs, rhs); + if (isOutputEnabled(ok)) { + printAssertionMessageVerbose(ok, file, line, lhs, lhsString, opName, rhs, + rhsString); + } + setPassOrFail(ok); + return ok; +} + +bool Assertion::assertionVerbose(const char* file, uint16_t line, + unsigned int lhs, AUNIT_FLASH_STRING_HELPER lhsString, const char* opName, + bool (*op)(unsigned int lhs, unsigned int rhs), + unsigned int rhs, AUNIT_FLASH_STRING_HELPER rhsString) { + if (isDone()) return false; + bool ok = op(lhs, rhs); + if (isOutputEnabled(ok)) { + printAssertionMessageVerbose(ok, file, line, lhs, lhsString, opName, rhs, + rhsString); + } + setPassOrFail(ok); + return ok; +} + +bool Assertion::assertionVerbose(const char* file, uint16_t line, long lhs, + AUNIT_FLASH_STRING_HELPER lhsString, const char* opName, + bool (*op)(long lhs, long rhs), long rhs, + AUNIT_FLASH_STRING_HELPER rhsString) { + if (isDone()) return false; + bool ok = op(lhs, rhs); + if (isOutputEnabled(ok)) { + printAssertionMessageVerbose(ok, file, line, lhs, lhsString, opName, rhs, + rhsString); + } + setPassOrFail(ok); + return ok; +} + +bool Assertion::assertionVerbose(const char* file, uint16_t line, + unsigned long lhs, AUNIT_FLASH_STRING_HELPER lhsString, const char* opName, + bool (*op)(unsigned long lhs, unsigned long rhs), + unsigned long rhs, AUNIT_FLASH_STRING_HELPER rhsString) { + if (isDone()) return false; + bool ok = op(lhs, rhs); + if (isOutputEnabled(ok)) { + printAssertionMessageVerbose(ok, file, line, lhs, lhsString, opName, rhs, + rhsString); + } + setPassOrFail(ok); + return ok; +} + +bool Assertion::assertionVerbose(const char* file, uint16_t line, double lhs, + AUNIT_FLASH_STRING_HELPER lhsString, const char* opName, + bool (*op)(double lhs, double rhs), double rhs, + AUNIT_FLASH_STRING_HELPER rhsString) { + if (isDone()) return false; + bool ok = op(lhs, rhs); + if (isOutputEnabled(ok)) { + printAssertionMessageVerbose(ok, file, line, lhs, lhsString, opName, rhs, + rhsString); + } + setPassOrFail(ok); + return ok; +} + +bool Assertion::assertionVerbose(const char* file, uint16_t line, + const char* lhs, AUNIT_FLASH_STRING_HELPER lhsString, const char* opName, + bool (*op)(const char* lhs, const char* rhs), + const char* rhs, AUNIT_FLASH_STRING_HELPER rhsString) { + if (isDone()) return false; + bool ok = op(lhs, rhs); + if (isOutputEnabled(ok)) { + printAssertionMessageVerbose(ok, file, line, lhs, lhsString, opName, rhs, + rhsString); + } + setPassOrFail(ok); + return ok; +} + +bool Assertion::assertionVerbose(const char* file, uint16_t line, + const char* lhs, AUNIT_FLASH_STRING_HELPER lhsString, + const char *opName, bool (*op)(const char* lhs, const String& rhs), + const String& rhs, AUNIT_FLASH_STRING_HELPER rhsString) { + if (isDone()) return false; + bool ok = op(lhs, rhs); + if (isOutputEnabled(ok)) { + printAssertionMessageVerbose(ok, file, line, lhs, lhsString, opName, rhs, + rhsString); + } + setPassOrFail(ok); + return ok; +} + +bool Assertion::assertionVerbose(const char* file, uint16_t line, + const char* lhs, AUNIT_FLASH_STRING_HELPER lhsString, const char *opName, + bool (*op)(const char* lhs, const __FlashStringHelper* rhs), + const __FlashStringHelper* rhs, AUNIT_FLASH_STRING_HELPER rhsString) { + if (isDone()) return false; + bool ok = op(lhs, rhs); + if (isOutputEnabled(ok)) { + printAssertionMessageVerbose(ok, file, line, lhs, lhsString, opName, rhs, + rhsString); + } + setPassOrFail(ok); + return ok; +} + +bool Assertion::assertionVerbose(const char* file, uint16_t line, + const String& lhs, AUNIT_FLASH_STRING_HELPER lhsString, const char *opName, + bool (*op)(const String& lhs, const char* rhs), + const char* rhs, AUNIT_FLASH_STRING_HELPER rhsString) { + if (isDone()) return false; + bool ok = op(lhs, rhs); + if (isOutputEnabled(ok)) { + printAssertionMessageVerbose(ok, file, line, lhs, lhsString, opName, rhs, + rhsString); + } + setPassOrFail(ok); + return ok; +} + +bool Assertion::assertionVerbose(const char* file, uint16_t line, + const String& lhs, AUNIT_FLASH_STRING_HELPER lhsString, const char *opName, + bool (*op)(const String& lhs, const String& rhs), + const String& rhs, AUNIT_FLASH_STRING_HELPER rhsString) { + if (isDone()) return false; + bool ok = op(lhs, rhs); + if (isOutputEnabled(ok)) { + printAssertionMessageVerbose(ok, file, line, lhs, lhsString, opName, rhs, + rhsString); + } + setPassOrFail(ok); + return ok; +} + +bool Assertion::assertionVerbose(const char* file, uint16_t line, + const String& lhs, AUNIT_FLASH_STRING_HELPER lhsString, const char *opName, + bool (*op)(const String& lhs, const __FlashStringHelper* rhs), + const __FlashStringHelper* rhs, AUNIT_FLASH_STRING_HELPER rhsString) { + if (isDone()) return false; + bool ok = op(lhs, rhs); + if (isOutputEnabled(ok)) { + printAssertionMessageVerbose(ok, file, line, lhs, lhsString, opName, rhs, + rhsString); + } + setPassOrFail(ok); + return ok; +} + +bool Assertion::assertionVerbose(const char* file, uint16_t line, + const __FlashStringHelper* lhs, AUNIT_FLASH_STRING_HELPER lhsString, + const char *opName, + bool (*op)(const __FlashStringHelper* lhs, const char* rhs), + const char* rhs, AUNIT_FLASH_STRING_HELPER rhsString) { + if (isDone()) return false; + bool ok = op(lhs, rhs); + if (isOutputEnabled(ok)) { + printAssertionMessageVerbose(ok, file, line, lhs, lhsString, opName, rhs, + rhsString); + } + setPassOrFail(ok); + return ok; +} + +bool Assertion::assertionVerbose(const char* file, uint16_t line, + const __FlashStringHelper* lhs, AUNIT_FLASH_STRING_HELPER lhsString, + const char *opName, + bool (*op)(const __FlashStringHelper* lhs, const String& rhs), + const String& rhs, AUNIT_FLASH_STRING_HELPER rhsString) { + if (isDone()) return false; + bool ok = op(lhs, rhs); + if (isOutputEnabled(ok)) { + printAssertionMessageVerbose(ok, file, line, lhs, lhsString, opName, rhs, + rhsString); + } + setPassOrFail(ok); + return ok; +} + +bool Assertion::assertionVerbose(const char* file, uint16_t line, + const __FlashStringHelper* lhs, AUNIT_FLASH_STRING_HELPER lhsString, + const char *opName, + bool (*op)(const __FlashStringHelper* lhs, const __FlashStringHelper* rhs), + const __FlashStringHelper* rhs, AUNIT_FLASH_STRING_HELPER rhsString) { + if (isDone()) return false; + bool ok = op(lhs, rhs); + if (isOutputEnabled(ok)) { + printAssertionMessageVerbose(ok, file, line, lhs, lhsString, opName, rhs, + rhsString); + } + setPassOrFail(ok); + return ok; +} + } diff --git a/src/aunit/Assertion.h b/src/aunit/Assertion.h index 7f6b500..74c7f3c 100644 --- a/src/aunit/Assertion.h +++ b/src/aunit/Assertion.h @@ -25,6 +25,7 @@ SOFTWARE. #ifndef AUNIT_ASSERTION_H #define AUNIT_ASSERTION_H +#include "Flash.h" #include "Test.h" class __FlashStringHelper; @@ -132,6 +133,95 @@ class Assertion: public Test { const __FlashStringHelper* rhs), const __FlashStringHelper* rhs); + // Verbose versions of above. + + bool assertionBoolVerbose(const char* file, uint16_t line, bool arg, + AUNIT_FLASH_STRING_HELPER argString, bool value); + + bool assertionVerbose(const char* file, uint16_t line, bool lhs, + AUNIT_FLASH_STRING_HELPER lhsString, const char* opName, + bool (*op)(bool lhs, bool rhs), + bool rhs, AUNIT_FLASH_STRING_HELPER rhsString); + + bool assertionVerbose(const char* file, uint16_t line, char lhs, + AUNIT_FLASH_STRING_HELPER lhsString, const char* opName, + bool (*op)(char lhs, char rhs), + char rhs, AUNIT_FLASH_STRING_HELPER rhsString); + + bool assertionVerbose(const char* file, uint16_t line, int lhs, + AUNIT_FLASH_STRING_HELPER lhsString, const char* opName, + bool (*op)(int lhs, int rhs), + int rhs, AUNIT_FLASH_STRING_HELPER rhsString); + + bool assertionVerbose(const char* file, uint16_t line, unsigned int lhs, + AUNIT_FLASH_STRING_HELPER lhsString, const char* opName, + bool (*op)(unsigned int lhs, unsigned int rhs), + unsigned int rhs, AUNIT_FLASH_STRING_HELPER rhsString); + + bool assertionVerbose(const char* file, uint16_t line, long lhs, + AUNIT_FLASH_STRING_HELPER lhsString, const char* opName, + bool (*op)(long lhs, long rhs), + long rhs, AUNIT_FLASH_STRING_HELPER rhsString); + + bool assertionVerbose(const char* file, uint16_t line, unsigned long lhs, + AUNIT_FLASH_STRING_HELPER lhsString, const char* opName, + bool (*op)(unsigned long lhs, unsigned long rhs), + unsigned long rhs, AUNIT_FLASH_STRING_HELPER rhsString); + + bool assertionVerbose(const char* file, uint16_t line, double lhs, + AUNIT_FLASH_STRING_HELPER lhsString, const char* opName, + bool (*op)(double lhs, double rhs), + double rhs, AUNIT_FLASH_STRING_HELPER rhsString); + + bool assertionVerbose(const char* file, uint16_t line, const char* lhs, + AUNIT_FLASH_STRING_HELPER lhsString, const char* opName, + bool (*op)(const char* lhs, const char* rhs), + const char* rhs, AUNIT_FLASH_STRING_HELPER rhsString); + + bool assertionVerbose(const char* file, uint16_t line, const char* lhs, + AUNIT_FLASH_STRING_HELPER lhsString, const char *opName, + bool (*op)(const char* lhs, const String& rhs), + const String& rhs, AUNIT_FLASH_STRING_HELPER rhsString); + + bool assertionVerbose(const char* file, uint16_t line, const char* lhs, + AUNIT_FLASH_STRING_HELPER lhsString, const char *opName, + bool (*op)(const char* lhs, const __FlashStringHelper* rhs), + const __FlashStringHelper* rhs, AUNIT_FLASH_STRING_HELPER rhsString); + + bool assertionVerbose(const char* file, uint16_t line, const String& lhs, + AUNIT_FLASH_STRING_HELPER lhsString, const char *opName, + bool (*op)(const String& lhs, const char* rhs), + const char* rhs, AUNIT_FLASH_STRING_HELPER rhsString); + + bool assertionVerbose(const char* file, uint16_t line, const String& lhs, + AUNIT_FLASH_STRING_HELPER lhsString, const char *opName, + bool (*op)(const String& lhs, const String& rhs), + const String& rhs, AUNIT_FLASH_STRING_HELPER rhsString); + + bool assertionVerbose(const char* file, uint16_t line, const String& lhs, + AUNIT_FLASH_STRING_HELPER lhsString, const char *opName, + bool (*op)(const String& lhs, const __FlashStringHelper* rhs), + const __FlashStringHelper* rhs, AUNIT_FLASH_STRING_HELPER rhsString); + + bool assertionVerbose(const char* file, uint16_t line, + const __FlashStringHelper* lhs, AUNIT_FLASH_STRING_HELPER lhsString, + const char *opName, + bool (*op)(const __FlashStringHelper* lhs, const char* rhs), + const char* rhs, AUNIT_FLASH_STRING_HELPER rhsString); + + bool assertionVerbose(const char* file, uint16_t line, + const __FlashStringHelper* lhs, AUNIT_FLASH_STRING_HELPER lhsString, + const char *opName, + bool (*op)(const __FlashStringHelper* lhs, const String& rhs), + const String& rhs, AUNIT_FLASH_STRING_HELPER rhsString); + + bool assertionVerbose(const char* file, uint16_t line, + const __FlashStringHelper* lhs, AUNIT_FLASH_STRING_HELPER lhsString, + const char *opName, + bool (*op)(const __FlashStringHelper* lhs, + const __FlashStringHelper* rhs), + const __FlashStringHelper* rhs, AUNIT_FLASH_STRING_HELPER rhsString); + private: // Disable copy-constructor and assignment operator Assertion(const Assertion&) = delete; diff --git a/src/aunit/Compare.cpp b/src/aunit/Compare.cpp index ad7874b..397926d 100644 --- a/src/aunit/Compare.cpp +++ b/src/aunit/Compare.cpp @@ -129,13 +129,7 @@ inlining them because they are almost always used through a function pointer. #include #include - -#ifdef ESP8266 -#include -#else -#include -#endif - +#include "Flash.h" #include "Compare.h" #include "FCString.h" diff --git a/src/aunit/Flash.h b/src/aunit/Flash.h new file mode 100644 index 0000000..f6fec98 --- /dev/null +++ b/src/aunit/Flash.h @@ -0,0 +1,65 @@ +/* +MIT License + +Copyright (c) 2018 Brian T. Park + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +/** + * @file Flash.h + * + * Flash strings (using F() macro) on the ESP8266 platform cannot be placed in + * an inline context, because it interferes with other PROGMEM strings in + * non-inline contexts. See https://github.com/esp8266/Arduino/issues/3369. In + * some cases (e.g. TestMacros.h), we were able to move the F() macro into a + * non-inline context. But in other cases (e.g. AssertVerboseMacros.h) it is + * impossible to move these out of inline contexts because we want to support + * assertXxx() statements inside inlined methods. + */ + +#ifndef AUNIT_FLASH_H +#define AUNIT_FLASH_H + +class __FlashStringHelper; + +#ifdef ESP8266 + #include +#else + #include +#endif + +// Defined in ESP8266, not defined in AVR or Teensy +#ifndef FPSTR + #define FPSTR(pstr_pointer) \ + (reinterpret_cast(pstr_pointer)) +#endif + +// These are used only in AssertionVerboseMacros.h and the "Verbose" methods of +// Assertion.h because ESP8266 cannot handle F() strings in both inline and +// non-inlnie contexts. So don't use F() strings on ESP8266. +#ifdef ESP8266 + #define AUNIT_F(x) (x) + #define AUNIT_FLASH_STRING_HELPER const char* +#else + #define AUNIT_F(x) F(x) + #define AUNIT_FLASH_STRING_HELPER const __FlashStringHelper* +#endif + +#endif diff --git a/src/aunit/MetaAssertion.cpp b/src/aunit/MetaAssertion.cpp index e85135b..1ae3aab 100644 --- a/src/aunit/MetaAssertion.cpp +++ b/src/aunit/MetaAssertion.cpp @@ -22,13 +22,9 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#ifdef ESP8266 -#include -#else -#include -#endif #include // definition of Print +#include "Flash.h" #include "Printer.h" #include "Verbosity.h" #include "Compare.h" diff --git a/src/aunit/Test.cpp b/src/aunit/Test.cpp index dd2e835..406ff74 100644 --- a/src/aunit/Test.cpp +++ b/src/aunit/Test.cpp @@ -22,13 +22,8 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#ifdef ESP8266 -#include -#else -#include -#endif - #include // for declaration of 'Serial' on Teensy and others +#include "Flash.h" #include "Verbosity.h" #include "Printer.h" #include "Compare.h" diff --git a/src/aunit/Test.h b/src/aunit/Test.h index 45cd527..71f1c82 100644 --- a/src/aunit/Test.h +++ b/src/aunit/Test.h @@ -32,12 +32,6 @@ SOFTWARE. #include "FCString.h" #include "Verbosity.h" -// Defined in ESP8266, not defined in AVR or Teensy -#ifndef FPSTR -#define FPSTR(pstr_pointer) \ - (reinterpret_cast(pstr_pointer)) -#endif - namespace aunit { /** diff --git a/src/aunit/TestMacros.h b/src/aunit/TestMacros.h index 51d0409..ff364c2 100644 --- a/src/aunit/TestMacros.h +++ b/src/aunit/TestMacros.h @@ -37,6 +37,7 @@ SOFTWARE. #include #include // F() macro +#include "Flash.h" #include "FCString.h" #include "TestOnce.h" #include "TestAgain.h" diff --git a/tests/AUnitTest/AUnitTest.h b/tests/AUnitTest/AUnitTest.h index 799b63a..c6d8ab5 100644 --- a/tests/AUnitTest/AUnitTest.h +++ b/tests/AUnitTest/AUnitTest.h @@ -10,7 +10,19 @@ #if USE_AUNIT == 1 #include // random() -#include + +// AVR: +// AUnit.h: flash/static: 29186/1369 +// AUnitVerbose.h: flash/static: 37352/1373 (too big for ATmega328P) +// ESP8266: +// AUnit.h: flash/static: 276112/33476 +// AUnitVerbose.h: flash/static: 281464/36100 +// Teensy 3.2: +// AUnit.h: flash/static: 43328/5440 +// AUnitVerbose.h: flash/static: 49820/5440 +//#include +#include + using namespace aunit; class CustomOnceFixture: public TestOnce { diff --git a/tests/AUnitTest/AUnitTest.ino b/tests/AUnitTest/AUnitTest.ino index aab930d..1f9ed1a 100644 --- a/tests/AUnitTest/AUnitTest.ino +++ b/tests/AUnitTest/AUnitTest.ino @@ -577,7 +577,9 @@ testF(CustomAgainFixture, crossedAgain) { externTestF(CustomOnceFixture, fixture_external); testing(fixture_external_monitor) { + // this will loop forever unless explicitly passed assertTestDoneF(CustomOnceFixture, fixture_external); + pass(); } externTestingF(CustomAgainFixture, fixture_slow_pass); @@ -742,7 +744,7 @@ void setup() { #if USE_AUNIT == 1 // These are useful for debugging. - //TestRunner::setVerbosity(Verbosity::kAll); + TestRunner::setVerbosity(Verbosity::kAll); //TestRunner::setVerbosity(Verbosity::kTestRunSummary); //TestRunner::list(); @@ -762,7 +764,7 @@ void loop() { #if USE_AUNIT == 1 // Should get something like: // TestRunner summary: - // 26 passed, 4 failed, 2 skipped, 4 timed out, out of 36 test(s). + // 27 passed, 4 failed, 2 skipped, 3 timed out, out of 36 test(s). TestRunner::run(); #else Test::run(); From e43876082a3b387d5684a294a42f7f816aa68bb4 Mon Sep 17 00:00:00 2001 From: Brian Park Date: Wed, 11 Apr 2018 12:00:00 -0700 Subject: [PATCH 05/15] README.md: add info about AUnitVerbose.h, for #8 --- README.md | 67 ++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 54 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 370d071..d65c656 100644 --- a/README.md +++ b/README.md @@ -72,29 +72,33 @@ Here are the features which have not been ported over from ArduinoUnit: Here are the features in AUnit which are not available in ArduinoUnit: -* The `TestRunner` supports a configurable timeout parameter which - can prevent `testing()` test cases from running forever. The following - methods and macros are available in AUnit to support this feature: +* Configurable timeout parameter to prevent `testing()` test cases from + running forever: * `TestRunner::setTimeout(seconds)` * `Test::expire()` * `assertTestExpire()` * `assertTestNotExpire()` * `checkTestExpire()` * `checkTestNotExpire()` -* AUnit adds support for test fixtures using the "F" variations of existing - macros: +* Test fixtures using the "F" variations of existing macros: * `testF()` * `testingF()` * `assertTestXxxF()` * `checkTestXxxF()` * `externTestF()` * `externTestingF()` -* AUnit supports the `teardown()` method to clean up test fixtures after - the `setup()` method. -* AUnit is tested on the AVR (8-bit), Teensy ARM (32-bit) , and ESP8266 (32-bit) - Arduino platforms. -* Test filters (`TestRunner::include()` and `TestRunner::exclude()`) support the - same 2 arguments versions corresponding to `testF()` and `testingF()` +* `teardown()` method, mirroring the `setup()` + * `teardown()` +* Tested on the following Arduino platforms: + * AVR (8-bit) + * Teensy ARM (32-bit) + * ESP8266 (32-bit) +* Test filters support the 2 arguments versions: + * `TestRunner::include(testClass, name)` - matching `testF()` + * `TestRunner::exclude(testClass, name)` - matching `testingF()` +* Terse and verbose modes: + * `#include ` - terse messages uses less flash memory + * `#include ` - verbose messages uses more flash ### Beta Status @@ -162,6 +166,22 @@ Similar to ArduinoUnit, many of the "functions" in this framework (e.g. in the global namespace, so it is usually not necessary to import the entire `aunit` namespace. +### Verbose Mode + +By default, AUnit generates terse assertion messages by leaving out +the string arguments of the various `assertXxx()` macros. If you would like +to get the same verbose output as ArduinoUnit, use the following header +instead: + +``` +#include +``` + +The flash memory consumption on an 8-bit AVR may go up by 20-25% for medium to +large tests. On Teensy ARM or ESP8266, the increased memory size probably does +not matter too much because these microcontrollers have far more flash and +static memory. + ### Defining the Tests The usage of **AUnit** is basically identical to **ArduinoUnit**. The following @@ -885,6 +905,24 @@ _The messages for asserts with bool values are customized for better clarity (partially to compensate for the lack of capture of the string of the actual arguments, and are different from ArduinoUnit._ +#### Verbose Mode + +If you use the verbose header: +``` +#include +``` +the assertion message will contain the string fragments of the arguments +passed into the `assertXxx()` macros, like this: + +``` +Assertion failed: (expected=3) == (counter=4), file AUnitTest.ino, line 134. +Assertion failed: (ok=false) is true, file AUnitTest.ino, line 134. +``` + +***ArduinoUnit Compatibility***: +_The verbose mode produces the same messages as ArduinoUnit, at the cost of +increased flash memory usage._ + ### Test Summary As each test case finishes, the `TestRunner` prints out the summary of the test @@ -1038,9 +1076,12 @@ delayed failure) slightly easier to implement. ## Benchmarks -AUnit consumes as much as 65% less flash memory than ArduinoUnit on an AVR +AUnit consumes as much as 65% less flash memory than ArduinoUnit 2.2 on an AVR platform (e.g. Arduino UNO, Nano), and 30% less flash on the Teensy-ARM platform -(e.g. Teensy LC ). Here are the resource consumption (flash and static) numbers +(e.g. Teensy LC ). (ArduinoUnit 2.3 reduces the flash memory by 30% or so, which +means that AUnit can still consume significantly less flash memory.) + +Here are the resource consumption (flash and static) numbers from [AceButtonTest](https://github.com/bxparks/AceButton/tree/develop/tests/AceButtonTest) containing 26 test cases using 331 `assertXxx()` From 1c20d428bc09f51265be8fa058181488dcb64a70 Mon Sep 17 00:00:00 2001 From: Brian Park Date: Wed, 11 Apr 2018 12:04:39 -0700 Subject: [PATCH 06/15] Rename 'test_class' to 'testClass' for consistency, no functional change --- src/aunit/MetaAssertMacros.h | 84 ++++++++++++++++----------------- src/aunit/TestMacros.h | 48 +++++++++---------- tests/FilterTest/FilterTest.ino | 2 +- 3 files changed, 67 insertions(+), 67 deletions(-) diff --git a/src/aunit/MetaAssertMacros.h b/src/aunit/MetaAssertMacros.h index c575c65..802c4ee 100644 --- a/src/aunit/MetaAssertMacros.h +++ b/src/aunit/MetaAssertMacros.h @@ -122,95 +122,95 @@ SOFTWARE. // the name of the fixture class is appended to the instance name. /** Return true if test 'name' is done. */ -#define checkTestDoneF(test_class,name) \ - (test_class##_##name##_instance.isDone()) +#define checkTestDoneF(testClass,name) \ + (testClass##_##name##_instance.isDone()) /** Return true if test 'name' is not done. */ -#define checkTestNotDoneF(test_class,name) \ - (test_class##_##name##_instance.isNotDone()) +#define checkTestNotDoneF(testClass,name) \ + (testClass##_##name##_instance.isNotDone()) /** Return true if test 'name' has passed. */ -#define checkTestPassF(test_class,name) \ - (test_class##_##name##_instance.isPassed()) +#define checkTestPassF(testClass,name) \ + (testClass##_##name##_instance.isPassed()) /** Return true if test 'name' has not passed. */ -#define checkTestNotPassF(test_class,name) \ - (test_class##_##name##_instance.isNotPassed()) +#define checkTestNotPassF(testClass,name) \ + (testClass##_##name##_instance.isNotPassed()) /** Return true if test 'name' has failed. */ -#define checkTestFailF(test_class,name) \ - (test_class##_##name##_instance.isFailed()) +#define checkTestFailF(testClass,name) \ + (testClass##_##name##_instance.isFailed()) /** Return true if test 'name' has not failed. */ -#define checkTestNotFailF(test_class,name) \ - (test_class##_##name##_instance.isNotFailed()) +#define checkTestNotFailF(testClass,name) \ + (testClass##_##name##_instance.isNotFailed()) /** Return true if test 'name' has been skipped. */ -#define checkTestSkipF(test_class,name) \ - (test_class##_##name##_instance.isSkipped()) +#define checkTestSkipF(testClass,name) \ + (testClass##_##name##_instance.isSkipped()) /** Return true if test 'name' has not been skipped. */ -#define checkTestNotSkipF(test_class,name) \ - (test_class##_##name##_instance.isNotSkipped()) +#define checkTestNotSkipF(testClass,name) \ + (testClass##_##name##_instance.isNotSkipped()) /** Return true if test 'name' has timed out. */ -#define checkTestExpireF(test_class,name) \ - (test_class##_##name##_instance.isExpired()) +#define checkTestExpireF(testClass,name) \ + (testClass##_##name##_instance.isExpired()) /** Return true if test 'name' has not timed out. */ -#define checkTestNotExpireF(test_class,name) \ - (test_class##_##name##_instance.isNotExpired()) +#define checkTestNotExpireF(testClass,name) \ + (testClass##_##name##_instance.isNotExpired()) // If the assertTestXxx() macros fail, they generate an optional output, calls // fail(), and returns from the current test case. /** Assert that test 'name' is done. */ -#define assertTestDoneF(test_class,name) \ - assertTestStatusInternalF(test_class, name, isDone, kMessageDone) +#define assertTestDoneF(testClass,name) \ + assertTestStatusInternalF(testClass, name, isDone, kMessageDone) /** Assert that test 'name' is not done. */ -#define assertTestNotDoneF(test_class,name) \ - assertTestStatusInternalF(test_class, name, isNotDone, kMessageNotDone) +#define assertTestNotDoneF(testClass,name) \ + assertTestStatusInternalF(testClass, name, isNotDone, kMessageNotDone) /** Assert that test 'name' has passed. */ -#define assertTestPassF(test_class,name) \ - assertTestStatusInternalF(test_class, name, isPassed, kMessagePassed) +#define assertTestPassF(testClass,name) \ + assertTestStatusInternalF(testClass, name, isPassed, kMessagePassed) /** Assert that test 'name' has not passed. */ -#define assertTestNotPassF(test_class,name) \ - assertTestStatusInternalF(test_class, name, isNotPassed, kMessageNotPassed) +#define assertTestNotPassF(testClass,name) \ + assertTestStatusInternalF(testClass, name, isNotPassed, kMessageNotPassed) /** Assert that test 'name' has failed. */ -#define assertTestFailF(test_class,name) \ - assertTestStatusInternalF(test_class, name, isFailed, kMessageFailed) +#define assertTestFailF(testClass,name) \ + assertTestStatusInternalF(testClass, name, isFailed, kMessageFailed) /** Assert that test 'name' has not failed. */ -#define assertTestNotFailF(test_class,name) \ - assertTestStatusInternalF(test_class, name, isNotFailed, kMessageNotFailed) +#define assertTestNotFailF(testClass,name) \ + assertTestStatusInternalF(testClass, name, isNotFailed, kMessageNotFailed) /** Assert that test 'name' has been skipped. */ -#define assertTestSkipF(test_class,name) \ - assertTestStatusInternalF(test_class, name, isSkipped, kMessageSkipped) +#define assertTestSkipF(testClass,name) \ + assertTestStatusInternalF(testClass, name, isSkipped, kMessageSkipped) /** Assert that test 'name' has not been skipped. */ -#define assertTestNotSkipF(test_class,name) \ - assertTestStatusInternalF(test_class, name, isNotSkipped, \ +#define assertTestNotSkipF(testClass,name) \ + assertTestStatusInternalF(testClass, name, isNotSkipped, \ kMessageNotSkipped) /** Assert that test 'name' has timed out. */ -#define assertTestExpireF(test_class,name) \ - assertTestStatusInternalF(test_class, name, isExpired, kMessageExpired) +#define assertTestExpireF(testClass,name) \ + assertTestStatusInternalF(testClass, name, isExpired, kMessageExpired) /** Assert that test 'name' has not timed out. */ -#define assertTestNotExpireF(test_class,name) \ - assertTestStatusInternalF(test_class, name, isNotExpired, \ +#define assertTestNotExpireF(testClass,name) \ + assertTestStatusInternalF(testClass, name, isNotExpired, \ kMessageNotExpired) /** Internal helper macro, shouldn't be called directly by users. */ -#define assertTestStatusInternalF(test_class,name,method,message) do {\ +#define assertTestStatusInternalF(testClass,name,method,message) do {\ if (!assertionTestStatus(\ __FILE__,__LINE__,#name,FPSTR(message),\ - test_class##_##name##_instance.method()))\ + testClass##_##name##_instance.method()))\ return;\ } while (false) diff --git a/src/aunit/TestMacros.h b/src/aunit/TestMacros.h index ff364c2..3445056 100644 --- a/src/aunit/TestMacros.h +++ b/src/aunit/TestMacros.h @@ -97,45 +97,45 @@ extern test_##name test_##name##_instance /** * Create a test that is derived from a custom TestOnce class. - * The name of the instance is prefixed by '{test_class}_' to avoid + * The name of the instance is prefixed by '{testClass}_' to avoid * name collisions with similarly named tests using other fixtures. */ -#define testF(test_class, name) \ -struct test_class ## _ ## name : test_class {\ - test_class ## _ ## name();\ +#define testF(testClass, name) \ +struct testClass ## _ ## name : testClass {\ + testClass ## _ ## name();\ virtual void once() override;\ -} test_class ## _ ## name ## _instance;\ -test_class ## _ ## name :: test_class ## _ ## name() {\ - init(F(#test_class "_" #name));\ +} testClass ## _ ## name ## _instance;\ +testClass ## _ ## name :: testClass ## _ ## name() {\ + init(F(#testClass "_" #name));\ }\ -void test_class ## _ ## name :: once() +void testClass ## _ ## name :: once() /** * Create a test that is derived from a custom TestAgain class. - * The name of the instance is prefixed by '{test_class}_' to avoid + * The name of the instance is prefixed by '{testClass}_' to avoid * name collisions with similarly named tests using other fixtures. */ -#define testingF(test_class, name) \ -struct test_class ## _ ## name : test_class {\ - test_class ## _ ## name();\ +#define testingF(testClass, name) \ +struct testClass ## _ ## name : testClass {\ + testClass ## _ ## name();\ virtual void again() override;\ -} test_class ## _ ## name ## _instance;\ -test_class ## _ ## name :: test_class ## _ ## name() {\ - init(F(#test_class "_" #name));\ +} testClass ## _ ## name ## _instance;\ +testClass ## _ ## name :: testClass ## _ ## name() {\ + init(F(#testClass "_" #name));\ }\ -void test_class ## _ ## name :: again() +void testClass ## _ ## name :: again() /** * Create an extern reference to a testF() test case object defined elsewhere. * This is only necessary if you use assertTestXxx() or checkTestXxx() when the * test is in another file (or defined after the assertion on it). */ -#define externTestF(test_class, name) \ -struct test_class ## _ ## name : test_class {\ - test_class ## _ ## name();\ +#define externTestF(testClass, name) \ +struct testClass ## _ ## name : testClass {\ + testClass ## _ ## name();\ virtual void once() override;\ };\ -extern test_class ## _ ## name test_class##_##name##_instance +extern testClass ## _ ## name testClass##_##name##_instance /** * Create an extern reference to a testingF() test case object defined @@ -143,11 +143,11 @@ extern test_class ## _ ## name test_class##_##name##_instance * checkTestXxx() when the test is in another file (or defined after the * assertion on it). */ -#define externTestingF(test_class, name) \ -struct test_class ## _ ## name : test_class {\ - test_class ## _ ## name();\ +#define externTestingF(testClass, name) \ +struct testClass ## _ ## name : testClass {\ + testClass ## _ ## name();\ virtual void again() override;\ };\ -extern test_class ## _ ## name test_class##_##name##_instance +extern testClass ## _ ## name testClass##_##name##_instance #endif diff --git a/tests/FilterTest/FilterTest.ino b/tests/FilterTest/FilterTest.ino index a3ce3a2..1d47c7f 100644 --- a/tests/FilterTest/FilterTest.ino +++ b/tests/FilterTest/FilterTest.ino @@ -67,7 +67,7 @@ void setup() { while (! Serial); // Wait until Serial is ready - Leonardo // Verify that the names of these tests don't collide and can be - // independently selected. Name of test is "{test_class}_{name}", but we can + // independently selected. Name of test is "{testClass}_{name}", but we can // use the new 2-argument versions of include(testClass, pattern) and // exclude(testClass, pattern) instead. From 9b7002acfb8626ce36ecc03cec38cfc8c8e9b290 Mon Sep 17 00:00:00 2001 From: Brian Park Date: Wed, 11 Apr 2018 12:06:55 -0700 Subject: [PATCH 07/15] README.md: add TestRunner duration message, for #18 --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index d65c656..881a09b 100644 --- a/README.md +++ b/README.md @@ -945,6 +945,7 @@ At the end of the test run, the `TestRunner` prints out the summary of all test cases, like this: ``` +TestRunner duration: 0.05 seconds. TestRunner summary: 12 passed, 0 failed, 2 skipped, 1 timed out, out of 15 test(s). ``` From 42c7e997d60fd35d6f92a996f2e11bd4ddede63e Mon Sep 17 00:00:00 2001 From: Brian Park Date: Thu, 12 Apr 2018 08:46:10 -0700 Subject: [PATCH 08/15] Use typedef FlashStringType in aunit namespace instead of global AUNIT_FLASH_STRING_HELPER macro --- src/aunit/Assertion.cpp | 87 +++++++++++++++++++------------------ src/aunit/Assertion.h | 66 ++++++++++++++-------------- src/aunit/Compare.cpp | 2 +- src/aunit/Flash.h | 13 ++++-- tests/AUnitTest/AUnitTest.h | 7 ++- 5 files changed, 93 insertions(+), 82 deletions(-) diff --git a/src/aunit/Assertion.cpp b/src/aunit/Assertion.cpp index acb7a80..e024461 100644 --- a/src/aunit/Assertion.cpp +++ b/src/aunit/Assertion.cpp @@ -325,11 +325,14 @@ bool Assertion::assertion(const char* file, uint16_t line, // Verbose versions of above which accept the string arguments of the // assertXxx() macros, so that the error messages are more verbose. - +// +// Prints something like the following: +// Assertion failed: (x=5) == (y=6), file Test.ino, line 820. +// Assertion passed: (x=6) == (y=6), file Test.ino, line 820. template static void printAssertionMessageVerbose(bool ok, const char* file, - uint16_t line, const A& lhs, AUNIT_FLASH_STRING_HELPER lhsString, - const char *opName, const B& rhs, AUNIT_FLASH_STRING_HELPER rhsString) { + uint16_t line, const A& lhs, FlashStringType lhsString, + const char *opName, const B& rhs, FlashStringType rhsString) { // Don't use F() strings here because flash memory strings are not deduped by // the compiler, so each template instantiation of this method causes a @@ -360,10 +363,10 @@ static void printAssertionMessageVerbose(bool ok, const char* file, // Special version of (bool, bool) because Arduino Print.h converts // bool into int, which prints out "(1) == (0)", which isn't as useful. -// This prints "(true) == (false)". +// This prints "(x=true) == (y=false)". static void printAssertionMessageVerbose(bool ok, const char* file, - uint16_t line, bool lhs, AUNIT_FLASH_STRING_HELPER lhsString, - const char *opName, bool rhs, AUNIT_FLASH_STRING_HELPER rhsString) { + uint16_t line, bool lhs, FlashStringType lhsString, + const char *opName, bool rhs, FlashStringType rhsString) { // Don't use F() strings here. Same reason as above. Print* printer = Printer::getPrinter(); @@ -389,10 +392,10 @@ static void printAssertionMessageVerbose(bool ok, const char* file, // Special version for assertTrue(arg) and assertFalse(arg). // Prints: -// "Assertion passed/failed: (arg) is true" -// "Assertion passed/failed: (arg) is false" +// "Assertion passed/failed: (x=arg) is true" +// "Assertion passed/failed: (x=arg) is false" static void printAssertionBoolMessageVerbose(bool ok, const char* file, - uint16_t line, bool arg, AUNIT_FLASH_STRING_HELPER argString, bool value) { + uint16_t line, bool arg, FlashStringType argString, bool value) { // Don't use F() strings here. Same reason as above. Print* printer = Printer::getPrinter(); @@ -412,7 +415,7 @@ static void printAssertionBoolMessageVerbose(bool ok, const char* file, } bool Assertion::assertionBoolVerbose(const char* file, uint16_t line, bool arg, - AUNIT_FLASH_STRING_HELPER argString, bool value) { + FlashStringType argString, bool value) { if (isDone()) return false; bool ok = (arg == value); if (isOutputEnabled(ok)) { @@ -423,9 +426,9 @@ bool Assertion::assertionBoolVerbose(const char* file, uint16_t line, bool arg, } bool Assertion::assertionVerbose(const char* file, uint16_t line, bool lhs, - AUNIT_FLASH_STRING_HELPER lhsString, const char* opName, + FlashStringType lhsString, const char* opName, bool (*op)(bool lhs, bool rhs), bool rhs, - AUNIT_FLASH_STRING_HELPER rhsString) { + FlashStringType rhsString) { if (isDone()) return false; bool ok = op(lhs, rhs); if (isOutputEnabled(ok)) { @@ -437,9 +440,9 @@ bool Assertion::assertionVerbose(const char* file, uint16_t line, bool lhs, } bool Assertion::assertionVerbose(const char* file, uint16_t line, char lhs, - AUNIT_FLASH_STRING_HELPER lhsString, const char* opName, + FlashStringType lhsString, const char* opName, bool (*op)(char lhs, char rhs), char rhs, - AUNIT_FLASH_STRING_HELPER rhsString) { + FlashStringType rhsString) { if (isDone()) return false; bool ok = op(lhs, rhs); if (isOutputEnabled(ok)) { @@ -451,9 +454,9 @@ bool Assertion::assertionVerbose(const char* file, uint16_t line, char lhs, } bool Assertion::assertionVerbose(const char* file, uint16_t line, int lhs, - AUNIT_FLASH_STRING_HELPER lhsString, const char* opName, + FlashStringType lhsString, const char* opName, bool (*op)(int lhs, int rhs), int rhs, - AUNIT_FLASH_STRING_HELPER rhsString) { + FlashStringType rhsString) { if (isDone()) return false; bool ok = op(lhs, rhs); if (isOutputEnabled(ok)) { @@ -465,9 +468,9 @@ bool Assertion::assertionVerbose(const char* file, uint16_t line, int lhs, } bool Assertion::assertionVerbose(const char* file, uint16_t line, - unsigned int lhs, AUNIT_FLASH_STRING_HELPER lhsString, const char* opName, + unsigned int lhs, FlashStringType lhsString, const char* opName, bool (*op)(unsigned int lhs, unsigned int rhs), - unsigned int rhs, AUNIT_FLASH_STRING_HELPER rhsString) { + unsigned int rhs, FlashStringType rhsString) { if (isDone()) return false; bool ok = op(lhs, rhs); if (isOutputEnabled(ok)) { @@ -479,9 +482,9 @@ bool Assertion::assertionVerbose(const char* file, uint16_t line, } bool Assertion::assertionVerbose(const char* file, uint16_t line, long lhs, - AUNIT_FLASH_STRING_HELPER lhsString, const char* opName, + FlashStringType lhsString, const char* opName, bool (*op)(long lhs, long rhs), long rhs, - AUNIT_FLASH_STRING_HELPER rhsString) { + FlashStringType rhsString) { if (isDone()) return false; bool ok = op(lhs, rhs); if (isOutputEnabled(ok)) { @@ -493,9 +496,9 @@ bool Assertion::assertionVerbose(const char* file, uint16_t line, long lhs, } bool Assertion::assertionVerbose(const char* file, uint16_t line, - unsigned long lhs, AUNIT_FLASH_STRING_HELPER lhsString, const char* opName, + unsigned long lhs, FlashStringType lhsString, const char* opName, bool (*op)(unsigned long lhs, unsigned long rhs), - unsigned long rhs, AUNIT_FLASH_STRING_HELPER rhsString) { + unsigned long rhs, FlashStringType rhsString) { if (isDone()) return false; bool ok = op(lhs, rhs); if (isOutputEnabled(ok)) { @@ -507,9 +510,9 @@ bool Assertion::assertionVerbose(const char* file, uint16_t line, } bool Assertion::assertionVerbose(const char* file, uint16_t line, double lhs, - AUNIT_FLASH_STRING_HELPER lhsString, const char* opName, + FlashStringType lhsString, const char* opName, bool (*op)(double lhs, double rhs), double rhs, - AUNIT_FLASH_STRING_HELPER rhsString) { + FlashStringType rhsString) { if (isDone()) return false; bool ok = op(lhs, rhs); if (isOutputEnabled(ok)) { @@ -521,9 +524,9 @@ bool Assertion::assertionVerbose(const char* file, uint16_t line, double lhs, } bool Assertion::assertionVerbose(const char* file, uint16_t line, - const char* lhs, AUNIT_FLASH_STRING_HELPER lhsString, const char* opName, + const char* lhs, FlashStringType lhsString, const char* opName, bool (*op)(const char* lhs, const char* rhs), - const char* rhs, AUNIT_FLASH_STRING_HELPER rhsString) { + const char* rhs, FlashStringType rhsString) { if (isDone()) return false; bool ok = op(lhs, rhs); if (isOutputEnabled(ok)) { @@ -535,9 +538,9 @@ bool Assertion::assertionVerbose(const char* file, uint16_t line, } bool Assertion::assertionVerbose(const char* file, uint16_t line, - const char* lhs, AUNIT_FLASH_STRING_HELPER lhsString, + const char* lhs, FlashStringType lhsString, const char *opName, bool (*op)(const char* lhs, const String& rhs), - const String& rhs, AUNIT_FLASH_STRING_HELPER rhsString) { + const String& rhs, FlashStringType rhsString) { if (isDone()) return false; bool ok = op(lhs, rhs); if (isOutputEnabled(ok)) { @@ -549,9 +552,9 @@ bool Assertion::assertionVerbose(const char* file, uint16_t line, } bool Assertion::assertionVerbose(const char* file, uint16_t line, - const char* lhs, AUNIT_FLASH_STRING_HELPER lhsString, const char *opName, + const char* lhs, FlashStringType lhsString, const char *opName, bool (*op)(const char* lhs, const __FlashStringHelper* rhs), - const __FlashStringHelper* rhs, AUNIT_FLASH_STRING_HELPER rhsString) { + const __FlashStringHelper* rhs, FlashStringType rhsString) { if (isDone()) return false; bool ok = op(lhs, rhs); if (isOutputEnabled(ok)) { @@ -563,9 +566,9 @@ bool Assertion::assertionVerbose(const char* file, uint16_t line, } bool Assertion::assertionVerbose(const char* file, uint16_t line, - const String& lhs, AUNIT_FLASH_STRING_HELPER lhsString, const char *opName, + const String& lhs, FlashStringType lhsString, const char *opName, bool (*op)(const String& lhs, const char* rhs), - const char* rhs, AUNIT_FLASH_STRING_HELPER rhsString) { + const char* rhs, FlashStringType rhsString) { if (isDone()) return false; bool ok = op(lhs, rhs); if (isOutputEnabled(ok)) { @@ -577,9 +580,9 @@ bool Assertion::assertionVerbose(const char* file, uint16_t line, } bool Assertion::assertionVerbose(const char* file, uint16_t line, - const String& lhs, AUNIT_FLASH_STRING_HELPER lhsString, const char *opName, + const String& lhs, FlashStringType lhsString, const char *opName, bool (*op)(const String& lhs, const String& rhs), - const String& rhs, AUNIT_FLASH_STRING_HELPER rhsString) { + const String& rhs, FlashStringType rhsString) { if (isDone()) return false; bool ok = op(lhs, rhs); if (isOutputEnabled(ok)) { @@ -591,9 +594,9 @@ bool Assertion::assertionVerbose(const char* file, uint16_t line, } bool Assertion::assertionVerbose(const char* file, uint16_t line, - const String& lhs, AUNIT_FLASH_STRING_HELPER lhsString, const char *opName, + const String& lhs, FlashStringType lhsString, const char *opName, bool (*op)(const String& lhs, const __FlashStringHelper* rhs), - const __FlashStringHelper* rhs, AUNIT_FLASH_STRING_HELPER rhsString) { + const __FlashStringHelper* rhs, FlashStringType rhsString) { if (isDone()) return false; bool ok = op(lhs, rhs); if (isOutputEnabled(ok)) { @@ -605,10 +608,10 @@ bool Assertion::assertionVerbose(const char* file, uint16_t line, } bool Assertion::assertionVerbose(const char* file, uint16_t line, - const __FlashStringHelper* lhs, AUNIT_FLASH_STRING_HELPER lhsString, + const __FlashStringHelper* lhs, FlashStringType lhsString, const char *opName, bool (*op)(const __FlashStringHelper* lhs, const char* rhs), - const char* rhs, AUNIT_FLASH_STRING_HELPER rhsString) { + const char* rhs, FlashStringType rhsString) { if (isDone()) return false; bool ok = op(lhs, rhs); if (isOutputEnabled(ok)) { @@ -620,10 +623,10 @@ bool Assertion::assertionVerbose(const char* file, uint16_t line, } bool Assertion::assertionVerbose(const char* file, uint16_t line, - const __FlashStringHelper* lhs, AUNIT_FLASH_STRING_HELPER lhsString, + const __FlashStringHelper* lhs, FlashStringType lhsString, const char *opName, bool (*op)(const __FlashStringHelper* lhs, const String& rhs), - const String& rhs, AUNIT_FLASH_STRING_HELPER rhsString) { + const String& rhs, FlashStringType rhsString) { if (isDone()) return false; bool ok = op(lhs, rhs); if (isOutputEnabled(ok)) { @@ -635,10 +638,10 @@ bool Assertion::assertionVerbose(const char* file, uint16_t line, } bool Assertion::assertionVerbose(const char* file, uint16_t line, - const __FlashStringHelper* lhs, AUNIT_FLASH_STRING_HELPER lhsString, + const __FlashStringHelper* lhs, FlashStringType lhsString, const char *opName, bool (*op)(const __FlashStringHelper* lhs, const __FlashStringHelper* rhs), - const __FlashStringHelper* rhs, AUNIT_FLASH_STRING_HELPER rhsString) { + const __FlashStringHelper* rhs, FlashStringType rhsString) { if (isDone()) return false; bool ok = op(lhs, rhs); if (isOutputEnabled(ok)) { diff --git a/src/aunit/Assertion.h b/src/aunit/Assertion.h index 74c7f3c..5795d68 100644 --- a/src/aunit/Assertion.h +++ b/src/aunit/Assertion.h @@ -136,91 +136,91 @@ class Assertion: public Test { // Verbose versions of above. bool assertionBoolVerbose(const char* file, uint16_t line, bool arg, - AUNIT_FLASH_STRING_HELPER argString, bool value); + FlashStringType argString, bool value); bool assertionVerbose(const char* file, uint16_t line, bool lhs, - AUNIT_FLASH_STRING_HELPER lhsString, const char* opName, + FlashStringType lhsString, const char* opName, bool (*op)(bool lhs, bool rhs), - bool rhs, AUNIT_FLASH_STRING_HELPER rhsString); + bool rhs, FlashStringType rhsString); bool assertionVerbose(const char* file, uint16_t line, char lhs, - AUNIT_FLASH_STRING_HELPER lhsString, const char* opName, + FlashStringType lhsString, const char* opName, bool (*op)(char lhs, char rhs), - char rhs, AUNIT_FLASH_STRING_HELPER rhsString); + char rhs, FlashStringType rhsString); bool assertionVerbose(const char* file, uint16_t line, int lhs, - AUNIT_FLASH_STRING_HELPER lhsString, const char* opName, + FlashStringType lhsString, const char* opName, bool (*op)(int lhs, int rhs), - int rhs, AUNIT_FLASH_STRING_HELPER rhsString); + int rhs, FlashStringType rhsString); bool assertionVerbose(const char* file, uint16_t line, unsigned int lhs, - AUNIT_FLASH_STRING_HELPER lhsString, const char* opName, + FlashStringType lhsString, const char* opName, bool (*op)(unsigned int lhs, unsigned int rhs), - unsigned int rhs, AUNIT_FLASH_STRING_HELPER rhsString); + unsigned int rhs, FlashStringType rhsString); bool assertionVerbose(const char* file, uint16_t line, long lhs, - AUNIT_FLASH_STRING_HELPER lhsString, const char* opName, + FlashStringType lhsString, const char* opName, bool (*op)(long lhs, long rhs), - long rhs, AUNIT_FLASH_STRING_HELPER rhsString); + long rhs, FlashStringType rhsString); bool assertionVerbose(const char* file, uint16_t line, unsigned long lhs, - AUNIT_FLASH_STRING_HELPER lhsString, const char* opName, + FlashStringType lhsString, const char* opName, bool (*op)(unsigned long lhs, unsigned long rhs), - unsigned long rhs, AUNIT_FLASH_STRING_HELPER rhsString); + unsigned long rhs, FlashStringType rhsString); bool assertionVerbose(const char* file, uint16_t line, double lhs, - AUNIT_FLASH_STRING_HELPER lhsString, const char* opName, + FlashStringType lhsString, const char* opName, bool (*op)(double lhs, double rhs), - double rhs, AUNIT_FLASH_STRING_HELPER rhsString); + double rhs, FlashStringType rhsString); bool assertionVerbose(const char* file, uint16_t line, const char* lhs, - AUNIT_FLASH_STRING_HELPER lhsString, const char* opName, + FlashStringType lhsString, const char* opName, bool (*op)(const char* lhs, const char* rhs), - const char* rhs, AUNIT_FLASH_STRING_HELPER rhsString); + const char* rhs, FlashStringType rhsString); bool assertionVerbose(const char* file, uint16_t line, const char* lhs, - AUNIT_FLASH_STRING_HELPER lhsString, const char *opName, + FlashStringType lhsString, const char *opName, bool (*op)(const char* lhs, const String& rhs), - const String& rhs, AUNIT_FLASH_STRING_HELPER rhsString); + const String& rhs, FlashStringType rhsString); bool assertionVerbose(const char* file, uint16_t line, const char* lhs, - AUNIT_FLASH_STRING_HELPER lhsString, const char *opName, + FlashStringType lhsString, const char *opName, bool (*op)(const char* lhs, const __FlashStringHelper* rhs), - const __FlashStringHelper* rhs, AUNIT_FLASH_STRING_HELPER rhsString); + const __FlashStringHelper* rhs, FlashStringType rhsString); bool assertionVerbose(const char* file, uint16_t line, const String& lhs, - AUNIT_FLASH_STRING_HELPER lhsString, const char *opName, + FlashStringType lhsString, const char *opName, bool (*op)(const String& lhs, const char* rhs), - const char* rhs, AUNIT_FLASH_STRING_HELPER rhsString); + const char* rhs, FlashStringType rhsString); bool assertionVerbose(const char* file, uint16_t line, const String& lhs, - AUNIT_FLASH_STRING_HELPER lhsString, const char *opName, + FlashStringType lhsString, const char *opName, bool (*op)(const String& lhs, const String& rhs), - const String& rhs, AUNIT_FLASH_STRING_HELPER rhsString); + const String& rhs, FlashStringType rhsString); bool assertionVerbose(const char* file, uint16_t line, const String& lhs, - AUNIT_FLASH_STRING_HELPER lhsString, const char *opName, + FlashStringType lhsString, const char *opName, bool (*op)(const String& lhs, const __FlashStringHelper* rhs), - const __FlashStringHelper* rhs, AUNIT_FLASH_STRING_HELPER rhsString); + const __FlashStringHelper* rhs, FlashStringType rhsString); bool assertionVerbose(const char* file, uint16_t line, - const __FlashStringHelper* lhs, AUNIT_FLASH_STRING_HELPER lhsString, + const __FlashStringHelper* lhs, FlashStringType lhsString, const char *opName, bool (*op)(const __FlashStringHelper* lhs, const char* rhs), - const char* rhs, AUNIT_FLASH_STRING_HELPER rhsString); + const char* rhs, FlashStringType rhsString); bool assertionVerbose(const char* file, uint16_t line, - const __FlashStringHelper* lhs, AUNIT_FLASH_STRING_HELPER lhsString, + const __FlashStringHelper* lhs, FlashStringType lhsString, const char *opName, bool (*op)(const __FlashStringHelper* lhs, const String& rhs), - const String& rhs, AUNIT_FLASH_STRING_HELPER rhsString); + const String& rhs, FlashStringType rhsString); bool assertionVerbose(const char* file, uint16_t line, - const __FlashStringHelper* lhs, AUNIT_FLASH_STRING_HELPER lhsString, + const __FlashStringHelper* lhs, FlashStringType lhsString, const char *opName, bool (*op)(const __FlashStringHelper* lhs, const __FlashStringHelper* rhs), - const __FlashStringHelper* rhs, AUNIT_FLASH_STRING_HELPER rhsString); + const __FlashStringHelper* rhs, FlashStringType rhsString); private: // Disable copy-constructor and assignment operator diff --git a/src/aunit/Compare.cpp b/src/aunit/Compare.cpp index 397926d..0a1a9f6 100644 --- a/src/aunit/Compare.cpp +++ b/src/aunit/Compare.cpp @@ -94,7 +94,7 @@ even for primitive integer types. Implicit Conversions: --------------------- For basic primitive types, I depend on some casts to avoid having to define -some functions. I assume that signed and unsigned intergers smaller or equal +some functions. I assume that signed and unsigned integers smaller or equal to (int) will be converted to an (int) to match compareEqual(int, int). I provided an explicit compareEqual(char, char) overload because in C++, a diff --git a/src/aunit/Flash.h b/src/aunit/Flash.h index f6fec98..c9245e8 100644 --- a/src/aunit/Flash.h +++ b/src/aunit/Flash.h @@ -25,13 +25,14 @@ SOFTWARE. /** * @file Flash.h * - * Flash strings (using F() macro) on the ESP8266 platform cannot be placed in + * Flash strings (using F() macro) on the ESP8266 platform cannot be placed in * an inline context, because it interferes with other PROGMEM strings in * non-inline contexts. See https://github.com/esp8266/Arduino/issues/3369. In * some cases (e.g. TestMacros.h), we were able to move the F() macro into a * non-inline context. But in other cases (e.g. AssertVerboseMacros.h) it is * impossible to move these out of inline contexts because we want to support - * assertXxx() statements inside inlined methods. + * assertXxx() statements inside inlined methods. We use normal (const char*) + * strings instead of flash strings in those places instead. */ #ifndef AUNIT_FLASH_H @@ -56,10 +57,14 @@ class __FlashStringHelper; // non-inlnie contexts. So don't use F() strings on ESP8266. #ifdef ESP8266 #define AUNIT_F(x) (x) - #define AUNIT_FLASH_STRING_HELPER const char* + namespace aunit { + typedef const char* FlashStringType; + } #else #define AUNIT_F(x) F(x) - #define AUNIT_FLASH_STRING_HELPER const __FlashStringHelper* + namespace aunit { + typedef const __FlashStringHelper* FlashStringType; + } #endif #endif diff --git a/tests/AUnitTest/AUnitTest.h b/tests/AUnitTest/AUnitTest.h index c6d8ab5..3a08d23 100644 --- a/tests/AUnitTest/AUnitTest.h +++ b/tests/AUnitTest/AUnitTest.h @@ -20,8 +20,11 @@ // Teensy 3.2: // AUnit.h: flash/static: 43328/5440 // AUnitVerbose.h: flash/static: 49820/5440 -//#include -#include +#if defined(__AVR__) + #include +#else + #include +#endif using namespace aunit; From 96f7f2986931c73dff3b70a8c3aa74045ae9eb2e Mon Sep 17 00:00:00 2001 From: Brian Park Date: Sat, 14 Apr 2018 09:56:08 -0700 Subject: [PATCH 09/15] Cleanup symbols in 'aunit' namespace; move internal methods into aunit::internal namespace; move static methods into anonymous namespace --- src/aunit/AssertMacros.h | 12 ++--- src/aunit/AssertVerboseMacros.h | 12 ++--- src/aunit/Assertion.cpp | 95 ++++++++++++++++++--------------- src/aunit/Assertion.h | 66 +++++++++++------------ src/aunit/Compare.cpp | 4 ++ src/aunit/Compare.h | 2 + src/aunit/FCString.h | 2 + src/aunit/Flash.h | 4 ++ src/aunit/Printer.cpp | 8 +-- src/aunit/Printer.h | 6 ++- src/aunit/Test.cpp | 13 +++-- src/aunit/Test.h | 14 +++-- tests/AUnitTest/AUnitTest.ino | 2 + 13 files changed, 130 insertions(+), 110 deletions(-) diff --git a/src/aunit/AssertMacros.h b/src/aunit/AssertMacros.h index b5f6a73..3e52705 100644 --- a/src/aunit/AssertMacros.h +++ b/src/aunit/AssertMacros.h @@ -38,27 +38,27 @@ SOFTWARE. /** Assert that arg1 is equal to arg2. */ #define assertEqual(arg1,arg2) \ - assertOpInternal(arg1,aunit::compareEqual,"==",arg2) + assertOpInternal(arg1,aunit::internal::compareEqual,"==",arg2) /** Assert that arg1 is not equal to arg2. */ #define assertNotEqual(arg1,arg2) \ - assertOpInternal(arg1,aunit::compareNotEqual,"!=",arg2) + assertOpInternal(arg1,aunit::internal::compareNotEqual,"!=",arg2) /** Assert that arg1 is less than arg2. */ #define assertLess(arg1,arg2) \ - assertOpInternal(arg1,aunit::compareLess,"<",arg2) + assertOpInternal(arg1,aunit::internal::compareLess,"<",arg2) /** Assert that arg1 is more than arg2. */ #define assertMore(arg1,arg2) \ - assertOpInternal(arg1,aunit::compareMore,">",arg2) + assertOpInternal(arg1,aunit::internal::compareMore,">",arg2) /** Assert that arg1 is less than or equal to arg2. */ #define assertLessOrEqual(arg1,arg2) \ - assertOpInternal(arg1,aunit::compareLessOrEqual,"<=",arg2) + assertOpInternal(arg1,aunit::internal::compareLessOrEqual,"<=",arg2) /** Assert that arg1 is more than or equal to arg2. */ #define assertMoreOrEqual(arg1,arg2) \ - assertOpInternal(arg1,aunit::compareMoreOrEqual,">=",arg2) + assertOpInternal(arg1,aunit::internal::compareMoreOrEqual,">=",arg2) /** Assert that arg is true. */ #define assertTrue(arg) assertBoolInternal(arg,true) diff --git a/src/aunit/AssertVerboseMacros.h b/src/aunit/AssertVerboseMacros.h index c36cf33..3eb6e1e 100644 --- a/src/aunit/AssertVerboseMacros.h +++ b/src/aunit/AssertVerboseMacros.h @@ -38,27 +38,27 @@ SOFTWARE. /** Assert that arg1 is equal to arg2. */ #define assertEqual(arg1,arg2) \ - assertOpVerboseInternal(arg1,aunit::compareEqual,"==",arg2) + assertOpVerboseInternal(arg1,aunit::internal::compareEqual,"==",arg2) /** Assert that arg1 is not equal to arg2. */ #define assertNotEqual(arg1,arg2) \ - assertOpVerboseInternal(arg1,aunit::compareNotEqual,"!=",arg2) + assertOpVerboseInternal(arg1,aunit::internal::compareNotEqual,"!=",arg2) /** Assert that arg1 is less than arg2. */ #define assertLess(arg1,arg2) \ - assertOpVerboseInternal(arg1,aunit::compareLess,"<",arg2) + assertOpVerboseInternal(arg1,aunit::internal::compareLess,"<",arg2) /** Assert that arg1 is more than arg2. */ #define assertMore(arg1,arg2) \ - assertOpVerboseInternal(arg1,aunit::compareMore,">",arg2) + assertOpVerboseInternal(arg1,aunit::internal::compareMore,">",arg2) /** Assert that arg1 is less than or equal to arg2. */ #define assertLessOrEqual(arg1,arg2) \ - assertOpVerboseInternal(arg1,aunit::compareLessOrEqual,"<=",arg2) + assertOpVerboseInternal(arg1,aunit::internal::compareLessOrEqual,"<=",arg2) /** Assert that arg1 is more than or equal to arg2. */ #define assertMoreOrEqual(arg1,arg2) \ - assertOpVerboseInternal(arg1,aunit::compareMoreOrEqual,">=",arg2) + assertOpVerboseInternal(arg1,aunit::internal::compareMoreOrEqual,">=",arg2) /** Assert that arg is true. */ #define assertTrue(arg) assertBoolVerboseInternal(arg,true) diff --git a/src/aunit/Assertion.cpp b/src/aunit/Assertion.cpp index e024461..a47ecf0 100644 --- a/src/aunit/Assertion.cpp +++ b/src/aunit/Assertion.cpp @@ -29,6 +29,7 @@ SOFTWARE. namespace aunit { +namespace { // This can be a template function because it is accessed only through the // various assertXxx() methods. Those assertXxx() methods are explicitly @@ -38,7 +39,7 @@ namespace aunit { // Assertion failed: (5) == (6), file Test.ino, line 820. // Assertion passed: (6) == (6), file Test.ino, line 820. template -static void printAssertionMessage(bool ok, const char* file, uint16_t line, +void printAssertionMessage(bool ok, const char* file, uint16_t line, const A& lhs, const char *opName, const B& rhs) { // Don't use F() strings here because flash memory strings are not deduped by @@ -67,7 +68,7 @@ static void printAssertionMessage(bool ok, const char* file, uint16_t line, // Special version of (bool, bool) because Arduino Print.h converts // bool into int, which prints out "(1) == (0)", which isn't as useful. // This prints "(true) == (false)". -static void printAssertionMessage(bool ok, const char* file, uint16_t line, +void printAssertionMessage(bool ok, const char* file, uint16_t line, bool lhs, const char *opName, bool rhs) { // Don't use F() strings here. Same reason as above. @@ -92,7 +93,7 @@ static void printAssertionMessage(bool ok, const char* file, uint16_t line, // Prints: // "Assertion passed/failed: (arg) is true" // "Assertion passed/failed: (arg) is false" -static void printAssertionBoolMessage(bool ok, const char* file, uint16_t line, +void printAssertionBoolMessage(bool ok, const char* file, uint16_t line, bool arg, bool value) { // Don't use F() strings here. Same reason as above. @@ -110,6 +111,8 @@ static void printAssertionBoolMessage(bool ok, const char* file, uint16_t line, printer->println('.'); } +} // namespace + bool Assertion::isOutputEnabled(bool ok) { return (ok && isVerbosity(Verbosity::kAssertionPassed)) || (!ok && isVerbosity(Verbosity::kAssertionFailed)); @@ -323,6 +326,8 @@ bool Assertion::assertion(const char* file, uint16_t line, return ok; } +namespace { + // Verbose versions of above which accept the string arguments of the // assertXxx() macros, so that the error messages are more verbose. // @@ -330,9 +335,9 @@ bool Assertion::assertion(const char* file, uint16_t line, // Assertion failed: (x=5) == (y=6), file Test.ino, line 820. // Assertion passed: (x=6) == (y=6), file Test.ino, line 820. template -static void printAssertionMessageVerbose(bool ok, const char* file, - uint16_t line, const A& lhs, FlashStringType lhsString, - const char *opName, const B& rhs, FlashStringType rhsString) { +void printAssertionMessageVerbose(bool ok, const char* file, + uint16_t line, const A& lhs, internal::FlashStringType lhsString, + const char *opName, const B& rhs, internal::FlashStringType rhsString) { // Don't use F() strings here because flash memory strings are not deduped by // the compiler, so each template instantiation of this method causes a @@ -364,9 +369,9 @@ static void printAssertionMessageVerbose(bool ok, const char* file, // Special version of (bool, bool) because Arduino Print.h converts // bool into int, which prints out "(1) == (0)", which isn't as useful. // This prints "(x=true) == (y=false)". -static void printAssertionMessageVerbose(bool ok, const char* file, - uint16_t line, bool lhs, FlashStringType lhsString, - const char *opName, bool rhs, FlashStringType rhsString) { +void printAssertionMessageVerbose(bool ok, const char* file, + uint16_t line, bool lhs, internal::FlashStringType lhsString, + const char *opName, bool rhs, internal::FlashStringType rhsString) { // Don't use F() strings here. Same reason as above. Print* printer = Printer::getPrinter(); @@ -394,8 +399,8 @@ static void printAssertionMessageVerbose(bool ok, const char* file, // Prints: // "Assertion passed/failed: (x=arg) is true" // "Assertion passed/failed: (x=arg) is false" -static void printAssertionBoolMessageVerbose(bool ok, const char* file, - uint16_t line, bool arg, FlashStringType argString, bool value) { +void printAssertionBoolMessageVerbose(bool ok, const char* file, + uint16_t line, bool arg, internal::FlashStringType argString, bool value) { // Don't use F() strings here. Same reason as above. Print* printer = Printer::getPrinter(); @@ -414,8 +419,10 @@ static void printAssertionBoolMessageVerbose(bool ok, const char* file, printer->println('.'); } +} // namespace + bool Assertion::assertionBoolVerbose(const char* file, uint16_t line, bool arg, - FlashStringType argString, bool value) { + internal::FlashStringType argString, bool value) { if (isDone()) return false; bool ok = (arg == value); if (isOutputEnabled(ok)) { @@ -426,9 +433,9 @@ bool Assertion::assertionBoolVerbose(const char* file, uint16_t line, bool arg, } bool Assertion::assertionVerbose(const char* file, uint16_t line, bool lhs, - FlashStringType lhsString, const char* opName, + internal::FlashStringType lhsString, const char* opName, bool (*op)(bool lhs, bool rhs), bool rhs, - FlashStringType rhsString) { + internal::FlashStringType rhsString) { if (isDone()) return false; bool ok = op(lhs, rhs); if (isOutputEnabled(ok)) { @@ -440,9 +447,9 @@ bool Assertion::assertionVerbose(const char* file, uint16_t line, bool lhs, } bool Assertion::assertionVerbose(const char* file, uint16_t line, char lhs, - FlashStringType lhsString, const char* opName, + internal::FlashStringType lhsString, const char* opName, bool (*op)(char lhs, char rhs), char rhs, - FlashStringType rhsString) { + internal::FlashStringType rhsString) { if (isDone()) return false; bool ok = op(lhs, rhs); if (isOutputEnabled(ok)) { @@ -454,9 +461,9 @@ bool Assertion::assertionVerbose(const char* file, uint16_t line, char lhs, } bool Assertion::assertionVerbose(const char* file, uint16_t line, int lhs, - FlashStringType lhsString, const char* opName, + internal::FlashStringType lhsString, const char* opName, bool (*op)(int lhs, int rhs), int rhs, - FlashStringType rhsString) { + internal::FlashStringType rhsString) { if (isDone()) return false; bool ok = op(lhs, rhs); if (isOutputEnabled(ok)) { @@ -468,9 +475,9 @@ bool Assertion::assertionVerbose(const char* file, uint16_t line, int lhs, } bool Assertion::assertionVerbose(const char* file, uint16_t line, - unsigned int lhs, FlashStringType lhsString, const char* opName, + unsigned int lhs, internal::FlashStringType lhsString, const char* opName, bool (*op)(unsigned int lhs, unsigned int rhs), - unsigned int rhs, FlashStringType rhsString) { + unsigned int rhs, internal::FlashStringType rhsString) { if (isDone()) return false; bool ok = op(lhs, rhs); if (isOutputEnabled(ok)) { @@ -482,9 +489,9 @@ bool Assertion::assertionVerbose(const char* file, uint16_t line, } bool Assertion::assertionVerbose(const char* file, uint16_t line, long lhs, - FlashStringType lhsString, const char* opName, + internal::FlashStringType lhsString, const char* opName, bool (*op)(long lhs, long rhs), long rhs, - FlashStringType rhsString) { + internal::FlashStringType rhsString) { if (isDone()) return false; bool ok = op(lhs, rhs); if (isOutputEnabled(ok)) { @@ -496,9 +503,9 @@ bool Assertion::assertionVerbose(const char* file, uint16_t line, long lhs, } bool Assertion::assertionVerbose(const char* file, uint16_t line, - unsigned long lhs, FlashStringType lhsString, const char* opName, + unsigned long lhs, internal::FlashStringType lhsString, const char* opName, bool (*op)(unsigned long lhs, unsigned long rhs), - unsigned long rhs, FlashStringType rhsString) { + unsigned long rhs, internal::FlashStringType rhsString) { if (isDone()) return false; bool ok = op(lhs, rhs); if (isOutputEnabled(ok)) { @@ -510,9 +517,9 @@ bool Assertion::assertionVerbose(const char* file, uint16_t line, } bool Assertion::assertionVerbose(const char* file, uint16_t line, double lhs, - FlashStringType lhsString, const char* opName, + internal::FlashStringType lhsString, const char* opName, bool (*op)(double lhs, double rhs), double rhs, - FlashStringType rhsString) { + internal::FlashStringType rhsString) { if (isDone()) return false; bool ok = op(lhs, rhs); if (isOutputEnabled(ok)) { @@ -524,9 +531,9 @@ bool Assertion::assertionVerbose(const char* file, uint16_t line, double lhs, } bool Assertion::assertionVerbose(const char* file, uint16_t line, - const char* lhs, FlashStringType lhsString, const char* opName, + const char* lhs, internal::FlashStringType lhsString, const char* opName, bool (*op)(const char* lhs, const char* rhs), - const char* rhs, FlashStringType rhsString) { + const char* rhs, internal::FlashStringType rhsString) { if (isDone()) return false; bool ok = op(lhs, rhs); if (isOutputEnabled(ok)) { @@ -538,9 +545,9 @@ bool Assertion::assertionVerbose(const char* file, uint16_t line, } bool Assertion::assertionVerbose(const char* file, uint16_t line, - const char* lhs, FlashStringType lhsString, + const char* lhs, internal::FlashStringType lhsString, const char *opName, bool (*op)(const char* lhs, const String& rhs), - const String& rhs, FlashStringType rhsString) { + const String& rhs, internal::FlashStringType rhsString) { if (isDone()) return false; bool ok = op(lhs, rhs); if (isOutputEnabled(ok)) { @@ -552,9 +559,9 @@ bool Assertion::assertionVerbose(const char* file, uint16_t line, } bool Assertion::assertionVerbose(const char* file, uint16_t line, - const char* lhs, FlashStringType lhsString, const char *opName, + const char* lhs, internal::FlashStringType lhsString, const char *opName, bool (*op)(const char* lhs, const __FlashStringHelper* rhs), - const __FlashStringHelper* rhs, FlashStringType rhsString) { + const __FlashStringHelper* rhs, internal::FlashStringType rhsString) { if (isDone()) return false; bool ok = op(lhs, rhs); if (isOutputEnabled(ok)) { @@ -566,9 +573,9 @@ bool Assertion::assertionVerbose(const char* file, uint16_t line, } bool Assertion::assertionVerbose(const char* file, uint16_t line, - const String& lhs, FlashStringType lhsString, const char *opName, + const String& lhs, internal::FlashStringType lhsString, const char *opName, bool (*op)(const String& lhs, const char* rhs), - const char* rhs, FlashStringType rhsString) { + const char* rhs, internal::FlashStringType rhsString) { if (isDone()) return false; bool ok = op(lhs, rhs); if (isOutputEnabled(ok)) { @@ -580,9 +587,9 @@ bool Assertion::assertionVerbose(const char* file, uint16_t line, } bool Assertion::assertionVerbose(const char* file, uint16_t line, - const String& lhs, FlashStringType lhsString, const char *opName, + const String& lhs, internal::FlashStringType lhsString, const char *opName, bool (*op)(const String& lhs, const String& rhs), - const String& rhs, FlashStringType rhsString) { + const String& rhs, internal::FlashStringType rhsString) { if (isDone()) return false; bool ok = op(lhs, rhs); if (isOutputEnabled(ok)) { @@ -594,9 +601,9 @@ bool Assertion::assertionVerbose(const char* file, uint16_t line, } bool Assertion::assertionVerbose(const char* file, uint16_t line, - const String& lhs, FlashStringType lhsString, const char *opName, + const String& lhs, internal::FlashStringType lhsString, const char *opName, bool (*op)(const String& lhs, const __FlashStringHelper* rhs), - const __FlashStringHelper* rhs, FlashStringType rhsString) { + const __FlashStringHelper* rhs, internal::FlashStringType rhsString) { if (isDone()) return false; bool ok = op(lhs, rhs); if (isOutputEnabled(ok)) { @@ -608,10 +615,10 @@ bool Assertion::assertionVerbose(const char* file, uint16_t line, } bool Assertion::assertionVerbose(const char* file, uint16_t line, - const __FlashStringHelper* lhs, FlashStringType lhsString, + const __FlashStringHelper* lhs, internal::FlashStringType lhsString, const char *opName, bool (*op)(const __FlashStringHelper* lhs, const char* rhs), - const char* rhs, FlashStringType rhsString) { + const char* rhs, internal::FlashStringType rhsString) { if (isDone()) return false; bool ok = op(lhs, rhs); if (isOutputEnabled(ok)) { @@ -623,10 +630,10 @@ bool Assertion::assertionVerbose(const char* file, uint16_t line, } bool Assertion::assertionVerbose(const char* file, uint16_t line, - const __FlashStringHelper* lhs, FlashStringType lhsString, + const __FlashStringHelper* lhs, internal::FlashStringType lhsString, const char *opName, bool (*op)(const __FlashStringHelper* lhs, const String& rhs), - const String& rhs, FlashStringType rhsString) { + const String& rhs, internal::FlashStringType rhsString) { if (isDone()) return false; bool ok = op(lhs, rhs); if (isOutputEnabled(ok)) { @@ -638,10 +645,10 @@ bool Assertion::assertionVerbose(const char* file, uint16_t line, } bool Assertion::assertionVerbose(const char* file, uint16_t line, - const __FlashStringHelper* lhs, FlashStringType lhsString, + const __FlashStringHelper* lhs, internal::FlashStringType lhsString, const char *opName, bool (*op)(const __FlashStringHelper* lhs, const __FlashStringHelper* rhs), - const __FlashStringHelper* rhs, FlashStringType rhsString) { + const __FlashStringHelper* rhs, internal::FlashStringType rhsString) { if (isDone()) return false; bool ok = op(lhs, rhs); if (isOutputEnabled(ok)) { diff --git a/src/aunit/Assertion.h b/src/aunit/Assertion.h index 5795d68..9282ac7 100644 --- a/src/aunit/Assertion.h +++ b/src/aunit/Assertion.h @@ -136,91 +136,91 @@ class Assertion: public Test { // Verbose versions of above. bool assertionBoolVerbose(const char* file, uint16_t line, bool arg, - FlashStringType argString, bool value); + internal::FlashStringType argString, bool value); bool assertionVerbose(const char* file, uint16_t line, bool lhs, - FlashStringType lhsString, const char* opName, + internal::FlashStringType lhsString, const char* opName, bool (*op)(bool lhs, bool rhs), - bool rhs, FlashStringType rhsString); + bool rhs, internal::FlashStringType rhsString); bool assertionVerbose(const char* file, uint16_t line, char lhs, - FlashStringType lhsString, const char* opName, + internal::FlashStringType lhsString, const char* opName, bool (*op)(char lhs, char rhs), - char rhs, FlashStringType rhsString); + char rhs, internal::FlashStringType rhsString); bool assertionVerbose(const char* file, uint16_t line, int lhs, - FlashStringType lhsString, const char* opName, + internal::FlashStringType lhsString, const char* opName, bool (*op)(int lhs, int rhs), - int rhs, FlashStringType rhsString); + int rhs, internal::FlashStringType rhsString); bool assertionVerbose(const char* file, uint16_t line, unsigned int lhs, - FlashStringType lhsString, const char* opName, + internal::FlashStringType lhsString, const char* opName, bool (*op)(unsigned int lhs, unsigned int rhs), - unsigned int rhs, FlashStringType rhsString); + unsigned int rhs, internal::FlashStringType rhsString); bool assertionVerbose(const char* file, uint16_t line, long lhs, - FlashStringType lhsString, const char* opName, + internal::FlashStringType lhsString, const char* opName, bool (*op)(long lhs, long rhs), - long rhs, FlashStringType rhsString); + long rhs, internal::FlashStringType rhsString); bool assertionVerbose(const char* file, uint16_t line, unsigned long lhs, - FlashStringType lhsString, const char* opName, + internal::FlashStringType lhsString, const char* opName, bool (*op)(unsigned long lhs, unsigned long rhs), - unsigned long rhs, FlashStringType rhsString); + unsigned long rhs, internal::FlashStringType rhsString); bool assertionVerbose(const char* file, uint16_t line, double lhs, - FlashStringType lhsString, const char* opName, + internal::FlashStringType lhsString, const char* opName, bool (*op)(double lhs, double rhs), - double rhs, FlashStringType rhsString); + double rhs, internal::FlashStringType rhsString); bool assertionVerbose(const char* file, uint16_t line, const char* lhs, - FlashStringType lhsString, const char* opName, + internal::FlashStringType lhsString, const char* opName, bool (*op)(const char* lhs, const char* rhs), - const char* rhs, FlashStringType rhsString); + const char* rhs, internal::FlashStringType rhsString); bool assertionVerbose(const char* file, uint16_t line, const char* lhs, - FlashStringType lhsString, const char *opName, + internal::FlashStringType lhsString, const char *opName, bool (*op)(const char* lhs, const String& rhs), - const String& rhs, FlashStringType rhsString); + const String& rhs, internal::FlashStringType rhsString); bool assertionVerbose(const char* file, uint16_t line, const char* lhs, - FlashStringType lhsString, const char *opName, + internal::FlashStringType lhsString, const char *opName, bool (*op)(const char* lhs, const __FlashStringHelper* rhs), - const __FlashStringHelper* rhs, FlashStringType rhsString); + const __FlashStringHelper* rhs, internal::FlashStringType rhsString); bool assertionVerbose(const char* file, uint16_t line, const String& lhs, - FlashStringType lhsString, const char *opName, + internal::FlashStringType lhsString, const char *opName, bool (*op)(const String& lhs, const char* rhs), - const char* rhs, FlashStringType rhsString); + const char* rhs, internal::FlashStringType rhsString); bool assertionVerbose(const char* file, uint16_t line, const String& lhs, - FlashStringType lhsString, const char *opName, + internal::FlashStringType lhsString, const char *opName, bool (*op)(const String& lhs, const String& rhs), - const String& rhs, FlashStringType rhsString); + const String& rhs, internal::FlashStringType rhsString); bool assertionVerbose(const char* file, uint16_t line, const String& lhs, - FlashStringType lhsString, const char *opName, + internal::FlashStringType lhsString, const char *opName, bool (*op)(const String& lhs, const __FlashStringHelper* rhs), - const __FlashStringHelper* rhs, FlashStringType rhsString); + const __FlashStringHelper* rhs, internal::FlashStringType rhsString); bool assertionVerbose(const char* file, uint16_t line, - const __FlashStringHelper* lhs, FlashStringType lhsString, + const __FlashStringHelper* lhs, internal::FlashStringType lhsString, const char *opName, bool (*op)(const __FlashStringHelper* lhs, const char* rhs), - const char* rhs, FlashStringType rhsString); + const char* rhs, internal::FlashStringType rhsString); bool assertionVerbose(const char* file, uint16_t line, - const __FlashStringHelper* lhs, FlashStringType lhsString, + const __FlashStringHelper* lhs, internal::FlashStringType lhsString, const char *opName, bool (*op)(const __FlashStringHelper* lhs, const String& rhs), - const String& rhs, FlashStringType rhsString); + const String& rhs, internal::FlashStringType rhsString); bool assertionVerbose(const char* file, uint16_t line, - const __FlashStringHelper* lhs, FlashStringType lhsString, + const __FlashStringHelper* lhs, internal::FlashStringType lhsString, const char *opName, bool (*op)(const __FlashStringHelper* lhs, const __FlashStringHelper* rhs), - const __FlashStringHelper* rhs, FlashStringType rhsString); + const __FlashStringHelper* rhs, internal::FlashStringType rhsString); private: // Disable copy-constructor and assignment operator diff --git a/src/aunit/Compare.cpp b/src/aunit/Compare.cpp index 0a1a9f6..55ebd03 100644 --- a/src/aunit/Compare.cpp +++ b/src/aunit/Compare.cpp @@ -134,6 +134,9 @@ inlining them because they are almost always used through a function pointer. #include "FCString.h" namespace aunit { +namespace internal { + +class FCString; // compareString() @@ -653,3 +656,4 @@ bool compareNotEqual(const String& a, const __FlashStringHelper* b) { } } +} diff --git a/src/aunit/Compare.h b/src/aunit/Compare.h index 0ed3d70..e672c32 100644 --- a/src/aunit/Compare.h +++ b/src/aunit/Compare.h @@ -34,6 +34,7 @@ class String; class __FlashStringHelper; namespace aunit { +namespace internal { class FCString; @@ -290,6 +291,7 @@ bool compareNotEqual(const String& a, const String& b); bool compareNotEqual(const String& a, const __FlashStringHelper* b); +} } #endif diff --git a/src/aunit/FCString.h b/src/aunit/FCString.h index 87747d2..1dc3cc4 100644 --- a/src/aunit/FCString.h +++ b/src/aunit/FCString.h @@ -30,6 +30,7 @@ SOFTWARE. class __FlashStringHelper; namespace aunit { +namespace internal { /** * A union of (const char*) and (const __FlashStringHelper*) with a @@ -79,6 +80,7 @@ class FCString { uint8_t mStringType; }; +} } #endif diff --git a/src/aunit/Flash.h b/src/aunit/Flash.h index c9245e8..7148b53 100644 --- a/src/aunit/Flash.h +++ b/src/aunit/Flash.h @@ -58,13 +58,17 @@ class __FlashStringHelper; #ifdef ESP8266 #define AUNIT_F(x) (x) namespace aunit { + namespace internal { typedef const char* FlashStringType; } + } #else #define AUNIT_F(x) F(x) namespace aunit { + namespace internal { typedef const __FlashStringHelper* FlashStringType; } + } #endif #endif diff --git a/src/aunit/Printer.cpp b/src/aunit/Printer.cpp index 5909206..b61115b 100644 --- a/src/aunit/Printer.cpp +++ b/src/aunit/Printer.cpp @@ -30,16 +30,16 @@ namespace aunit { Print* Printer::sPrinter = &Serial; -void Printer::print(const FCString& s) { - if (s.getType() == FCString::kCStringType) { +void Printer::print(const internal::FCString& s) { + if (s.getType() == internal::FCString::kCStringType) { getPrinter()->print(s.getCString()); } else { getPrinter()->print(s.getFString()); } } -void Printer::println(const FCString& s) { - if (s.getType() == FCString::kCStringType) { +void Printer::println(const internal::FCString& s) { + if (s.getType() == internal::FCString::kCStringType) { getPrinter()->println(s.getCString()); } else { getPrinter()->println(s.getFString()); diff --git a/src/aunit/Printer.h b/src/aunit/Printer.h index 6ce3365..07d4f79 100644 --- a/src/aunit/Printer.h +++ b/src/aunit/Printer.h @@ -29,7 +29,9 @@ class Print; namespace aunit { +namespace internal { class FCString; +} /** * Utility class that provides a level of indirection to the Print class where @@ -53,10 +55,10 @@ class Printer { static void setPrinter(Print* printer) { sPrinter = printer; } /** Convenience method for printing an FCString. */ - static void print(const FCString& s); + static void print(const internal::FCString& s); /** Convenience method for printing an FCString. */ - static void println(const FCString& s); + static void println(const internal::FCString& s); private: // Disable copy-constructor and assignment operator diff --git a/src/aunit/Test.cpp b/src/aunit/Test.cpp index 406ff74..91241ac 100644 --- a/src/aunit/Test.cpp +++ b/src/aunit/Test.cpp @@ -31,9 +31,6 @@ SOFTWARE. namespace aunit { -static const char TEST_STRING[] PROGMEM = "Test "; -static const __FlashStringHelper* TEST_STRING_F = FPSTR(TEST_STRING); - // Use a static variable inside a function to solve the static initialization // ordering problem. Test** Test::getRoot() { @@ -74,27 +71,29 @@ void Test::insert() { } void Test::resolve() { + static const __FlashStringHelper* TEST_STRING = F("Test "); + if (!isVerbosity(Verbosity::kTestAll)) return; Print* printer = Printer::getPrinter(); if (mStatus == Test::kStatusPassed && isVerbosity(Verbosity::kTestPassed)) { - printer->print(TEST_STRING_F); + printer->print(TEST_STRING); Printer::print(mName); printer->println(F(" passed.")); } else if (mStatus == Test::kStatusFailed && isVerbosity(Verbosity::kTestFailed)) { - printer->print(TEST_STRING_F); + printer->print(TEST_STRING); Printer::print(mName); printer->println(F(" failed.")); } else if (mStatus == Test::kStatusSkipped && isVerbosity(Verbosity::kTestSkipped)) { - printer->print(TEST_STRING_F); + printer->print(TEST_STRING); Printer::print(mName); printer->println(F(" skipped.")); } else if (mStatus == Test::kStatusExpired && isVerbosity(Verbosity::kTestExpired)) { - printer->print(TEST_STRING_F); + printer->print(TEST_STRING); Printer::print(mName); printer->println(F(" timed out.")); } diff --git a/src/aunit/Test.h b/src/aunit/Test.h index 71f1c82..72fe599 100644 --- a/src/aunit/Test.h +++ b/src/aunit/Test.h @@ -47,13 +47,11 @@ class Test { // from client code. The state transition diagram looks like this: // // include()/exclude() - // ---------------------> Excluded -----------| - // / v + // |---------------------> Excluded -----------| + // v v // New Finished -> (out of list) // \ setup() assertion() teardown() ^ // -----------> Setup ----> Asserted ---------| - // - // The following are life cycle states, not readily visible to the user. /** Test is new, needs to be setup. */ static const uint8_t kLifeCycleNew = 0; @@ -157,7 +155,7 @@ class Test { void resolve(); /** Get the name of the test. */ - const FCString& getName() { return mName; } + const internal::FCString& getName() { return mName; } /** Get the life cycle state of the test. */ uint8_t getLifeCycle() { return mLifeCycle; } @@ -244,7 +242,7 @@ class Test { void pass() { setStatus(kStatusPassed); } void init(const char* name) { - mName = FCString(name); + mName = internal::FCString(name); mLifeCycle = kLifeCycleNew; mStatus = kStatusUnknown; mVerbosity = 0; @@ -252,7 +250,7 @@ class Test { } void init(const __FlashStringHelper* name) { - mName = FCString(name); + mName = internal::FCString(name); mLifeCycle = kLifeCycleNew; mStatus = kStatusUnknown; mVerbosity = 0; @@ -273,7 +271,7 @@ class Test { /** Insert into the linked list. */ void insert(); - FCString mName; + internal::FCString mName; uint8_t mLifeCycle; uint8_t mStatus; uint8_t mVerbosity; diff --git a/tests/AUnitTest/AUnitTest.ino b/tests/AUnitTest/AUnitTest.ino index 1f9ed1a..cf3ebcc 100644 --- a/tests/AUnitTest/AUnitTest.ino +++ b/tests/AUnitTest/AUnitTest.ino @@ -25,6 +25,7 @@ SOFTWARE. #include #include "AUnitTest.h" +using namespace aunit::internal; signed char sc = 4; signed char sd = 5; @@ -54,6 +55,7 @@ const __FlashStringHelper* hh = FPSTR(HH_PROGMEM); // ------------------------------------------------------ test(type_mismatch) { + FCString fcString("abc"); unsigned short ushortValue = 5; unsigned int uintValue = 5; unsigned long ulongValue = 5; From e2ed0a79fd00b901c9f7f9e7e823f3ccfaf5c794 Mon Sep 17 00:00:00 2001 From: Brian Park Date: Sat, 14 Apr 2018 10:03:46 -0700 Subject: [PATCH 10/15] Minor fixes to keywords.txt --- keywords.txt | 5 +++-- src/aunit/TestOnce.cpp | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/keywords.txt b/keywords.txt index 44ac9f0..2de977b 100644 --- a/keywords.txt +++ b/keywords.txt @@ -67,7 +67,7 @@ getVerbosity KEYWORD2 once KEYWORD2 # TestAgain.h -once KEYWORD2 +again KEYWORD2 # Public macros from Assertion.h assertEqual KEYWORD2 @@ -127,6 +127,7 @@ compareString KEYWORD2 compareStringN KEYWORD2 compareEqual KEYWORD2 compareLess KEYWORD2 +compareMore KEYWORD2 compareLessOrEqual KEYWORD2 compareMoreOrEqual KEYWORD2 compareNotEqual KEYWORD2 @@ -154,7 +155,7 @@ kAll LITERAL1 kNone LITERAL1 # public constants from Test.h -kStatusNew LITERAL1 +kStatusUnknown LITERAL1 kStatusSetup LITERAL1 kStatusPassed LITERAL1 kStatusFailed LITERAL1 diff --git a/src/aunit/TestOnce.cpp b/src/aunit/TestOnce.cpp index 4a98c66..ef9a0ec 100644 --- a/src/aunit/TestOnce.cpp +++ b/src/aunit/TestOnce.cpp @@ -28,7 +28,7 @@ namespace aunit { void TestOnce::loop() { once(); - if (getStatus() == kStatusUnknown) { + if (isNotDone()) { pass(); } } From eac8eab602103872b8598fe11e0ddb83c6f3b6b9 Mon Sep 17 00:00:00 2001 From: Brian Park Date: Wed, 18 Apr 2018 10:05:27 -0700 Subject: [PATCH 11/15] TestRunner.cpp: Avoid floating math in resolveRun(), saving 1400-1600 of flash memory and 12 bytes of static memory --- src/aunit/TestRunner.cpp | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/aunit/TestRunner.cpp b/src/aunit/TestRunner.cpp index a94d248..cce2afb 100644 --- a/src/aunit/TestRunner.cpp +++ b/src/aunit/TestRunner.cpp @@ -213,6 +213,25 @@ uint16_t TestRunner::countTests() { return count; } +namespace { + +/** + * Print the timeMillis as floating point seconds, without using floating point + * math. This is the equivalent of 'printer->print((float) timeMillis / 1000)', + * but saves 1400-1600 bytes of flash memory and 12 bytes of static memory. + */ +void printSeconds(Print* printer, unsigned long timeMillis) { + int s = timeMillis / 1000; + int ms = timeMillis % 1000; + printer->print(s); + printer->print('.'); + if (ms < 100) printer->print('0'); + if (ms < 10) printer->print('0'); + printer->print(ms); +} + +} + void TestRunner::printStartRunner() { if (!isVerbosity(Verbosity::kTestRunSummary)) return; @@ -228,7 +247,7 @@ void TestRunner::resolveRun() { unsigned long elapsedTime = mEndTime - mStartTime; printer->print(F("TestRunner duration: ")); - printer->print((float) elapsedTime / 1000); + printSeconds(printer, elapsedTime); printer->println(" seconds."); printer->print(F("TestRunner summary: ")); From 25dd67da23906e368124817b1f2b062b49fc6958 Mon Sep 17 00:00:00 2001 From: Brian Park Date: Wed, 25 Apr 2018 12:33:53 -0700 Subject: [PATCH 12/15] Remove support for F() macro for various test*() macros for ESP8266 because they break any user-supplied code which uses F() in an inline context --- src/aunit/TestMacros.h | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/aunit/TestMacros.h b/src/aunit/TestMacros.h index 3445056..a8066fe 100644 --- a/src/aunit/TestMacros.h +++ b/src/aunit/TestMacros.h @@ -28,8 +28,9 @@ SOFTWARE. /** * @file TestMacros.h * - * Various macros (test(), testing(), externTest(), externTesting()) are - * defined in this header. + * Various macros (test(), testF(), testing(), testingF(), externTest(), + * externTestF(), externTesting(), externTestingF()) are defined in this + * header. */ #ifndef AUNIT_TEST_MACROS_H @@ -37,16 +38,19 @@ SOFTWARE. #include #include // F() macro -#include "Flash.h" +#include "Flash.h" // AUNIT_F() macro #include "FCString.h" #include "TestOnce.h" #include "TestAgain.h" -// On the ESP8266 platform, The F() string cannot be placed in an inline +// On the ESP8266 platform, the F() string cannot be placed in an inline // context, because it interferes with other PROGMEM strings. See // https://github.com/esp8266/Arduino/issues/3369. The solution was to move the // constructor definition out from an inline function into a normal function -// defined outside of the class declaration.. +// defined outside of the class declaration. Unfortunately, if the user code +// has any other usage of F() in an inline context, those interfere with the +// F() used below. I have abandoned supporting the F() macro for these test*() +// macros on the ESP8266. /** Macro to define a test that will be run only once. */ #define test(name) struct test_ ## name : aunit::TestOnce {\ @@ -54,7 +58,7 @@ SOFTWARE. virtual void once() override;\ } test_ ## name ## _instance;\ test_ ## name :: test_ ## name() {\ - init(F(#name)); \ + init(AUNIT_F(#name)); \ }\ void test_ ## name :: once() @@ -68,7 +72,7 @@ void test_ ## name :: once() virtual void again() override;\ } test_ ## name ## _instance;\ test_ ## name :: test_ ## name() {\ - init(F(#name));\ + init(AUNIT_F(#name));\ }\ void test_ ## name :: again() @@ -106,7 +110,7 @@ struct testClass ## _ ## name : testClass {\ virtual void once() override;\ } testClass ## _ ## name ## _instance;\ testClass ## _ ## name :: testClass ## _ ## name() {\ - init(F(#testClass "_" #name));\ + init(AUNIT_F(#testClass "_" #name));\ }\ void testClass ## _ ## name :: once() @@ -121,7 +125,7 @@ struct testClass ## _ ## name : testClass {\ virtual void again() override;\ } testClass ## _ ## name ## _instance;\ testClass ## _ ## name :: testClass ## _ ## name() {\ - init(F(#testClass "_" #name));\ + init(AUNIT_F(#testClass "_" #name));\ }\ void testClass ## _ ## name :: again() From 12fba22b5186aa8475f145e855c7a237bc947da1 Mon Sep 17 00:00:00 2001 From: Brian Park Date: Wed, 25 Apr 2018 15:31:25 -0700 Subject: [PATCH 13/15] Extract meta assertion tests from tests/AUnitTest to tests/AUnitMetaTest, partly so that core AUnitTest can fit inside an Arduino Micro --- README.md | 23 +- .../AUnitMetaTest.h} | 35 +- tests/AUnitMetaTest/AUnitMetaTest.ino | 421 +++++++++++++++++ tests/AUnitMetaTest/ExternalTests.cpp | 66 +++ tests/AUnitTest/AUnitTest.ino | 445 ++++-------------- tests/AUnitTest/ExternalTests.cpp | 43 -- 6 files changed, 607 insertions(+), 426 deletions(-) rename tests/{AUnitTest/AUnitTest.h => AUnitMetaTest/AUnitMetaTest.h} (64%) create mode 100644 tests/AUnitMetaTest/AUnitMetaTest.ino create mode 100644 tests/AUnitMetaTest/ExternalTests.cpp delete mode 100644 tests/AUnitTest/ExternalTests.cpp diff --git a/README.md b/README.md index 881a09b..93ceb15 100644 --- a/README.md +++ b/README.md @@ -20,10 +20,9 @@ AUnit was created to solve 3 problems with ArduinoUnit: Arduino UNO, Nano) as explained in [ArduinoUnit#70](https://github.com/mmurdoch/arduinounit/issues/70). * ArduinoUnit does not compile on the ESP8266 platform (see - [ArduinoUni#68](https://github.com/mmurdoch/arduinounit/issues/68), - [ArduinoUni#57](https://github.com/mmurdoch/arduinounit/pull/57), - [ArduinoUni#55](https://github.com/mmurdoch/arduinounit/issues/55), - [ArduinoUni#54](https://github.com/mmurdoch/arduinounit/issues/54)). + [ArduinoUnit#68](https://github.com/mmurdoch/arduinounit/issues/68), + [ArduinoUnit#55](https://github.com/mmurdoch/arduinounit/issues/55), + [ArduinoUnit#54](https://github.com/mmurdoch/arduinounit/issues/54)). * ArduinoUnit does not provide an easy way to create tests using fixtures, equivalent to the `TEST_F()` macro in Google Test. @@ -141,8 +140,11 @@ The `examples/` directory has a number of examples: In the `tests/` directory: -* `AUnitTest` - the unit test for `AUnit` itself has a large number of examples +* `AUnitTest` - the unit test for core `AUnit` functions, +* `AUnitMetaTest` - the unit test for meta assertions and `extern*()` macros * `FilterTest` - manual tests for `include()` and `exclude()` filters +* `SetupAndTeardownTest` - tests to verify that `setup()` and `teardown()` are + called properly by the finite state machine ### Header and Namespace @@ -197,8 +199,8 @@ subclass derived from the base class indicated above. The `test()` and `testF()` macros place the code body into the `TestOnce::once()` method. The `testing()` and `testingF()` macros place the code body into the `TestAgain::again()` method. The name of the subclass is a concatenation of the string `"test_"` and -the `name` (for `test()` and `testing()`) the `classname` and the `name` (for -`testF()` and `testing()`). +the `name` for `test()` and `testing()`, or the concatenation of +`classname` + `"_"` + `name` for `testF()` and `testing()`. The argument to these macros are the name of the test case, and is used to generate a name for the subclass. (The name is available within the test code @@ -1122,17 +1124,18 @@ This library was developed and tested using: * [Teensyduino 1.41](https://www.pjrc.com/teensy/td_download.html) * [ESP8266 Arduino Core 2.4.1](https://arduino-esp8266.readthedocs.io/en/2.4.1/) -I used MacOS 10.13.3 for most of my development. +I used MacOS 10.13.3 and Ubuntu 17.10 for most of my development. The library has been verified to work on the following hardware: * Arduino Nano clone (16 MHz ATmega328P) * Arduino UNO R3 clone (16 MHz ATmega328P) * Arduino Pro Mini clone (16 MHz ATmega328P) +* Arduino Pro Micro clone (16 MHz ATmega32U4) * Teensy LC (48 MHz ARM Cortex-M0+) * Teensy 3.2 (72 MHz ARM Cortex-M4) -* NodeMCU 1.0 clone (ESP-12E module, 80MHz ESP8266) -* ESP-01 (ESP-01 module, 80MHz ESP8266) +* NodeMCU 1.0 clone (ESP-12E module, 80 MHz ESP8266) +* ESP-01 (ESP-01 module, 80 MHz ESP8266) ## License diff --git a/tests/AUnitTest/AUnitTest.h b/tests/AUnitMetaTest/AUnitMetaTest.h similarity index 64% rename from tests/AUnitTest/AUnitTest.h rename to tests/AUnitMetaTest/AUnitMetaTest.h index 3a08d23..72635bf 100644 --- a/tests/AUnitTest/AUnitTest.h +++ b/tests/AUnitMetaTest/AUnitMetaTest.h @@ -1,7 +1,7 @@ -#line 2 "AUnitTest.h" +#line 2 "AUnitMetaTest.h" -#ifndef AUNIT_AUNIT_TEST_H -#define AUNIT_AUNIT_TEST_H +#ifndef AUNIT_AUNIT_META_TEST_H +#define AUNIT_AUNIT_META_TEST_H // If ArduinoUnit is used, this unit test no longer fits in a 32kB // Arduino UNO or Nano. @@ -9,17 +9,6 @@ #if USE_AUNIT == 1 -#include // random() - -// AVR: -// AUnit.h: flash/static: 29186/1369 -// AUnitVerbose.h: flash/static: 37352/1373 (too big for ATmega328P) -// ESP8266: -// AUnit.h: flash/static: 276112/33476 -// AUnitVerbose.h: flash/static: 281464/36100 -// Teensy 3.2: -// AUnit.h: flash/static: 43328/5440 -// AUnitVerbose.h: flash/static: 49820/5440 #if defined(__AVR__) #include #else @@ -32,42 +21,40 @@ class CustomOnceFixture: public TestOnce { protected: virtual void setup() override { TestOnce::setup(); - n = random(6); + subject = 6; } virtual void teardown() override { TestOnce::teardown(); } - void assertCommon() { - assertLess(n, 6); + void assertCommon(int m) { + assertLess(m, subject); } void assertFailing() { assertEqual(1, 2); } - private: - int n; + int subject; }; class CustomAgainFixture: public TestAgain { protected: virtual void setup() override { TestAgain::setup(); - n = random(6); + subject = 6; } virtual void teardown() override { TestAgain::teardown(); } - void assertCommon() { - assertLess(n, 6); + void assertCommon(int m) { + assertLess(m, subject); } - private: - int n; + int subject; }; #else diff --git a/tests/AUnitMetaTest/AUnitMetaTest.ino b/tests/AUnitMetaTest/AUnitMetaTest.ino new file mode 100644 index 0000000..48c43ef --- /dev/null +++ b/tests/AUnitMetaTest/AUnitMetaTest.ino @@ -0,0 +1,421 @@ +#line 2 "AUnitMetaTest.ino" + +/* + * These tests examine the various "meta" assertion functions, in other words, + * statements about the status of other tests. They use the following + * macros: + * externTest() + * externTestF() + * externTesting() + * externTestingF() + * assertTest*() + * assertTest*F() + * checkTest*() + * checkTest*F() + * + * These tests were extracted from AUnitTest.ino because AUnitTest became too + * big to fit in an Arduino Micro (max flash: 28672). + */ + +#include "AUnitMetaTest.h" + +// ------------------------------------------------------------------------- +// Test externTest() and externTesting() macros and various meta assertions. +// ------------------------------------------------------------------------- + +externTest(external); + +testing(external_monitor) { + static unsigned long start = millis(); + + unsigned long now = millis(); + if (now - start > 1000) { + assertTestDone(external); + assertTrue(checkTestDone(external)); + + assertTestPass(external); + assertTrue(checkTestPass(external)); + + assertTestNotFail(external); + assertTrue(checkTestNotFail(external)); + + assertTestNotSkip(external); + assertTrue(checkTestNotSkip(external)); + + assertTestNotExpire(external); + assertTrue(checkTestNotExpire(external)); + + pass(); + } +} + +externTesting(slow_pass); + +testing(slow_pass_monitor) { + static unsigned long start = millis(); + + unsigned long now = millis(); + if (now - start < 1000) { + assertTestNotDone(slow_pass); + assertTrue(checkTestNotDone(slow_pass)); + + assertTestNotPass(slow_pass); + assertTrue(checkTestNotPass(slow_pass)); + + assertTestNotFail(slow_pass); + assertTrue(checkTestNotFail(slow_pass)); + + assertTestNotSkip(slow_pass); + assertTrue(checkTestNotSkip(slow_pass)); + + assertTestNotExpire(slow_pass); + assertTrue(checkTestNotExpire(slow_pass)); + } + if (now - start > 2000) { + assertTestDone(slow_pass); + assertTrue(checkTestDone(slow_pass)); + + assertTestPass(slow_pass); + assertTrue(checkTestPass(slow_pass)); + + assertTestNotFail(slow_pass); + assertTrue(checkTestNotFail(slow_pass)); + + assertTestNotSkip(slow_pass); + assertTrue(checkTestNotSkip(slow_pass)); + + assertTestNotExpire(slow_pass); + assertTrue(checkTestNotExpire(slow_pass)); + + pass(); + } +} + +externTesting(slow_fail); + +testing(slow_fail_monitor) { + static unsigned long start = millis(); + + unsigned long now = millis(); + if (now - start < 1000) { + assertTestNotDone(slow_fail); + assertTrue(checkTestNotDone(slow_fail)); + + assertTestNotPass(slow_fail); + assertTrue(checkTestNotPass(slow_fail)); + + assertTestNotFail(slow_fail); + assertTrue(checkTestNotFail(slow_fail)); + + assertTestNotSkip(slow_fail); + assertTrue(checkTestNotSkip(slow_fail)); + + assertTestNotExpire(slow_fail); + assertTrue(checkTestNotExpire(slow_fail)); + } + if (now - start > 2000) { + assertTestDone(slow_fail); + assertTrue(checkTestDone(slow_fail)); + + assertTestNotPass(slow_fail); + assertTrue(checkTestNotPass(slow_fail)); + + assertTestFail(slow_fail); + assertTrue(checkTestFail(slow_fail)); + + assertTestNotSkip(slow_fail); + assertTrue(checkTestNotSkip(slow_fail)); + + assertTestNotExpire(slow_fail); + assertTrue(checkTestNotExpire(slow_fail)); + + pass(); + } +} + +externTesting(slow_skip); + +testing(slow_skip_monitor) { + static unsigned long start = millis(); + + unsigned long now = millis(); + if (now - start < 1000) { + assertTestNotDone(slow_skip); + assertTrue(checkTestNotDone(slow_skip)); + + assertTestNotPass(slow_skip); + assertTrue(checkTestNotPass(slow_skip)); + + assertTestNotFail(slow_skip); + assertTrue(checkTestNotFail(slow_skip)); + + assertTestNotSkip(slow_skip); + assertTestNotExpire(slow_skip); + } + if (now - start > 2000) { + assertTestDone(slow_skip); + assertTrue(checkTestDone(slow_skip)); + + assertTestNotPass(slow_skip); + assertTrue(checkTestNotPass(slow_skip)); + + assertTestNotFail(slow_skip); + assertTrue(checkTestNotFail(slow_skip)); + + assertTestSkip(slow_skip); + assertTrue(checkTestSkip(slow_skip)); + + assertTestNotExpire(slow_skip); + pass(); + } +} + +#if USE_AUNIT == 1 +externTesting(slow_expire); + +testing(slow_expire_monitor) { + static unsigned long start = millis(); + + unsigned long now = millis(); + if (now - start < 1000) { + assertTestNotDone(slow_expire); + assertTrue(checkTestNotDone(slow_expire)); + + assertTestNotPass(slow_expire); + assertTrue(checkTestNotPass(slow_expire)); + + assertTestNotFail(slow_expire); + assertTrue(checkTestNotFail(slow_expire)); + + assertTestNotSkip(slow_expire); + assertTrue(checkTestNotSkip(slow_expire)); + + assertTestNotExpire(slow_expire); + } + if (now - start > 2000) { + assertTestDone(slow_expire); + assertTrue(checkTestDone(slow_expire)); + + assertTestNotPass(slow_expire); + assertTrue(checkTestNotPass(slow_expire)); + + assertTestNotFail(slow_expire); + assertTrue(checkTestNotFail(slow_expire)); + + assertTestNotSkip(slow_expire); + assertTrue(checkTestNotSkip(slow_expire)); + + assertTestExpire(slow_expire); + pass(); + } +} + +// ------------------------------------------------------------------------- +// Test externTestF() and externTestingF() macros and various meta assertions. +// ------------------------------------------------------------------------- + +externTestF(CustomOnceFixture, fixture_external); + +testing(fixture_external_monitor) { + // this will loop forever unless explicitly passed + assertTestDoneF(CustomOnceFixture, fixture_external); + pass(); +} + +externTestingF(CustomAgainFixture, fixture_slow_pass); + +testing(fixture_slow_pass_monitor) { + static unsigned long start = millis(); + + unsigned long now = millis(); + if (now - start < 1000) { + assertTestNotDoneF(CustomAgainFixture, fixture_slow_pass); + assertTrue(checkTestNotDoneF(CustomAgainFixture, fixture_slow_pass)); + + assertTestNotPassF(CustomAgainFixture, fixture_slow_pass); + assertTrue(checkTestNotPassF(CustomAgainFixture, fixture_slow_pass)); + + assertTestNotFailF(CustomAgainFixture, fixture_slow_pass); + assertTrue(checkTestNotFailF(CustomAgainFixture, fixture_slow_pass)); + + assertTestNotSkipF(CustomAgainFixture, fixture_slow_pass); + assertTrue(checkTestNotSkipF(CustomAgainFixture, fixture_slow_pass)); + + assertTestNotExpireF(CustomAgainFixture, fixture_slow_pass); + assertTrue(checkTestNotExpireF(CustomAgainFixture, fixture_slow_pass)); + } + if (now - start > 2000) { + assertTestDoneF(CustomAgainFixture, fixture_slow_pass); + assertTrue(checkTestDoneF(CustomAgainFixture, fixture_slow_pass)); + + assertTestPassF(CustomAgainFixture, fixture_slow_pass); + assertTrue(checkTestPassF(CustomAgainFixture, fixture_slow_pass)); + + assertTestNotFailF(CustomAgainFixture, fixture_slow_pass); + assertTrue(checkTestNotFailF(CustomAgainFixture, fixture_slow_pass)); + + assertTestNotSkipF(CustomAgainFixture, fixture_slow_pass); + assertTrue(checkTestNotSkipF(CustomAgainFixture, fixture_slow_pass)); + + assertTestNotExpireF(CustomAgainFixture, fixture_slow_pass); + assertTrue(checkTestNotExpireF(CustomAgainFixture, fixture_slow_pass)); + + pass(); + } +} + +externTestingF(CustomAgainFixture, fixture_slow_fail); + +testing(fixture_slow_fail_monitor) { + static unsigned long start = millis(); + + unsigned long now = millis(); + if (now - start < 1000) { + assertTestNotDoneF(CustomAgainFixture, fixture_slow_fail); + assertTrue(checkTestNotDoneF(CustomAgainFixture, fixture_slow_fail)); + + assertTestNotPassF(CustomAgainFixture, fixture_slow_fail); + assertTrue(checkTestNotPassF(CustomAgainFixture, fixture_slow_fail)); + + assertTestNotFailF(CustomAgainFixture, fixture_slow_fail); + assertTrue(checkTestNotFailF(CustomAgainFixture, fixture_slow_fail)); + + assertTestNotSkipF(CustomAgainFixture, fixture_slow_fail); + assertTrue(checkTestNotSkipF(CustomAgainFixture, fixture_slow_fail)); + + assertTestNotExpireF(CustomAgainFixture, fixture_slow_fail); + assertTrue(checkTestNotExpireF(CustomAgainFixture, fixture_slow_fail)); + } + if (now - start > 2000) { + assertTestDoneF(CustomAgainFixture, fixture_slow_fail); + assertTrue(checkTestDoneF(CustomAgainFixture, fixture_slow_fail)); + + assertTestNotPassF(CustomAgainFixture, fixture_slow_fail); + assertTrue(checkTestNotPassF(CustomAgainFixture, fixture_slow_fail)); + + assertTestFailF(CustomAgainFixture, fixture_slow_fail); + assertTrue(checkTestFailF(CustomAgainFixture, fixture_slow_fail)); + + assertTestNotSkipF(CustomAgainFixture, fixture_slow_fail); + assertTrue(checkTestNotSkipF(CustomAgainFixture, fixture_slow_fail)); + + assertTestNotExpireF(CustomAgainFixture, fixture_slow_fail); + assertTrue(checkTestNotExpireF(CustomAgainFixture, fixture_slow_fail)); + + pass(); + } +} + +externTestingF(CustomAgainFixture, fixture_slow_skip); + +testing(fixture_slow_skip_monitor) { + static unsigned long start = millis(); + + unsigned long now = millis(); + if (now - start < 1000) { + assertTestNotDoneF(CustomAgainFixture, fixture_slow_skip); + assertTrue(checkTestNotDoneF(CustomAgainFixture, fixture_slow_skip)); + + assertTestNotPassF(CustomAgainFixture, fixture_slow_skip); + assertTrue(checkTestNotPassF(CustomAgainFixture, fixture_slow_skip)); + + assertTestNotFailF(CustomAgainFixture, fixture_slow_skip); + assertTrue(checkTestNotFailF(CustomAgainFixture, fixture_slow_skip)); + + assertTestNotSkipF(CustomAgainFixture, fixture_slow_skip); + assertTestNotExpireF(CustomAgainFixture, fixture_slow_skip); + } + if (now - start > 2000) { + assertTestDoneF(CustomAgainFixture, fixture_slow_skip); + assertTrue(checkTestDoneF(CustomAgainFixture, fixture_slow_skip)); + + assertTestNotPassF(CustomAgainFixture, fixture_slow_skip); + assertTrue(checkTestNotPassF(CustomAgainFixture, fixture_slow_skip)); + + assertTestNotFailF(CustomAgainFixture, fixture_slow_skip); + assertTrue(checkTestNotFailF(CustomAgainFixture, fixture_slow_skip)); + + assertTestSkipF(CustomAgainFixture, fixture_slow_skip); + assertTrue(checkTestSkipF(CustomAgainFixture, fixture_slow_skip)); + + assertTestNotExpireF(CustomAgainFixture, fixture_slow_skip); + pass(); + } +} +externTestingF(CustomAgainFixture, fixture_slow_expire); + +testing(fixture_slow_expire_monitor) { + static unsigned long start = millis(); + + unsigned long now = millis(); + if (now - start < 1000) { + assertTestNotDoneF(CustomAgainFixture, fixture_slow_expire); + assertTrue(checkTestNotDoneF(CustomAgainFixture, fixture_slow_expire)); + + assertTestNotPassF(CustomAgainFixture, fixture_slow_expire); + assertTrue(checkTestNotPassF(CustomAgainFixture, fixture_slow_expire)); + + assertTestNotFailF(CustomAgainFixture, fixture_slow_expire); + assertTrue(checkTestNotFailF(CustomAgainFixture, fixture_slow_expire)); + + assertTestNotSkipF(CustomAgainFixture, fixture_slow_expire); + assertTrue(checkTestNotSkipF(CustomAgainFixture, fixture_slow_expire)); + + assertTestNotExpireF(CustomAgainFixture, fixture_slow_expire); + } + if (now - start > 2000) { + assertTestDoneF(CustomAgainFixture, fixture_slow_expire); + assertTrue(checkTestDoneF(CustomAgainFixture, fixture_slow_expire)); + + assertTestNotPassF(CustomAgainFixture, fixture_slow_expire); + assertTrue(checkTestNotPassF(CustomAgainFixture, fixture_slow_expire)); + + assertTestNotFailF(CustomAgainFixture, fixture_slow_expire); + assertTrue(checkTestNotFailF(CustomAgainFixture, fixture_slow_expire)); + + assertTestNotSkipF(CustomAgainFixture, fixture_slow_expire); + assertTrue(checkTestNotSkipF(CustomAgainFixture, fixture_slow_expire)); + + assertTestExpireF(CustomAgainFixture, fixture_slow_expire); + pass(); + } +} + +#endif + +// ------------------------------------------------------ +// The main body. +// ------------------------------------------------------ + +void setup() { + delay(1000); // Wait for stability on some boards, otherwise garage on Serial + Serial.begin(115200); // ESP8266 default of 74880 not supported on Linux + while (! Serial); // Wait until Serial is ready - Leonardo/Micro + +#if USE_AUNIT == 1 + // These are useful for debugging. + //TestRunner::setVerbosity(Verbosity::kAll); + //TestRunner::setVerbosity(Verbosity::kTestRunSummary); + //TestRunner::list(); + + // If set to 0, meaning infinite timeout, some testing() may accidentally run + // forever. Default is 10s, let's set it to 5s to verify that it can be + // changed. + TestRunner::setTimeout(5); +#else + //Test::min_verbosity = TEST_VERBOSITY_ALL; +#endif +} + +void loop() { +#if USE_AUNIT == 1 + // Should get something like: + // TestRunner summary: + // 14 passed, 2 failed, 2 skipped, 2 timed out, out of 20 test(s). + TestRunner::run(); +#else + // Should get something like: + // Test summary: 6 passed, 1 failed, and 1 skipped, out of 8 test(s). + Test::run(); +#endif +} diff --git a/tests/AUnitMetaTest/ExternalTests.cpp b/tests/AUnitMetaTest/ExternalTests.cpp new file mode 100644 index 0000000..3abef6a --- /dev/null +++ b/tests/AUnitMetaTest/ExternalTests.cpp @@ -0,0 +1,66 @@ +#line 2 "ExternalTests.cpp" + +/* + * Define a bunch of tests in a file outside of AUnitTest to verify that + * externTest(), externTesting(), externTestF() and externTestingF() work as + * expected. + */ + +#include +#include "AUnitMetaTest.h" + +test(external) {} + +testing(slow_pass) { + static unsigned long start = millis(); + if (millis() - start > 1000) pass(); +} + +testing(slow_fail) { + static unsigned long start = millis(); + if (millis() - start > 1000) fail(); +} + +testing(slow_skip) { + static unsigned long start = millis(); + if (millis() - start > 1000) skip(); +} + +#if USE_AUNIT == 1 +testing(slow_expire) { + static unsigned long start = millis(); + if (millis() - start > 1000) expire(); +} +#endif + +#if USE_AUNIT == 1 + +// These are external slow tests using AUnit's testF() and testingF() macro. + +testF(CustomOnceFixture, fixture_external) {} + +testingF(CustomAgainFixture, fixture_slow_pass) { + static unsigned long start = millis(); + assertCommon(5); + if (millis() - start > 1000) pass(); +} + +testingF(CustomAgainFixture, fixture_slow_fail) { + static unsigned long start = millis(); + assertCommon(5); + if (millis() - start > 1000) fail(); +} + +testingF(CustomAgainFixture, fixture_slow_skip) { + static unsigned long start = millis(); + assertCommon(5); + if (millis() - start > 1000) skip(); +} + +testingF(CustomAgainFixture, fixture_slow_expire) { + static unsigned long start = millis(); + assertCommon(5); + if (millis() - start > 1000) expire(); +} + +#endif diff --git a/tests/AUnitTest/AUnitTest.ino b/tests/AUnitTest/AUnitTest.ino index cf3ebcc..7bf72b3 100644 --- a/tests/AUnitTest/AUnitTest.ino +++ b/tests/AUnitTest/AUnitTest.ino @@ -23,9 +23,37 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +// Core AUnit features are tested here. Meta assertion tests have been moved to +// MetaAssertionTest because they make this sketch no longer fit in a Arduino +// Micro (ATmega32U4, max flash: 28672). + +// If ArduinoUnit is used, this unit test no longer fits in a 32kB +// Arduino UNO or Nano. +#define USE_AUNIT 1 + #include -#include "AUnitTest.h" -using namespace aunit::internal; + +#if USE_AUNIT == 1 + + #if defined(__AVR__) + #include + #else + #include + #endif + using namespace aunit; + using namespace aunit::internal; + +#else + + #include + + // Defined in ESP8266, not defined in AVR or Teensy + #ifndef FPSTR + #define FPSTR(pstr_pointer) \ + (reinterpret_cast(pstr_pointer)) + #endif + +#endif signed char sc = 4; signed char sd = 5; @@ -55,7 +83,6 @@ const __FlashStringHelper* hh = FPSTR(HH_PROGMEM); // ------------------------------------------------------ test(type_mismatch) { - FCString fcString("abc"); unsigned short ushortValue = 5; unsigned int uintValue = 5; unsigned long ulongValue = 5; @@ -302,6 +329,7 @@ test(assertTrue) { assertFalse(false); } +#if USE_AUNIT == 1 test(verbosity_assertionFailed_only) { enableVerbosity(Verbosity::kAssertionPassed); disableVerbosity(Verbosity::kTestPassed); @@ -313,6 +341,7 @@ test(verbosity_testFailed_only) { disableVerbosity(Verbosity::kAssertionFailed); assertTrue(false); } +#endif test(flashString) { assertEqual(ff, ff); @@ -345,210 +374,66 @@ testing(timeout_after_10_seconds) { } } -// ------------------------------------------------------ -// Test externTesting() macro and meta assertions. -// ------------------------------------------------------ - -externTesting(slow_pass); -externTesting(slow_fail); -externTesting(slow_skip); #if USE_AUNIT == 1 -externTesting(slow_expire); -#endif - -testing(slow_pass_monitor) { - unsigned long now = millis(); - if (now < 1000) { - assertTestNotDone(slow_pass); - assertTrue(checkTestNotDone(slow_pass)); - - assertTestNotPass(slow_pass); - assertTrue(checkTestNotPass(slow_pass)); - - assertTestNotFail(slow_pass); - assertTrue(checkTestNotFail(slow_pass)); - - assertTestNotSkip(slow_pass); - assertTrue(checkTestNotSkip(slow_pass)); - - assertTestNotExpire(slow_pass); - assertTrue(checkTestNotExpire(slow_pass)); - } - if (now > 2000) { - assertTestDone(slow_pass); - assertTrue(checkTestDone(slow_pass)); - assertTestPass(slow_pass); - assertTrue(checkTestPass(slow_pass)); - - assertTestNotFail(slow_pass); - assertTrue(checkTestNotFail(slow_pass)); - - assertTestNotSkip(slow_pass); - assertTrue(checkTestNotSkip(slow_pass)); - - assertTestNotExpire(slow_pass); - assertTrue(checkTestNotExpire(slow_pass)); - - pass(); - } -} - -testing(slow_fail_monitor) { - unsigned long now = millis(); - if (now < 1000) { - assertTestNotDone(slow_fail); - assertTrue(checkTestNotDone(slow_fail)); - - assertTestNotPass(slow_fail); - assertTrue(checkTestNotPass(slow_fail)); - - assertTestNotFail(slow_fail); - assertTrue(checkTestNotFail(slow_fail)); - - assertTestNotSkip(slow_fail); - assertTrue(checkTestNotSkip(slow_fail)); - - assertTestNotExpire(slow_fail); - assertTrue(checkTestNotExpire(slow_fail)); - } - if (now > 2000) { - assertTestDone(slow_fail); - assertTrue(checkTestDone(slow_fail)); - - assertTestNotPass(slow_fail); - assertTrue(checkTestNotPass(slow_fail)); - - assertTestFail(slow_fail); - assertTrue(checkTestFail(slow_fail)); - - assertTestNotSkip(slow_fail); - assertTrue(checkTestNotSkip(slow_fail)); - - assertTestNotExpire(slow_fail); - assertTrue(checkTestNotExpire(slow_fail)); - - pass(); - } -} - -testing(slow_skip_monitor) { - unsigned long now = millis(); - if (now < 1000) { - assertTestNotDone(slow_skip); - assertTrue(checkTestNotDone(slow_skip)); - - assertTestNotPass(slow_skip); - assertTrue(checkTestNotPass(slow_skip)); +// ------------------------------------------------------------------------- +// Validate the testF() and testingF() macros. +// ------------------------------------------------------------------------- - assertTestNotFail(slow_skip); - assertTrue(checkTestNotFail(slow_skip)); +class CustomOnceFixture: public TestOnce { + protected: + virtual void setup() override { + TestOnce::setup(); + subject = 6; + } - assertTestNotSkip(slow_skip); - assertTestNotExpire(slow_skip); - } - if (now > 2000) { - assertTestDone(slow_skip); - assertTrue(checkTestDone(slow_skip)); + virtual void teardown() override { + TestOnce::teardown(); + } - assertTestNotPass(slow_skip); - assertTrue(checkTestNotPass(slow_skip)); + void assertCommon(int m) { + assertLess(m, subject); + } - assertTestNotFail(slow_skip); - assertTrue(checkTestNotFail(slow_skip)); + void assertFailing() { + assertEqual(1, 2); + } - assertTestSkip(slow_skip); - assertTrue(checkTestSkip(slow_skip)); + int subject; +}; - assertTestNotExpire(slow_skip); - pass(); - } +testF(CustomOnceFixture, common) { + assertCommon(5); + assertEqual(6, subject); } -#if USE_AUNIT == 1 -testing(slow_expire_monitor) { - unsigned long now = millis(); - if (now < 1000) { - assertTestNotDone(slow_expire); - assertTrue(checkTestNotDone(slow_expire)); - - assertTestNotPass(slow_expire); - assertTrue(checkTestNotPass(slow_expire)); - - assertTestNotFail(slow_expire); - assertTrue(checkTestNotFail(slow_expire)); - - assertTestNotSkip(slow_expire); - assertTrue(checkTestNotSkip(slow_expire)); - - assertTestNotExpire(slow_expire); - } - if (now > 2000) { - assertTestDone(slow_expire); - assertTrue(checkTestDone(slow_expire)); - - assertTestNotPass(slow_expire); - assertTrue(checkTestNotPass(slow_expire)); - - assertTestNotFail(slow_expire); - assertTrue(checkTestNotFail(slow_expire)); - - assertTestNotSkip(slow_expire); - assertTrue(checkTestNotSkip(slow_expire)); - - assertTestExpire(slow_expire); - pass(); - } +testF(CustomOnceFixture, failing) { + assertFailing(); + assertEqual(6, subject); // should bail out early because of prev failure + assertTrue(false); // this should not execute } -#endif - -#if USE_AUNIT == 0 -// ------------------------------------------------------------------------- -// Test creating custom parent classes manually as supported by ArduinoUnit, -// Unsupported in favor of testF() and testingF() in AUnit. -// ------------------------------------------------------------------------- - -class CustomTestOnce: public TestOnce { - public: - CustomTestOnce(const char *name): - TestOnce(name) { - } +class CustomAgainFixture: public TestAgain { protected: virtual void setup() override { - n = random(6); + TestAgain::setup(); + subject = 6; } - virtual void once() override { - assertLessOrEqual(n, 6); + virtual void teardown() override { + TestAgain::teardown(); } - private: - int n; -}; - -CustomTestOnce myTestOnce1("customTestOnce1"); -CustomTestOnce myTestOnce2("customTestOnce2"); - -#endif - -#if USE_AUNIT == 1 - -// ------------------------------------------------------------------------- -// Validate the testF() and testingF() macros. -// ------------------------------------------------------------------------- - -testF(CustomOnceFixture, customOnceFixture1) { - assertCommon(); -} + void assertCommon(int m) { + assertLess(m, subject); + } -testF(CustomOnceFixture, customOnceFixture2) { - assertFailing(); - assertTrue(false); // should bail out early because of prev failure -} + int subject; +}; -testingF(CustomAgainFixture, customAgainFixture) { - assertCommon(); +testingF(CustomAgainFixture, common) { + assertCommon(5); + assertEqual(6, subject); pass(); } @@ -572,166 +457,34 @@ testF(CustomAgainFixture, crossedAgain) { } #endif +#else + // ------------------------------------------------------------------------- -// Verify that externTestF() and externTestingF() work. +// Test creating custom parent classes manually as supported by ArduinoUnit, +// Not supported in AUnit. // ------------------------------------------------------------------------- -externTestF(CustomOnceFixture, fixture_external); - -testing(fixture_external_monitor) { - // this will loop forever unless explicitly passed - assertTestDoneF(CustomOnceFixture, fixture_external); - pass(); -} - -externTestingF(CustomAgainFixture, fixture_slow_pass); -externTestingF(CustomAgainFixture, fixture_slow_fail); -externTestingF(CustomAgainFixture, fixture_slow_skip); -externTestingF(CustomAgainFixture, fixture_slow_expire); - -testing(fixture_slow_pass_monitor) { - unsigned long now = millis(); - if (now < 1000) { - assertTestNotDoneF(CustomAgainFixture, fixture_slow_pass); - assertTrue(checkTestNotDoneF(CustomAgainFixture, fixture_slow_pass)); - - assertTestNotPassF(CustomAgainFixture, fixture_slow_pass); - assertTrue(checkTestNotPassF(CustomAgainFixture, fixture_slow_pass)); - - assertTestNotFailF(CustomAgainFixture, fixture_slow_pass); - assertTrue(checkTestNotFailF(CustomAgainFixture, fixture_slow_pass)); - - assertTestNotSkipF(CustomAgainFixture, fixture_slow_pass); - assertTrue(checkTestNotSkipF(CustomAgainFixture, fixture_slow_pass)); - - assertTestNotExpireF(CustomAgainFixture, fixture_slow_pass); - assertTrue(checkTestNotExpireF(CustomAgainFixture, fixture_slow_pass)); - } - if (now > 2000) { - assertTestDoneF(CustomAgainFixture, fixture_slow_pass); - assertTrue(checkTestDoneF(CustomAgainFixture, fixture_slow_pass)); - - assertTestPassF(CustomAgainFixture, fixture_slow_pass); - assertTrue(checkTestPassF(CustomAgainFixture, fixture_slow_pass)); - - assertTestNotFailF(CustomAgainFixture, fixture_slow_pass); - assertTrue(checkTestNotFailF(CustomAgainFixture, fixture_slow_pass)); - - assertTestNotSkipF(CustomAgainFixture, fixture_slow_pass); - assertTrue(checkTestNotSkipF(CustomAgainFixture, fixture_slow_pass)); - - assertTestNotExpireF(CustomAgainFixture, fixture_slow_pass); - assertTrue(checkTestNotExpireF(CustomAgainFixture, fixture_slow_pass)); - - pass(); - } -} - -testing(fixture_slow_fail_monitor) { - unsigned long now = millis(); - if (now < 1000) { - assertTestNotDoneF(CustomAgainFixture, fixture_slow_fail); - assertTrue(checkTestNotDoneF(CustomAgainFixture, fixture_slow_fail)); - - assertTestNotPassF(CustomAgainFixture, fixture_slow_fail); - assertTrue(checkTestNotPassF(CustomAgainFixture, fixture_slow_fail)); - - assertTestNotFailF(CustomAgainFixture, fixture_slow_fail); - assertTrue(checkTestNotFailF(CustomAgainFixture, fixture_slow_fail)); - - assertTestNotSkipF(CustomAgainFixture, fixture_slow_fail); - assertTrue(checkTestNotSkipF(CustomAgainFixture, fixture_slow_fail)); - - assertTestNotExpireF(CustomAgainFixture, fixture_slow_fail); - assertTrue(checkTestNotExpireF(CustomAgainFixture, fixture_slow_fail)); - } - if (now > 2000) { - assertTestDoneF(CustomAgainFixture, fixture_slow_fail); - assertTrue(checkTestDoneF(CustomAgainFixture, fixture_slow_fail)); - - assertTestNotPassF(CustomAgainFixture, fixture_slow_fail); - assertTrue(checkTestNotPassF(CustomAgainFixture, fixture_slow_fail)); - - assertTestFailF(CustomAgainFixture, fixture_slow_fail); - assertTrue(checkTestFailF(CustomAgainFixture, fixture_slow_fail)); - - assertTestNotSkipF(CustomAgainFixture, fixture_slow_fail); - assertTrue(checkTestNotSkipF(CustomAgainFixture, fixture_slow_fail)); - - assertTestNotExpireF(CustomAgainFixture, fixture_slow_fail); - assertTrue(checkTestNotExpireF(CustomAgainFixture, fixture_slow_fail)); - - pass(); - } -} - -testing(fixture_slow_skip_monitor) { - unsigned long now = millis(); - if (now < 1000) { - assertTestNotDoneF(CustomAgainFixture, fixture_slow_skip); - assertTrue(checkTestNotDoneF(CustomAgainFixture, fixture_slow_skip)); - - assertTestNotPassF(CustomAgainFixture, fixture_slow_skip); - assertTrue(checkTestNotPassF(CustomAgainFixture, fixture_slow_skip)); - - assertTestNotFailF(CustomAgainFixture, fixture_slow_skip); - assertTrue(checkTestNotFailF(CustomAgainFixture, fixture_slow_skip)); - - assertTestNotSkipF(CustomAgainFixture, fixture_slow_skip); - assertTestNotExpireF(CustomAgainFixture, fixture_slow_skip); - } - if (now > 2000) { - assertTestDoneF(CustomAgainFixture, fixture_slow_skip); - assertTrue(checkTestDoneF(CustomAgainFixture, fixture_slow_skip)); - - assertTestNotPassF(CustomAgainFixture, fixture_slow_skip); - assertTrue(checkTestNotPassF(CustomAgainFixture, fixture_slow_skip)); - - assertTestNotFailF(CustomAgainFixture, fixture_slow_skip); - assertTrue(checkTestNotFailF(CustomAgainFixture, fixture_slow_skip)); - - assertTestSkipF(CustomAgainFixture, fixture_slow_skip); - assertTrue(checkTestSkipF(CustomAgainFixture, fixture_slow_skip)); - - assertTestNotExpireF(CustomAgainFixture, fixture_slow_skip); - pass(); - } -} - -testing(fixture_slow_expire_monitor) { - unsigned long now = millis(); - if (now < 1000) { - assertTestNotDoneF(CustomAgainFixture, fixture_slow_expire); - assertTrue(checkTestNotDoneF(CustomAgainFixture, fixture_slow_expire)); - - assertTestNotPassF(CustomAgainFixture, fixture_slow_expire); - assertTrue(checkTestNotPassF(CustomAgainFixture, fixture_slow_expire)); - - assertTestNotFailF(CustomAgainFixture, fixture_slow_expire); - assertTrue(checkTestNotFailF(CustomAgainFixture, fixture_slow_expire)); - - assertTestNotSkipF(CustomAgainFixture, fixture_slow_expire); - assertTrue(checkTestNotSkipF(CustomAgainFixture, fixture_slow_expire)); - - assertTestNotExpireF(CustomAgainFixture, fixture_slow_expire); - } - if (now > 2000) { - assertTestDoneF(CustomAgainFixture, fixture_slow_expire); - assertTrue(checkTestDoneF(CustomAgainFixture, fixture_slow_expire)); +class CustomTestOnce: public TestOnce { + public: + CustomTestOnce(const char *name): + TestOnce(name) { + } - assertTestNotPassF(CustomAgainFixture, fixture_slow_expire); - assertTrue(checkTestNotPassF(CustomAgainFixture, fixture_slow_expire)); + protected: + virtual void setup() override { + n = 6; + } - assertTestNotFailF(CustomAgainFixture, fixture_slow_expire); - assertTrue(checkTestNotFailF(CustomAgainFixture, fixture_slow_expire)); + virtual void once() override { + assertLessOrEqual(5, 6); + } - assertTestNotSkipF(CustomAgainFixture, fixture_slow_expire); - assertTrue(checkTestNotSkipF(CustomAgainFixture, fixture_slow_expire)); + private: + int n; +}; - assertTestExpireF(CustomAgainFixture, fixture_slow_expire); - pass(); - } -} +CustomTestOnce myTestOnce1("customTestOnce1"); +CustomTestOnce myTestOnce2("customTestOnce2"); #endif @@ -749,16 +502,8 @@ void setup() { TestRunner::setVerbosity(Verbosity::kAll); //TestRunner::setVerbosity(Verbosity::kTestRunSummary); //TestRunner::list(); - - // If set to 0, infinite timeout, some testing() may accidentally run - // forever. Default is 10 s. - //TestRunner::setTimeout(25); - - TestRunner::exclude("looping_f*"); #else //Test::min_verbosity = TEST_VERBOSITY_ALL; - - Test::exclude("looping_f*"); #endif } @@ -766,9 +511,11 @@ void loop() { #if USE_AUNIT == 1 // Should get something like: // TestRunner summary: - // 27 passed, 4 failed, 2 skipped, 3 timed out, out of 36 test(s). + // 14 passed, 2 failed, 0 skipped, 1 timed out, out of 17 test(s). TestRunner::run(); #else + // Should get something like: + // Test summary: 12 passed, 0 failed, and 0 skipped, out of 12 test(s). Test::run(); #endif } diff --git a/tests/AUnitTest/ExternalTests.cpp b/tests/AUnitTest/ExternalTests.cpp deleted file mode 100644 index 6332e30..0000000 --- a/tests/AUnitTest/ExternalTests.cpp +++ /dev/null @@ -1,43 +0,0 @@ -#line 2 "ExternalTests.cpp" - -#include "AUnitTest.h" - -test(external) {} - -testing(slow_pass) { if (millis() > 1000) pass(); } - -testing(slow_fail) { if (millis() > 1000) fail(); } - -testing(slow_skip) { if (millis() > 1000) skip(); } - -#if USE_AUNIT == 1 -testing(slow_expire) { if (millis() > 1000) expire(); } -#endif - -#if USE_AUNIT == 1 - -// These are external slow tests using AUnit's testF() and testingF() macro. - -testF(CustomOnceFixture, fixture_external) {} - -testingF(CustomAgainFixture, fixture_slow_pass) { - assertCommon(); - if (millis() > 1000) pass(); -} - -testingF(CustomAgainFixture, fixture_slow_fail) { - assertCommon(); - if (millis() > 1000) fail(); -} - -testingF(CustomAgainFixture, fixture_slow_skip) { - assertCommon(); - if (millis() > 1000) skip(); -} - -testingF(CustomAgainFixture, fixture_slow_expire) { - assertCommon(); - if (millis() > 1000) expire(); -} - -#endif From 935a98fc40ebd1c73544a1df8a39acd8aff36e03 Mon Sep 17 00:00:00 2001 From: Brian Park Date: Wed, 25 Apr 2018 16:06:40 -0700 Subject: [PATCH 14/15] Bump version to 0.5.0 --- CHANGELOG.md | 6 ++++++ README.md | 2 +- docs/doxygen.cfg | 2 +- library.properties | 2 +- src/AUnit.h | 2 +- src/AUnitVerbose.h | 4 ++-- 6 files changed, 12 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 993ab2f..709fa0f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +* 0.5.0 (2018-04-25) + * Support verbose assertion messages using AUnitVerbose.h. Fixes #8. + * Better assertion messages for assertTrue() and assertFalse(). Fixes #17. + * Print duration of test runner at the end. Fixes #18. + * Extract meta assertion tests to tests/AUnitMetaTest, so that core + tests/AUnitTest can fit inside an Arduino Micro. * 0.4.2 (2018-04-10) * Fix FSM for excluded tests so that they bypass setup() and teardown(). * 0.4.1 (2018-04-06) diff --git a/README.md b/README.md index 93ceb15..f956561 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ A unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test. -Version: 0.4.2 (2018-04-10) +Version: 0.5.0 (2018-04-25) ## Summary diff --git a/docs/doxygen.cfg b/docs/doxygen.cfg index 45cee70..d9275a1 100644 --- a/docs/doxygen.cfg +++ b/docs/doxygen.cfg @@ -38,7 +38,7 @@ PROJECT_NAME = "AUnit" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 0.4.1 +PROJECT_NUMBER = 0.5.0 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff --git a/library.properties b/library.properties index 85c9f2b..84a8156 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=AUnit -version=0.4.2 +version=0.5.0 author=Brian T. Park maintainer=Brian T. Park sentence=A unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test. diff --git a/src/AUnit.h b/src/AUnit.h index 58a685a..25897bc 100644 --- a/src/AUnit.h +++ b/src/AUnit.h @@ -46,6 +46,6 @@ SOFTWARE. #include "aunit/TestMacros.h" // Version format: xxyyzz == "xx.yy.zz" -#define AUNIT_VERSION 000402 +#define AUNIT_VERSION 000500 #endif diff --git a/src/AUnitVerbose.h b/src/AUnitVerbose.h index cc79010..156f6a1 100644 --- a/src/AUnitVerbose.h +++ b/src/AUnitVerbose.h @@ -25,7 +25,7 @@ SOFTWARE. /** * @file AUnitVerbose.h * - * Same as AUnit.h except that the verbose versions of teh various assertXxx() + * Same as AUnit.h except that the verbose versions of the various assertXxx() * macros are provided. These capture the strings of the actual arguments in * the assert macros and print more verbose and helpful messages in the same * format used by ArduinoUnit. The cost is 20-25% increase in flash memory to @@ -49,6 +49,6 @@ SOFTWARE. #include "aunit/TestMacros.h" // Version format: xxyyzz == "xx.yy.zz" -#define AUNIT_VERSION 000402 +#define AUNIT_VERSION 000500 #endif From 5838293c116baaf9a57788b5539911000ee3e803 Mon Sep 17 00:00:00 2001 From: Brian Park Date: Wed, 25 Apr 2018 16:11:14 -0700 Subject: [PATCH 15/15] Update doxygen docs for 0.5.0 --- docs/html/AUnitVerbose_8h.html | 131 +++++ docs/html/AUnitVerbose_8h__incl.map | 16 + docs/html/AUnitVerbose_8h__incl.md5 | 1 + docs/html/AUnitVerbose_8h__incl.png | Bin 0 -> 123835 bytes docs/html/AUnitVerbose_8h_source.html | 82 +++ docs/html/AUnit_8h_source.html | 21 +- ...Assertion_8h.html => AssertMacros_8h.html} | 158 +++--- docs/html/AssertMacros_8h__dep__incl.map | 3 + docs/html/AssertMacros_8h__dep__incl.md5 | 1 + docs/html/AssertMacros_8h__dep__incl.png | Bin 0 -> 6273 bytes docs/html/AssertMacros_8h_source.html | 79 +++ docs/html/AssertVerboseMacros_8h.html | 446 +++++++++++++++ .../AssertVerboseMacros_8h__dep__incl.map | 3 + .../AssertVerboseMacros_8h__dep__incl.md5 | 1 + .../AssertVerboseMacros_8h__dep__incl.png | Bin 0 -> 6878 bytes docs/html/AssertVerboseMacros_8h_source.html | 79 +++ docs/html/Assertion_8cpp_source.html | 27 +- docs/html/Assertion_8h__dep__incl.map | 11 - docs/html/Assertion_8h__dep__incl.md5 | 1 - docs/html/Assertion_8h__dep__incl.png | Bin 71557 -> 0 bytes docs/html/Assertion_8h__incl.map | 5 - docs/html/Assertion_8h__incl.md5 | 1 - docs/html/Assertion_8h__incl.png | Bin 15752 -> 0 bytes docs/html/Assertion_8h_source.html | 24 +- docs/html/Compare_8cpp_source.html | 18 +- docs/html/Compare_8h_source.html | 17 +- docs/html/FCString_8h_source.html | 19 +- docs/html/Flash_8h.html | 136 +++++ docs/html/Flash_8h__dep__incl.map | 15 + docs/html/Flash_8h__dep__incl.md5 | 1 + docs/html/Flash_8h__dep__incl.png | Bin 0 -> 99863 bytes docs/html/Flash_8h__incl.map | 2 + docs/html/Flash_8h__incl.md5 | 1 + docs/html/Flash_8h__incl.png | Bin 0 -> 5163 bytes docs/html/Flash_8h_source.html | 80 +++ ...rtion_8h.html => MetaAssertMacros_8h.html} | 519 +++++++++--------- docs/html/MetaAssertMacros_8h__dep__incl.map | 4 + docs/html/MetaAssertMacros_8h__dep__incl.md5 | 1 + docs/html/MetaAssertMacros_8h__dep__incl.png | Bin 0 -> 9156 bytes docs/html/MetaAssertMacros_8h_source.html | 79 +++ docs/html/MetaAssertion_8cpp_source.html | 29 +- docs/html/MetaAssertion_8h__dep__incl.map | 9 - docs/html/MetaAssertion_8h__dep__incl.md5 | 1 - docs/html/MetaAssertion_8h__dep__incl.png | Bin 53702 -> 0 bytes docs/html/MetaAssertion_8h__incl.map | 7 - docs/html/MetaAssertion_8h__incl.md5 | 1 - docs/html/MetaAssertion_8h__incl.png | Bin 21126 -> 0 bytes docs/html/MetaAssertion_8h_source.html | 26 +- docs/html/Printer_8cpp_source.html | 23 +- docs/html/Printer_8h_source.html | 25 +- docs/html/TestAgain_8cpp_source.html | 15 +- docs/html/TestAgain_8h_source.html | 20 +- docs/html/TestMacro_8h__dep__incl.map | 3 - docs/html/TestMacro_8h__dep__incl.md5 | 1 - docs/html/TestMacro_8h__dep__incl.png | Bin 8030 -> 0 bytes docs/html/TestMacro_8h__incl.map | 10 - docs/html/TestMacro_8h__incl.md5 | 1 - docs/html/TestMacro_8h__incl.png | Bin 58848 -> 0 bytes docs/html/TestMacro_8h_source.html | 82 --- .../{TestMacro_8h.html => TestMacros_8h.html} | 156 +++--- docs/html/TestMacros_8h__dep__incl.map | 4 + docs/html/TestMacros_8h__dep__incl.md5 | 1 + docs/html/TestMacros_8h__dep__incl.png | Bin 0 -> 9060 bytes docs/html/TestMacros_8h__incl.map | 11 + docs/html/TestMacros_8h__incl.md5 | 1 + docs/html/TestMacros_8h__incl.png | Bin 0 -> 61934 bytes docs/html/TestMacros_8h_source.html | 80 +++ docs/html/TestOnce_8cpp_source.html | 22 +- docs/html/TestOnce_8h_source.html | 20 +- docs/html/TestRunner_8cpp_source.html | 45 +- docs/html/TestRunner_8h_source.html | 34 +- docs/html/Test_8cpp_source.html | 45 +- docs/html/Test_8h_source.html | 92 ++-- docs/html/Verbosity_8h_source.html | 17 +- docs/html/annotated.html | 34 +- .../html/classaunit_1_1Assertion-members.html | 87 +-- docs/html/classaunit_1_1Assertion.html | 151 +++-- .../classaunit_1_1Assertion__coll__graph.map | 2 +- .../classaunit_1_1Assertion__coll__graph.png | Bin 3942 -> 2732 bytes ...lassaunit_1_1Assertion__inherit__graph.map | 8 +- ...lassaunit_1_1Assertion__inherit__graph.png | Bin 13317 -> 9837 bytes .../classaunit_1_1MetaAssertion-members.html | 91 +-- docs/html/classaunit_1_1MetaAssertion.html | 151 +++-- ...assaunit_1_1MetaAssertion__coll__graph.map | 4 +- ...assaunit_1_1MetaAssertion__coll__graph.png | Bin 7032 -> 5200 bytes ...aunit_1_1MetaAssertion__inherit__graph.map | 8 +- ...aunit_1_1MetaAssertion__inherit__graph.png | Bin 13217 -> 9839 bytes docs/html/classaunit_1_1Printer-members.html | 17 +- docs/html/classaunit_1_1Printer.html | 51 +- docs/html/classaunit_1_1Test-members.html | 67 +-- docs/html/classaunit_1_1Test.html | 358 ++++++++---- .../html/classaunit_1_1TestAgain-members.html | 91 +-- docs/html/classaunit_1_1TestAgain.html | 145 +++-- .../classaunit_1_1TestAgain__coll__graph.map | 6 +- .../classaunit_1_1TestAgain__coll__graph.png | Bin 9652 -> 6387 bytes ...lassaunit_1_1TestAgain__inherit__graph.map | 6 +- ...lassaunit_1_1TestAgain__inherit__graph.png | Bin 9652 -> 6387 bytes docs/html/classaunit_1_1TestOnce-members.html | 93 ++-- docs/html/classaunit_1_1TestOnce.html | 145 +++-- .../classaunit_1_1TestOnce__coll__graph.map | 6 +- .../classaunit_1_1TestOnce__coll__graph.png | Bin 9754 -> 6373 bytes ...classaunit_1_1TestOnce__inherit__graph.map | 6 +- ...classaunit_1_1TestOnce__inherit__graph.png | Bin 9754 -> 6373 bytes .../classaunit_1_1TestRunner-members.html | 13 +- docs/html/classaunit_1_1TestRunner.html | 43 +- .../classaunit_1_1Test__inherit__graph.map | 8 +- .../classaunit_1_1Test__inherit__graph.png | Bin 13288 -> 9822 bytes .../html/classaunit_1_1Verbosity-members.html | 13 +- docs/html/classaunit_1_1Verbosity.html | 15 +- ...unit_1_1internal_1_1FCString-members.html} | 39 +- ...> classaunit_1_1internal_1_1FCString.html} | 55 +- docs/html/classes.html | 15 +- docs/html/dir_000000_000001.html | 17 +- .../dir_68267d1309a1af8e8297ef4c3efbcdba.html | 25 +- ...r_68267d1309a1af8e8297ef4c3efbcdba_dep.map | 4 +- ...r_68267d1309a1af8e8297ef4c3efbcdba_dep.md5 | 2 +- ...r_68267d1309a1af8e8297ef4c3efbcdba_dep.png | Bin 3048 -> 2182 bytes .../dir_81cd3825682eb05918933587e078c005.html | 33 +- docs/html/doxygen.css | 2 +- docs/html/dynsections.js | 33 +- docs/html/files.html | 54 +- docs/html/functions.html | 46 +- docs/html/functions_func.html | 22 +- docs/html/functions_type.html | 13 +- docs/html/functions_vars.html | 37 +- docs/html/globals.html | 154 +++--- docs/html/globals_defs.html | 154 +++--- docs/html/graph_legend.html | 13 +- docs/html/graph_legend.png | Bin 25694 -> 18497 bytes docs/html/hierarchy.html | 17 +- docs/html/index.html | 13 +- docs/html/inherit_graph_0.map | 2 +- docs/html/inherit_graph_0.md5 | 2 +- docs/html/inherit_graph_0.png | Bin 1946 -> 1781 bytes docs/html/inherit_graph_1.map | 2 +- docs/html/inherit_graph_1.png | Bin 1538 -> 1067 bytes docs/html/inherit_graph_2.map | 10 +- docs/html/inherit_graph_2.png | Bin 10209 -> 6579 bytes docs/html/inherit_graph_3.map | 2 +- docs/html/inherit_graph_3.png | Bin 1934 -> 1268 bytes docs/html/inherit_graph_4.map | 2 +- docs/html/inherit_graph_4.png | Bin 2053 -> 1606 bytes docs/html/inherits.html | 35 +- docs/html/jquery.js | 48 +- docs/html/menu.js | 24 - docs/html/menudata.js | 23 - docs/html/search/all_0.html | 6 +- docs/html/search/all_0.js | 69 +-- docs/html/search/all_1.html | 6 +- docs/html/search/all_1.js | 40 +- docs/html/search/all_2.html | 6 +- docs/html/search/all_3.html | 6 +- docs/html/search/all_3.js | 8 +- docs/html/search/all_4.html | 6 +- docs/html/search/all_4.js | 3 +- docs/html/search/all_5.html | 6 +- docs/html/search/all_5.js | 3 +- docs/html/search/all_6.html | 6 +- docs/html/search/all_7.html | 6 +- docs/html/search/all_7.js | 8 +- docs/html/search/all_8.html | 6 +- docs/html/search/all_9.html | 6 +- docs/html/search/all_9.js | 2 +- docs/html/search/all_a.html | 6 +- docs/html/search/all_b.html | 6 +- docs/html/search/all_b.js | 4 +- docs/html/search/all_c.html | 6 +- docs/html/search/all_d.html | 6 +- docs/html/search/all_e.html | 6 +- docs/html/search/all_e.js | 10 +- docs/html/search/all_f.html | 6 +- docs/html/search/classes_0.html | 6 +- docs/html/search/classes_1.html | 6 +- docs/html/search/classes_1.js | 2 +- docs/html/search/classes_2.html | 6 +- docs/html/search/classes_3.html | 6 +- docs/html/search/classes_4.html | 6 +- docs/html/search/classes_5.html | 6 +- docs/html/search/defines_0.html | 6 +- docs/html/search/defines_0.js | 65 +-- docs/html/search/defines_1.html | 6 +- docs/html/search/defines_1.js | 40 +- docs/html/search/defines_2.html | 6 +- docs/html/search/defines_2.js | 8 +- docs/html/search/defines_3.html | 6 +- docs/html/search/defines_3.js | 8 +- docs/html/search/files_0.html | 6 +- docs/html/search/files_0.js | 4 +- docs/html/search/files_1.html | 6 +- docs/html/search/files_1.js | 2 +- docs/html/search/files_2.html | 6 +- docs/html/search/files_2.js | 2 +- docs/html/search/files_3.html | 26 + docs/html/search/files_3.js | 4 + docs/html/search/functions_0.html | 6 +- docs/html/search/functions_1.html | 6 +- docs/html/search/functions_2.html | 6 +- docs/html/search/functions_3.html | 6 +- docs/html/search/functions_4.html | 6 +- docs/html/search/functions_4.js | 3 +- docs/html/search/functions_5.html | 6 +- docs/html/search/functions_6.html | 6 +- docs/html/search/functions_7.html | 6 +- docs/html/search/functions_8.html | 6 +- docs/html/search/functions_9.html | 6 +- docs/html/search/functions_9.js | 4 +- docs/html/search/functions_a.html | 6 +- docs/html/search/functions_b.html | 6 +- docs/html/search/functions_c.html | 6 +- docs/html/search/pages_0.html | 6 +- docs/html/search/search.js | 25 +- docs/html/search/searchdata.js | 2 +- docs/html/search/typedefs_0.html | 6 +- docs/html/search/variables_0.html | 6 +- docs/html/search/variables_0.js | 8 +- docs/html/tabs.css | 2 +- 216 files changed, 3619 insertions(+), 2283 deletions(-) create mode 100644 docs/html/AUnitVerbose_8h.html create mode 100644 docs/html/AUnitVerbose_8h__incl.map create mode 100644 docs/html/AUnitVerbose_8h__incl.md5 create mode 100644 docs/html/AUnitVerbose_8h__incl.png create mode 100644 docs/html/AUnitVerbose_8h_source.html rename docs/html/{Assertion_8h.html => AssertMacros_8h.html} (61%) create mode 100644 docs/html/AssertMacros_8h__dep__incl.map create mode 100644 docs/html/AssertMacros_8h__dep__incl.md5 create mode 100644 docs/html/AssertMacros_8h__dep__incl.png create mode 100644 docs/html/AssertMacros_8h_source.html create mode 100644 docs/html/AssertVerboseMacros_8h.html create mode 100644 docs/html/AssertVerboseMacros_8h__dep__incl.map create mode 100644 docs/html/AssertVerboseMacros_8h__dep__incl.md5 create mode 100644 docs/html/AssertVerboseMacros_8h__dep__incl.png create mode 100644 docs/html/AssertVerboseMacros_8h_source.html delete mode 100644 docs/html/Assertion_8h__dep__incl.map delete mode 100644 docs/html/Assertion_8h__dep__incl.md5 delete mode 100644 docs/html/Assertion_8h__dep__incl.png delete mode 100644 docs/html/Assertion_8h__incl.map delete mode 100644 docs/html/Assertion_8h__incl.md5 delete mode 100644 docs/html/Assertion_8h__incl.png create mode 100644 docs/html/Flash_8h.html create mode 100644 docs/html/Flash_8h__dep__incl.map create mode 100644 docs/html/Flash_8h__dep__incl.md5 create mode 100644 docs/html/Flash_8h__dep__incl.png create mode 100644 docs/html/Flash_8h__incl.map create mode 100644 docs/html/Flash_8h__incl.md5 create mode 100644 docs/html/Flash_8h__incl.png create mode 100644 docs/html/Flash_8h_source.html rename docs/html/{MetaAssertion_8h.html => MetaAssertMacros_8h.html} (59%) create mode 100644 docs/html/MetaAssertMacros_8h__dep__incl.map create mode 100644 docs/html/MetaAssertMacros_8h__dep__incl.md5 create mode 100644 docs/html/MetaAssertMacros_8h__dep__incl.png create mode 100644 docs/html/MetaAssertMacros_8h_source.html delete mode 100644 docs/html/MetaAssertion_8h__dep__incl.map delete mode 100644 docs/html/MetaAssertion_8h__dep__incl.md5 delete mode 100644 docs/html/MetaAssertion_8h__dep__incl.png delete mode 100644 docs/html/MetaAssertion_8h__incl.map delete mode 100644 docs/html/MetaAssertion_8h__incl.md5 delete mode 100644 docs/html/MetaAssertion_8h__incl.png delete mode 100644 docs/html/TestMacro_8h__dep__incl.map delete mode 100644 docs/html/TestMacro_8h__dep__incl.md5 delete mode 100644 docs/html/TestMacro_8h__dep__incl.png delete mode 100644 docs/html/TestMacro_8h__incl.map delete mode 100644 docs/html/TestMacro_8h__incl.md5 delete mode 100644 docs/html/TestMacro_8h__incl.png delete mode 100644 docs/html/TestMacro_8h_source.html rename docs/html/{TestMacro_8h.html => TestMacros_8h.html} (56%) create mode 100644 docs/html/TestMacros_8h__dep__incl.map create mode 100644 docs/html/TestMacros_8h__dep__incl.md5 create mode 100644 docs/html/TestMacros_8h__dep__incl.png create mode 100644 docs/html/TestMacros_8h__incl.map create mode 100644 docs/html/TestMacros_8h__incl.md5 create mode 100644 docs/html/TestMacros_8h__incl.png create mode 100644 docs/html/TestMacros_8h_source.html rename docs/html/{classaunit_1_1FCString-members.html => classaunit_1_1internal_1_1FCString-members.html} (50%) rename docs/html/{classaunit_1_1FCString.html => classaunit_1_1internal_1_1FCString.html} (69%) create mode 100644 docs/html/search/files_3.html create mode 100644 docs/html/search/files_3.js diff --git a/docs/html/AUnitVerbose_8h.html b/docs/html/AUnitVerbose_8h.html new file mode 100644 index 0000000..5c2bc5e --- /dev/null +++ b/docs/html/AUnitVerbose_8h.html @@ -0,0 +1,131 @@ + + + + + + + +AUnit: /home/brian/dev/AUnit/src/AUnitVerbose.h File Reference + + + + + + + + + +
+
+ + + + + + +
+
AUnit +  0.5.0 +
+
Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
AUnitVerbose.h File Reference
+
+
+ +

Same as AUnit.h except that the verbose versions of the various assertXxx() macros are provided. +More...

+
#include "aunit/Verbosity.h"
+#include "aunit/Compare.h"
+#include "aunit/Printer.h"
+#include "aunit/Test.h"
+#include "aunit/Assertion.h"
+#include "aunit/MetaAssertion.h"
+#include "aunit/TestOnce.h"
+#include "aunit/TestAgain.h"
+#include "aunit/TestRunner.h"
+#include "aunit/AssertVerboseMacros.h"
+#include "aunit/MetaAssertMacros.h"
+#include "aunit/TestMacros.h"
+
+Include dependency graph for AUnitVerbose.h:
+
+
+ + + + + + + + + + + + + + + + +
+
+

Go to the source code of this file.

+ + + + +

+Macros

+#define AUNIT_VERSION   000500
 
+

Detailed Description

+

Same as AUnit.h except that the verbose versions of the various assertXxx() macros are provided.

+

These capture the strings of the actual arguments in the assert macros and print more verbose and helpful messages in the same format used by ArduinoUnit. The cost is 20-25% increase in flash memory to hold those strings for medium to large unit tests.

+ +

Definition in file AUnitVerbose.h.

+
+ + + + diff --git a/docs/html/AUnitVerbose_8h__incl.map b/docs/html/AUnitVerbose_8h__incl.map new file mode 100644 index 0000000..200ac13 --- /dev/null +++ b/docs/html/AUnitVerbose_8h__incl.map @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/docs/html/AUnitVerbose_8h__incl.md5 b/docs/html/AUnitVerbose_8h__incl.md5 new file mode 100644 index 0000000..6c37099 --- /dev/null +++ b/docs/html/AUnitVerbose_8h__incl.md5 @@ -0,0 +1 @@ +dd1d0ed32d54834939a1889af843be14 \ No newline at end of file diff --git a/docs/html/AUnitVerbose_8h__incl.png b/docs/html/AUnitVerbose_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..83e3d971867620f28bc6a44f71f38270f8bf262f GIT binary patch literal 123835 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 literal 0 HcmV?d00001 diff --git a/docs/html/AUnitVerbose_8h_source.html b/docs/html/AUnitVerbose_8h_source.html new file mode 100644 index 0000000..2b63065 --- /dev/null +++ b/docs/html/AUnitVerbose_8h_source.html @@ -0,0 +1,82 @@ + + + + + + + +AUnit: /home/brian/dev/AUnit/src/AUnitVerbose.h Source File + + + + + + + + + +

+
+
+
AUnitVerbose.h
+
+
+Go to the documentation of this file.
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
35 #ifndef AUNIT_AUNIT_VERBOSE_H
36 #define AUNIT_AUNIT_VERBOSE_H
37 
38 #include "aunit/Verbosity.h"
39 #include "aunit/Compare.h"
40 #include "aunit/Printer.h"
41 #include "aunit/Test.h"
42 #include "aunit/Assertion.h"
43 #include "aunit/MetaAssertion.h"
44 #include "aunit/TestOnce.h"
45 #include "aunit/TestAgain.h"
46 #include "aunit/TestRunner.h"
47 #include "aunit/AssertVerboseMacros.h" // verbose assertXxx() macros
48 #include "aunit/MetaAssertMacros.h"
49 #include "aunit/TestMacros.h"
50 
51 // Version format: xxyyzz == "xx.yy.zz"
52 #define AUNIT_VERSION 000500
53 
54 #endif
Various macros (test(), testF(), testing(), testingF(), externTest(), externTestF(), externTesting(), externTestingF()) are defined in this header.
+
Various assertTestXxx(), checkTestXxx(), assertTestXxxF() and checkTestXxxF() macros are defined in t...
+
Verbose versions of the macros in AssertMacros.h.
+
+ + + + diff --git a/docs/html/AUnit_8h_source.html b/docs/html/AUnit_8h_source.html index 2933e68..c4710ce 100644 --- a/docs/html/AUnit_8h_source.html +++ b/docs/html/AUnit_8h_source.html @@ -3,9 +3,9 @@ - + -AUnit: /Users/brian/dev/AUnit/src/AUnit.h Source File +AUnit: /home/brian/dev/AUnit/src/AUnit.h Source File @@ -22,7 +22,7 @@
AUnit -  0.4.1 +  0.5.0
Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
@@ -31,21 +31,18 @@ - + +
AUnit.h
-
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
32 #ifndef AUNIT_AUNIT_H
33 #define AUNIT_AUNIT_H
34 
35 #include "aunit/Verbosity.h"
36 #include "aunit/Compare.h"
37 #include "aunit/Printer.h"
38 #include "aunit/Test.h"
39 #include "aunit/Assertion.h"
40 #include "aunit/MetaAssertion.h"
41 #include "aunit/TestOnce.h"
42 #include "aunit/TestAgain.h"
43 #include "aunit/TestRunner.h"
44 #include "aunit/TestMacro.h"
45 
46 // Version format: xxyyzz == "xx.yy.zz"
47 #define AUNIT_VERSION 000401
48 
49 #endif
Various assertTestXxx() and checkTestXxx() macros are defined in this header.
-
Various macros (test(), testing(), externTest(), externTesting()) are defined in this header...
-
Various assertXxx() macros are defined in this header.
+
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
32 #ifndef AUNIT_AUNIT_H
33 #define AUNIT_AUNIT_H
34 
35 #include "aunit/Verbosity.h"
36 #include "aunit/Compare.h"
37 #include "aunit/Printer.h"
38 #include "aunit/Test.h"
39 #include "aunit/Assertion.h"
40 #include "aunit/MetaAssertion.h"
41 #include "aunit/TestOnce.h"
42 #include "aunit/TestAgain.h"
43 #include "aunit/TestRunner.h"
44 #include "aunit/AssertMacros.h" // terse assertXxx() macros
45 #include "aunit/MetaAssertMacros.h"
46 #include "aunit/TestMacros.h"
47 
48 // Version format: xxyyzz == "xx.yy.zz"
49 #define AUNIT_VERSION 000500
50 
51 #endif
Various macros (test(), testF(), testing(), testingF(), externTest(), externTestF(), externTesting(), externTestingF()) are defined in this header.
+
Various assertTestXxx(), checkTestXxx(), assertTestXxxF() and checkTestXxxF() macros are defined in t...
+
Various assertion macros (assertXxx()) are defined in this header.
diff --git a/docs/html/Assertion_8h.html b/docs/html/AssertMacros_8h.html similarity index 61% rename from docs/html/Assertion_8h.html rename to docs/html/AssertMacros_8h.html index ca429db..360ae41 100644 --- a/docs/html/Assertion_8h.html +++ b/docs/html/AssertMacros_8h.html @@ -3,9 +3,9 @@ - + -AUnit: /Users/brian/dev/AUnit/src/aunit/Assertion.h File Reference +AUnit: /home/brian/dev/AUnit/src/aunit/AssertMacros.h File Reference @@ -22,7 +22,7 @@
AUnit -  0.4.1 +  0.5.0
Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
@@ -31,21 +31,18 @@
- + +
-
Assertion.h File Reference
+
AssertMacros.h File Reference
-

Various assertXxx() macros are defined in this header. +

Various assertion macros (assertXxx()) are defined in this header. More...

-
#include "Test.h"
-
-Include dependency graph for Assertion.h:
-
-
- - - - - -
-
+
This graph shows which files directly or indirectly include this file:
-
- - - - - - - - - - +
+ +
-

Go to the source code of this file.

+

Go to the source code of this file.

- - - - -

-Classes

class  aunit::Assertion
 An Assertion class is a subclass of Test and provides various overloaded assertion() functions. More...
 
- + - + - + - + - + - + - + - + - - - + + + + + +

Macros

#define assertEqual(arg1, arg2)   assertOp(arg1,aunit::compareEqual,"==",arg2)
#define assertEqual(arg1, arg2)   assertOpInternal(arg1,aunit::internal::compareEqual,"==",arg2)
 Assert that arg1 is equal to arg2. More...
 
#define assertNotEqual(arg1, arg2)   assertOp(arg1,aunit::compareNotEqual,"!=",arg2)
#define assertNotEqual(arg1, arg2)   assertOpInternal(arg1,aunit::internal::compareNotEqual,"!=",arg2)
 Assert that arg1 is not equal to arg2. More...
 
#define assertLess(arg1, arg2)   assertOp(arg1,aunit::compareLess,"<",arg2)
#define assertLess(arg1, arg2)   assertOpInternal(arg1,aunit::internal::compareLess,"<",arg2)
 Assert that arg1 is less than arg2. More...
 
#define assertMore(arg1, arg2)   assertOp(arg1,aunit::compareMore,">",arg2)
#define assertMore(arg1, arg2)   assertOpInternal(arg1,aunit::internal::compareMore,">",arg2)
 Assert that arg1 is more than arg2. More...
 
#define assertLessOrEqual(arg1, arg2)   assertOp(arg1,aunit::compareLessOrEqual,"<=",arg2)
#define assertLessOrEqual(arg1, arg2)   assertOpInternal(arg1,aunit::internal::compareLessOrEqual,"<=",arg2)
 Assert that arg1 is less than or equal to arg2. More...
 
#define assertMoreOrEqual(arg1, arg2)   assertOp(arg1,aunit::compareMoreOrEqual,">=",arg2)
#define assertMoreOrEqual(arg1, arg2)   assertOpInternal(arg1,aunit::internal::compareMoreOrEqual,">=",arg2)
 Assert that arg1 is more than or equal to arg2. More...
 
#define assertTrue(arg)   assertEqual(arg,true)
#define assertTrue(arg)   assertBoolInternal(arg,true)
 Assert that arg is true. More...
 
#define assertFalse(arg)   assertEqual(arg,false)
#define assertFalse(arg)   assertBoolInternal(arg,false)
 Assert that arg is false. More...
 
#define assertOp(arg1, op, opName, arg2)
 Internal helper macro, shouldn't be called directly by users. More...
 
#define assertOpInternal(arg1, op, opName, arg2)
 Internal helper macro, shouldn't be called directly by users. More...
 
#define assertBoolInternal(arg, value)
 Internal helper macro, shouldn't be called directly by users. More...
 

Detailed Description

-

Various assertXxx() macros are defined in this header.

-

They all go through another helper macro called assertOp(), eventually calling one of the methods on the Assertion class.

+

Various assertion macros (assertXxx()) are defined in this header.

+

These macros can be used only in a subclass of TestOnce or TestAgain, which is true for all tests created by test(), testing(), testF() and testingF().

-

Definition in file Assertion.h.

+

Definition in file AssertMacros.h.

Macro Definition Documentation

+ +

◆ assertBoolInternal

+ +
+
+ + + + + + + + + + + + + + + + + + +
#define assertBoolInternal( arg,
 value 
)
+
+Value:
do {\
if (!assertionBool(__FILE__,__LINE__,(arg),(value)))\
return;\
} while (false)
+

Internal helper macro, shouldn't be called directly by users.

+ +

Definition at line 76 of file AssertMacros.h.

+ +
+

◆ assertEqual

@@ -170,14 +176,14 @@

assertOp(arg1,aunit::compareEqual,"==",arg2) +    assertOpInternal(arg1,aunit::internal::compareEqual,"==",arg2)

Assert that arg1 is equal to arg2.

-

Definition at line 42 of file Assertion.h.

+

Definition at line 40 of file AssertMacros.h.

@@ -192,14 +198,14 @@

  arg) -    assertEqual(arg,false) +    assertBoolInternal(arg,false)

Assert that arg is false.

-

Definition at line 66 of file Assertion.h.

+

Definition at line 67 of file AssertMacros.h.

@@ -224,14 +230,14 @@

assertOp(arg1,aunit::compareLess,"<",arg2) +    assertOpInternal(arg1,aunit::internal::compareLess,"<",arg2)

Assert that arg1 is less than arg2.

-

Definition at line 49 of file Assertion.h.

+

Definition at line 48 of file AssertMacros.h.

@@ -256,14 +262,14 @@

assertOp(arg1,aunit::compareLessOrEqual,"<=",arg2) +    assertOpInternal(arg1,aunit::internal::compareLessOrEqual,"<=",arg2)

Assert that arg1 is less than or equal to arg2.

-

Definition at line 55 of file Assertion.h.

+

Definition at line 56 of file AssertMacros.h.

@@ -288,14 +294,14 @@

assertOp(arg1,aunit::compareMore,">",arg2) +    assertOpInternal(arg1,aunit::internal::compareMore,">",arg2)

Assert that arg1 is more than arg2.

-

Definition at line 52 of file Assertion.h.

+

Definition at line 52 of file AssertMacros.h.

@@ -320,14 +326,14 @@

assertOp(arg1,aunit::compareMoreOrEqual,">=",arg2) +    assertOpInternal(arg1,aunit::internal::compareMoreOrEqual,">=",arg2)

Assert that arg1 is more than or equal to arg2.

-

Definition at line 59 of file Assertion.h.

+

Definition at line 60 of file AssertMacros.h.

@@ -352,25 +358,25 @@

assertOp(arg1,aunit::compareNotEqual,"!=",arg2) +    assertOpInternal(arg1,aunit::internal::compareNotEqual,"!=",arg2)

Assert that arg1 is not equal to arg2.

-

Definition at line 45 of file Assertion.h.

+

Definition at line 44 of file AssertMacros.h.

- -

◆ assertOp

+ +

◆ assertOpInternal

- + @@ -403,7 +409,7 @@

do {\
if (!assertion(__FILE__,__LINE__,(arg1),opName,op,(arg2)))\
return;\
} while (false)

Internal helper macro, shouldn't be called directly by users.

-

Definition at line 69 of file Assertion.h.

+

Definition at line 70 of file AssertMacros.h.

@@ -418,14 +424,14 @@

 

- +
#define assertOp#define assertOpInternal (   arg1, arg)   assertEqual(arg,true)   assertBoolInternal(arg,true)
@@ -434,7 +440,7 @@

diff --git a/docs/html/AssertMacros_8h__dep__incl.map b/docs/html/AssertMacros_8h__dep__incl.map new file mode 100644 index 0000000..fae0ffa --- /dev/null +++ b/docs/html/AssertMacros_8h__dep__incl.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/AssertMacros_8h__dep__incl.md5 b/docs/html/AssertMacros_8h__dep__incl.md5 new file mode 100644 index 0000000..3158f57 --- /dev/null +++ b/docs/html/AssertMacros_8h__dep__incl.md5 @@ -0,0 +1 @@ +667e788a00eceafed5bbaf80c0e290ac \ No newline at end of file diff --git a/docs/html/AssertMacros_8h__dep__incl.png b/docs/html/AssertMacros_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..af2b9da886bd939988e9b8532579467a4d95e4cf GIT binary patch literal 6273 zcmc&(g;!KxyB<(MLQ+a%1Q8@8rAtCWr5mKA8DRu5Mr@xJS1kHE5?+>2du2Yb` zd)J@l{h2l1^cHEuO0qF2UpGW}Nnc2Je`RpVr%$ZU4O)Zw#DA9sH-K4^gr39=k2t8o ze9q=3H5($x+~VpW+Ev!xorH=h?2=)0j!KfNq0s?~V-Ca3X*OI3` z4c;p&s1;Y#={4~E^OHTV`A8AB;TM>GHYgDh(RF-$QUjDpYiD=&yZroz0)m3>OzOU< z&6!40KR>_Zj$il1DLqY1nM{!zLMB3^wq-w-KG~);oozMBnD3n3nctkMeZa*fZ)L^0 zIawVL7Dkxd9s`B4$eEZVt4)jwiIaQ!_((lhRke8evN_hI+V#e>c%HV&>Q^q?zhw*R zva<T`Ttc>#NL40Wpd1h+$WM*%n5%eRQOxrA48Jk&gWR+Z+@RAD@Kb zH+E%t`LUxTH~7j%UR0wYhBw{e=qiG~5 zyLyUF)q0AACkdB+!8;5F>hJIGyuYl8z{JPX^d?ILlS&^y&Oq<(gx<8bw>PM8q?>-d z_7HVE8~lKqd%Xf`T;bT%;B!{>S}XhZR^1+n@5utqw6u+l&0MU$>D$aqb_Pbq=-Akd zHpkr~RbRuB*9Q)e@BTN4%EJ1g%LGQj!g!=50&&|(knwgP8 zLc+qDTY^c8oo1xhvE@YZJSNS4mwV97s=cK?%dP49o40N~0oyGpEhVR+36{B7QCC)0 zek?D44RZJX{TozNRAaTCylH7^&KIZdt?li*i!ssBZ>MTKEth(et57Eb6ciLyJ{%kz zH;IS>47eA6eojm*w(KCOs;*|{;2?mawsF$Z)2ojk$0sx#&k^OB*5BFL*_o6+IR=#g zD}B$=&3&Jc5OV)noU^yXYH($xNNkg3_BiIQ+~fpr@zr@9%%x-TgezuoN#{ z2^~~gDj3IW7Nwo3=F(Arwpq(3C>T&!$P2m4$43T=ogjr2hBybDw~)%1Z(z%dii_WZ zZ^+5ZN5{u^B&vIPi83%S{9arPisjPh%u|t1puL*!Rhva zQ{x5RmuHT?zP@~q9_dVUfS#S5Z3#}`x5R^(pYE?b;NSo(klkKAA5iF|PFaVZK|Y1S zxWvW9%`GfaH4t$4EeIbU-|wFeFc{c34ibqh=x%DlA%#l+slXsN#UO8@qoc8KI`D^9 z(5O^Dxw*N$_UHs{h>wo;`ee|bKi>(2TPv`T=j7&+Q&9!R#ZiljiDeH(A81O8EF2FH z4-@KNhd8^qtW-c-f^M~x*$+A&t{Z}LnAzF!XHa{QSlY+&$JWniyh}<-iclx6h}ukO zoz`e&W~6lZ*<4$A!Xx_+Ppj*)tR>IZOZfx@5*VAh$tnEU{(wQaLaytLwbHyb4N6 z={Y%s85tQN;o&WbP7UL0RnpSZV~u_?fY;C^B?69PML5~n*>xu<(3M$vd9C2t201mH z1Q{Q0_YVyCA0B$p($S^n=idUY0I3<7`>YWKB_n%tadvbMl(M|Myvl8bVs37(W&gGcyZOz$Pyl85xy{7sxCReyUARzjknNFnK?ZJArhXUhb$>6aD6A4 z=H_OI+rvnk?u561WSwF5?)*R~W>;1SxVX3iQSE3bDR_2P*4DDz)RsR!+y`yj0@zZ+ z#N-wX2J=E9VM3RnrU=n&Cr;+&?QO9$*XD2pA1kuZFnE9R%N7wZy_=)HW~a`b zbOGnuAZd`y&B@Vt@gh%SWNa)XSHJL3-ytAM*2#M~)4hzHy7#go)&t)xrLf_Y6YweE zV^`Ph-7elEZJPkndIQrwj0~EJOV4~H&+sM*$zp`&PwGL~Xu+)6-%}buTVwzN$r7HR zu%VSE(nL8xV!e%xi86&Nv>F;bE75(YIg&Od_&h)L20_M*epdPA2IYaoh*aSab0ZMHv&3Do!PwnA^l=6_>iVzRTh zpN(Vd>FEIg(>KtvzteJ0DatO1=!Bv5C4ZrNHTzy6F-EGUaCveUJ3dYTcv3k-ix?`+ zP-@%P?m6R=>3kSt_`EMkEC3YaJ3vBjZ!akMwaKZe;fe`Lq8zre;;ToJlf5++8O}yj zc%JZM!gYZk(4trA!s24{)D&Y}T-*yrRm+~=QJN8uQ zpuW~+wzT0VTGg{VNsJPCxZVU%J;bB(C^Ge1wMMUO%s(595J#5r{Hk6kudinW(}D?N^E=pm^!+;E&(rIyoey8;Q`J;A!91VK*QQLQVGqJ{b&4N&sEh& zL|Axn$`*kr=s)F@vHAS|p(-IE;rsab;KuU>Ucxh>f3IpdNSlzDnA>AKniiKz(*;vd zxUQBg9tc=_Xn45k*DsCyjDgWnn&RT(E2S_rqyw6*p{tuwVWLW{Gydh`cphzsKx_^w zVXUat;P8ykrv>&Hwzb@Ek_-HNeBXf^-8pLf%ZNZAIC*4MEwk)-KCblErot>*g0dN)6cqlUlP>=UuiZ82}#mHEU&sdXwB5Tyyw;`15>oSJvX4BX#&g3g#dAok(0kwiD6@AWd(%4 zIbMpdo+7#8E9V9&trJLbNLYyFXZ^=Q|J&vM$HA=6dG8UCCh^AdGFfV>#r3>ACQ>&} zf4M==zN`@Bz*iNot@@)eblz&hj9;aK`+=adGhfs8?7&+!CBCt-F=sV(Yn>Dgf&G?0 zKcJv{@YY67SOi=TA7={QHdlXe762RlscAaBuq}Z))<$i} zfBo8Syx*}hC{kqIrTJ$Op_gTAD}vh+bZ`>hNSni8lb*w_81<;5Gy3n@DIa}e0q<8g zxAhYz4}nuW<2b(m<@A4(`~Tm8-NnLQetv#uXXj%jC8eWSy3Rg7Vu&c}cpGB7yKio5 z8@w`@37dh~t2j7t;+PjQH4xtljxOHG!s(m0e;um80$)&3a8q6rtkl6C2)eDayVIWj z{#U+R)uwms=^^8OK1tlv-1^@K16y-Eyu2M@R9qm<;^95u;o01}J+!F(;sx=wYdtcy z57R~5k$226E<|swo{mi3{o1O*!NJ+Bt(h4MZxGvn=mG;{ z@qKQMMbXt&;3|3~CFSjT?apg!Y2gA_o!qfZj-6I`uA;&WC&5T~@|2gAk-1OFe+3={ zuKkOk1O~V(jH9E8>6tn^K{M>3tg+7zmn^fs zNi5Uaz;_I90>jy7%#kaJ#<5_k@wVfWU^^c6;eOcS} z0vXTC%j-M%0ONB=_u<2b-*a>R{S5+9L^I{H(v7pN-9R z0sx!fqBvL@=L?Vxa&lnH!aF-Uf;Xq@pWV1|_ny0QdFXhpR~}UN5Gme z;C%7kThs*kt*y0{4D$N?n4g?{W3oDC+ULlGlb1Ks-ye5(fB$Pp$jw-kl`XB4lT*#B zB@&Z5ujm&hCie5~k&_MMrMB8npAwqXzm8o)f`Cm&Pe1rGmTP6Y9{KU(M+HdMw{JmR zLVSGhQzX6RfZz~T|LFJ&e9n)Nk+^|@f#u7KvyaiyvS3CrJGXss@BaNj0HSJsDWDeP z6B98yoVpT=3JPGUbl?VASg>{8g7wF9;e==XErKFuGk^Lbvk76ukjyrWy`$ z13`m@Wp#c151u+p^m}F2w6)Q~SMGxY19s=fJCiOl7yFdt09CE32_|7obD3|?UXQ^P0TW*1zD6x1Bt%ZGsiqbshk|@ePRwZv_K-7ftkxgk!k+F3-M;1V`B-(05Ez8 zglK>q)?Bx*Gr4*yY|xs2Fn=^XFf?>MTZiz<$GU<*2GOYM*4NjU=ZtM`YYXI}3~$TI z%F+;1W2MNRiqkYTC6SPj2owNkPhYv-zKabIHqVZ>xE#4G9UUV;vbchAaWVPk<|e26 z(84!{zeh8E9bAQVY0i_+cNdg^qx1|6W?k)GFAFiw0vFkO2X}x?-tlXj+<@Qb%1j zHa0YMbgr}DlF$B#VXtzY#dVVQ+?<@f1U6jw>e<5GDIXXg6&P2NR99DnfkEL@Mxgx` zdQn^J>k+^wa}II*Gw6U6InT;n-CPG6+L2q>Kv-;$C#+~|%TB^5{*Jfd7&kI9a&oQE z?;^LkW}?5J{K=Cigw>OE-jwa_?X(gej+H+2kL-}WTN~Dvz^dyQ8fI(Y3B`+zdnha4 zJUKqrP*EYEqNW}Q=WS31A#v?cbYbJ6am6nXcUQnD$qkG!J`2O|jfuHfD+bl_d5`=ciC;Nkv6m z9JirdpVScpXdP`}`an8#M<(rhfb5@dTp6{#zP>zei^<4%7C!(+3Oc*ds?A_*pu$ZZ z6B&6c-=sDUi^V<)OUzosNC9BEdU$*TO-D#V!e(r2JUxk+s>z^eEG><>BD2qY7Py}h z69>V@SHN&_aV~33$k~c;OR>RodSS=AEG*eN zPk~Wp77-Bv!R;Om4b4?c3yFwuF$_|=Jj>AfEbh)}Xkd^P*%i#w3g7;#a&YICk((>v6Tg?2Lp0MBEmj6HvT}3h;WV^K9$M1I#lQOxchDp$ zcMs@yEBXK%3-I%&f}pOgt4qZw>ih--4-oZL+ORb~XCAxT+h3ZSIWBFiC5&XTO2Y_bS>O@}aQ3t5M-2z1J-$>USy0V_J6;*o)(n6J}ms^;wd4-B=?% zy>_v6tA!FjrrOe&JG8Xl2L~x3I&o}6eI8ow6?3U?ez)a2o;kwdPo6y^B4LsYSzUGD zHm)FUXlNjW*?XhCz>Hbn_h3~QbvSP8Fu~aEF_6mUK<7_$1i*epDuE>;Gbl=s5VHyj z+QB@{+|KSMB_(C7B@M4>gleL2YEcoH2x9Uv2=(k93m$!7?g^H7_wL>I$;l+-4Sf80 zFnT^d7&XIz0EKS(ECkyI@h!cq>^7Le7?jzO1Ei-32dDfR8|%Da1jESF)7SY}a)xVF zYy%P~y@{`1S+C#=!bWs$tpuZlM?{FuXc0(XWxf}$U7elp0(=8te*=J*g|jb6L^&ag znz;*sSpqLXcnMW>{(+&1%m)AW;Pjl)VBM37?)32?+{i~3=7MIDy2BEE^X=QWK5G6= y8XaH?cj{I*qW*v`LY4$6_k)b*Kft={ms_9v_{fPm7yM5FqVhydp+L^u|GxmeX&&ML literal 0 HcmV?d00001 diff --git a/docs/html/AssertMacros_8h_source.html b/docs/html/AssertMacros_8h_source.html new file mode 100644 index 0000000..f5efa20 --- /dev/null +++ b/docs/html/AssertMacros_8h_source.html @@ -0,0 +1,79 @@ + + + + + + + +AUnit: /home/brian/dev/AUnit/src/aunit/AssertMacros.h Source File + + + + + + + + + +
+
+ + + + + + +
+
AUnit +  0.5.0 +
+
Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
AssertMacros.h
+
+
+Go to the documentation of this file.
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
25 // Significant portions of the design and implementation of this file came from
26 // https://github.com/mmurdoch/arduinounit/blob/master/src/ArduinoUnit.h
27 
36 #ifndef AUNIT_ASSERT_MACROS_H
37 #define AUNIT_ASSERT_MACROS_H
38 
40 #define assertEqual(arg1,arg2) \
41  assertOpInternal(arg1,aunit::internal::compareEqual,"==",arg2)
42 
44 #define assertNotEqual(arg1,arg2) \
45  assertOpInternal(arg1,aunit::internal::compareNotEqual,"!=",arg2)
46 
48 #define assertLess(arg1,arg2) \
49  assertOpInternal(arg1,aunit::internal::compareLess,"<",arg2)
50 
52 #define assertMore(arg1,arg2) \
53  assertOpInternal(arg1,aunit::internal::compareMore,">",arg2)
54 
56 #define assertLessOrEqual(arg1,arg2) \
57  assertOpInternal(arg1,aunit::internal::compareLessOrEqual,"<=",arg2)
58 
60 #define assertMoreOrEqual(arg1,arg2) \
61  assertOpInternal(arg1,aunit::internal::compareMoreOrEqual,">=",arg2)
62 
64 #define assertTrue(arg) assertBoolInternal(arg,true)
65 
67 #define assertFalse(arg) assertBoolInternal(arg,false)
68 
70 #define assertOpInternal(arg1,op,opName,arg2) do {\
71  if (!assertion(__FILE__,__LINE__,(arg1),opName,op,(arg2)))\
72  return;\
73 } while (false)
74 
76 #define assertBoolInternal(arg,value) do {\
77  if (!assertionBool(__FILE__,__LINE__,(arg),(value)))\
78  return;\
79 } while (false)
80 
81 #endif
+ + + + diff --git a/docs/html/AssertVerboseMacros_8h.html b/docs/html/AssertVerboseMacros_8h.html new file mode 100644 index 0000000..0781ab5 --- /dev/null +++ b/docs/html/AssertVerboseMacros_8h.html @@ -0,0 +1,446 @@ + + + + + + + +AUnit: /home/brian/dev/AUnit/src/aunit/AssertVerboseMacros.h File Reference + + + + + + + + + +
+
+ + + + + + +
+
AUnit +  0.5.0 +
+
Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
AssertVerboseMacros.h File Reference
+
+
+ +

Verbose versions of the macros in AssertMacros.h. +More...

+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + +
+
+

Go to the source code of this file.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Macros

#define assertEqual(arg1, arg2)   assertOpVerboseInternal(arg1,aunit::internal::compareEqual,"==",arg2)
 Assert that arg1 is equal to arg2. More...
 
#define assertNotEqual(arg1, arg2)   assertOpVerboseInternal(arg1,aunit::internal::compareNotEqual,"!=",arg2)
 Assert that arg1 is not equal to arg2. More...
 
#define assertLess(arg1, arg2)   assertOpVerboseInternal(arg1,aunit::internal::compareLess,"<",arg2)
 Assert that arg1 is less than arg2. More...
 
#define assertMore(arg1, arg2)   assertOpVerboseInternal(arg1,aunit::internal::compareMore,">",arg2)
 Assert that arg1 is more than arg2. More...
 
#define assertLessOrEqual(arg1, arg2)   assertOpVerboseInternal(arg1,aunit::internal::compareLessOrEqual,"<=",arg2)
 Assert that arg1 is less than or equal to arg2. More...
 
#define assertMoreOrEqual(arg1, arg2)   assertOpVerboseInternal(arg1,aunit::internal::compareMoreOrEqual,">=",arg2)
 Assert that arg1 is more than or equal to arg2. More...
 
#define assertTrue(arg)   assertBoolVerboseInternal(arg,true)
 Assert that arg is true. More...
 
#define assertFalse(arg)   assertBoolVerboseInternal(arg,false)
 Assert that arg is false. More...
 
#define assertOpVerboseInternal(arg1, op, opName, arg2)
 Internal helper macro, shouldn't be called directly by users. More...
 
#define assertBoolVerboseInternal(arg, value)
 Internal helper macro, shouldn't be called directly by users. More...
 
+

Detailed Description

+

Verbose versions of the macros in AssertMacros.h.

+

These capture the string of the actual arguments and pass them to the respective assertionVerbose() methods so that verbose messages can be printed.

+ +

Definition in file AssertVerboseMacros.h.

+

Macro Definition Documentation

+ +

◆ assertBoolVerboseInternal

+ +
+
+ + + + + + + + + + + + + + + + + + +
#define assertBoolVerboseInternal( arg,
 value 
)
+
+Value:
do {\
if (!assertionBoolVerbose(__FILE__,__LINE__,(arg),AUNIT_F(#arg),(value)))\
return;\
} while (false)
+

Internal helper macro, shouldn't be called directly by users.

+ +

Definition at line 77 of file AssertVerboseMacros.h.

+ +
+
+ +

◆ assertEqual

+ +
+
+ + + + + + + + + + + + + + + + + + +
#define assertEqual( arg1,
 arg2 
)   assertOpVerboseInternal(arg1,aunit::internal::compareEqual,"==",arg2)
+
+ +

Assert that arg1 is equal to arg2.

+ +

Definition at line 40 of file AssertVerboseMacros.h.

+ +
+
+ +

◆ assertFalse

+ +
+
+ + + + + + + + +
#define assertFalse( arg)   assertBoolVerboseInternal(arg,false)
+
+ +

Assert that arg is false.

+ +

Definition at line 67 of file AssertVerboseMacros.h.

+ +
+
+ +

◆ assertLess

+ +
+
+ + + + + + + + + + + + + + + + + + +
#define assertLess( arg1,
 arg2 
)   assertOpVerboseInternal(arg1,aunit::internal::compareLess,"<",arg2)
+
+ +

Assert that arg1 is less than arg2.

+ +

Definition at line 48 of file AssertVerboseMacros.h.

+ +
+
+ +

◆ assertLessOrEqual

+ +
+
+ + + + + + + + + + + + + + + + + + +
#define assertLessOrEqual( arg1,
 arg2 
)   assertOpVerboseInternal(arg1,aunit::internal::compareLessOrEqual,"<=",arg2)
+
+ +

Assert that arg1 is less than or equal to arg2.

+ +

Definition at line 56 of file AssertVerboseMacros.h.

+ +
+
+ +

◆ assertMore

+ +
+
+ + + + + + + + + + + + + + + + + + +
#define assertMore( arg1,
 arg2 
)   assertOpVerboseInternal(arg1,aunit::internal::compareMore,">",arg2)
+
+ +

Assert that arg1 is more than arg2.

+ +

Definition at line 52 of file AssertVerboseMacros.h.

+ +
+
+ +

◆ assertMoreOrEqual

+ +
+
+ + + + + + + + + + + + + + + + + + +
#define assertMoreOrEqual( arg1,
 arg2 
)   assertOpVerboseInternal(arg1,aunit::internal::compareMoreOrEqual,">=",arg2)
+
+ +

Assert that arg1 is more than or equal to arg2.

+ +

Definition at line 60 of file AssertVerboseMacros.h.

+ +
+
+ +

◆ assertNotEqual

+ +
+
+ + + + + + + + + + + + + + + + + + +
#define assertNotEqual( arg1,
 arg2 
)   assertOpVerboseInternal(arg1,aunit::internal::compareNotEqual,"!=",arg2)
+
+ +

Assert that arg1 is not equal to arg2.

+ +

Definition at line 44 of file AssertVerboseMacros.h.

+ +
+
+ +

◆ assertOpVerboseInternal

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#define assertOpVerboseInternal( arg1,
 op,
 opName,
 arg2 
)
+
+Value:
do {\
if (!assertionVerbose(__FILE__,__LINE__,\
(arg1),AUNIT_F(#arg1),opName,op,(arg2),AUNIT_F(#arg2)))\
return;\
} while (false)
+

Internal helper macro, shouldn't be called directly by users.

+ +

Definition at line 70 of file AssertVerboseMacros.h.

+ +
+
+ +

◆ assertTrue

+ +
+
+ + + + + + + + +
#define assertTrue( arg)   assertBoolVerboseInternal(arg,true)
+
+ +

Assert that arg is true.

+ +

Definition at line 64 of file AssertVerboseMacros.h.

+ +
+
+
+ + + + diff --git a/docs/html/AssertVerboseMacros_8h__dep__incl.map b/docs/html/AssertVerboseMacros_8h__dep__incl.map new file mode 100644 index 0000000..37ad6a2 --- /dev/null +++ b/docs/html/AssertVerboseMacros_8h__dep__incl.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/AssertVerboseMacros_8h__dep__incl.md5 b/docs/html/AssertVerboseMacros_8h__dep__incl.md5 new file mode 100644 index 0000000..88eccc3 --- /dev/null +++ b/docs/html/AssertVerboseMacros_8h__dep__incl.md5 @@ -0,0 +1 @@ +2ad3a5bfec6bf4f01b2aa31a93833e1f \ No newline at end of file diff --git a/docs/html/AssertVerboseMacros_8h__dep__incl.png b/docs/html/AssertVerboseMacros_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..f6dc8bedd7cd74df1f3d384de39176f1a17ecaf1 GIT binary patch literal 6878 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 JVi{Ba{{x)zeXali literal 0 HcmV?d00001 diff --git a/docs/html/AssertVerboseMacros_8h_source.html b/docs/html/AssertVerboseMacros_8h_source.html new file mode 100644 index 0000000..da56096 --- /dev/null +++ b/docs/html/AssertVerboseMacros_8h_source.html @@ -0,0 +1,79 @@ + + + + + + + +AUnit: /home/brian/dev/AUnit/src/aunit/AssertVerboseMacros.h Source File + + + + + + + + + +
+
+ + + + + + +
+
AUnit +  0.5.0 +
+
Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
AssertVerboseMacros.h
+
+
+Go to the documentation of this file.
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
25 // Significant portions of the design and implementation of this file came from
26 // https://github.com/mmurdoch/arduinounit/blob/master/src/ArduinoUnit.h
27 
36 #ifndef AUNIT_ASSERT_VERBOSE_MACROS_H
37 #define AUNIT_ASSERT_VERBOSE_MACROS_H
38 
40 #define assertEqual(arg1,arg2) \
41  assertOpVerboseInternal(arg1,aunit::internal::compareEqual,"==",arg2)
42 
44 #define assertNotEqual(arg1,arg2) \
45  assertOpVerboseInternal(arg1,aunit::internal::compareNotEqual,"!=",arg2)
46 
48 #define assertLess(arg1,arg2) \
49  assertOpVerboseInternal(arg1,aunit::internal::compareLess,"<",arg2)
50 
52 #define assertMore(arg1,arg2) \
53  assertOpVerboseInternal(arg1,aunit::internal::compareMore,">",arg2)
54 
56 #define assertLessOrEqual(arg1,arg2) \
57  assertOpVerboseInternal(arg1,aunit::internal::compareLessOrEqual,"<=",arg2)
58 
60 #define assertMoreOrEqual(arg1,arg2) \
61  assertOpVerboseInternal(arg1,aunit::internal::compareMoreOrEqual,">=",arg2)
62 
64 #define assertTrue(arg) assertBoolVerboseInternal(arg,true)
65 
67 #define assertFalse(arg) assertBoolVerboseInternal(arg,false)
68 
70 #define assertOpVerboseInternal(arg1,op,opName,arg2) do {\
71  if (!assertionVerbose(__FILE__,__LINE__,\
72  (arg1),AUNIT_F(#arg1),opName,op,(arg2),AUNIT_F(#arg2)))\
73  return;\
74 } while (false)
75 
77 #define assertBoolVerboseInternal(arg,value) do {\
78  if (!assertionBoolVerbose(__FILE__,__LINE__,(arg),AUNIT_F(#arg),(value)))\
79  return;\
80 } while (false)
81 
82 #endif
+ + + + diff --git a/docs/html/Assertion_8cpp_source.html b/docs/html/Assertion_8cpp_source.html index 7055518..631ba90 100644 --- a/docs/html/Assertion_8cpp_source.html +++ b/docs/html/Assertion_8cpp_source.html @@ -3,9 +3,9 @@ - + -AUnit: /Users/brian/dev/AUnit/src/aunit/Assertion.cpp Source File +AUnit: /home/brian/dev/AUnit/src/aunit/Assertion.cpp Source File @@ -22,7 +22,7 @@
AUnit -  0.4.1 +  0.5.0
Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
@@ -31,21 +31,18 @@ - + +
Assertion.cpp
-
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
25 #include <Arduino.h> // definition of Print
26 #include "TestRunner.h" // seems like a circular reference but ok from cpp file
27 #include "Printer.h"
28 #include "Assertion.h"
29 
30 namespace aunit {
31 
32 
33 // This can be a template function because it is accessed only through the
34 // various assertXxx() methods. Those assertXxx() methods are explicitly
35 // overloaded for the various types that we want to support.
36 //
37 // Prints something like the following:
38 // Assertion failed: (5) == (6), file Test.ino, line 820.
39 // Assertion passed: (6) == (6), file Test.ino, line 820.
40 template <typename A, typename B>
41 void printAssertionMessage(bool ok, const char* file, uint16_t line,
42  const A& lhs, const char *opName, const B& rhs) {
43 
44  // Don't use F() strings here because flash memory strings are not deduped by
45  // the compiler, so each template instantiation of this method causes a
46  // duplication of all the strings below. See
47  // https://github.com/mmurdoch/arduinounit/issues/70
48  // for more info.
49  Print* printer = Printer::getPrinter();
50  printer->print("Assertion ");
51  printer->print(ok ? "passed" : "failed");
52  printer->print(": (");
53  printer->print(lhs);
54  printer->print(") ");
55  printer->print(opName);
56  printer->print(" (");
57  printer->print(rhs);
58  printer->print(')');
59  // reuse string in MataAssertion::printAssertionTestStatusMessage()
60  printer->print(", file ");
61  printer->print(file);
62  printer->print(", line ");
63  printer->print(line);
64  printer->println('.');
65 }
66 
68  return (ok && isVerbosity(Verbosity::kAssertionPassed)) ||
70 }
71 
72 bool Assertion::assertion(const char* file, uint16_t line, bool lhs,
73  const char* opName, bool (*op)(bool lhs, bool rhs),
74  bool rhs) {
75  if (isDone()) return false;
76  bool ok = op(lhs, rhs);
77  if (isOutputEnabled(ok)) {
78  printAssertionMessage(ok, file, line, lhs, opName, rhs);
79  }
80  setPassOrFail(ok);
81  return ok;
82 }
83 
84 bool Assertion::assertion(const char* file, uint16_t line, char lhs,
85  const char* opName, bool (*op)(char lhs, char rhs),
86  char rhs) {
87  if (isDone()) return false;
88  bool ok = op(lhs, rhs);
89  if (isOutputEnabled(ok)) {
90  printAssertionMessage(ok, file, line, lhs, opName, rhs);
91  }
92  setPassOrFail(ok);
93  return ok;
94 }
95 
96 bool Assertion::assertion(const char* file, uint16_t line, int lhs,
97  const char* opName, bool (*op)(int lhs, int rhs),
98  int rhs) {
99  if (isDone()) return false;
100  bool ok = op(lhs, rhs);
101  if (isOutputEnabled(ok)) {
102  printAssertionMessage(ok, file, line, lhs, opName, rhs);
103  }
104  setPassOrFail(ok);
105  return ok;
106 }
107 
108 bool Assertion::assertion(const char* file, uint16_t line, unsigned int lhs,
109  const char* opName, bool (*op)(unsigned int lhs, unsigned int rhs),
110  unsigned int rhs) {
111  if (isDone()) return false;
112  bool ok = op(lhs, rhs);
113  if (isOutputEnabled(ok)) {
114  printAssertionMessage(ok, file, line, lhs, opName, rhs);
115  }
116  setPassOrFail(ok);
117  return ok;
118 }
119 
120 bool Assertion::assertion(const char* file, uint16_t line, long lhs,
121  const char* opName, bool (*op)(long lhs, long rhs),
122  long rhs) {
123  if (isDone()) return false;
124  bool ok = op(lhs, rhs);
125  if (isOutputEnabled(ok)) {
126  printAssertionMessage(ok, file, line, lhs, opName, rhs);
127  }
128  setPassOrFail(ok);
129  return ok;
130 }
131 
132 bool Assertion::assertion(const char* file, uint16_t line, unsigned long lhs,
133  const char* opName, bool (*op)(unsigned long lhs, unsigned long rhs),
134  unsigned long rhs) {
135  if (isDone()) return false;
136  bool ok = op(lhs, rhs);
137  if (isOutputEnabled(ok)) {
138  printAssertionMessage(ok, file, line, lhs, opName, rhs);
139  }
140  setPassOrFail(ok);
141  return ok;
142 }
143 
144 bool Assertion::assertion(const char* file, uint16_t line, double lhs,
145  const char* opName, bool (*op)(double lhs, double rhs),
146  double rhs) {
147  if (isDone()) return false;
148  bool ok = op(lhs, rhs);
149  if (isOutputEnabled(ok)) {
150  printAssertionMessage(ok, file, line, lhs, opName, rhs);
151  }
152  setPassOrFail(ok);
153  return ok;
154 }
155 
156 bool Assertion::assertion(const char* file, uint16_t line, const char* lhs,
157  const char* opName, bool (*op)(const char* lhs, const char* rhs),
158  const char* rhs) {
159  if (isDone()) return false;
160  bool ok = op(lhs, rhs);
161  if (isOutputEnabled(ok)) {
162  printAssertionMessage(ok, file, line, lhs, opName, rhs);
163  }
164  setPassOrFail(ok);
165  return ok;
166 }
167 
168 bool Assertion::assertion(const char* file, uint16_t line, const char* lhs,
169  const char *opName, bool (*op)(const char* lhs, const String& rhs),
170  const String& rhs) {
171  if (isDone()) return false;
172  bool ok = op(lhs, rhs);
173  if (isOutputEnabled(ok)) {
174  printAssertionMessage(ok, file, line, lhs, opName, rhs);
175  }
176  setPassOrFail(ok);
177  return ok;
178 }
179 
180 bool Assertion::assertion(const char* file, uint16_t line, const char* lhs,
181  const char *opName,
182  bool (*op)(const char* lhs, const __FlashStringHelper* rhs),
183  const __FlashStringHelper* rhs) {
184  if (isDone()) return false;
185  bool ok = op(lhs, rhs);
186  if (isOutputEnabled(ok)) {
187  printAssertionMessage(ok, file, line, lhs, opName, rhs);
188  }
189  setPassOrFail(ok);
190  return ok;
191 }
192 
193 bool Assertion::assertion(const char* file, uint16_t line, const String& lhs,
194  const char *opName, bool (*op)(const String& lhs, const char* rhs),
195  const char* rhs) {
196  if (isDone()) return false;
197  bool ok = op(lhs, rhs);
198  if (isOutputEnabled(ok)) {
199  printAssertionMessage(ok, file, line, lhs, opName, rhs);
200  }
201  setPassOrFail(ok);
202  return ok;
203 }
204 
205 bool Assertion::assertion(const char* file, uint16_t line, const String& lhs,
206  const char *opName, bool (*op)(const String& lhs, const String& rhs),
207  const String& rhs) {
208  if (isDone()) return false;
209  bool ok = op(lhs, rhs);
210  if (isOutputEnabled(ok)) {
211  printAssertionMessage(ok, file, line, lhs, opName, rhs);
212  }
213  setPassOrFail(ok);
214  return ok;
215 }
216 
217 bool Assertion::assertion(const char* file, uint16_t line, const String& lhs,
218  const char *opName,
219  bool (*op)(const String& lhs, const __FlashStringHelper* rhs),
220  const __FlashStringHelper* rhs) {
221  if (isDone()) return false;
222  bool ok = op(lhs, rhs);
223  if (isOutputEnabled(ok)) {
224  printAssertionMessage(ok, file, line, lhs, opName, rhs);
225  }
226  setPassOrFail(ok);
227  return ok;
228 }
229 
230 bool Assertion::assertion(const char* file, uint16_t line,
231  const __FlashStringHelper* lhs, const char *opName,
232  bool (*op)(const __FlashStringHelper* lhs, const char* rhs),
233  const char* rhs) {
234  if (isDone()) return false;
235  bool ok = op(lhs, rhs);
236  if (isOutputEnabled(ok)) {
237  printAssertionMessage(ok, file, line, lhs, opName, rhs);
238  }
239  setPassOrFail(ok);
240  return ok;
241 }
242 
243 bool Assertion::assertion(const char* file, uint16_t line,
244  const __FlashStringHelper* lhs, const char *opName,
245  bool (*op)(const __FlashStringHelper* lhs, const String& rhs),
246  const String& rhs) {
247  if (isDone()) return false;
248  bool ok = op(lhs, rhs);
249  if (isOutputEnabled(ok)) {
250  printAssertionMessage(ok, file, line, lhs, opName, rhs);
251  }
252  setPassOrFail(ok);
253  return ok;
254 }
255 
256 bool Assertion::assertion(const char* file, uint16_t line,
257  const __FlashStringHelper* lhs, const char *opName,
258  bool (*op)(const __FlashStringHelper* lhs, const __FlashStringHelper* rhs),
259  const __FlashStringHelper* rhs) {
260  if (isDone()) return false;
261  bool ok = op(lhs, rhs);
262  if (isOutputEnabled(ok)) {
263  printAssertionMessage(ok, file, line, lhs, opName, rhs);
264  }
265  setPassOrFail(ok);
266  return ok;
267 }
268 
269 }
void setPassOrFail(bool ok)
Set the status to Passed or Failed depending on ok.
Definition: Test.cpp:57
-
bool isOutputEnabled(bool ok)
Returns true if an assertion message should be printed.
Definition: Assertion.cpp:67
+
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
25 #include <Arduino.h> // definition of Print
26 #include "Flash.h"
27 #include "Printer.h"
28 #include "Assertion.h"
29 
30 namespace aunit {
31 
32 namespace {
33 
34 // This can be a template function because it is accessed only through the
35 // various assertXxx() methods. Those assertXxx() methods are explicitly
36 // overloaded for the various types that we want to support.
37 //
38 // Prints something like the following:
39 // Assertion failed: (5) == (6), file Test.ino, line 820.
40 // Assertion passed: (6) == (6), file Test.ino, line 820.
41 template <typename A, typename B>
42 void printAssertionMessage(bool ok, const char* file, uint16_t line,
43  const A& lhs, const char *opName, const B& rhs) {
44 
45  // Don't use F() strings here because flash memory strings are not deduped by
46  // the compiler, so each template instantiation of this method causes a
47  // duplication of all the strings below. See
48  // https://github.com/mmurdoch/arduinounit/issues/70
49  // for more info.
50  Print* printer = Printer::getPrinter();
51  printer->print("Assertion ");
52  printer->print(ok ? "passed" : "failed");
53  printer->print(": (");
54  printer->print(lhs);
55  printer->print(") ");
56  printer->print(opName);
57  printer->print(" (");
58  printer->print(rhs);
59  printer->print(')');
60  // reuse string in MataAssertion::printAssertionTestStatusMessage()
61  printer->print(", file ");
62  printer->print(file);
63  printer->print(", line ");
64  printer->print(line);
65  printer->println('.');
66 }
67 
68 // Special version of (bool, bool) because Arduino Print.h converts
69 // bool into int, which prints out "(1) == (0)", which isn't as useful.
70 // This prints "(true) == (false)".
71 void printAssertionMessage(bool ok, const char* file, uint16_t line,
72  bool lhs, const char *opName, bool rhs) {
73 
74  // Don't use F() strings here. Same reason as above.
75  Print* printer = Printer::getPrinter();
76  printer->print("Assertion ");
77  printer->print(ok ? "passed" : "failed");
78  printer->print(": (");
79  printer->print(lhs ? "true" : "false");
80  printer->print(") ");
81  printer->print(opName);
82  printer->print(" (");
83  printer->print(rhs ? "true" : "false");
84  printer->print(')');
85  printer->print(", file ");
86  printer->print(file);
87  printer->print(", line ");
88  printer->print(line);
89  printer->println('.');
90 }
91 
92 // Special version for assertTrue(arg) and assertFalse(arg).
93 // Prints:
94 // "Assertion passed/failed: (arg) is true"
95 // "Assertion passed/failed: (arg) is false"
96 void printAssertionBoolMessage(bool ok, const char* file, uint16_t line,
97  bool arg, bool value) {
98 
99  // Don't use F() strings here. Same reason as above.
100  Print* printer = Printer::getPrinter();
101  printer->print("Assertion ");
102  printer->print(ok ? "passed" : "failed");
103  printer->print(": (");
104  printer->print(arg ? "true" : "false");
105  printer->print(") is ");
106  printer->print(value ? "true" : "false");
107  printer->print(", file ");
108  printer->print(file);
109  printer->print(", line ");
110  printer->print(line);
111  printer->println('.');
112 }
113 
114 } // namespace
115 
117  return (ok && isVerbosity(Verbosity::kAssertionPassed)) ||
119 }
120 
121 bool Assertion::assertionBool(const char* file, uint16_t line, bool arg,
122  bool value) {
123  if (isDone()) return false;
124  bool ok = (arg == value);
125  if (isOutputEnabled(ok)) {
126  printAssertionBoolMessage(ok, file, line, arg, value);
127  }
128  setPassOrFail(ok);
129  return ok;
130 }
131 
132 bool Assertion::assertion(const char* file, uint16_t line, bool lhs,
133  const char* opName, bool (*op)(bool lhs, bool rhs),
134  bool rhs) {
135  if (isDone()) return false;
136  bool ok = op(lhs, rhs);
137  if (isOutputEnabled(ok)) {
138  printAssertionMessage(ok, file, line, lhs, opName, rhs);
139  }
140  setPassOrFail(ok);
141  return ok;
142 }
143 
144 bool Assertion::assertion(const char* file, uint16_t line, char lhs,
145  const char* opName, bool (*op)(char lhs, char rhs),
146  char rhs) {
147  if (isDone()) return false;
148  bool ok = op(lhs, rhs);
149  if (isOutputEnabled(ok)) {
150  printAssertionMessage(ok, file, line, lhs, opName, rhs);
151  }
152  setPassOrFail(ok);
153  return ok;
154 }
155 
156 bool Assertion::assertion(const char* file, uint16_t line, int lhs,
157  const char* opName, bool (*op)(int lhs, int rhs),
158  int rhs) {
159  if (isDone()) return false;
160  bool ok = op(lhs, rhs);
161  if (isOutputEnabled(ok)) {
162  printAssertionMessage(ok, file, line, lhs, opName, rhs);
163  }
164  setPassOrFail(ok);
165  return ok;
166 }
167 
168 bool Assertion::assertion(const char* file, uint16_t line, unsigned int lhs,
169  const char* opName, bool (*op)(unsigned int lhs, unsigned int rhs),
170  unsigned int rhs) {
171  if (isDone()) return false;
172  bool ok = op(lhs, rhs);
173  if (isOutputEnabled(ok)) {
174  printAssertionMessage(ok, file, line, lhs, opName, rhs);
175  }
176  setPassOrFail(ok);
177  return ok;
178 }
179 
180 bool Assertion::assertion(const char* file, uint16_t line, long lhs,
181  const char* opName, bool (*op)(long lhs, long rhs),
182  long rhs) {
183  if (isDone()) return false;
184  bool ok = op(lhs, rhs);
185  if (isOutputEnabled(ok)) {
186  printAssertionMessage(ok, file, line, lhs, opName, rhs);
187  }
188  setPassOrFail(ok);
189  return ok;
190 }
191 
192 bool Assertion::assertion(const char* file, uint16_t line, unsigned long lhs,
193  const char* opName, bool (*op)(unsigned long lhs, unsigned long rhs),
194  unsigned long rhs) {
195  if (isDone()) return false;
196  bool ok = op(lhs, rhs);
197  if (isOutputEnabled(ok)) {
198  printAssertionMessage(ok, file, line, lhs, opName, rhs);
199  }
200  setPassOrFail(ok);
201  return ok;
202 }
203 
204 bool Assertion::assertion(const char* file, uint16_t line, double lhs,
205  const char* opName, bool (*op)(double lhs, double rhs),
206  double rhs) {
207  if (isDone()) return false;
208  bool ok = op(lhs, rhs);
209  if (isOutputEnabled(ok)) {
210  printAssertionMessage(ok, file, line, lhs, opName, rhs);
211  }
212  setPassOrFail(ok);
213  return ok;
214 }
215 
216 bool Assertion::assertion(const char* file, uint16_t line, const char* lhs,
217  const char* opName, bool (*op)(const char* lhs, const char* rhs),
218  const char* rhs) {
219  if (isDone()) return false;
220  bool ok = op(lhs, rhs);
221  if (isOutputEnabled(ok)) {
222  printAssertionMessage(ok, file, line, lhs, opName, rhs);
223  }
224  setPassOrFail(ok);
225  return ok;
226 }
227 
228 bool Assertion::assertion(const char* file, uint16_t line, const char* lhs,
229  const char *opName, bool (*op)(const char* lhs, const String& rhs),
230  const String& rhs) {
231  if (isDone()) return false;
232  bool ok = op(lhs, rhs);
233  if (isOutputEnabled(ok)) {
234  printAssertionMessage(ok, file, line, lhs, opName, rhs);
235  }
236  setPassOrFail(ok);
237  return ok;
238 }
239 
240 bool Assertion::assertion(const char* file, uint16_t line, const char* lhs,
241  const char *opName,
242  bool (*op)(const char* lhs, const __FlashStringHelper* rhs),
243  const __FlashStringHelper* rhs) {
244  if (isDone()) return false;
245  bool ok = op(lhs, rhs);
246  if (isOutputEnabled(ok)) {
247  printAssertionMessage(ok, file, line, lhs, opName, rhs);
248  }
249  setPassOrFail(ok);
250  return ok;
251 }
252 
253 bool Assertion::assertion(const char* file, uint16_t line, const String& lhs,
254  const char *opName, bool (*op)(const String& lhs, const char* rhs),
255  const char* rhs) {
256  if (isDone()) return false;
257  bool ok = op(lhs, rhs);
258  if (isOutputEnabled(ok)) {
259  printAssertionMessage(ok, file, line, lhs, opName, rhs);
260  }
261  setPassOrFail(ok);
262  return ok;
263 }
264 
265 bool Assertion::assertion(const char* file, uint16_t line, const String& lhs,
266  const char *opName, bool (*op)(const String& lhs, const String& rhs),
267  const String& rhs) {
268  if (isDone()) return false;
269  bool ok = op(lhs, rhs);
270  if (isOutputEnabled(ok)) {
271  printAssertionMessage(ok, file, line, lhs, opName, rhs);
272  }
273  setPassOrFail(ok);
274  return ok;
275 }
276 
277 bool Assertion::assertion(const char* file, uint16_t line, const String& lhs,
278  const char *opName,
279  bool (*op)(const String& lhs, const __FlashStringHelper* rhs),
280  const __FlashStringHelper* rhs) {
281  if (isDone()) return false;
282  bool ok = op(lhs, rhs);
283  if (isOutputEnabled(ok)) {
284  printAssertionMessage(ok, file, line, lhs, opName, rhs);
285  }
286  setPassOrFail(ok);
287  return ok;
288 }
289 
290 bool Assertion::assertion(const char* file, uint16_t line,
291  const __FlashStringHelper* lhs, const char *opName,
292  bool (*op)(const __FlashStringHelper* lhs, const char* rhs),
293  const char* rhs) {
294  if (isDone()) return false;
295  bool ok = op(lhs, rhs);
296  if (isOutputEnabled(ok)) {
297  printAssertionMessage(ok, file, line, lhs, opName, rhs);
298  }
299  setPassOrFail(ok);
300  return ok;
301 }
302 
303 bool Assertion::assertion(const char* file, uint16_t line,
304  const __FlashStringHelper* lhs, const char *opName,
305  bool (*op)(const __FlashStringHelper* lhs, const String& rhs),
306  const String& rhs) {
307  if (isDone()) return false;
308  bool ok = op(lhs, rhs);
309  if (isOutputEnabled(ok)) {
310  printAssertionMessage(ok, file, line, lhs, opName, rhs);
311  }
312  setPassOrFail(ok);
313  return ok;
314 }
315 
316 bool Assertion::assertion(const char* file, uint16_t line,
317  const __FlashStringHelper* lhs, const char *opName,
318  bool (*op)(const __FlashStringHelper* lhs, const __FlashStringHelper* rhs),
319  const __FlashStringHelper* rhs) {
320  if (isDone()) return false;
321  bool ok = op(lhs, rhs);
322  if (isOutputEnabled(ok)) {
323  printAssertionMessage(ok, file, line, lhs, opName, rhs);
324  }
325  setPassOrFail(ok);
326  return ok;
327 }
328 
329 namespace {
330 
331 // Verbose versions of above which accept the string arguments of the
332 // assertXxx() macros, so that the error messages are more verbose.
333 //
334 // Prints something like the following:
335 // Assertion failed: (x=5) == (y=6), file Test.ino, line 820.
336 // Assertion passed: (x=6) == (y=6), file Test.ino, line 820.
337 template <typename A, typename B>
338 void printAssertionMessageVerbose(bool ok, const char* file,
339  uint16_t line, const A& lhs, internal::FlashStringType lhsString,
340  const char *opName, const B& rhs, internal::FlashStringType rhsString) {
341 
342  // Don't use F() strings here because flash memory strings are not deduped by
343  // the compiler, so each template instantiation of this method causes a
344  // duplication of all the strings below. See
345  // https://github.com/mmurdoch/arduinounit/issues/70
346  // for more info.
347  Print* printer = Printer::getPrinter();
348  printer->print("Assertion ");
349  printer->print(ok ? "passed" : "failed");
350  printer->print(": (");
351  printer->print(lhsString);
352  printer->print('=');
353  printer->print(lhs);
354  printer->print(") ");
355  printer->print(opName);
356  printer->print(" (");
357  printer->print(rhsString);
358  printer->print('=');
359  printer->print(rhs);
360  printer->print(')');
361  // reuse string in MataAssertion::printAssertionTestStatusMessage()
362  printer->print(", file ");
363  printer->print(file);
364  printer->print(", line ");
365  printer->print(line);
366  printer->println('.');
367 }
368 
369 // Special version of (bool, bool) because Arduino Print.h converts
370 // bool into int, which prints out "(1) == (0)", which isn't as useful.
371 // This prints "(x=true) == (y=false)".
372 void printAssertionMessageVerbose(bool ok, const char* file,
373  uint16_t line, bool lhs, internal::FlashStringType lhsString,
374  const char *opName, bool rhs, internal::FlashStringType rhsString) {
375 
376  // Don't use F() strings here. Same reason as above.
377  Print* printer = Printer::getPrinter();
378  printer->print("Assertion ");
379  printer->print(ok ? "passed" : "failed");
380  printer->print(": (");
381  printer->print(lhsString);
382  printer->print('=');
383  printer->print(lhs ? "true" : "false");
384  printer->print(") ");
385  printer->print(opName);
386  printer->print(" (");
387  printer->print(rhsString);
388  printer->print('=');
389  printer->print(rhs ? "true" : "false");
390  printer->print(')');
391  printer->print(", file ");
392  printer->print(file);
393  printer->print(", line ");
394  printer->print(line);
395  printer->println('.');
396 }
397 
398 // Special version for assertTrue(arg) and assertFalse(arg).
399 // Prints:
400 // "Assertion passed/failed: (x=arg) is true"
401 // "Assertion passed/failed: (x=arg) is false"
402 void printAssertionBoolMessageVerbose(bool ok, const char* file,
403  uint16_t line, bool arg, internal::FlashStringType argString, bool value) {
404 
405  // Don't use F() strings here. Same reason as above.
406  Print* printer = Printer::getPrinter();
407  printer->print("Assertion ");
408  printer->print(ok ? "passed" : "failed");
409  printer->print(": (");
410  printer->print(argString);
411  printer->print('=');
412  printer->print(arg ? "true" : "false");
413  printer->print(") is ");
414  printer->print(value ? "true" : "false");
415  printer->print(", file ");
416  printer->print(file);
417  printer->print(", line ");
418  printer->print(line);
419  printer->println('.');
420 }
421 
422 } // namespace
423 
424 bool Assertion::assertionBoolVerbose(const char* file, uint16_t line, bool arg,
425  internal::FlashStringType argString, bool value) {
426  if (isDone()) return false;
427  bool ok = (arg == value);
428  if (isOutputEnabled(ok)) {
429  printAssertionBoolMessageVerbose(ok, file, line, arg, argString, value);
430  }
431  setPassOrFail(ok);
432  return ok;
433 }
434 
435 bool Assertion::assertionVerbose(const char* file, uint16_t line, bool lhs,
436  internal::FlashStringType lhsString, const char* opName,
437  bool (*op)(bool lhs, bool rhs), bool rhs,
438  internal::FlashStringType rhsString) {
439  if (isDone()) return false;
440  bool ok = op(lhs, rhs);
441  if (isOutputEnabled(ok)) {
442  printAssertionMessageVerbose(ok, file, line, lhs, lhsString, opName, rhs,
443  rhsString);
444  }
445  setPassOrFail(ok);
446  return ok;
447 }
448 
449 bool Assertion::assertionVerbose(const char* file, uint16_t line, char lhs,
450  internal::FlashStringType lhsString, const char* opName,
451  bool (*op)(char lhs, char rhs), char rhs,
452  internal::FlashStringType rhsString) {
453  if (isDone()) return false;
454  bool ok = op(lhs, rhs);
455  if (isOutputEnabled(ok)) {
456  printAssertionMessageVerbose(ok, file, line, lhs, lhsString, opName, rhs,
457  rhsString);
458  }
459  setPassOrFail(ok);
460  return ok;
461 }
462 
463 bool Assertion::assertionVerbose(const char* file, uint16_t line, int lhs,
464  internal::FlashStringType lhsString, const char* opName,
465  bool (*op)(int lhs, int rhs), int rhs,
466  internal::FlashStringType rhsString) {
467  if (isDone()) return false;
468  bool ok = op(lhs, rhs);
469  if (isOutputEnabled(ok)) {
470  printAssertionMessageVerbose(ok, file, line, lhs, lhsString, opName, rhs,
471  rhsString);
472  }
473  setPassOrFail(ok);
474  return ok;
475 }
476 
477 bool Assertion::assertionVerbose(const char* file, uint16_t line,
478  unsigned int lhs, internal::FlashStringType lhsString, const char* opName,
479  bool (*op)(unsigned int lhs, unsigned int rhs),
480  unsigned int rhs, internal::FlashStringType rhsString) {
481  if (isDone()) return false;
482  bool ok = op(lhs, rhs);
483  if (isOutputEnabled(ok)) {
484  printAssertionMessageVerbose(ok, file, line, lhs, lhsString, opName, rhs,
485  rhsString);
486  }
487  setPassOrFail(ok);
488  return ok;
489 }
490 
491 bool Assertion::assertionVerbose(const char* file, uint16_t line, long lhs,
492  internal::FlashStringType lhsString, const char* opName,
493  bool (*op)(long lhs, long rhs), long rhs,
494  internal::FlashStringType rhsString) {
495  if (isDone()) return false;
496  bool ok = op(lhs, rhs);
497  if (isOutputEnabled(ok)) {
498  printAssertionMessageVerbose(ok, file, line, lhs, lhsString, opName, rhs,
499  rhsString);
500  }
501  setPassOrFail(ok);
502  return ok;
503 }
504 
505 bool Assertion::assertionVerbose(const char* file, uint16_t line,
506  unsigned long lhs, internal::FlashStringType lhsString, const char* opName,
507  bool (*op)(unsigned long lhs, unsigned long rhs),
508  unsigned long rhs, internal::FlashStringType rhsString) {
509  if (isDone()) return false;
510  bool ok = op(lhs, rhs);
511  if (isOutputEnabled(ok)) {
512  printAssertionMessageVerbose(ok, file, line, lhs, lhsString, opName, rhs,
513  rhsString);
514  }
515  setPassOrFail(ok);
516  return ok;
517 }
518 
519 bool Assertion::assertionVerbose(const char* file, uint16_t line, double lhs,
520  internal::FlashStringType lhsString, const char* opName,
521  bool (*op)(double lhs, double rhs), double rhs,
522  internal::FlashStringType rhsString) {
523  if (isDone()) return false;
524  bool ok = op(lhs, rhs);
525  if (isOutputEnabled(ok)) {
526  printAssertionMessageVerbose(ok, file, line, lhs, lhsString, opName, rhs,
527  rhsString);
528  }
529  setPassOrFail(ok);
530  return ok;
531 }
532 
533 bool Assertion::assertionVerbose(const char* file, uint16_t line,
534  const char* lhs, internal::FlashStringType lhsString, const char* opName,
535  bool (*op)(const char* lhs, const char* rhs),
536  const char* rhs, internal::FlashStringType rhsString) {
537  if (isDone()) return false;
538  bool ok = op(lhs, rhs);
539  if (isOutputEnabled(ok)) {
540  printAssertionMessageVerbose(ok, file, line, lhs, lhsString, opName, rhs,
541  rhsString);
542  }
543  setPassOrFail(ok);
544  return ok;
545 }
546 
547 bool Assertion::assertionVerbose(const char* file, uint16_t line,
548  const char* lhs, internal::FlashStringType lhsString,
549  const char *opName, bool (*op)(const char* lhs, const String& rhs),
550  const String& rhs, internal::FlashStringType rhsString) {
551  if (isDone()) return false;
552  bool ok = op(lhs, rhs);
553  if (isOutputEnabled(ok)) {
554  printAssertionMessageVerbose(ok, file, line, lhs, lhsString, opName, rhs,
555  rhsString);
556  }
557  setPassOrFail(ok);
558  return ok;
559 }
560 
561 bool Assertion::assertionVerbose(const char* file, uint16_t line,
562  const char* lhs, internal::FlashStringType lhsString, const char *opName,
563  bool (*op)(const char* lhs, const __FlashStringHelper* rhs),
564  const __FlashStringHelper* rhs, internal::FlashStringType rhsString) {
565  if (isDone()) return false;
566  bool ok = op(lhs, rhs);
567  if (isOutputEnabled(ok)) {
568  printAssertionMessageVerbose(ok, file, line, lhs, lhsString, opName, rhs,
569  rhsString);
570  }
571  setPassOrFail(ok);
572  return ok;
573 }
574 
575 bool Assertion::assertionVerbose(const char* file, uint16_t line,
576  const String& lhs, internal::FlashStringType lhsString, const char *opName,
577  bool (*op)(const String& lhs, const char* rhs),
578  const char* rhs, internal::FlashStringType rhsString) {
579  if (isDone()) return false;
580  bool ok = op(lhs, rhs);
581  if (isOutputEnabled(ok)) {
582  printAssertionMessageVerbose(ok, file, line, lhs, lhsString, opName, rhs,
583  rhsString);
584  }
585  setPassOrFail(ok);
586  return ok;
587 }
588 
589 bool Assertion::assertionVerbose(const char* file, uint16_t line,
590  const String& lhs, internal::FlashStringType lhsString, const char *opName,
591  bool (*op)(const String& lhs, const String& rhs),
592  const String& rhs, internal::FlashStringType rhsString) {
593  if (isDone()) return false;
594  bool ok = op(lhs, rhs);
595  if (isOutputEnabled(ok)) {
596  printAssertionMessageVerbose(ok, file, line, lhs, lhsString, opName, rhs,
597  rhsString);
598  }
599  setPassOrFail(ok);
600  return ok;
601 }
602 
603 bool Assertion::assertionVerbose(const char* file, uint16_t line,
604  const String& lhs, internal::FlashStringType lhsString, const char *opName,
605  bool (*op)(const String& lhs, const __FlashStringHelper* rhs),
606  const __FlashStringHelper* rhs, internal::FlashStringType rhsString) {
607  if (isDone()) return false;
608  bool ok = op(lhs, rhs);
609  if (isOutputEnabled(ok)) {
610  printAssertionMessageVerbose(ok, file, line, lhs, lhsString, opName, rhs,
611  rhsString);
612  }
613  setPassOrFail(ok);
614  return ok;
615 }
616 
617 bool Assertion::assertionVerbose(const char* file, uint16_t line,
618  const __FlashStringHelper* lhs, internal::FlashStringType lhsString,
619  const char *opName,
620  bool (*op)(const __FlashStringHelper* lhs, const char* rhs),
621  const char* rhs, internal::FlashStringType rhsString) {
622  if (isDone()) return false;
623  bool ok = op(lhs, rhs);
624  if (isOutputEnabled(ok)) {
625  printAssertionMessageVerbose(ok, file, line, lhs, lhsString, opName, rhs,
626  rhsString);
627  }
628  setPassOrFail(ok);
629  return ok;
630 }
631 
632 bool Assertion::assertionVerbose(const char* file, uint16_t line,
633  const __FlashStringHelper* lhs, internal::FlashStringType lhsString,
634  const char *opName,
635  bool (*op)(const __FlashStringHelper* lhs, const String& rhs),
636  const String& rhs, internal::FlashStringType rhsString) {
637  if (isDone()) return false;
638  bool ok = op(lhs, rhs);
639  if (isOutputEnabled(ok)) {
640  printAssertionMessageVerbose(ok, file, line, lhs, lhsString, opName, rhs,
641  rhsString);
642  }
643  setPassOrFail(ok);
644  return ok;
645 }
646 
647 bool Assertion::assertionVerbose(const char* file, uint16_t line,
648  const __FlashStringHelper* lhs, internal::FlashStringType lhsString,
649  const char *opName,
650  bool (*op)(const __FlashStringHelper* lhs, const __FlashStringHelper* rhs),
651  const __FlashStringHelper* rhs, internal::FlashStringType rhsString) {
652  if (isDone()) return false;
653  bool ok = op(lhs, rhs);
654  if (isOutputEnabled(ok)) {
655  printAssertionMessageVerbose(ok, file, line, lhs, lhsString, opName, rhs,
656  rhsString);
657  }
658  setPassOrFail(ok);
659  return ok;
660 }
661 
662 }
void setPassOrFail(bool ok)
Set the status to Passed or Failed depending on ok.
Definition: Test.cpp:50
+
bool isOutputEnabled(bool ok)
Returns true if an assertion message should be printed.
Definition: Assertion.cpp:116
-
bool isVerbosity(uint8_t verbosity)
Determine if any of the given verbosity is enabled.
Definition: Test.h:193
+
bool isVerbosity(uint8_t verbosity)
Determine if any of the given verbosity is enabled.
Definition: Test.h:261
static const uint8_t kAssertionPassed
Print assertXxx() passed message.
Definition: Verbosity.h:40
-
bool isDone()
Return true if test is done (passed, failed, skipped, expired).
Definition: Test.h:130
-
Various assertXxx() macros are defined in this header.
-
static Print * getPrinter()
Get the output printer used by the various assertion() methods and the TestRunner.
Definition: Printer.h:50
+
bool isDone()
Return true if test has been asserted.
Definition: Test.h:196
+
static Print * getPrinter()
Get the output printer used by the various assertion() methods and the TestRunner.
Definition: Printer.h:52
static const uint8_t kAssertionFailed
Print assertXxx() failed message.
Definition: Verbosity.h:43
+
Flash strings (using F() macro) on the ESP8266 platform cannot be placed in an inline context...
diff --git a/docs/html/Assertion_8h__dep__incl.map b/docs/html/Assertion_8h__dep__incl.map deleted file mode 100644 index 85ce0e0..0000000 --- a/docs/html/Assertion_8h__dep__incl.map +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/docs/html/Assertion_8h__dep__incl.md5 b/docs/html/Assertion_8h__dep__incl.md5 deleted file mode 100644 index ccb1090..0000000 --- a/docs/html/Assertion_8h__dep__incl.md5 +++ /dev/null @@ -1 +0,0 @@ -003b4ca9a3d28fc42fb7def62d5d8d56 \ No newline at end of file diff --git a/docs/html/Assertion_8h__dep__incl.png b/docs/html/Assertion_8h__dep__incl.png deleted file mode 100644 index b91130c967889001fd087870fd2dd124aa077abc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71557 zcmZ^L1yq!4_dN^)3?MKx(v5%!NK2Q5gdp9afFRwSibzY1bV;Xlm!!0Gcf-&f|Cjsw zzI(mjTK~0XEsiz5^dkZmC#h$6^JimAFH?j|F{RMkkk3?{$V*XxLji;>XpiYkL~DO-;>BO$Fb(rTj{+wOe+H=RX&+ z`ECcJc}gb=`rpUmx0WvzDT9ZP&>|83_wf@a?V!6Ej7x?1?}r~4?X{~s6o>79pFqTY zc)|btHSk~H1(J-e$ZQZ6ki&Xklu`Sqk7F=C*dqN3xe<|XyM-+ ze*W)LMVbT8;Dv?q{_jeOt^x~1>^7K0%kV$<{_r*jF!Q%jZtb5iN#D*lxczWFG!7fz zmNWVl$9l9DZ%{{p)qS4oeI=`2q)jjJ>Cs_rA+X>8^L)vsWj;!=p9uJp3pRV;55|)Laq_$G&q_G{+Fr?Eg!FcW(7qsD_<~M?IWUWdDo;VwIzm>g+M_!u4!dYbR5;##U^1p$N}% zyfEqu0gK$HM~@37?DuE+t0%OH(o#Gxk9rnc16JmO?ifZHlUxY+<_>Eex4w?ea(ftb zdiN`=x3qo4_zuL?z?)z3Z1Ij;BR#CuvoygtNy!A0!iGjIvGDu5bCEoq>SBH5yGhNz zV+QzvCLZBf@a2B_x!dZHaV(35;t$jQ?PH-#>4-Q3pIbF#+|}6Kx%z6=B5gHzP@MH@ zcN8d{#btkXBvTqYPpu#>#pAGpXbp%lRV(tqHeln_=e^GL#&E?k)EnKM`jx-2>hLsr z4`)az`k{kf-{0N7JKLSI=$v{8{nIfGzaq+69IbUQ%hM=HK{rRmrikhL#`#MC-mpRzkvtehD_!A3%440F>y7e1@M(mIOLLJi*gA1Yw48Mjq8+^hd o@JD+Kya{rfQjTKs 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ⅆ0+q^7qSFH&ZbnmPbt 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 diff --git a/docs/html/Assertion_8h__incl.map b/docs/html/Assertion_8h__incl.map deleted file mode 100644 index 86d04c6..0000000 --- a/docs/html/Assertion_8h__incl.map +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/docs/html/Assertion_8h__incl.md5 b/docs/html/Assertion_8h__incl.md5 deleted file mode 100644 index 436ce52..0000000 --- a/docs/html/Assertion_8h__incl.md5 +++ /dev/null @@ -1 +0,0 @@ -8135acb5532c5d56ee3d7d336bc77b2e \ No newline at end of file diff --git a/docs/html/Assertion_8h__incl.png b/docs/html/Assertion_8h__incl.png deleted file mode 100644 index 96442b54ad74b26a87a69c40ab02374a5a063fa3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15752 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 - + -AUnit: /Users/brian/dev/AUnit/src/aunit/Assertion.h Source File +AUnit: /home/brian/dev/AUnit/src/aunit/Assertion.h Source File @@ -22,7 +22,7 @@
AUnit -  0.4.1 +  0.5.0
Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
@@ -31,21 +31,18 @@
- + +
Assertion.h
-Go to the documentation of this file.
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
25 // Significant portions of the design and implementation of this file came from
26 // https://github.com/mmurdoch/arduinounit/blob/master/src/ArduinoUnit.h
27 
36 #ifndef AUNIT_ASSERTION_H
37 #define AUNIT_ASSERTION_H
38 
39 #include "Test.h"
40 
42 #define assertEqual(arg1,arg2) assertOp(arg1,aunit::compareEqual,"==",arg2)
43 
45 #define assertNotEqual(arg1,arg2) \
46  assertOp(arg1,aunit::compareNotEqual,"!=",arg2)
47 
49 #define assertLess(arg1,arg2) assertOp(arg1,aunit::compareLess,"<",arg2)
50 
52 #define assertMore(arg1,arg2) assertOp(arg1,aunit::compareMore,">",arg2)
53 
55 #define assertLessOrEqual(arg1,arg2) \
56  assertOp(arg1,aunit::compareLessOrEqual,"<=",arg2)
57 
59 #define assertMoreOrEqual(arg1,arg2) \
60  assertOp(arg1,aunit::compareMoreOrEqual,">=",arg2)
61 
63 #define assertTrue(arg) assertEqual(arg,true)
64 
66 #define assertFalse(arg) assertEqual(arg,false)
67 
69 #define assertOp(arg1,op,opName,arg2) do {\
70  if (!assertion(__FILE__,__LINE__,(arg1),opName,op,(arg2)))\
71  return;\
72 } while (false)
73 
74 class __FlashStringHelper;
75 class String;
76 
77 namespace aunit {
78 
98 class Assertion: public Test {
99  protected:
102 
104  bool isOutputEnabled(bool ok);
105 
106  // NOTE: Don't create a virtual destructor. That's the normal best practice
107  // for classes that will be used polymorphically. However, this class will
108  // never be deleted polymorphically (i.e. through its pointer) so it
109  // doesn't need a virtual destructor. In fact, adding it causes flash and
110  // static memory to increase dramatically because each test() and testing()
111  // macro creates a new subclass. AceButtonTest flash memory increases from
112  // 18928 to 20064 bytes, and static memory increases from 917 to 1055
113  // bytes.
114 
115  bool assertion(const char* file, uint16_t line, bool lhs,
116  const char* opName, bool (*op)(bool lhs, bool rhs),
117  bool rhs);
118 
119  bool assertion(const char* file, uint16_t line, char lhs,
120  const char* opName, bool (*op)(char lhs, char rhs),
121  char rhs);
122 
123  bool assertion(const char* file, uint16_t line, int lhs,
124  const char* opName, bool (*op)(int lhs, int rhs),
125  int rhs);
126 
127  bool assertion(const char* file, uint16_t line, unsigned int lhs,
128  const char* opName, bool (*op)(unsigned int lhs, unsigned int rhs),
129  unsigned int rhs);
130 
131  bool assertion(const char* file, uint16_t line, long lhs,
132  const char* opName, bool (*op)(long lhs, long rhs),
133  long rhs);
134 
135  bool assertion(const char* file, uint16_t line, unsigned long lhs,
136  const char* opName, bool (*op)(unsigned long lhs, unsigned long rhs),
137  unsigned long rhs);
138 
139  bool assertion(const char* file, uint16_t line, double lhs,
140  const char* opName, bool (*op)(double lhs, double rhs),
141  double rhs);
142 
143  bool assertion(const char* file, uint16_t line, const char* lhs,
144  const char* opName, bool (*op)(const char* lhs, const char* rhs),
145  const char* rhs);
146 
147  bool assertion(const char* file, uint16_t line, const char* lhs,
148  const char *opName, bool (*op)(const char* lhs, const String& rhs),
149  const String& rhs);
150 
151  bool assertion(const char* file, uint16_t line, const char* lhs,
152  const char *opName,
153  bool (*op)(const char* lhs, const __FlashStringHelper* rhs),
154  const __FlashStringHelper* rhs);
155 
156  bool assertion(const char* file, uint16_t line, const String& lhs,
157  const char *opName, bool (*op)(const String& lhs, const char* rhs),
158  const char* rhs);
159 
160  bool assertion(const char* file, uint16_t line, const String& lhs,
161  const char *opName, bool (*op)(const String& lhs, const String& rhs),
162  const String& rhs);
163 
164  bool assertion(const char* file, uint16_t line, const String& lhs,
165  const char *opName,
166  bool (*op)(const String& lhs, const __FlashStringHelper* rhs),
167  const __FlashStringHelper* rhs);
168 
169  bool assertion(const char* file, uint16_t line,
170  const __FlashStringHelper* lhs, const char *opName,
171  bool (*op)(const __FlashStringHelper* lhs, const char* rhs),
172  const char* rhs);
173 
174  bool assertion(const char* file, uint16_t line,
175  const __FlashStringHelper* lhs, const char *opName,
176  bool (*op)(const __FlashStringHelper* lhs, const String& rhs),
177  const String& rhs);
178 
179  bool assertion(const char* file, uint16_t line,
180  const __FlashStringHelper* lhs, const char *opName,
181  bool (*op)(const __FlashStringHelper* lhs,
182  const __FlashStringHelper* rhs),
183  const __FlashStringHelper* rhs);
184 
185  private:
186  // Disable copy-constructor and assignment operator
187  Assertion(const Assertion&) = delete;
188  Assertion& operator=(const Assertion&) = delete;
189 };
190 
191 }
192 
193 #endif
Base class of all test cases.
Definition: Test.h:49
-
bool isOutputEnabled(bool ok)
Returns true if an assertion message should be printed.
Definition: Assertion.cpp:67
+
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
25 #ifndef AUNIT_ASSERTION_H
26 #define AUNIT_ASSERTION_H
27 
28 #include "Flash.h"
29 #include "Test.h"
30 
31 class __FlashStringHelper;
32 class String;
33 
34 namespace aunit {
35 
55 class Assertion: public Test {
56  protected:
58  Assertion() {}
59 
61  bool isOutputEnabled(bool ok);
62 
63  bool assertionBool(const char* file, uint16_t line, bool arg,
64  bool value);
65 
66  bool assertion(const char* file, uint16_t line, bool lhs,
67  const char* opName, bool (*op)(bool lhs, bool rhs),
68  bool rhs);
69 
70  bool assertion(const char* file, uint16_t line, char lhs,
71  const char* opName, bool (*op)(char lhs, char rhs),
72  char rhs);
73 
74  bool assertion(const char* file, uint16_t line, int lhs,
75  const char* opName, bool (*op)(int lhs, int rhs),
76  int rhs);
77 
78  bool assertion(const char* file, uint16_t line, unsigned int lhs,
79  const char* opName, bool (*op)(unsigned int lhs, unsigned int rhs),
80  unsigned int rhs);
81 
82  bool assertion(const char* file, uint16_t line, long lhs,
83  const char* opName, bool (*op)(long lhs, long rhs),
84  long rhs);
85 
86  bool assertion(const char* file, uint16_t line, unsigned long lhs,
87  const char* opName, bool (*op)(unsigned long lhs, unsigned long rhs),
88  unsigned long rhs);
89 
90  bool assertion(const char* file, uint16_t line, double lhs,
91  const char* opName, bool (*op)(double lhs, double rhs),
92  double rhs);
93 
94  bool assertion(const char* file, uint16_t line, const char* lhs,
95  const char* opName, bool (*op)(const char* lhs, const char* rhs),
96  const char* rhs);
97 
98  bool assertion(const char* file, uint16_t line, const char* lhs,
99  const char *opName, bool (*op)(const char* lhs, const String& rhs),
100  const String& rhs);
101 
102  bool assertion(const char* file, uint16_t line, const char* lhs,
103  const char *opName,
104  bool (*op)(const char* lhs, const __FlashStringHelper* rhs),
105  const __FlashStringHelper* rhs);
106 
107  bool assertion(const char* file, uint16_t line, const String& lhs,
108  const char *opName, bool (*op)(const String& lhs, const char* rhs),
109  const char* rhs);
110 
111  bool assertion(const char* file, uint16_t line, const String& lhs,
112  const char *opName, bool (*op)(const String& lhs, const String& rhs),
113  const String& rhs);
114 
115  bool assertion(const char* file, uint16_t line, const String& lhs,
116  const char *opName,
117  bool (*op)(const String& lhs, const __FlashStringHelper* rhs),
118  const __FlashStringHelper* rhs);
119 
120  bool assertion(const char* file, uint16_t line,
121  const __FlashStringHelper* lhs, const char *opName,
122  bool (*op)(const __FlashStringHelper* lhs, const char* rhs),
123  const char* rhs);
124 
125  bool assertion(const char* file, uint16_t line,
126  const __FlashStringHelper* lhs, const char *opName,
127  bool (*op)(const __FlashStringHelper* lhs, const String& rhs),
128  const String& rhs);
129 
130  bool assertion(const char* file, uint16_t line,
131  const __FlashStringHelper* lhs, const char *opName,
132  bool (*op)(const __FlashStringHelper* lhs,
133  const __FlashStringHelper* rhs),
134  const __FlashStringHelper* rhs);
135 
136  // Verbose versions of above.
137 
138  bool assertionBoolVerbose(const char* file, uint16_t line, bool arg,
139  internal::FlashStringType argString, bool value);
140 
141  bool assertionVerbose(const char* file, uint16_t line, bool lhs,
142  internal::FlashStringType lhsString, const char* opName,
143  bool (*op)(bool lhs, bool rhs),
144  bool rhs, internal::FlashStringType rhsString);
145 
146  bool assertionVerbose(const char* file, uint16_t line, char lhs,
147  internal::FlashStringType lhsString, const char* opName,
148  bool (*op)(char lhs, char rhs),
149  char rhs, internal::FlashStringType rhsString);
150 
151  bool assertionVerbose(const char* file, uint16_t line, int lhs,
152  internal::FlashStringType lhsString, const char* opName,
153  bool (*op)(int lhs, int rhs),
154  int rhs, internal::FlashStringType rhsString);
155 
156  bool assertionVerbose(const char* file, uint16_t line, unsigned int lhs,
157  internal::FlashStringType lhsString, const char* opName,
158  bool (*op)(unsigned int lhs, unsigned int rhs),
159  unsigned int rhs, internal::FlashStringType rhsString);
160 
161  bool assertionVerbose(const char* file, uint16_t line, long lhs,
162  internal::FlashStringType lhsString, const char* opName,
163  bool (*op)(long lhs, long rhs),
164  long rhs, internal::FlashStringType rhsString);
165 
166  bool assertionVerbose(const char* file, uint16_t line, unsigned long lhs,
167  internal::FlashStringType lhsString, const char* opName,
168  bool (*op)(unsigned long lhs, unsigned long rhs),
169  unsigned long rhs, internal::FlashStringType rhsString);
170 
171  bool assertionVerbose(const char* file, uint16_t line, double lhs,
172  internal::FlashStringType lhsString, const char* opName,
173  bool (*op)(double lhs, double rhs),
174  double rhs, internal::FlashStringType rhsString);
175 
176  bool assertionVerbose(const char* file, uint16_t line, const char* lhs,
177  internal::FlashStringType lhsString, const char* opName,
178  bool (*op)(const char* lhs, const char* rhs),
179  const char* rhs, internal::FlashStringType rhsString);
180 
181  bool assertionVerbose(const char* file, uint16_t line, const char* lhs,
182  internal::FlashStringType lhsString, const char *opName,
183  bool (*op)(const char* lhs, const String& rhs),
184  const String& rhs, internal::FlashStringType rhsString);
185 
186  bool assertionVerbose(const char* file, uint16_t line, const char* lhs,
187  internal::FlashStringType lhsString, const char *opName,
188  bool (*op)(const char* lhs, const __FlashStringHelper* rhs),
189  const __FlashStringHelper* rhs, internal::FlashStringType rhsString);
190 
191  bool assertionVerbose(const char* file, uint16_t line, const String& lhs,
192  internal::FlashStringType lhsString, const char *opName,
193  bool (*op)(const String& lhs, const char* rhs),
194  const char* rhs, internal::FlashStringType rhsString);
195 
196  bool assertionVerbose(const char* file, uint16_t line, const String& lhs,
197  internal::FlashStringType lhsString, const char *opName,
198  bool (*op)(const String& lhs, const String& rhs),
199  const String& rhs, internal::FlashStringType rhsString);
200 
201  bool assertionVerbose(const char* file, uint16_t line, const String& lhs,
202  internal::FlashStringType lhsString, const char *opName,
203  bool (*op)(const String& lhs, const __FlashStringHelper* rhs),
204  const __FlashStringHelper* rhs, internal::FlashStringType rhsString);
205 
206  bool assertionVerbose(const char* file, uint16_t line,
207  const __FlashStringHelper* lhs, internal::FlashStringType lhsString,
208  const char *opName,
209  bool (*op)(const __FlashStringHelper* lhs, const char* rhs),
210  const char* rhs, internal::FlashStringType rhsString);
211 
212  bool assertionVerbose(const char* file, uint16_t line,
213  const __FlashStringHelper* lhs, internal::FlashStringType lhsString,
214  const char *opName,
215  bool (*op)(const __FlashStringHelper* lhs, const String& rhs),
216  const String& rhs, internal::FlashStringType rhsString);
217 
218  bool assertionVerbose(const char* file, uint16_t line,
219  const __FlashStringHelper* lhs, internal::FlashStringType lhsString,
220  const char *opName,
221  bool (*op)(const __FlashStringHelper* lhs,
222  const __FlashStringHelper* rhs),
223  const __FlashStringHelper* rhs, internal::FlashStringType rhsString);
224 
225  private:
226  // Disable copy-constructor and assignment operator
227  Assertion(const Assertion&) = delete;
228  Assertion& operator=(const Assertion&) = delete;
229 };
230 
231 }
232 
233 #endif
Base class of all test cases.
Definition: Test.h:43
+
bool isOutputEnabled(bool ok)
Returns true if an assertion message should be printed.
Definition: Assertion.cpp:116
-
An Assertion class is a subclass of Test and provides various overloaded assertion() functions...
Definition: Assertion.h:98
-
Assertion()
Empty constructor.
Definition: Assertion.h:101
+
An Assertion class is a subclass of Test and provides various overloaded assertion() functions...
Definition: Assertion.h:55
+
Flash strings (using F() macro) on the ESP8266 platform cannot be placed in an inline context...
+
Assertion()
Empty constructor.
Definition: Assertion.h:58
diff --git a/docs/html/Compare_8cpp_source.html b/docs/html/Compare_8cpp_source.html index a887752..7cd5b07 100644 --- a/docs/html/Compare_8cpp_source.html +++ b/docs/html/Compare_8cpp_source.html @@ -3,9 +3,9 @@ - + -AUnit: /Users/brian/dev/AUnit/src/aunit/Compare.cpp Source File +AUnit: /home/brian/dev/AUnit/src/aunit/Compare.cpp Source File @@ -22,7 +22,7 @@
AUnit -  0.4.1 +  0.5.0
Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
@@ -31,21 +31,18 @@
- + +
Compare.cpp
-
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
25 /*
26 Design Notes:
27 ============
28 This file provides overloaded compareXxx(a, b) functions which are used by
29 the various assertXxx() macros. A primary goal of this file is to allow users
30 to use the assertXxx() macros with all combinations of the 3 types of strings
31 available in the Arduino platform:
32 
33  - (const char *)
34  - (String&)
35  - (const __FlashStringHelper*)
36 
37 Clearly, there are 9 binary combinations these string types.
38 
39 Template Specialization:
40 -----------------------
41 One way to implement the compareEqual() for these types is to use template
42 specialization. The problem with Template specialization is that templates
43 use strict type matching, and does not perform the normal implicit type
44 conversion, including const-casting. Therefore, all of the various c-style
45 string types, for example:
46 
47  - char*
48  - const char*
49  - char[1]
50  - char[N]
51  - const char[1]
52  - const char[N]
53 
54 are considered to be different types under the C++ templating system. This
55 causes a combinatorial explosion of template specialization which produces
56 code that is difficult to understand, test and maintain.
57 An example can be seen in the Compare.h file of the ArduinoUnit project:
58 https://github.com/mmurdoch/arduinounit/blob/master/src/ArduinoUnitUtility/Compare.h
59 
60 Function Overloading:
61 ---------------------
62 In this project, I used function overloading instead of template
63 specialization. Function overloading handles c-style strings (i.e. character
64 arrays) naturally, in the way most users expect. For example, (char*) is
65 automarically cast to (const char*), and (char[N]) is autonmatically
66 cast to (const char*).
67 
68 For the primitive value types (e.g. (char), (int), (unsigned char), etc.) I
69 attempted to use a generic templatized version, using sonmething like:
70 
71  template<typename T>
72  compareEqual(const T& a, const T& b) { ... }
73 
74 However, this template introduced this method:
75 
76  compareEqual(char* const& a, char* const& b);
77 
78 that seemed to take precedence over the explicitly defined overload:
79 
80  compareEqual(const char* a, const char*b);
81 
82 When the compareEqual() method is called with a (char*) or a (char[N]),
83 like this:
84 
85  char a[3] = {...};
86  char b[4] = {...};
87  compareEqual(a, b);
88 
89 this calls compareEqual(char* const&, const* const&), which is the wrong
90 version for a c-style string. The only way I could get this to work was to
91 avoid templates completely and manually define all the function overloads
92 even for primitive integer types.
93 
94 Implicit Conversions:
95 ---------------------
96 For basic primitive types, I depend on some casts to avoid having to define
97 some functions. I assume that signed and unsigned intergers smaller or equal
98 to (int) will be converted to an (int) to match compareEqual(int, int).
99 
100 I provided an explicit compareEqual(char, char) overload because in C++, a
101 (char) type is distinct from (signed char) and (unsigned char).
102 
103 Technically, there should be a (long long) version and an (unsigned long
104 long) version of compareEqual(). However, it turns out that the Arduino
105 Print::print() method does not have an overload for these types, so it would
106 not do us much good to provide an assertEqual() or compareEqual() for the
107 (long long) and (unsigned long long) types.
108 
109 Custom Assert and Compare Functions:
110 ------------------------------------
111 Another advantage of using function overloading instead of template
112 specialization is that the user is able to add additional function overloads
113 into the 'aunit' namespace. This should allow the user to define the various
114 comporeXxx() and assertXxx() functions for a custom class. I have not
115 tested this though.
116 
117 Comparing Flash Strings:
118 ----------------------
119 Flash memory must be read using 4-byte alignment on the ESP8266. AVR doesn't
120 care. Teensy-ARM fakes the flash memory API but really just uses the normal
121 static RAM. The following code for comparing two (__FlashStringHelper*)
122 against each other will work for all 3 environments.
123 
124 Inlining:
125 --------
126 Even though most of these functions are one-liners, there is no advantage to
127 inlining them because they are almost always used through a function pointer.
128 */
129 
130 #include <string.h>
131 #include <WString.h>
132 
133 #ifdef ESP8266
134 #include <pgmspace.h>
135 #else
136 #include <avr/pgmspace.h>
137 #endif
138 
139 #include "Compare.h"
140 #include "FCString.h"
141 
142 namespace aunit {
143 
144 // compareString()
145 
146 int compareString(const char* a, const char* b) {
147  return strcmp(a, b);
148 }
149 
150 int compareString(const char* a, const String& b) {
151  return strcmp(a, b.c_str());
152 }
153 
154 int compareString(const char* a, const __FlashStringHelper* b) {
155  return strcmp_P(a, (const char*)b);
156 }
157 
158 int compareString(const String& a, const char* b) {
159  return strcmp(a.c_str(), b);
160 }
161 
162 int compareString(const String& a, const String& b) {
163  return a.compareTo(b);
164 }
165 
166 int compareString(const String& a, const __FlashStringHelper* b) {
167  return strcmp_P(a.c_str(), (const char*)b);
168 }
169 
170 int compareString(const __FlashStringHelper* a, const char* b) {
171  return -strcmp_P(b, (const char*) a);
172 }
173 
174 // On ESP8266, pgm_read_byte() already takes care of 4-byte alignment, and
175 // memcpy_P(s, p, 4) makes 4 calls to pgm_read_byte() anyway, so don't bother
176 // optimizing for 4-byte alignment here.
177 int compareString(const __FlashStringHelper* a, const __FlashStringHelper* b) {
178  const char* aa = reinterpret_cast<const char*>(a);
179  const char* bb = reinterpret_cast<const char*>(b);
180 
181  while (true) {
182  uint8_t ca = pgm_read_byte(aa);
183  uint8_t cb = pgm_read_byte(bb);
184  if (ca != cb) return (int) ca - (int) cb;
185  if (ca == '\0') return 0;
186  aa++;
187  bb++;
188  }
189 }
190 
191 int compareString(const __FlashStringHelper* a, const String& b) {
192  return -strcmp_P(b.c_str(), (const char*)a);
193 }
194 
195 int compareString(const FCString& a, const FCString& b) {
196  if (a.getType() == FCString::kCStringType) {
197  if (b.getType() == FCString::kCStringType) {
198  return compareString(a.getCString(), b.getCString());
199  } else {
200  return compareString(a.getCString(), b.getFString());
201  }
202  } else {
203  if (b.getType() == FCString::kCStringType) {
204  return compareString(a.getFString(), b.getCString());
205  } else {
206  return compareString(a.getFString(), b.getFString());
207  }
208  }
209 }
210 
211 // compareStringN()
212 
213 int compareStringN(const char* a, const char* b, size_t n) {
214  return strncmp(a, b, n);
215 }
216 
217 int compareStringN(const char* a, const __FlashStringHelper* b, size_t n) {
218  return strncmp_P(a, (const char*)b, n);
219 }
220 
221 int compareStringN(const __FlashStringHelper* a, const char* b, size_t n) {
222  return -strncmp_P(b, (const char*)a, n);
223 }
224 
225 // On ESP8266, pgm_read_byte() already takes care of 4-byte alignment, and
226 // memcpy_P(s, p, 4) makes 4 calls to pgm_read_byte() anyway, so don't bother
227 // optimizing for 4-byte alignment here.
228 int compareStringN(const __FlashStringHelper* a, const __FlashStringHelper* b,
229  size_t n) {
230  const char* aa = reinterpret_cast<const char*>(a);
231  const char* bb = reinterpret_cast<const char*>(b);
232 
233  while (n > 0) {
234  uint8_t ca = pgm_read_byte(aa);
235  uint8_t cb = pgm_read_byte(bb);
236  if (ca != cb) return (int) ca - (int) cb;
237  if (ca == '\0') return 0;
238  aa++;
239  bb++;
240  n--;
241  }
242  return 0;
243 }
244 
245 int compareStringN(const FCString& a, const char* b, size_t n) {
246  if (a.getType() == FCString::kCStringType) {
247  return compareStringN(a.getCString(), b, n);
248  } else {
249  return compareStringN(a.getFString(), b, n);
250  }
251 }
252 
253 int compareStringN(const FCString& a, const __FlashStringHelper* b, size_t n) {
254  if (a.getType() == FCString::kCStringType) {
255  return compareStringN(a.getCString(), b, n);
256  } else {
257  return compareStringN(a.getFString(), b, n);
258  }
259 }
260 
261 // compareEqual()
262 
263 bool compareEqual(bool a, bool b) {
264  return (a == b);
265 }
266 
267 bool compareEqual(char a, char b) {
268  return (a == b);
269 }
270 
271 bool compareEqual(int a, int b) {
272  return (a == b);
273 }
274 
275 bool compareEqual(unsigned int a, unsigned int b) {
276  return (a == b);
277 }
278 
279 bool compareEqual(long a, long b) {
280  return (a == b);
281 }
282 
283 bool compareEqual(unsigned long a, unsigned long b) {
284  return (a == b);
285 }
286 
287 bool compareEqual(double a, double b) {
288  return (a == b);
289 }
290 
291 bool compareEqual(const char* a, const char* b) {
292  return compareString(a, b) == 0;
293 }
294 
295 bool compareEqual(const char* a, const String& b) {
296  return compareString(a, b) == 0;
297 }
298 
299 bool compareEqual(const char* a, const __FlashStringHelper* b) {
300  return compareString(a, b) == 0;
301 }
302 
303 bool compareEqual(const __FlashStringHelper* a, const char* b) {
304  return compareString(a, b) == 0;
305 }
306 
307 bool compareEqual(const __FlashStringHelper* a, const __FlashStringHelper* b) {
308  return compareString(a, b) == 0;
309 }
310 
311 bool compareEqual(const __FlashStringHelper* a, const String& b) {
312  return compareString(a, b) == 0;
313 }
314 
315 bool compareEqual(const String& a, const char* b) {
316  return compareString(a, b) == 0;
317 }
318 
319 bool compareEqual(const String& a, const String& b) {
320  return compareString(a, b) == 0;
321 }
322 
323 bool compareEqual(const String& a, const __FlashStringHelper* b) {
324  return compareString(a, b) == 0;
325 }
326 
327 // compareLess()
328 
329 bool compareLess(bool a, bool b) {
330  return (a < b);
331 }
332 
333 bool compareLess(char a, char b) {
334  return (a < b);
335 }
336 
337 bool compareLess(int a, int b) {
338  return (a < b);
339 }
340 
341 bool compareLess(unsigned int a, unsigned int b) {
342  return (a < b);
343 }
344 
345 bool compareLess(long a, long b) {
346  return (a < b);
347 }
348 
349 bool compareLess(unsigned long a, unsigned long b) {
350  return (a < b);
351 }
352 
353 bool compareLess(double a, double b) {
354  return (a < b);
355 }
356 
357 bool compareLess(const char* a, const char* b) {
358  return compareString(a, b) < 0;
359 }
360 
361 bool compareLess(const char* a, const String& b) {
362  return compareString(a, b) < 0;
363 }
364 
365 bool compareLess(const char* a, const __FlashStringHelper* b) {
366  return compareString(a, b) < 0;
367 }
368 
369 bool compareLess(const __FlashStringHelper* a, const char* b) {
370  return compareString(a, b) < 0;
371 }
372 
373 bool compareLess(
374  const __FlashStringHelper* a, const __FlashStringHelper* b) {
375  return compareString(a, b) < 0;
376 }
377 
378 bool compareLess(const __FlashStringHelper* a, const String& b) {
379  return compareString(a, b) < 0;
380 }
381 
382 bool compareLess(const String& a, const char* b) {
383  return compareString(a, b) < 0;
384 }
385 
386 bool compareLess(const String& a, const String& b) {
387  return compareString(a, b) < 0;
388 }
389 
390 bool compareLess(const String& a, const __FlashStringHelper* b) {
391  return compareString(a, b) < 0;
392 }
393 
394 // compareMore()
395 
396 bool compareMore(bool a, bool b) {
397  return (a > b);
398 }
399 
400 bool compareMore(char a, char b) {
401  return (a > b);
402 }
403 
404 bool compareMore(int a, int b) {
405  return (a > b);
406 }
407 
408 bool compareMore(unsigned int a, unsigned int b) {
409  return (a > b);
410 }
411 
412 bool compareMore(long a, long b) {
413  return (a > b);
414 }
415 
416 bool compareMore(unsigned long a, unsigned long b) {
417  return (a > b);
418 }
419 
420 bool compareMore(double a, double b) {
421  return (a > b);
422 }
423 
424 bool compareMore(const char* a, const char* b) {
425  return compareString(a, b) > 0;
426 }
427 
428 bool compareMore(const char* a, const String& b) {
429  return compareString(a, b) > 0;
430 }
431 
432 bool compareMore(const char* a, const __FlashStringHelper* b) {
433  return compareString(a, b) > 0;
434 }
435 
436 bool compareMore(const __FlashStringHelper* a, const char* b) {
437  return compareString(a, b) > 0;
438 }
439 
440 bool compareMore(const __FlashStringHelper* a, const __FlashStringHelper* b) {
441  return compareString(a, b) > 0;
442 }
443 
444 bool compareMore(const __FlashStringHelper* a, const String& b) {
445  return compareString(a, b) > 0;
446 }
447 
448 bool compareMore(const String& a, const char* b) {
449  return compareString(a, b) > 0;
450 }
451 
452 bool compareMore(const String& a, const String& b) {
453  return compareString(a, b) > 0;
454 }
455 
456 bool compareMore(const String& a, const __FlashStringHelper* b) {
457  return compareString(a, b) > 0;
458 }
459 
460 // compareLessOrEqual
461 
462 bool compareLessOrEqual(bool a, bool b) {
463  return (a <= b);
464 }
465 
466 bool compareLessOrEqual(char a, char b) {
467  return (a <= b);
468 }
469 
470 bool compareLessOrEqual(int a, int b) {
471  return (a <= b);
472 }
473 
474 bool compareLessOrEqual(unsigned int a, unsigned int b) {
475  return (a <= b);
476 }
477 
478 bool compareLessOrEqual(long a, long b) {
479  return (a <= b);
480 }
481 
482 bool compareLessOrEqual(unsigned long a, unsigned long b) {
483  return (a <= b);
484 }
485 
486 bool compareLessOrEqual(double a, double b) {
487  return (a <= b);
488 }
489 
490 bool compareLessOrEqual(const char* a, const char* b) {
491  return compareString(a, b) <= 0;
492 }
493 
494 bool compareLessOrEqual(const char* a, const String& b) {
495  return compareString(a, b) <= 0;
496 }
497 
498 bool compareLessOrEqual(const char* a, const __FlashStringHelper* b) {
499  return compareString(a, b) <= 0;
500 }
501 
502 bool compareLessOrEqual(const __FlashStringHelper* a, const char* b) {
503  return compareString(a, b) <= 0;
504 }
505 
506 bool compareLessOrEqual(
507  const __FlashStringHelper* a, const __FlashStringHelper* b) {
508  return compareString(a, b) <= 0;
509 }
510 
511 bool compareLessOrEqual(const __FlashStringHelper* a, const String& b) {
512  return compareString(a, b) <= 0;
513 }
514 
515 bool compareLessOrEqual(const String& a, const char* b) {
516  return compareString(a, b) <= 0;
517 }
518 
519 bool compareLessOrEqual(const String& a, const String& b) {
520  return compareString(a, b) <= 0;
521 }
522 
523 bool compareLessOrEqual(const String& a, const __FlashStringHelper* b) {
524  return compareString(a, b) <= 0;
525 }
526 
527 // compareMoreOrEqual
528 
529 bool compareMoreOrEqual(bool a, bool b) {
530  return (a >= b);
531 }
532 
533 bool compareMoreOrEqual(char a, char b) {
534  return (a >= b);
535 }
536 
537 bool compareMoreOrEqual(int a, int b) {
538  return (a >= b);
539 }
540 
541 bool compareMoreOrEqual(unsigned int a, unsigned int b) {
542  return (a >= b);
543 }
544 
545 bool compareMoreOrEqual(long a, long b) {
546  return (a >= b);
547 }
548 
549 bool compareMoreOrEqual(unsigned long a, unsigned long b) {
550  return (a >= b);
551 }
552 
553 bool compareMoreOrEqual(double a, double b) {
554  return (a >= b);
555 }
556 
557 bool compareMoreOrEqual(const char* a, const char* b) {
558  return compareString(a, b) >= 0;
559 }
560 
561 bool compareMoreOrEqual(const char* a, const String& b) {
562  return compareString(a, b) >= 0;
563 }
564 
565 bool compareMoreOrEqual(const char* a, const __FlashStringHelper* b) {
566  return compareString(a, b) >= 0;
567 }
568 
569 bool compareMoreOrEqual(const __FlashStringHelper* a, const char* b) {
570  return compareString(a, b) >= 0;
571 }
572 
573 bool compareMoreOrEqual(
574  const __FlashStringHelper* a, const __FlashStringHelper* b) {
575  return compareString(a, b) >= 0;
576 }
577 
578 bool compareMoreOrEqual(const __FlashStringHelper* a, const String& b) {
579  return compareString(a, b) >= 0;
580 }
581 
582 bool compareMoreOrEqual(const String& a, const char* b) {
583  return compareString(a, b) >= 0;
584 }
585 
586 bool compareMoreOrEqual(const String& a, const String& b) {
587  return compareString(a, b) >= 0;
588 }
589 
590 bool compareMoreOrEqual(const String& a, const __FlashStringHelper* b) {
591  return compareString(a, b) >= 0;
592 }
593 
594 // compareNotEqual
595 
596 bool compareNotEqual(bool a, bool b) {
597  return (a != b);
598 }
599 
600 bool compareNotEqual(char a, char b) {
601  return (a != b);
602 }
603 
604 bool compareNotEqual(int a, int b) {
605  return (a != b);
606 }
607 
608 bool compareNotEqual(unsigned int a, unsigned int b) {
609  return (a != b);
610 }
611 
612 bool compareNotEqual(long a, long b) {
613  return (a != b);
614 }
615 
616 bool compareNotEqual(unsigned long a, unsigned long b) {
617  return (a != b);
618 }
619 
620 bool compareNotEqual(double a, double b) {
621  return (a != b);
622 }
623 
624 bool compareNotEqual(const char* a, const char* b) {
625  return compareString(a, b) != 0;
626 }
627 
628 bool compareNotEqual(const char* a, const String& b) {
629  return compareString(a, b) != 0;
630 }
631 
632 bool compareNotEqual(const char* a, const __FlashStringHelper* b) {
633  return compareString(a, b) != 0;
634 }
635 
636 bool compareNotEqual(const __FlashStringHelper* a, const char* b) {
637  return compareString(a, b) != 0;
638 }
639 
640 bool compareNotEqual(
641  const __FlashStringHelper* a, const __FlashStringHelper* b) {
642  return compareString(a, b) != 0;
643 }
644 
645 bool compareNotEqual(const __FlashStringHelper* a, const String& b) {
646  return compareString(a, b) != 0;
647 }
648 
649 bool compareNotEqual(const String& a, const char* b) {
650  return compareString(a, b) != 0;
651 }
652 
653 bool compareNotEqual(const String& a, const String& b) {
654  return compareString(a, b) != 0;
655 }
656 
657 bool compareNotEqual(const String& a, const __FlashStringHelper* b) {
658  return compareString(a, b) != 0;
659 }
660 
661 }
+
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
25 /*
26 Design Notes:
27 ============
28 This file provides overloaded compareXxx(a, b) functions which are used by
29 the various assertXxx() macros. A primary goal of this file is to allow users
30 to use the assertXxx() macros with all combinations of the 3 types of strings
31 available in the Arduino platform:
32 
33  - (const char *)
34  - (String&)
35  - (const __FlashStringHelper*)
36 
37 Clearly, there are 9 binary combinations these string types.
38 
39 Template Specialization:
40 -----------------------
41 One way to implement the compareEqual() for these types is to use template
42 specialization. The problem with Template specialization is that templates
43 use strict type matching, and does not perform the normal implicit type
44 conversion, including const-casting. Therefore, all of the various c-style
45 string types, for example:
46 
47  - char*
48  - const char*
49  - char[1]
50  - char[N]
51  - const char[1]
52  - const char[N]
53 
54 are considered to be different types under the C++ templating system. This
55 causes a combinatorial explosion of template specialization which produces
56 code that is difficult to understand, test and maintain.
57 An example can be seen in the Compare.h file of the ArduinoUnit project:
58 https://github.com/mmurdoch/arduinounit/blob/master/src/ArduinoUnitUtility/Compare.h
59 
60 Function Overloading:
61 ---------------------
62 In this project, I used function overloading instead of template
63 specialization. Function overloading handles c-style strings (i.e. character
64 arrays) naturally, in the way most users expect. For example, (char*) is
65 automarically cast to (const char*), and (char[N]) is autonmatically
66 cast to (const char*).
67 
68 For the primitive value types (e.g. (char), (int), (unsigned char), etc.) I
69 attempted to use a generic templatized version, using sonmething like:
70 
71  template<typename T>
72  compareEqual(const T& a, const T& b) { ... }
73 
74 However, this template introduced this method:
75 
76  compareEqual(char* const& a, char* const& b);
77 
78 that seemed to take precedence over the explicitly defined overload:
79 
80  compareEqual(const char* a, const char*b);
81 
82 When the compareEqual() method is called with a (char*) or a (char[N]),
83 like this:
84 
85  char a[3] = {...};
86  char b[4] = {...};
87  compareEqual(a, b);
88 
89 this calls compareEqual(char* const&, const* const&), which is the wrong
90 version for a c-style string. The only way I could get this to work was to
91 avoid templates completely and manually define all the function overloads
92 even for primitive integer types.
93 
94 Implicit Conversions:
95 ---------------------
96 For basic primitive types, I depend on some casts to avoid having to define
97 some functions. I assume that signed and unsigned integers smaller or equal
98 to (int) will be converted to an (int) to match compareEqual(int, int).
99 
100 I provided an explicit compareEqual(char, char) overload because in C++, a
101 (char) type is distinct from (signed char) and (unsigned char).
102 
103 Technically, there should be a (long long) version and an (unsigned long
104 long) version of compareEqual(). However, it turns out that the Arduino
105 Print::print() method does not have an overload for these types, so it would
106 not do us much good to provide an assertEqual() or compareEqual() for the
107 (long long) and (unsigned long long) types.
108 
109 Custom Assert and Compare Functions:
110 ------------------------------------
111 Another advantage of using function overloading instead of template
112 specialization is that the user is able to add additional function overloads
113 into the 'aunit' namespace. This should allow the user to define the various
114 comporeXxx() and assertXxx() functions for a custom class. I have not
115 tested this though.
116 
117 Comparing Flash Strings:
118 ----------------------
119 Flash memory must be read using 4-byte alignment on the ESP8266. AVR doesn't
120 care. Teensy-ARM fakes the flash memory API but really just uses the normal
121 static RAM. The following code for comparing two (__FlashStringHelper*)
122 against each other will work for all 3 environments.
123 
124 Inlining:
125 --------
126 Even though most of these functions are one-liners, there is no advantage to
127 inlining them because they are almost always used through a function pointer.
128 */
129 
130 #include <string.h>
131 #include <WString.h>
132 #include "Flash.h"
133 #include "Compare.h"
134 #include "FCString.h"
135 
136 namespace aunit {
137 namespace internal {
138 
139 class FCString;
140 
141 // compareString()
142 
143 int compareString(const char* a, const char* b) {
144  return strcmp(a, b);
145 }
146 
147 int compareString(const char* a, const String& b) {
148  return strcmp(a, b.c_str());
149 }
150 
151 int compareString(const char* a, const __FlashStringHelper* b) {
152  return strcmp_P(a, (const char*)b);
153 }
154 
155 int compareString(const String& a, const char* b) {
156  return strcmp(a.c_str(), b);
157 }
158 
159 int compareString(const String& a, const String& b) {
160  return a.compareTo(b);
161 }
162 
163 int compareString(const String& a, const __FlashStringHelper* b) {
164  return strcmp_P(a.c_str(), (const char*)b);
165 }
166 
167 int compareString(const __FlashStringHelper* a, const char* b) {
168  return -strcmp_P(b, (const char*) a);
169 }
170 
171 // On ESP8266, pgm_read_byte() already takes care of 4-byte alignment, and
172 // memcpy_P(s, p, 4) makes 4 calls to pgm_read_byte() anyway, so don't bother
173 // optimizing for 4-byte alignment here.
174 int compareString(const __FlashStringHelper* a, const __FlashStringHelper* b) {
175  const char* aa = reinterpret_cast<const char*>(a);
176  const char* bb = reinterpret_cast<const char*>(b);
177 
178  while (true) {
179  uint8_t ca = pgm_read_byte(aa);
180  uint8_t cb = pgm_read_byte(bb);
181  if (ca != cb) return (int) ca - (int) cb;
182  if (ca == '\0') return 0;
183  aa++;
184  bb++;
185  }
186 }
187 
188 int compareString(const __FlashStringHelper* a, const String& b) {
189  return -strcmp_P(b.c_str(), (const char*)a);
190 }
191 
192 int compareString(const FCString& a, const FCString& b) {
193  if (a.getType() == FCString::kCStringType) {
194  if (b.getType() == FCString::kCStringType) {
195  return compareString(a.getCString(), b.getCString());
196  } else {
197  return compareString(a.getCString(), b.getFString());
198  }
199  } else {
200  if (b.getType() == FCString::kCStringType) {
201  return compareString(a.getFString(), b.getCString());
202  } else {
203  return compareString(a.getFString(), b.getFString());
204  }
205  }
206 }
207 
208 // compareStringN()
209 
210 int compareStringN(const char* a, const char* b, size_t n) {
211  return strncmp(a, b, n);
212 }
213 
214 int compareStringN(const char* a, const __FlashStringHelper* b, size_t n) {
215  return strncmp_P(a, (const char*)b, n);
216 }
217 
218 int compareStringN(const __FlashStringHelper* a, const char* b, size_t n) {
219  return -strncmp_P(b, (const char*)a, n);
220 }
221 
222 // On ESP8266, pgm_read_byte() already takes care of 4-byte alignment, and
223 // memcpy_P(s, p, 4) makes 4 calls to pgm_read_byte() anyway, so don't bother
224 // optimizing for 4-byte alignment here.
225 int compareStringN(const __FlashStringHelper* a, const __FlashStringHelper* b,
226  size_t n) {
227  const char* aa = reinterpret_cast<const char*>(a);
228  const char* bb = reinterpret_cast<const char*>(b);
229 
230  while (n > 0) {
231  uint8_t ca = pgm_read_byte(aa);
232  uint8_t cb = pgm_read_byte(bb);
233  if (ca != cb) return (int) ca - (int) cb;
234  if (ca == '\0') return 0;
235  aa++;
236  bb++;
237  n--;
238  }
239  return 0;
240 }
241 
242 int compareStringN(const FCString& a, const char* b, size_t n) {
243  if (a.getType() == FCString::kCStringType) {
244  return compareStringN(a.getCString(), b, n);
245  } else {
246  return compareStringN(a.getFString(), b, n);
247  }
248 }
249 
250 int compareStringN(const FCString& a, const __FlashStringHelper* b, size_t n) {
251  if (a.getType() == FCString::kCStringType) {
252  return compareStringN(a.getCString(), b, n);
253  } else {
254  return compareStringN(a.getFString(), b, n);
255  }
256 }
257 
258 // compareEqual()
259 
260 bool compareEqual(bool a, bool b) {
261  return (a == b);
262 }
263 
264 bool compareEqual(char a, char b) {
265  return (a == b);
266 }
267 
268 bool compareEqual(int a, int b) {
269  return (a == b);
270 }
271 
272 bool compareEqual(unsigned int a, unsigned int b) {
273  return (a == b);
274 }
275 
276 bool compareEqual(long a, long b) {
277  return (a == b);
278 }
279 
280 bool compareEqual(unsigned long a, unsigned long b) {
281  return (a == b);
282 }
283 
284 bool compareEqual(double a, double b) {
285  return (a == b);
286 }
287 
288 bool compareEqual(const char* a, const char* b) {
289  return compareString(a, b) == 0;
290 }
291 
292 bool compareEqual(const char* a, const String& b) {
293  return compareString(a, b) == 0;
294 }
295 
296 bool compareEqual(const char* a, const __FlashStringHelper* b) {
297  return compareString(a, b) == 0;
298 }
299 
300 bool compareEqual(const __FlashStringHelper* a, const char* b) {
301  return compareString(a, b) == 0;
302 }
303 
304 bool compareEqual(const __FlashStringHelper* a, const __FlashStringHelper* b) {
305  return compareString(a, b) == 0;
306 }
307 
308 bool compareEqual(const __FlashStringHelper* a, const String& b) {
309  return compareString(a, b) == 0;
310 }
311 
312 bool compareEqual(const String& a, const char* b) {
313  return compareString(a, b) == 0;
314 }
315 
316 bool compareEqual(const String& a, const String& b) {
317  return compareString(a, b) == 0;
318 }
319 
320 bool compareEqual(const String& a, const __FlashStringHelper* b) {
321  return compareString(a, b) == 0;
322 }
323 
324 // compareLess()
325 
326 bool compareLess(bool a, bool b) {
327  return (a < b);
328 }
329 
330 bool compareLess(char a, char b) {
331  return (a < b);
332 }
333 
334 bool compareLess(int a, int b) {
335  return (a < b);
336 }
337 
338 bool compareLess(unsigned int a, unsigned int b) {
339  return (a < b);
340 }
341 
342 bool compareLess(long a, long b) {
343  return (a < b);
344 }
345 
346 bool compareLess(unsigned long a, unsigned long b) {
347  return (a < b);
348 }
349 
350 bool compareLess(double a, double b) {
351  return (a < b);
352 }
353 
354 bool compareLess(const char* a, const char* b) {
355  return compareString(a, b) < 0;
356 }
357 
358 bool compareLess(const char* a, const String& b) {
359  return compareString(a, b) < 0;
360 }
361 
362 bool compareLess(const char* a, const __FlashStringHelper* b) {
363  return compareString(a, b) < 0;
364 }
365 
366 bool compareLess(const __FlashStringHelper* a, const char* b) {
367  return compareString(a, b) < 0;
368 }
369 
370 bool compareLess(
371  const __FlashStringHelper* a, const __FlashStringHelper* b) {
372  return compareString(a, b) < 0;
373 }
374 
375 bool compareLess(const __FlashStringHelper* a, const String& b) {
376  return compareString(a, b) < 0;
377 }
378 
379 bool compareLess(const String& a, const char* b) {
380  return compareString(a, b) < 0;
381 }
382 
383 bool compareLess(const String& a, const String& b) {
384  return compareString(a, b) < 0;
385 }
386 
387 bool compareLess(const String& a, const __FlashStringHelper* b) {
388  return compareString(a, b) < 0;
389 }
390 
391 // compareMore()
392 
393 bool compareMore(bool a, bool b) {
394  return (a > b);
395 }
396 
397 bool compareMore(char a, char b) {
398  return (a > b);
399 }
400 
401 bool compareMore(int a, int b) {
402  return (a > b);
403 }
404 
405 bool compareMore(unsigned int a, unsigned int b) {
406  return (a > b);
407 }
408 
409 bool compareMore(long a, long b) {
410  return (a > b);
411 }
412 
413 bool compareMore(unsigned long a, unsigned long b) {
414  return (a > b);
415 }
416 
417 bool compareMore(double a, double b) {
418  return (a > b);
419 }
420 
421 bool compareMore(const char* a, const char* b) {
422  return compareString(a, b) > 0;
423 }
424 
425 bool compareMore(const char* a, const String& b) {
426  return compareString(a, b) > 0;
427 }
428 
429 bool compareMore(const char* a, const __FlashStringHelper* b) {
430  return compareString(a, b) > 0;
431 }
432 
433 bool compareMore(const __FlashStringHelper* a, const char* b) {
434  return compareString(a, b) > 0;
435 }
436 
437 bool compareMore(const __FlashStringHelper* a, const __FlashStringHelper* b) {
438  return compareString(a, b) > 0;
439 }
440 
441 bool compareMore(const __FlashStringHelper* a, const String& b) {
442  return compareString(a, b) > 0;
443 }
444 
445 bool compareMore(const String& a, const char* b) {
446  return compareString(a, b) > 0;
447 }
448 
449 bool compareMore(const String& a, const String& b) {
450  return compareString(a, b) > 0;
451 }
452 
453 bool compareMore(const String& a, const __FlashStringHelper* b) {
454  return compareString(a, b) > 0;
455 }
456 
457 // compareLessOrEqual
458 
459 bool compareLessOrEqual(bool a, bool b) {
460  return (a <= b);
461 }
462 
463 bool compareLessOrEqual(char a, char b) {
464  return (a <= b);
465 }
466 
467 bool compareLessOrEqual(int a, int b) {
468  return (a <= b);
469 }
470 
471 bool compareLessOrEqual(unsigned int a, unsigned int b) {
472  return (a <= b);
473 }
474 
475 bool compareLessOrEqual(long a, long b) {
476  return (a <= b);
477 }
478 
479 bool compareLessOrEqual(unsigned long a, unsigned long b) {
480  return (a <= b);
481 }
482 
483 bool compareLessOrEqual(double a, double b) {
484  return (a <= b);
485 }
486 
487 bool compareLessOrEqual(const char* a, const char* b) {
488  return compareString(a, b) <= 0;
489 }
490 
491 bool compareLessOrEqual(const char* a, const String& b) {
492  return compareString(a, b) <= 0;
493 }
494 
495 bool compareLessOrEqual(const char* a, const __FlashStringHelper* b) {
496  return compareString(a, b) <= 0;
497 }
498 
499 bool compareLessOrEqual(const __FlashStringHelper* a, const char* b) {
500  return compareString(a, b) <= 0;
501 }
502 
503 bool compareLessOrEqual(
504  const __FlashStringHelper* a, const __FlashStringHelper* b) {
505  return compareString(a, b) <= 0;
506 }
507 
508 bool compareLessOrEqual(const __FlashStringHelper* a, const String& b) {
509  return compareString(a, b) <= 0;
510 }
511 
512 bool compareLessOrEqual(const String& a, const char* b) {
513  return compareString(a, b) <= 0;
514 }
515 
516 bool compareLessOrEqual(const String& a, const String& b) {
517  return compareString(a, b) <= 0;
518 }
519 
520 bool compareLessOrEqual(const String& a, const __FlashStringHelper* b) {
521  return compareString(a, b) <= 0;
522 }
523 
524 // compareMoreOrEqual
525 
526 bool compareMoreOrEqual(bool a, bool b) {
527  return (a >= b);
528 }
529 
530 bool compareMoreOrEqual(char a, char b) {
531  return (a >= b);
532 }
533 
534 bool compareMoreOrEqual(int a, int b) {
535  return (a >= b);
536 }
537 
538 bool compareMoreOrEqual(unsigned int a, unsigned int b) {
539  return (a >= b);
540 }
541 
542 bool compareMoreOrEqual(long a, long b) {
543  return (a >= b);
544 }
545 
546 bool compareMoreOrEqual(unsigned long a, unsigned long b) {
547  return (a >= b);
548 }
549 
550 bool compareMoreOrEqual(double a, double b) {
551  return (a >= b);
552 }
553 
554 bool compareMoreOrEqual(const char* a, const char* b) {
555  return compareString(a, b) >= 0;
556 }
557 
558 bool compareMoreOrEqual(const char* a, const String& b) {
559  return compareString(a, b) >= 0;
560 }
561 
562 bool compareMoreOrEqual(const char* a, const __FlashStringHelper* b) {
563  return compareString(a, b) >= 0;
564 }
565 
566 bool compareMoreOrEqual(const __FlashStringHelper* a, const char* b) {
567  return compareString(a, b) >= 0;
568 }
569 
570 bool compareMoreOrEqual(
571  const __FlashStringHelper* a, const __FlashStringHelper* b) {
572  return compareString(a, b) >= 0;
573 }
574 
575 bool compareMoreOrEqual(const __FlashStringHelper* a, const String& b) {
576  return compareString(a, b) >= 0;
577 }
578 
579 bool compareMoreOrEqual(const String& a, const char* b) {
580  return compareString(a, b) >= 0;
581 }
582 
583 bool compareMoreOrEqual(const String& a, const String& b) {
584  return compareString(a, b) >= 0;
585 }
586 
587 bool compareMoreOrEqual(const String& a, const __FlashStringHelper* b) {
588  return compareString(a, b) >= 0;
589 }
590 
591 // compareNotEqual
592 
593 bool compareNotEqual(bool a, bool b) {
594  return (a != b);
595 }
596 
597 bool compareNotEqual(char a, char b) {
598  return (a != b);
599 }
600 
601 bool compareNotEqual(int a, int b) {
602  return (a != b);
603 }
604 
605 bool compareNotEqual(unsigned int a, unsigned int b) {
606  return (a != b);
607 }
608 
609 bool compareNotEqual(long a, long b) {
610  return (a != b);
611 }
612 
613 bool compareNotEqual(unsigned long a, unsigned long b) {
614  return (a != b);
615 }
616 
617 bool compareNotEqual(double a, double b) {
618  return (a != b);
619 }
620 
621 bool compareNotEqual(const char* a, const char* b) {
622  return compareString(a, b) != 0;
623 }
624 
625 bool compareNotEqual(const char* a, const String& b) {
626  return compareString(a, b) != 0;
627 }
628 
629 bool compareNotEqual(const char* a, const __FlashStringHelper* b) {
630  return compareString(a, b) != 0;
631 }
632 
633 bool compareNotEqual(const __FlashStringHelper* a, const char* b) {
634  return compareString(a, b) != 0;
635 }
636 
637 bool compareNotEqual(
638  const __FlashStringHelper* a, const __FlashStringHelper* b) {
639  return compareString(a, b) != 0;
640 }
641 
642 bool compareNotEqual(const __FlashStringHelper* a, const String& b) {
643  return compareString(a, b) != 0;
644 }
645 
646 bool compareNotEqual(const String& a, const char* b) {
647  return compareString(a, b) != 0;
648 }
649 
650 bool compareNotEqual(const String& a, const String& b) {
651  return compareString(a, b) != 0;
652 }
653 
654 bool compareNotEqual(const String& a, const __FlashStringHelper* b) {
655  return compareString(a, b) != 0;
656 }
657 
658 }
659 }
+
Flash strings (using F() macro) on the ESP8266 platform cannot be placed in an inline context...
diff --git a/docs/html/Compare_8h_source.html b/docs/html/Compare_8h_source.html index b848729..74e2c30 100644 --- a/docs/html/Compare_8h_source.html +++ b/docs/html/Compare_8h_source.html @@ -3,9 +3,9 @@ - + -AUnit: /Users/brian/dev/AUnit/src/aunit/Compare.h Source File +AUnit: /home/brian/dev/AUnit/src/aunit/Compare.h Source File @@ -22,7 +22,7 @@
AUnit -  0.4.1 +  0.5.0
Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
@@ -31,21 +31,18 @@
- + +
Compare.h
-
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
25 // Significant portions of the design and implementation of this file came from
26 // https://github.com/mmurdoch/arduinounit/blob/master/src/ArduinoUnitUtility/Compare.h
27 
28 #ifndef AUNIT_COMPARE_H
29 #define AUNIT_COMPARE_H
30 
31 #include <stddef.h> // size_t
32 
33 class String;
34 class __FlashStringHelper;
35 
36 namespace aunit {
37 
38 class FCString;
39 
40 // compareString()
41 
42 int compareString(const char* a, const char* b);
43 
44 int compareString(const char* a, const String& b);
45 
46 int compareString(const char* a, const __FlashStringHelper* b);
47 
48 int compareString(const String& a, const char* b);
49 
50 int compareString(const String& a, const String& b);
51 
52 int compareString(const String& a, const __FlashStringHelper* b);
53 
54 int compareString(const __FlashStringHelper* a, const char* b);
55 
56 int compareString(const __FlashStringHelper* a, const __FlashStringHelper* b);
57 
58 int compareString(const __FlashStringHelper* a, const String& b);
59 
60 int compareString(const FCString& a, const FCString& b);
61 
62 // compareStringN()
63 //
64 // These methods are used to implement the TestRunner::exclude() and
65 // TestRunner::include() features.
66 
68 int compareStringN(const char* a, const char* b, size_t n);
69 
71 int compareStringN(const char* a, const __FlashStringHelper* b, size_t n);
72 
74 int compareStringN(const __FlashStringHelper* a, const char* b, size_t n);
75 
77 int compareStringN(const __FlashStringHelper* a, const __FlashStringHelper* b,
78  size_t n);
79 
81 int compareStringN(const FCString& a, const char* b, size_t n);
82 
84 int compareStringN(const FCString& a, const __FlashStringHelper* b, size_t n);
85 
86 // compareEqual()
87 
88 bool compareEqual(bool a, bool b);
89 
90 bool compareEqual(char a, char b);
91 
92 bool compareEqual(int a, int b);
93 
94 bool compareEqual(unsigned int a, unsigned int b);
95 
96 bool compareEqual(long a, long b);
97 
98 bool compareEqual(unsigned long a, unsigned long b);
99 
100 bool compareEqual(double a, double b);
101 
102 bool compareEqual(const char* a, const char* b);
103 
104 bool compareEqual(const char* a, const String& b);
105 
106 bool compareEqual(const char* a, const __FlashStringHelper* b);
107 
108 bool compareEqual(const __FlashStringHelper* a, const char* b);
109 
110 bool compareEqual( const __FlashStringHelper* a, const __FlashStringHelper* b);
111 
112 bool compareEqual(const __FlashStringHelper* a, const String& b);
113 
114 bool compareEqual(const String& a, const char* b);
115 
116 bool compareEqual(const String& a, const String& b);
117 
118 bool compareEqual(const String& a, const __FlashStringHelper* b);
119 
120 // compareLess()
121 
122 bool compareLess(bool a, bool b);
123 
124 bool compareLess(char a, char b);
125 
126 bool compareLess(int a, int b);
127 
128 bool compareLess(unsigned int a, unsigned int b);
129 
130 bool compareLess(long a, long b);
131 
132 bool compareLess(unsigned long a, unsigned long b);
133 
134 bool compareLess(double a, double b);
135 
136 bool compareLess(const char* a, const char* b);
137 
138 bool compareLess(const char* a, const String& b);
139 
140 bool compareLess(const char* a, const __FlashStringHelper* b);
141 
142 bool compareLess(const __FlashStringHelper* a, const char* b);
143 
144 bool compareLess(const __FlashStringHelper* a, const __FlashStringHelper* b);
145 
146 bool compareLess(const __FlashStringHelper* a, const String& b);
147 
148 bool compareLess(const String& a, const char* b);
149 
150 bool compareLess(const String& a, const String& b);
151 
152 bool compareLess(const String& a, const __FlashStringHelper* b);
153 
154 // compareMore()
155 
156 bool compareMore(bool a, bool b);
157 
158 bool compareMore(char a, char b);
159 
160 bool compareMore(int a, int b);
161 
162 bool compareMore(unsigned int a, unsigned int b);
163 
164 bool compareMore(long a, long b);
165 
166 bool compareMore(unsigned long a, unsigned long b);
167 
168 bool compareMore(double a, double b);
169 
170 bool compareMore(const char* a, const char* b);
171 
172 bool compareMore(const char* a, const String& b);
173 
174 bool compareMore(const char* a, const __FlashStringHelper* b);
175 
176 bool compareMore(const __FlashStringHelper* a, const char* b);
177 
178 bool compareMore(const __FlashStringHelper* a, const __FlashStringHelper* b);
179 
180 bool compareMore(const __FlashStringHelper* a, const String& b);
181 
182 bool compareMore(const String& a, const char* b);
183 
184 bool compareMore(const String& a, const String& b);
185 
186 bool compareMore(const String& a, const __FlashStringHelper* b);
187 
188 // compareLessOrEqual
189 
190 bool compareLessOrEqual(bool a, bool b);
191 
192 bool compareLessOrEqual(char a, char b);
193 
194 bool compareLessOrEqual(int a, int b);
195 
196 bool compareLessOrEqual(unsigned int a, unsigned int b);
197 
198 bool compareLessOrEqual(long a, long b);
199 
200 bool compareLessOrEqual(unsigned long a, unsigned long b);
201 
202 bool compareLessOrEqual(double a, double b);
203 
204 bool compareLessOrEqual(const char* a, const char* b);
205 
206 bool compareLessOrEqual(const char* a, const String& b);
207 
208 bool compareLessOrEqual(const char* a, const __FlashStringHelper* b);
209 
210 bool compareLessOrEqual(const __FlashStringHelper* a, const char* b);
211 
212 bool compareLessOrEqual(
213  const __FlashStringHelper* a, const __FlashStringHelper* b);
214 
215 bool compareLessOrEqual(const __FlashStringHelper* a, const String& b);
216 
217 bool compareLessOrEqual(const String& a, const char* b);
218 
219 bool compareLessOrEqual(const String& a, const String& b);
220 
221 bool compareLessOrEqual(const String& a, const __FlashStringHelper* b);
222 
223 // compareMoreOrEqual
224 
225 bool compareMoreOrEqual(bool a, bool b);
226 
227 bool compareMoreOrEqual(char a, char b);
228 
229 bool compareMoreOrEqual(int a, int b);
230 
231 bool compareMoreOrEqual(unsigned int a, unsigned int b);
232 
233 bool compareMoreOrEqual(long a, long b);
234 
235 bool compareMoreOrEqual(unsigned long a, unsigned long b);
236 
237 bool compareMoreOrEqual(double a, double b);
238 
239 bool compareMoreOrEqual(const char* a, const char* b);
240 
241 bool compareMoreOrEqual(const char* a, const String& b);
242 
243 bool compareMoreOrEqual(const char* a, const __FlashStringHelper* b);
244 
245 bool compareMoreOrEqual(const __FlashStringHelper* a, const char* b);
246 
247 bool compareMoreOrEqual(
248  const __FlashStringHelper* a, const __FlashStringHelper* b);
249 
250 bool compareMoreOrEqual(const __FlashStringHelper* a, const String& b);
251 
252 bool compareMoreOrEqual(const String& a, const char* b);
253 
254 bool compareMoreOrEqual(const String& a, const String& b);
255 
256 bool compareMoreOrEqual(const String& a, const __FlashStringHelper* b);
257 
258 // compareNotEqual
259 
260 bool compareNotEqual(bool a, bool b);
261 
262 bool compareNotEqual(char a, char b);
263 
264 bool compareNotEqual(int a, int b);
265 
266 bool compareNotEqual(unsigned int a, unsigned int b);
267 
268 bool compareNotEqual(long a, long b);
269 
270 bool compareNotEqual(unsigned long a, unsigned long b);
271 
272 bool compareNotEqual(double a, double b);
273 
274 bool compareNotEqual(const char* a, const char* b);
275 
276 bool compareNotEqual(const char* a, const String& b);
277 
278 bool compareNotEqual(const char* a, const __FlashStringHelper* b);
279 
280 bool compareNotEqual(const __FlashStringHelper* a, const char* b);
281 
282 bool compareNotEqual(
283  const __FlashStringHelper* a, const __FlashStringHelper* b);
284 
285 bool compareNotEqual(const __FlashStringHelper* a, const String& b);
286 
287 bool compareNotEqual(const String& a, const char* b);
288 
289 bool compareNotEqual(const String& a, const String& b);
290 
291 bool compareNotEqual(const String& a, const __FlashStringHelper* b);
292 
293 }
294 
295 #endif
+
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
25 // Significant portions of the design and implementation of this file came from
26 // https://github.com/mmurdoch/arduinounit/blob/master/src/ArduinoUnitUtility/Compare.h
27 
28 #ifndef AUNIT_COMPARE_H
29 #define AUNIT_COMPARE_H
30 
31 #include <stddef.h> // size_t
32 
33 class String;
34 class __FlashStringHelper;
35 
36 namespace aunit {
37 namespace internal {
38 
39 class FCString;
40 
41 // compareString()
42 
43 int compareString(const char* a, const char* b);
44 
45 int compareString(const char* a, const String& b);
46 
47 int compareString(const char* a, const __FlashStringHelper* b);
48 
49 int compareString(const String& a, const char* b);
50 
51 int compareString(const String& a, const String& b);
52 
53 int compareString(const String& a, const __FlashStringHelper* b);
54 
55 int compareString(const __FlashStringHelper* a, const char* b);
56 
57 int compareString(const __FlashStringHelper* a, const __FlashStringHelper* b);
58 
59 int compareString(const __FlashStringHelper* a, const String& b);
60 
61 int compareString(const FCString& a, const FCString& b);
62 
63 // compareStringN()
64 //
65 // These methods are used to implement the TestRunner::exclude() and
66 // TestRunner::include() features.
67 
69 int compareStringN(const char* a, const char* b, size_t n);
70 
72 int compareStringN(const char* a, const __FlashStringHelper* b, size_t n);
73 
75 int compareStringN(const __FlashStringHelper* a, const char* b, size_t n);
76 
78 int compareStringN(const __FlashStringHelper* a, const __FlashStringHelper* b,
79  size_t n);
80 
82 int compareStringN(const FCString& a, const char* b, size_t n);
83 
85 int compareStringN(const FCString& a, const __FlashStringHelper* b, size_t n);
86 
87 // compareEqual()
88 
89 bool compareEqual(bool a, bool b);
90 
91 bool compareEqual(char a, char b);
92 
93 bool compareEqual(int a, int b);
94 
95 bool compareEqual(unsigned int a, unsigned int b);
96 
97 bool compareEqual(long a, long b);
98 
99 bool compareEqual(unsigned long a, unsigned long b);
100 
101 bool compareEqual(double a, double b);
102 
103 bool compareEqual(const char* a, const char* b);
104 
105 bool compareEqual(const char* a, const String& b);
106 
107 bool compareEqual(const char* a, const __FlashStringHelper* b);
108 
109 bool compareEqual(const __FlashStringHelper* a, const char* b);
110 
111 bool compareEqual( const __FlashStringHelper* a, const __FlashStringHelper* b);
112 
113 bool compareEqual(const __FlashStringHelper* a, const String& b);
114 
115 bool compareEqual(const String& a, const char* b);
116 
117 bool compareEqual(const String& a, const String& b);
118 
119 bool compareEqual(const String& a, const __FlashStringHelper* b);
120 
121 // compareLess()
122 
123 bool compareLess(bool a, bool b);
124 
125 bool compareLess(char a, char b);
126 
127 bool compareLess(int a, int b);
128 
129 bool compareLess(unsigned int a, unsigned int b);
130 
131 bool compareLess(long a, long b);
132 
133 bool compareLess(unsigned long a, unsigned long b);
134 
135 bool compareLess(double a, double b);
136 
137 bool compareLess(const char* a, const char* b);
138 
139 bool compareLess(const char* a, const String& b);
140 
141 bool compareLess(const char* a, const __FlashStringHelper* b);
142 
143 bool compareLess(const __FlashStringHelper* a, const char* b);
144 
145 bool compareLess(const __FlashStringHelper* a, const __FlashStringHelper* b);
146 
147 bool compareLess(const __FlashStringHelper* a, const String& b);
148 
149 bool compareLess(const String& a, const char* b);
150 
151 bool compareLess(const String& a, const String& b);
152 
153 bool compareLess(const String& a, const __FlashStringHelper* b);
154 
155 // compareMore()
156 
157 bool compareMore(bool a, bool b);
158 
159 bool compareMore(char a, char b);
160 
161 bool compareMore(int a, int b);
162 
163 bool compareMore(unsigned int a, unsigned int b);
164 
165 bool compareMore(long a, long b);
166 
167 bool compareMore(unsigned long a, unsigned long b);
168 
169 bool compareMore(double a, double b);
170 
171 bool compareMore(const char* a, const char* b);
172 
173 bool compareMore(const char* a, const String& b);
174 
175 bool compareMore(const char* a, const __FlashStringHelper* b);
176 
177 bool compareMore(const __FlashStringHelper* a, const char* b);
178 
179 bool compareMore(const __FlashStringHelper* a, const __FlashStringHelper* b);
180 
181 bool compareMore(const __FlashStringHelper* a, const String& b);
182 
183 bool compareMore(const String& a, const char* b);
184 
185 bool compareMore(const String& a, const String& b);
186 
187 bool compareMore(const String& a, const __FlashStringHelper* b);
188 
189 // compareLessOrEqual
190 
191 bool compareLessOrEqual(bool a, bool b);
192 
193 bool compareLessOrEqual(char a, char b);
194 
195 bool compareLessOrEqual(int a, int b);
196 
197 bool compareLessOrEqual(unsigned int a, unsigned int b);
198 
199 bool compareLessOrEqual(long a, long b);
200 
201 bool compareLessOrEqual(unsigned long a, unsigned long b);
202 
203 bool compareLessOrEqual(double a, double b);
204 
205 bool compareLessOrEqual(const char* a, const char* b);
206 
207 bool compareLessOrEqual(const char* a, const String& b);
208 
209 bool compareLessOrEqual(const char* a, const __FlashStringHelper* b);
210 
211 bool compareLessOrEqual(const __FlashStringHelper* a, const char* b);
212 
213 bool compareLessOrEqual(
214  const __FlashStringHelper* a, const __FlashStringHelper* b);
215 
216 bool compareLessOrEqual(const __FlashStringHelper* a, const String& b);
217 
218 bool compareLessOrEqual(const String& a, const char* b);
219 
220 bool compareLessOrEqual(const String& a, const String& b);
221 
222 bool compareLessOrEqual(const String& a, const __FlashStringHelper* b);
223 
224 // compareMoreOrEqual
225 
226 bool compareMoreOrEqual(bool a, bool b);
227 
228 bool compareMoreOrEqual(char a, char b);
229 
230 bool compareMoreOrEqual(int a, int b);
231 
232 bool compareMoreOrEqual(unsigned int a, unsigned int b);
233 
234 bool compareMoreOrEqual(long a, long b);
235 
236 bool compareMoreOrEqual(unsigned long a, unsigned long b);
237 
238 bool compareMoreOrEqual(double a, double b);
239 
240 bool compareMoreOrEqual(const char* a, const char* b);
241 
242 bool compareMoreOrEqual(const char* a, const String& b);
243 
244 bool compareMoreOrEqual(const char* a, const __FlashStringHelper* b);
245 
246 bool compareMoreOrEqual(const __FlashStringHelper* a, const char* b);
247 
248 bool compareMoreOrEqual(
249  const __FlashStringHelper* a, const __FlashStringHelper* b);
250 
251 bool compareMoreOrEqual(const __FlashStringHelper* a, const String& b);
252 
253 bool compareMoreOrEqual(const String& a, const char* b);
254 
255 bool compareMoreOrEqual(const String& a, const String& b);
256 
257 bool compareMoreOrEqual(const String& a, const __FlashStringHelper* b);
258 
259 // compareNotEqual
260 
261 bool compareNotEqual(bool a, bool b);
262 
263 bool compareNotEqual(char a, char b);
264 
265 bool compareNotEqual(int a, int b);
266 
267 bool compareNotEqual(unsigned int a, unsigned int b);
268 
269 bool compareNotEqual(long a, long b);
270 
271 bool compareNotEqual(unsigned long a, unsigned long b);
272 
273 bool compareNotEqual(double a, double b);
274 
275 bool compareNotEqual(const char* a, const char* b);
276 
277 bool compareNotEqual(const char* a, const String& b);
278 
279 bool compareNotEqual(const char* a, const __FlashStringHelper* b);
280 
281 bool compareNotEqual(const __FlashStringHelper* a, const char* b);
282 
283 bool compareNotEqual(
284  const __FlashStringHelper* a, const __FlashStringHelper* b);
285 
286 bool compareNotEqual(const __FlashStringHelper* a, const String& b);
287 
288 bool compareNotEqual(const String& a, const char* b);
289 
290 bool compareNotEqual(const String& a, const String& b);
291 
292 bool compareNotEqual(const String& a, const __FlashStringHelper* b);
293 
294 }
295 }
296 
297 #endif
diff --git a/docs/html/FCString_8h_source.html b/docs/html/FCString_8h_source.html index acb44b6..f3ec9b1 100644 --- a/docs/html/FCString_8h_source.html +++ b/docs/html/FCString_8h_source.html @@ -3,9 +3,9 @@ - + -AUnit: /Users/brian/dev/AUnit/src/aunit/FCString.h Source File +AUnit: /home/brian/dev/AUnit/src/aunit/FCString.h Source File @@ -22,7 +22,7 @@
AUnit -  0.4.1 +  0.5.0
Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
@@ -31,21 +31,18 @@
- + +
FCString.h
-
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
25 #ifndef AUNIT_FSTRING_H
26 #define AUNIT_FSTRING_H
27 
28 #include <stdint.h>
29 
30 class __FlashStringHelper;
31 
32 namespace aunit {
33 
50 class FCString {
51  public:
52  static const uint8_t kCStringType = 0;
53  static const uint8_t kFStringType = 1;
54 
55  FCString() {}
56 
57  explicit FCString(const char* s):
58  mStringType(kCStringType) {
59  mString.cstring = s;
60  }
61 
62  explicit FCString(const __FlashStringHelper* s):
63  mStringType(kFStringType) {
64  mString.fstring = s;
65  }
66 
67  uint8_t getType() const { return mStringType; }
68 
69  const char* getCString() const { return mString.cstring; }
70 
71  const __FlashStringHelper* getFString() const { return mString.fstring; }
72 
73  private:
74  union {
75  const char* cstring;
76  const __FlashStringHelper* fstring;
77  } mString;
78 
79  uint8_t mStringType;
80 };
81 
82 }
83 
84 #endif
-
A union of (const char*) and (const __FlashStringHelper*) with a discriminator.
Definition: FCString.h:50
+
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
25 #ifndef AUNIT_FSTRING_H
26 #define AUNIT_FSTRING_H
27 
28 #include <stdint.h>
29 
30 class __FlashStringHelper;
31 
32 namespace aunit {
33 namespace internal {
34 
51 class FCString {
52  public:
53  static const uint8_t kCStringType = 0;
54  static const uint8_t kFStringType = 1;
55 
56  FCString() {}
57 
58  explicit FCString(const char* s):
59  mStringType(kCStringType) {
60  mString.cstring = s;
61  }
62 
63  explicit FCString(const __FlashStringHelper* s):
64  mStringType(kFStringType) {
65  mString.fstring = s;
66  }
67 
68  uint8_t getType() const { return mStringType; }
69 
70  const char* getCString() const { return mString.cstring; }
71 
72  const __FlashStringHelper* getFString() const { return mString.fstring; }
73 
74  private:
75  union {
76  const char* cstring;
77  const __FlashStringHelper* fstring;
78  } mString;
79 
80  uint8_t mStringType;
81 };
82 
83 }
84 }
85 
86 #endif
A union of (const char*) and (const __FlashStringHelper*) with a discriminator.
Definition: FCString.h:51
+
diff --git a/docs/html/Flash_8h.html b/docs/html/Flash_8h.html new file mode 100644 index 0000000..1c63e6f --- /dev/null +++ b/docs/html/Flash_8h.html @@ -0,0 +1,136 @@ + + + + + + + +AUnit: /home/brian/dev/AUnit/src/aunit/Flash.h File Reference + + + + + + + + + +
+
+ + + + + + +
+
AUnit +  0.5.0 +
+
Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Flash.h File Reference
+
+
+ +

Flash strings (using F() macro) on the ESP8266 platform cannot be placed in an inline context, because it interferes with other PROGMEM strings in non-inline contexts. +More...

+
#include <avr/pgmspace.h>
+
+Include dependency graph for Flash.h:
+
+
+ + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + + + + + + + + + + + + +
+
+

Go to the source code of this file.

+ + + + + + +

+Macros

+#define FPSTR(pstr_pointer)   (reinterpret_cast<const __FlashStringHelper *>(pstr_pointer))
 
+#define AUNIT_F(x)   F(x)
 
+ + + +

+Typedefs

+typedef const __FlashStringHelper * aunit::internal::FlashStringType
 
+

Detailed Description

+

Flash strings (using F() macro) on the ESP8266 platform cannot be placed in an inline context, because it interferes with other PROGMEM strings in non-inline contexts.

+

See https://github.com/esp8266/Arduino/issues/3369. In some cases (e.g. TestMacros.h), we were able to move the F() macro into a non-inline context. But in other cases (e.g. AssertVerboseMacros.h) it is impossible to move these out of inline contexts because we want to support assertXxx() statements inside inlined methods. We use normal (const char*) strings instead of flash strings in those places instead.

+ +

Definition in file Flash.h.

+
+ + + + diff --git a/docs/html/Flash_8h__dep__incl.map b/docs/html/Flash_8h__dep__incl.map new file mode 100644 index 0000000..05bdff7 --- /dev/null +++ b/docs/html/Flash_8h__dep__incl.map @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/docs/html/Flash_8h__dep__incl.md5 b/docs/html/Flash_8h__dep__incl.md5 new file mode 100644 index 0000000..9f4aa5d --- /dev/null +++ b/docs/html/Flash_8h__dep__incl.md5 @@ -0,0 +1 @@ +9ef1d03cb06647d7c49b1b89f649f5fc \ No newline at end of file diff --git a/docs/html/Flash_8h__dep__incl.png b/docs/html/Flash_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..04e6943ca5431e3613e02fb35d88d0fd4a5efc95 GIT binary patch literal 99863 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 Syc!7jNA9t*REdPK-~R + diff --git a/docs/html/Flash_8h__incl.md5 b/docs/html/Flash_8h__incl.md5 new file mode 100644 index 0000000..381e99e --- /dev/null +++ b/docs/html/Flash_8h__incl.md5 @@ -0,0 +1 @@ +4519ce2258c0fd8b250d55483258a4be \ No newline at end of file diff --git a/docs/html/Flash_8h__incl.png b/docs/html/Flash_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..e6ef18763d10dd0359f64f430052871cb2cb1769 GIT binary patch literal 5163 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 + + + + + + +AUnit: /home/brian/dev/AUnit/src/aunit/Flash.h Source File + + + + + + + + + +

+
+ + + + + + +
+
AUnit +  0.5.0 +
+
Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Flash.h
+
+
+Go to the documentation of this file.
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
38 #ifndef AUNIT_FLASH_H
39 #define AUNIT_FLASH_H
40 
41 class __FlashStringHelper;
42 
43 #ifdef ESP8266
44  #include <pgmspace.h>
45 #else
46  #include <avr/pgmspace.h>
47 #endif
48 
49 // Defined in ESP8266, not defined in AVR or Teensy
50 #ifndef FPSTR
51  #define FPSTR(pstr_pointer) \
52  (reinterpret_cast<const __FlashStringHelper *>(pstr_pointer))
53 #endif
54 
55 // These are used only in AssertionVerboseMacros.h and the "Verbose" methods of
56 // Assertion.h because ESP8266 cannot handle F() strings in both inline and
57 // non-inlnie contexts. So don't use F() strings on ESP8266.
58 #ifdef ESP8266
59  #define AUNIT_F(x) (x)
60  namespace aunit {
61  namespace internal {
62  typedef const char* FlashStringType;
63  }
64  }
65 #else
66  #define AUNIT_F(x) F(x)
67  namespace aunit {
68  namespace internal {
69  typedef const __FlashStringHelper* FlashStringType;
70  }
71  }
72 #endif
73 
74 #endif
+
+ + + + diff --git a/docs/html/MetaAssertion_8h.html b/docs/html/MetaAssertMacros_8h.html similarity index 59% rename from docs/html/MetaAssertion_8h.html rename to docs/html/MetaAssertMacros_8h.html index 857dcaf..2ac9546 100644 --- a/docs/html/MetaAssertion_8h.html +++ b/docs/html/MetaAssertMacros_8h.html @@ -3,9 +3,9 @@ - + -AUnit: /Users/brian/dev/AUnit/src/aunit/MetaAssertion.h File Reference +AUnit: /home/brian/dev/AUnit/src/aunit/MetaAssertMacros.h File Reference @@ -22,7 +22,7 @@
AUnit -  0.4.1 +  0.5.0
Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
@@ -31,21 +31,18 @@
- + +
-
MetaAssertion.h File Reference
+
MetaAssertMacros.h File Reference
-

Various assertTestXxx() and checkTestXxx() macros are defined in this header. +

Various assertTestXxx(), checkTestXxx(), assertTestXxxF() and checkTestXxxF() macros are defined in this header. More...

-
#include "Printer.h"
-#include "Assertion.h"
-
-Include dependency graph for MetaAssertion.h:
-
-
- - - - - - - -
-
+
This graph shows which files directly or indirectly include this file:
-
- - - - - - - - +
+ + +
-

Go to the source code of this file.

+

Go to the source code of this file.

- - - - -

-Classes

class  aunit::MetaAssertion
 Class that extends the Assertion class to support the checkTestXxx() and assertTestXxx() macros that look at the status of the named test. More...
 
- + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Macros

#define checkTestDone(name)   (test_##name##_instance.isDone())
#define checkTestDone(name)   (test_##name##_instance.isDone())
 Return true if test 'name' is done. More...
 
#define checkTestNotDone(name)   (test_##name##_instance.isNotDone())
#define checkTestNotDone(name)   (test_##name##_instance.isNotDone())
 Return true if test 'name' is not done. More...
 
#define checkTestPass(name)   (test_##name##_instance.isPassed())
#define checkTestPass(name)   (test_##name##_instance.isPassed())
 Return true if test 'name' has passed. More...
 
#define checkTestNotPass(name)   (test_##name##_instance.isNotPassed())
#define checkTestNotPass(name)   (test_##name##_instance.isNotPassed())
 Return true if test 'name' has not passed. More...
 
#define checkTestFail(name)   (test_##name##_instance.isFailed())
#define checkTestFail(name)   (test_##name##_instance.isFailed())
 Return true if test 'name' has failed. More...
 
#define checkTestNotFail(name)   (test_##name##_instance.isNotFailed())
#define checkTestNotFail(name)   (test_##name##_instance.isNotFailed())
 Return true if test 'name' has not failed. More...
 
#define checkTestSkip(name)   (test_##name##_instance.isSkipped())
#define checkTestSkip(name)   (test_##name##_instance.isSkipped())
 Return true if test 'name' has been skipped. More...
 
#define checkTestNotSkip(name)   (test_##name##_instance.isNotSkipped())
#define checkTestNotSkip(name)   (test_##name##_instance.isNotSkipped())
 Return true if test 'name' has not been skipped. More...
 
#define checkTestExpire(name)   (test_##name##_instance.isExpired())
#define checkTestExpire(name)   (test_##name##_instance.isExpired())
 Return true if test 'name' has timed out. More...
 
#define checkTestNotExpire(name)   (test_##name##_instance.isNotExpired())
#define checkTestNotExpire(name)   (test_##name##_instance.isNotExpired())
 Return true if test 'name' has not timed out. More...
 
#define assertTestDone(name)   assertTestStatus(name, isDone, kMessageDone)
#define assertTestDone(name)   assertTestStatusInternal(name, isDone, kMessageDone)
 Assert that test 'name' is done. More...
 
#define assertTestNotDone(name)   assertTestStatus(name, isNotDone, kMessageNotDone)
#define assertTestNotDone(name)   assertTestStatusInternal(name, isNotDone, kMessageNotDone)
 Assert that test 'name' is not done. More...
 
#define assertTestPass(name)   assertTestStatus(name, isPassed, kMessagePassed)
#define assertTestPass(name)   assertTestStatusInternal(name, isPassed, kMessagePassed)
 Assert that test 'name' has passed. More...
 
#define assertTestNotPass(name)   assertTestStatus(name, isNotPassed, kMessageNotPassed)
#define assertTestNotPass(name)   assertTestStatusInternal(name, isNotPassed, kMessageNotPassed)
 Assert that test 'name' has not passed. More...
 
#define assertTestFail(name)   assertTestStatus(name, isFailed, kMessageFailed)
#define assertTestFail(name)   assertTestStatusInternal(name, isFailed, kMessageFailed)
 Assert that test 'name' has failed. More...
 
#define assertTestNotFail(name)   assertTestStatus(name, isNotFailed, kMessageNotFailed)
#define assertTestNotFail(name)   assertTestStatusInternal(name, isNotFailed, kMessageNotFailed)
 Assert that test 'name' has not failed. More...
 
#define assertTestSkip(name)   assertTestStatus(name, isSkipped, kMessageSkipped)
#define assertTestSkip(name)   assertTestStatusInternal(name, isSkipped, kMessageSkipped)
 Assert that test 'name' has been skipped. More...
 
#define assertTestNotSkip(name)   assertTestStatus(name, isNotSkipped, kMessageNotSkipped)
#define assertTestNotSkip(name)   assertTestStatusInternal(name, isNotSkipped, kMessageNotSkipped)
 Assert that test 'name' has not been skipped. More...
 
#define assertTestExpire(name)   assertTestStatus(name, isExpired, kMessageExpired)
#define assertTestExpire(name)   assertTestStatusInternal(name, isExpired, kMessageExpired)
 Assert that test 'name' has timed out. More...
 
#define assertTestNotExpire(name)   assertTestStatus(name, isNotExpired, kMessageNotExpired)
#define assertTestNotExpire(name)   assertTestStatusInternal(name, isNotExpired, kMessageNotExpired)
 Assert that test 'name' has not timed out. More...
 
#define assertTestStatus(name, method, message)
 Internal helper macro, shouldn't be called directly by users. More...
 
#define checkTestDoneF(test_class, name)   (test_class##_##name##_instance.isDone())
 Return true if test 'name' is done. More...
 
#define checkTestNotDoneF(test_class, name)   (test_class##_##name##_instance.isNotDone())
 Return true if test 'name' is not done. More...
 
#define checkTestPassF(test_class, name)   (test_class##_##name##_instance.isPassed())
 Return true if test 'name' has passed. More...
 
#define checkTestNotPassF(test_class, name)   (test_class##_##name##_instance.isNotPassed())
 Return true if test 'name' has not passed. More...
 
#define checkTestFailF(test_class, name)   (test_class##_##name##_instance.isFailed())
 Return true if test 'name' has failed. More...
 
#define checkTestNotFailF(test_class, name)   (test_class##_##name##_instance.isNotFailed())
 Return true if test 'name' has not failed. More...
 
#define checkTestSkipF(test_class, name)   (test_class##_##name##_instance.isSkipped())
 Return true if test 'name' has been skipped. More...
 
#define checkTestNotSkipF(test_class, name)   (test_class##_##name##_instance.isNotSkipped())
 Return true if test 'name' has not been skipped. More...
 
#define checkTestExpireF(test_class, name)   (test_class##_##name##_instance.isExpired())
 Return true if test 'name' has timed out. More...
 
#define checkTestNotExpireF(test_class, name)   (test_class##_##name##_instance.isNotExpired())
 Return true if test 'name' has not timed out. More...
 
#define assertTestDoneF(test_class, name)   assertTestStatusF(test_class, name, isDone, kMessageDone)
 Assert that test 'name' is done. More...
 
#define assertTestNotDoneF(test_class, name)   assertTestStatusF(test_class, name, isNotDone, kMessageNotDone)
 Assert that test 'name' is not done. More...
 
#define assertTestPassF(test_class, name)   assertTestStatusF(test_class, name, isPassed, kMessagePassed)
 Assert that test 'name' has passed. More...
 
#define assertTestNotPassF(test_class, name)   assertTestStatusF(test_class, name, isNotPassed, kMessageNotPassed)
 Assert that test 'name' has not passed. More...
 
#define assertTestFailF(test_class, name)   assertTestStatusF(test_class, name, isFailed, kMessageFailed)
 Assert that test 'name' has failed. More...
 
#define assertTestNotFailF(test_class, name)   assertTestStatusF(test_class, name, isNotFailed, kMessageNotFailed)
 Assert that test 'name' has not failed. More...
 
#define assertTestSkipF(test_class, name)   assertTestStatusF(test_class, name, isSkipped, kMessageSkipped)
 Assert that test 'name' has been skipped. More...
 
#define assertTestNotSkipF(test_class, name)   assertTestStatusF(test_class, name, isNotSkipped, kMessageNotSkipped)
 Assert that test 'name' has not been skipped. More...
 
#define assertTestExpireF(test_class, name)   assertTestStatusF(test_class, name, isExpired, kMessageExpired)
 Assert that test 'name' has timed out. More...
 
#define assertTestNotExpireF(test_class, name)   assertTestStatusF(test_class, name, isNotExpired, kMessageNotExpired)
 Assert that test 'name' has not timed out. More...
 
#define assertTestStatusF(test_class, name, method, message)
 Internal helper macro, shouldn't be called directly by users. More...
 
#define assertTestStatusInternal(name, method, message)
 Internal helper macro, shouldn't be called directly by users. More...
 
#define checkTestDoneF(testClass, name)   (testClass##_##name##_instance.isDone())
 Return true if test 'name' is done. More...
 
#define checkTestNotDoneF(testClass, name)   (testClass##_##name##_instance.isNotDone())
 Return true if test 'name' is not done. More...
 
#define checkTestPassF(testClass, name)   (testClass##_##name##_instance.isPassed())
 Return true if test 'name' has passed. More...
 
#define checkTestNotPassF(testClass, name)   (testClass##_##name##_instance.isNotPassed())
 Return true if test 'name' has not passed. More...
 
#define checkTestFailF(testClass, name)   (testClass##_##name##_instance.isFailed())
 Return true if test 'name' has failed. More...
 
#define checkTestNotFailF(testClass, name)   (testClass##_##name##_instance.isNotFailed())
 Return true if test 'name' has not failed. More...
 
#define checkTestSkipF(testClass, name)   (testClass##_##name##_instance.isSkipped())
 Return true if test 'name' has been skipped. More...
 
#define checkTestNotSkipF(testClass, name)   (testClass##_##name##_instance.isNotSkipped())
 Return true if test 'name' has not been skipped. More...
 
#define checkTestExpireF(testClass, name)   (testClass##_##name##_instance.isExpired())
 Return true if test 'name' has timed out. More...
 
#define checkTestNotExpireF(testClass, name)   (testClass##_##name##_instance.isNotExpired())
 Return true if test 'name' has not timed out. More...
 
#define assertTestDoneF(testClass, name)   assertTestStatusInternalF(testClass, name, isDone, kMessageDone)
 Assert that test 'name' is done. More...
 
#define assertTestNotDoneF(testClass, name)   assertTestStatusInternalF(testClass, name, isNotDone, kMessageNotDone)
 Assert that test 'name' is not done. More...
 
#define assertTestPassF(testClass, name)   assertTestStatusInternalF(testClass, name, isPassed, kMessagePassed)
 Assert that test 'name' has passed. More...
 
#define assertTestNotPassF(testClass, name)   assertTestStatusInternalF(testClass, name, isNotPassed, kMessageNotPassed)
 Assert that test 'name' has not passed. More...
 
#define assertTestFailF(testClass, name)   assertTestStatusInternalF(testClass, name, isFailed, kMessageFailed)
 Assert that test 'name' has failed. More...
 
#define assertTestNotFailF(testClass, name)   assertTestStatusInternalF(testClass, name, isNotFailed, kMessageNotFailed)
 Assert that test 'name' has not failed. More...
 
#define assertTestSkipF(testClass, name)   assertTestStatusInternalF(testClass, name, isSkipped, kMessageSkipped)
 Assert that test 'name' has been skipped. More...
 
#define assertTestNotSkipF(testClass, name)
 Assert that test 'name' has not been skipped. More...
 
#define assertTestExpireF(testClass, name)   assertTestStatusInternalF(testClass, name, isExpired, kMessageExpired)
 Assert that test 'name' has timed out. More...
 
#define assertTestNotExpireF(testClass, name)
 Assert that test 'name' has not timed out. More...
 
#define assertTestStatusInternalF(testClass, name, method, message)
 Internal helper macro, shouldn't be called directly by users. More...
 

Detailed Description

-

Various assertTestXxx() and checkTestXxx() macros are defined in this header.

+

Various assertTestXxx(), checkTestXxx(), assertTestXxxF() and checkTestXxxF() macros are defined in this header.

-

Definition in file MetaAssertion.h.

+

Definition in file MetaAssertMacros.h.

Macro Definition Documentation

◆ assertTestDone

@@ -259,19 +230,19 @@

  name) -    assertTestStatus(name, isDone, kMessageDone) +    assertTestStatusInternal(name, isDone, kMessageDone)

Assert that test 'name' is done.

-

Definition at line 79 of file MetaAssertion.h.

+

Definition at line 75 of file MetaAssertMacros.h.

- -

◆ assertTestDoneF

+ +

◆ assertTestDoneF

@@ -280,7 +251,7 @@

#define assertTestDoneF (   - test_class, + testClass, @@ -291,14 +262,14 @@

assertTestStatusF(test_class, name, isDone, kMessageDone) +    assertTestStatusInternalF(testClass, name, isDone, kMessageDone)

Assert that test 'name' is done.

-

Definition at line 172 of file MetaAssertion.h.

+

Definition at line 168 of file MetaAssertMacros.h.

@@ -313,19 +284,19 @@

  name) -    assertTestStatus(name, isExpired, kMessageExpired) +    assertTestStatusInternal(name, isExpired, kMessageExpired)

Assert that test 'name' has timed out.

-

Definition at line 111 of file MetaAssertion.h.

+

Definition at line 107 of file MetaAssertMacros.h.

- -

◆ assertTestExpireF

+ +

◆ assertTestExpireF

@@ -334,7 +305,7 @@

#define assertTestExpireF (   - test_class, + testClass, @@ -345,14 +316,14 @@

assertTestStatusF(test_class, name, isExpired, kMessageExpired) +    assertTestStatusInternalF(testClass, name, isExpired, kMessageExpired)

Assert that test 'name' has timed out.

-

Definition at line 204 of file MetaAssertion.h.

+

Definition at line 201 of file MetaAssertMacros.h.

@@ -367,19 +338,19 @@

  name) -    assertTestStatus(name, isFailed, kMessageFailed) +    assertTestStatusInternal(name, isFailed, kMessageFailed)

Assert that test 'name' has failed.

-

Definition at line 95 of file MetaAssertion.h.

+

Definition at line 91 of file MetaAssertMacros.h.

- -

◆ assertTestFailF

+ +

◆ assertTestFailF

@@ -388,7 +359,7 @@

#define assertTestFailF (   - test_class, + testClass, @@ -399,14 +370,14 @@

assertTestStatusF(test_class, name, isFailed, kMessageFailed) +    assertTestStatusInternalF(testClass, name, isFailed, kMessageFailed)

Assert that test 'name' has failed.

-

Definition at line 188 of file MetaAssertion.h.

+

Definition at line 184 of file MetaAssertMacros.h.

@@ -421,19 +392,19 @@

  name) -    assertTestStatus(name, isNotDone, kMessageNotDone) +    assertTestStatusInternal(name, isNotDone, kMessageNotDone)

Assert that test 'name' is not done.

-

Definition at line 83 of file MetaAssertion.h.

+

Definition at line 79 of file MetaAssertMacros.h.

- -

◆ assertTestNotDoneF

+ +

◆ assertTestNotDoneF

@@ -442,7 +413,7 @@

#define assertTestNotDoneF (   - test_class, + testClass, @@ -453,14 +424,14 @@

assertTestStatusF(test_class, name, isNotDone, kMessageNotDone) +    assertTestStatusInternalF(testClass, name, isNotDone, kMessageNotDone)

Assert that test 'name' is not done.

-

Definition at line 176 of file MetaAssertion.h.

+

Definition at line 172 of file MetaAssertMacros.h.

@@ -475,19 +446,19 @@

  name) -    assertTestStatus(name, isNotExpired, kMessageNotExpired) +    assertTestStatusInternal(name, isNotExpired, kMessageNotExpired)

Assert that test 'name' has not timed out.

-

Definition at line 115 of file MetaAssertion.h.

+

Definition at line 111 of file MetaAssertMacros.h.

- -

◆ assertTestNotExpireF

+ +

◆ assertTestNotExpireF

@@ -496,7 +467,7 @@

#define assertTestNotExpireF (   - test_class, + testClass, @@ -507,14 +478,15 @@

assertTestStatusF(test_class, name, isNotExpired, kMessageNotExpired) +

- +Value:
assertTestStatusInternalF(testClass, name, isNotExpired, \
kMessageNotExpired)
#define assertTestStatusInternalF(testClass, name, method, message)
Internal helper macro, shouldn&#39;t be called directly by users.
+

Assert that test 'name' has not timed out.

-

Definition at line 208 of file MetaAssertion.h.

+

Definition at line 205 of file MetaAssertMacros.h.

@@ -529,19 +501,19 @@

  name) -    assertTestStatus(name, isNotFailed, kMessageNotFailed) +    assertTestStatusInternal(name, isNotFailed, kMessageNotFailed)

Assert that test 'name' has not failed.

-

Definition at line 99 of file MetaAssertion.h.

+

Definition at line 95 of file MetaAssertMacros.h.

- -

◆ assertTestNotFailF

+ +

◆ assertTestNotFailF

@@ -550,7 +522,7 @@

#define assertTestNotFailF (   - test_class, + testClass, @@ -561,14 +533,14 @@

assertTestStatusF(test_class, name, isNotFailed, kMessageNotFailed) +    assertTestStatusInternalF(testClass, name, isNotFailed, kMessageNotFailed)

Assert that test 'name' has not failed.

-

Definition at line 192 of file MetaAssertion.h.

+

Definition at line 188 of file MetaAssertMacros.h.

@@ -583,19 +555,19 @@

  name) -    assertTestStatus(name, isNotPassed, kMessageNotPassed) +    assertTestStatusInternal(name, isNotPassed, kMessageNotPassed)

Assert that test 'name' has not passed.

-

Definition at line 91 of file MetaAssertion.h.

+

Definition at line 87 of file MetaAssertMacros.h.

- -

◆ assertTestNotPassF

+ +

◆ assertTestNotPassF

@@ -604,7 +576,7 @@

#define assertTestNotPassF (   - test_class, + testClass, @@ -615,14 +587,14 @@

assertTestStatusF(test_class, name, isNotPassed, kMessageNotPassed) +    assertTestStatusInternalF(testClass, name, isNotPassed, kMessageNotPassed)

Assert that test 'name' has not passed.

-

Definition at line 184 of file MetaAssertion.h.

+

Definition at line 180 of file MetaAssertMacros.h.

@@ -637,19 +609,19 @@

  name) -    assertTestStatus(name, isNotSkipped, kMessageNotSkipped) +    assertTestStatusInternal(name, isNotSkipped, kMessageNotSkipped)

Assert that test 'name' has not been skipped.

-

Definition at line 107 of file MetaAssertion.h.

+

Definition at line 103 of file MetaAssertMacros.h.

- -

◆ assertTestNotSkipF

+ +

◆ assertTestNotSkipF

@@ -658,7 +630,7 @@

#define assertTestNotSkipF (   - test_class, + testClass, @@ -669,14 +641,15 @@

assertTestStatusF(test_class, name, isNotSkipped, kMessageNotSkipped) +

- +Value:
assertTestStatusInternalF(testClass, name, isNotSkipped, \
kMessageNotSkipped)
#define assertTestStatusInternalF(testClass, name, method, message)
Internal helper macro, shouldn&#39;t be called directly by users.
+

Assert that test 'name' has not been skipped.

-

Definition at line 200 of file MetaAssertion.h.

+

Definition at line 196 of file MetaAssertMacros.h.

@@ -691,19 +664,19 @@

  name) -    assertTestStatus(name, isPassed, kMessagePassed) +    assertTestStatusInternal(name, isPassed, kMessagePassed)

Assert that test 'name' has passed.

-

Definition at line 87 of file MetaAssertion.h.

+

Definition at line 83 of file MetaAssertMacros.h.

- -

◆ assertTestPassF

+ +

◆ assertTestPassF

@@ -712,7 +685,7 @@

#define assertTestPassF (   - test_class, + testClass, @@ -723,14 +696,14 @@

assertTestStatusF(test_class, name, isPassed, kMessagePassed) +    assertTestStatusInternalF(testClass, name, isPassed, kMessagePassed)

Assert that test 'name' has passed.

-

Definition at line 180 of file MetaAssertion.h.

+

Definition at line 176 of file MetaAssertMacros.h.

@@ -745,19 +718,19 @@

  name) -    assertTestStatus(name, isSkipped, kMessageSkipped) +    assertTestStatusInternal(name, isSkipped, kMessageSkipped)

Assert that test 'name' has been skipped.

-

Definition at line 103 of file MetaAssertion.h.

+

Definition at line 99 of file MetaAssertMacros.h.

- -

◆ assertTestSkipF

+ +

◆ assertTestSkipF

@@ -766,7 +739,7 @@

#define assertTestSkipF (   - test_class, + testClass, @@ -777,25 +750,25 @@

assertTestStatusF(test_class, name, isSkipped, kMessageSkipped) +    assertTestStatusInternalF(testClass, name, isSkipped, kMessageSkipped)

Assert that test 'name' has been skipped.

-

Definition at line 196 of file MetaAssertion.h.

+

Definition at line 192 of file MetaAssertMacros.h.

- -

◆ assertTestStatus

+ +

◆ assertTestStatusInternal

- + @@ -822,21 +795,21 @@

do {\
if (!assertionTestStatus(\
__FILE__,__LINE__,#name,FPSTR(message),test_##name##_instance.method()))\
return;\
} while (false)

Internal helper macro, shouldn't be called directly by users.

-

Definition at line 119 of file MetaAssertion.h.

+

Definition at line 115 of file MetaAssertMacros.h.

- -

◆ assertTestStatusF

+ +

◆ assertTestStatusInternalF

#define assertTestStatus#define assertTestStatusInternal (   name,
- + - + @@ -863,10 +836,10 @@

-Value:
do {\
if (!assertionTestStatus(\
__FILE__,__LINE__,#name,FPSTR(message),\
test_class##_##name##_instance.method()))\
return;\
} while (false)
+Value:
do {\
if (!assertionTestStatus(\
__FILE__,__LINE__,#name,FPSTR(message),\
testClass##_##name##_instance.method()))\
return;\
} while (false)

Internal helper macro, shouldn't be called directly by users.

-

Definition at line 212 of file MetaAssertion.h.

+

Definition at line 210 of file MetaAssertMacros.h.

@@ -888,12 +861,12 @@

Definition at line 46 of file MetaAssertion.h.

+

Definition at line 42 of file MetaAssertMacros.h.

- -

◆ checkTestDoneF

+ +

◆ checkTestDoneF

@@ -902,7 +875,7 @@

#define checkTestDoneF

- + @@ -913,14 +886,14 @@

Return true if test 'name' is done.

-

Definition at line 129 of file MetaAssertion.h.

+

Definition at line 125 of file MetaAssertMacros.h.

@@ -942,12 +915,12 @@

Definition at line 70 of file MetaAssertion.h.

+

Definition at line 66 of file MetaAssertMacros.h.

- -

◆ checkTestExpireF

+ +

◆ checkTestExpireF

@@ -956,7 +929,7 @@

#define checkTestExpireF

- + @@ -967,14 +940,14 @@

Return true if test 'name' has timed out.

-

Definition at line 161 of file MetaAssertion.h.

+

Definition at line 157 of file MetaAssertMacros.h.

@@ -996,12 +969,12 @@

Definition at line 58 of file MetaAssertion.h.

+

Definition at line 54 of file MetaAssertMacros.h.

- -

◆ checkTestFailF

+ +

◆ checkTestFailF

@@ -1010,7 +983,7 @@

#define checkTestFailF

- + @@ -1021,14 +994,14 @@

Return true if test 'name' has failed.

-

Definition at line 145 of file MetaAssertion.h.

+

Definition at line 141 of file MetaAssertMacros.h.

@@ -1050,12 +1023,12 @@

Definition at line 49 of file MetaAssertion.h.

+

Definition at line 45 of file MetaAssertMacros.h.

- -

◆ checkTestNotDoneF

+ +

◆ checkTestNotDoneF

@@ -1064,7 +1037,7 @@

#define checkTestNotDoneF

- + @@ -1075,14 +1048,14 @@

Return true if test 'name' is not done.

-

Definition at line 133 of file MetaAssertion.h.

+

Definition at line 129 of file MetaAssertMacros.h.

@@ -1104,12 +1077,12 @@

Definition at line 73 of file MetaAssertion.h.

+

Definition at line 69 of file MetaAssertMacros.h.

- -

◆ checkTestNotExpireF

+ +

◆ checkTestNotExpireF

@@ -1118,7 +1091,7 @@

#define checkTestNotExpireF

- + @@ -1129,14 +1102,14 @@

Return true if test 'name' has not timed out.

-

Definition at line 165 of file MetaAssertion.h.

+

Definition at line 161 of file MetaAssertMacros.h.

@@ -1158,12 +1131,12 @@

Definition at line 61 of file MetaAssertion.h.

+

Definition at line 57 of file MetaAssertMacros.h.

- -

◆ checkTestNotFailF

+ +

◆ checkTestNotFailF

@@ -1172,7 +1145,7 @@

#define checkTestNotFailF

- + @@ -1183,14 +1156,14 @@

Return true if test 'name' has not failed.

-

Definition at line 149 of file MetaAssertion.h.

+

Definition at line 145 of file MetaAssertMacros.h.

@@ -1212,12 +1185,12 @@

Definition at line 55 of file MetaAssertion.h.

+

Definition at line 51 of file MetaAssertMacros.h.

- -

◆ checkTestNotPassF

+ +

◆ checkTestNotPassF

@@ -1226,7 +1199,7 @@

#define checkTestNotPassF

- + @@ -1237,14 +1210,14 @@

Return true if test 'name' has not passed.

-

Definition at line 141 of file MetaAssertion.h.

+

Definition at line 137 of file MetaAssertMacros.h.

@@ -1266,12 +1239,12 @@

Definition at line 67 of file MetaAssertion.h.

+

Definition at line 63 of file MetaAssertMacros.h.

- -

◆ checkTestNotSkipF

+ +

◆ checkTestNotSkipF

@@ -1280,7 +1253,7 @@

#define checkTestNotSkipF

- + @@ -1291,14 +1264,14 @@

Return true if test 'name' has not been skipped.

-

Definition at line 157 of file MetaAssertion.h.

+

Definition at line 153 of file MetaAssertMacros.h.

@@ -1320,12 +1293,12 @@

Definition at line 52 of file MetaAssertion.h.

+

Definition at line 48 of file MetaAssertMacros.h.

- -

◆ checkTestPassF

+ +

◆ checkTestPassF

@@ -1334,7 +1307,7 @@

#define checkTestPassF

- + @@ -1345,14 +1318,14 @@

Return true if test 'name' has passed.

-

Definition at line 137 of file MetaAssertion.h.

+

Definition at line 133 of file MetaAssertMacros.h.

@@ -1374,12 +1347,12 @@

Definition at line 64 of file MetaAssertion.h.

+

Definition at line 60 of file MetaAssertMacros.h.

- -

◆ checkTestSkipF

+ +

◆ checkTestSkipF

@@ -1388,7 +1361,7 @@

#define checkTestSkipF

- + @@ -1399,14 +1372,14 @@

Return true if test 'name' has been skipped.

-

Definition at line 153 of file MetaAssertion.h.

+

Definition at line 149 of file MetaAssertMacros.h.

@@ -1415,7 +1388,7 @@

diff --git a/docs/html/MetaAssertMacros_8h__dep__incl.map b/docs/html/MetaAssertMacros_8h__dep__incl.map new file mode 100644 index 0000000..0f8faf5 --- /dev/null +++ b/docs/html/MetaAssertMacros_8h__dep__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/MetaAssertMacros_8h__dep__incl.md5 b/docs/html/MetaAssertMacros_8h__dep__incl.md5 new file mode 100644 index 0000000..c06c434 --- /dev/null +++ b/docs/html/MetaAssertMacros_8h__dep__incl.md5 @@ -0,0 +1 @@ +83389cc85afdf39b23ac72897d6255b0 \ No newline at end of file diff --git a/docs/html/MetaAssertMacros_8h__dep__incl.png b/docs/html/MetaAssertMacros_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..ebdee7f876c581bc0c71a3b1c8cc1f2147654af2 GIT binary patch literal 9156 zcmZvC1yt10x9$K6h;*kkNS7dubR!MYFapxu-5?D^mnhv`(ozlz($XLT(%tnA_y5*< zcfEU;EE$HwnX~uV``dee-!Dp4MHT~%6b%A_V93i!sY4(L8sK#-Dl+&V4K*VVd_y)< zl$C-!JpTLCQJf5cP(kFS#5Fy$_ZEE&V!R&24rj;})Ebho^%MQynRUJU8mFjGw`(sg zouA#5V3#<}Zttvb@9XfDZnHrF_AY=`}-~|Q(y@mwp7=l7kDE4P0 zn9?(9DU?26lur&8KQqH_E)Gs8kg2_Yⅆ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 + + + + + + +AUnit: /home/brian/dev/AUnit/src/aunit/MetaAssertMacros.h Source File + + + + + + + + + +
+
+

#define assertTestStatusF#define assertTestStatusInternalF (  test_class, testClass,
(  test_class, testClass,
(  test_class, testClass,
(  test_class, testClass,
(  test_class, testClass,
(  test_class, testClass,
(  test_class, testClass,
(  test_class, testClass,
(  test_class, testClass,
(  test_class, testClass,
(  test_class, testClass,
+ + + + + +
+
AUnit +  0.5.0 +
+
Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
+
MetaAssertMacros.h
+
+
+Go to the documentation of this file.
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
25 // Significant portions of the design and implementation of this file came from
26 // https://github.com/mmurdoch/arduinounit/blob/master/src/ArduinoUnit.h
27 
35 #ifndef AUNIT_META_ASSERT_MACROS_H
36 #define AUNIT_META_ASSERT_MACROS_H
37 
38 // Meta tests, same syntax as ArduinoUnit for compatibility.
39 // The checkTestXxx() macros return a boolean, and execution continues.
40 
42 #define checkTestDone(name) (test_##name##_instance.isDone())
43 
45 #define checkTestNotDone(name) (test_##name##_instance.isNotDone())
46 
48 #define checkTestPass(name) (test_##name##_instance.isPassed())
49 
51 #define checkTestNotPass(name) (test_##name##_instance.isNotPassed())
52 
54 #define checkTestFail(name) (test_##name##_instance.isFailed())
55 
57 #define checkTestNotFail(name) (test_##name##_instance.isNotFailed())
58 
60 #define checkTestSkip(name) (test_##name##_instance.isSkipped())
61 
63 #define checkTestNotSkip(name) (test_##name##_instance.isNotSkipped())
64 
66 #define checkTestExpire(name) (test_##name##_instance.isExpired())
67 
69 #define checkTestNotExpire(name) (test_##name##_instance.isNotExpired())
70 
71 // If the assertTestXxx() macros fail, they generate an optional output, calls
72 // fail(), and returns from the current test case.
73 
75 #define assertTestDone(name) \
76  assertTestStatusInternal(name, isDone, kMessageDone)
77 
79 #define assertTestNotDone(name) \
80  assertTestStatusInternal(name, isNotDone, kMessageNotDone)
81 
83 #define assertTestPass(name) \
84  assertTestStatusInternal(name, isPassed, kMessagePassed)
85 
87 #define assertTestNotPass(name) \
88  assertTestStatusInternal(name, isNotPassed, kMessageNotPassed)
89 
91 #define assertTestFail(name) \
92  assertTestStatusInternal(name, isFailed, kMessageFailed)
93 
95 #define assertTestNotFail(name) \
96  assertTestStatusInternal(name, isNotFailed, kMessageNotFailed)
97 
99 #define assertTestSkip(name) \
100  assertTestStatusInternal(name, isSkipped, kMessageSkipped)
101 
103 #define assertTestNotSkip(name) \
104  assertTestStatusInternal(name, isNotSkipped, kMessageNotSkipped)
105 
107 #define assertTestExpire(name) \
108  assertTestStatusInternal(name, isExpired, kMessageExpired)
109 
111 #define assertTestNotExpire(name) \
112  assertTestStatusInternal(name, isNotExpired, kMessageNotExpired)
113 
115 #define assertTestStatusInternal(name,method,message) do {\
116  if (!assertionTestStatus(\
117  __FILE__,__LINE__,#name,FPSTR(message),test_##name##_instance.method()))\
118  return;\
119 } while (false)
120 
121 // Meta tests for testF() and testingF() are slightly different because
122 // the name of the fixture class is appended to the instance name.
123 
125 #define checkTestDoneF(testClass,name) \
126  (testClass##_##name##_instance.isDone())
127 
129 #define checkTestNotDoneF(testClass,name) \
130  (testClass##_##name##_instance.isNotDone())
131 
133 #define checkTestPassF(testClass,name) \
134  (testClass##_##name##_instance.isPassed())
135 
137 #define checkTestNotPassF(testClass,name) \
138  (testClass##_##name##_instance.isNotPassed())
139 
141 #define checkTestFailF(testClass,name) \
142  (testClass##_##name##_instance.isFailed())
143 
145 #define checkTestNotFailF(testClass,name) \
146  (testClass##_##name##_instance.isNotFailed())
147 
149 #define checkTestSkipF(testClass,name) \
150  (testClass##_##name##_instance.isSkipped())
151 
153 #define checkTestNotSkipF(testClass,name) \
154  (testClass##_##name##_instance.isNotSkipped())
155 
157 #define checkTestExpireF(testClass,name) \
158  (testClass##_##name##_instance.isExpired())
159 
161 #define checkTestNotExpireF(testClass,name) \
162  (testClass##_##name##_instance.isNotExpired())
163 
164 // If the assertTestXxx() macros fail, they generate an optional output, calls
165 // fail(), and returns from the current test case.
166 
168 #define assertTestDoneF(testClass,name) \
169  assertTestStatusInternalF(testClass, name, isDone, kMessageDone)
170 
172 #define assertTestNotDoneF(testClass,name) \
173  assertTestStatusInternalF(testClass, name, isNotDone, kMessageNotDone)
174 
176 #define assertTestPassF(testClass,name) \
177  assertTestStatusInternalF(testClass, name, isPassed, kMessagePassed)
178 
180 #define assertTestNotPassF(testClass,name) \
181  assertTestStatusInternalF(testClass, name, isNotPassed, kMessageNotPassed)
182 
184 #define assertTestFailF(testClass,name) \
185  assertTestStatusInternalF(testClass, name, isFailed, kMessageFailed)
186 
188 #define assertTestNotFailF(testClass,name) \
189  assertTestStatusInternalF(testClass, name, isNotFailed, kMessageNotFailed)
190 
192 #define assertTestSkipF(testClass,name) \
193  assertTestStatusInternalF(testClass, name, isSkipped, kMessageSkipped)
194 
196 #define assertTestNotSkipF(testClass,name) \
197  assertTestStatusInternalF(testClass, name, isNotSkipped, \
198  kMessageNotSkipped)
199 
201 #define assertTestExpireF(testClass,name) \
202  assertTestStatusInternalF(testClass, name, isExpired, kMessageExpired)
203 
205 #define assertTestNotExpireF(testClass,name) \
206  assertTestStatusInternalF(testClass, name, isNotExpired, \
207  kMessageNotExpired)
208 
210 #define assertTestStatusInternalF(testClass,name,method,message) do {\
211  if (!assertionTestStatus(\
212  __FILE__,__LINE__,#name,FPSTR(message),\
213  testClass##_##name##_instance.method()))\
214  return;\
215 } while (false)
216 
217 #endif
+ + + + diff --git a/docs/html/MetaAssertion_8cpp_source.html b/docs/html/MetaAssertion_8cpp_source.html index 2f134a4..85660df 100644 --- a/docs/html/MetaAssertion_8cpp_source.html +++ b/docs/html/MetaAssertion_8cpp_source.html @@ -3,9 +3,9 @@ - + -AUnit: /Users/brian/dev/AUnit/src/aunit/MetaAssertion.cpp Source File +AUnit: /home/brian/dev/AUnit/src/aunit/MetaAssertion.cpp Source File @@ -22,7 +22,7 @@
AUnit -  0.4.1 +  0.5.0
Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
@@ -31,21 +31,18 @@ - + +
MetaAssertion.cpp
-
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
25 #ifdef ESP8266
26 #include <pgmspace.h>
27 #else
28 #include <avr/pgmspace.h>
29 #endif
30 
31 #include <Arduino.h> // definition of Print
32 #include "Printer.h"
33 #include "Verbosity.h"
34 #include "Compare.h"
35 #include "TestRunner.h"
36 #include "MetaAssertion.h"
37 
38 namespace aunit {
39 
40 // Moving these strings into PROGMEM saves 162 bytes of flash memory (from
41 // elimination of a function) and 130 bytes of static memory,
42 const char MetaAssertion::kMessageDone[] PROGMEM = "done";
43 const char MetaAssertion::kMessageNotDone[] PROGMEM = "not done";
44 const char MetaAssertion::kMessagePassed[] PROGMEM = "passed";
45 const char MetaAssertion::kMessageNotPassed[] PROGMEM = "not passed";
46 const char MetaAssertion::kMessageFailed[] PROGMEM = "failed";
47 const char MetaAssertion::kMessageNotFailed[] PROGMEM = "not failed";
48 const char MetaAssertion::kMessageSkipped[] PROGMEM = "skipped";
49 const char MetaAssertion::kMessageNotSkipped[] PROGMEM = "not skipped";
50 const char MetaAssertion::kMessageExpired[] PROGMEM = "timed out";
51 const char MetaAssertion::kMessageNotExpired[] PROGMEM = "not timed out";
52 
54  bool ok, const char* file, uint16_t line,
55  const char* testName, const __FlashStringHelper* statusMessage) {
56  // Trying to move these strings into PROGMEM actually makes the flash memory
57  // consumption bigger. The compile/linker will dedupe these c-strings.
58  Print* printer = Printer::getPrinter();
59  printer->print("Assertion ");
60  printer->print(ok ? "passed" : "failed");
61  printer->print(": Test ");
62  printer->print(testName);
63  printer->print(" is ");
64  printer->print(statusMessage);
65  printer->print(", file ");
66  printer->print(file);
67  printer->print(", line ");
68  printer->print(line);
69  printer->println('.');
70 }
71 
72 bool MetaAssertion::assertionTestStatus(const char* file, uint16_t line,
73  const char* testName, const __FlashStringHelper* statusMessage, bool ok) {
74  if (isDone()) return false;
75  if (isOutputEnabled(ok)) {
76  printAssertionTestStatusMessage(ok, file, line, testName, statusMessage);
77  }
78  setPassOrFail(ok);
79  return ok;
80 }
81 
82 }
void printAssertionTestStatusMessage(bool ok, const char *file, uint16_t line, const char *testName, const __FlashStringHelper *statusMessage)
Print the meta assertion passed or failed message.
-
Various assertTestXxx() and checkTestXxx() macros are defined in this header.
-
void setPassOrFail(bool ok)
Set the status to Passed or Failed depending on ok.
Definition: Test.cpp:57
-
bool assertionTestStatus(const char *file, uint16_t line, const char *testName, const __FlashStringHelper *statusMessage, bool ok)
Set the status of the current test based on &#39;ok, and print assertion message if requested.
-
bool isOutputEnabled(bool ok)
Returns true if an assertion message should be printed.
Definition: Assertion.cpp:67
+
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
25 
26 #include <Arduino.h> // definition of Print
27 #include "Flash.h"
28 #include "Printer.h"
29 #include "Verbosity.h"
30 #include "Compare.h"
31 #include "TestRunner.h"
32 #include "MetaAssertion.h"
33 
34 namespace aunit {
35 
36 // Moving these strings into PROGMEM saves 162 bytes of flash memory (from
37 // elimination of a function) and 130 bytes of static memory,
38 const char MetaAssertion::kMessageDone[] PROGMEM = "done";
39 const char MetaAssertion::kMessageNotDone[] PROGMEM = "not done";
40 const char MetaAssertion::kMessagePassed[] PROGMEM = "passed";
41 const char MetaAssertion::kMessageNotPassed[] PROGMEM = "not passed";
42 const char MetaAssertion::kMessageFailed[] PROGMEM = "failed";
43 const char MetaAssertion::kMessageNotFailed[] PROGMEM = "not failed";
44 const char MetaAssertion::kMessageSkipped[] PROGMEM = "skipped";
45 const char MetaAssertion::kMessageNotSkipped[] PROGMEM = "not skipped";
46 const char MetaAssertion::kMessageExpired[] PROGMEM = "timed out";
47 const char MetaAssertion::kMessageNotExpired[] PROGMEM = "not timed out";
48 
50  bool ok, const char* file, uint16_t line,
51  const char* testName, const __FlashStringHelper* statusMessage) {
52  // Trying to move these strings into PROGMEM actually makes the flash memory
53  // consumption bigger. The compile/linker will dedupe these c-strings.
54  Print* printer = Printer::getPrinter();
55  printer->print("Assertion ");
56  printer->print(ok ? "passed" : "failed");
57  printer->print(": Test ");
58  printer->print(testName);
59  printer->print(" is ");
60  printer->print(statusMessage);
61  printer->print(", file ");
62  printer->print(file);
63  printer->print(", line ");
64  printer->print(line);
65  printer->println('.');
66 }
67 
68 bool MetaAssertion::assertionTestStatus(const char* file, uint16_t line,
69  const char* testName, const __FlashStringHelper* statusMessage, bool ok) {
70  if (isDone()) return false;
71  if (isOutputEnabled(ok)) {
72  printAssertionTestStatusMessage(ok, file, line, testName, statusMessage);
73  }
74  setPassOrFail(ok);
75  return ok;
76 }
77 
78 }
void printAssertionTestStatusMessage(bool ok, const char *file, uint16_t line, const char *testName, const __FlashStringHelper *statusMessage)
Print the meta assertion passed or failed message.
+
void setPassOrFail(bool ok)
Set the status to Passed or Failed depending on ok.
Definition: Test.cpp:50
+
bool assertionTestStatus(const char *file, uint16_t line, const char *testName, const __FlashStringHelper *statusMessage, bool ok)
Set the status of the current test based on &#39;ok, and print assertion message if requested.
+
bool isOutputEnabled(bool ok)
Returns true if an assertion message should be printed.
Definition: Assertion.cpp:116
-
bool isDone()
Return true if test is done (passed, failed, skipped, expired).
Definition: Test.h:130
-
static Print * getPrinter()
Get the output printer used by the various assertion() methods and the TestRunner.
Definition: Printer.h:50
+
bool isDone()
Return true if test has been asserted.
Definition: Test.h:196
+
static Print * getPrinter()
Get the output printer used by the various assertion() methods and the TestRunner.
Definition: Printer.h:52
+
Flash strings (using F() macro) on the ESP8266 platform cannot be placed in an inline context...
diff --git a/docs/html/MetaAssertion_8h__dep__incl.map b/docs/html/MetaAssertion_8h__dep__incl.map deleted file mode 100644 index 4a49ca6..0000000 --- a/docs/html/MetaAssertion_8h__dep__incl.map +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/docs/html/MetaAssertion_8h__dep__incl.md5 b/docs/html/MetaAssertion_8h__dep__incl.md5 deleted file mode 100644 index 5108d47..0000000 --- a/docs/html/MetaAssertion_8h__dep__incl.md5 +++ /dev/null @@ -1 +0,0 @@ -8c06f2d8a2a587e8fb939ec6b3bf9d69 \ No newline at end of file diff --git a/docs/html/MetaAssertion_8h__dep__incl.png b/docs/html/MetaAssertion_8h__dep__incl.png deleted file mode 100644 index 94e8d116cac428ec94433b601f9feca4458112b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53702 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�%dQ-KR0`W`s5zET>Hv}wPco^iU69|7D#pLK79y12BWZ%qnc#h z&$crqB|2{ft;5a)Tc5qH+>h$E&!$CjCWWnQhf~jJ{tm>2-DhUf1|)5~R{JThn%v`3 zknQ6g{k7?5YR~)fk4IcYY#a1IAn!^Rx~Wlyfa^!_LZ3%P{pGBR1qHKMPf7vD^ietA zU4#Y?x`?uy?2Xkdsy$vnEW^^bKUeB4uE#webj?YJ<`1&l~{SQ;+c!wXyJlpJ`WP=2X3aF3$a2ZQnp5ddUIBUnkMRBQ54{KJ# z54>fW0U{1b3hFv2liy3;YW8r;U`~0m%1~sIXSEDlIb5>`jdbCoIz5iIH){o`5t?}8 zVP(0-!RB&eYFl#E!px1M^9+21k00(Opf2Y0v&D28j#H}0D3DZQrf@wF4G6ixq_>T{ z4PUukGb!ySA)@B}HJ2vU9Akcm<1TBu_nk#ek-o$SR{&AyIbhxPyS=#og;Ow0X+zE+ zV!uHWMcSPB^F}0sTl7zI!_Wm8L%$Fuf+TScB3yI_dlCUWdb(aNq9h57N+poo>eJ?U z^>FDClYB%(C16d$V_E4!sgmhYqjEmX_Nb_?Ws?Zz#17@3Mq~bTYzaZe6zBb6v3$o3 z6yxt~=6{LE$x+@NRWd1gKZb_HaO-q4=HBf~X^6n-vJkl;tq5w(W-G7y{Wenn*aE9erZek|0b(Ne=l z)dnElh-XT;RHhpOUYF42lTHu4_A?QsnE8_tpG#K$LI)BL?EoOC^9_fZmVtE*z^snN zgfqxPZZ5*2Cd1RwP?N5+?4AG0l?{QLsr1R?Bl)F_*`e?As57m-K3L^+U1b=Zus zgC)9xF|DHnTq@q`DV-gAoV4=jyg;w#3h$i z71jIO-Mo;zVx5H)6GoKm2xEw z(y+T#x+ua-1Fooh9}vTdJCW+(ww!|JuFKNQRYkF9Xz^H;+?(LbR_Gub{* ze^5?ccy}Kp;FKfQ)1Pj4SXpY#CTcCLkUkLf*aw(Mt2t7!eioACUj&oy#wL40x+K~p2Rvyu_P)h8-PX$^f)O`*Y{q_Pc;hUHR z`VSQf-%Q=2_@{FPpXvr=DdO7E0V#vAEaU0Mv-=He7|XQ2>$e{~fS*b&(2nWzLJY7( zkk2k_wtM4ym}b2HlWc>tI08X>ZC<(@HP;?B!cf?YbQ=mp;Z2%+hWQa=YA9x;r)OuqbZk^Fbob|S!@(?Pp9O+6j`M-_MdrOL6smo z;$PNjWKc7yJ}~4WQks%^|8w>){4$KB5+(%f$w>@J%GQF^PKsQUvqgT9)Y$=Zqw+g@$VmtoXCCN;DMv&od zwPpwZaO;aeNWE*aXd4x6rjUnU+rzh4Ugv}23+>N=5OU#bO(6y~I-h(;vBhFUIM^4~ z9elVp$bG3mygU+!n=QW&*&gxW*Zp2}gscXay+ttF{=L2POVe zI%;JT6Hf~oE7XBJMKm%#tkgEWEj%(TlJuy#fV&osh^$oAK(bGSbcyqf`X1R zCV&kn`y8nXM{$-WqA0X?wzf{ zQoi>)Cvv{JlXzh&_!xqAC;}61!3Jtk_Lj5O1R_@C;~9K$T%Tx|K4`nwQsqD&=Q)|w z=>se;$;TI#!f{)(_^@#<)W4XHn^mw(Rv)tT-2QsMz`CCCr8P%^_5RHN#MJ%vuLbbV z{YA7A!t&2)zt-l^uHAK0bvc;cQ@bX*r!3d1;n=vtjz9~pJq2tQIHz87g{%GLfg7XO z=nd>)0LFw_y&Ql>#Yty6ysOmYV3y1LS=d-c40gWzMxL-a^eB~E7wZ&+`AD#=?Y;$< z3@p*5rj1?)1>aTK%~8zbyXwbJ1@knqd1$v zV@gjjUUtgSs;THRwVpIVbUNTpc0S}y{MS_%NFxTdpWL`(K#h!~!&v}mB6RtuW3L{V)_d3{a53iH9b#;#quD`%zBrr6-%&c}9 zQC~gXU-Wbv{gjuQ7K`Fp6Sq5Vz1a>|D~zKSPyxHQ__%+5CA&m$t#$Wztqpte^Wb}q zNu2ykz_3YZ3^5zk-9k$X0+_}z$MY?|xP@+xQaUM$E-aPGd@Nz#1y89CCKv$z_*3z3 z)yOv9s|b+azFzE#Np(=zJ^a&JktCopd|ROCCRh*(H!XWGP1wVH9U+}xgUS(nt?bGg z^qW{PwM!a#KYaOjXMn|42yyid2X;I4lI+#K?YP6(vc%`+*{~jFxasX=CXtPCRx=3v zwU6o!#a>UC1IV8GKqPc$c80t3>u>pVo{Z2H6xlfGkF;*omp8!__Q!}SXiPw%KF^g) z*d5**i=X4*jvLitLip-zMZ(cZ`K1!*t|GN(xRtxVGib<%wR4+~D<)T@6!^b#a2+CI z>tEMJ$TAUdED{5^bpwn76v*pmcK^Uya8&ct2innK?SLqsJWfY*9sj%pbLEDmZ>>G6 zfwgFp2j=p?s^Dz0?O#ww#cp=eLzfr_KpO{j z03^sa(fjz{P>~geO7SZXCqAp=faKH*tDhyPm5?88$AY_W=(L|$kfN8ai1-DI2?@K4 zKD#ABD7B5^eNm2HvA~-_s{f5VXgx_8PkX@R-*gJ zYHQFkQZl7g_*ht;k!^(aP3YUFW<07=0|K21(%ErS-i7=uTBYkB|~y0u+P0qXwTJ z6_x8tlttHg434CWMH*;3rtqycUU!@(gHH0QHt6o_hUyeFS4!#XTdb;HyNk9S;g9Cu zxvBR?1y+9o=ohAX3)fqi^=QBkvLmOo$)>`jfH{~u!M3%VDP6@}OG+0?#`OKohF4V%Uk878<9^;!?tPyjcoShHI9kTH+i>)FdzFJEt+pzx%|Y}mfmVQ1a^@T=yP z#lh_3<+4j@vF&Pe5KWNAW_%+X0EikZXDOL4HGYA+ztNQCvP|64tcsazaZ~;SdlDklJ(GlymVY(q`Ilem&$vewwTe!_V)Yci<{^SrjMaCXj=P!R13riy%>d-Y zqFVYt1g zs03`lG|kNGxX=drB{W|mw%P45VV(Z>ZIeTk(-Ignd581H9J+FiXES&H!7up_M2XrU z>WvoB;Owm?D?**M7N5L!{zxbt9Pr3@l~|ulGBqR`HfMX}6P$&tFDcZ2x^vuDD{54Bf zzuK?VHgqlp2yrxFjW342e7L-gq6_4w1F!;91Rm`|s-ue%-)FUaAn5gZ;#2x5|MzE^ z))6s7|IgC9sTD-?Mr4ne?0P*c*~kth9wGYpoGc+?+P30P8$^C!zFmbjOx$(a0Z-@U zj;6nMCo1}DqHLacqtl@;lB}Y^`1+>F0Y8mR_x)xc(_bY^cvZKSleYc+4hBT(m9|H? zFee_f(M_>8BP&vCD#&9CbNV;cE;8}+?gp#?d<)Q0e;xmwzMc3Ws+l(V^MbaAD`o{$#B!F80N&I`E(R~X0@HslRp+$2;`2c1>@bU;=e$I z9I-Yyfkv{QYeLkkT?nBE*J-xyPeLY-8dCD0VNI(7Hvs|7QRmQ!J5mVXc6mGsmYD5P zx;1U4KL-7aI+%NYuaNveRA+-K)6KdHyw@xjM|E=x6QFGAHMZ-I#*vy4A+Z_f$Axx5 zd}F+e{<^gQ5rXT-q;oCz=bd_EXMxbTX$Z1kKY2EDGrqF?7$-6vJ~#`XQbUv@Y{(7HjXclT8mfy z3G}q_n#nG!pQA7g;AIDLILw%V`PTU5wa*Vi@lg%M^{b-Ji8O>z&LO|{8>g)Dx)-Zo z9$>b#%Po~ss3(S@mKin1-xry>KM_%^dZ%_C)iIvSgjmv`QXVPeF9gY#%e1&Y?B4?g z!3J->*;p|gJ(2tqC6vX%Zzm53wVA^+dyiZRG;Dfx;Gr+OF!LrFaSuzoXXN&>lr2FAOS&9P8evAqJclJYt=*!k}CS9i*iug}e`z`lt<9_dV z(JX*jh4r&Mvdy%U5~anl?P3%gRFIOFT&#*rz@;1t3GkB(la=9KE}Ti*i~`9;08akJs^yYIRrmCwvav6P4{` zTeow=tBm$Z6`v|~EH?XEEtPk^Oy@2`-*?wph5T~2&;V4C-r+asW*R4Mj#~rmdf)b$ zq$u_f%}KiRjSKl+`xQy#IPMi%48-DXU<>RM6`~=(gF&Q06G&RLWf{ZnM(EOZVbr)j zYH0r^8xr*_|p+>nSRzO!F6SDNB-keC4Z4&w<^hX zUhJq4i?Y^tZd>3Q-|ML#RbX$uB8LG3ib4z#-4TYB)d>J#*{Z6PiIE0PTjrN93lC;L ziBnV7k}q5|AInz=7cYWJ$}ukVQd9D`cLrUzg)F#iZ}sp^9#uO$MiHlcvGx06zB|s+ zn^&57k6l(zEqarn%xxGG4*a}2&rjKtHVv&*D?9-jA(?;D*o=h`YMy0Se>sSVFFOaS z`@2k%3ZMu5E=heuUXAW?)0TAfG5ZS>yzBcF+LC3!A{PD5Q|eHZO0e~2H?SmLx|6~j z2iMPl!fvgDOP~mF7!mS#nYs%Q0iQgKRyW}d$ow!WjHio&XHY&?5%&U%w3~5WGhyk6 z5rYVcNhFyU29pkVEb{9ixzIU4ec0^9V=Le%5;bGiYv~GML)m+}xB9T&#Roe;=p$#p z3*$71A*}h@CsSEE26Vwk5Pa$^W=c9qJZf={7F{wjC0glL0su5QE;630lu9%|GFSLj zxM(DW@4uiNP*?WK#?%t~QTeVN0u^t_prm{X>XEdHI6NclOqEph#>nHn8NBnWFw)%-U1VJVyD>*f`dS%YwvQi?1AEYx8 z)9!k)4n-8QV>;AHMaUo8|7P)ea#QZ2G`PP$3BPwe?3>S=%Ju>;-=9k>3q>VLU*vGqNW@478_HDvBBChaXrH}o9dJ_T& zA|hHNN3>zD2w8?N!A`$d-q7|!;gE5=*oV&Cq5u2ra@^X$4~8F7Bt(zTCEh5we!ra* zCNKA5#y5JE!(o35dkNF=hNiQBdCjq$0>kuvs-F$Kk9}urR&&NE(2X%;anughPVyd` zJTNN#>AYtG?we89>aFgo?H3l}&zQamsJzbU+(#Y@^+!2AX&amxHKwoUSL`s+h-c;V z#UMG+V7m0lQ1=9Y6+#5(wUxwVKtf zc_w8uLZ2x*YjNeA!Q==#n|v3BrP9aBM&~YtRYeN}+A}XmP{^;Nh21SmC>{VE^2S z5IlBaI8xRa{f9_-O!UKjNu=S2xGB$Y(L_q9nEW9E>G_<%Tt1x!vK$%m$IzVknL_1F z)@g!O4FJau-V8q~0AQtF9!&3RviMoBdxyj28Fo)vd)y#}sJJBsxb!C{pt1&mI(@6j zH6nY!oILc3 z2gTQUk%o$Bh0b(YSiC+@>@OqHEXvU4HgZANc;k<4GCa%bsjU(##4e99k|FOtG52Kg zSjmoi)GeR+zyV+L(5T1p&z}kin1b{GM$mj75`fl>lQAM1g)6qmVfNna=2$ZSkxA#{ zYI{f98@H&}6SEwU9Jl?RXhnmhVi4K>y$X~?%b7h>_cz54Djt+jcjv;cGRpKG-z`x*#B z=OBsdX0>p4Gp0F$XJIX|?B~A#(F)zPV*Pf3o&q5GPlS=lFDv|Yi$4zU5piF)OV z0%K671Xz_QEmery5YTSneebprwy0rDO}MF2Z6p?bpQ`XPc(8+YysTkGJGt%Qob8(C z0gjRmU@z2)ydVF2ME~dQLxgz?K@_|$>o7L4t0fK>r9gB%xb}lIQmok&fdN@vS@5}b zQTW`qN69rv^<}NG40?&m`kT^<&zBsZ4r%|SanN&^ZBkEG|4FI*#V~8mputcnYfU|g zDDn>c@;il{_qS>M4}&DpxQ?d=(!dc>MuNS?P%2H1?n51~xtS}G#;0d&TB3c$`cpP{ z@ofh$$VCRQx&v5gTry64mZzYPWdtO4dd**U=WFQun+1t9Muc6MqXhrRM4N1N_eHd{ zk%X08TNwMtbbvUWKcm0CX`<-mVN1Ltx%-S&#RdcD4v21|i|tQ$5wLsSUyT!u^7i-1*zme}ZoEpVH6e-CvHv41#+}QzV5{-}yxcIN{T-pj#@FwR!I1dH7%tez< z{Ple+5v;)e41QTsDqQkJEIzZ3PkS+30_hMieih1c7L3(oK^Ge$^eXwC zMX}j%YFuq(x&js=HVh!dxcB^=JN@N$fAp7DeV}1g_$~H5g%iteF95m(W#(NXyEkd) zP#IwU14a<7Z`v~tsQ+rDqm1BK>Onu$?0%0QdZ$4r_hsg%(X6$NEg)~1ju4gT zG*m2R74?iWF}kZ_RguG-2D^YN>7GkhrwkE7;J4m=@}t!wrb;4dhWj{(`!iOkAWUr6 zT!}`8#COR`M}hM<7GQ%PrvhcC`Ps}QhytaI<#TX9W5ugSuA>5zPlFIbKE5J131Gu| z<#-4ol#+bWWcop6U|akPG=VD80`q~F-)4uNJ`5MFrSKK4e||{dT#Po~3#gX>qj8uR z5pQD3_YhF;9YQ>9zzu*4)RBUo|4eitgwklc3z$+J{=V$Nc&wMDR0d{nYhUknCwz{U zUfDEL87RQ9n<^?ugsjL-6+VmV)F0M-A+MbX7v-c-X?s93D!soL^O2Hp09}01B}(uq zme8711FHQXScawcrYmR-;z)%WDi9)k+QMftfZ4wImnoMJ)+!xz1HTEjc{`pN zb;aU?cxVHD!!9^0C$`5{rSBz&u6b3wKf;otjlQlCdIC}fav7YI$RHn&Y2r#n zpY`Gk-~mCq>39KGo2JrPNDk-NvM2j15x~kiui$7;xUlH!Nc3}|SrH=Uwq{Mq$Q~pu zG-#j8Ktowm2u8Iiay=7t@7RFmxDcdqDHFoY-uh$u-iY-6ux9LmnO@i7JV9A_JvB-n zoc*>)BLu0O)!g(+Y@F1k+2Ot;SZ~yKwHedFn?%3weh#v=$Lnntc|XpJy--{LK00vt z9f5@IDhMOgTtp8x2SA>{yO*@C_5*l{M*B@^bc}B^CxR>3pu`t&1j&Dra=vrGub;8& z{((7_jnxh0&(M&atpF?ldK2raZt|Exr>-44SIbQI&DgsvB6My9ba)|E}<5PleLZp(O&a!LH_n- zKlwyI!A5=s5MV=7KisVP;1CeFIBxVHRYuN(6vWJVirm^KZk}XDEpaZ(>6}PHj&ucV z#HG*L2~ao4xNk&3pt(u&FVyW{o=+gvw9AC9(fro_5K=991C-1W_%D&znQxbS@z{Af zdwyhy4mzP$6)S_40;omN6nu*4pPRk~v66k{=*4G5u;Xn!%S-;E`_i1}?HcjU$WnQZt*9}a-W7J_dNEZzqizyE=@GW#JjLG%sV z7dVvvvH;#1rxM__{y>CazXS+jz;B zL_Ns0|MgqLzDpV!E=ftZMxGT|G?c(HX6Ibu>S$@hy@Tsg#W{{0@6(dQV=cmLn>mZ4vGj5iW=>P%p5@D){W&ZvUq2 zfuPd39UkQ@!9-dGJooE)v!A*TW|_+WRtlBL(@eVStw#5%`Ak8)gCQ`5Xrf)YQSQJ0Di?m*i-079-Hn9u%@hJi%5q^l#ZO6%ZKwOn( z_0qQvx2qCrg5F+5!iuqg%4jLe_u?0YfOo`BU!80i9ni%^uQ~@FBGU!YNyb8*RSiep z^J3Y42Ap`79HGP*WS3N`!x=G=Ig@2y-41Lol#wI^L_SFM5&;MpcuoL3HH%b(P=G{S z0PsaB0Hq~Gi@I;4QumUti5oR#Q>1ydI}soqL&h{miPqyED8l+){#Mr8W4`7Cd**gg;5NT z_g0M=xq2Mg)vd&b{Y%iuqbKawS+6V6&#ZLmR!)e8?jN$AETo5l1cou1#Talb9S-;X5^N}25lXoX=XTM4BPND39jDuYfx9) zU=pmg&6~>Hf`O{FgHo}MiFEt)ZxdraawARpo>Hs7rFZGOu-9)^zf>M+7;f(e*ZIbc z`Je^*?aVm4%~-?`b_2%|KsoHi&zwX!@D%r8rSGg=zwPJvN}yOfrncHi5ujQ(DgY5% ze}rdTih@qny~IFe;be`c+Pj(MIq*O`VXMV5z8IIl$bDx>ZQic?+cBtLDzlhyd|3!% zJF9R^c0`VZvx}R|ie?+v+K4T?n~R>3wnuDwGe(5jf%x7Ju=RK`Vx8W*yBk$}{?s=v zAng7LtLin(m!Yjf5dB21VdK0!;ATZaz@Y+yyS7ZozvE;GioYPY-a}VccSn#$puQig zhB8ny-33v`32Gj)+aQnodkEke4(tiicz{(5&DWuV_i6fBzPvTqZNhs^k5ureLdJ6iIg>%2C~|fOv<&WANS-bXKjifH=!8bA(@m zoST7Nom=AAn&sMDan9*&Y0mwdW;>%-se1#x?{xqW^8R=`xH8%`-AaWppa;nTZ<2>3 zQ8XPbc$B2VphBD|dI!q^X81LCT@^y0+ME1WT00RI%AiS9WYinpWo`5Xs`E;ueAsb{ z4qdry;Z^`eh)tGQK^vA^vY(o1rNvrrLHF zU7yD|jTVfCYPvI;`4fGP?H@SYdRH(aDG?dgs-73yMNV&88`|X7v7T6LSFA#05Os1L z(V*vcI>~jZxag~$4TX9#x)(m>%f`Xg59DSgxay1MnT_X&{rG9Hg4Ln8lYc@lLnyII zV1X>v!HuY1p&M(%5nYA+MSO=j?hq=Kk5!nW$i$Dr;#a)AwDIw#3CXpsO6l--p30WB z>H#sSSM>i>UI*>dJ*{!}4HX$Am=6@GIiIY2PGy%xpyY!ylz^B1gGr#AHxz93rhi|w zOS@t)K)Dvht7ikDPE}T*1EP&YY$Q>oz{#z^8XSU5@_u`+QlEv`DA91>j?_y=s9^OU zT(st{sOCclh4BTd1toVZC<~K4X4yJkSx;9J_63vp#Ht%?LTj+c5+dkt2G&-1abOcJ zMSPM^VxTR(uiG9OXQ}nPMPKY(#UJnBQX2>8e=ccw$(TlC^Ae$iw~yRH23HsOxTV2>6tCN1W($i(PCbAaq$ zz9n(M4r%_#ZdE)g_m1JX{hjeH8GdWY%SjIg*|N<(cY9++<|4W!5;myBf|!SH9h_o9 z)AD_rl-w37uzv1@>Sa~-J#<(;u`7lWu*4)8SrV^MeNNH&zb^4w*^i#6Cco1^hBAG}oJF{EwkuCDBOnaLO3^0{gVaiO3JdBAjs z>$xO-mGDPl6SlXL`iU)}MFa(S>w(7#IBAB0MOR9Y$Cw zf%>}mVqQvn7~karg`p6l`9m1eDE0xP5AEdDfoGijt;jH}ggHhkJ!H|HI=|Bpizdu~ z%CH*|eu`hYe6{=w@RVDR=TccA5-U?9UCp?VU;~Iyy!RR`($C^KCseys*hO&;Gy7OL zi%5;hlQG`h%mVbOZS(tKAcyH;f4I>fd++z7d?fd4%)!Oln5K;7d!yDm?AdDBQMuaQ zvY-6)<X?a$ty)N9F6!wo&hDT-V~EfF-ZYh2fG^scK2 z;T-&x6awJUOkm-P4FLxDZy-tGW>rXl_FHwz>L%C#L;(Tok|mHym4{d_X3&^Z03X6V zfKY&eTHs_H&KY~{SJf%Gm|O8T!e9~Zo`!b_%J2etk8J-;YBmbQ41bZ*h9Q};;P)dfDkS+m90cnsfIct2L_xF3xxsLyET?5YEd#$zCy6gM757j%!6+?k9 zJ2*axomBQ{d)qyLc2p{;_mQ?6AuE;lgQIGA{)5&x#^=cUNO&7rFh}0WPQIE^bm}z9 z%%JQy`=c7(dl@-eo%UA<__RYD5;F;>!G2r}tr=4!?(0PJbBO4$p{lw5QWNLYM#nm6a1Vj3vc2?)fOx2L&ryJ&@e+~ zXC)O>66yHa5eP-o6VLLMp~3e+CKDay#bF;es}GK6-)+D#>O-P3NWplWUyasFK!vHq zoaeb_pY`n6?;01KR8@2`lwl<#g@v{ZL{7Q(n!|J7hYv~Vty}Zfj^Zc5zos5ZQ}L4V zz7oBU%yjQmk=L=dCTyGS>%_CJHsFE{`U@o6RJc=~SHXM|HVHD&HKn_xM-g}vLggKQ zKA*g1Od;nXva%Oc4LXSFWcKh5k}}3{L~k`14YVOMW7>(YJjUFLz@y)i?NaZ~e z@doq*c`2ssS9a(UK&$!s?=BhrFc_6)mdG-oFC*S(;~TATx*H*eq_?%yJkkML3T`XT zR+gZW_r;4>#t50K1ti4hSXc~;_}3z;Mzh`r+1Qwtd9L{rdyjM8`PVjD`OnDW1MP>9Yi z@%X!Lo1u?(u${iDuZ=GXo7xp$^vYzXAj1vJ>19tW_&&^>_|s&9-)+ZCq02tQ=Ccn- zMJYDebMUzckf%tC@~u#ZT-gTP^b_D6PNj zvryRa4g?pMuT#T|+dfFv-jI#A3(KAJh@O&hFn2tEo$v%o219 zZNNs^wyfP?=6LByiIJ%+YDjfoi)!_yI_vgD5ZP>L@Q~iF*E5?26&wlPAzveCEhh>t z<-*tT(v;mHGtS&7gV%GfmQUyw2gRX9PcGaPzhd*G|4FRzeKyE@mRLO#a2tU(sgh{H z9KJk8%-1arWoEy?Cc77t`^mGz&#qMqgkcQ#KCnb;UPiGrdl-FK`|*c6<0$0gXxaT1 z`_fO=_k8k^m+_@TG5SBZ!+aSY;-oAy_lm|yo0Pp{2_H47__^2+Cv~--A;R7sfWWZH zREZP1uMg0YP@F(*=u4&x^ZSj=FJ?y+}p^EJOom_z^Wx1UaU>gmDRi zaUdr}(FODV#UoG8N)Rm4{c^Ceo+g9xpszdFj?LjU90X`)-+#?@c--7^7BGf)A0=N7 zN!{9zB*}3!l@Ety*tn5#84nZ$dPK&U=zxF;Jljj(YO9-Um)b%=EUpZCv22zvl ztWKN9Wj*@zNQ*_7T|#EyW&M{t)5AmDnx1{g z@b_9;j93CZ43qYidlc%2%dME|YyRO=5dGV+X9+4eg+A^d9b=>jp>SnDn@f8svW>ZR zkG1ae3u{@Md-jzzFUY>$gX=8Tns;?Gnez^~8KBQOpd5F`GPJfDVcyDIK!jg-{Ry!R z^K)^-rRpk5Y`N0J6VLl{I{g$@OWMKc?bXn$furAKtS$pIvB9NZIK@36Vz} z4?S@dw z0_;DlC1EY0B4*yk5udbSpN)Vp>_XhI&O%?9#x1WROFw4zh zxP*gmDE)gA<%hG)VL#wvvFqMec;0l!a?^f?Dp&^=)!nbQXh7Ic$(h20$A>9xIivmY za?{YZ-lUM}!D1T?C`(s%{@!5vxnJFS!8aK8Ny|IRO>zIw*?>;G^=PXkOx9e~5M@P5 z((C6pBI-GK>4*IfEX@(W$6lFs$2Kayj{Cavt)9VYRl>LARKMnVYjX3M`9Ml)LT7lc z`|e`)#XC&thQ9ofteXb$I2JxO)b&d$S^Z2EXs{#k0CGdv48 zJqzKA8jC`YX7f{qo?0_qV7DB3)fUO@cU6?9wzdt5uh{*5x|EyV&XweDmf*|ixp%N! zE9OeI7NxZnD6wep|uS+oOo^!|3$qQJmiMj-QmX_&*{7aIWPhfN8Tm z|EWfa9pp`94`U*U6uMbEw{jWmYwgh{!^vd5(d8Bx%U)5G15l0tDSb6V0t1hzE7kTJ zO(yBx$KE_)GpgOXg3{SLGc`QYOZn)r=^;@r)1WCpzy03ZXNQM$1D)@gTdVRNqZF+| z$Nf6Ho(J5gJ*ph-B{T7sw#W?t@dr#hP_x|V&2`U8vrZmq7cl;nC>IYgd!tw|YD#{w zg+_%D%n4ua^)Hu$a5j0!nyLX7>yOm`guwnwWzhI0~}+kP+|zwUvq*%djOC5C{o zQrR-QP*MMwGJ6Y?jzXT_Qk|f#d}r_B`nTLx5$`Zg+CbFN!d<7y= zMq!o;p&5tsLt<`S^DRSE)zt?YfN#})_@K*w12{02>6}t zei$a^G06g9?N!w+Jivc5r%^QNhBP8tq08x!*d51`@sLhnIr*WMwH1uaW}0Qosp?AB zCNTo|xT4H69dFh?-`gR95pO|}BSGQCX${@bTfBjAk&{m9FpBn14w%VZ(i#gzCWv-( z*Gz}|ErZl7DmXuh?%)=fKHEOp%n_~m?t-rt3}arf_H;C=xMoD@Jg_pMt|VkX7v*h5 zO~wtp9K@UjDG5y_j*7PWlmYcO-y2pR5Gmf}!XP7%jYqwFWT>WKQKy#9 zD}4ouri-lggcU)=MQ#AXj$TydK*xSg&u24U6n!klyQ20n%ku+nO4xHhu?1xYwd`Df zS8fHmBL3ZytYY&P8qjRz^UtTXW+5qqvF%JCCPawwT7+-B5%dedWF;3^{3+_~^7iAO z8*77ThO0)aZx50-+>|JSnlp9p^9#<=pLQp*%}SH3%A&(j9vjUBN~5l);c3C8s^Z}v9!zJK=SDP zPhRgto;_d6b*N`?8&FE|M&+=KXxdVN6CS6b2F0GNfe5tQp~CmQEU$0&w=`VQ=Afp{ zsM&YVs6LJE$r5TRx$%s+_|g!4G&3DxyH=sX!|loUOowI?J$`3nigX^lh0D*#7TOAv zIv$a=RzahrV>Tx_)T~%XLe6<1_ACPIc#ZQU(X`WVfkQPQv2(S`(NTZ)gz)Y>x1yV1 z2Qux^XprKOgD+2GJ5k~xWwD8iKXY|)*mVR)#W$=_Ii$J9s`S~Q3B8SJX+xDdEc zz0GbpbV}mF95Y@9$Ws`WGJIDYGN^Rikg%)bdcVUq0B?y2;8eQfV;!{$Jquw|u4*vx z2ZR0in@Wrn=!9-f28u1>$|gsBDWhhk?WZdl0{aJ}8PxmUJ#@yyt#FM(MavSFdDK^) z;rb|DGQigtqynSf;VQ?zQ4-AxnM^W;F+yQ(I99|x8~ALQ)XsB8)ipecryR zr<^qnra1$fWQ|Jf^vFH$8J!5DDI}A=EW1yW(N4R%BsazF6*&{)gu-y!eYBF7YWspe zrjl{GxFgH@+B*oD;K=g>1`Yb>j>`zKQ1>(nL)%;zCFG|n2BF=k+A<&Sq1pZdU09+; zSV4H(z)Eyoj9EBw(P9_ZT-C?r?Hj#G0k8dMZk#2L?PnegCm# z*+u+0hQI`4ewR~X4Pq%JEnWSAp^<6h5Mh&M;3abTd|>Hb_}Rru@mNxdaQ=ap8|^79 znU_x3=}&C&M7XR`{N6xgwU2iMLv|=Sy2G-0DOU6shRWQ;YH7RmJ(|5oh@(>V`Lssm zI#^@qkZFdXX*2uw%9l-nk#3Yjbdr-Sl0_+AxXeL@0{$!J+}Jx0&T#i3$M}R=O7pl) z^HgwQXtMrtLK`}Bn74?~u_6PfwO2KA#a z(BW_;bUxd`Jo!|fj2@F-Vu0oVLlUQxyfAxiBK5^ms4W(1`_Lps;g(PpYLaYboG1B} zEv6vGic%k#Nyn*YA4(;;_#+NOg%&01-gh!0qqv1X%F{-k!t=iDVx1;B!n7}VYBq;c zH>qZ_yYZ=1!@ga-SemYOHh3$f9ODn1-aHIlNZZugaPZ~(QZ7L*3IZXTWgFpSC5$Oj zt`z-FM!P5tsrMkATHx7P+OOT-w0ULQgQ`l)>lvB3L!M6^hn+638BNIYbK(YsJRM$0 zX=;3YFgoqW8o(7KdF{Xn2p&a4-)wf-CL8k$VDT7`IP`RHhd{W4)D-4OI0Ll`xof}! z86mIR0ClyN!>#|BbDalxn$E#txJ=@Vp-J`0e`i}OVdr{cDwDsLC_!ogI(dgd8)J-0>UcT3yK z+|tLO>zkA=)8SVp+{=3b?_{Yfas0$Y9A@dy&<$IqYPY)jNh@-p`ztSA0mAaD`FkbE z*r^Oky=K^uP!maVE&`K{(S}HOR386@u#*u2leB3fsn*ZW`?(6LXC!Vt_uiJeTWOgK z85{*iyiqUd7lJlQv$eyBFZ&vndkbQ3TW5@kl5y_5`qB!^GY9!Q@;?DnWGD#)v!3H z*^QHoDmB4V5~@ak@O<)yS3O?6$^b-uN{43H+IYa?pj<=T-eNugWU04wJot%X%?9W#{X8yOzlJy)Ur5vr8O z^SNMsw-)#L!y0j>HIFfr!Gazi@HsCe*!|tc0Ac-)+Qxs*|R4+9}-$*u`+xq>dBPrH~bnxq1)jzK`}F~^S2*OvJGtzdem~GwOy>nu4bXwJrI3a|A1@SGx(@Wfp~~PmlwK; z&0_%zg~yV`kwB99TZiHSC{CmS}hf<2Ek7eSkwQ^DUZNBw72V>_cABz6gAU+o*mkUHegmvb|8}a)9jCJ*XWu zA46$0R6=3l^>V0T{7#RFE)etP83Cz}XfEHjy`~d?rp`}uC)Z(lGLQNn;XlI$CS_KVFH!W4mSI>vG7d%bUc*-#i#X*bF?!; z_;KhT9qE5`hR|oB`((r}E{;t%E!)SNi9OVcj7TAboubBR^H79kuf(rJP^rwWk`dl=q8 zQbGnAu%&sB+nqt8Lq60^Tlf!sVKUrdo5Rqv*o~*phw0E%9?W91WPV;zL8$!KAX$$* zhPA%jX!g~bo3d1tw%(6IZf*~+K^7Z)D};gE zzssAZx;Tk8!Qdig1lgKn_jZWc4c>(6WZdJT1{DspCV7G(pt+ibp1?Ot3h&@?a7n^N zbpfzA56Q0BlzMUU6eeo4uiO3+8bma$W}>sN`c~$6tgZg6Zo@;#__sJaRpI7HSx?d> z{Sc2%JzGmz)v^1d_nKF{~>mvIfRk2f4QtV?*rp3K>|QBNMU`nXfc^ysiS8zU>C>s#>T zt*S=hyLb1aRmjH_qOSR)KbXP|x7_#jQ@`X@UexKm#F@X2vSb}Xo(X&>ye2^GMs~oq zSoSb`7>=r$zxKBE}rH`TDUKf>RQ34OMd>mS8(ocm7e-GMhx?QP9u^qsfct{Ii- zNgU^4A8S@R)8rk0tC1Y0)fC&F7#c~t4|k5OL=VkcOle%6A0Os)x1_$Kb-@a+ z6SQZ`8mawsfVST3r`VFYwm1zT7Ij{ha?$R_p#1G%94c&eXDARABrImo`9 z-Wz_uEO^fzI{)k844bme<;c_}&IbB5b>bCNI~4yFb>-rNhpj8-RrqcwFlREZs<$6% zMa-sb*+)dPWhsyGjy{UO=N#uk8gLKDWu1{CPjM~d8lZa-YY#Pfr!`W-yh!MX`vb8I z>8bIk?=GG!W{m_F>LIHBM5U1G^07#^M|fJ>-z>~aQOJ6cn7ehAr>~BU{s@?{KYX;o z{whg`dzHvYq?C)s-S^ijk@OLsm0E7ff#HkMKT^?CPB4lW{Wr8YIDzvV$6_E<$M}`?OH8OCLoQdQohlW@;RcO7n02#IVJ*7AXGhLE5VwODk0<0>w zrRmDRfY&6w1letyIWDbZ%^N>PYKAe=?}MURoufnNOVCj6`gTZeVxgx6Idf17B=BY$ z)D{C2F)%!KIr0 zYRsNTzIChY|MK<6toPH$TD0V{)U<{8mE$`VF>>c^d=c;8aJx>T0Co(V6!Ou@GzRKEWnpULh+z7MbLa-+q5=LHGr}W}yw?coB8H znb5idRSM9w4Ix6o%i!Lw&^%pH3lsgxcgioos%|>uR5o}oY}p1*5~TCs3XjQOqnnCZ zS(KF6#HMY{e!TKDAA! zFCedx<{-^gAn%TL9QZ5W*I|wSt)tcmCl{hnlGl3Js&VQOi^<2e>fF#gKm02RHqkcKb(?>wdo;49TN$rfgjeN7PCKUOw;+sak?|9=;1z=_VtBb-M zj}pkA-z7Xo`q<|Z3lF{bbXNAKm~v@(t&U zU=`i!g}c2@S)BEJ@7>;iLb^mNQWy0DFfI6EqdkXAAPbbmWCuOl?p3B%YxRy|MFtw6t>T2V-%0kc{i@OF zPoA0hX#0cR!*1%q>v~107OHRvwYayo@DR|yTD4U4YR$^{2?7ms{bc>7uJM-}N`cR| z6V3x~*eWC_=`gDN4?C2(dL)Lda8d6A7K+QLm*@KD1-)OmO0?U z++gmr3lA=3(RO~mtnm|lv>Qcw(=QI41Rz@e$^F-;@|}R43LDDf+Y`1Qu7fr}Oj!Di zQ}=!(f4I6khhYG8TZN@LSE?VW77K#ysg9Py7dPxOrq7N7mCrM7U=$1rG;Q`i!iuc-j@Peh z-uTW_5I+v+IHK}-L3d(u@h9tV$-3E5qFdVRXO;l!gcGy|(uj64u738#-)Ik;+gomx z(?Ogr;Dl))jT^P?YC9mwCUp8e*kA&|W98>c+49TNFB04b>f&$N*JuD;2r3@^446rQ z`fn8%eXoX*zy%GUQZ&LaL^enHD<1C8=L7LFB_$9q_=N7!-yN%bHm%Tisj)q=vVlt7 zF9KTDvF>PmEua*XdHOD`8eFMg1|QIB~-Vh6}NjEP)e7*$FAGmM~7_-K#Z%ec#nf$-%`-k45F zWz6dYdmfUI`_f3Xp^9-fOvv+_BX>YnP4eA}z6gW)JvQmd`XPqV{g(ruKXj zjxVTZz5tc?$!e_I_wTAt^sl+8`jl*DNRY4T6A!uVay{*zAef>}>@WCT&*pm?;7Lfze)U`z7p74iqvoxbU zu?CmM%5NvH1gIenb0?*u=)TJ##viO;h3ZwZ2nob%pjqhe(|n?dwu+9ZYX*&?)h=OQ z=sJ2gr=RwX4)XB)tR;QBijKNhhBzA{@EoN9)HL5^EluGAg_fRIdtk11zRW|>qCO_V z1L$@kJS2o`{?Dj3`vvx z#6XSgW`(TZs@ZdDi_$*7UlilfY(o?P>!PUo`A(mZ|Dd7DR*~V!@&7F_@Ro-PH0JGge1#joOq!PXOx*n! zGw6&f#>Jp2KT-O)K-FAHb6N%{u9@-(yGAW5g+PZs1el_I^lOq^IHH?y#^k4iyYEym zo&CE?x0-kO(Gw@WC^N9%uDuQdV2a!V_pQk$wndZZ^4bv-^ zu>?+(4jH8KxpZql%EH%A(t17|N3mmj`J3kCYUi9&hrA=n_|v|Z-PATWhbFz)xAZZc zcb$-gaQ!L>8WFOGB$29M0~gq!onw&}c9y(MagFONc-xNE74))jWKly3{-S$onP(D?^PZ!Mc796{GlS+`Usef-MRXeMAk=9<}oP-n~*(ez0uCz z(gM)+jSGzUE7JvhjK~RWz6aW8fBlm^P7Ah?U`}8)H!~KrBlb*wgzP%0n1*Vr3*TS@ zNHbZyz4{V7M9qGyQ4(?T%N8`u;e-UhE3Y!UQ@6!OtbQ8A)nw&s5TVr(G_}=0uMneuEfT+-B0i6~`vO(gWXFfD@uqIy_Nn^f*Qg zG^f8S>I`?Qn+T&MJVRML{A=DZ0FDh9m8cn z7B*QR&+?-dhULyZ;|YP2R%#WFfnC}JSReI!b54$jkMFWbNyY&x1XNUdJ$2eTCt!32 zwoEKw-gxK{kFoOrpQq&+Pl=b9F;^HwyudK zfdcXQ{gsJs^k~hxCx_rb|E~c=g)o3J^QRLyQ23(Y?*zzfIzqWSnLD@8(>r_P2V<-! z6ygW&zabB^tbYC*KO~aYHy0=g=6Hwnf>i_rQ4VY81^n7p9Gek0qw*Zs5UapQBNQU_4GAj1~ zLn#6NHR)J%f58qo5D-A=WdF4uSuQ1-X#{pQZc|Am*(n&-&%1%_hi<5JwEoHfFR7=i z$f?IczDn8Pjj$sv5W~3IF;;?D^aKP*Z$3M(kX}9oY?BU!I-v06iZ7!lj0V^xG|*#P z1{x)awk%g<()L!aZSFy`NLd7vcn^@?e>GP>$)}{^1|>?wVqhDHCB5xjQQM9Uqi7gO zh_9P60k)kK!nO-8HA1xVvx2}`0W{k21BLO2p9YV7ep9EizcCda26AHkg%3=x3V^@L z34zzY$d#PMu_q{5 z`5Z%M9&E*QU=4=7exHWu+vzEVl-zaDz9hfoU!O|jexm~VYo^wcX+8``rShLsz8%I( zx2IwXld8~n(uyHw7iG0M_$mk=G4?zElRjnQ6@z6vUAc8TRNQ|fkHip^<7o`7LJ42SRkP&CZAsNju$d{e8at6l-X+&C6t z=py54A|(2eIA5eDueGA#Y24Rkwi7eoBP!cq9?`uDtHB!`7;JTFFGL=uNB0WPHK>iI zcmtlt$)ev9)B$1|cxl4%{88@nmcl)KVBh?gza|f_hL|xmSoAm%^0F@-l*N%(aj$eRB215rUD;rjkRt`qC4u(_|y%g{%TW`U06!Zc3 zwfh|#a6Mi%Uv6mM7$gJo%KIF3OIx^QEe`})>(hQLS84^Q+!lIWPRpp<`Qc@{DXM(7 zSUIKjMDNYXMDD8N$!6|d0UnK=fX=Myl9n*d6URnI0tK){ahPU}QxRobNGPH{ONgC0 z2GkcbJG54tcxX1cUdpc`TY=?TkixFhO#Z9NlOc^DUC{O($emEvt#CdQwbpgV#aThc zSIz5x(-QS|xy&Xdp6Uo(4V2>@f6qB#bKyAd#CDwRNGp$@^HyruijfjUFdDLK?4KhH z5kJVy^??s2PMh776PkicUqV<4pxquJ8I`JIrm?1JD)5~}{792%c3tQA;kz@)wKpse z;Q7(sbfCDAo}&mHc7b{ANHpcsrV zV&!(dZu;ACwk{57m9=x8U040+liQ{_&}S6$#(<7{^bVm6TCD)?QHK+D#;pQ1Z2B$I zeDLLnn(a`_YT#9z4d)62k;}=K>sN{84_RH9&G2tQ70aa)#mnKWoU8Npu>JP-l2*55 z!y+rt6(Hn79=w_tG=6(ch#Npf&iV;Dp1m?BoT>itjj%^n+wr}&Pq=bx?|srjlzY|K zif$kA7Ksa=OgTXkCE@psby927;5zZT$vU82e zCzZS_9E$PTrl)hBh@FQEY^MsOK~>MenX!r+@`i0>3~+!T419+eRPwXj8zVt9dNn2~ zpz3NMSAG_B|IWGUo9}{_{P}Y_!)G^YmLi(Jwb&+|Zg(3bl<0~GqJVNPUIAhJKX(y< z$I(c-GfP21;jo-wN4K{RPBAUhL8va*M<@h5<9!rK1jYeF%J(U_IB`fKqcbqqLoqr| zcY@xw$5Wk;1Ex1SpmidS0W0EIXPh2J-3B}Jfp-FKO7jKbefTJry<7z7mZ#ecz~uDK zt&k400yMHr`EWtS1l1!{Uw&V#nhyu^RcjM!`MDidsMqNzw>Hstb3Bojr-B=@+dS!Z!W+%_L* z-Ci+W))2Q{*|pRP1)XkZyC1Zz*)Duem@L;zt(~%;i2+s_hcGNR=!*$nY_oflQ4!4O z!+lws8NMk`P7tdFm(>y%of8E2poxZtjD~b~)c5!TKW>%oqwPel`^^OfVBHF(a%Y+{ z$Lf_66Hc`P@S;7EeZZ?58MCupwaLOhMMSUxR9oel`Xs;kwa^q>Df1`-_%Tv%SUuF$ zwfJ($jL`s|tN0#vqh?3w!(T~?l(iFi8AZY{zQ-qX(tziPpf)L=G`#wI6Ui~~90^63 zG)UaWtpdXi)9(GDYLuGf9}fN2GYW3Lo#Z)#Z)A_q=05s7b$GTp%D?BiB9z6FgrwbPUUlQhZ_i#K}a&#S~y3i+6yACyNvzRQjcNPO-NikIPCETNv^pBCevcXl$Y>W^>9#*;O zh@|^s)Ji&E_jvBF8NrP(BRqe7T=_fk7g9)sat=2um&9?aBaaU(t&S2ue~OGJbRY(p zuipDIZ8b0YcczHS@l`F4&Ooj~{-w+5b}4{PxJw@}?ov3ldEhX}4FWP5rthUE7lCjW z!ug^Q<$Hur$o%%X6&Ot&&We{e|L_tnz)(?$E^U241ktyf~B5e06mO>FL#7(0Rqy>C_U3` zNj*xjdiJ=zZyO?Z79)j5VEE<{N~&Gz-;0AaCq*ChX9p4lSXLg5q~&F`Iya{?VFjTv zBR#R7#vk83(}9BeCjo&dA53le8=!kp!0q0HX|{vd-8+670{lXkxq!V!uzY8cz;ihA zD$U9LUD*ZqkY^bv@k^(LX(W6zDCBu#F>L!1WLJ05rJF!2;EZpS)OPSo2)VpyQ^&b> zaWz>f)wJsg;>bZP1H=}DIN6!PTBiRQ7gdJf&tPg(Qy$y*ogF;xh+CCT;_pmw0f?AY z@3oUHdmKy9CIqGot0Ey+xJkY5BC$SLnnO_~y6yG%eh@L~NyKYz2W#;E`^hSK2sl2N zZiMV~S&^}7P0RYG~FFK^?vw5l+ge(gZM!cYj8l}Jx-B>!G`?lqKB1z4J?AX@cf)@}Al4X6TY+!{C! z3}xI?rYpbqsD3?H-xP7q&?!=SU`~33*?TnkzA%OV<(%C5W%J?sTT|_w>8b#hC+>9S zd>^bwhC_xXn47%-1tYpRoxj*mKIaXahHK)5z31CRO_L_qp38aS#uxpBOz1OONp{?kY~74e5Q!7KfoARL4#B3?4~;1&worAhJRp>r_fYvb{2qHZ^x!pm}+I$5#Ir9d&9O1 zKVK&0w%%Et>yP_hadVHMv*$YCdoPongJSHGk_yeEs91>UIPq01SxQw`b0D?D_Z zaXqFUIlsr(y8>EEa)6Q|H3#MyyAZnsmmIWf*(~8ea4vAS8?A@4lIkMm1VK&kZ>rpX z*CH0MM|ua8>>mH!Y&6kOWR{zE#_QepRiu0><6hUqDfEEDUDx6qgS7&nFBrdt!U%>4 z5&Qu2w~%OtA`8tog6^RAwAM(Dggifn&;)p>Q80UQzajl5H70G$>_wg+xksp6(2tFd z{}R;qz175H&W-@IM77#`?hPSmZ$!bdope7mDZDEk&_6KUtbZ2_^S>O3%3yccgI|P< zMgpvYCZH9-LeNm}MSS)?TICw6+ScunGjOuYo!S1<_R-%%XcuAsdeTb#b+!=avmq2o7PS`x!4kPdFm%=@ZoJNR zg{(z4BqyoO@6a0tKrP*Po^%*&EaaF_X*iDqYf9~=!!|Be3!sb(*wf-3y*%Il5zZdw zPB1P@kj_#TONp|EDWoNPA0sY@p{${~-nv`pq)sV`aTl$O732q~Dg!eIUc4C*_xUXv z)a5zqEfB7g))|f+d$k2*VDbeK{5VGK*V}#|GYFGLugA1ym^9HT{jx#Y@d*9?br`-R z!3OcrgFlj&KZ#HZaY&5*Rq^LsMfm+YrH@dy{aL3K4X^)glt(~}2GsQQo*vHAD4{>7 z(^<7+J6b&&CfB!6nQ-(*c;ApDXQWs8t5yS@$JfM z-C%4ZA6^cs@B_j7?8^XfKXMcwrUV^Ui+JKHBXMv$m zC>@60`B};iNH8pu?4(~34KZXDNs$mH^YKQ3zOID;mNMy>32WWwgTdVWb&$olkFB1oNoaHr|U+20&=>*tgOtp$y7LbrzByrTw;xj>$ihFkzKhC80u4lQ(dRa zlbpXc%vgdHmgK#Y037nYw$Zb{hCRa4L}onv;kBgI6@lA>%IYwYEUS43BO>Ju+!xnl zl)74M^OKjDptL6NU_1cZENl#EVl!S<0wTM@$vuE9fT1vDC$?GT?}qOfUW6M&Kg-W3 zE}vJP24eI}c?ot7x2iN3I7J83{>rzn4vz)ZLsGCuYMfKn@H;T^vyL1VK9A-8%ux8d zpp@uq6)3ut;ME=+|60G)A!hs$(1SQ(`f^0zr#w>eZ=1;(0>i@cqO1G=&d`7VAlO9M zF`M|oo~HjCF>n(Id<)Zp7(J8Vl?5>ThAmd;t$}4|G4reSV(BeVc8$$DweR`9TlOIy z_PWV8F!AZJMg7GsvC5M`B{KY!uin= z1Wok6wMjjO4vx*?{ft!9*IC+{D8&r=0?FrD9#uf3M!;9nUmym>U$x;MuLSW4GbFep z^aRJ8MGBBeTVbhE3(~M}ydlfLXm|qo9;}H6!9@iHzsk6Yo5qJ=4Z3K!@`Kn1kwW>~YAY7({vAC!PY}&8|9&D90goZ!WR5Tg7Aj^O zS?KH?;4~H_e+MinN>S&$Nn8+AGO{=g}pm0^9O`?~53@9W299r!v9(fBYP<28_@uai}{9m>w*3 zM-zqf!3xRI+C3EK3GF@&^0riMfbyjtnqqOTb=3gt8QN6fRMSsK7xSk%u5y z#_Mfpr~I!A8zZFz4VL@H>kOz}1gB5D3BxHtxh#q8pPS3!tHD%GMRpyNryJ1PFCa=V z>~}F!3)Q;}y1a_C&TCJ-ObD)S1uk zpM2jzc@+*Li@V9;G4`ApAT7IhrpwHg{k84DP>3U55ZW~3e{T_d!jCxOq|6fGXrXwt z;`fF9fYnym6^TCq2xf|}C9le!k_Tklhe`z`QW654=346zn%lUM z{SGL5WY&E5=@#V}D5wQ(2pFmvw*iFB$rfO1lV_e&wLX9HhBbbI9d{fM8smX~b-*3F z`0v_<@Pn5bokEja{eNEOdno$XGAT;{+BA^PSEvL9xwHo+N~XSBELt<}RqcQWzgmWl z_Y95$Mkw6`7_CW2oqzCE=^=cC(5D2nYR@re;I$pB&_!wJA_|VxbfwWczN#It;mW)Y z7ORZ{{=5Pb!4&K50H7EnEbF=Ak|O$dLu953A-)OqVs0VkM!aW#U#?mT6v#Lblgl18 zVk&ZbGIOoeV!|e?fek5{-3fogHmM#<%ue`mpH|daDqR`Yp_Ki|BY9Asj=m19kkTGa zfjUmGsP!L<22@|#C;vfzJx*&||L=c{qGMcU4)yUixVb{=pFW-ul{FiAP)J8D2Mx5 zJCpG@V*7vpJ_-wQc*mHJD*W%a{m*w3JVgAG`pmfg|GL^gzt;*0_GO9xum35B6;l1Y zMH}=0X4Gq&row@^|CHs`<*H@O GLjMmW51dK> diff --git a/docs/html/MetaAssertion_8h__incl.map b/docs/html/MetaAssertion_8h__incl.map deleted file mode 100644 index ba5b218..0000000 --- a/docs/html/MetaAssertion_8h__incl.map +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/docs/html/MetaAssertion_8h__incl.md5 b/docs/html/MetaAssertion_8h__incl.md5 deleted file mode 100644 index 3c45e54..0000000 --- a/docs/html/MetaAssertion_8h__incl.md5 +++ /dev/null @@ -1 +0,0 @@ -227cf95a68ed36f0a579801190ac6712 \ No newline at end of file diff --git a/docs/html/MetaAssertion_8h__incl.png b/docs/html/MetaAssertion_8h__incl.png deleted file mode 100644 index 6548774d16a984ebba3c856f4d900c0b6ecb8419..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21126 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 diff --git a/docs/html/MetaAssertion_8h_source.html b/docs/html/MetaAssertion_8h_source.html index 404dace..9aaaf16 100644 --- a/docs/html/MetaAssertion_8h_source.html +++ b/docs/html/MetaAssertion_8h_source.html @@ -3,9 +3,9 @@ - + -AUnit: /Users/brian/dev/AUnit/src/aunit/MetaAssertion.h Source File +AUnit: /home/brian/dev/AUnit/src/aunit/MetaAssertion.h Source File @@ -22,7 +22,7 @@
AUnit -  0.4.1 +  0.5.0
Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
@@ -31,21 +31,18 @@
- + +
MetaAssertion.h
-Go to the documentation of this file.
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
25 // Significant portions of the design and implementation of this file came from
26 // https://github.com/mmurdoch/arduinounit/blob/master/src/ArduinoUnit.h
27 
34 #ifndef AUNIT_META_ASSERTION_H
35 #define AUNIT_META_ASSERTION_H
36 
37 #include "Printer.h"
38 #include "Assertion.h"
39 
40 class __FlashStringHelper;
41 
42 // Meta tests, same syntax as ArduinoUnit for compatibility.
43 // The checkTestXxx() macros return a boolean, and execution continues.
44 
46 #define checkTestDone(name) (test_##name##_instance.isDone())
47 
49 #define checkTestNotDone(name) (test_##name##_instance.isNotDone())
50 
52 #define checkTestPass(name) (test_##name##_instance.isPassed())
53 
55 #define checkTestNotPass(name) (test_##name##_instance.isNotPassed())
56 
58 #define checkTestFail(name) (test_##name##_instance.isFailed())
59 
61 #define checkTestNotFail(name) (test_##name##_instance.isNotFailed())
62 
64 #define checkTestSkip(name) (test_##name##_instance.isSkipped())
65 
67 #define checkTestNotSkip(name) (test_##name##_instance.isNotSkipped())
68 
70 #define checkTestExpire(name) (test_##name##_instance.isExpired())
71 
73 #define checkTestNotExpire(name) (test_##name##_instance.isNotExpired())
74 
75 // If the assertTestXxx() macros fail, they generate an optional output, calls
76 // fail(), and returns from the current test case.
77 
79 #define assertTestDone(name) \
80  assertTestStatus(name, isDone, kMessageDone)
81 
83 #define assertTestNotDone(name) \
84  assertTestStatus(name, isNotDone, kMessageNotDone)
85 
87 #define assertTestPass(name) \
88  assertTestStatus(name, isPassed, kMessagePassed)
89 
91 #define assertTestNotPass(name) \
92  assertTestStatus(name, isNotPassed, kMessageNotPassed)
93 
95 #define assertTestFail(name) \
96  assertTestStatus(name, isFailed, kMessageFailed)
97 
99 #define assertTestNotFail(name) \
100  assertTestStatus(name, isNotFailed, kMessageNotFailed)
101 
103 #define assertTestSkip(name) \
104  assertTestStatus(name, isSkipped, kMessageSkipped)
105 
107 #define assertTestNotSkip(name) \
108  assertTestStatus(name, isNotSkipped, kMessageNotSkipped)
109 
111 #define assertTestExpire(name) \
112  assertTestStatus(name, isExpired, kMessageExpired)
113 
115 #define assertTestNotExpire(name) \
116  assertTestStatus(name, isNotExpired, kMessageNotExpired)
117 
119 #define assertTestStatus(name,method,message) do {\
120  if (!assertionTestStatus(\
121  __FILE__,__LINE__,#name,FPSTR(message),test_##name##_instance.method()))\
122  return;\
123 } while (false)
124 
125 // Meta tests for testF() and testingF() are slightly different because
126 // the name of the fixture class is appended to the instance name.
127 
129 #define checkTestDoneF(test_class,name) \
130  (test_class##_##name##_instance.isDone())
131 
133 #define checkTestNotDoneF(test_class,name) \
134  (test_class##_##name##_instance.isNotDone())
135 
137 #define checkTestPassF(test_class,name) \
138  (test_class##_##name##_instance.isPassed())
139 
141 #define checkTestNotPassF(test_class,name) \
142  (test_class##_##name##_instance.isNotPassed())
143 
145 #define checkTestFailF(test_class,name) \
146  (test_class##_##name##_instance.isFailed())
147 
149 #define checkTestNotFailF(test_class,name) \
150  (test_class##_##name##_instance.isNotFailed())
151 
153 #define checkTestSkipF(test_class,name) \
154  (test_class##_##name##_instance.isSkipped())
155 
157 #define checkTestNotSkipF(test_class,name) \
158  (test_class##_##name##_instance.isNotSkipped())
159 
161 #define checkTestExpireF(test_class,name) \
162  (test_class##_##name##_instance.isExpired())
163 
165 #define checkTestNotExpireF(test_class,name) \
166  (test_class##_##name##_instance.isNotExpired())
167 
168 // If the assertTestXxx() macros fail, they generate an optional output, calls
169 // fail(), and returns from the current test case.
170 
172 #define assertTestDoneF(test_class,name) \
173  assertTestStatusF(test_class, name, isDone, kMessageDone)
174 
176 #define assertTestNotDoneF(test_class,name) \
177  assertTestStatusF(test_class, name, isNotDone, kMessageNotDone)
178 
180 #define assertTestPassF(test_class,name) \
181  assertTestStatusF(test_class, name, isPassed, kMessagePassed)
182 
184 #define assertTestNotPassF(test_class,name) \
185  assertTestStatusF(test_class, name, isNotPassed, kMessageNotPassed)
186 
188 #define assertTestFailF(test_class,name) \
189  assertTestStatusF(test_class, name, isFailed, kMessageFailed)
190 
192 #define assertTestNotFailF(test_class,name) \
193  assertTestStatusF(test_class, name, isNotFailed, kMessageNotFailed)
194 
196 #define assertTestSkipF(test_class,name) \
197  assertTestStatusF(test_class, name, isSkipped, kMessageSkipped)
198 
200 #define assertTestNotSkipF(test_class,name) \
201  assertTestStatusF(test_class, name, isNotSkipped, kMessageNotSkipped)
202 
204 #define assertTestExpireF(test_class,name) \
205  assertTestStatusF(test_class, name, isExpired, kMessageExpired)
206 
208 #define assertTestNotExpireF(test_class,name) \
209  assertTestStatusF(test_class, name, isNotExpired, kMessageNotExpired)
210 
212 #define assertTestStatusF(test_class,name,method,message) do {\
213  if (!assertionTestStatus(\
214  __FILE__,__LINE__,#name,FPSTR(message),\
215  test_class##_##name##_instance.method()))\
216  return;\
217 } while (false)
218 
219 namespace aunit {
220 
225 class MetaAssertion: public Assertion {
226  protected:
227  // Human-readable strings for various meta-asssertion messages.
228  // They need to be protected, not private, because they are used by
229  // subclasses through the test() and testing() macros.
230  static const char kMessageDone[];
231  static const char kMessageNotDone[];
232  static const char kMessagePassed[];
233  static const char kMessageNotPassed[];
234  static const char kMessageFailed[];
235  static const char kMessageNotFailed[];
236  static const char kMessageSkipped[];
237  static const char kMessageNotSkipped[];
238  static const char kMessageExpired[];
239  static const char kMessageNotExpired[];
240 
243 
248  bool assertionTestStatus(const char* file, uint16_t line,
249  const char* testName, const __FlashStringHelper* statusMessage,
250  bool ok);
251 
254  bool ok, const char* file, uint16_t line,
255  const char* testName, const __FlashStringHelper* statusMessage);
256 
257  private:
258  // Disable copy-constructor and assignment operator
259  MetaAssertion(const MetaAssertion&) = delete;
260  MetaAssertion& operator=(const MetaAssertion&) = delete;
261 
262 };
263 
264 }
265 
266 #endif
void printAssertionTestStatusMessage(bool ok, const char *file, uint16_t line, const char *testName, const __FlashStringHelper *statusMessage)
Print the meta assertion passed or failed message.
-
Class that extends the Assertion class to support the checkTestXxx() and assertTestXxx() macros that ...
-
bool assertionTestStatus(const char *file, uint16_t line, const char *testName, const __FlashStringHelper *statusMessage, bool ok)
Set the status of the current test based on &#39;ok, and print assertion message if requested.
-
MetaAssertion()
Empty constructor.
+
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
25 // Significant portions of the design and implementation of this file came from
26 // https://github.com/mmurdoch/arduinounit/blob/master/src/ArduinoUnit.h
27 
28 #ifndef AUNIT_META_ASSERTION_H
29 #define AUNIT_META_ASSERTION_H
30 
31 #include "Printer.h"
32 #include "Assertion.h"
33 
34 class __FlashStringHelper;
35 
36 namespace aunit {
37 
42 class MetaAssertion: public Assertion {
43  protected:
44  // Human-readable strings for various meta-asssertion messages.
45  // They need to be protected, not private, because they are used by
46  // subclasses through the test() and testing() macros.
47  static const char kMessageDone[];
48  static const char kMessageNotDone[];
49  static const char kMessagePassed[];
50  static const char kMessageNotPassed[];
51  static const char kMessageFailed[];
52  static const char kMessageNotFailed[];
53  static const char kMessageSkipped[];
54  static const char kMessageNotSkipped[];
55  static const char kMessageExpired[];
56  static const char kMessageNotExpired[];
57 
60 
65  bool assertionTestStatus(const char* file, uint16_t line,
66  const char* testName, const __FlashStringHelper* statusMessage,
67  bool ok);
68 
71  bool ok, const char* file, uint16_t line,
72  const char* testName, const __FlashStringHelper* statusMessage);
73 
74  private:
75  // Disable copy-constructor and assignment operator
76  MetaAssertion(const MetaAssertion&) = delete;
77  MetaAssertion& operator=(const MetaAssertion&) = delete;
78 
79 };
80 
81 }
82 
83 #endif
void printAssertionTestStatusMessage(bool ok, const char *file, uint16_t line, const char *testName, const __FlashStringHelper *statusMessage)
Print the meta assertion passed or failed message.
+
Class that extends the Assertion class to support the checkTestXxx() and assertTestXxx() macros that ...
Definition: MetaAssertion.h:42
+
bool assertionTestStatus(const char *file, uint16_t line, const char *testName, const __FlashStringHelper *statusMessage, bool ok)
Set the status of the current test based on &#39;ok, and print assertion message if requested.
+
MetaAssertion()
Empty constructor.
Definition: MetaAssertion.h:59
-
An Assertion class is a subclass of Test and provides various overloaded assertion() functions...
Definition: Assertion.h:98
-
Various assertXxx() macros are defined in this header.
+
An Assertion class is a subclass of Test and provides various overloaded assertion() functions...
Definition: Assertion.h:55
diff --git a/docs/html/Printer_8cpp_source.html b/docs/html/Printer_8cpp_source.html index 502aca7..96c2d0c 100644 --- a/docs/html/Printer_8cpp_source.html +++ b/docs/html/Printer_8cpp_source.html @@ -3,9 +3,9 @@ - + -AUnit: /Users/brian/dev/AUnit/src/aunit/Printer.cpp Source File +AUnit: /home/brian/dev/AUnit/src/aunit/Printer.cpp Source File @@ -22,7 +22,7 @@
AUnit -  0.4.1 +  0.5.0
Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
@@ -31,21 +31,18 @@
- + +
Printer.cpp
-
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
25 #include <Arduino.h>
26 #include "Printer.h"
27 #include "FCString.h"
28 
29 namespace aunit {
30 
31 Print* Printer::sPrinter = &Serial;
32 
33 void Printer::print(const FCString& s) {
34  if (s.getType() == FCString::kCStringType) {
35  getPrinter()->print(s.getCString());
36  } else {
37  getPrinter()->print(s.getFString());
38  }
39 }
40 
41 void Printer::println(const FCString& s) {
42  if (s.getType() == FCString::kCStringType) {
43  getPrinter()->println(s.getCString());
44  } else {
45  getPrinter()->println(s.getFString());
46  }
47 }
48 
49 }
static void print(const FCString &s)
Convenience method for printing an FCString.
Definition: Printer.cpp:33
-
static void println(const FCString &s)
Convenience method for printing an FCString.
Definition: Printer.cpp:41
+
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
25 #include <Arduino.h>
26 #include "Printer.h"
27 #include "FCString.h"
28 
29 namespace aunit {
30 
31 Print* Printer::sPrinter = &Serial;
32 
34  if (s.getType() == internal::FCString::kCStringType) {
35  getPrinter()->print(s.getCString());
36  } else {
37  getPrinter()->print(s.getFString());
38  }
39 }
40 
42  if (s.getType() == internal::FCString::kCStringType) {
43  getPrinter()->println(s.getCString());
44  } else {
45  getPrinter()->println(s.getFString());
46  }
47 }
48 
49 }
static void print(const internal::FCString &s)
Convenience method for printing an FCString.
Definition: Printer.cpp:33
+
A union of (const char*) and (const __FlashStringHelper*) with a discriminator.
Definition: FCString.h:51
-
A union of (const char*) and (const __FlashStringHelper*) with a discriminator.
Definition: FCString.h:50
-
static Print * getPrinter()
Get the output printer used by the various assertion() methods and the TestRunner.
Definition: Printer.h:50
+
static void println(const internal::FCString &s)
Convenience method for printing an FCString.
Definition: Printer.cpp:41
+
static Print * getPrinter()
Get the output printer used by the various assertion() methods and the TestRunner.
Definition: Printer.h:52
diff --git a/docs/html/Printer_8h_source.html b/docs/html/Printer_8h_source.html index 9aab5ca..e13e2d1 100644 --- a/docs/html/Printer_8h_source.html +++ b/docs/html/Printer_8h_source.html @@ -3,9 +3,9 @@ - + -AUnit: /Users/brian/dev/AUnit/src/aunit/Printer.h Source File +AUnit: /home/brian/dev/AUnit/src/aunit/Printer.h Source File @@ -22,7 +22,7 @@
AUnit -  0.4.1 +  0.5.0
Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
@@ -31,21 +31,18 @@
- + +
Printer.h
-
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
25 #ifndef AUNIT_PRINTER_H
26 #define AUNIT_PRINTER_H
27 
28 class Print;
29 
30 namespace aunit {
31 
32 class FCString;
33 
43 class Printer {
44  public:
50  static Print* getPrinter() { return sPrinter; }
51 
53  static void setPrinter(Print* printer) { sPrinter = printer; }
54 
56  static void print(const FCString& s);
57 
59  static void println(const FCString& s);
60 
61  private:
62  // Disable copy-constructor and assignment operator
63  Printer(const Printer&) = delete;
64  Printer& operator=(const Printer&) = delete;
65 
66  static Print* sPrinter;
67 };
68 
69 }
70 
71 #endif
static void print(const FCString &s)
Convenience method for printing an FCString.
Definition: Printer.cpp:33
-
static void setPrinter(Print *printer)
Set the printer.
Definition: Printer.h:53
-
Utility class that provides a level of indirection to the Print class where test results can be sent...
Definition: Printer.h:43
-
static void println(const FCString &s)
Convenience method for printing an FCString.
Definition: Printer.cpp:41
+
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
25 #ifndef AUNIT_PRINTER_H
26 #define AUNIT_PRINTER_H
27 
28 class Print;
29 
30 namespace aunit {
31 
32 namespace internal {
33 class FCString;
34 }
35 
45 class Printer {
46  public:
52  static Print* getPrinter() { return sPrinter; }
53 
55  static void setPrinter(Print* printer) { sPrinter = printer; }
56 
58  static void print(const internal::FCString& s);
59 
61  static void println(const internal::FCString& s);
62 
63  private:
64  // Disable copy-constructor and assignment operator
65  Printer(const Printer&) = delete;
66  Printer& operator=(const Printer&) = delete;
67 
68  static Print* sPrinter;
69 };
70 
71 }
72 
73 #endif
A union of (const char*) and (const __FlashStringHelper*) with a discriminator.
Definition: FCString.h:51
+
static void setPrinter(Print *printer)
Set the printer.
Definition: Printer.h:55
+
Utility class that provides a level of indirection to the Print class where test results can be sent...
Definition: Printer.h:45
-
A union of (const char*) and (const __FlashStringHelper*) with a discriminator.
Definition: FCString.h:50
-
static Print * getPrinter()
Get the output printer used by the various assertion() methods and the TestRunner.
Definition: Printer.h:50
+
static Print * getPrinter()
Get the output printer used by the various assertion() methods and the TestRunner.
Definition: Printer.h:52
diff --git a/docs/html/TestAgain_8cpp_source.html b/docs/html/TestAgain_8cpp_source.html index 61b3879..ee4ce06 100644 --- a/docs/html/TestAgain_8cpp_source.html +++ b/docs/html/TestAgain_8cpp_source.html @@ -3,9 +3,9 @@ - + -AUnit: /Users/brian/dev/AUnit/src/aunit/TestAgain.cpp Source File +AUnit: /home/brian/dev/AUnit/src/aunit/TestAgain.cpp Source File @@ -22,7 +22,7 @@
AUnit -  0.4.1 +  0.5.0
Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
@@ -31,21 +31,18 @@
- + + - + +
TestAgain.h
-
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
25 #ifndef AUNIT_TEST_AGAIN_H
26 #define AUNIT_TEST_AGAIN_H
27 
28 #include <stdint.h>
29 #include "FCString.h"
30 #include "MetaAssertion.h"
31 
32 class __FlashStringHelper;
33 
34 namespace aunit {
35 
37 class TestAgain: public MetaAssertion {
38  public:
40  TestAgain() {}
41 
47  virtual void loop() override;
48 
50  virtual void again() = 0;
51 
52  private:
53  // Disable copy-constructor and assignment operator
54  TestAgain(const TestAgain&) = delete;
55  TestAgain& operator=(const TestAgain&) = delete;
56 };
57 
58 }
59 
60 #endif
virtual void again()=0
User-provided test case.
-
Various assertTestXxx() and checkTestXxx() macros are defined in this header.
+
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
25 #ifndef AUNIT_TEST_AGAIN_H
26 #define AUNIT_TEST_AGAIN_H
27 
28 #include <stdint.h>
29 #include "FCString.h"
30 #include "MetaAssertion.h"
31 
32 class __FlashStringHelper;
33 
34 namespace aunit {
35 
37 class TestAgain: public MetaAssertion {
38  public:
40  TestAgain() {}
41 
47  virtual void loop() override;
48 
50  virtual void again() = 0;
51 
52  private:
53  // Disable copy-constructor and assignment operator
54  TestAgain(const TestAgain&) = delete;
55  TestAgain& operator=(const TestAgain&) = delete;
56 };
57 
58 }
59 
60 #endif
virtual void again()=0
User-provided test case.
Similar to TestOnce but performs the user-defined test multiple times.
Definition: TestAgain.h:37
-
Class that extends the Assertion class to support the checkTestXxx() and assertTestXxx() macros that ...
+
Class that extends the Assertion class to support the checkTestXxx() and assertTestXxx() macros that ...
Definition: MetaAssertion.h:42
TestAgain()
Constructor.
Definition: TestAgain.h:40
virtual void loop() override
Calls the user-provided again() method multiple times until the user code explicitly resolves the tes...
Definition: TestAgain.cpp:29
@@ -83,7 +79,7 @@ diff --git a/docs/html/TestMacro_8h__dep__incl.map b/docs/html/TestMacro_8h__dep__incl.map deleted file mode 100644 index 08f456a..0000000 --- a/docs/html/TestMacro_8h__dep__incl.map +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/docs/html/TestMacro_8h__dep__incl.md5 b/docs/html/TestMacro_8h__dep__incl.md5 deleted file mode 100644 index d4fec3e..0000000 --- a/docs/html/TestMacro_8h__dep__incl.md5 +++ /dev/null @@ -1 +0,0 @@ -2855bbbf4d5d8e51e552df90bcdf2bb7 \ No newline at end of file diff --git a/docs/html/TestMacro_8h__dep__incl.png b/docs/html/TestMacro_8h__dep__incl.png deleted file mode 100644 index b11263c3c0460cec97ddca95cc592e1cfb009dab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8030 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 HVc`D&Tdk*_ diff --git a/docs/html/TestMacro_8h__incl.map b/docs/html/TestMacro_8h__incl.map deleted file mode 100644 index c53159c..0000000 --- a/docs/html/TestMacro_8h__incl.map +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/docs/html/TestMacro_8h__incl.md5 b/docs/html/TestMacro_8h__incl.md5 deleted file mode 100644 index 9b8dac4..0000000 --- a/docs/html/TestMacro_8h__incl.md5 +++ /dev/null @@ -1 +0,0 @@ -e984a502f0bf49e17a71529bba33c3cf \ No newline at end of file diff --git a/docs/html/TestMacro_8h__incl.png b/docs/html/TestMacro_8h__incl.png deleted file mode 100644 index 4281f58b6b38c6241f7883c9d29c9dd0df7d461b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58848 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 diff --git a/docs/html/TestMacro_8h_source.html b/docs/html/TestMacro_8h_source.html deleted file mode 100644 index 1c205eb..0000000 --- a/docs/html/TestMacro_8h_source.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - -AUnit: /Users/brian/dev/AUnit/src/aunit/TestMacro.h Source File - - - - - - - - - -
-
- - - - - - -
-
AUnit -  0.4.1 -
-
Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
TestMacro.h
-
-
-Go to the documentation of this file.
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
32 #ifndef AUNIT_TEST_MACRO_H
33 #define AUNIT_TEST_MACRO_H
34 
35 #include <stdint.h>
36 #include <Arduino.h> // F() macro
37 #include "FCString.h"
38 #include "TestOnce.h"
39 #include "TestAgain.h"
40 
41 class __FlashStringHelper;
42 
43 // On the ESP8266 platform, The F() string cannot be placed in an inline
44 // context, because it interferes with other PROGMEM strings. See
45 // https://github.com/esp8266/Arduino/issues/3369. The solution was to move the
46 // constructor definition out from an inline function into a normal function
47 // defined outside of the class declaration..
48 
50 #define test(name) struct test_ ## name : aunit::TestOnce {\
51  test_ ## name();\
52  virtual void once() override;\
53 } test_ ## name ## _instance;\
54 test_ ## name :: test_ ## name() {\
55  init(F(#name)); \
56 }\
57 void test_ ## name :: once()
58 
64 #define testing(name) struct test_ ## name : aunit::TestAgain {\
65  test_ ## name();\
66  virtual void again() override;\
67 } test_ ## name ## _instance;\
68 test_ ## name :: test_ ## name() {\
69  init(F(#name));\
70 }\
71 void test_ ## name :: again()
72 
78 #define externTest(name) struct test_ ## name : aunit::TestOnce {\
79  test_ ## name();\
80  void once();\
81 };\
82 extern test_##name test_##name##_instance
83 
90 #define externTesting(name) struct test_ ## name : aunit::TestAgain {\
91  test_ ## name();\
92  void again();\
93 };\
94 extern test_##name test_##name##_instance
95 
101 #define testF(test_class, name) \
102 struct test_class ## _ ## name : test_class {\
103  test_class ## _ ## name();\
104  virtual void once() override;\
105 } test_class ## _ ## name ## _instance;\
106 test_class ## _ ## name :: test_class ## _ ## name() {\
107  init(F(#test_class "_" #name));\
108 }\
109 void test_class ## _ ## name :: once()
110 
116 #define testingF(test_class, name) \
117 struct test_class ## _ ## name : test_class {\
118  test_class ## _ ## name();\
119  virtual void again() override;\
120 } test_class ## _ ## name ## _instance;\
121 test_class ## _ ## name :: test_class ## _ ## name() {\
122  init(F(#test_class "_" #name));\
123 }\
124 void test_class ## _ ## name :: again()
125 
131 #define externTestF(test_class, name) \
132 struct test_class ## _ ## name : test_class {\
133  test_class ## _ ## name();\
134  virtual void once() override;\
135 };\
136 extern test_class ## _ ## name test_class##_##name##_instance
137 
144 #define externTestingF(test_class, name) \
145 struct test_class ## _ ## name : test_class {\
146  test_class ## _ ## name();\
147  virtual void again() override;\
148 };\
149 extern test_class ## _ ## name test_class##_##name##_instance
150 
151 #endif
- - - - diff --git a/docs/html/TestMacro_8h.html b/docs/html/TestMacros_8h.html similarity index 56% rename from docs/html/TestMacro_8h.html rename to docs/html/TestMacros_8h.html index d8d66de..899ae6c 100644 --- a/docs/html/TestMacro_8h.html +++ b/docs/html/TestMacros_8h.html @@ -3,9 +3,9 @@ - + -AUnit: /Users/brian/dev/AUnit/src/aunit/TestMacro.h File Reference +AUnit: /home/brian/dev/AUnit/src/aunit/TestMacros.h File Reference @@ -22,7 +22,7 @@
AUnit -  0.4.1 +  0.5.0
Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
@@ -31,21 +31,18 @@
- + +
-
TestMacro.h File Reference
+
TestMacros.h File Reference
-

Various macros (test(), testing(), externTest(), externTesting()) are defined in this header. +

Various macros (test(), testF(), testing(), testingF(), externTest(), externTestF(), externTesting(), externTestingF()) are defined in this header. More...

#include <stdint.h>
#include <Arduino.h>
+#include "Flash.h"
#include "FCString.h"
#include "TestOnce.h"
#include "TestAgain.h"
-Include dependency graph for TestMacro.h:
+Include dependency graph for TestMacros.h:
-
- - - - - - - - - +
+ + + + + + + + + +
This graph shows which files directly or indirectly include this file:
-
- - +
+ + +
-

Go to the source code of this file.

+

Go to the source code of this file.

- + - + - - + + - - + + - - - - - - - - - - - - + + + + + + + + + + + +

Macros

#define test(name)
#define test(name)
 Macro to define a test that will be run only once. More...
 
#define testing(name)
#define testing(name)
 Macro to define a test that will run repeatly upon each iteration of the global loop() method, stopping when the something calls Test::pass(), Test::fail() or Test::skip(). More...
 
#define externTest(name)
 Create an extern reference to a test() test case object defined elsewhere. More...
#define externTest(name)
 Create an extern reference to a test() test case object defined elsewhere. More...
 
#define externTesting(name)
 Create an extern reference to a testing() test case object defined elsewhere. More...
#define externTesting(name)
 Create an extern reference to a testing() test case object defined elsewhere. More...
 
#define testF(test_class, name)
 Create a test that is derived from a custom TestOnce class. More...
 
#define testingF(test_class, name)
 Create a test that is derived from a custom TestAgain class. More...
 
#define externTestF(test_class, name)
 Create an extern reference to a testF() test case object defined elsewhere. More...
 
#define externTestingF(test_class, name)
 Create an extern reference to a testingF() test case object defined elsewhere. More...
 
#define testF(testClass, name)
 Create a test that is derived from a custom TestOnce class. More...
 
#define testingF(testClass, name)
 Create a test that is derived from a custom TestAgain class. More...
 
#define externTestF(testClass, name)
 Create an extern reference to a testF() test case object defined elsewhere. More...
 
#define externTestingF(testClass, name)
 Create an extern reference to a testingF() test case object defined elsewhere. More...
 

Detailed Description

-

Various macros (test(), testing(), externTest(), externTesting()) are defined in this header.

+

Various macros (test(), testF(), testing(), testingF(), externTest(), externTestF(), externTesting(), externTestingF()) are defined in this header.

-

Definition in file TestMacro.h.

+

Definition in file TestMacros.h.

Macro Definition Documentation

◆ externTest

@@ -157,15 +157,15 @@

test_ ## name();\
void once();\
};\
extern test_##name test_##name##_instance
virtual void once()=0
User-provided test case.
Similar to TestAgain but performs user-defined test only once.
Definition: TestOnce.h:40

-

Create an extern reference to a test() test case object defined elsewhere.

+

Create an extern reference to a test() test case object defined elsewhere.

This is only necessary if you use assertTestXxx() or checkTestXxx() when the test is in another file (or defined after the assertion on it).

-

Definition at line 78 of file TestMacro.h.

+

Definition at line 84 of file TestMacros.h.

- -

◆ externTestF

+ +

◆ externTestF

@@ -174,7 +174,7 @@

#define externTestF (   - test_class, + testClass, @@ -189,11 +189,11 @@

-Value:
struct test_class ## _ ## name : test_class {\
test_class ## _ ## name();\
virtual void once() override;\
};\
extern test_class ## _ ## name test_class##_##name##_instance
-

Create an extern reference to a testF() test case object defined elsewhere.

+Value:
struct testClass ## _ ## name : testClass {\
testClass ## _ ## name();\
virtual void once() override;\
};\
extern testClass ## _ ## name testClass##_##name##_instance
+

Create an extern reference to a testF() test case object defined elsewhere.

This is only necessary if you use assertTestXxx() or checkTestXxx() when the test is in another file (or defined after the assertion on it).

-

Definition at line 131 of file TestMacro.h.

+

Definition at line 137 of file TestMacros.h.

@@ -215,15 +215,15 @@

test_ ## name();\
void again();\
};\
extern test_##name test_##name##_instance
virtual void again()=0
User-provided test case.
Similar to TestOnce but performs the user-defined test multiple times.
Definition: TestAgain.h:37
-

Create an extern reference to a testing() test case object defined elsewhere.

+

Create an extern reference to a testing() test case object defined elsewhere.

This is only necessary if you use assertTestXxx() or checkTestXxx() when the test is in another file (or defined after the assertion on it).

-

Definition at line 90 of file TestMacro.h.

+

Definition at line 96 of file TestMacros.h.

- -

◆ externTestingF

+ +

◆ externTestingF

@@ -232,7 +232,7 @@

#define externTestingF (   - test_class, + testClass, @@ -247,11 +247,11 @@

-Value:
struct test_class ## _ ## name : test_class {\
test_class ## _ ## name();\
virtual void again() override;\
};\
extern test_class ## _ ## name test_class##_##name##_instance
-

Create an extern reference to a testingF() test case object defined elsewhere.

+Value:
struct testClass ## _ ## name : testClass {\
testClass ## _ ## name();\
virtual void again() override;\
};\
extern testClass ## _ ## name testClass##_##name##_instance
+

Create an extern reference to a testingF() test case object defined elsewhere.

This is only necessary if you use assertTestXxx() or checkTestXxx() when the test is in another file (or defined after the assertion on it).

-

Definition at line 144 of file TestMacro.h.

+

Definition at line 150 of file TestMacros.h.

@@ -270,17 +270,17 @@

-Value:
test_ ## name();\
virtual void once() override;\
} test_ ## name ## _instance;\
test_ ## name :: test_ ## name() {\
init(F(#name)); \
}\
void test_ ## name :: once()
virtual void once()=0
User-provided test case.
+Value:
struct test_ ## name : aunit::TestOnce {\
test_ ## name();\
virtual void once() override;\
} test_ ## name ## _instance;\
test_ ## name :: test_ ## name() {\
init(AUNIT_F(#name)); \
}\
void test_ ## name :: once()
virtual void once()=0
User-provided test case.
Similar to TestAgain but performs user-defined test only once.
Definition: TestOnce.h:40

Macro to define a test that will be run only once.

-

Definition at line 50 of file TestMacro.h.

+

Definition at line 56 of file TestMacros.h.

- -

◆ testF

+ +

◆ testF

@@ -327,17 +327,17 @@

-Value:
test_ ## name();\
virtual void again() override;\
} test_ ## name ## _instance;\
test_ ## name :: test_ ## name() {\
init(F(#name));\
}\
void test_ ## name :: again()
virtual void again()=0
User-provided test case.
+Value:
struct test_ ## name : aunit::TestAgain {\
test_ ## name();\
virtual void again() override;\
} test_ ## name ## _instance;\
test_ ## name :: test_ ## name() {\
init(AUNIT_F(#name));\
}\
void test_ ## name :: again()
virtual void again()=0
User-provided test case.
Similar to TestOnce but performs the user-defined test multiple times.
Definition: TestAgain.h:37

Macro to define a test that will run repeatly upon each iteration of the global loop() method, stopping when the something calls Test::pass(), Test::fail() or Test::skip().

-

Definition at line 64 of file TestMacro.h.

+

Definition at line 70 of file TestMacros.h.

- -

◆ testingF

+ +

◆ testingF

@@ -374,7 +374,7 @@

diff --git a/docs/html/TestMacros_8h__dep__incl.map b/docs/html/TestMacros_8h__dep__incl.map new file mode 100644 index 0000000..9e3962c --- /dev/null +++ b/docs/html/TestMacros_8h__dep__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/TestMacros_8h__dep__incl.md5 b/docs/html/TestMacros_8h__dep__incl.md5 new file mode 100644 index 0000000..e4be96b --- /dev/null +++ b/docs/html/TestMacros_8h__dep__incl.md5 @@ -0,0 +1 @@ +fffd8db41f7e2f0a2a71e5cf22a67d3e \ No newline at end of file diff --git a/docs/html/TestMacros_8h__dep__incl.png b/docs/html/TestMacros_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..b6b8ef96be2c4f43bb65e4bc397759749bb47724 GIT binary patch literal 9060 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 Vt+T2CUYmi){-Y>aB4POHzX0o@m!ALt literal 0 HcmV?d00001 diff --git a/docs/html/TestMacros_8h__incl.map b/docs/html/TestMacros_8h__incl.map new file mode 100644 index 0000000..aaeaac6 --- /dev/null +++ b/docs/html/TestMacros_8h__incl.map @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/docs/html/TestMacros_8h__incl.md5 b/docs/html/TestMacros_8h__incl.md5 new file mode 100644 index 0000000..f0ae345 --- /dev/null +++ b/docs/html/TestMacros_8h__incl.md5 @@ -0,0 +1 @@ +6ac6c599972853627881cc19d8428210 \ No newline at end of file diff --git a/docs/html/TestMacros_8h__incl.png b/docs/html/TestMacros_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..edaea390cbbe5ea05d4b518cec30364b37ea942f GIT binary patch literal 61934 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/html/TestMacros_8h_source.html b/docs/html/TestMacros_8h_source.html new file mode 100644 index 0000000..e76f09d --- /dev/null +++ b/docs/html/TestMacros_8h_source.html @@ -0,0 +1,80 @@ + + + + + + + +AUnit: /home/brian/dev/AUnit/src/aunit/TestMacros.h Source File + + + + + + + + + +
+
+ + + + + + +
+
AUnit +  0.5.0 +
+
Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
TestMacros.h
+
+
+Go to the documentation of this file.
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
25 // Significant portions of the design and implementation of this file came from
26 // https://github.com/mmurdoch/arduinounit/blob/master/src/ArduinoUnit.h
27 
36 #ifndef AUNIT_TEST_MACROS_H
37 #define AUNIT_TEST_MACROS_H
38 
39 #include <stdint.h>
40 #include <Arduino.h> // F() macro
41 #include "Flash.h" // AUNIT_F() macro
42 #include "FCString.h"
43 #include "TestOnce.h"
44 #include "TestAgain.h"
45 
46 // On the ESP8266 platform, the F() string cannot be placed in an inline
47 // context, because it interferes with other PROGMEM strings. See
48 // https://github.com/esp8266/Arduino/issues/3369. The solution was to move the
49 // constructor definition out from an inline function into a normal function
50 // defined outside of the class declaration. Unfortunately, if the user code
51 // has any other usage of F() in an inline context, those interfere with the
52 // F() used below. I have abandoned supporting the F() macro for these test*()
53 // macros on the ESP8266.
54 
56 #define test(name) struct test_ ## name : aunit::TestOnce {\
57  test_ ## name();\
58  virtual void once() override;\
59 } test_ ## name ## _instance;\
60 test_ ## name :: test_ ## name() {\
61  init(AUNIT_F(#name)); \
62 }\
63 void test_ ## name :: once()
64 
70 #define testing(name) struct test_ ## name : aunit::TestAgain {\
71  test_ ## name();\
72  virtual void again() override;\
73 } test_ ## name ## _instance;\
74 test_ ## name :: test_ ## name() {\
75  init(AUNIT_F(#name));\
76 }\
77 void test_ ## name :: again()
78 
84 #define externTest(name) struct test_ ## name : aunit::TestOnce {\
85  test_ ## name();\
86  void once();\
87 };\
88 extern test_##name test_##name##_instance
89 
96 #define externTesting(name) struct test_ ## name : aunit::TestAgain {\
97  test_ ## name();\
98  void again();\
99 };\
100 extern test_##name test_##name##_instance
101 
107 #define testF(testClass, name) \
108 struct testClass ## _ ## name : testClass {\
109  testClass ## _ ## name();\
110  virtual void once() override;\
111 } testClass ## _ ## name ## _instance;\
112 testClass ## _ ## name :: testClass ## _ ## name() {\
113  init(AUNIT_F(#testClass "_" #name));\
114 }\
115 void testClass ## _ ## name :: once()
116 
122 #define testingF(testClass, name) \
123 struct testClass ## _ ## name : testClass {\
124  testClass ## _ ## name();\
125  virtual void again() override;\
126 } testClass ## _ ## name ## _instance;\
127 testClass ## _ ## name :: testClass ## _ ## name() {\
128  init(AUNIT_F(#testClass "_" #name));\
129 }\
130 void testClass ## _ ## name :: again()
131 
137 #define externTestF(testClass, name) \
138 struct testClass ## _ ## name : testClass {\
139  testClass ## _ ## name();\
140  virtual void once() override;\
141 };\
142 extern testClass ## _ ## name testClass##_##name##_instance
143 
150 #define externTestingF(testClass, name) \
151 struct testClass ## _ ## name : testClass {\
152  testClass ## _ ## name();\
153  virtual void again() override;\
154 };\
155 extern testClass ## _ ## name testClass##_##name##_instance
156 
157 #endif
Flash strings (using F() macro) on the ESP8266 platform cannot be placed in an inline context...
+
+ + + + diff --git a/docs/html/TestOnce_8cpp_source.html b/docs/html/TestOnce_8cpp_source.html index 64bcf7b..434e5a7 100644 --- a/docs/html/TestOnce_8cpp_source.html +++ b/docs/html/TestOnce_8cpp_source.html @@ -3,9 +3,9 @@ - + -AUnit: /Users/brian/dev/AUnit/src/aunit/TestOnce.cpp Source File +AUnit: /home/brian/dev/AUnit/src/aunit/TestOnce.cpp Source File @@ -22,7 +22,7 @@
AUnit -  0.4.1 +  0.5.0
Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
@@ -31,21 +31,18 @@ - + +
TestOnce.cpp
-
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
25 #include "TestOnce.h"
26 
27 namespace aunit {
28 
30  once();
31  if (getStatus() == kStatusSetup) {
32  pass();
33  }
34 }
35 
36 }
virtual void once()=0
User-provided test case.
+
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
25 #include "TestOnce.h"
26 
27 namespace aunit {
28 
30  once();
31  if (isNotDone()) {
32  pass();
33  }
34 }
35 
36 }
virtual void once()=0
User-provided test case.
+
bool isNotDone()
Return true if test is not has been asserted.
Definition: Test.h:199
-
void pass()
Mark the test as passed.
Definition: Test.h:176
+
void pass()
Mark the test as passed.
Definition: Test.h:242
virtual void loop() override
Calls the user-provided once() method.
Definition: TestOnce.cpp:29
-
static const uint8_t kStatusSetup
Test is set up.
Definition: Test.h:58
-
uint8_t getStatus()
Get the status of the test.
Definition: Test.h:114
diff --git a/docs/html/TestOnce_8h_source.html b/docs/html/TestOnce_8h_source.html index ab0716e..296855b 100644 --- a/docs/html/TestOnce_8h_source.html +++ b/docs/html/TestOnce_8h_source.html @@ -3,9 +3,9 @@ - + -AUnit: /Users/brian/dev/AUnit/src/aunit/TestOnce.h Source File +AUnit: /home/brian/dev/AUnit/src/aunit/TestOnce.h Source File @@ -22,7 +22,7 @@
AUnit -  0.4.1 +  0.5.0
Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
@@ -31,21 +31,18 @@
- + +
TestOnce.h
-
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
25 // Significant portions of the design and implementation of this file came from
26 // https://github.com/mmurdoch/arduinounit/blob/master/src/ArduinoUnit.h
27 
28 #ifndef AUNIT_TEST_ONCE_H
29 #define AUNIT_TEST_ONCE_H
30 
31 #include <stdint.h>
32 #include "FCString.h"
33 #include "MetaAssertion.h"
34 
35 class __FlashStringHelper;
36 
37 namespace aunit {
38 
40 class TestOnce: public MetaAssertion {
41  public:
43  TestOnce() {}
44 
50  virtual void loop() override;
51 
53  virtual void once() = 0;
54 
55  private:
56  // Disable copy-constructor and assignment operator
57  TestOnce(const TestOnce&) = delete;
58  TestOnce& operator=(const TestOnce&) = delete;
59 };
60 
61 }
62 
63 #endif
virtual void once()=0
User-provided test case.
+
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
25 // Significant portions of the design and implementation of this file came from
26 // https://github.com/mmurdoch/arduinounit/blob/master/src/ArduinoUnit.h
27 
28 #ifndef AUNIT_TEST_ONCE_H
29 #define AUNIT_TEST_ONCE_H
30 
31 #include <stdint.h>
32 #include "FCString.h"
33 #include "MetaAssertion.h"
34 
35 class __FlashStringHelper;
36 
37 namespace aunit {
38 
40 class TestOnce: public MetaAssertion {
41  public:
43  TestOnce() {}
44 
50  virtual void loop() override;
51 
53  virtual void once() = 0;
54 
55  private:
56  // Disable copy-constructor and assignment operator
57  TestOnce(const TestOnce&) = delete;
58  TestOnce& operator=(const TestOnce&) = delete;
59 };
60 
61 }
62 
63 #endif
virtual void once()=0
User-provided test case.
Similar to TestAgain but performs user-defined test only once.
Definition: TestOnce.h:40
-
Various assertTestXxx() and checkTestXxx() macros are defined in this header.
-
Class that extends the Assertion class to support the checkTestXxx() and assertTestXxx() macros that ...
+
Class that extends the Assertion class to support the checkTestXxx() and assertTestXxx() macros that ...
Definition: MetaAssertion.h:42
TestOnce()
Constructor.
Definition: TestOnce.h:43
virtual void loop() override
Calls the user-provided once() method.
Definition: TestOnce.cpp:29
@@ -83,7 +79,7 @@ diff --git a/docs/html/TestRunner_8cpp_source.html b/docs/html/TestRunner_8cpp_source.html index 1be802f..f7dc5e0 100644 --- a/docs/html/TestRunner_8cpp_source.html +++ b/docs/html/TestRunner_8cpp_source.html @@ -3,9 +3,9 @@ - + -AUnit: /Users/brian/dev/AUnit/src/aunit/TestRunner.cpp Source File +AUnit: /home/brian/dev/AUnit/src/aunit/TestRunner.cpp Source File @@ -22,7 +22,7 @@
AUnit -  0.4.1 +  0.5.0
Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
@@ -31,21 +31,18 @@
- + +
TestRunner.cpp
-
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
25 #include <Arduino.h> // definition of 'Serial'
26 #include <string.h>
27 #include <stdint.h>
28 #include "FCString.h"
29 #include "Compare.h"
30 #include "Printer.h"
31 #include "Verbosity.h"
32 #include "Test.h"
33 #include "TestRunner.h"
34 
35 namespace aunit {
36 
37 // Use a function static singleton to avoid the static initialization ordering
38 // problem. It's probably not an issue right now, since TestRunner is expected
39 // to be called only after all static initialization, but future refactoring
40 // could change that so this is defensive programming.
41 TestRunner* TestRunner::getRunner() {
42  static TestRunner singletonRunner;
43  return &singletonRunner;
44 }
45 
46 void TestRunner::setPrinter(Print* printer) {
47  Printer::setPrinter(printer);
48 }
49 
50 void TestRunner::setStatusMatchingPattern(const char* pattern, uint8_t status) {
51  size_t length = strlen(pattern);
52  if (length > 0 && pattern[length - 1] == '*') {
53  // prefix match
54  length--;
55  } else {
56  // exact match
57  length++;
58  }
59 
60  for (Test** p = Test::getRoot(); *p != nullptr; p = (*p)->getNext()) {
61  if (compareStringN((*p)->getName(), pattern, length) == 0) {
62  (*p)->setStatus(status);
63  }
64  }
65 }
66 
67 void TestRunner::setStatusMatchingPattern(const char* testClass,
68  const char* pattern, uint8_t status) {
69 
70  // Form the effective pattern by concatenating the two. This must match the
71  // algorithm used by testF() and testingF().
72  String fullPattern(testClass);
73  fullPattern.concat('_');
74  fullPattern.concat(pattern);
75 
76  setStatusMatchingPattern(fullPattern.c_str(), status);
77 }
78 
79 TestRunner::TestRunner():
80  mCurrent(nullptr),
81  mIsResolved(false),
82  mIsSetup(false),
83  mIsRunning(false),
84  mVerbosity(Verbosity::kDefault),
85  mCount(0),
86  mPassedCount(0),
87  mFailedCount(0),
88  mSkippedCount(0),
89  mTimeout(kTimeoutDefault) {}
90 
91 void TestRunner::runTest() {
92  setupRunner();
93 
94  // Print initial header if this is the first run.
95  if (!mIsRunning) {
96  printStartRunner();
97  mIsRunning = true;
98  }
99 
100  // If no more test cases, then print out summary of run.
101  if (*Test::getRoot() == nullptr) {
102  if (!mIsResolved) {
103  resolveRun();
104  }
105  return;
106  }
107 
108  // If reached the end and there are still test cases left, start from the
109  // beginning again.
110  if (*mCurrent == nullptr) {
111  mCurrent = Test::getRoot();
112  }
113 
114  // Implement a finite state machine that calls the (*mCurrent)->setup() or
115  // (*mCurrent)->loop(), then changes the test case's mStatus.
116  switch ((*mCurrent)->getStatus()) {
117  case Test::kStatusNew:
118  // Transfer the verbosity of the TestRunner to the Test.
119  (*mCurrent)->enableVerbosity(mVerbosity);
120 
121  (*mCurrent)->setup();
122 
123  // support assertXxx() statements inside the setup() method
124  if ((*mCurrent)->getStatus() == Test::kStatusNew) {
125  (*mCurrent)->setStatus(Test::kStatusSetup);
126  }
127  break;
128  case Test::kStatusSetup:
129  {
130  // Check for timeout. mTimeout == 0 means infinite timeout.
131  // NOTE: It feels like this code should go into the Test::loop() method
132  // (like the extra bit of code in TestOnce::loop()) because it seems
133  // like we could want the timeout to be configurable on a case by case
134  // basis. This would cause the testing() code to move down into a new
135  // again() virtual method dispatched from Test::loop(), analogous to
136  // once(). But let's keep the code here for now.
137  unsigned long now = millis();
138  if (mTimeout > 0 && now >= mStartTime + 1000L * mTimeout) {
139  (*mCurrent)->expire();
140  } else {
141  (*mCurrent)->loop();
142 
143  // If test status is unresolved (i.e. still in kStatusSetup state)
144  // after loop(), then this is a continuous testing() test case, so
145  // skip to the next test. Otherwise, stay on the current test so that
146  // the next iteration of runTest() can resolve the current test.
147  if ((*mCurrent)->getStatus() == Test::kStatusSetup) {
148  // skip to the next one, but keep current test in the list
149  mCurrent = (*mCurrent)->getNext();
150  }
151  }
152  }
153  break;
155  mSkippedCount++;
156  (*mCurrent)->teardown();
157  (*mCurrent)->resolve();
158  // skip to the next one by taking current test out of the list
159  *mCurrent = *(*mCurrent)->getNext();
160  break;
161  case Test::kStatusPassed:
162  mPassedCount++;
163  (*mCurrent)->teardown();
164  (*mCurrent)->resolve();
165  // skip to the next one by taking current test out of the list
166  *mCurrent = *(*mCurrent)->getNext();
167  break;
168  case Test::kStatusFailed:
169  mFailedCount++;
170  (*mCurrent)->teardown();
171  (*mCurrent)->resolve();
172  // skip to the next one by taking current test out of the list
173  *mCurrent = *(*mCurrent)->getNext();
174  break;
176  mExpiredCount++;
177  (*mCurrent)->teardown();
178  (*mCurrent)->resolve();
179  // skip to the next one by taking current test out of the list
180  *mCurrent = *(*mCurrent)->getNext();
181  break;
182  }
183 }
184 
185 void TestRunner::setupRunner() {
186  if (!mIsSetup) {
187  mIsSetup = true;
188  mCount = countTests();
189  mCurrent = Test::getRoot();
190  mStartTime = millis();
191  }
192 }
193 
194 // Count the number of tests in TestRunner instead of Test::insert() to avoid
195 // another C++ static initialization ordering problem.
196 uint16_t TestRunner::countTests() {
197  uint16_t count = 0;
198  for (Test** p = Test::getRoot(); *p != nullptr; p = (*p)->getNext()) {
199  count++;
200  }
201  return count;
202 }
203 
204 void TestRunner::printStartRunner() {
206 
207  Print* printer = Printer::getPrinter();
208  printer->print(F("TestRunner started on "));
209  printer->print(mCount);
210  printer->println(F(" test(s)."));
211 }
212 
213 void TestRunner::resolveRun() {
215 
216  Print* printer = Printer::getPrinter();
217  printer->print(F("TestRunner summary: "));
218  printer->print(mPassedCount);
219  printer->print(F(" passed, "));
220  printer->print(mFailedCount);
221  printer->print(F(" failed, "));
222  printer->print(mSkippedCount);
223  printer->print(F(" skipped, "));
224  printer->print(mExpiredCount);
225  printer->print(F(" timed out, out of "));
226  printer->print(mCount);
227  printer->println(F(" test(s)."));
228 
229  mIsResolved = true;
230 }
231 
232 void TestRunner::listTests() {
233  setupRunner();
234 
235  Print* printer = Printer::getPrinter();
236  printer->print(F("TestRunner test count: "));
237  printer->println(mCount);
238  for (Test** p = Test::getRoot(); (*p) != nullptr; p = (*p)->getNext()) {
239  printer->print(F("Test "));
240  Printer::print((*p)->getName());
241  printer->print(F("; status: "));
242  printer->println((*p)->getStatus());
243  }
244 }
245 
246 void TestRunner::setRunnerTimeout(TimeoutType timeout) {
247  mTimeout = timeout;
248 }
249 
250 }
static const uint8_t kStatusFailed
Test has failed, or failed() was called.
Definition: Test.h:64
-
static const uint8_t kStatusNew
Test is new, needs to be setup.
Definition: Test.h:55
-
static void print(const FCString &s)
Convenience method for printing an FCString.
Definition: Printer.cpp:33
-
static void setPrinter(Print *printer)
Set the printer.
Definition: Printer.h:53
-
static const uint8_t kStatusPassed
Test has passed, or pass() was called.
Definition: Test.h:61
-
Test ** getNext()
Return the next pointer as a pointer to the pointer, similar to getRoot().
Definition: Test.h:127
-
static const uint8_t kStatusSkipped
Test is skipped, through the exclude() method or skip() was called.
Definition: Test.h:67
+
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
25 #include <Arduino.h> // definition of 'Serial'
26 #include <string.h>
27 #include <stdint.h>
28 #include "FCString.h"
29 #include "Compare.h"
30 #include "Printer.h"
31 #include "Verbosity.h"
32 #include "Test.h"
33 #include "TestRunner.h"
34 
35 namespace aunit {
36 
37 // Use a function static singleton to avoid the static initialization ordering
38 // problem. It's probably not an issue right now, since TestRunner is expected
39 // to be called only after all static initialization, but future refactoring
40 // could change that so this is defensive programming.
41 TestRunner* TestRunner::getRunner() {
42  static TestRunner singletonRunner;
43  return &singletonRunner;
44 }
45 
46 void TestRunner::setPrinter(Print* printer) {
47  Printer::setPrinter(printer);
48 }
49 
50 void TestRunner::setLifeCycleMatchingPattern(const char* pattern,
51  uint8_t lifeCycle) {
52  size_t length = strlen(pattern);
53  if (length > 0 && pattern[length - 1] == '*') {
54  // prefix match
55  length--;
56  } else {
57  // exact match
58  length++;
59  }
60 
61  for (Test** p = Test::getRoot(); *p != nullptr; p = (*p)->getNext()) {
62  if (compareStringN((*p)->getName(), pattern, length) == 0) {
63  (*p)->setLifeCycle(lifeCycle);
64  }
65  }
66 }
67 
68 void TestRunner::setLifeCycleMatchingPattern(const char* testClass,
69  const char* pattern, uint8_t lifeCycle) {
70 
71  // Form the effective pattern by concatenating the two. This must match the
72  // algorithm used by testF() and testingF().
73  String fullPattern(testClass);
74  fullPattern.concat('_');
75  fullPattern.concat(pattern);
76 
77  setLifeCycleMatchingPattern(fullPattern.c_str(), lifeCycle);
78 }
79 
80 TestRunner::TestRunner():
81  mCurrent(nullptr),
82  mIsResolved(false),
83  mIsSetup(false),
84  mIsRunning(false),
85  mVerbosity(Verbosity::kDefault),
86  mCount(0),
87  mPassedCount(0),
88  mFailedCount(0),
89  mSkippedCount(0),
90  mStatusErrorCount(0),
91  mTimeout(kTimeoutDefault) {}
92 
93 void TestRunner::runTest() {
94  setupRunner();
95 
96  // Print initial header if this is the first run.
97  if (!mIsRunning) {
98  printStartRunner();
99  mIsRunning = true;
100  }
101 
102  // If no more test cases, then print out summary of run.
103  if (*Test::getRoot() == nullptr) {
104  if (!mIsResolved) {
105  mEndTime = millis();
106  resolveRun();
107  mIsResolved = true;
108  }
109  return;
110  }
111 
112  // If reached the end and there are still test cases left, start from the
113  // beginning again.
114  if (*mCurrent == nullptr) {
115  mCurrent = Test::getRoot();
116  }
117 
118  // Implement a finite state machine that calls the (*mCurrent)->setup() or
119  // (*mCurrent)->loop(), then changes the test case's mStatus.
120  switch ((*mCurrent)->getLifeCycle()) {
121  case Test::kLifeCycleNew:
122  // Transfer the verbosity of the TestRunner to the Test.
123  (*mCurrent)->enableVerbosity(mVerbosity);
124  (*mCurrent)->setup();
125 
126  // Support assertXxx() statements inside the setup() method by
127  // moving to the next lifeCycle state if an assertXxx() did not fail
128  // inside the setup().
129  if ((*mCurrent)->getLifeCycle() == Test::kLifeCycleNew) {
130  (*mCurrent)->setLifeCycle(Test::kLifeCycleSetup);
131  }
132  break;
134  // If a test is excluded, go directly to LifeCycleFinished, without
135  // calling setup() or teardown().
136  (*mCurrent)->enableVerbosity(mVerbosity);
137  (*mCurrent)->setStatus(Test::kStatusSkipped);
138  mSkippedCount++;
139  (*mCurrent)->setLifeCycle(Test::kLifeCycleFinished);
140  break;
142  {
143  // Check for timeout. mTimeout == 0 means infinite timeout.
144  // NOTE: It feels like this code should go into the Test::loop() method
145  // (like the extra bit of code in TestOnce::loop()) because it seems
146  // like we could want the timeout to be configurable on a case by case
147  // basis. This would cause the testing() code to move down into a new
148  // again() virtual method dispatched from Test::loop(), analogous to
149  // once(). But let's keep the code here for now.
150  unsigned long now = millis();
151  if (mTimeout > 0 && now >= mStartTime + 1000L * mTimeout) {
152  (*mCurrent)->expire();
153  } else {
154  (*mCurrent)->loop();
155 
156  // If test status is unresolved (i.e. still in kLifeCycleNew state)
157  // after loop(), then this is a continuous testing() test case, so
158  // skip to the next test. Otherwise, stay on the current test so that
159  // the next iteration of runTest() can resolve the current test.
160  if ((*mCurrent)->getLifeCycle() == Test::kLifeCycleSetup) {
161  // skip to the next one, but keep current test in the list
162  mCurrent = (*mCurrent)->getNext();
163  }
164  }
165  }
166  break;
168  switch ((*mCurrent)->getStatus()) {
170  mSkippedCount++;
171  break;
172  case Test::kStatusPassed:
173  mPassedCount++;
174  break;
175  case Test::kStatusFailed:
176  mFailedCount++;
177  break;
179  mExpiredCount++;
180  break;
181  default:
182  // should never get here
183  mStatusErrorCount++;
184  break;
185  }
186  (*mCurrent)->teardown();
187  (*mCurrent)->setLifeCycle(Test::kLifeCycleFinished);
188  break;
190  (*mCurrent)->resolve();
191  // skip to the next one by taking current test out of the list
192  *mCurrent = *(*mCurrent)->getNext();
193  break;
194  }
195 }
196 
197 void TestRunner::setupRunner() {
198  if (!mIsSetup) {
199  mIsSetup = true;
200  mCount = countTests();
201  mCurrent = Test::getRoot();
202  mStartTime = millis();
203  }
204 }
205 
206 // Count the number of tests in TestRunner instead of Test::insert() to avoid
207 // another C++ static initialization ordering problem.
208 uint16_t TestRunner::countTests() {
209  uint16_t count = 0;
210  for (Test** p = Test::getRoot(); *p != nullptr; p = (*p)->getNext()) {
211  count++;
212  }
213  return count;
214 }
215 
216 namespace {
217 
223 void printSeconds(Print* printer, unsigned long timeMillis) {
224  int s = timeMillis / 1000;
225  int ms = timeMillis % 1000;
226  printer->print(s);
227  printer->print('.');
228  if (ms < 100) printer->print('0');
229  if (ms < 10) printer->print('0');
230  printer->print(ms);
231 }
232 
233 }
234 
235 void TestRunner::printStartRunner() {
237 
238  Print* printer = Printer::getPrinter();
239  printer->print(F("TestRunner started on "));
240  printer->print(mCount);
241  printer->println(F(" test(s)."));
242 }
243 
244 void TestRunner::resolveRun() {
246  Print* printer = Printer::getPrinter();
247 
248  unsigned long elapsedTime = mEndTime - mStartTime;
249  printer->print(F("TestRunner duration: "));
250  printSeconds(printer, elapsedTime);
251  printer->println(" seconds.");
252 
253  printer->print(F("TestRunner summary: "));
254  printer->print(mPassedCount);
255  printer->print(F(" passed, "));
256  printer->print(mFailedCount);
257  printer->print(F(" failed, "));
258  printer->print(mSkippedCount);
259  printer->print(F(" skipped, "));
260  printer->print(mExpiredCount);
261  printer->print(F(" timed out, out of "));
262  printer->print(mCount);
263  printer->println(F(" test(s)."));
264 }
265 
266 void TestRunner::listTests() {
267  setupRunner();
268 
269  Print* printer = Printer::getPrinter();
270  printer->print(F("TestRunner test count: "));
271  printer->println(mCount);
272  for (Test** p = Test::getRoot(); (*p) != nullptr; p = (*p)->getNext()) {
273  printer->print(F("Test "));
274  Printer::print((*p)->getName());
275  printer->print(F("; lifeCycle: "));
276  printer->println((*p)->getLifeCycle());
277  }
278 }
279 
280 void TestRunner::setRunnerTimeout(TimeoutType timeout) {
281  mTimeout = timeout;
282 }
283 
284 }
Base class of all test cases.
Definition: Test.h:43
+
static const uint8_t kStatusFailed
Test has failed, or fail() was called.
Definition: Test.h:102
+
static const uint8_t kLifeCycleAsserted
Test is asserted (using pass(), fail(), expired() or skipped()) and the getStatus() has been determin...
Definition: Test.h:80
+
static void print(const internal::FCString &s)
Convenience method for printing an FCString.
Definition: Printer.cpp:33
+
static void setPrinter(Print *printer)
Set the printer.
Definition: Printer.h:55
+
static const uint8_t kStatusPassed
Test has passed, or pass() was called.
Definition: Test.h:99
+
uint8_t TimeoutType
Integer type of the timeout parameter.
Definition: TestRunner.h:44
+
Test ** getNext()
Return the next pointer as a pointer to the pointer, similar to getRoot().
Definition: Test.h:188
+
static const uint8_t kDefault
The default verbosity.
Definition: Verbosity.h:69
+
static const uint8_t kStatusSkipped
Test is skipped through the exclude() method or skip() was called.
Definition: Test.h:105
+
static const uint8_t kLifeCycleExcluded
Test is Excluded by an exclude() method.
Definition: Test.h:65
-
static Test ** getRoot()
Get the pointer to the root pointer.
Definition: Test.cpp:44
+
static Test ** getRoot()
Get the pointer to the root pointer.
Definition: Test.cpp:36
+
static const uint8_t kLifeCycleFinished
The test has completed its life cycle.
Definition: Test.h:88
static void setPrinter(Print *printer)
Set the output printer.
Definition: TestRunner.cpp:46
-
static Print * getPrinter()
Get the output printer used by the various assertion() methods and the TestRunner.
Definition: Printer.h:50
+
static const uint8_t kLifeCycleNew
Test is new, needs to be setup.
Definition: Test.h:57
+
static Print * getPrinter()
Get the output printer used by the various assertion() methods and the TestRunner.
Definition: Printer.h:52
+
static const uint8_t kLifeCycleSetup
Test has been set up by calling setup() and ready to execute the test code.
Definition: Test.h:74
static const uint8_t kTestRunSummary
Print TestRunner summary message.
Definition: Verbosity.h:58
-
static const uint8_t kStatusSetup
Test is set up.
Definition: Test.h:58
-
static const uint8_t kStatusExpired
Test has timed out, or expire() called.
Definition: Test.h:70
-
static bool isVerbosity(uint8_t verbosity)
Returns true if ANY of the bit flags of &#39;verbosity&#39; is set.
Definition: TestRunner.h:96
+
static const uint8_t kStatusExpired
Test has timed out, or expire() called.
Definition: Test.h:108
+
static bool isVerbosity(uint8_t verbosity)
Returns true if ANY of the bit flags of &#39;verbosity&#39; is set.
Definition: TestRunner.h:97
diff --git a/docs/html/TestRunner_8h_source.html b/docs/html/TestRunner_8h_source.html index 9397da9..614c184 100644 --- a/docs/html/TestRunner_8h_source.html +++ b/docs/html/TestRunner_8h_source.html @@ -3,9 +3,9 @@ - + -AUnit: /Users/brian/dev/AUnit/src/aunit/TestRunner.h Source File +AUnit: /home/brian/dev/AUnit/src/aunit/TestRunner.h Source File @@ -22,7 +22,7 @@
AUnit -  0.4.1 +  0.5.0
Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
@@ -31,21 +31,18 @@
- + +
TestRunner.h
-
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
25 #ifndef AUNIT_TEST_RUNNER_H
26 #define AUNIT_TEST_RUNNER_H
27 
28 #include <stdint.h>
29 #include "Test.h"
30 
31 class Print;
32 
33 namespace aunit {
34 
41 class TestRunner {
42  public:
44  typedef uint8_t TimeoutType;
45 
47  static void run() { getRunner()->runTest(); }
48 
50  static void list() { getRunner()->listTests(); }
51 
56  static void exclude(const char* pattern) {
57  getRunner()->setStatusMatchingPattern(pattern, Test::kStatusSkipped);
58  }
59 
66  static void exclude(const char* testClass, const char* pattern) {
67  getRunner()->setStatusMatchingPattern(testClass, pattern,
69  }
70 
75  static void include(const char* pattern) {
76  getRunner()->setStatusMatchingPattern(pattern, Test::kStatusNew);
77  }
78 
85  static void include(const char* testClass, const char* pattern) {
86  getRunner()->setStatusMatchingPattern(testClass, pattern,
88  }
89 
91  static void setVerbosity(uint8_t verbosity) {
92  getRunner()->setVerbosityFlag(verbosity);
93  }
94 
96  static bool isVerbosity(uint8_t verbosity) {
97  return getRunner()->isVerbosityFlag(verbosity);
98  }
99 
101  static void setPrinter(Print* printer);
102 
109  static void setTimeout(TimeoutType seconds) {
110  getRunner()->setRunnerTimeout(seconds);
111  }
112 
113  private:
114  // 10 second timeout for the runner
115  static const TimeoutType kTimeoutDefault = 10;
116 
118  static TestRunner* getRunner();
119 
121  static uint16_t countTests();
122 
123  // Disable copy-constructor and assignment operator
124  TestRunner(const TestRunner&) = delete;
125  TestRunner& operator=(const TestRunner&) = delete;
126 
128  TestRunner();
129 
131  void runTest();
132 
134  void listTests();
135 
137  void printStartRunner();
138 
140  void resolveRun();
141 
143  void setupRunner();
144 
146  void setVerbosityFlag(uint8_t verbosity) { mVerbosity = verbosity; }
147 
149  bool isVerbosityFlag(uint8_t verbosity) { return mVerbosity & verbosity; }
150 
152  void setStatusMatchingPattern(const char* pattern, uint8_t status);
153 
158  void setStatusMatchingPattern(const char* testClass, const char* pattern,
159  uint8_t status);
160 
162  void setRunnerTimeout(TimeoutType seconds);
163 
164  // The current test case is represented by a pointer to a pointer. This
165  // allows treating the root node the same as all the other nodes, and
166  // simplifies the code traversing the singly-linked list significantly.
167  Test** mCurrent;
168 
169  bool mIsResolved;
170  bool mIsSetup;
171  bool mIsRunning;
172  uint8_t mVerbosity;
173  uint16_t mCount;
174  uint16_t mPassedCount;
175  uint16_t mFailedCount;
176  uint16_t mSkippedCount;
177  uint16_t mExpiredCount;;
178  TimeoutType mTimeout;
179  unsigned long mStartTime;
180 };
181 
182 }
183 
184 #endif
The class that runs the various test cases defined by the test() and testing() macros.
Definition: TestRunner.h:41
+
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
25 #ifndef AUNIT_TEST_RUNNER_H
26 #define AUNIT_TEST_RUNNER_H
27 
28 #include <stdint.h>
29 #include "Test.h"
30 
31 class Print;
32 
33 namespace aunit {
34 
41 class TestRunner {
42  public:
44  typedef uint8_t TimeoutType;
45 
47  static void run() { getRunner()->runTest(); }
48 
50  static void list() { getRunner()->listTests(); }
51 
56  static void exclude(const char* pattern) {
57  getRunner()->setLifeCycleMatchingPattern(
58  pattern, Test::kLifeCycleExcluded);
59  }
60 
67  static void exclude(const char* testClass, const char* pattern) {
68  getRunner()->setLifeCycleMatchingPattern(testClass, pattern,
70  }
71 
76  static void include(const char* pattern) {
77  getRunner()->setLifeCycleMatchingPattern(pattern, Test::kLifeCycleNew);
78  }
79 
86  static void include(const char* testClass, const char* pattern) {
87  getRunner()->setLifeCycleMatchingPattern(testClass, pattern,
89  }
90 
92  static void setVerbosity(uint8_t verbosity) {
93  getRunner()->setVerbosityFlag(verbosity);
94  }
95 
97  static bool isVerbosity(uint8_t verbosity) {
98  return getRunner()->isVerbosityFlag(verbosity);
99  }
100 
102  static void setPrinter(Print* printer);
103 
110  static void setTimeout(TimeoutType seconds) {
111  getRunner()->setRunnerTimeout(seconds);
112  }
113 
114  private:
115  // 10 second timeout for the runner
116  static const TimeoutType kTimeoutDefault = 10;
117 
119  static TestRunner* getRunner();
120 
122  static uint16_t countTests();
123 
124  // Disable copy-constructor and assignment operator
125  TestRunner(const TestRunner&) = delete;
126  TestRunner& operator=(const TestRunner&) = delete;
127 
129  TestRunner();
130 
132  void runTest();
133 
135  void listTests();
136 
138  void printStartRunner();
139 
141  void resolveRun();
142 
144  void setupRunner();
145 
147  void setVerbosityFlag(uint8_t verbosity) { mVerbosity = verbosity; }
148 
150  bool isVerbosityFlag(uint8_t verbosity) { return mVerbosity & verbosity; }
151 
153  void setLifeCycleMatchingPattern(const char* pattern, uint8_t lifeCycle);
154 
159  void setLifeCycleMatchingPattern(const char* testClass, const char* pattern,
160  uint8_t lifeCycle);
161 
163  void setRunnerTimeout(TimeoutType seconds);
164 
165  // The current test case is represented by a pointer to a pointer. This
166  // allows treating the root node the same as all the other nodes, and
167  // simplifies the code traversing the singly-linked list significantly.
168  Test** mCurrent;
169 
170  bool mIsResolved;
171  bool mIsSetup;
172  bool mIsRunning;
173  uint8_t mVerbosity;
174  uint16_t mCount;
175  uint16_t mPassedCount;
176  uint16_t mFailedCount;
177  uint16_t mSkippedCount;
178  uint16_t mExpiredCount;
179  uint16_t mStatusErrorCount;
180  TimeoutType mTimeout;
181  unsigned long mStartTime;
182  unsigned long mEndTime;
183 };
184 
185 }
186 
187 #endif
The class that runs the various test cases defined by the test() and testing() macros.
Definition: TestRunner.h:41
+
Base class of all test cases.
Definition: Test.h:43
static void exclude(const char *pattern)
Exclude the tests which match the pattern.
Definition: TestRunner.h:56
-
static void setTimeout(TimeoutType seconds)
Set test runner timeout across all tests, in seconds.
Definition: TestRunner.h:109
-
static void include(const char *pattern)
Include the tests which match the pattern.
Definition: TestRunner.h:75
-
static const uint8_t kStatusNew
Test is new, needs to be setup.
Definition: Test.h:55
-
static void exclude(const char *testClass, const char *pattern)
Exclude the tests which match the pattern given by (testClass + "_" + pattern), the same concatenatio...
Definition: TestRunner.h:66
-
static void setVerbosity(uint8_t verbosity)
Set the verbosity flag.
Definition: TestRunner.h:91
+
static void setTimeout(TimeoutType seconds)
Set test runner timeout across all tests, in seconds.
Definition: TestRunner.h:110
+
static void include(const char *pattern)
Include the tests which match the pattern.
Definition: TestRunner.h:76
+
static void exclude(const char *testClass, const char *pattern)
Exclude the tests which match the pattern given by (testClass + "_" + pattern), the same concatenatio...
Definition: TestRunner.h:67
+
static void setVerbosity(uint8_t verbosity)
Set the verbosity flag.
Definition: TestRunner.h:92
uint8_t TimeoutType
Integer type of the timeout parameter.
Definition: TestRunner.h:44
static void run()
Run all tests using the current runner.
Definition: TestRunner.h:47
-
static const uint8_t kStatusSkipped
Test is skipped, through the exclude() method or skip() was called.
Definition: Test.h:67
+
static const uint8_t kLifeCycleExcluded
Test is Excluded by an exclude() method.
Definition: Test.h:65
static void list()
Print out the known tests.
Definition: TestRunner.h:50
static void setPrinter(Print *printer)
Set the output printer.
Definition: TestRunner.cpp:46
-
static void include(const char *testClass, const char *pattern)
Include the tests which match the pattern given by (testClass + "_" + pattern), the same concatenatio...
Definition: TestRunner.h:85
-
static bool isVerbosity(uint8_t verbosity)
Returns true if ANY of the bit flags of &#39;verbosity&#39; is set.
Definition: TestRunner.h:96
+
static const uint8_t kLifeCycleNew
Test is new, needs to be setup.
Definition: Test.h:57
+
static void include(const char *testClass, const char *pattern)
Include the tests which match the pattern given by (testClass + "_" + pattern), the same concatenatio...
Definition: TestRunner.h:86
+
static bool isVerbosity(uint8_t verbosity)
Returns true if ANY of the bit flags of &#39;verbosity&#39; is set.
Definition: TestRunner.h:97
diff --git a/docs/html/Test_8cpp_source.html b/docs/html/Test_8cpp_source.html index 94ce181..5ccbc47 100644 --- a/docs/html/Test_8cpp_source.html +++ b/docs/html/Test_8cpp_source.html @@ -3,9 +3,9 @@ - + -AUnit: /Users/brian/dev/AUnit/src/aunit/Test.cpp Source File +AUnit: /home/brian/dev/AUnit/src/aunit/Test.cpp Source File @@ -22,7 +22,7 @@
AUnit -  0.4.1 +  0.5.0
Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
@@ -31,21 +31,18 @@
- + +
Test.cpp
-
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
25 #ifdef ESP8266
26 #include <pgmspace.h>
27 #else
28 #include <avr/pgmspace.h>
29 #endif
30 
31 #include <Arduino.h> // for declaration of 'Serial' on Teensy and others
32 #include "Verbosity.h"
33 #include "Printer.h"
34 #include "Compare.h"
35 #include "Test.h"
36 
37 namespace aunit {
38 
39 static const char TEST_STRING[] PROGMEM = "Test ";
40 static const __FlashStringHelper* TEST_STRING_F = FPSTR(TEST_STRING);
41 
42 // Use a static variable inside a function to solve the static initialization
43 // ordering problem.
45  static Test* root;
46  return &root;
47 }
48 
50  mStatus(kStatusNew),
51  mVerbosity(Verbosity::kNone),
52  mNext(nullptr) {
53 }
54 
55 // Resolve the status as kStatusFailed only if ok == false. Otherwise, keep the
56 // status as kStatusSetup to allow testing() test cases to continue.
57 void Test::setPassOrFail(bool ok) {
58  if (!ok) {
59  mStatus = kStatusFailed;
60  }
61 }
62 
63 // Insert the current test case into the singly linked list, sorted by
64 // getName(). This is an O(N^2) algorithm, but should be good enough for
65 // small N ~= 100. If N becomes bigger than that, it's probably better to insert
66 // using an O(N) algorithm, then sort the elements later in TestRunner::run().
67 // Also, we don't increment a static counter here, because that would introduce
68 // another static initialization ordering problem.
69 void Test::insert() {
70  // Find the element p whose p->next sorts after the current test
71  Test** p = getRoot();
72  while (*p != nullptr) {
73  if (compareString(getName(), (*p)->getName()) < 0) break;
74  p = &(*p)->mNext;
75  }
76  mNext = *p;
77  *p = this;
78 }
79 
80 void Test::resolve() {
81  if (!isVerbosity(Verbosity::kTestAll)) return;
82 
83  Print* printer = Printer::getPrinter();
84  if (mStatus == Test::kStatusPassed
86  printer->print(TEST_STRING_F);
87  Printer::print(mName);
88  printer->println(F(" passed."));
89  } else if (mStatus == Test::kStatusFailed
91  printer->print(TEST_STRING_F);
92  Printer::print(mName);
93  printer->println(F(" failed."));
94  } else if (mStatus == Test::kStatusSkipped
96  printer->print(TEST_STRING_F);
97  Printer::print(mName);
98  printer->println(F(" skipped."));
99  } else if (mStatus == Test::kStatusExpired
101  printer->print(TEST_STRING_F);
102  Printer::print(mName);
103  printer->println(F(" timed out."));
104  }
105 }
106 
107 }
Base class of all test cases.
Definition: Test.h:49
+
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
25 #include <Arduino.h> // for declaration of 'Serial' on Teensy and others
26 #include "Flash.h"
27 #include "Verbosity.h"
28 #include "Printer.h"
29 #include "Compare.h"
30 #include "Test.h"
31 
32 namespace aunit {
33 
34 // Use a static variable inside a function to solve the static initialization
35 // ordering problem.
37  static Test* root;
38  return &root;
39 }
40 
42  mLifeCycle(kLifeCycleNew),
43  mStatus(kStatusUnknown),
44  mVerbosity(Verbosity::kNone),
45  mNext(nullptr) {
46 }
47 
48 // Resolve the status as kStatusFailed only if ok == false. Otherwise, keep the
49 // status as kStatusSetup to allow testing() test cases to continue.
50 void Test::setPassOrFail(bool ok) {
51  if (!ok) {
53  }
54 }
55 
56 // Insert the current test case into the singly linked list, sorted by
57 // getName(). This is an O(N^2) algorithm, but should be good enough for
58 // small N ~= 100. If N becomes bigger than that, it's probably better to insert
59 // using an O(N) algorithm, then sort the elements later in TestRunner::run().
60 // Also, we don't increment a static counter here, because that would introduce
61 // another static initialization ordering problem.
62 void Test::insert() {
63  // Find the element p whose p->next sorts after the current test
64  Test** p = getRoot();
65  while (*p != nullptr) {
66  if (compareString(getName(), (*p)->getName()) < 0) break;
67  p = &(*p)->mNext;
68  }
69  mNext = *p;
70  *p = this;
71 }
72 
73 void Test::resolve() {
74  static const __FlashStringHelper* TEST_STRING = F("Test ");
75 
76  if (!isVerbosity(Verbosity::kTestAll)) return;
77 
78  Print* printer = Printer::getPrinter();
79  if (mStatus == Test::kStatusPassed
81  printer->print(TEST_STRING);
82  Printer::print(mName);
83  printer->println(F(" passed."));
84  } else if (mStatus == Test::kStatusFailed
86  printer->print(TEST_STRING);
87  Printer::print(mName);
88  printer->println(F(" failed."));
89  } else if (mStatus == Test::kStatusSkipped
91  printer->print(TEST_STRING);
92  Printer::print(mName);
93  printer->println(F(" skipped."));
94  } else if (mStatus == Test::kStatusExpired
96  printer->print(TEST_STRING);
97  Printer::print(mName);
98  printer->println(F(" timed out."));
99  }
100 }
101 
102 }
Base class of all test cases.
Definition: Test.h:43
static const uint8_t kTestExpired
Print test timed out message.
Definition: Verbosity.h:55
-
static const uint8_t kStatusFailed
Test has failed, or failed() was called.
Definition: Test.h:64
-
static void print(const FCString &s)
Convenience method for printing an FCString.
Definition: Printer.cpp:33
+
static const uint8_t kStatusUnknown
Test status is unknown.
Definition: Test.h:96
+
static const uint8_t kStatusFailed
Test has failed, or fail() was called.
Definition: Test.h:102
Utility class to hold the Verbosity constants.
Definition: Verbosity.h:37
-
void setPassOrFail(bool ok)
Set the status to Passed or Failed depending on ok.
Definition: Test.cpp:57
-
void resolve()
Print out the summary of the current test.
Definition: Test.cpp:80
+
const internal::FCString & getName()
Get the name of the test.
Definition: Test.h:158
+
static void print(const internal::FCString &s)
Convenience method for printing an FCString.
Definition: Printer.cpp:33
+
void setPassOrFail(bool ok)
Set the status to Passed or Failed depending on ok.
Definition: Test.cpp:50
+
void resolve()
Print out the summary of the current test.
Definition: Test.cpp:73
static const uint8_t kTestPassed
Print test passed message.
Definition: Verbosity.h:46
-
static const uint8_t kStatusPassed
Test has passed, or pass() was called.
Definition: Test.h:61
-
Test()
Empty constructor.
Definition: Test.cpp:49
-
static const uint8_t kStatusSkipped
Test is skipped, through the exclude() method or skip() was called.
Definition: Test.h:67
+
static const uint8_t kStatusPassed
Test has passed, or pass() was called.
Definition: Test.h:99
+
Test()
Empty constructor.
Definition: Test.cpp:41
+
static const uint8_t kStatusSkipped
Test is skipped through the exclude() method or skip() was called.
Definition: Test.h:105
-
static Test ** getRoot()
Get the pointer to the root pointer.
Definition: Test.cpp:44
-
bool isVerbosity(uint8_t verbosity)
Determine if any of the given verbosity is enabled.
Definition: Test.h:193
-
static Print * getPrinter()
Get the output printer used by the various assertion() methods and the TestRunner.
Definition: Printer.h:50
-
static const uint8_t kStatusExpired
Test has timed out, or expire() called.
Definition: Test.h:70
+
static Test ** getRoot()
Get the pointer to the root pointer.
Definition: Test.cpp:36
+
bool isVerbosity(uint8_t verbosity)
Determine if any of the given verbosity is enabled.
Definition: Test.h:261
+
static const uint8_t kLifeCycleNew
Test is new, needs to be setup.
Definition: Test.h:57
+
static Print * getPrinter()
Get the output printer used by the various assertion() methods and the TestRunner.
Definition: Printer.h:52
+
static const uint8_t kStatusExpired
Test has timed out, or expire() called.
Definition: Test.h:108
static const uint8_t kTestSkipped
Print test skipped message.
Definition: Verbosity.h:52
-
const FCString & getName()
Get the name of the test.
Definition: Test.h:111
+
Flash strings (using F() macro) on the ESP8266 platform cannot be placed in an inline context...
static const uint8_t kTestAll
Print all test status messages.
Definition: Verbosity.h:65
static const uint8_t kTestFailed
Print test failed message.
Definition: Verbosity.h:49
+
void setStatus(uint8_t status)
Set the status of the test.
Definition: Test.h:173
diff --git a/docs/html/Test_8h_source.html b/docs/html/Test_8h_source.html index 180dc88..26ab3eb 100644 --- a/docs/html/Test_8h_source.html +++ b/docs/html/Test_8h_source.html @@ -3,9 +3,9 @@ - + -AUnit: /Users/brian/dev/AUnit/src/aunit/Test.h Source File +AUnit: /home/brian/dev/AUnit/src/aunit/Test.h Source File @@ -22,7 +22,7 @@
AUnit -  0.4.1 +  0.5.0
Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
@@ -31,21 +31,18 @@
- + +
Test.h
-
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
25 // Significant portions of the design and implementation of this file came from
26 // https://github.com/mmurdoch/arduinounit/blob/master/src/ArduinoUnit.h
27 
28 #ifndef AUNIT_TEST_H
29 #define AUNIT_TEST_H
30 
31 #include <stdint.h>
32 #include "FCString.h"
33 #include "Verbosity.h"
34 
35 // Defined in ESP8266, not defined in AVR or Teensy
36 #ifndef FPSTR
37 #define FPSTR(pstr_pointer) \
38  (reinterpret_cast<const __FlashStringHelper *>(pstr_pointer))
39 #endif
40 
41 namespace aunit {
42 
49 class Test {
50  public:
51  // Don't change the order of Passed, Failed, Skipped or Expired without
52  // looking at the isDone() method.
53 
55  static const uint8_t kStatusNew = 0;
56 
58  static const uint8_t kStatusSetup = 1;
59 
61  static const uint8_t kStatusPassed = 2;
62 
64  static const uint8_t kStatusFailed = 3;
65 
67  static const uint8_t kStatusSkipped = 4;
68 
70  static const uint8_t kStatusExpired = 5;
71 
77  static Test** getRoot();
78 
80  Test();
81 
89  virtual void setup() {}
90 
98  virtual void teardown() {}
99 
105  virtual void loop() = 0;
106 
108  void resolve();
109 
111  const FCString& getName() { return mName; }
112 
114  uint8_t getStatus() { return mStatus; }
115 
117  void setStatus(uint8_t status) { mStatus = status; }
118 
120  void setPassOrFail(bool ok);
121 
127  Test** getNext() { return &mNext; }
128 
130  bool isDone() { return mStatus >= kStatusPassed; }
131 
133  bool isNotDone() { return !isDone(); }
134 
136  bool isPassed() { return mStatus == kStatusPassed; }
137 
139  bool isNotPassed() { return !isPassed(); }
140 
142  bool isFailed() { return mStatus == kStatusFailed; }
143 
145  bool isNotFailed() { return !isFailed(); }
146 
148  bool isSkipped() { return mStatus == kStatusSkipped; }
149 
151  bool isNotSkipped() { return !isSkipped(); }
152 
154  bool isExpired() { return mStatus == kStatusExpired; }
155 
157  bool isNotExpired() { return !isExpired(); }
158 
160  void skip() { mStatus = kStatusSkipped; }
161 
163  void expire() { mStatus = kStatusExpired; }
164 
166  void enableVerbosity(uint8_t verbosity) { mVerbosity |= verbosity; }
167 
169  void disableVerbosity(uint8_t verbosity) { mVerbosity &= ~verbosity; }
170 
171  protected:
173  void fail() { mStatus = kStatusFailed; }
174 
176  void pass() { mStatus = kStatusPassed; }
177 
178  void init(const char* name) {
179  mName = FCString(name);
180  mStatus = kStatusNew;
181  mVerbosity = 0;
182  insert();
183  }
184 
185  void init(const __FlashStringHelper* name) {
186  mName = FCString(name);
187  mStatus = kStatusNew;
188  mVerbosity = 0;
189  insert();
190  }
191 
193  bool isVerbosity(uint8_t verbosity) { return mVerbosity & verbosity; }
194 
196  uint8_t getVerbosity() { return mVerbosity; }
197 
198  private:
199  // Disable copy-constructor and assignment operator
200  Test(const Test&) = delete;
201  Test& operator=(const Test&) = delete;
202 
204  void insert();
205 
206  FCString mName;
207  uint8_t mStatus;
208  uint8_t mVerbosity;
209  Test* mNext;
210 };
211 
212 }
213 
214 #endif
void disableVerbosity(uint8_t verbosity)
Disable the given verbosity of the current test.
Definition: Test.h:169
-
Base class of all test cases.
Definition: Test.h:49
-
void expire()
Mark the test as expired (i.e.
Definition: Test.h:163
-
static const uint8_t kStatusFailed
Test has failed, or failed() was called.
Definition: Test.h:64
-
static const uint8_t kStatusNew
Test is new, needs to be setup.
Definition: Test.h:55
-
void fail()
Mark the test as failed.
Definition: Test.h:173
-
void setPassOrFail(bool ok)
Set the status to Passed or Failed depending on ok.
Definition: Test.cpp:57
-
void resolve()
Print out the summary of the current test.
Definition: Test.cpp:80
-
bool isNotDone()
Return true if test is done (passed, failed, skipped, expired).
Definition: Test.h:133
-
static const uint8_t kStatusPassed
Test has passed, or pass() was called.
Definition: Test.h:61
-
bool isNotPassed()
Return true if test is passed.
Definition: Test.h:139
-
uint8_t getVerbosity()
Get the verbosity.
Definition: Test.h:196
-
Test()
Empty constructor.
Definition: Test.cpp:49
-
Test ** getNext()
Return the next pointer as a pointer to the pointer, similar to getRoot().
Definition: Test.h:127
-
static const uint8_t kStatusSkipped
Test is skipped, through the exclude() method or skip() was called.
Definition: Test.h:67
-
bool isPassed()
Return true if test is passed.
Definition: Test.h:136
-
virtual void setup()
Optional method that performs any initialization.
Definition: Test.h:89
+
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
25 // Significant portions of the design and implementation of this file came from
26 // https://github.com/mmurdoch/arduinounit/blob/master/src/ArduinoUnit.h
27 
28 #ifndef AUNIT_TEST_H
29 #define AUNIT_TEST_H
30 
31 #include <stdint.h>
32 #include "FCString.h"
33 #include "Verbosity.h"
34 
35 namespace aunit {
36 
43 class Test {
44  public:
45  // The LifeCycle states are used by TestRunner to determine what a Test
46  // should do. Unlike the assertion Status, the LfeCycle is mostly hidden
47  // from client code. The state transition diagram looks like this:
48  //
49  // include()/exclude()
50  // |---------------------> Excluded -----------|
51  // v v
52  // New Finished -> (out of list)
53  // \ setup() assertion() teardown() ^
54  // -----------> Setup ----> Asserted ---------|
55 
57  static const uint8_t kLifeCycleNew = 0;
58 
65  static const uint8_t kLifeCycleExcluded = 1;
66 
74  static const uint8_t kLifeCycleSetup = 2;
75 
80  static const uint8_t kLifeCycleAsserted = 3;
81 
88  static const uint8_t kLifeCycleFinished = 4;
89 
90  // The assertion Status is the result of an "assertion()". In addition to
91  // the usual pass() and fail(), there are meta-assertions such as skip()
92  // and expire(). When the Status is changed from kStatusUnknown, the
93  // lifeCycle state changes to kLifeCycleAsserted.
94 
96  static const uint8_t kStatusUnknown = 0;
97 
99  static const uint8_t kStatusPassed = 1;
100 
102  static const uint8_t kStatusFailed = 2;
103 
105  static const uint8_t kStatusSkipped = 3;
106 
108  static const uint8_t kStatusExpired = 4;
109 
115  static Test** getRoot();
116 
118  Test();
119 
120  // NOTE: Don't create a virtual destructor. That's the normal best practice
121  // for classes that will be used polymorphically. However, this class will
122  // never be deleted polymorphically (i.e. through its pointer) so it
123  // doesn't need a virtual destructor. In fact, adding it causes flash and
124  // static memory to increase dramatically because each test() and testing()
125  // macro creates a new subclass. AceButtonTest flash memory increases from
126  // 18928 to 20064 bytes, and static memory increases from 917 to 1055
127  // bytes.
128 
136  virtual void setup() {}
137 
145  virtual void teardown() {}
146 
152  virtual void loop() = 0;
153 
155  void resolve();
156 
158  const internal::FCString& getName() { return mName; }
159 
161  uint8_t getLifeCycle() { return mLifeCycle; }
162 
163  void setLifeCycle(uint8_t state) { mLifeCycle = state; }
164 
166  uint8_t getStatus() { return mStatus; }
167 
173  void setStatus(uint8_t status) {
174  if (status != kStatusUnknown) {
175  setLifeCycle(kLifeCycleAsserted);
176  }
177  mStatus = status;
178  }
179 
181  void setPassOrFail(bool ok);
182 
188  Test** getNext() { return &mNext; }
189 
196  bool isDone() { return mStatus != kStatusUnknown; }
197 
199  bool isNotDone() { return !isDone(); }
200 
202  bool isPassed() { return mStatus == kStatusPassed; }
203 
205  bool isNotPassed() { return !isPassed(); }
206 
208  bool isFailed() { return mStatus == kStatusFailed; }
209 
211  bool isNotFailed() { return !isFailed(); }
212 
214  bool isSkipped() { return mStatus == kStatusSkipped; }
215 
217  bool isNotSkipped() { return !isSkipped(); }
218 
220  bool isExpired() { return mStatus == kStatusExpired; }
221 
223  bool isNotExpired() { return !isExpired(); }
224 
226  void skip() { setStatus(kStatusSkipped); }
227 
229  void expire() { setStatus(kStatusExpired); }
230 
232  void enableVerbosity(uint8_t verbosity) { mVerbosity |= verbosity; }
233 
235  void disableVerbosity(uint8_t verbosity) { mVerbosity &= ~verbosity; }
236 
237  protected:
239  void fail() { setStatus(kStatusFailed); }
240 
242  void pass() { setStatus(kStatusPassed); }
243 
244  void init(const char* name) {
245  mName = internal::FCString(name);
246  mLifeCycle = kLifeCycleNew;
247  mStatus = kStatusUnknown;
248  mVerbosity = 0;
249  insert();
250  }
251 
252  void init(const __FlashStringHelper* name) {
253  mName = internal::FCString(name);
254  mLifeCycle = kLifeCycleNew;
255  mStatus = kStatusUnknown;
256  mVerbosity = 0;
257  insert();
258  }
259 
261  bool isVerbosity(uint8_t verbosity) { return mVerbosity & verbosity; }
262 
264  uint8_t getVerbosity() { return mVerbosity; }
265 
266  private:
267  // Disable copy-constructor and assignment operator
268  Test(const Test&) = delete;
269  Test& operator=(const Test&) = delete;
270 
272  void insert();
273 
274  internal::FCString mName;
275  uint8_t mLifeCycle;
276  uint8_t mStatus;
277  uint8_t mVerbosity;
278  Test* mNext;
279 };
280 
281 }
282 
283 #endif
void disableVerbosity(uint8_t verbosity)
Disable the given verbosity of the current test.
Definition: Test.h:235
+
Base class of all test cases.
Definition: Test.h:43
+
void expire()
Mark the test as expired (i.e.
Definition: Test.h:229
+
static const uint8_t kStatusUnknown
Test status is unknown.
Definition: Test.h:96
+
static const uint8_t kStatusFailed
Test has failed, or fail() was called.
Definition: Test.h:102
+
void fail()
Mark the test as failed.
Definition: Test.h:239
+
static const uint8_t kLifeCycleAsserted
Test is asserted (using pass(), fail(), expired() or skipped()) and the getStatus() has been determin...
Definition: Test.h:80
+
const internal::FCString & getName()
Get the name of the test.
Definition: Test.h:158
+
void setPassOrFail(bool ok)
Set the status to Passed or Failed depending on ok.
Definition: Test.cpp:50
+
void resolve()
Print out the summary of the current test.
Definition: Test.cpp:73
+
A union of (const char*) and (const __FlashStringHelper*) with a discriminator.
Definition: FCString.h:51
+
bool isNotDone()
Return true if test is not has been asserted.
Definition: Test.h:199
+
static const uint8_t kStatusPassed
Test has passed, or pass() was called.
Definition: Test.h:99
+
bool isNotPassed()
Return true if test is not passed.
Definition: Test.h:205
+
uint8_t getVerbosity()
Get the verbosity.
Definition: Test.h:264
+
Test()
Empty constructor.
Definition: Test.cpp:41
+
uint8_t getLifeCycle()
Get the life cycle state of the test.
Definition: Test.h:161
+
Test ** getNext()
Return the next pointer as a pointer to the pointer, similar to getRoot().
Definition: Test.h:188
+
static const uint8_t kStatusSkipped
Test is skipped through the exclude() method or skip() was called.
Definition: Test.h:105
+
bool isPassed()
Return true if test is passed.
Definition: Test.h:202
+
virtual void setup()
Optional method that performs any initialization.
Definition: Test.h:136
+
static const uint8_t kLifeCycleExcluded
Test is Excluded by an exclude() method.
Definition: Test.h:65
virtual void loop()=0
The user-provided test case function.
-
void pass()
Mark the test as passed.
Definition: Test.h:176
-
void enableVerbosity(uint8_t verbosity)
Enable the given verbosity of the current test.
Definition: Test.h:166
-
static Test ** getRoot()
Get the pointer to the root pointer.
Definition: Test.cpp:44
-
bool isExpired()
Return true if test is expired.
Definition: Test.h:154
-
A union of (const char*) and (const __FlashStringHelper*) with a discriminator.
Definition: FCString.h:50
-
bool isVerbosity(uint8_t verbosity)
Determine if any of the given verbosity is enabled.
Definition: Test.h:193
-
void skip()
Mark the test as skipped.
Definition: Test.h:160
-
bool isDone()
Return true if test is done (passed, failed, skipped, expired).
Definition: Test.h:130
-
bool isNotFailed()
Return true if test is failed.
Definition: Test.h:145
-
bool isFailed()
Return true if test is failed.
Definition: Test.h:142
-
static const uint8_t kStatusSetup
Test is set up.
Definition: Test.h:58
-
static const uint8_t kStatusExpired
Test has timed out, or expire() called.
Definition: Test.h:70
-
bool isNotSkipped()
Return true if test isNot skipped.
Definition: Test.h:151
-
const FCString & getName()
Get the name of the test.
Definition: Test.h:111
-
virtual void teardown()
Optional method that performs any clean up after the test ends for any reasons, either passing or oth...
Definition: Test.h:98
-
bool isSkipped()
Return true if test isNot skipped.
Definition: Test.h:148
-
bool isNotExpired()
Return true if test is expired.
Definition: Test.h:157
-
void setStatus(uint8_t status)
Set the status of the test.
Definition: Test.h:117
-
uint8_t getStatus()
Get the status of the test.
Definition: Test.h:114
+
void pass()
Mark the test as passed.
Definition: Test.h:242
+
void enableVerbosity(uint8_t verbosity)
Enable the given verbosity of the current test.
Definition: Test.h:232
+
static Test ** getRoot()
Get the pointer to the root pointer.
Definition: Test.cpp:36
+
bool isExpired()
Return true if test is expired.
Definition: Test.h:220
+
static const uint8_t kLifeCycleFinished
The test has completed its life cycle.
Definition: Test.h:88
+
bool isVerbosity(uint8_t verbosity)
Determine if any of the given verbosity is enabled.
Definition: Test.h:261
+
void skip()
Mark the test as skipped.
Definition: Test.h:226
+
bool isDone()
Return true if test has been asserted.
Definition: Test.h:196
+
bool isNotFailed()
Return true if test is not failed.
Definition: Test.h:211
+
static const uint8_t kLifeCycleNew
Test is new, needs to be setup.
Definition: Test.h:57
+
bool isFailed()
Return true if test is failed.
Definition: Test.h:208
+
static const uint8_t kLifeCycleSetup
Test has been set up by calling setup() and ready to execute the test code.
Definition: Test.h:74
+
static const uint8_t kStatusExpired
Test has timed out, or expire() called.
Definition: Test.h:108
+
bool isNotSkipped()
Return true if test is not skipped.
Definition: Test.h:217
+
virtual void teardown()
Optional method that performs any clean up after the test ends for any reasons, either passing or oth...
Definition: Test.h:145
+
bool isSkipped()
Return true if test is skipped.
Definition: Test.h:214
+
bool isNotExpired()
Return true if test is not expired.
Definition: Test.h:223
+
void setStatus(uint8_t status)
Set the status of the test.
Definition: Test.h:173
+
uint8_t getStatus()
Get the status of the test.
Definition: Test.h:166
diff --git a/docs/html/Verbosity_8h_source.html b/docs/html/Verbosity_8h_source.html index 409bffe..2c89c21 100644 --- a/docs/html/Verbosity_8h_source.html +++ b/docs/html/Verbosity_8h_source.html @@ -3,9 +3,9 @@ - + -AUnit: /Users/brian/dev/AUnit/src/aunit/Verbosity.h Source File +AUnit: /home/brian/dev/AUnit/src/aunit/Verbosity.h Source File @@ -22,7 +22,7 @@
AUnit -  0.4.1 +  0.5.0
Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
@@ -31,21 +31,18 @@
- + +
Verbosity.h
-
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
25 #ifndef AUNIT_VERBOSITY_H
26 #define AUNIT_VERBOSITY_H
27 
28 #include <stdint.h>
29 
30 namespace aunit {
31 
37 class Verbosity {
38  public:
40  static const uint8_t kAssertionPassed = 0x01;
41 
43  static const uint8_t kAssertionFailed = 0x02;
44 
46  static const uint8_t kTestPassed = 0x04;
47 
49  static const uint8_t kTestFailed = 0x08;
50 
52  static const uint8_t kTestSkipped = 0x10;
53 
55  static const uint8_t kTestExpired = 0x20;
56 
58  static const uint8_t kTestRunSummary = 0x40;
59 
60  // compound flags
62  static const uint8_t kAssertionAll = (kAssertionPassed | kAssertionFailed);
63 
65  static const uint8_t kTestAll =
67 
69  static const uint8_t kDefault =
71 
73  static const uint8_t kAll = 0xFF;
74 
76  static const uint8_t kNone = 0x00;
77 
78  private:
79  // Disable constructor, copy-constructor and assignment operator
80  Verbosity() = delete;
81  Verbosity(const Verbosity&) = delete;
82  Verbosity& operator=(const Verbosity&) = delete;
83 };
84 
85 }
86 
87 #endif
static const uint8_t kTestExpired
Print test timed out message.
Definition: Verbosity.h:55
+
1 /*
2 MIT License
3 
4 Copyright (c) 2018 Brian T. Park
5 
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12 
13 The above copyright notice and this permission notice shall be included in all
14 copies or substantial portions of the Software.
15 
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 SOFTWARE.
23 */
24 
25 #ifndef AUNIT_VERBOSITY_H
26 #define AUNIT_VERBOSITY_H
27 
28 #include <stdint.h>
29 
30 namespace aunit {
31 
37 class Verbosity {
38  public:
40  static const uint8_t kAssertionPassed = 0x01;
41 
43  static const uint8_t kAssertionFailed = 0x02;
44 
46  static const uint8_t kTestPassed = 0x04;
47 
49  static const uint8_t kTestFailed = 0x08;
50 
52  static const uint8_t kTestSkipped = 0x10;
53 
55  static const uint8_t kTestExpired = 0x20;
56 
58  static const uint8_t kTestRunSummary = 0x40;
59 
60  // compound flags
62  static const uint8_t kAssertionAll = (kAssertionPassed | kAssertionFailed);
63 
65  static const uint8_t kTestAll =
66  (kTestPassed | kTestFailed | kTestSkipped | kTestExpired);
67 
69  static const uint8_t kDefault =
70  (kAssertionFailed | kTestAll | kTestRunSummary);
71 
73  static const uint8_t kAll = 0xFF;
74 
76  static const uint8_t kNone = 0x00;
77 
78  private:
79  // Disable constructor, copy-constructor and assignment operator
80  Verbosity() = delete;
81  Verbosity(const Verbosity&) = delete;
82  Verbosity& operator=(const Verbosity&) = delete;
83 };
84 
85 }
86 
87 #endif
static const uint8_t kTestExpired
Print test timed out message.
Definition: Verbosity.h:55
static const uint8_t kAll
Print all messages.
Definition: Verbosity.h:73
Utility class to hold the Verbosity constants.
Definition: Verbosity.h:37
static const uint8_t kTestPassed
Print test passed message.
Definition: Verbosity.h:46
@@ -90,7 +87,7 @@ diff --git a/docs/html/annotated.html b/docs/html/annotated.html index a538e7e..ad0db31 100644 --- a/docs/html/annotated.html +++ b/docs/html/annotated.html @@ -3,7 +3,7 @@ - + AUnit: Class List @@ -22,7 +22,7 @@
AUnit -  0.4.1 +  0.5.0
Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
@@ -31,21 +31,18 @@
- + +
@@ -68,17 +65,18 @@
Here are the classes, structs, unions and interfaces with brief descriptions:
-
[detail level 12]
+
[detail level 123]
- - - - - - - - - + + + + + + + + + +
 Naunit
 CAssertionAn Assertion class is a subclass of Test and provides various overloaded assertion() functions
 CFCStringA union of (const char*) and (const __FlashStringHelper*) with a discriminator
 CMetaAssertionClass that extends the Assertion class to support the checkTestXxx() and assertTestXxx() macros that look at the status of the named test
 CPrinterUtility class that provides a level of indirection to the Print class where test results can be sent
 CTestBase class of all test cases
 CTestAgainSimilar to TestOnce but performs the user-defined test multiple times
 CTestOnceSimilar to TestAgain but performs user-defined test only once
 CTestRunnerThe class that runs the various test cases defined by the test() and testing() macros
 CVerbosityUtility class to hold the Verbosity constants
 Ninternal
 CFCStringA union of (const char*) and (const __FlashStringHelper*) with a discriminator
 CAssertionAn Assertion class is a subclass of Test and provides various overloaded assertion() functions
 CMetaAssertionClass that extends the Assertion class to support the checkTestXxx() and assertTestXxx() macros that look at the status of the named test
 CPrinterUtility class that provides a level of indirection to the Print class where test results can be sent
 CTestBase class of all test cases
 CTestAgainSimilar to TestOnce but performs the user-defined test multiple times
 CTestOnceSimilar to TestAgain but performs user-defined test only once
 CTestRunnerThe class that runs the various test cases defined by the test() and testing() macros
 CVerbosityUtility class to hold the Verbosity constants
@@ -86,7 +84,7 @@ diff --git a/docs/html/classaunit_1_1Assertion-members.html b/docs/html/classaunit_1_1Assertion-members.html index 68b02ec..ed4bc69 100644 --- a/docs/html/classaunit_1_1Assertion-members.html +++ b/docs/html/classaunit_1_1Assertion-members.html @@ -3,7 +3,7 @@ - + AUnit: Member List @@ -22,7 +22,7 @@
AUnit -  0.4.1 +  0.5.0
Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
@@ -31,21 +31,18 @@ - + +
assertion(const char *file, uint16_t line, const __FlashStringHelper *lhs, const char *opName, bool(*op)(const __FlashStringHelper *lhs, const char *rhs), const char *rhs) (defined in aunit::Assertion)aunit::Assertionprotected assertion(const char *file, uint16_t line, const __FlashStringHelper *lhs, const char *opName, bool(*op)(const __FlashStringHelper *lhs, const String &rhs), const String &rhs) (defined in aunit::Assertion)aunit::Assertionprotected assertion(const char *file, uint16_t line, const __FlashStringHelper *lhs, const char *opName, bool(*op)(const __FlashStringHelper *lhs, const __FlashStringHelper *rhs), const __FlashStringHelper *rhs) (defined in aunit::Assertion)aunit::Assertionprotected + assertionBool(const char *file, uint16_t line, bool arg, bool value) (defined in aunit::Assertion)aunit::Assertionprotected + assertionBoolVerbose(const char *file, uint16_t line, bool arg, internal::FlashStringType argString, bool value) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, bool lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(bool lhs, bool rhs), bool rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, char lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(char lhs, char rhs), char rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, int lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(int lhs, int rhs), int rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, unsigned int lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(unsigned int lhs, unsigned int rhs), unsigned int rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, long lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(long lhs, long rhs), long rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, unsigned long lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(unsigned long lhs, unsigned long rhs), unsigned long rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, double lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(double lhs, double rhs), double rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, const char *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const char *lhs, const char *rhs), const char *rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, const char *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const char *lhs, const String &rhs), const String &rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, const char *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const char *lhs, const __FlashStringHelper *rhs), const __FlashStringHelper *rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, const String &lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const String &lhs, const char *rhs), const char *rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, const String &lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const String &lhs, const String &rhs), const String &rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, const String &lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const String &lhs, const __FlashStringHelper *rhs), const __FlashStringHelper *rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, const __FlashStringHelper *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const __FlashStringHelper *lhs, const char *rhs), const char *rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, const __FlashStringHelper *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const __FlashStringHelper *lhs, const String &rhs), const String &rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, const __FlashStringHelper *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const __FlashStringHelper *lhs, const __FlashStringHelper *rhs), const __FlashStringHelper *rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected disableVerbosity(uint8_t verbosity)aunit::Testinline enableVerbosity(uint8_t verbosity)aunit::Testinline expire()aunit::Testinline fail()aunit::Testinlineprotected - getName()aunit::Testinline - getNext()aunit::Testinline - getRoot()aunit::Teststatic - getStatus()aunit::Testinline - getVerbosity()aunit::Testinlineprotected - init(const char *name) (defined in aunit::Test)aunit::Testinlineprotected - init(const __FlashStringHelper *name) (defined in aunit::Test)aunit::Testinlineprotected - isDone()aunit::Testinline - isExpired()aunit::Testinline - isFailed()aunit::Testinline - isNotDone()aunit::Testinline - isNotExpired()aunit::Testinline - isNotFailed()aunit::Testinline - isNotPassed()aunit::Testinline - isNotSkipped()aunit::Testinline - isOutputEnabled(bool ok)aunit::Assertionprotected - isPassed()aunit::Testinline - isSkipped()aunit::Testinline - isVerbosity(uint8_t verbosity)aunit::Testinlineprotected + getLifeCycle()aunit::Testinline + getName()aunit::Testinline + getNext()aunit::Testinline + getRoot()aunit::Teststatic + getStatus()aunit::Testinline + getVerbosity()aunit::Testinlineprotected + init(const char *name) (defined in aunit::Test)aunit::Testinlineprotected + init(const __FlashStringHelper *name) (defined in aunit::Test)aunit::Testinlineprotected + isDone()aunit::Testinline + isExpired()aunit::Testinline + isFailed()aunit::Testinline + isNotDone()aunit::Testinline + isNotExpired()aunit::Testinline + isNotFailed()aunit::Testinline + isNotPassed()aunit::Testinline + isNotSkipped()aunit::Testinline + isOutputEnabled(bool ok)aunit::Assertionprotected + isPassed()aunit::Testinline + isSkipped()aunit::Testinline + isVerbosity(uint8_t verbosity)aunit::Testinlineprotected + kLifeCycleAssertedaunit::Teststatic + kLifeCycleExcludedaunit::Teststatic + kLifeCycleFinishedaunit::Teststatic + kLifeCycleNewaunit::Teststatic + kLifeCycleSetupaunit::Teststatic kStatusExpiredaunit::Teststatic kStatusFailedaunit::Teststatic - kStatusNewaunit::Teststatic - kStatusPassedaunit::Teststatic - kStatusSetupaunit::Teststatic + kStatusPassedaunit::Teststatic kStatusSkippedaunit::Teststatic - loop()=0aunit::Testpure virtual - pass()aunit::Testinlineprotected - resolve()aunit::Test + kStatusUnknownaunit::Teststatic + loop()=0aunit::Testpure virtual + pass()aunit::Testinlineprotected + resolve()aunit::Test + setLifeCycle(uint8_t state) (defined in aunit::Test)aunit::Testinline setPassOrFail(bool ok)aunit::Test setStatus(uint8_t status)aunit::Testinline setup()aunit::Testinlinevirtual @@ -134,7 +155,7 @@ diff --git a/docs/html/classaunit_1_1Assertion.html b/docs/html/classaunit_1_1Assertion.html index 576354e..b70f68c 100644 --- a/docs/html/classaunit_1_1Assertion.html +++ b/docs/html/classaunit_1_1Assertion.html @@ -3,7 +3,7 @@ - + AUnit: aunit::Assertion Class Reference @@ -22,7 +22,7 @@
AUnit -  0.4.1 +  0.5.0
Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
@@ -31,21 +31,18 @@
- + +
Inheritance graph
- - - - + + + +
[legend]
@@ -95,7 +92,7 @@
Collaboration graph
- +
[legend]
@@ -107,6 +104,9 @@ + + @@ -155,6 +155,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -193,9 +244,15 @@ - - - + + + + + + + + @@ -209,34 +266,34 @@ - + - + - + - + - + - + - + @@ -255,32 +312,44 @@ - - - - - - - + + + + + + + + + + + + + + + + + + + - - + + - - + + - +
bool isOutputEnabled (bool ok)
 Returns true if an assertion message should be printed. More...
 
+bool assertionBool (const char *file, uint16_t line, bool arg, bool value)
 
bool assertion (const char *file, uint16_t line, bool lhs, const char *opName, bool(*op)(bool lhs, bool rhs), bool rhs)
 
bool assertion (const char *file, uint16_t line, const __FlashStringHelper *lhs, const char *opName, bool(*op)(const __FlashStringHelper *lhs, const __FlashStringHelper *rhs), const __FlashStringHelper *rhs)
 
+bool assertionBoolVerbose (const char *file, uint16_t line, bool arg, internal::FlashStringType argString, bool value)
 
+bool assertionVerbose (const char *file, uint16_t line, bool lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(bool lhs, bool rhs), bool rhs, internal::FlashStringType rhsString)
 
+bool assertionVerbose (const char *file, uint16_t line, char lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(char lhs, char rhs), char rhs, internal::FlashStringType rhsString)
 
+bool assertionVerbose (const char *file, uint16_t line, int lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(int lhs, int rhs), int rhs, internal::FlashStringType rhsString)
 
+bool assertionVerbose (const char *file, uint16_t line, unsigned int lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(unsigned int lhs, unsigned int rhs), unsigned int rhs, internal::FlashStringType rhsString)
 
+bool assertionVerbose (const char *file, uint16_t line, long lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(long lhs, long rhs), long rhs, internal::FlashStringType rhsString)
 
+bool assertionVerbose (const char *file, uint16_t line, unsigned long lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(unsigned long lhs, unsigned long rhs), unsigned long rhs, internal::FlashStringType rhsString)
 
+bool assertionVerbose (const char *file, uint16_t line, double lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(double lhs, double rhs), double rhs, internal::FlashStringType rhsString)
 
+bool assertionVerbose (const char *file, uint16_t line, const char *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const char *lhs, const char *rhs), const char *rhs, internal::FlashStringType rhsString)
 
+bool assertionVerbose (const char *file, uint16_t line, const char *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const char *lhs, const String &rhs), const String &rhs, internal::FlashStringType rhsString)
 
+bool assertionVerbose (const char *file, uint16_t line, const char *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const char *lhs, const __FlashStringHelper *rhs), const __FlashStringHelper *rhs, internal::FlashStringType rhsString)
 
+bool assertionVerbose (const char *file, uint16_t line, const String &lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const String &lhs, const char *rhs), const char *rhs, internal::FlashStringType rhsString)
 
+bool assertionVerbose (const char *file, uint16_t line, const String &lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const String &lhs, const String &rhs), const String &rhs, internal::FlashStringType rhsString)
 
+bool assertionVerbose (const char *file, uint16_t line, const String &lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const String &lhs, const __FlashStringHelper *rhs), const __FlashStringHelper *rhs, internal::FlashStringType rhsString)
 
+bool assertionVerbose (const char *file, uint16_t line, const __FlashStringHelper *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const __FlashStringHelper *lhs, const char *rhs), const char *rhs, internal::FlashStringType rhsString)
 
+bool assertionVerbose (const char *file, uint16_t line, const __FlashStringHelper *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const __FlashStringHelper *lhs, const String &rhs), const String &rhs, internal::FlashStringType rhsString)
 
+bool assertionVerbose (const char *file, uint16_t line, const __FlashStringHelper *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const __FlashStringHelper *lhs, const __FlashStringHelper *rhs), const __FlashStringHelper *rhs, internal::FlashStringType rhsString)
 
- Protected Member Functions inherited from aunit::Test
void fail ()
 Mark the test as failed. More...
void resolve ()
 Print out the summary of the current test. More...
 
const FCStringgetName ()
 Get the name of the test. More...
 
const internal::FCStringgetName ()
 Get the name of the test. More...
 
uint8_t getLifeCycle ()
 Get the life cycle state of the test. More...
 
+void setLifeCycle (uint8_t state)
 
uint8_t getStatus ()
 Get the status of the test. More...
 
 Return the next pointer as a pointer to the pointer, similar to getRoot(). More...
 
bool isDone ()
 Return true if test is done (passed, failed, skipped, expired). More...
 Return true if test has been asserted. More...
 
bool isNotDone ()
 Return true if test is done (passed, failed, skipped, expired). More...
 Return true if test is not has been asserted. More...
 
bool isPassed ()
 Return true if test is passed. More...
 
bool isNotPassed ()
 Return true if test is passed. More...
 Return true if test is not passed. More...
 
bool isFailed ()
 Return true if test is failed. More...
 
bool isNotFailed ()
 Return true if test is failed. More...
 Return true if test is not failed. More...
 
bool isSkipped ()
 Return true if test isNot skipped. More...
 Return true if test is skipped. More...
 
bool isNotSkipped ()
 Return true if test isNot skipped. More...
 Return true if test is not skipped. More...
 
bool isExpired ()
 Return true if test is expired. More...
 
bool isNotExpired ()
 Return true if test is expired. More...
 Return true if test is not expired. More...
 
void skip ()
 Mark the test as skipped. More...
 Get the pointer to the root pointer. More...
 
- Static Public Attributes inherited from aunit::Test
static const uint8_t kStatusNew = 0
 Test is new, needs to be setup. More...
 
static const uint8_t kStatusSetup = 1
 Test is set up. More...
 
static const uint8_t kStatusPassed = 2
static const uint8_t kLifeCycleNew = 0
 Test is new, needs to be setup. More...
 
static const uint8_t kLifeCycleExcluded = 1
 Test is Excluded by an exclude() method. More...
 
static const uint8_t kLifeCycleSetup = 2
 Test has been set up by calling setup() and ready to execute the test code. More...
 
static const uint8_t kLifeCycleAsserted = 3
 Test is asserted (using pass(), fail(), expired() or skipped()) and the getStatus() has been determined. More...
 
static const uint8_t kLifeCycleFinished = 4
 The test has completed its life cycle. More...
 
static const uint8_t kStatusUnknown = 0
 Test status is unknown. More...
 
static const uint8_t kStatusPassed = 1
 Test has passed, or pass() was called. More...
 
static const uint8_t kStatusFailed = 3
 Test has failed, or failed() was called. More...
static const uint8_t kStatusFailed = 2
 Test has failed, or fail() was called. More...
 
static const uint8_t kStatusSkipped = 4
 Test is skipped, through the exclude() method or skip() was called. More...
static const uint8_t kStatusSkipped = 3
 Test is skipped through the exclude() method or skip() was called. More...
 
static const uint8_t kStatusExpired = 5
static const uint8_t kStatusExpired = 4
 Test has timed out, or expire() called. More...
 

Detailed Description

An Assertion class is a subclass of Test and provides various overloaded assertion() functions.

-

Having this class inherit from Test allows it to have access to the mVerbosity setting, as well as the test's current mStatus. (An earlier implementation inverted the class hierarchy between Assertion and Test). That allows every assertion() method to bail out early if it detects the result of a previous assertion() in mStatus. This delayed bailout may happen if the assertXxx() macro was called from inside a helper method of a fixture class used by testF() or testingF() macros.

+

Having this class inherit from Test allows it to have access to the mVerbosity setting, as well as the test's current mStatus. (An earlier implementation inverted the class hierarchy between Assertion and Test). That allows every assertion() method to bail out early if it detects the result of a previous assertion() in mStatus. This delayed bailout may happen if the assertXxx() macro was called from inside a helper method of a fixture class used by testF() or testingF() macros.

For the same reason as the compareXxx() methods, we use explicit overloaded functions, instead of using template specialization. And just as before, I was unable to use a template function for primitive integer types, because it interfered with the resolution of assertion(char*, char*). The wrong function would be called.

The assertion() methods are internal helpers, they should not be called directly by users.

-

Definition at line 98 of file Assertion.h.

+

Definition at line 55 of file Assertion.h.

Constructor & Destructor Documentation

◆ Assertion()

@@ -307,7 +376,7 @@

Definition at line 101 of file Assertion.h.

+

Definition at line 58 of file Assertion.h.

@@ -338,20 +407,20 @@

Definition at line 67 of file Assertion.cpp.

+

Definition at line 116 of file Assertion.cpp.


The documentation for this class was generated from the following files: diff --git a/docs/html/classaunit_1_1Assertion__coll__graph.map b/docs/html/classaunit_1_1Assertion__coll__graph.map index 2c60dad..27996bd 100644 --- a/docs/html/classaunit_1_1Assertion__coll__graph.map +++ b/docs/html/classaunit_1_1Assertion__coll__graph.map @@ -1,3 +1,3 @@ - + diff --git a/docs/html/classaunit_1_1Assertion__coll__graph.png b/docs/html/classaunit_1_1Assertion__coll__graph.png index 89b401a7b63076822feb13f0db24ca28291b80a6..9d4f12d1fbc0f05eab0bdc79f9784336e6657850 100644 GIT binary patch literal 2732 zcmb_ecT|(f7XJW6mW~u@Qlv;H6bZcu0-={kCo~a7AV}x}A}mWU2^c`y3Q|HxP!y$Y z)EFZjmar@$O*Zr<5K4HTyXU<>-uw66IWu$4%-oqfxBTu+x3e*0V-{ov0DuiZZ)F&h*AXYkAG^XhDkVzGiQ&Pvq_8UW41U)0EpEQYvNoJ}WDX)1Bma zQ<(Zjxe}`-`X1l6ZgWxK%Up)=EMHOiL1)TwGjNL>U6Hlf2l!XoS~YpPzT|@)8vk{ItB= z;?*0HpsuSc48+C9E8d$@JBOBxq3$dtCMHT*VoSA9rY(~UhQ`MDu837W1((*arB9ze zS&*EBncnjpJ!oB5_4D%+W?w$sUYPBPZ>X=QPn?^ZD=!yueDm!tU~XaIAj2aiB?W9P z5IDx{cYS$oWas2y3kqCn6o+8>g@v8SS$!P*2o!R7c(}1qq1u7C6qcEp>96YQ>MD?m zx5vS;yaA|njnKyMZp0aNH{h|w4STq|yAZIqw@1#S?JQYlR7y)r*A#SkrB3|T;M{^G z-U{!+;qIOueXpvj+Su5*f=hFrjL#75; zppQ&0qV%ZP+L~EdSVTrfB9WW5wiT6CRTR^z%1SwT`P5&2>3MiI=-c+nW1|2x&%z_( z;C)49<=mm=3+K#b2!awK6TG6utBrKN4{ z?LEu2Ilw_YbDSFV9@5_C<_^uj&&(Cps)WnQX4Kc$Gcz-Xp-?RB>e-29UWa( zgIZxv95t-XMVACM`En*d zfau*25wOqAs`KjIFulyeUFr}Ue>yA7UV`_ToIJY}p7a&yvW>hlz?#_C#-^X*dqR ze3U%CcR$D~Q=`6k{?=%P-mxLZbXPdJ|L}x*0lp2v6Q4~^xKgKRExp=#=kWXi7}`SW z^QNZhJEh}e*{1bPP3}sfX1u%%rLdy~!X{l~Puct^`H`7#jHcZC@=x zqomrdj)5L4mWhWkAF#bU8q zUL#XRp|5*9nirf4D_A@{J>A{hKI_>!=xS=3V zoro+hE?N=${r>GEpmdPg(F=@>KVP4-x;NAN&`XBL$=O-wiX^Hi1?u?Cy{oo1z`}wV zU}b0jKp;%JW{NQ(k;o)5VJ=LJWX+cFr#MTmjyog7{Ht_{l`=X|59-nP29qnq!9frR zHa0gacJn?|}z1gRLzsGt<*?b#)Mf z*p+cvfcz$^#lK1RK+}j*NF#`ejg5_!H7F!RW2qNJ2XdRAPUM<740bm#@HzS}gdYr0 z3eBji9VynhlTC*Ctt8e7eSjGa67xZV3g-$Fd3Pd6vY;WmNYswY_n4X z3Wb_%_H@5_^D!1HeKGw5A-GA-g!A1%3DmYs`z8Vrg4o$#p9buloz2dOV6O0Zfv8B)(WAL6)DDF-c5S zO)Wk?J~=7L!O_wBAiK=@RA77yQ6JB{I7rvtB*mOfN0MIBI5Yq(2 zn35!kWU`B+4XDPzK)GB3ce+VLM8v_yjC*(NcToG2EndiL+`wWOwOsFkRlpCd<9>Lu zO$cAl$;tvBj&+9uTL%Y)q$O0?jXpzd7{O}zo3XKDeMxUOZ?v;CjdDGh3 z8jr_=$qy`7$_rjT5fBh?_3!`#Q3h?Ugm`=B+I2@s^&ky*8J-N2E5%m7Pfj|!xe4;} zUUPIFQ}Ls)TvF1#KW`Ee5(0jyqGI-C@bvTc_U^ZDb42vq;P3)8n(OlA;GvkfxVWU` zWNTYx=9J1`fAzL_BE}SJ>*CmSv%!gad<=y`QLq18TU*=N*oIjw}X@wEtHZaiDwL#kS{`=gHh#R`3b;o*qAh5_fGm3t?({> literal 3942 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 - - - - + + + + diff --git a/docs/html/classaunit_1_1Assertion__inherit__graph.png b/docs/html/classaunit_1_1Assertion__inherit__graph.png index 7a1873893674de2b68d51b9639a45f3b1f69152b..2d0d4ad962a39af476d047491af200f5030d4edd 100644 GIT binary patch literal 9837 zcmc(FbzD~6y6pm_8|hLyC8fKi5mAtS0Yy5bK|mS_K}5Q{OQc13Nhy);mhSF5`S!kN z?{m+0>#y^pe!Oe0wVqky8Dl&%R6|Vx8-pAJf*@?gC$gFlgn$WtkkL@UCr3uDwBQel ziL!z$bbI%e-jo*uK@TBCSt%{I5_PXA;TGJ z?mG`Ss+@4T>{0%>Hya-Q9!fh*Nx)rA7Lt>ez1Kl%^)gv&3xm|u04W&RR0R(Qvm^c? zC2=^n)UpYQF>7UIWx2zW{F`ds3gvbF9xk%RSA&Y0&z|Amzfb2vHY2a5 zhU2n3`^bfiF|dYR_@%XV@i>DMW<^EC-u^y*16E9{-rXYw*-1_P>~*+0?k$uXhoiT` zVA4CYO_-swze_D*l^Ey=6syXL7Z9PfhQot{`HhXq(!@z!)cd%%PL|TvHa7SK1c=bDbth(KW<1f7x;mlW zzCHwqH5LOhwzIn(=Buv8VWgg|e)G21(xDTqmWd>$&PZCdcNtnGAT3gqmqL_ZvrRZqvmpE1V^<3c78XJb-EY=pD}VlIIypT?NN;VG z{@K-)FHjaV19eSJC4C4BV-XcihJGz|e%y>0vnQv`{Pc+c0~gosTSMK-2nISjjk>z} z&+hJwqa!EBw{Nr3(;sRUXqml!Eq{5so7dPVD(tj|2j0TU$!X_eSYl!2S(!)Nqem?N zb9$O`eSLkr!IhJeifUnT5fNf$XD57o{eg(h*v2NJJ&Xhi`tad{Zc4|`pBOz~9$9^B z;KRqqKif3A#b9D$3Mc2o5OLj+)zl>Ts{1HglV#YF&*O9l+sDU;kccS5d?3|twXdxc z2FoVIK(4H+;`ThTR*C0AK*goDcG0(7d~F^X83{pkjfXhOE6dA2T3V!TF++ocQ9)bS zt5<<62PnboGPaz-TZ$3a?%LG?CU%n(OE-68PqNAgk+1TK-O`cOt$&*I> zP&!zWv&1U!ozb(43tB-z(u9PBTK7Z7*L{gOWqois($l9;y9Ndnq@)nQu=Mu!CKmgX zu|(r0#)qF!Mqz>}qoAO0ba2Q(LdA(HE90D)n!1laI9j6DJvo^egiRsOq@HT+PAFBki|BKDKIx1cw=O&)wgf`S@p;_u$+9z$e53|wpwt;jW%Uh*<_t2=3ya0upJ@`2*=87-o~H7jsu}|Sl9{&t``&9Iy&nMg z<7Pzr*S`0X2vZ{_Az^YspJ@f_p`D{;*|)dD&13a%jAlG6i%ULub*!&d0JcE$!v#)S+C|4RQNIt7*%!n0vafvfb zi-?z>k{Iju%ADLu*dXgh_tC=9dYXoo7Kiln-f=L5ltKqcy7g?gq4%$TnRdWn2M34B z``4$g86*7fENj#h1Ra+(nY7!(@q+_HMZB*pvyhUU@$or~`a9sk?I}7$yz-R9j2z-O zJYOd}I@va8Jsjnkcx}8!3PPVTFWcLfkGfh_3u|dx8N*;N>_o+nllI@r=!kWGG?J10 zK>~oKW;};$sdWGw7LE>w{mnG~1>gS#YyaCC(vmdzmUeV^qk|1=5(nerd1=Q?h!geX zCT%>2bU2aE>K{2}O;eD4l3752#L&=?RLC)VJg3|Rz#;tl^0b{Jt7oD7O>i`wg30e} zMU%Le$@Qc4A(OaY4Ex;wk+A-~$7?3kqHez3F-#K2Uf-_{lvPqi$+)?>sWe80*7KcB zg4$t&?K--;tz%;((B9sHOm6~jp24A_np#j(lh~)27?Da*De_SR*Od7E#qu?i;^N}H zlPNnSCTn>%yI%@kzgc>p*N~DJ#pPt{CA;1?tf4&h z;Ex}1BdNtO()V*+;X5FlrLBo7x78Hay^GBoNP@X zMaXBBEo_Vwoh?1MMU#+d_HY&`u4rte1eo2HEcAAMdpiP*q)f?+nsJWaJwbM?{LDhe!j&&Vx!awWKFlDHGGh6gHuFY7k}p{ z3woWE&%3~aT3|5A*RNj-g3LDSxhpn4IoaCMf&ks~sa@?&@HcGofK7h2@XMm~h z9Gc%OYwoz*ZN?Q55vi@MH9kLBsr5Rq^q%O6$B=D#*${6cQr4xw*+N zD3Ee?=Hs`W&VL}m%#0Qq8mhre*oU(@QbYon)qXcq+FJA4%E}7h4#S)ZU2zTSY2s1c zW^Q})2+1ia2%*Sle)W^^9x5t)a*|y63%it#4k;oc zBA3-@G5^3ESZ}4JrN`dbEF2siOle-f&0HNFd8VhQjZICT*@+K`ol>G;k@|lAOcyaHV2c@>n+K1N>i|BkwCL9JpA-1s zB7dG|jSQd(HQ!Sj)tCac3hy^y`PVrtp`cmH+T0?1Nk_(xqYR_)zwYV=g(8)RhcDNd!pE~*o~=1S_W0Roy10y?k)2p2`$bvZuqEE1R#*!J zou4zDEd;Y)Q#CjVOY2WFL>K)t&x6FC?~2MwE3K=G<{r3Ku&aZoe|a8t@71dl*?zyS+nncC}#p0f#80bWX2mWUIW^PbaW4D z>?8;?SYKO%3yX^!QYEAOLMjSD85eY3ys zQO8P8LcG|e#72aG!{V=gjtDZc?;D>--d>&Y-Mi=Y9u?Om%m9Oz!)t`aRE6|k%In_~ z*SGG4OEWf2sH?LTJLep4L#)GP+L|Ck5OTS1K@?(+H$zC zq^L>D(!1cN*xX#5hlGX#@i!{h-q~piK+Gg=aAHx#u}8XSq_wB#P92)Wwbqk{$|6R{ z0~MJ$Z~C_)k>*o_>#j6y^jA+0uoE(5g87B4|MVtAJ)y4!IjUiG?h}=WizIFIJireA zuB)jYYzP8baVpxxHv9Y_Ke78b`BL?k3jAY#8hlYk6 zHb);(in`%xml?JXNZd~6uBW|#CvJYD<7LOed{00?!1cP96u|qBi3zfdj0}j}4n<(= z%M*G*k0a)PV2A(qRE+?+-PPGXN!t$LxNg2kwo9K!M}*SIYNA0*l1ASOmelcTl4wTUVw6kO`? z{Cs99cw$k7OVcw=O|Cb;9%7O4WE=KjPvvB1-ve-8UR4GE@gAwd``SZGTf64Wkn4Td zJ)o|mG;13Rto6)Xh?my*~h2e zWjoQE5Wmv9JvfxlK`6VwIGXm8~k8NZ55GLH2OkofT73SI-;F zQWyfDsq4i#i3qX8{^VC3Qf+h8LDP8lOs2+eZq%oIAWfp|mInhpZ1?+RWJt)crE|;> z9}#g$L5jMu@x$wNbst*VOhAwlg`F*%7Gz~*f^l+y&c6N%h}dJ7t?|EN4h{K!d*i9e zOnAXL9?PbU1{pMar-Y;i!~*vrFeqqaHAA!DN#0Pkpvsd7pu$zZJ)g0y)>U<^OSYY^ z&3KR+6(tFBh<@0voZi%o7TnKO<{rqqUH$zXfG~2yTJM2nRzBfS5UOkgG8F>k=-!!T zu)DI7BVju@%z*|i|D~uA2tx0HZ)$34aHs8KL#s`)`}dKmb+G~ectTH5TUUqR>#f}e z^!;joij1WtD@fVg?=GD5zk87pgl6B3C8fBRTait4S{iPIynl;7>gFXj8PC1b-MKMW zii4)L9YOYcfFra_*S)RqIJVTUwMT%#U=baImer6iSkm(FY)v@d;jYiEXTBC|vWP1V z7^Qe#bG0l75I2z42(*a!8MU>fB%FrUj}4VK3x?M5C@8{a8eC;^G}nzbM@xo+<(@w$ z0sJ7FcYP=i z9eQ^%VXlf(R#=z`T$31of28B}p$}BYqv)L5<7x6XUhKs!NWd$cr%zOHw@^VqmxrMFrEraOKta? z-eAV>abw0brUlm22ta_P6!*~+pnq1%x#2aFUUU-(_)iwY-!hcDEYn6`mK)t|22uuh z!c;{FO>r$R5!DdvVRl zZ7CwSQuIDFM9h*kNS@K zguX_XnI=#d+0Xod!18uS>xgu=bSaX`^K@)zH1cMVH8v*fPZQ`J`W?Rj3?%Nd@4{Fy zjMy?(HJ<>yy6rZxq&ypLZoIwGdQ<(#E?xA~UM?R=%>QDkR0Zm=B5P*yOdk=H)I zsHi;OrM5n6tZ^5fr%JM5@iVI=ej7p*+#S?{uj@0I1zLVJvxy;8B7Y7zo{+S`29a3^ zc_;Y5o_y(X&F}dD=Q~&RJ31Hg1gdzVRUwWjjdaP z6B=4n{$_CZ=siu0B0i}gGDe`v=Se~gvKOVvnLgsdva~Ie)kF5nPabYVab#y^qIi4z$he%C($g3FRaMzE zEnJ@D{OHJK`ZGWxzz)ry?H4gWDrxmYzQ1wI$<7`er%n3vXQBPk8mpj?^DgEVQMPu?0Ad^v@Mx0=Q2_6Zw>FLd+WN_PGV=eHU8ctZa8CW z%Y%-Q5dx!rxVozVgVli`h{1zdXr=A#Db-TyBfGk4_NV5=*<2J+2Ai9)BPm~o9voP@ zdHMup(&Av5w!>fnA!rl=)Ga`V?47SF?;Z5Wv~hH&Q&QRBJ!mF)_3HWF$!zfAA_fRU z6@(!z;^Gwu4{la)tCh%AA!Bh7N-_E2D<1L@S5{FG*~{xBBRc>I4*WpUgs3Q=#UJm7 z#v8_Psi{j%;)V*6lP@F-yhxgFbc2vF#eDGLjsy;F&hL~Cl*B2^KVz-WE^e>^5)r~+ znCJN3>agirbA0>?EJZ~DJVHV^uF($tRp|CT0Xy*@e#oeMi(wq&HFo&Rjg`8&7;fcRNSHRJ@=ADGrrxP(T118iuB$ zF)3+qAi}FxL_dZOc?CsI;TbZ@gITDkatcYJ?t-AQ9s_kI1!4k6pUXP@qAv%D9Ukx=vnVGZi za~MzqGy0N+P(Tm&Pn*-=qa~E2K|iM2sfyDj@8Bk?=arzBAjHp4Y!YY2W9aja-Kjnh z4eN?Pv*6wXFD|{UPxVANVK`d4y68r8*BV9DPoC%?i!{uF){e7oOYU0F3o2Z;VLCcT zk{WnvN^?)a_&=HH#Gn?tSguP|p`4xNd>>M7Yk&pv(r9r4tBc|cVz3-)etv$-VtX3M z(uC;fMO^mAMit6D?&9K0z>fn%e~03ybEkL>*&H9?i!9HjS=j%Z;0MfNBq45sieDh+`JXPE z7T6$)^8+@wwO_w&Z*^LB-ptfnfD+_*?LJy>AJN`{ha!jx3nz@9tGyG$MPYMn!1qNF ze6pH5N{PYkun*K)3Y4QX{Ckf6qvGoI5nlh8oaOh>C2al&&(WqfKp-2&m~K1*0zWB# z6f(0LtFh8{;OS!X*vWMFewB8vMuZ1T5H}EJEiNwy7&N%>ZBdP_NmmXJYXM8vN$t5o zh<+*ja6n??lN163-0&x=s(j;DuDi1l$;p)deRFvF`byl^IvL}yNMpe#TeD3K-LSr$ zptg<<^5Tc1=kx^dx!t#YiF|t}C;VrQ@eANWYiDO(H_R(k_&?Q-|8g)$U+GLYdDhIJ zE`R>_+Ai^Ug()gvh~hVAOE?L0L&ePn8%k*jA3k6J^KI#TH7z(cmZ&3wA{YqpED3`a zW_W8y2MPthH3R`4x3#}tZSQN9`GCBkAvKVK_6x1Z&@b23m6eu}k!l0JYAppIi-E2Y z*+}f7HdK1 zY-V>?*Be(cb>5O+?$^M;rjJ!xpR#LafSiD0!g*<^fF!AuQ`yts{3!gKw+hH+kK++- z#iEhXO(R1?H4Y9ALTc(+njYIS;_tT=RF$uyqoRDdO*?+HwjzScCh*shf4L2n!)gFG z0LpaX&mWXKlVa|B)1Vvh7El$R(sqHv0mOG_0idJZx#o%Uug>?i{>}q{AcFh%xjl~F z9Bob9_eaH**V59ea)#8uvHq`~KyYxd>2Utj^2$m;kYgMc+tA;YNKcj2xorGYIp)1j zL==cCegWhyuigfstq(cepwLWROhQ=J|SF+V8c&to4iI z&CjW+YR%W%b{5wc$0egITFQFF>Quyhe0)xqCpMr&JXXd9f$}`wQHRgzjH|3{_KTvV za-b$|F+vvx(ZFmo0n6n$mrUrOd!*3DLO?Rvg@^Fjb?^B2c)HK+O|8qeZcGpOO>XG6 zfc(z&*=7Q8-f3iR-dP1Kz=KWulZ8q~C-75+*)1(C?+QZ2hE3!o9Qu;L3CnV@^db1! z*Jq>e`}NQ#%E8G=7T8H4XtDu|izfPwZurliKhFmx12Z#vprR|xx(QTLgsW%8VUJSO z?p$wxNffNHO1HW-wkhK5DA?oy6au!xNjspL4h2-}8JK*H$%x-DM}e-cuFBtCp2#Ag4@Om&i`-QKpwk6Z)tNg4AcMt zE-iwZOFW;|m+$jpOjRGQ&hL`u%H^2mh+N^hQ`d)R0d$v zou>v~%;4$i39L1+xnJt(0WgBE0a%DQk=Wev%nH3$kC2zSYcxOLZVCEH`)Mw<%@ zKfEY2RK>x;8O~FGpxfxiU7*EEOZy=*k`ee68-UN$)z|;7Fzrk%rhE9%H&-=j)XWn& zjRE}DE!P!F5NRTDFC*>!H4>G7b{DNrUDmBOwvJaOxmHV-eIug@|-tE z2f^+v0G8@w%VFk=wXBc%ASI3*7nhdi9&e5f`63{7b#w%Iy?a-XpZ`Q7MVj;oVzQbA zwLa!Yk4g-i+uCHwxlLsA#!ReXE#WaO169VVm;0R$DvVnY^_x71Vq;@L-fIUz0_{dy zp=?^*SAUb?Oh-&f84hv~aD`DnQj4{wOZm?Oi>KOZ?1KThsST*|OY$UOP1V@#5}WJu zbTrWX*W*mTw-EY4>9D`p-x&$mTgxI|&JK@K$!GU^!+6d6L1~Z)y4sNEtkYLB?@#6) z?-o^4Q_C!)YZm?k&ch5ZE53}NHtHfZRef`HCJoMIVf^b{#$Tq%4Q{(3Qt|HZ_(O1h O3{sR+lP#4t_WK{I3BQK` literal 13317 zcmeHu#hzc1Y#(k)0ycO%^?-6h@K-Q6JFB?5x9bfc8gAl=>Vd6;wWZ|2N>bN_(z z0@&GIcAkCe`>BmmR+K_TB1D3KfIyXz7FUIUfJ6X45D0MKj8f@dGWY}OqAK+PqV^Z@ zJ_H1NmyEcmx+mnZK71z5z-(tI_3m5Ih5~U3$TV_0w^dYkp>t{QRiPyK`W*Ie3-s|&RWP?iE3w`Y5w8h(bisN|1tM~&+SlS zj{}ZhwH$#KDmst|X1dL*ECB~nLIe{7CYAh3LKy}JG68{B)H764@bxs}hrh2E&mu*< z6NC;hU19iK_eADu^^x23_>p{X7Cu!<#Jq85^o~x~=8VJ%^*LE?ZFKni14o{fFGZ)r zll6GHm7Nb6&!SWnl`@Q>#AdGccdN@Tjv{AUGJ|HVo+~bGtXwgnIKF1Qg#xCu9cY7U zI~<3f1bHl`axlW?=u{0IRApQsmbmp?VA)rMP*y1G5|qtR#E-K=4|`Nq`t4kTcWWUA z@0?DSc?o$O3x>`F zla?mGblB*RYBV2vbNI6J^RvN-BkGpiL#@-b&=o=j9Hw_HwBq_`8bd0RKHq36UCKnm zWC62&n|Q19cEg7M%l+=`_4ZiC{=uK>+0OEqPW@{8DoI)BC^K*Dzbo^J#93&=Va3nwjal)3G`ak)F8mO`UYA)m#T%4{fPJy`&0JiNi=hga|Yc@#{E5@*=AX##`} z=Nkk2lZ9fg2fyh)Frz&}5_@m7wD2(S#b38LZNg;@`H0wPHCdo?nz94~x}`0;qc zkCW&u4W@7oiFp?DH16hjdc@bp+`V{RbwKYpyiRNeW4NO%c_RX1k?XLc*iPrkKe(Uu_cs zvtbOCYh#fbm0~ziNoO=c;TQQ`ZwDcdr-7H`k(77X;Uus~I2aoT3*X*>X%bfeTdMFm z-T(PoQ>W1~$x>V{ov}W0TqWKhf(%L)V_ox|M*QRGbRX~y0vQ!^ctrKvTroE-JH4;XETNC3 z^*yNy#9~>#kR?JA;&?lvFl&4@c(0aXHC>WKyouL`GV}a=`*)}GIwp^wI!8u)rd%n5 z0ySK`E`(95E-)IGfo2Y0kyyw#lgoCV{9e&|l!N-B#>z87WVAzcbz4G=mmH#rq|^TT z;7_Thkmnis&m3MgZ)=#49`u>mc8}9HY5x6@m}vE#U9nM76f>StT3{)bI{dgF#9H%q z@Z!B@-f zZH;kXc%$pSYVSRg9>n*Zq?&0Mwa!y_s&^#qAXiPhcqli z(7{^YZ3(XTXQbY?l$}y)IH(Z>any_+RL;_=BQAXVRIVia{JZ>kmF2=%qrhw=IayB6 zR1n4jcCFx-sSc}HIEwS>gs>$8er=0x`&x_uzKSuz0AD0%R@9Br;E)d59mQ92B&l7S zhq@snS=_!iZiNyeajAs^+(!Fa>RT;!2nQX-3_6V!n_mp)UKqQbGcasP!K(MzrQW*i zhDL9>M%H++4?FA&!~m00Sr`141*q{|_XsqzxnSS74 zB;RW@Yh|AqCfECRJul}(S(VF_^204AR@d^$<8VKMri*`cdoaxOy5v%kAOAuj;rpcU za6Uxhx-EN0NdL@SId}yNNsVAQ8NE@*Zc(#qx7n;z7N4NBwvcY8qG$3xoBOrAgs7%Q zEOb8d4X>dvxNs&kCew`Qm0nVdQto@%S4H|N!Ln$<{|W>RCY~8gBsH~TZ6X^1!>eNrkC@$ z4l7=wlpil#^=$;%itsJr>!1$mTsO$Ge8>~dzw+Q^T|p!Y?1euO@c4YHk#G6<0 z4n<^;D<>q+Zb$W@UY8bfTNzCHgfDEK7B4%Jzr_6?y8RLMF#7!6YN<6~IwVC9du=K> z3Mh?)U*AV_SI0!6+XftVgv&zHL*0mh>;HS}|8EbFcRoiS1w?s(?VaD_(~90CG_CU;odmez*EzR7e;tj_Xj{ zpztHfVl7hAhCM_&>`#|k0bC(8IK8$W-0jfyEa}j3F4AEjeuMF&ysn!|#SN;H0*6P{((DxoC8S`=S4MRHr8AAT|6QTt zx;cp2Wq!2OtYr3dznkwrhM>_ON5nl1umT>V6aBkL@IV;M@l-5W6Olfyj5<)NqqrPa zkJK){S^O*lo91P3MV8P2vWC%+K)#?)I)D^dj8p&j|Kyd5>{mNv@R$v*wsMbL`Z-4+ zf&ey9qLPX)i6vl{)w>%S7@%etLUDY4aMP(bffc-6c4_p!wvLXA95$y`}ukf45%E|EkJ^= zz-mMjbYg{4zECo==dUdGh?mR!f0I6^ol;+PnkeT4sJ=qOpk7Ygeo#2!9$kh)*>P5Fbo-QblM&Tb~J-o=@lNFA((O@)f|lH@;8Ut%-0p(2|u0n zsaL7fwf@Qz%kVuvL@27v}hYA}sXp$z_C{aPL#T zAI;0(fPaGKqp32|C|(~30Oq3fr^VwyOGG|G^t#+>N-w4Anp9`|^oub&!6vWpIa3FI z6a`95d-vyOsecc1U7=d>q=NMOvt%d6y79!t`J7`%+tm-->n;t+UrZ)^qceb8I7S{%PK47{T*wnnIK z-znx`_`o7Sp>07v4pgd@Z;}23^N3~(#*~&LYP~Na#xR@1%JT8%xY2%vk0QEIEJ9WZ z?L9&Xv>miLTr0)tXD+*ja7fS9YE5Q(?S_)H_;%#sO5Nt#w7)t{)+#@I?-Arm6e2DH zZBKqY+E*zT2G6x*o?p-Tz_>Dp-)h|xW1)VUE|Dps40#*<=6!YviY7l4VcNctgX1;# zv+q3sd6idBD{XEmmXlCtx0e&b$n`jMs^a08%8!NjskAD=EI2`BkakdgSpfWC4i^LH z@w?r_fq+JI@Lj&|2Xf4rLgUX|@WV2nx$a*O+~HBgh*wBFme8Jy|IdqQd+}ktK#C5JDIiZo$VM>qQo8cr|Hxc6~V4+)oie zj>a+0{^^%;scf3~H=ckOf%jT!`uf$B%f$0ge1W_h46iYxQhBVVX-xUy0rPtap z44YMWWV!sK1<(|lX@r}T6}beVhYD&MoEEL#>t4j5ExHxDmespph~HlGP$Fpf8i6cp zB2ZySxXGlr-w++|+|)0(3p4&X*7krI_+_$=4op5W=Y%{`Nx^YKqoa7zHklL}^%h6t z!&i)$3fJ{%f|R1(|M@}2(~<>U=&ryVFN@1A8(&f74GJ!xT~y{h-}eFjjXs9F?`A|i zLLu|NE0hS;*m?0-&;B$+c9R0|CFT*gBfgH&u-Z2Z1@_37GIFRY(NGNA*paDf6F6v8 z_^!;T?kp^@m!vMha!}$gvE3fJ*v4&{nfNipXN56iR?^#>pC{@tw&6c*XQ8E`A;}-8qjMtnGvNn| z%2spx1i8aW9dWH`|e!=V_bdUZa5!?+)Q)P&0_lU zq~PnD^QcyeEinnN5(PR=U8C9|ESq(cyF8_4d>$aaO$p=naozu*+aXFae)k~2^_aim z#ZNeqV5g)j)oGZPGBCNfX$IG+*|pO#gk$c{vp&CmfK5-u}~M;19A7 zAc4jS-tM}iJ|}ej{A&457erjPtbZz0!b$yG8fPwJ@J!Rlb1>?M;!buNr38KSM;}lB zp$G7^kdnFmi=1=fFuI~F;ELS)qWeCJ5`zWc97wSWD4d`@AU#ofA8N>zA;83f{_4i4 zf{-Bheg)yHZGVyhvwEG0ETQxwn2`qHU5c9Ro6Mp`x?hnGN+FUmOc5R=_5VKhe{_Ns ziaVrS6gecQ2_>NDa|Ju+G-&_KtjDK*t5a;*`3Z&y4Tt^ZW1%L#L0eSa?s_B%Gtvsn%*d`L?)cPfM?QSme6YHhGP zylQq8m>T!dA~3Hb)st5K|DH{fP4jrTvH}GOPru85rJQ)V!%J-gRIdrU4ke*`@h7ER zzU^6IeDrd~T-mRkH-sxKPE`0CP|4>rO2Sj%72YJG#2pcUZDe9T^f!Eeozte|hmeSB ziv#{W{@qA8+*)32vZ++BR2_kJxk!kKDV{S7 z$Q2O>_$egCPz{hr_R3s`OS%rNuDoVrlujF5yr5n(p@(=I`tZrIRSx%+q;Y zEJk_&oc23NI&D7{dbn9~$aNO>IMJgw{LwMPehC-qx;=_}so_60uR^04;Rtk77eB^Z zWIU!46aqHoYK<=l*`fRq4F)Z1{)K;lK!v#9=CV7H-;6Mm+eJ5nSq*f|DJe3)EgWKV zLC3W~DQ!eV#L&jyUO^BVs*5A%P;@oK*OkLDc+6a{*oDerwL|jd={|0?(?|EbwUE#- z;JL|77)UFdNm8Uqj}&6z`0sTZSzhHt7EF9rR@T8KhpzYj0so$xlh{8gZUUG)*m=8Z zQzDZxI1B{Ob5P|Xh0Rcixa4aAM>57?&=|i12nW?(FZrLxs@KrkN52h+7oUx&cPIi< z_ZV;DiPC!F7KSrfi<3BQG&Vuu=LSNUvF*}#g=w*QM(qY^9(xYSTt2s000&15e`a%{ z(qO1{JPBR@R)e#l8@&A+z|7WKuk%vVgb$D~7t$L>OF+U`J&)>#P-gz^<_B<9saKk8 zjb$h~iU=tTWvBM&1Q~@k{`Ee5AHqp}F6qA-@Xzm6su~2%%tv4_g7IAk>MQE3eTiPh zyQiO7>{3rRM+>HA6L~B6yv`*_{2umHc8iU0qwu~RZWT(JF~#Ps-g2YPKSwk z2OuBRj=D2w(e6T(ph)?M3?~2{oPDnLRIE~K6m?;Gkljn_zi5Ax?5$G}BRsk}Udlx% za@qYgy(cQY{Ed)=-<{)N?klsCMy;OJ)^Jjv{Pdb}%v7Nm{0Md=LR=@HLg~Vhu&88P zy*KbymI5!$Pf4E)2AO#3%Zz?kYfjwVZ6*wKfn^F;7qQgg^(}E4fa14bfIvs^{CLZ) z<-*#s%PpJEXqD*}A^T;XD4(Nw*4BJ(hrE(+9;XJ# z4qFMF#HP;=*Mk6@8rQvfYutJNNh)}f0Pf*kF!aKPX<8gu|ql`O2`w7`Bp# z=<3rY0q>(Zx&Pvt?{mW26VC~CnAMIv`vZZ&EK8*SalbsD24y?b^UK=uFtvlcmU^)y z>es_5ETeD8OH55S-}BC=H>r0>^qL~a;nYAP-k2%)f0CK2d{3g@!SK!;Le<_ z_l40;CK8jR!xblmWG2?`Pg*X=^=MZYLPEn~pj%ad`?ISOJrM8-|6IR!9M0x>(iQp@U;O!5p$0*NA4JzTYgw>a+pt8yU}g3XYW5 zY;`ujWE(L|#go*LifA+*=Eybm>wdwmX=B-zS~@*$rdgDIQ*vRu*cdf$FM|ArF)_T` zy823_%#%X^zf(Q}Z*{8PuIHSqVopFPqp?u1#-LM&18E3me6YKZ%EZm!MQbI!p-!QX zwF2naTuZD7*;reDYV|*lKS9Hj{)jYo15_xq3(!gZNXTqRVzUq!G%_K1016U2P>FdG zMc#HJ@LP$>tCh(o311xzo8}34?XC5MXppkDvs;Ygmp^&A^xedX6ZQayqSA7zNW)dC zsFCy_ObQfvfe$WY(6f$Q)|fTH9#u94B9gHmv zX9lM#nr+*G^B$&Q!IHiYH5D(Daz!$ZkUFZELBk?z!GiL9+)4=p;{a9+)y(4I9ljaH?1?YzE6@C#%g;ce<5U^=n33k^~A34ffyvLscM9Hmjn=IMc_ zBIEWQv$PmKWAL8d}w+NuygQj59?1-+UtswuxjiWb{Rx7 z*UosBx;gUpSw0*8SX)Mpxn8-tyv4f^h3Ik56osU#YqQ&4U_~7d%tTYm%{*rzDdS~r zU;EOB0*TIyGOpahH_j9|zdXYJ>CN(hOIpZdNu7yqXkrx=K}*W|Av-@-sGU;kMn<1f zu3Yf~F63;mSp~dlg?`Q=`H||3j-o_2I+#&U5DLY#Q0}5YHD%)bvaJsDBmxf6Cpn@i zjqqL}vhvJ3C4&-9n;W>M5+^6bjuLNOW%H`KGqLXPa$kPp2Cr*U_l&75HfGW3ez)$p zxHK?$ctSlL;2{xMXQb1t4adPw$;UJPvL2@46HL#q7iPTwJvZmLjJF;ob9bY-E#A}= z+f!^7Qz&qUHlF!tij9odIV>Dyf!;X=XGB&Z8)sLLxHULWkq5D#hNI@H zG3FbIsJP33L8o^JjiR0mmDI~{#LU~X7`rL8dfdYV9W|g|rDvky0@0du?ag>x*BYrf- zv^iXM@5x%fXL`sOG)4BH3DC(5p-O#pI^A8(7v1}`0&b8wH?+j?V7?+*`;CXfKmJq`fs?y>+^mH z`kRX^RpsA=uv>q56K9OE-F3&87+gIl-9?6=j3zTR<#T16XKzx+U z&?ifc&6Mm0ZzQa%-CVvujf(lQvUdfd3ip<64>GVST`V6!FUQjNeXc2(n)rN+^s&~r ze2A22a15wrzloegkyE%GxP(}~6Ef$>+MagXBE5v8J18)BoJmhktBV%CO3GLG@Pc7S z3+(4s)B1NXhs3^twJx|tL9^AG@v<3;4={TLpQ2%ZJY5ubupHjp=SV|~k?g<`1c!Qa zQRA35w9D@{kDXYGOW$v9Iy7Xz;C}Ur+=P`WHA_m)a^sk^UpdHXrhAAXh~{%U`OZO< zV}}Ukb1^dNTXjwUuwR}_mrbU?=m>@cYKTRG+K9g1=eE+f;8^Hk=X1tg;%u!itxej$ z>)%#;c|J(zQx_hkmU+b3hpU}JUjtg`?ne?S1j&Z}rqRgn^>Za1_!7UEz1W8f-q`Y( zV2#YlVqj|c05!6C8av>A8(E-9OWhkd$4loPG^FX;!K8w!a}Zk98U*yZ-^m>?#)iqd z_U+%dlCqUhlT{if2~%<;aXAR#8&@oGx3{5D1|R$g_}AJ{;(f7&w>KqqDwBFyZ<_Ir zeQP(^?vCg8;d>x*GmLOH+Bux)H{*MIzDdza9UDaDe{<9}QB zM6}ZIE74-A>O4$uPc}I`?3G@ANRASzQQ@}#9&ScsRfTpVn;~YmAc(_1$3Ct0WGWhg z92hLBqEjMZPxSK~bMn=SUN<~O0Kn-}Xv`pi(w9Ub9!~GQxyh;93j%_&HMFmZN zvx%>?+6`s}U%ULHoOi~@%?bM+Wti@%rKrMy;1W4$dgOuRvSVBF@3Bk!=@$J(&%my0 zJJeJ>5!%A2E)a;XP7Oqy#FtjL0(7FG`$Tn~=kBYP*KxpW-cB3p<;Vy!N0u96MfKiS zWt`}Z&G^O$l~Pe3@=EvWFj0d$(il9{=4#birUd%S**VdI`_FJyS{#{H+g9W3Fn2v& z7Q}^?*qD6TZTfP+^R-J&k?H{DsdU;ls!tOO%F;BI*1&qn6ctlKu8rBvI zOUYsws}A|xQ85$voHyv`9Z$xB}Zy=bqH8Q8wh%}ji(}=B-^8?dSwF_+v0>1{4 zR=*8GA^U0~kqi?LPU0pLHYYr;lZZzPjzQ{ADbuS96C<3<V;>EI(@^$h{^We z_SoG1ar5rkI~eu`$mZ|~HjWQQuYyN-zG1zo>89CtD6&5T1SvcOvbjDmFZUCR@>p|s zON8Idk$DvdG%}pQy(Pr6$ykcMz3IE1K1!qZlD0ak85~ewe=G)S>Kde^mGXRo+Lf)4 zBY^oWoyEo@N1wTLx_B+O*tj1!et#%s)&c+TOLO*F;t_?=tuqpEJeD3K3E9YB7j*DM z^YFZGy~zMm)|U$PeZ{|&HkJn3i+UQFz-V~8SZCZtnGE&X0*GPhB8R`)S1TT$_b(^- z)taoS)oB0h$-?mq*Y`Fm<~BI*p=jh)A^&$F&@Act_i}snN7KggXdbO0mJc>LcJZyF zESE<1M)kUuS2S+L!3W?TiSO0nj_@E_U+tM+?U&o#-QCJkDE=hfIA`6EN#PrFa?=Wm zR>G`8Mtv9z za9HVa>aZmc@%tfBAu{@nhDkkPlhsU;GuxjWUP09>pAutO@kllhVnPViZ*gSke0gx~ zl~I;OqkxzfeXCKhp-xZC5t3G^e;p_RH zrxMCZ!=v+eC1ddUjr~kyl_*T*2H^9FM_(%py97{)X6dC>KgKd6q|&)W)F=b}q^m~j zk6NX#=!BmZHNtJn-PP5Ea6-(Ea;LWpA$wV;Z_DgENJ1V<1QDN1zNVNOt%1>xZb7dp z27G_lwQhp@T4*6Hey5GgRH4ofgybcVQt&FK1N0iTH;3H(Mqci33LIP@ngWjIVXYUO zQE=%~)owJ+MoY>?VIe*#7tdC@G}q`2WQ@R}8{n%ixMP*Utbeit(u%eaQACKmBO%Ur zifUwLm^x=%AMUd$(;CZ&Y@MFDg>R&njdG7(VwJy0_=Ey3O&m zHVX|po}YMPoy&o`W4_#yBtpXP&lEn=>f)oCMA_;W`9)L>JLqKPaAeAj2L`XNM>3AS z+`^rb#;!@!Q~M(#B6p=+#z>>x62-l|-v0D`XKZCpFDzt@Z5UTjTCLW36_XbX)|V2! zcK7$FWI_V>nOw*~o#I=pr(#}loAV+aTa9d)Mkf`>6dqUO+q=)>bE60L4Edh37@gzo z$#N>IDHJYqEx!nf6O(2wF`!P9=a|&fkn5c%rRmi?QN7))%k{g@j5^xy_Fft+R+#_&HXab` z@RTzCQeQt#%Q2s$t<~9uN0svmYKo3NyvFOe?3bmv9ad9A8PqG*+zAIcH4*X?6UhS@ zG-?v*gf2-sQ6Rl*^5;AkE7MY zg`S3bGhHCb7O+=Nat+jni`|I{ngltR z8Re@h7jkwiYpbyCh;IAS)SIBqOiB)a-!N)TYJuq9F}#5u$YzaIsFf=gB@R<*$`)ssRc;Y9+^OdfEuHU;L zPmoS~Y$RY5%%L@Nu8ou8mh6_8(_K=h)#_ZD1WfuZ@wXSZyMCg)@g)2^Z^t;Ff$vBF zm>;|Q>FP1g34la!s|>OSfX6F$oE(1W5<@Z{bbJ{?{ z=qh=MBNfbc-uN zF~0-+9&d2vm1&;*K%z|*$0%g|Z6o9ir~Ptfvvoq^Qb`@lUp$%*-oUx^8akG!6np9o z+wcp5gHV7lUyBb0!99hgW(TFz7ZCfn553exIFukJIk=4DUR~?66Ou}hmuZ6U@0%pR z7vcZlBf8Y{fu}{`GndK$s4R}_y{~Ca@5ke2i84>Pi-|P0rz!Fl6@phofAttV5RTh5 zBm$nY&G-IdFvHN_ikjWH7iP0Cf;9ONbcLZexBXSGcTE+M)l3;@twE>t(ZV;Wr|uHR zTEV+S3bEKyxr}JC%)7t;UYa2-++1q~dx0SK)7&-0xD zA0S0mPxH#<_A>PMAw%(lAod`>WHikx^mxRM7!x2b4wsU6ML28-wCWN8P>I_^Wsulu zK86?)B1YI4?3uA3$|j7V4tgF`miJG54p=V}Ex_BBG=BnF#$>_|^=o-^p5uJjixn3(p0}({CiW zr>OggbhNo05(1GHQ-NsR%c`-5i*Jf6(-!4K50wTbBubpc-Iq*%#;p@Q3oeM2m?ISU z0_i}Tpzh@HhQv4NZ~|iNE-DAfJ@HUuM^xEo@pDP+y_s@!PRmJ=-jFEc@z9&(R3dJB z;(YJr*vx`RnaDiP4a6zR@mG-VI_+XAu>dr220}>uh1^Hr353=6ECT8LcZZjY&`0Yk z+*Fw)1HbE!`<#g&TKu5x|HEXq)5oKi?_R*`;%p(qu48akmL-;n1m~qKO;P8c+zyoA0L5rOtMBQCvG|%NP#9Y>ZLMS~FQr@VeR_qBX9&EdG-W0^B@(5Qim z4SAA;1SwY)ZEfz0?i}F^rT(|1;vlO0`HJuitWHP-sLh3NR3bieO!Gl47a&DWSAWi% zwCq0UhVBnyZMyG0JCj0yF;3|lPyO^#_Eyp&yYS)pYDNhbPa|nS5`xjQ;@wErwyUop z$UPi#q;vI!(g(ylr+6FAv&aC=a3f_vCu(Q>K%n#KVk~MEck33|GfhVy<1d_0b#ZKM zELz76=Nu=I3P=i`MLvgyJfln`Dp_XirHQaqn9jPyUYo*FXOdToCWvo-GDekH1U%h z8asm#jzPiE-o6pcU>%fNzoVyNftRsDVCy-u8EV{wX2b*Z$meW|4X`+Sa0FK0b+~vc zy+*V<8EW_YhGVbM1--B8$~cTC!`HF0gAU)=cx+2NLa_!KO{E((4o&8Kk}AOt5lF@4 z38qaX3s}lFeSpLk2bps5x(5R2KzFv!E2m|_tyo0;$ z3k1>l4FHDPXCOJGT12`)L@V-;_%qzxgsNE_@#Zo37D`MKg#vJ4np|ii0&|}AY@t=E zdHsU--ESc6AObS4Mc#dKua!wd?Q`#V>_#&W`5u4!vmc$EV$$f$!1OM}178d7DAOq? zNBA2)Mz^U$RtRTUjU1@_M|=6_yQPM3}jo{_(M8Uo|=M*0voZ)e#rp*VKOF6^^GSbvNYf9Fb$DD&?G*GR78V1bfW4$|lrOUSjJ{+VDMM2w7>YhgkT= z8pE!c1V$mvUWd2Lvzah`Ufzah{+BGO79HarE3ASZ`^EZ3JCv1fJn?LLUxP?2l;w|z zpIJ?N#r$k`eoisB+9-X)hg>3;52s&u-T_>c?0{E`SvkTDv&YfM@2S;g&+TmY*L|{3 zray=ua`-=a?xVt^;FB-L6hm^;jW3syy`M13U>lmE#a4Hg+SL1%!yBTiel^|Wn74|D zB1aMzUTf7VM|Rv>Z`U#?b3!`LyLd<3XF4Bl?7*Twi9nf|6%D5iGBSzlgUHMs^eOcsyFu!gtua)qaIw3uj}w#43B_7=>TqDDQ~-;=6h&|p}u z!yfuomz8-Kk$N}S-IC%U-nj583Vtq?xiWu0BNl-B`uU48QRolo=s?OfOaOxuCMzNU uB&HSJ;|IT?NC5~wLx}SR-_vyegHB#Cr3vKOc>TNwLPkPSy!L}p@P7gQQV|6J diff --git a/docs/html/classaunit_1_1MetaAssertion-members.html b/docs/html/classaunit_1_1MetaAssertion-members.html index ec8af87..3517219 100644 --- a/docs/html/classaunit_1_1MetaAssertion-members.html +++ b/docs/html/classaunit_1_1MetaAssertion-members.html @@ -3,7 +3,7 @@ - + AUnit: Member List @@ -22,7 +22,7 @@
AUnit -  0.4.1 +  0.5.0
Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
@@ -31,21 +31,18 @@ - + +
assertion(const char *file, uint16_t line, const __FlashStringHelper *lhs, const char *opName, bool(*op)(const __FlashStringHelper *lhs, const char *rhs), const char *rhs) (defined in aunit::Assertion)aunit::Assertionprotected assertion(const char *file, uint16_t line, const __FlashStringHelper *lhs, const char *opName, bool(*op)(const __FlashStringHelper *lhs, const String &rhs), const String &rhs) (defined in aunit::Assertion)aunit::Assertionprotected assertion(const char *file, uint16_t line, const __FlashStringHelper *lhs, const char *opName, bool(*op)(const __FlashStringHelper *lhs, const __FlashStringHelper *rhs), const __FlashStringHelper *rhs) (defined in aunit::Assertion)aunit::Assertionprotected + assertionBool(const char *file, uint16_t line, bool arg, bool value) (defined in aunit::Assertion)aunit::Assertionprotected + assertionBoolVerbose(const char *file, uint16_t line, bool arg, internal::FlashStringType argString, bool value) (defined in aunit::Assertion)aunit::Assertionprotected assertionTestStatus(const char *file, uint16_t line, const char *testName, const __FlashStringHelper *statusMessage, bool ok)aunit::MetaAssertionprotected + assertionVerbose(const char *file, uint16_t line, bool lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(bool lhs, bool rhs), bool rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, char lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(char lhs, char rhs), char rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, int lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(int lhs, int rhs), int rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, unsigned int lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(unsigned int lhs, unsigned int rhs), unsigned int rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, long lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(long lhs, long rhs), long rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, unsigned long lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(unsigned long lhs, unsigned long rhs), unsigned long rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, double lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(double lhs, double rhs), double rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, const char *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const char *lhs, const char *rhs), const char *rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, const char *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const char *lhs, const String &rhs), const String &rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, const char *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const char *lhs, const __FlashStringHelper *rhs), const __FlashStringHelper *rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, const String &lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const String &lhs, const char *rhs), const char *rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, const String &lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const String &lhs, const String &rhs), const String &rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, const String &lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const String &lhs, const __FlashStringHelper *rhs), const __FlashStringHelper *rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, const __FlashStringHelper *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const __FlashStringHelper *lhs, const char *rhs), const char *rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, const __FlashStringHelper *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const __FlashStringHelper *lhs, const String &rhs), const String &rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, const __FlashStringHelper *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const __FlashStringHelper *lhs, const __FlashStringHelper *rhs), const __FlashStringHelper *rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected disableVerbosity(uint8_t verbosity)aunit::Testinline enableVerbosity(uint8_t verbosity)aunit::Testinline expire()aunit::Testinline fail()aunit::Testinlineprotected - getName()aunit::Testinline - getNext()aunit::Testinline - getRoot()aunit::Teststatic - getStatus()aunit::Testinline - getVerbosity()aunit::Testinlineprotected - init(const char *name) (defined in aunit::Test)aunit::Testinlineprotected - init(const __FlashStringHelper *name) (defined in aunit::Test)aunit::Testinlineprotected - isDone()aunit::Testinline - isExpired()aunit::Testinline - isFailed()aunit::Testinline - isNotDone()aunit::Testinline - isNotExpired()aunit::Testinline - isNotFailed()aunit::Testinline - isNotPassed()aunit::Testinline - isNotSkipped()aunit::Testinline - isOutputEnabled(bool ok)aunit::Assertionprotected - isPassed()aunit::Testinline - isSkipped()aunit::Testinline - isVerbosity(uint8_t verbosity)aunit::Testinlineprotected + getLifeCycle()aunit::Testinline + getName()aunit::Testinline + getNext()aunit::Testinline + getRoot()aunit::Teststatic + getStatus()aunit::Testinline + getVerbosity()aunit::Testinlineprotected + init(const char *name) (defined in aunit::Test)aunit::Testinlineprotected + init(const __FlashStringHelper *name) (defined in aunit::Test)aunit::Testinlineprotected + isDone()aunit::Testinline + isExpired()aunit::Testinline + isFailed()aunit::Testinline + isNotDone()aunit::Testinline + isNotExpired()aunit::Testinline + isNotFailed()aunit::Testinline + isNotPassed()aunit::Testinline + isNotSkipped()aunit::Testinline + isOutputEnabled(bool ok)aunit::Assertionprotected + isPassed()aunit::Testinline + isSkipped()aunit::Testinline + isVerbosity(uint8_t verbosity)aunit::Testinlineprotected + kLifeCycleAssertedaunit::Teststatic + kLifeCycleExcludedaunit::Teststatic + kLifeCycleFinishedaunit::Teststatic + kLifeCycleNewaunit::Teststatic + kLifeCycleSetupaunit::Teststatic kMessageDone (defined in aunit::MetaAssertion)aunit::MetaAssertionprotectedstatic kMessageExpired (defined in aunit::MetaAssertion)aunit::MetaAssertionprotectedstatic kMessageFailed (defined in aunit::MetaAssertion)aunit::MetaAssertionprotectedstatic @@ -127,15 +148,15 @@ kMessageSkipped (defined in aunit::MetaAssertion)aunit::MetaAssertionprotectedstatic kStatusExpiredaunit::Teststatic kStatusFailedaunit::Teststatic - kStatusNewaunit::Teststatic - kStatusPassedaunit::Teststatic - kStatusSetupaunit::Teststatic + kStatusPassedaunit::Teststatic kStatusSkippedaunit::Teststatic - loop()=0aunit::Testpure virtual - MetaAssertion()aunit::MetaAssertioninlineprotected - pass()aunit::Testinlineprotected - printAssertionTestStatusMessage(bool ok, const char *file, uint16_t line, const char *testName, const __FlashStringHelper *statusMessage)aunit::MetaAssertionprotected - resolve()aunit::Test + kStatusUnknownaunit::Teststatic + loop()=0aunit::Testpure virtual + MetaAssertion()aunit::MetaAssertioninlineprotected + pass()aunit::Testinlineprotected + printAssertionTestStatusMessage(bool ok, const char *file, uint16_t line, const char *testName, const __FlashStringHelper *statusMessage)aunit::MetaAssertionprotected + resolve()aunit::Test + setLifeCycle(uint8_t state) (defined in aunit::Test)aunit::Testinline setPassOrFail(bool ok)aunit::Test setStatus(uint8_t status)aunit::Testinline setup()aunit::Testinlinevirtual @@ -147,7 +168,7 @@ diff --git a/docs/html/classaunit_1_1MetaAssertion.html b/docs/html/classaunit_1_1MetaAssertion.html index 4bdc72f..a791a71 100644 --- a/docs/html/classaunit_1_1MetaAssertion.html +++ b/docs/html/classaunit_1_1MetaAssertion.html @@ -3,7 +3,7 @@ - + AUnit: aunit::MetaAssertion Class Reference @@ -22,7 +22,7 @@
AUnit -  0.4.1 +  0.5.0
Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
@@ -31,21 +31,18 @@
- + +
Inheritance graph
- - - - + + + +
[legend]
@@ -96,8 +93,8 @@
Collaboration graph
- - + +
[legend]
@@ -120,6 +117,9 @@ + + @@ -168,6 +168,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -239,9 +290,15 @@ - - - + + + + + + + + @@ -255,34 +312,34 @@ - + - + - + - + - + - + - + @@ -301,29 +358,41 @@ - - - - - - - + + + + + + + + + + + + + + + + + + + - - + + - - + + - +
bool isOutputEnabled (bool ok)
 Returns true if an assertion message should be printed. More...
 
+bool assertionBool (const char *file, uint16_t line, bool arg, bool value)
 
bool assertion (const char *file, uint16_t line, bool lhs, const char *opName, bool(*op)(bool lhs, bool rhs), bool rhs)
 
bool assertion (const char *file, uint16_t line, const __FlashStringHelper *lhs, const char *opName, bool(*op)(const __FlashStringHelper *lhs, const __FlashStringHelper *rhs), const __FlashStringHelper *rhs)
 
+bool assertionBoolVerbose (const char *file, uint16_t line, bool arg, internal::FlashStringType argString, bool value)
 
+bool assertionVerbose (const char *file, uint16_t line, bool lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(bool lhs, bool rhs), bool rhs, internal::FlashStringType rhsString)
 
+bool assertionVerbose (const char *file, uint16_t line, char lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(char lhs, char rhs), char rhs, internal::FlashStringType rhsString)
 
+bool assertionVerbose (const char *file, uint16_t line, int lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(int lhs, int rhs), int rhs, internal::FlashStringType rhsString)
 
+bool assertionVerbose (const char *file, uint16_t line, unsigned int lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(unsigned int lhs, unsigned int rhs), unsigned int rhs, internal::FlashStringType rhsString)
 
+bool assertionVerbose (const char *file, uint16_t line, long lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(long lhs, long rhs), long rhs, internal::FlashStringType rhsString)
 
+bool assertionVerbose (const char *file, uint16_t line, unsigned long lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(unsigned long lhs, unsigned long rhs), unsigned long rhs, internal::FlashStringType rhsString)
 
+bool assertionVerbose (const char *file, uint16_t line, double lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(double lhs, double rhs), double rhs, internal::FlashStringType rhsString)
 
+bool assertionVerbose (const char *file, uint16_t line, const char *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const char *lhs, const char *rhs), const char *rhs, internal::FlashStringType rhsString)
 
+bool assertionVerbose (const char *file, uint16_t line, const char *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const char *lhs, const String &rhs), const String &rhs, internal::FlashStringType rhsString)
 
+bool assertionVerbose (const char *file, uint16_t line, const char *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const char *lhs, const __FlashStringHelper *rhs), const __FlashStringHelper *rhs, internal::FlashStringType rhsString)
 
+bool assertionVerbose (const char *file, uint16_t line, const String &lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const String &lhs, const char *rhs), const char *rhs, internal::FlashStringType rhsString)
 
+bool assertionVerbose (const char *file, uint16_t line, const String &lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const String &lhs, const String &rhs), const String &rhs, internal::FlashStringType rhsString)
 
+bool assertionVerbose (const char *file, uint16_t line, const String &lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const String &lhs, const __FlashStringHelper *rhs), const __FlashStringHelper *rhs, internal::FlashStringType rhsString)
 
+bool assertionVerbose (const char *file, uint16_t line, const __FlashStringHelper *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const __FlashStringHelper *lhs, const char *rhs), const char *rhs, internal::FlashStringType rhsString)
 
+bool assertionVerbose (const char *file, uint16_t line, const __FlashStringHelper *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const __FlashStringHelper *lhs, const String &rhs), const String &rhs, internal::FlashStringType rhsString)
 
+bool assertionVerbose (const char *file, uint16_t line, const __FlashStringHelper *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const __FlashStringHelper *lhs, const __FlashStringHelper *rhs), const __FlashStringHelper *rhs, internal::FlashStringType rhsString)
 
- Protected Member Functions inherited from aunit::Test
void fail ()
 Mark the test as failed. More...
void resolve ()
 Print out the summary of the current test. More...
 
const FCStringgetName ()
 Get the name of the test. More...
 
const internal::FCStringgetName ()
 Get the name of the test. More...
 
uint8_t getLifeCycle ()
 Get the life cycle state of the test. More...
 
+void setLifeCycle (uint8_t state)
 
uint8_t getStatus ()
 Get the status of the test. More...
 
 Return the next pointer as a pointer to the pointer, similar to getRoot(). More...
 
bool isDone ()
 Return true if test is done (passed, failed, skipped, expired). More...
 Return true if test has been asserted. More...
 
bool isNotDone ()
 Return true if test is done (passed, failed, skipped, expired). More...
 Return true if test is not has been asserted. More...
 
bool isPassed ()
 Return true if test is passed. More...
 
bool isNotPassed ()
 Return true if test is passed. More...
 Return true if test is not passed. More...
 
bool isFailed ()
 Return true if test is failed. More...
 
bool isNotFailed ()
 Return true if test is failed. More...
 Return true if test is not failed. More...
 
bool isSkipped ()
 Return true if test isNot skipped. More...
 Return true if test is skipped. More...
 
bool isNotSkipped ()
 Return true if test isNot skipped. More...
 Return true if test is not skipped. More...
 
bool isExpired ()
 Return true if test is expired. More...
 
bool isNotExpired ()
 Return true if test is expired. More...
 Return true if test is not expired. More...
 
void skip ()
 Mark the test as skipped. More...
 Get the pointer to the root pointer. More...
 
- Static Public Attributes inherited from aunit::Test
static const uint8_t kStatusNew = 0
 Test is new, needs to be setup. More...
 
static const uint8_t kStatusSetup = 1
 Test is set up. More...
 
static const uint8_t kStatusPassed = 2
static const uint8_t kLifeCycleNew = 0
 Test is new, needs to be setup. More...
 
static const uint8_t kLifeCycleExcluded = 1
 Test is Excluded by an exclude() method. More...
 
static const uint8_t kLifeCycleSetup = 2
 Test has been set up by calling setup() and ready to execute the test code. More...
 
static const uint8_t kLifeCycleAsserted = 3
 Test is asserted (using pass(), fail(), expired() or skipped()) and the getStatus() has been determined. More...
 
static const uint8_t kLifeCycleFinished = 4
 The test has completed its life cycle. More...
 
static const uint8_t kStatusUnknown = 0
 Test status is unknown. More...
 
static const uint8_t kStatusPassed = 1
 Test has passed, or pass() was called. More...
 
static const uint8_t kStatusFailed = 3
 Test has failed, or failed() was called. More...
static const uint8_t kStatusFailed = 2
 Test has failed, or fail() was called. More...
 
static const uint8_t kStatusSkipped = 4
 Test is skipped, through the exclude() method or skip() was called. More...
static const uint8_t kStatusSkipped = 3
 Test is skipped through the exclude() method or skip() was called. More...
 
static const uint8_t kStatusExpired = 5
static const uint8_t kStatusExpired = 4
 Test has timed out, or expire() called. More...
 

Detailed Description

Class that extends the Assertion class to support the checkTestXxx() and assertTestXxx() macros that look at the status of the named test.

-

Definition at line 225 of file MetaAssertion.h.

+

Definition at line 42 of file MetaAssertion.h.

Constructor & Destructor Documentation

◆ MetaAssertion()

@@ -350,7 +419,7 @@

Definition at line 242 of file MetaAssertion.h.

+

Definition at line 59 of file MetaAssertion.h.

@@ -409,20 +478,20 @@

Definition at line 53 of file MetaAssertion.cpp.

+

Definition at line 49 of file MetaAssertion.cpp.


The documentation for this class was generated from the following files: diff --git a/docs/html/classaunit_1_1MetaAssertion__coll__graph.map b/docs/html/classaunit_1_1MetaAssertion__coll__graph.map index 50dab12..02a01d5 100644 --- a/docs/html/classaunit_1_1MetaAssertion__coll__graph.map +++ b/docs/html/classaunit_1_1MetaAssertion__coll__graph.map @@ -1,4 +1,4 @@ - - + + diff --git a/docs/html/classaunit_1_1MetaAssertion__coll__graph.png b/docs/html/classaunit_1_1MetaAssertion__coll__graph.png index af7d771f2237f1440b441448793f31dfbb25f222..1d2362bb2529c22b7d06b89c095c98b22f53c360 100644 GIT binary patch literal 5200 zcmcgwXH-+cwmyhbl_r7|MT!WBh@eOnC81XV5$S4_-b3#QhGGx}1Vp+>C)9vIC?dUs z)X;k`(n5d3eRr+*?tAy|dn+gBtT{88?3umy_kDYUHPqxUQ7}_L5OhgV0j>$2vEW-l zMgs26qLL`^AbF)M4~I_AK1sOr2neFTpa_4W?fPwX)JsFlw2E}Y)+mi2L;r%Ng=1NH zHLag&bggM*RZlO&*~!!V%AH}p63f^;>+ZCR5>9f~E?>;!!(KD#H4w$WnPkYXG?PG9 zw4K*COb$u=Vu53ZlXTh1veS{xth$`qHPgw+_)2moS9i9>?tYsWn?LG^z=)w{xIWR) z`rY&UJ|^I+>dh*|&5HU!-pKy?S2NDACTX<7B{es<9sfp!St$16ix)3qBwX@Jl{e!} z3*V7ar<9cRopsgM*Nb}W=9IQV6R=JMly5m8z;*McTg3;(Cmf$#E6%edx^cgbVEpIA z_DwN%tc5<778cBV^$v=PMn0Q^FCD3dHU2(p3RHi&(AL?Bt*v9Sp;hA9oujVhWr2h>+rjw zK_*Re61O+zxKN5*)P!oji8+3=G0jPTUNrQwGIAPIp{DQjysEv>Db5b|)>y286|fSsdf5g8dBJ&zn4Iw5)U=1up(&T?i+Nfa{+ z3$KXCm!95UMa)2iX6E;i5rZC!668!1E%=i^c>FR_f9-0kYsg$QyD&2vx&Qag((39> zjuc_j4jQP(?7mIl%1m?WS#AT}7eC0@Xgz-*a;Fa4tNmW&2>0=CEd8#kQcANb!cUlhr z^5y;Tu-?qfjOccOEnTlp#UR@2WHSskNK-HSmjNv?pASo#+G75@w5IsG8QhGWm zo7Z-C*`6>Vngbfac?_&EITDV{K1W0VfBMbMy)`IDlHY!wSKRjnSpVyn3=)Yd~kg%{Hbtq~r2M3|R_wVUwyQ{nod3bn&uDdU= zXJutMlyUc(-KW}uVSL)&3WN0ME;jGAI+m;GXR&qz3rR~$d#bB@wf&n|1lDF$$sLyv z1cEVyM_l~t50zM%d-v`kj|leZPGy!k)4ZPpnjSvN<@%(cp{e<+^uRUfE;`*fK_J#= zGW_18C_+V)is^C~tRZ0fpUuSb#GJf58%>;P<4HRnLqhGoQA%-YEWDSILFm{uj%c2m zwKyV0wW)GPT)3rnAA*qO-rvNX>RYeuQ&YvpSy*_>sCR;N6NpYpnW~Jw{g;hZ=wVb; zJj%e^wyf`C;!?P1V*xdW7N1P}7oop{fPUpp~Olm$XEh!u2wD{OHjck1M zxi4<8pv*-V8P(^J$#MFN-4XWUh17S=L&o4c47dL*C3cOD&ZlJoW31>$N4*GhakmBI za;dE0dkM2KmaK(Ozlm<*T6bSJ5+cQzsfKtS9p+ruS#Gio(aqKQ)A!&>cDy8;@nv9z zj68~JzSEd(lla#=gb;ZZVQT)kPa}0Q{HKP|$u&6-(*Y~&)L?<*UiuB`S*_9o0&_&O zznJ6O!8^;#!mnEB#Sn$3M~B*cZdVN_D+C*OBt01&97|vAEHzddhKx`2-uxG*{0|@f zpEf%qq!WGu491+sWGwLBFd=G2^x}+AO^dapY}*L_rc`6+;r{;jY0A;B_SQxdM))f} z0${b@n0WHhrgwTggN2DH_!5hVt9#MPBX%NV_O^k44Ki-SrmtVW-uR>-w=Nn|eKdPF zT!D))@s3(jqwlxtQcUHWo-4g+t52Uk=u95(NmC|*9Ov5X%i}+($$}iz#ab~X zxXm$19&Oa|@bVT|V*WRFXSZ94Ovk&7JwYJ2-nM@YjF)ivWp;nqA|o@icI2nyJ)aZL zigMIIM(<+y=g&%p4K+2st@fLI>Q!F(FY8E#^IyKhAFq$$lqmxJv9{xC ztE;Qp+S+hvp(9@6d$*aHnOogF5y)pcCl?njBctm?N%&G*{0>VM740Xr^wi2q$@DEa zy!xOIv#>E)2ZtA%c3yX%`6O>;4X`3o>E`U*+-IHaG*0=jaGB(!u`#1)Yd9P*V6peH zyM?uN8ra1UG&*g28>t`PDYeHM6&cwTNXck${qV~jeI9mpzdXYVIW!tw?7I1CxZ0<> z)!zQOqGE7ejB4a_*xUQei+^WZv80o2vBKwl?=z$I*(Kcma?#Sps{EiGVBtli?(gDl z6_Ygvug9!c9fm<&AEi$e;CnJmG&GNaPq5`X?ouyub#cQ0?#U zs~z@`*}4RvP{h!TLnlr`$H3rXM03Ezgoy$d9U$#a zBP^tTY{0SMjBF22D_quxrCw9TOFJ#mi;IiryKTKyi5Kq^xq0i>bW7B2!pY$}5fmI8 z3?vF1ELmJaf;~zpS({JZT3Jm^PEL;GYh0ZDV$aPSgP%RK_Lp)!!VLr(8_+D9b8)s) zK!B9FZgT9d486OfkNx1`8L&0;(7TD@hUGs zyl`r%ZJKA#o{1SmT*CF&kPRT-7R3VnU^ZNAj`hyVbJ5h>9@%h@jmcD|*pjf*1% zXrwcC<<4SjaT%PcLeoiOeQlMN&}#1ML=F>I5!_ZlE(RtaY+ zhS1~NQt+DD)`#}9A^pl{>I9!^TOnYi-N}(tajDDCl~j!;jTif)URh1j z_Du$5F1VY1n!GOJFZgvLqri(zbZ5a~MnJ%+zsyT%c;m;169d&@a`1o_>guz$ zw6r8BXy>#YCJj@U+&n+m5pP)?{+{>tZB9sX^M0Or?+?{FPFbo>5c5oshL)CaW$?Y| z-Su(lDW-5tGpK?7YX$p=CYzBmKLUYZk6~kD`xtHHZvGqF)~52iv2hyY;PhD4ZJ*P_ zaazzfHT8-e&lVaSmYPmLH2qMGdp|RSfNI*~9u_#S4&SqdW%s3IW;WZz8etj(Dc6o4 zAG_{l>txe1GgFl4NzFOkvT$vOHFn2&3L%8ww$-qmY>+|_?UVFgv>OY6aZ$AdN%PVb zfc(0Jh+zHYkEYcFd4@1$WlA9-A-kQWX8<43=EuRzMq6F>+uR=mR{msa4OV$coZ&5+ zW{+}zw0l$3rg^<~>Hbg{>@&(ZEJuZWUn_E|{o4!#aTqXD!>)>)#@ zDvR5gO8?o`XihOProO&Dn-Z~X`;9UdX6AhJUT&+g%Avfu$>|8NJy{%ShdN;=zzHZP3EQ`8t zXVkf~`5fJYl5%p|ut3^O0>*b1r-niq@4l}!$&VL0JUHm;>hc{w*)4TG1|?k=kXPTn zv9gLI$r$e%!HtX(>bytA)JpWw01lX;jf(N(4gmxRr@?9;>Hb`O6mV+gc8~IziV_qQ zoG5I6hK7A)fAHW6;6AF?5B?;>POBUpY8j&r3pqlN9E?)==W zLZHr<^4K*21g2Y#yNyhQ~Cv|x`0aUP|xL?A<0 zMeS-t2sj+B%yB*pCjGoo5q_o_*-i=aIeH~6*pBX0`DC5!PoF=ZOYIKw^CLRi@ASd$ zsH>~XzjV8gv4%p;VI~T`9m$90wOGBW4Zl5SMW;MqXZCGHU8Z;ZDhSA3j_>f8oMQJl49Yx%r8O1)olyf!N$C zDlm|po4a8RQwh#Q&bD;%NMmzz)6CqQX;YgV(#Kjo0cr`Hy#zlTb0wywrBzT>bsEHE zPitrQ0c>z0+w{LcNkdEP_w_3?2uK71F|p8{>bhCaXg~Fvd}XwPQR|0_{m@*NoJ)g6 zM(LP4B?vY!hpfB1xc64v_}~f0mFCH44`pTL0{dyXsy-BY=;Zj2mX6LJ=!c5gNBgh% z;|%`2WH>9q9bMNQHgYc-msv;eC#uGYi19nR)+bi~@Kyb-V5~JkBh(;?{%_EKi`1?S fFPq=IdP*c{sKQg>D>ev@2q8sTHF%zkiT{593`;1~ literal 7032 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 z - - - - + + + + diff --git a/docs/html/classaunit_1_1MetaAssertion__inherit__graph.png b/docs/html/classaunit_1_1MetaAssertion__inherit__graph.png index b8cb9178d1561c843ad148a0759808237a18df57..d1b0c7bc5fa338e7d693c86b9611b53d7ceede56 100644 GIT binary patch literal 9839 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 literal 13217 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%0A7pyae0bz72gca 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 dK*u9u?jc@=(bb+f_{ - + AUnit: Member List @@ -22,7 +22,7 @@
AUnit -  0.4.1 +  0.5.0
Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
@@ -31,21 +31,18 @@ - + +
This is the complete list of members for aunit::Printer, including all inherited members.

- - + +
getPrinter()aunit::Printerinlinestatic
print(const FCString &s)aunit::Printerstatic
println(const FCString &s)aunit::Printerstatic
print(const internal::FCString &s)aunit::Printerstatic
println(const internal::FCString &s)aunit::Printerstatic
setPrinter(Print *printer)aunit::Printerinlinestatic
diff --git a/docs/html/classaunit_1_1Printer.html b/docs/html/classaunit_1_1Printer.html index f13d953..f11a6f3 100644 --- a/docs/html/classaunit_1_1Printer.html +++ b/docs/html/classaunit_1_1Printer.html @@ -3,7 +3,7 @@ - + AUnit: aunit::Printer Class Reference @@ -22,7 +22,7 @@
AUnit -  0.4.1 +  0.5.0
Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
@@ -31,21 +31,18 @@ - + +
static void setPrinter (Print *printer)  Set the printer. More...
  -static void print (const FCString &s) - Convenience method for printing an FCString. More...
-  -static void println (const FCString &s) - Convenience method for printing an FCString. More...
-  +static void print (const internal::FCString &s) + Convenience method for printing an FCString. More...
+  +static void println (const internal::FCString &s) + Convenience method for printing an FCString. More...

Detailed Description

Utility class that provides a level of indirection to the Print class where test results can be sent.

By default, the Print object will be the Serial object. This can be changed using the setPrinter() method.

This class assumes that it will be used after all static initializations have finished. Because static initialization ordering is undefined, if this utility is used during static initialization, the behaviour is undefined.

-

Definition at line 43 of file Printer.h.

+

Definition at line 45 of file Printer.h.

Member Function Documentation

◆ getPrinter()

@@ -128,12 +125,12 @@

TestRunner.

The default is the predefined Serial object. Can be changed using the setPrinter() method.

-

Definition at line 50 of file Printer.h.

+

Definition at line 52 of file Printer.h.

- -

◆ print()

+ +

◆ print()

@@ -144,7 +141,7 @@

void aunit::Printer::print ( - const FCString &  + const internal::FCStrings) @@ -156,14 +153,14 @@

-

Convenience method for printing an FCString.

+

Convenience method for printing an FCString.

Definition at line 33 of file Printer.cpp.

- -

◆ println()

+ +

◆ println()

@@ -174,7 +171,7 @@

void aunit::Printer::println ( - const FCString &  + const internal::FCStrings) @@ -186,7 +183,7 @@

-

Convenience method for printing an FCString.

+

Convenience method for printing an FCString.

Definition at line 41 of file Printer.cpp.

@@ -218,20 +215,20 @@

Definition at line 53 of file Printer.h.

+

Definition at line 55 of file Printer.h.


The documentation for this class was generated from the following files: diff --git a/docs/html/classaunit_1_1Test-members.html b/docs/html/classaunit_1_1Test-members.html index 2b37299..81d1849 100644 --- a/docs/html/classaunit_1_1Test-members.html +++ b/docs/html/classaunit_1_1Test-members.html @@ -3,7 +3,7 @@ - + AUnit: Member List @@ -22,7 +22,7 @@
AUnit -  0.4.1 +  0.5.0
Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
@@ -31,21 +31,18 @@ - + +
enableVerbosity(uint8_t verbosity)aunit::Testinline expire()aunit::Testinline fail()aunit::Testinlineprotected - getName()aunit::Testinline - getNext()aunit::Testinline - getRoot()aunit::Teststatic - getStatus()aunit::Testinline - getVerbosity()aunit::Testinlineprotected - init(const char *name) (defined in aunit::Test)aunit::Testinlineprotected - init(const __FlashStringHelper *name) (defined in aunit::Test)aunit::Testinlineprotected - isDone()aunit::Testinline - isExpired()aunit::Testinline - isFailed()aunit::Testinline - isNotDone()aunit::Testinline - isNotExpired()aunit::Testinline - isNotFailed()aunit::Testinline - isNotPassed()aunit::Testinline - isNotSkipped()aunit::Testinline - isPassed()aunit::Testinline - isSkipped()aunit::Testinline - isVerbosity(uint8_t verbosity)aunit::Testinlineprotected + getLifeCycle()aunit::Testinline + getName()aunit::Testinline + getNext()aunit::Testinline + getRoot()aunit::Teststatic + getStatus()aunit::Testinline + getVerbosity()aunit::Testinlineprotected + init(const char *name) (defined in aunit::Test)aunit::Testinlineprotected + init(const __FlashStringHelper *name) (defined in aunit::Test)aunit::Testinlineprotected + isDone()aunit::Testinline + isExpired()aunit::Testinline + isFailed()aunit::Testinline + isNotDone()aunit::Testinline + isNotExpired()aunit::Testinline + isNotFailed()aunit::Testinline + isNotPassed()aunit::Testinline + isNotSkipped()aunit::Testinline + isPassed()aunit::Testinline + isSkipped()aunit::Testinline + isVerbosity(uint8_t verbosity)aunit::Testinlineprotected + kLifeCycleAssertedaunit::Teststatic + kLifeCycleExcludedaunit::Teststatic + kLifeCycleFinishedaunit::Teststatic + kLifeCycleNewaunit::Teststatic + kLifeCycleSetupaunit::Teststatic kStatusExpiredaunit::Teststatic kStatusFailedaunit::Teststatic - kStatusNewaunit::Teststatic - kStatusPassedaunit::Teststatic - kStatusSetupaunit::Teststatic + kStatusPassedaunit::Teststatic kStatusSkippedaunit::Teststatic - loop()=0aunit::Testpure virtual - pass()aunit::Testinlineprotected - resolve()aunit::Test + kStatusUnknownaunit::Teststatic + loop()=0aunit::Testpure virtual + pass()aunit::Testinlineprotected + resolve()aunit::Test + setLifeCycle(uint8_t state) (defined in aunit::Test)aunit::Testinline setPassOrFail(bool ok)aunit::Test setStatus(uint8_t status)aunit::Testinline setup()aunit::Testinlinevirtual @@ -116,7 +119,7 @@ diff --git a/docs/html/classaunit_1_1Test.html b/docs/html/classaunit_1_1Test.html index b1ae16d..90925af 100644 --- a/docs/html/classaunit_1_1Test.html +++ b/docs/html/classaunit_1_1Test.html @@ -3,7 +3,7 @@ - + AUnit: aunit::Test Class Reference @@ -22,7 +22,7 @@
AUnit -  0.4.1 +  0.5.0
Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
@@ -31,21 +31,18 @@
- + +
Inheritance graph
- - - - + + + +
[legend]
@@ -111,9 +108,15 @@ - - - + + + + + + + + @@ -127,34 +130,34 @@ - + - + - + - + - + - + - + @@ -177,22 +180,34 @@
void resolve ()
 Print out the summary of the current test. More...
 
const FCStringgetName ()
 Get the name of the test. More...
 
const internal::FCStringgetName ()
 Get the name of the test. More...
 
uint8_t getLifeCycle ()
 Get the life cycle state of the test. More...
 
+void setLifeCycle (uint8_t state)
 
uint8_t getStatus ()
 Get the status of the test. More...
 
 Return the next pointer as a pointer to the pointer, similar to getRoot(). More...
 
bool isDone ()
 Return true if test is done (passed, failed, skipped, expired). More...
 Return true if test has been asserted. More...
 
bool isNotDone ()
 Return true if test is done (passed, failed, skipped, expired). More...
 Return true if test is not has been asserted. More...
 
bool isPassed ()
 Return true if test is passed. More...
 
bool isNotPassed ()
 Return true if test is passed. More...
 Return true if test is not passed. More...
 
bool isFailed ()
 Return true if test is failed. More...
 
bool isNotFailed ()
 Return true if test is failed. More...
 Return true if test is not failed. More...
 
bool isSkipped ()
 Return true if test isNot skipped. More...
 Return true if test is skipped. More...
 
bool isNotSkipped ()
 Return true if test isNot skipped. More...
 Return true if test is not skipped. More...
 
bool isExpired ()
 Return true if test is expired. More...
 
bool isNotExpired ()
 Return true if test is expired. More...
 Return true if test is not expired. More...
 
void skip ()
 Mark the test as skipped. More...
- - - - - - - + + + + + + + + + + + + + + + + + + + - - + + - - + + - +

Static Public Attributes

static const uint8_t kStatusNew = 0
 Test is new, needs to be setup. More...
 
static const uint8_t kStatusSetup = 1
 Test is set up. More...
 
static const uint8_t kStatusPassed = 2
static const uint8_t kLifeCycleNew = 0
 Test is new, needs to be setup. More...
 
static const uint8_t kLifeCycleExcluded = 1
 Test is Excluded by an exclude() method. More...
 
static const uint8_t kLifeCycleSetup = 2
 Test has been set up by calling setup() and ready to execute the test code. More...
 
static const uint8_t kLifeCycleAsserted = 3
 Test is asserted (using pass(), fail(), expired() or skipped()) and the getStatus() has been determined. More...
 
static const uint8_t kLifeCycleFinished = 4
 The test has completed its life cycle. More...
 
static const uint8_t kStatusUnknown = 0
 Test status is unknown. More...
 
static const uint8_t kStatusPassed = 1
 Test has passed, or pass() was called. More...
 
static const uint8_t kStatusFailed = 3
 Test has failed, or failed() was called. More...
static const uint8_t kStatusFailed = 2
 Test has failed, or fail() was called. More...
 
static const uint8_t kStatusSkipped = 4
 Test is skipped, through the exclude() method or skip() was called. More...
static const uint8_t kStatusSkipped = 3
 Test is skipped through the exclude() method or skip() was called. More...
 
static const uint8_t kStatusExpired = 5
static const uint8_t kStatusExpired = 4
 Test has timed out, or expire() called. More...
 
@@ -219,9 +234,9 @@

Detailed Description

Base class of all test cases.

-

The test() and testing() macros define subclasses of Test or TestOnce (respectively), and allow the code following the macros in '{}' to become the body of the loop() and once() methods of the two classes (respectively).

+

The test() and testing() macros define subclasses of Test or TestOnce (respectively), and allow the code following the macros in '{}' to become the body of the loop() and once() methods of the two classes (respectively).

-

Definition at line 49 of file Test.h.

+

Definition at line 43 of file Test.h.

Constructor & Destructor Documentation

◆ Test()

@@ -241,7 +256,7 @@

Definition at line 49 of file Test.cpp.

+

Definition at line 41 of file Test.cpp.

@@ -272,7 +287,7 @@

Definition at line 169 of file Test.h.

+

Definition at line 235 of file Test.h.

@@ -302,7 +317,7 @@

Definition at line 166 of file Test.h.

+

Definition at line 232 of file Test.h.

@@ -332,7 +347,7 @@

Definition at line 163 of file Test.h.

+

Definition at line 229 of file Test.h.

@@ -361,12 +376,41 @@

Definition at line 173 of file Test.h.

+

Definition at line 239 of file Test.h.

+ + + + +

◆ getLifeCycle()

+ +
+
+ + + + + +
+ + + + + + + +
uint8_t aunit::Test::getLifeCycle ()
+
+inline
+
+ +

Get the life cycle state of the test.

+ +

Definition at line 161 of file Test.h.

- -

◆ getName()

+ +

◆ getName()

@@ -375,7 +419,7 @@

- + @@ -390,7 +434,7 @@

Definition at line 111 of file Test.h.

+

Definition at line 158 of file Test.h.

@@ -420,7 +464,7 @@

getRoot().

This makes it much easier to manipulate a singly-linked list. Also makes setNext() method unnecessary.

-

Definition at line 127 of file Test.h.

+

Definition at line 188 of file Test.h.

@@ -450,7 +494,7 @@

Definition at line 44 of file Test.cpp.

+

Definition at line 36 of file Test.cpp.

@@ -479,7 +523,7 @@

Definition at line 114 of file Test.h.

+

Definition at line 166 of file Test.h.

@@ -508,7 +552,7 @@

Definition at line 196 of file Test.h.

+

Definition at line 264 of file Test.h.

@@ -535,9 +579,10 @@

-

Return true if test is done (passed, failed, skipped, expired).

+

Return true if test has been asserted.

+

Note that this is different than the internal LifeCycleFinished state. The name isDone() is a carry-over from ArduinoUnit and might have been named isAsserted() if this library had been built from scratch.

-

Definition at line 130 of file Test.h.

+

Definition at line 196 of file Test.h.

@@ -566,7 +611,7 @@

Definition at line 154 of file Test.h.

+

Definition at line 220 of file Test.h.

@@ -595,7 +640,7 @@

Definition at line 142 of file Test.h.

+

Definition at line 208 of file Test.h.

@@ -622,9 +667,9 @@

-

Return true if test is done (passed, failed, skipped, expired).

+

Return true if test is not has been asserted.

-

Definition at line 133 of file Test.h.

+

Definition at line 199 of file Test.h.

@@ -651,9 +696,9 @@

-

Return true if test is expired.

+

Return true if test is not expired.

-

Definition at line 157 of file Test.h.

+

Definition at line 223 of file Test.h.

@@ -680,9 +725,9 @@

-

Return true if test is failed.

+

Return true if test is not failed.

-

Definition at line 145 of file Test.h.

+

Definition at line 211 of file Test.h.

@@ -709,9 +754,9 @@

-

Return true if test is passed.

+

Return true if test is not passed.

-

Definition at line 139 of file Test.h.

+

Definition at line 205 of file Test.h.

@@ -738,9 +783,9 @@

-

Return true if test isNot skipped.

+

Return true if test is not skipped.

-

Definition at line 151 of file Test.h.

+

Definition at line 217 of file Test.h.

@@ -769,7 +814,7 @@

Definition at line 136 of file Test.h.

+

Definition at line 202 of file Test.h.

@@ -796,9 +841,9 @@

-

Return true if test isNot skipped.

+

Return true if test is skipped.

-

Definition at line 148 of file Test.h.

+

Definition at line 214 of file Test.h.

@@ -828,7 +873,7 @@

Definition at line 193 of file Test.h.

+

Definition at line 261 of file Test.h.

@@ -887,7 +932,7 @@

Definition at line 176 of file Test.h.

+

Definition at line 242 of file Test.h.

@@ -908,7 +953,7 @@

Definition at line 80 of file Test.cpp.

+

Definition at line 73 of file Test.cpp.

@@ -930,7 +975,7 @@

Definition at line 57 of file Test.cpp.

+

Definition at line 50 of file Test.cpp.

@@ -959,8 +1004,9 @@

Set the status of the test.

+

All changes to getStatus() should happen through this method because it also changes the getLifeCycle() of the test.

-

Definition at line 117 of file Test.h.

+

Definition at line 173 of file Test.h.

@@ -990,7 +1036,7 @@

pass(), fail() and skip() functions can be called in here. Subclasses that override this should call the parent's setup() method in the first line so that the setup() methods in the inheritance tree are properly chained.

-

Definition at line 89 of file Test.h.

+

Definition at line 136 of file Test.h.

@@ -1019,7 +1065,7 @@

Definition at line 160 of file Test.h.

+

Definition at line 226 of file Test.h.

@@ -1049,13 +1095,13 @@

teardown() method in the last line before returning, so that the teardown() methods in the inheritance tree are properly chained.

-

Definition at line 98 of file Test.h.

+

Definition at line 145 of file Test.h.

Member Data Documentation

- -

◆ kStatusExpired

+ +

◆ kLifeCycleAsserted

@@ -1064,7 +1110,7 @@

const FCString& aunit::Test::getName const internal::FCString& aunit::Test::getName ( )
- +
const uint8_t aunit::Test::kStatusExpired = 5const uint8_t aunit::Test::kLifeCycleAsserted = 3
@@ -1074,14 +1120,42 @@

-

Test has timed out, or expire() called.

+

Test is asserted (using pass(), fail(), expired() or skipped()) and the getStatus() has been determined.

+

The teardown() method should be called.

-

Definition at line 70 of file Test.h.

+

Definition at line 80 of file Test.h.

- -

◆ kStatusFailed

+ +

◆ kLifeCycleExcluded

+ +
+
+ + + + + +
+ + + + +
const uint8_t aunit::Test::kLifeCycleExcluded = 1
+
+static
+
+ +

Test is Excluded by an exclude() method.

+

The setup() and teardown() methods are bypassed and the test goes directly to kLifeCycleFinished. For reporting purposes, an excluded test is counted as a "skipped" test. The include() method puts the test back into the kLifeCycleNew state.

+ +

Definition at line 65 of file Test.h.

+ +
+
+ +

◆ kLifeCycleFinished

@@ -1090,7 +1164,7 @@

- +
const uint8_t aunit::Test::kStatusFailed = 3const uint8_t aunit::Test::kLifeCycleFinished = 4
@@ -1100,14 +1174,15 @@

-

Test has failed, or failed() was called.

+

The test has completed its life cycle.

+

It should be resolved using resolve() and removed from the linked list. Note that this is different than isDone() (i.e. kStatusDone) which indicates that an assertion about the test has been made.

-

Definition at line 64 of file Test.h.

+

Definition at line 88 of file Test.h.

- -

◆ kStatusNew

+ +

◆ kLifeCycleNew

@@ -1116,7 +1191,7 @@

- +
const uint8_t aunit::Test::kStatusNew = 0const uint8_t aunit::Test::kLifeCycleNew = 0
@@ -1128,7 +1203,86 @@

Test is new, needs to be setup.

-

Definition at line 55 of file Test.h.

+

Definition at line 57 of file Test.h.

+ +

+
+ +

◆ kLifeCycleSetup

+ +
+
+ + + + + +
+ + + + +
const uint8_t aunit::Test::kLifeCycleSetup = 2
+
+static
+
+ +

Test has been set up by calling setup() and ready to execute the test code.

+

TestOnce tests (i.e. test() or testF()) should be in Setup state only for a single iteration. TestAgain tests (i.e. testing() or testingF()) will stay in Setup state until explicitly moved to a different state by the testing code (or the test times out).

+ +

Definition at line 74 of file Test.h.

+ +
+
+ +

◆ kStatusExpired

+ +
+
+ + + + + +
+ + + + +
const uint8_t aunit::Test::kStatusExpired = 4
+
+static
+
+ +

Test has timed out, or expire() called.

+ +

Definition at line 108 of file Test.h.

+ +
+
+ +

◆ kStatusFailed

+ +
+
+ + + + + +
+ + + + +
const uint8_t aunit::Test::kStatusFailed = 2
+
+static
+
+ +

Test has failed, or fail() was called.

+ +

Definition at line 102 of file Test.h.

@@ -1142,7 +1296,7 @@

- +
const uint8_t aunit::Test::kStatusPassed = 2const uint8_t aunit::Test::kStatusPassed = 1
@@ -1154,12 +1308,12 @@

Test has passed, or pass() was called.

-

Definition at line 61 of file Test.h.

+

Definition at line 99 of file Test.h.

- -

◆ kStatusSetup

+ +

◆ kStatusSkipped

@@ -1168,7 +1322,7 @@

- +
const uint8_t aunit::Test::kStatusSetup = 1const uint8_t aunit::Test::kStatusSkipped = 3
@@ -1178,14 +1332,14 @@

-

Test is set up.

+

Test is skipped through the exclude() method or skip() was called.

-

Definition at line 58 of file Test.h.

+

Definition at line 105 of file Test.h.

- -

◆ kStatusSkipped

+ +

◆ kStatusUnknown

@@ -1194,7 +1348,7 @@

- +
const uint8_t aunit::Test::kStatusSkipped = 4const uint8_t aunit::Test::kStatusUnknown = 0
@@ -1204,22 +1358,22 @@

-

Test is skipped, through the exclude() method or skip() was called.

+

Test status is unknown.

-

Definition at line 67 of file Test.h.

+

Definition at line 96 of file Test.h.


The documentation for this class was generated from the following files:
    -
  • /Users/brian/dev/AUnit/src/aunit/Test.h
  • -
  • /Users/brian/dev/AUnit/src/aunit/Test.cpp
  • +
  • /home/brian/dev/AUnit/src/aunit/Test.h
  • +
  • /home/brian/dev/AUnit/src/aunit/Test.cpp
diff --git a/docs/html/classaunit_1_1TestAgain-members.html b/docs/html/classaunit_1_1TestAgain-members.html index 9634066..0bbfdb6 100644 --- a/docs/html/classaunit_1_1TestAgain-members.html +++ b/docs/html/classaunit_1_1TestAgain-members.html @@ -3,7 +3,7 @@ - + AUnit: Member List @@ -22,7 +22,7 @@
AUnit -  0.4.1 +  0.5.0
Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
@@ -31,21 +31,18 @@ - + +
assertion(const char *file, uint16_t line, const __FlashStringHelper *lhs, const char *opName, bool(*op)(const __FlashStringHelper *lhs, const char *rhs), const char *rhs) (defined in aunit::Assertion)aunit::Assertionprotected assertion(const char *file, uint16_t line, const __FlashStringHelper *lhs, const char *opName, bool(*op)(const __FlashStringHelper *lhs, const String &rhs), const String &rhs) (defined in aunit::Assertion)aunit::Assertionprotected assertion(const char *file, uint16_t line, const __FlashStringHelper *lhs, const char *opName, bool(*op)(const __FlashStringHelper *lhs, const __FlashStringHelper *rhs), const __FlashStringHelper *rhs) (defined in aunit::Assertion)aunit::Assertionprotected + assertionBool(const char *file, uint16_t line, bool arg, bool value) (defined in aunit::Assertion)aunit::Assertionprotected + assertionBoolVerbose(const char *file, uint16_t line, bool arg, internal::FlashStringType argString, bool value) (defined in aunit::Assertion)aunit::Assertionprotected assertionTestStatus(const char *file, uint16_t line, const char *testName, const __FlashStringHelper *statusMessage, bool ok)aunit::MetaAssertionprotected + assertionVerbose(const char *file, uint16_t line, bool lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(bool lhs, bool rhs), bool rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, char lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(char lhs, char rhs), char rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, int lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(int lhs, int rhs), int rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, unsigned int lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(unsigned int lhs, unsigned int rhs), unsigned int rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, long lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(long lhs, long rhs), long rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, unsigned long lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(unsigned long lhs, unsigned long rhs), unsigned long rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, double lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(double lhs, double rhs), double rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, const char *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const char *lhs, const char *rhs), const char *rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, const char *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const char *lhs, const String &rhs), const String &rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, const char *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const char *lhs, const __FlashStringHelper *rhs), const __FlashStringHelper *rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, const String &lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const String &lhs, const char *rhs), const char *rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, const String &lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const String &lhs, const String &rhs), const String &rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, const String &lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const String &lhs, const __FlashStringHelper *rhs), const __FlashStringHelper *rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, const __FlashStringHelper *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const __FlashStringHelper *lhs, const char *rhs), const char *rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, const __FlashStringHelper *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const __FlashStringHelper *lhs, const String &rhs), const String &rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, const __FlashStringHelper *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const __FlashStringHelper *lhs, const __FlashStringHelper *rhs), const __FlashStringHelper *rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected disableVerbosity(uint8_t verbosity)aunit::Testinline enableVerbosity(uint8_t verbosity)aunit::Testinline expire()aunit::Testinline fail()aunit::Testinlineprotected - getName()aunit::Testinline - getNext()aunit::Testinline - getRoot()aunit::Teststatic - getStatus()aunit::Testinline - getVerbosity()aunit::Testinlineprotected - init(const char *name) (defined in aunit::Test)aunit::Testinlineprotected - init(const __FlashStringHelper *name) (defined in aunit::Test)aunit::Testinlineprotected - isDone()aunit::Testinline - isExpired()aunit::Testinline - isFailed()aunit::Testinline - isNotDone()aunit::Testinline - isNotExpired()aunit::Testinline - isNotFailed()aunit::Testinline - isNotPassed()aunit::Testinline - isNotSkipped()aunit::Testinline - isOutputEnabled(bool ok)aunit::Assertionprotected - isPassed()aunit::Testinline - isSkipped()aunit::Testinline - isVerbosity(uint8_t verbosity)aunit::Testinlineprotected + getLifeCycle()aunit::Testinline + getName()aunit::Testinline + getNext()aunit::Testinline + getRoot()aunit::Teststatic + getStatus()aunit::Testinline + getVerbosity()aunit::Testinlineprotected + init(const char *name) (defined in aunit::Test)aunit::Testinlineprotected + init(const __FlashStringHelper *name) (defined in aunit::Test)aunit::Testinlineprotected + isDone()aunit::Testinline + isExpired()aunit::Testinline + isFailed()aunit::Testinline + isNotDone()aunit::Testinline + isNotExpired()aunit::Testinline + isNotFailed()aunit::Testinline + isNotPassed()aunit::Testinline + isNotSkipped()aunit::Testinline + isOutputEnabled(bool ok)aunit::Assertionprotected + isPassed()aunit::Testinline + isSkipped()aunit::Testinline + isVerbosity(uint8_t verbosity)aunit::Testinlineprotected + kLifeCycleAssertedaunit::Teststatic + kLifeCycleExcludedaunit::Teststatic + kLifeCycleFinishedaunit::Teststatic + kLifeCycleNewaunit::Teststatic + kLifeCycleSetupaunit::Teststatic kMessageDone (defined in aunit::MetaAssertion)aunit::MetaAssertionprotectedstatic kMessageExpired (defined in aunit::MetaAssertion)aunit::MetaAssertionprotectedstatic kMessageFailed (defined in aunit::MetaAssertion)aunit::MetaAssertionprotectedstatic @@ -128,15 +149,15 @@ kMessageSkipped (defined in aunit::MetaAssertion)aunit::MetaAssertionprotectedstatic kStatusExpiredaunit::Teststatic kStatusFailedaunit::Teststatic - kStatusNewaunit::Teststatic - kStatusPassedaunit::Teststatic - kStatusSetupaunit::Teststatic + kStatusPassedaunit::Teststatic kStatusSkippedaunit::Teststatic - loop() overrideaunit::TestAgainvirtual - MetaAssertion()aunit::MetaAssertioninlineprotected - pass()aunit::Testinlineprotected - printAssertionTestStatusMessage(bool ok, const char *file, uint16_t line, const char *testName, const __FlashStringHelper *statusMessage)aunit::MetaAssertionprotected - resolve()aunit::Test + kStatusUnknownaunit::Teststatic + loop() overrideaunit::TestAgainvirtual + MetaAssertion()aunit::MetaAssertioninlineprotected + pass()aunit::Testinlineprotected + printAssertionTestStatusMessage(bool ok, const char *file, uint16_t line, const char *testName, const __FlashStringHelper *statusMessage)aunit::MetaAssertionprotected + resolve()aunit::Test + setLifeCycle(uint8_t state) (defined in aunit::Test)aunit::Testinline setPassOrFail(bool ok)aunit::Test setStatus(uint8_t status)aunit::Testinline setup()aunit::Testinlinevirtual @@ -149,7 +170,7 @@ diff --git a/docs/html/classaunit_1_1TestAgain.html b/docs/html/classaunit_1_1TestAgain.html index 5d935d0..0fdfaa5 100644 --- a/docs/html/classaunit_1_1TestAgain.html +++ b/docs/html/classaunit_1_1TestAgain.html @@ -3,7 +3,7 @@ - + AUnit: aunit::TestAgain Class Reference @@ -22,7 +22,7 @@
AUnit -  0.4.1 +  0.5.0
Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
@@ -31,21 +31,18 @@
- + +
Inheritance graph
- - - + + +
[legend]
@@ -94,9 +91,9 @@
Collaboration graph
- - - + + +
[legend]
@@ -125,9 +122,15 @@ - - - + + + + + + + + @@ -141,34 +144,34 @@ - + - + - + - + - + - + - + @@ -190,22 +193,34 @@ - - - - - - - + + + + + + + + + + + + + + + + + + + - - + + - - + + - + @@ -226,6 +241,9 @@ + + @@ -274,6 +292,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -388,15 +457,15 @@

TestAgain.h -
  • /Users/brian/dev/AUnit/src/aunit/TestAgain.cpp
  • +
  • /home/brian/dev/AUnit/src/aunit/TestAgain.h
  • +
  • /home/brian/dev/AUnit/src/aunit/TestAgain.cpp
  • diff --git a/docs/html/classaunit_1_1TestAgain__coll__graph.map b/docs/html/classaunit_1_1TestAgain__coll__graph.map index e04f84e..b077eea 100644 --- a/docs/html/classaunit_1_1TestAgain__coll__graph.map +++ b/docs/html/classaunit_1_1TestAgain__coll__graph.map @@ -1,5 +1,5 @@ - - - + + + diff --git a/docs/html/classaunit_1_1TestAgain__coll__graph.png b/docs/html/classaunit_1_1TestAgain__coll__graph.png index d7d0d670ced2f43eeb93663623795585f7213f03..d3e066d7a534e5e83738a863f5cbad362fdd20f7 100644 GIT binary patch literal 6387 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 MsjQ_`q+lKKU)LLxT>t<8 literal 9652 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 - - - + + + diff --git a/docs/html/classaunit_1_1TestAgain__inherit__graph.png b/docs/html/classaunit_1_1TestAgain__inherit__graph.png index d7d0d670ced2f43eeb93663623795585f7213f03..d3e066d7a534e5e83738a863f5cbad362fdd20f7 100644 GIT binary patch literal 6387 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 MsjQ_`q+lKKU)LLxT>t<8 literal 9652 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 - + AUnit: Member List @@ -22,7 +22,7 @@

    @@ -31,21 +31,18 @@
    void resolve ()
     Print out the summary of the current test. More...
     
    const FCStringgetName ()
     Get the name of the test. More...
     
    const internal::FCStringgetName ()
     Get the name of the test. More...
     
    uint8_t getLifeCycle ()
     Get the life cycle state of the test. More...
     
    +void setLifeCycle (uint8_t state)
     
    uint8_t getStatus ()
     Get the status of the test. More...
     
     Return the next pointer as a pointer to the pointer, similar to getRoot(). More...
     
    bool isDone ()
     Return true if test is done (passed, failed, skipped, expired). More...
     Return true if test has been asserted. More...
     
    bool isNotDone ()
     Return true if test is done (passed, failed, skipped, expired). More...
     Return true if test is not has been asserted. More...
     
    bool isPassed ()
     Return true if test is passed. More...
     
    bool isNotPassed ()
     Return true if test is passed. More...
     Return true if test is not passed. More...
     
    bool isFailed ()
     Return true if test is failed. More...
     
    bool isNotFailed ()
     Return true if test is failed. More...
     Return true if test is not failed. More...
     
    bool isSkipped ()
     Return true if test isNot skipped. More...
     Return true if test is skipped. More...
     
    bool isNotSkipped ()
     Return true if test isNot skipped. More...
     Return true if test is not skipped. More...
     
    bool isExpired ()
     Return true if test is expired. More...
     
    bool isNotExpired ()
     Return true if test is expired. More...
     Return true if test is not expired. More...
     
    void skip ()
     Mark the test as skipped. More...
     Get the pointer to the root pointer. More...
     
    - Static Public Attributes inherited from aunit::Test
    static const uint8_t kStatusNew = 0
     Test is new, needs to be setup. More...
     
    static const uint8_t kStatusSetup = 1
     Test is set up. More...
     
    static const uint8_t kStatusPassed = 2
    static const uint8_t kLifeCycleNew = 0
     Test is new, needs to be setup. More...
     
    static const uint8_t kLifeCycleExcluded = 1
     Test is Excluded by an exclude() method. More...
     
    static const uint8_t kLifeCycleSetup = 2
     Test has been set up by calling setup() and ready to execute the test code. More...
     
    static const uint8_t kLifeCycleAsserted = 3
     Test is asserted (using pass(), fail(), expired() or skipped()) and the getStatus() has been determined. More...
     
    static const uint8_t kLifeCycleFinished = 4
     The test has completed its life cycle. More...
     
    static const uint8_t kStatusUnknown = 0
     Test status is unknown. More...
     
    static const uint8_t kStatusPassed = 1
     Test has passed, or pass() was called. More...
     
    static const uint8_t kStatusFailed = 3
     Test has failed, or failed() was called. More...
    static const uint8_t kStatusFailed = 2
     Test has failed, or fail() was called. More...
     
    static const uint8_t kStatusSkipped = 4
     Test is skipped, through the exclude() method or skip() was called. More...
    static const uint8_t kStatusSkipped = 3
     Test is skipped through the exclude() method or skip() was called. More...
     
    static const uint8_t kStatusExpired = 5
    static const uint8_t kStatusExpired = 4
     Test has timed out, or expire() called. More...
     
    - Protected Member Functions inherited from aunit::MetaAssertion
    bool isOutputEnabled (bool ok)
     Returns true if an assertion message should be printed. More...
     
    +bool assertionBool (const char *file, uint16_t line, bool arg, bool value)
     
    bool assertion (const char *file, uint16_t line, bool lhs, const char *opName, bool(*op)(bool lhs, bool rhs), bool rhs)
     
    bool assertion (const char *file, uint16_t line, const __FlashStringHelper *lhs, const char *opName, bool(*op)(const __FlashStringHelper *lhs, const __FlashStringHelper *rhs), const __FlashStringHelper *rhs)
     
    +bool assertionBoolVerbose (const char *file, uint16_t line, bool arg, internal::FlashStringType argString, bool value)
     
    +bool assertionVerbose (const char *file, uint16_t line, bool lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(bool lhs, bool rhs), bool rhs, internal::FlashStringType rhsString)
     
    +bool assertionVerbose (const char *file, uint16_t line, char lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(char lhs, char rhs), char rhs, internal::FlashStringType rhsString)
     
    +bool assertionVerbose (const char *file, uint16_t line, int lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(int lhs, int rhs), int rhs, internal::FlashStringType rhsString)
     
    +bool assertionVerbose (const char *file, uint16_t line, unsigned int lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(unsigned int lhs, unsigned int rhs), unsigned int rhs, internal::FlashStringType rhsString)
     
    +bool assertionVerbose (const char *file, uint16_t line, long lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(long lhs, long rhs), long rhs, internal::FlashStringType rhsString)
     
    +bool assertionVerbose (const char *file, uint16_t line, unsigned long lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(unsigned long lhs, unsigned long rhs), unsigned long rhs, internal::FlashStringType rhsString)
     
    +bool assertionVerbose (const char *file, uint16_t line, double lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(double lhs, double rhs), double rhs, internal::FlashStringType rhsString)
     
    +bool assertionVerbose (const char *file, uint16_t line, const char *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const char *lhs, const char *rhs), const char *rhs, internal::FlashStringType rhsString)
     
    +bool assertionVerbose (const char *file, uint16_t line, const char *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const char *lhs, const String &rhs), const String &rhs, internal::FlashStringType rhsString)
     
    +bool assertionVerbose (const char *file, uint16_t line, const char *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const char *lhs, const __FlashStringHelper *rhs), const __FlashStringHelper *rhs, internal::FlashStringType rhsString)
     
    +bool assertionVerbose (const char *file, uint16_t line, const String &lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const String &lhs, const char *rhs), const char *rhs, internal::FlashStringType rhsString)
     
    +bool assertionVerbose (const char *file, uint16_t line, const String &lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const String &lhs, const String &rhs), const String &rhs, internal::FlashStringType rhsString)
     
    +bool assertionVerbose (const char *file, uint16_t line, const String &lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const String &lhs, const __FlashStringHelper *rhs), const __FlashStringHelper *rhs, internal::FlashStringType rhsString)
     
    +bool assertionVerbose (const char *file, uint16_t line, const __FlashStringHelper *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const __FlashStringHelper *lhs, const char *rhs), const char *rhs, internal::FlashStringType rhsString)
     
    +bool assertionVerbose (const char *file, uint16_t line, const __FlashStringHelper *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const __FlashStringHelper *lhs, const String &rhs), const String &rhs, internal::FlashStringType rhsString)
     
    +bool assertionVerbose (const char *file, uint16_t line, const __FlashStringHelper *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const __FlashStringHelper *lhs, const __FlashStringHelper *rhs), const __FlashStringHelper *rhs, internal::FlashStringType rhsString)
     
    - Protected Member Functions inherited from aunit::Test
    void fail ()
     Mark the test as failed. More...
    AUnit -  0.4.1 +  0.5.0
    Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
    - + +
    assertion(const char *file, uint16_t line, const __FlashStringHelper *lhs, const char *opName, bool(*op)(const __FlashStringHelper *lhs, const char *rhs), const char *rhs) (defined in aunit::Assertion)aunit::Assertionprotected assertion(const char *file, uint16_t line, const __FlashStringHelper *lhs, const char *opName, bool(*op)(const __FlashStringHelper *lhs, const String &rhs), const String &rhs) (defined in aunit::Assertion)aunit::Assertionprotected assertion(const char *file, uint16_t line, const __FlashStringHelper *lhs, const char *opName, bool(*op)(const __FlashStringHelper *lhs, const __FlashStringHelper *rhs), const __FlashStringHelper *rhs) (defined in aunit::Assertion)aunit::Assertionprotected + assertionBool(const char *file, uint16_t line, bool arg, bool value) (defined in aunit::Assertion)aunit::Assertionprotected + assertionBoolVerbose(const char *file, uint16_t line, bool arg, internal::FlashStringType argString, bool value) (defined in aunit::Assertion)aunit::Assertionprotected assertionTestStatus(const char *file, uint16_t line, const char *testName, const __FlashStringHelper *statusMessage, bool ok)aunit::MetaAssertionprotected + assertionVerbose(const char *file, uint16_t line, bool lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(bool lhs, bool rhs), bool rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, char lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(char lhs, char rhs), char rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, int lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(int lhs, int rhs), int rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, unsigned int lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(unsigned int lhs, unsigned int rhs), unsigned int rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, long lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(long lhs, long rhs), long rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, unsigned long lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(unsigned long lhs, unsigned long rhs), unsigned long rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, double lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(double lhs, double rhs), double rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, const char *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const char *lhs, const char *rhs), const char *rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, const char *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const char *lhs, const String &rhs), const String &rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, const char *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const char *lhs, const __FlashStringHelper *rhs), const __FlashStringHelper *rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, const String &lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const String &lhs, const char *rhs), const char *rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, const String &lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const String &lhs, const String &rhs), const String &rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, const String &lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const String &lhs, const __FlashStringHelper *rhs), const __FlashStringHelper *rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, const __FlashStringHelper *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const __FlashStringHelper *lhs, const char *rhs), const char *rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, const __FlashStringHelper *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const __FlashStringHelper *lhs, const String &rhs), const String &rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected + assertionVerbose(const char *file, uint16_t line, const __FlashStringHelper *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const __FlashStringHelper *lhs, const __FlashStringHelper *rhs), const __FlashStringHelper *rhs, internal::FlashStringType rhsString) (defined in aunit::Assertion)aunit::Assertionprotected disableVerbosity(uint8_t verbosity)aunit::Testinline enableVerbosity(uint8_t verbosity)aunit::Testinline expire()aunit::Testinline fail()aunit::Testinlineprotected - getName()aunit::Testinline - getNext()aunit::Testinline - getRoot()aunit::Teststatic - getStatus()aunit::Testinline - getVerbosity()aunit::Testinlineprotected - init(const char *name) (defined in aunit::Test)aunit::Testinlineprotected - init(const __FlashStringHelper *name) (defined in aunit::Test)aunit::Testinlineprotected - isDone()aunit::Testinline - isExpired()aunit::Testinline - isFailed()aunit::Testinline - isNotDone()aunit::Testinline - isNotExpired()aunit::Testinline - isNotFailed()aunit::Testinline - isNotPassed()aunit::Testinline - isNotSkipped()aunit::Testinline - isOutputEnabled(bool ok)aunit::Assertionprotected - isPassed()aunit::Testinline - isSkipped()aunit::Testinline - isVerbosity(uint8_t verbosity)aunit::Testinlineprotected + getLifeCycle()aunit::Testinline + getName()aunit::Testinline + getNext()aunit::Testinline + getRoot()aunit::Teststatic + getStatus()aunit::Testinline + getVerbosity()aunit::Testinlineprotected + init(const char *name) (defined in aunit::Test)aunit::Testinlineprotected + init(const __FlashStringHelper *name) (defined in aunit::Test)aunit::Testinlineprotected + isDone()aunit::Testinline + isExpired()aunit::Testinline + isFailed()aunit::Testinline + isNotDone()aunit::Testinline + isNotExpired()aunit::Testinline + isNotFailed()aunit::Testinline + isNotPassed()aunit::Testinline + isNotSkipped()aunit::Testinline + isOutputEnabled(bool ok)aunit::Assertionprotected + isPassed()aunit::Testinline + isSkipped()aunit::Testinline + isVerbosity(uint8_t verbosity)aunit::Testinlineprotected + kLifeCycleAssertedaunit::Teststatic + kLifeCycleExcludedaunit::Teststatic + kLifeCycleFinishedaunit::Teststatic + kLifeCycleNewaunit::Teststatic + kLifeCycleSetupaunit::Teststatic kMessageDone (defined in aunit::MetaAssertion)aunit::MetaAssertionprotectedstatic kMessageExpired (defined in aunit::MetaAssertion)aunit::MetaAssertionprotectedstatic kMessageFailed (defined in aunit::MetaAssertion)aunit::MetaAssertionprotectedstatic @@ -127,16 +148,16 @@ kMessageSkipped (defined in aunit::MetaAssertion)aunit::MetaAssertionprotectedstatic kStatusExpiredaunit::Teststatic kStatusFailedaunit::Teststatic - kStatusNewaunit::Teststatic - kStatusPassedaunit::Teststatic - kStatusSetupaunit::Teststatic + kStatusPassedaunit::Teststatic kStatusSkippedaunit::Teststatic - loop() overrideaunit::TestOncevirtual - MetaAssertion()aunit::MetaAssertioninlineprotected - once()=0aunit::TestOncepure virtual - pass()aunit::Testinlineprotected - printAssertionTestStatusMessage(bool ok, const char *file, uint16_t line, const char *testName, const __FlashStringHelper *statusMessage)aunit::MetaAssertionprotected - resolve()aunit::Test + kStatusUnknownaunit::Teststatic + loop() overrideaunit::TestOncevirtual + MetaAssertion()aunit::MetaAssertioninlineprotected + once()=0aunit::TestOncepure virtual + pass()aunit::Testinlineprotected + printAssertionTestStatusMessage(bool ok, const char *file, uint16_t line, const char *testName, const __FlashStringHelper *statusMessage)aunit::MetaAssertionprotected + resolve()aunit::Test + setLifeCycle(uint8_t state) (defined in aunit::Test)aunit::Testinline setPassOrFail(bool ok)aunit::Test setStatus(uint8_t status)aunit::Testinline setup()aunit::Testinlinevirtual @@ -149,7 +170,7 @@ diff --git a/docs/html/classaunit_1_1TestOnce.html b/docs/html/classaunit_1_1TestOnce.html index a331364..1f79cbf 100644 --- a/docs/html/classaunit_1_1TestOnce.html +++ b/docs/html/classaunit_1_1TestOnce.html @@ -3,7 +3,7 @@ - + AUnit: aunit::TestOnce Class Reference @@ -22,7 +22,7 @@
    AUnit -  0.4.1 +  0.5.0
    Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
    @@ -31,21 +31,18 @@
    - + +
    Inheritance graph
    - - - + + +
    [legend]
    @@ -94,9 +91,9 @@
    Collaboration graph
    - - - + + +
    [legend]
    @@ -124,9 +121,15 @@ - - - + + + + + + + + @@ -140,34 +143,34 @@ - + - + - + - + - + - + - + @@ -189,22 +192,34 @@ - - - - - - - + + + + + + + + + + + + + + + + + + + - - + + - - + + - + @@ -225,6 +240,9 @@ + + @@ -273,6 +291,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -419,15 +488,15 @@

    TestOnce.h -
  • /Users/brian/dev/AUnit/src/aunit/TestOnce.cpp
  • +
  • /home/brian/dev/AUnit/src/aunit/TestOnce.h
  • +
  • /home/brian/dev/AUnit/src/aunit/TestOnce.cpp
  • diff --git a/docs/html/classaunit_1_1TestOnce__coll__graph.map b/docs/html/classaunit_1_1TestOnce__coll__graph.map index 54e500e..ae66927 100644 --- a/docs/html/classaunit_1_1TestOnce__coll__graph.map +++ b/docs/html/classaunit_1_1TestOnce__coll__graph.map @@ -1,5 +1,5 @@ - - - + + + diff --git a/docs/html/classaunit_1_1TestOnce__coll__graph.png b/docs/html/classaunit_1_1TestOnce__coll__graph.png index 784e38e0b789c0e00dd91ceb065e13030482b39c..c387d6a2ac9f3872a901899c9e3149af2bb3a32d 100644 GIT binary patch literal 6373 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 literal 9754 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 J%Oy<${tN3!qGJF6 diff --git a/docs/html/classaunit_1_1TestOnce__inherit__graph.map b/docs/html/classaunit_1_1TestOnce__inherit__graph.map index 54e500e..ae66927 100644 --- a/docs/html/classaunit_1_1TestOnce__inherit__graph.map +++ b/docs/html/classaunit_1_1TestOnce__inherit__graph.map @@ -1,5 +1,5 @@ - - - + + + diff --git a/docs/html/classaunit_1_1TestOnce__inherit__graph.png b/docs/html/classaunit_1_1TestOnce__inherit__graph.png index 784e38e0b789c0e00dd91ceb065e13030482b39c..c387d6a2ac9f3872a901899c9e3149af2bb3a32d 100644 GIT binary patch literal 6373 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 literal 9754 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 J%Oy<${tN3!qGJF6 diff --git a/docs/html/classaunit_1_1TestRunner-members.html b/docs/html/classaunit_1_1TestRunner-members.html index a0289c9..d30871a 100644 --- a/docs/html/classaunit_1_1TestRunner-members.html +++ b/docs/html/classaunit_1_1TestRunner-members.html @@ -3,7 +3,7 @@ - + AUnit: Member List @@ -22,7 +22,7 @@

    @@ -31,21 +31,18 @@
    void resolve ()
     Print out the summary of the current test. More...
     
    const FCStringgetName ()
     Get the name of the test. More...
     
    const internal::FCStringgetName ()
     Get the name of the test. More...
     
    uint8_t getLifeCycle ()
     Get the life cycle state of the test. More...
     
    +void setLifeCycle (uint8_t state)
     
    uint8_t getStatus ()
     Get the status of the test. More...
     
     Return the next pointer as a pointer to the pointer, similar to getRoot(). More...
     
    bool isDone ()
     Return true if test is done (passed, failed, skipped, expired). More...
     Return true if test has been asserted. More...
     
    bool isNotDone ()
     Return true if test is done (passed, failed, skipped, expired). More...
     Return true if test is not has been asserted. More...
     
    bool isPassed ()
     Return true if test is passed. More...
     
    bool isNotPassed ()
     Return true if test is passed. More...
     Return true if test is not passed. More...
     
    bool isFailed ()
     Return true if test is failed. More...
     
    bool isNotFailed ()
     Return true if test is failed. More...
     Return true if test is not failed. More...
     
    bool isSkipped ()
     Return true if test isNot skipped. More...
     Return true if test is skipped. More...
     
    bool isNotSkipped ()
     Return true if test isNot skipped. More...
     Return true if test is not skipped. More...
     
    bool isExpired ()
     Return true if test is expired. More...
     
    bool isNotExpired ()
     Return true if test is expired. More...
     Return true if test is not expired. More...
     
    void skip ()
     Mark the test as skipped. More...
     Get the pointer to the root pointer. More...
     
    - Static Public Attributes inherited from aunit::Test
    static const uint8_t kStatusNew = 0
     Test is new, needs to be setup. More...
     
    static const uint8_t kStatusSetup = 1
     Test is set up. More...
     
    static const uint8_t kStatusPassed = 2
    static const uint8_t kLifeCycleNew = 0
     Test is new, needs to be setup. More...
     
    static const uint8_t kLifeCycleExcluded = 1
     Test is Excluded by an exclude() method. More...
     
    static const uint8_t kLifeCycleSetup = 2
     Test has been set up by calling setup() and ready to execute the test code. More...
     
    static const uint8_t kLifeCycleAsserted = 3
     Test is asserted (using pass(), fail(), expired() or skipped()) and the getStatus() has been determined. More...
     
    static const uint8_t kLifeCycleFinished = 4
     The test has completed its life cycle. More...
     
    static const uint8_t kStatusUnknown = 0
     Test status is unknown. More...
     
    static const uint8_t kStatusPassed = 1
     Test has passed, or pass() was called. More...
     
    static const uint8_t kStatusFailed = 3
     Test has failed, or failed() was called. More...
    static const uint8_t kStatusFailed = 2
     Test has failed, or fail() was called. More...
     
    static const uint8_t kStatusSkipped = 4
     Test is skipped, through the exclude() method or skip() was called. More...
    static const uint8_t kStatusSkipped = 3
     Test is skipped through the exclude() method or skip() was called. More...
     
    static const uint8_t kStatusExpired = 5
    static const uint8_t kStatusExpired = 4
     Test has timed out, or expire() called. More...
     
    - Protected Member Functions inherited from aunit::MetaAssertion
    bool isOutputEnabled (bool ok)
     Returns true if an assertion message should be printed. More...
     
    +bool assertionBool (const char *file, uint16_t line, bool arg, bool value)
     
    bool assertion (const char *file, uint16_t line, bool lhs, const char *opName, bool(*op)(bool lhs, bool rhs), bool rhs)
     
    bool assertion (const char *file, uint16_t line, const __FlashStringHelper *lhs, const char *opName, bool(*op)(const __FlashStringHelper *lhs, const __FlashStringHelper *rhs), const __FlashStringHelper *rhs)
     
    +bool assertionBoolVerbose (const char *file, uint16_t line, bool arg, internal::FlashStringType argString, bool value)
     
    +bool assertionVerbose (const char *file, uint16_t line, bool lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(bool lhs, bool rhs), bool rhs, internal::FlashStringType rhsString)
     
    +bool assertionVerbose (const char *file, uint16_t line, char lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(char lhs, char rhs), char rhs, internal::FlashStringType rhsString)
     
    +bool assertionVerbose (const char *file, uint16_t line, int lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(int lhs, int rhs), int rhs, internal::FlashStringType rhsString)
     
    +bool assertionVerbose (const char *file, uint16_t line, unsigned int lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(unsigned int lhs, unsigned int rhs), unsigned int rhs, internal::FlashStringType rhsString)
     
    +bool assertionVerbose (const char *file, uint16_t line, long lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(long lhs, long rhs), long rhs, internal::FlashStringType rhsString)
     
    +bool assertionVerbose (const char *file, uint16_t line, unsigned long lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(unsigned long lhs, unsigned long rhs), unsigned long rhs, internal::FlashStringType rhsString)
     
    +bool assertionVerbose (const char *file, uint16_t line, double lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(double lhs, double rhs), double rhs, internal::FlashStringType rhsString)
     
    +bool assertionVerbose (const char *file, uint16_t line, const char *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const char *lhs, const char *rhs), const char *rhs, internal::FlashStringType rhsString)
     
    +bool assertionVerbose (const char *file, uint16_t line, const char *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const char *lhs, const String &rhs), const String &rhs, internal::FlashStringType rhsString)
     
    +bool assertionVerbose (const char *file, uint16_t line, const char *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const char *lhs, const __FlashStringHelper *rhs), const __FlashStringHelper *rhs, internal::FlashStringType rhsString)
     
    +bool assertionVerbose (const char *file, uint16_t line, const String &lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const String &lhs, const char *rhs), const char *rhs, internal::FlashStringType rhsString)
     
    +bool assertionVerbose (const char *file, uint16_t line, const String &lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const String &lhs, const String &rhs), const String &rhs, internal::FlashStringType rhsString)
     
    +bool assertionVerbose (const char *file, uint16_t line, const String &lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const String &lhs, const __FlashStringHelper *rhs), const __FlashStringHelper *rhs, internal::FlashStringType rhsString)
     
    +bool assertionVerbose (const char *file, uint16_t line, const __FlashStringHelper *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const __FlashStringHelper *lhs, const char *rhs), const char *rhs, internal::FlashStringType rhsString)
     
    +bool assertionVerbose (const char *file, uint16_t line, const __FlashStringHelper *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const __FlashStringHelper *lhs, const String &rhs), const String &rhs, internal::FlashStringType rhsString)
     
    +bool assertionVerbose (const char *file, uint16_t line, const __FlashStringHelper *lhs, internal::FlashStringType lhsString, const char *opName, bool(*op)(const __FlashStringHelper *lhs, const __FlashStringHelper *rhs), const __FlashStringHelper *rhs, internal::FlashStringType rhsString)
     
    - Protected Member Functions inherited from aunit::Test
    void fail ()
     Mark the test as failed. More...
    AUnit -  0.4.1 +  0.5.0
    Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
    - + + - + +
    -

    The class that runs the various test cases defined by the test() and testing() macros. +

    The class that runs the various test cases defined by the test() and testing() macros. More...

    #include <TestRunner.h>

    @@ -99,13 +96,13 @@  Exclude the tests which match the pattern. More...
      static void exclude (const char *testClass, const char *pattern) - Exclude the tests which match the pattern given by (testClass + "_" + pattern), the same concatenation rule used by the testF() macro. More...
    + Exclude the tests which match the pattern given by (testClass + "_" + pattern), the same concatenation rule used by the testF() macro. More...
      static void include (const char *pattern)  Include the tests which match the pattern. More...
      static void include (const char *testClass, const char *pattern) - Include the tests which match the pattern given by (testClass + "_" + pattern), the same concatenation rule used by the testF() macro. More...
    + Include the tests which match the pattern given by (testClass + "_" + pattern), the same concatenation rule used by the testF() macro. More...
      static void setVerbosity (uint8_t verbosity)  Set the verbosity flag. More...
    @@ -121,7 +118,7 @@  

    Detailed Description

    -

    The class that runs the various test cases defined by the test() and testing() macros.

    +

    The class that runs the various test cases defined by the test() and testing() macros.

    It prints the summary of each test as well as the final summary of the entire run at the end. In the future, it may be possible to allow a different TestRunner to be used.

    Definition at line 41 of file TestRunner.h.

    @@ -211,10 +208,10 @@

    -

    Exclude the tests which match the pattern given by (testClass + "_" + pattern), the same concatenation rule used by the testF() macro.

    +

    Exclude the tests which match the pattern given by (testClass + "_" + pattern), the same concatenation rule used by the testF() macro.

    Currently supports only a trailing '*'. For example, exclude("CustomTest", "flash*").

    -

    Definition at line 66 of file TestRunner.h.

    +

    Definition at line 67 of file TestRunner.h.

    @@ -245,7 +242,7 @@

    -

    Definition at line 75 of file TestRunner.h.

    +

    Definition at line 76 of file TestRunner.h.

    @@ -283,10 +280,10 @@

    -

    Include the tests which match the pattern given by (testClass + "_" + pattern), the same concatenation rule used by the testF() macro.

    +

    Include the tests which match the pattern given by (testClass + "_" + pattern), the same concatenation rule used by the testF() macro.

    Currently supports only a trailing '*'. For example, include("CustomTest", "flash*").

    -

    Definition at line 85 of file TestRunner.h.

    +

    Definition at line 86 of file TestRunner.h.

    @@ -316,7 +313,7 @@

    Definition at line 96 of file TestRunner.h.

    +

    Definition at line 97 of file TestRunner.h.

    @@ -434,9 +431,9 @@

    Set test runner timeout across all tests, in seconds.

    -

    Set to 0 for infinite timeout. Useful for preventing testing() test cases that never end. This is a timeout for the TestRunner itself, not for individual tests.

    +

    Set to 0 for infinite timeout. Useful for preventing testing() test cases that never end. This is a timeout for the TestRunner itself, not for individual tests.

    -

    Definition at line 109 of file TestRunner.h.

    +

    Definition at line 110 of file TestRunner.h.

    @@ -466,20 +463,20 @@

    Definition at line 91 of file TestRunner.h.

    +

    Definition at line 92 of file TestRunner.h.


    The documentation for this class was generated from the following files: diff --git a/docs/html/classaunit_1_1Test__inherit__graph.map b/docs/html/classaunit_1_1Test__inherit__graph.map index e534a49..5b0de87 100644 --- a/docs/html/classaunit_1_1Test__inherit__graph.map +++ b/docs/html/classaunit_1_1Test__inherit__graph.map @@ -1,6 +1,6 @@ - - - - + + + + diff --git a/docs/html/classaunit_1_1Test__inherit__graph.png b/docs/html/classaunit_1_1Test__inherit__graph.png index dd9758418d4f32d5912548f62b3347029ba5320b..3028fe35d16954048d190bf56a52bced8d79f3bf 100644 GIT binary patch literal 9822 zcmd6NbyU^gw(q8q4y7AOk(QR0k`fV+?vjR0mvjnBcS+Yqx?>|DC?XBgAl=<>aqhYI zo^#&syz%Z|@9A(jhAh{b-?iqN^AjsvRaq7rgA4-#fndwaNvlC12$#HO=DUrw{_-!nn z-N5;PZh&ThZRiHhZAQA_k7Z$)dA9Y8ZF+z6}vFwGTBNw0j99FA72bAR|q`6u6bbE>(N~$5XU?AlwYi-Rc zDJi+%g~=hOr_jECb2h&`UHfh!#=cU1`Dvtno$U-?@ym5$<#d7fl)|oZdLeHXO^Bkn zUJ0;~nB+QWarQ_r{%uh-f%3lDW;c8yqLB3Tbas`rxVXUjdEe&Q#qjWO5@FZv<@jDU ziqPOkRrU3*=h!>oozF^;k!+_yk!qLPuw3j?Ob^Ee<0k z4(5}kg$4g417A{zxO7oT3BmL7^75xPwzdcmC=?3u&yflhbyd}|xl*gQ;_ucGslOC*eAt**=%OQsENvQ!X3rq2L_jluE2#}WZ zrO2Hhg-|z(W6$RVgoOAM6jAfnfB4<^TFI3jr#3+$A#}pR&9g$u zW=k-bDlWBX_l$je^aDah8U_ZG`^lG50UCWgbiB&VjQmpa}fx!;^jEN*XOX=-Xh@F^toWmni zQ&UEBEgn0rZhxwWMB(K2EeOQK#O@v*i({GwUxP7;4LM0@;`+e{8d_L{Haf2@ji`t{ z+Z~6sy$5^A+^CCFs~vqd=Y0GM_D3jrP+I zl)~f2=>_eRtE;QF1xfv$etE-SdcW&s>cu~QP$5O-AwR*q~AV7L!sC(g|xYY0b+BcG- z3q1I7KabC59Gso?w)tE+?9DxokB>JTDNyQ}&dtq@&B%z3h`>;P^G1R(PJ;bzV!q@L zlyjil$S5ZSi!>lf-}8Ze`wgE)h3*4>e*VF9K|(GrE(aHv?ubWE@TjR{!otu8v&7m5 zj@+Qoub<`Pw68HGa|!FqH5eYg;KChFQ+YyyqH|IF0X8#_hOa#*EwZ24%YQb8TRnitGBHU{nMZ$!xW@iVtw z5!KXGH@1k?+zOPa+tYdx608uun-kA2P(UKlaIG1NBHohWV1^tYSJI;I;EH+jR-Q!| z5ky+oo|*(uAdaB?C_DGZ)~i2HL{wA3$T^_{z#uRO)+WnA^1<$G>Gs!> zWCn2eok&TEvnT4G>km^5=kW-oK$lCE%hM%kLrY8Zs&p#(vvVZSgqstGXjfmilZx>N z)jF*7nMq4~M>V^hDd=HTvt9qj>q!>)+o}C)N&UCS`~PO3Q!(cHI}s5PhpSWD;sH)_ z@-$jiW?fqJJC#kfL2Gyj_GGn1%&6Hh3k8v$3m9WF2}AJp^;JviYO)&2e10Re|2-I< zOJ1Oq7LuJ!Q#@ce8=sg6QqzZky855m*59)^QnUaD!waAhIrVnknMRSogL$3pQWb3; z9FGcd9WBAuO+cf8S&cA4#9zI_*VWZ+dPbeE_CQ5Ng*o9{CYwt9IF#Rj$-Gg3?UKa8 z!lJvU2N8mWiu7$@pjjm5`r2E!-Iwy}Y_B)}Wzznv+x&@33Z=E4+Y!__5#+)kHxCb& z*|&$2Q&XKIBZQ8Qj*w|P&-z^=WQ0&0%7DsBj{C)(*M9IVE2Z&aLpYsQ`drsctO*T@ z)r~KYHDlEnfii4MMXuzXG20q zPd_|4X<0_g#Dtb78xvAr?-tplGokh7O>n{!&91Ls?+1o`_#h)CB^A2U<%v+mjv&sO zpfK7nHa7NImDv*XJD0T|lnV0lv=H@IuOv`VP)1uWbli}#7Zwal%E~@>cS|FRpY6@t zbLnqcg@u)rlrVE~Rn6Mb<#L(ys7gvA;^W)SHYG5sWZF;^3|sb%k0+k)%*dLVnYk=< zAgD1vRM*j&S>&Y4ot)Idz{2|c>zCTMp&=#%1A~Z&2<~w~w_RPeV)gi>q>06*(9qDh z_I9z^CTQg0(NTYIZ>a0`$B*|z3%+ki@GdaHj=?*rH4) zZ#cHoaNU6fe;D+eqO!8VhO+H#n^YlaN!1T<%yCfuy>aW>$4LVln`5Otizz87$K8Y~ zE|ctfokqh?i(ANzWiWyf85kI}V1@|S*Viz=yIa>@hFrdz-@kuDAWj}b83~o@tT|)W z_f1v;Z((Z-6VjuHkA{YpF6u+p*x0y#eB7Nb=>NCtYZ{ASiAW`{*V`5;4OViM)YiKO}ZglQhjl6J*A>l%FYNV*Qo8>-z z!p7EJ^eQiE_W3NkB8454rv$WHFx!fg;O6Eg41hm~xRMe!1tlc{L|$ILsJOWEYOj5M zXZ3#lyVBB99h*+xJyGc9!%^#JU0q$A?)!$zPk4DB^4rgKuMQ+3KoAfRFTU%QlTRwb1la`kLxjj{_G`_L311_&E9bImG{KLb; z!(0R;)SsYpukSCydk%!iGz<(>wk9f>0I(txa$$aI(3Z|irj(YdJu&Nf4#1q{)E6^e z?{fzyXXiWsNUSX_*I{~10Woh~UY3ZP8e62)zQjWY&<+_5?WG>ZRzblT`?F_nmJ}}I zdFQZ={t>DFYXkpVh2QT#nT3I~{#;o2QZHm`{RGj*=5lX?-(o0pb*;?>$^Na&a0oW} z!r~$=l+^sSz9@QQW5v&n%RSp&kjCeY9J3u34qu46x^9Eg)5!s_R7FO)QQve*UR~f3 zm}(bsSB;EgvPXpc8sU)B#lCN(gX<$IM^SfT&VPij_obqP#yDTXjXI;ifDS{;=_ijI zjxF^=mwC1T#ehJpp^w^bn9vITA#?h6t+KX zWE^aA(9&uwD~p8H?woseHM>1=JXjL*ET%IrzHj6?Qp7nU8%FP**q@=GpC7-TdsOA> z9p01>8FkIjc6Vz~2%T?y9gayH0W<7uuO+d+Ja%l=Bdg~09%Fg8*!OWDEbN@bZErWB z>7n`C^OD#9|M%|3Q53nHh6a+gp{%4PtVoxQUp^3VZSB$SEm-&mZqa4}fGS zGeJo|E&L@TG@||3)g=iE;?4$&L# z5jeWK%GlVjK{^aMvq5bbINCouvv)om{YWp%>2vAwYQ)W=5!8VO-y5ORz4@4zN$iWw zdu?04j$=xp-@ng%Od$>pmILh}ncECwdwY9fVj$1cdIsCDawBO5TY0U~#Icf(1TQCL)zw24Vx z|7u-*rc%5DLxD=xhZG(Q*XL<{ufC>#m_ag5*q>v!*jDHscS z0MY!Uke>@q31>!FL?r$C=4J!XqWG*V6;V;q8k61+IP;Me5P)$?UXC0S0<=KK%g6T% z)PX4KZ61psB<)egU0?$VrKLZQSt}`9u(An_@MiV($zAT)`@NKwW?^CB1+<c zO@5DKdaSCetF1Oii)|BUhCK=JeNM(S0d$HofPoArfHXO+V&Ff=D1DEFrlzZ#?np%z z9fE}_6$N#sM5h3~c`3_KMFbz5$GU$*9 z%q%QcJo*+}#s4Fm!SzfznKNgkPPKIG=Y|UqS<0%i>g)OK=G$zy`PRIK=N+}eeojt? zy@(_-y16_N@H%B%T3()s%A43ifVl1cw&GD_PUOP zf5!$;jfM^npY_QT$KBtJe9O?9Ow>Sx;^N|aJ%g7l`k>ZvS;j_tanjFmXb|i(d^Ud4b*>JFwaS-Ab%7FfyW*i6%4qdvpWgsyaH6O-(|5t4^b1 zV@81cLi|%x$pnOi5Fr5200kxRY~HVZW?y|uFnr#wkNCjdf8IJ5lfDxJ6+uKv9 z3|7S!T=-tBCL#Nao-ZK9!MC=ytiUO)Y;G!mQj-tRQ=Cj5SL5%~aUMFl0P~?t+b^~) zt*ur-uaG`oZwOCHBE}}+^k-B`l?DsF=lU)vW#`GkZ{~*R1O!MR=LFDkvj7_Ld^J)rDUHX`Zc_g&>it^=T6Sm+ z6d7{n1clN@%9)P$CfOrz#0yKe4?LbcWRLAf&CSWF>0PreE<2&)EfonIA)_*olkOYx z^UsrgnXNHlwAeMA%mpv+O^Qo-8$`&oyVxs671ikM7sZrCF}*whd#rJN-o;yr6?q#K zwtumvd2lsP4ga2YCjQv4146Fb(m)BeX!l_C(W4vxwamzywXs}8MkOaH#X;TkD>18Q zI(8ZXDrdVY${9`JQ`KjNV&YU!O!0%WLxQ#@_KYqL zZ`>Dy=josBh+v`K>WmufC%zDK*c?^bo<3nYJhGQ!B-HknFylrjRJkL{lf~tqIjq!c zj`a6;)A@Za%Sb4W97VYm0NuK-az7Zk!+JO_dtfJL;0h+V-gT2b_|BgXtNJKW$zMal zo;1K|Kc~JuQ$M&}8x-UnR&9ZqJyKhi!@>*d{fCn+Bmv$_cAUsIX8tpxIgd4FC+A4T z5NYS$82g}@nC7W>Le2${_wQ}@XvROY@cLda8-;zyjC>L4eUU6P-_^@@nYz7Qs@1@W zL(DGHBxdF%0TdQ^jn!N$!9&RYcJ*Ac&{*qiIcnhI@XjF+r!b^t7?%f0k3^nEr{IRZ zpgy`jT0ZE)Tppe(e|+MJr0?frzW4A%#lD3L)6=Jyyd(fprh7q=>Emh>y392IHyZB6 zBBAN+rEZV%_wV1ieU#LX?CurQalEnYRa-Yz&1AAYxft88xToJ|im2~tCFHuJ-Q7&% zg9n!StU5_UYb5yRN5=16V&|JnfBid2i~#>WxjWa;o2&LateJX_h3xe_K;erbBD8he z^-1<6)k(vh>6D%|XY>Gn{`vIi<72rfl12ZH z4)^%@-$|eOPTj#Q$(x&=_vZw(Mag_m?23vH=d*i6%RoVeK(I)%#Vyx)<=+&2Bl{e9%$EpJ1jqU1yly3vbYZq{9$JwwNek~PVr3dJe^8ixNtEvZ|mm&xn| zMZ27equm>i-|n}R^=7IlcpzJ7wr_Vx?zqer#(L4b*K!qB<6tOR_oF+P3L?-}ytliB<`8K%iJhAQ}ZpVg$SkND_SZ%Cer99^S{p7$R3?^`i_a32AAB+}z{21qD={oz%Hs z4s%8sxCjN<*nU>%Wi7?2v`HE-DGa7xd>&mrj(C+90+bbkH*aw92@YvXN(4CButS4` z!=rD=2?*M{ul7P|X$(Jsk*scKIjY6_@U!^|8j)*yOI~acZ|WipMss&!(0ed{cXLF6}X*&B>EJ z!h4k86@pz2v&+~>>(Odv%5n)*I3YVcRH$-V_2uPrGL#F3OVVZeB*r{@_X%b_<~-Tp z_yJ5>(;p`*0TMfj{RXL2gL0uG7Ckf=x$XK;r{z?eAd&q>&~;mj87k-#5ECQ(Db7H~ zZue=~+aqGjTF>H_UxX-#TDOlk(zL4R@FR&XjMsj=P)iyq6uCLJ{QS8kf}{PK=-tF^ z{&%G4WDiHJ**Wm7c3Wx1Fb<~Rjmutwaw_bDjh1mOToBex~Prm zX*Z6~&wdL~h%}Ie;u>`IL{pHoz89-C*U&nDp2#+ZMosN@|FgO}Cvai-3sk6MkkB;l zdbq&ePggY*Duws#PNDPmd4<`GAfr~$LDi5gdKBBhemt8n$ zCHH3tEbNC73Q+vZ678f^8);)c>>2&!N2a|{SNvWiv zp$Kpk!d6x^4ef^{jO>p7C`ou?np=-9JpXcFV;dCRjDOe-X22LR+DO)^Y5gm`5Tm>%-2^Q+NXc{V?dj9w|&t_Q8zcY+y@> z1=u`0K#|gFyQVK18|xd?MZ=9TQcE&Dk(A7Q-)ShWuFh)8jbPt`4?fg~D)g&KN#%s` z)R!1lu)*BibTcA;@$we^pR71ZsGh6kY-}8sT?w#JNgefK6ckqO9K}4^j_K;UR@E&0 zs$*{^$w&w@|IPtw%n%TD3qWY<#pB0my%?vm9IeNo8Fzi44CS(neX3D$9X!f#B2Pgy z`}4XgfQ6;Pc*J|H$Poc;6$=p-)eP&J-*yALAlBc3nNz5 znel(B!)<6nZ@8h>Cg`N;pyeU~Vxkg&mCTE2z{I8-9QlC62C7bP$9s&wi6x&dvA|5Q zp8Iu%hn;gK$oK!GDcpB5?*k^aq){gH(M|4Fz))@GT1Y*g&o9FSGn7NFuNU|Ci#qog zq2MN%@$vD6MMr;KAI|&EeaAoVO$dAxzJZqS`9*yQ*w`3~$qojaYHShz;mnRSxoM|i z_5(>NN1fHHutZdvoqwUY(04sf0s*3sPXN%IdDxrq11=LnxRGeAiCS+PY*4!?;xiZ_uxO2%DUbMnGV4d%);VTxx1WY%E?J9ALlyw2S`R zPpImHF|)C4pCSk*C;-KM+6TCDCl0k8z(k@!M|9nro25VUN9Lp##R6Tc`)b)oO05iI^b2fghu?!NnlZ7q3^C#5ymI)(%3&t`Q9UZk_=bI|>MO z=T}#7L)ZdS*{dh42@#6NiHbmzsNeEPxBB{HE6u)*Hbqg!!219NAsfgIr+tT>WDp=t z`?%if8TDtStgl;o-d?Q9S5DNg8|dh~)YsRKPfnhsAK0zHX}c?a{>AKLN=i7(>w=CS zKX5WLGs7Yyk$$?4z@YUs=)j=H^Y-ysTv-Xq5O%90wV$rBg7^b@p-wof!Y*JFi#Mko zJPts+e+%#z`aU|O@7p&}LUB>C$%24DNhc`SI4k5YtMh22P^EV;g@?;=NxDeAga}SZ zNXX@JXeuBeVAvByD&TosRHae1Gp;XuVm5x6BCo96qhsHSl2W#+IRv5{9v<$on$b~d z)sNYksfPo*LhN!l2IhU?1iZ}flA|gp?OVl?iVDVHNeQ5-76`lTswya8AY=pSp09tp zi5!B0hW6UbjDdlX5fEX&JKx9y#e8R=Ax9$H&Cbpprh;=-Gc=@0NK91o^%cFiyi@~( z!itydOKokw&($fgIY}u69Q+?*pp1==*9lkt@1BC|{(^*)n_J;>Z_H~T1p6F(CB9eT z@%-6qb-Z>)AHlMpV!pc>1UfYVgq4GXe~SIy5YW_|z?nD#<_rThHT6A1UtL=p8S*{l ziTLngw??^2X!?u$_J5iPs135)$u=_;3F~8~C8~&2hO01esDLEG(Q>pq!xq zzKz#mK|CTdlBXg@CXY6-)6hx(zl?^n|27(=Ul%CmwBMdoJ}tOdiBmxrPns@ob=|~x ziE$sUi2Hsv946qlOVQZS;L?x@B>wEOGPY&jiAsaQ!NEc0t%n0;&9r}IFA&BgIy*Zf zLHbr(-4JZ7tXOpQ^rB^(kq{A8)zlFG%3BC_<=0G5U;y51dPW8h zq@aIr6#mM6DE%sGL>SoVKRT+uJ=;u77Tt3WDr+7W8(=rlAOY)=cP~%2AlC{LM{k_Y?tu+3y@q4G<{@*;R_R3NYJ&(L>&Rba=S`LwL_c+d{>CTch%S zYE)c5v!0zz0URCFtoy1oQK1LFzBr1mML|ZU5fmh~t|bG-F1FtkR$FWPx)(fJ0Dj8- za~43Q$qjOHavD627}*WlqM%#jw2X|X;AKToQIR+h>FVs~ak7_PxAw|Tc#t6WttUjl z3;~MP!NpouUUoL*?c2BRe^M+st$sajIsWyMa{T@&$G!WfS)tnrp1a_Yl1|Zy2;E;) zqpWiQT z(3`#h;pfA|l&`JD&0h)$w0~uCFm8o~g=J4wTcp|G0#O2#GeUfPP(xyXbtxwmf<^1+ z=Ld>5ovdsx&dm2w-=<=a`dUA^FzL3g2YHLj%kzOE_X$)qY$}mt;2kRNwH)C94HDXv z37)Auq@+~JlZmEdVq(I;#?A-qDXio*RyEav>5j1HF*Dfh+V!M_gcpQN%G)Q}Y){#e z&A6{Thz4uy+b&QS7Z)2`HVA+V6`Ph8`BbOQ5ST4$Nj+LgCpS`CL~P&$?w{Rs1!Eq- zam5Ue*N4$DG2x*6vp}t)proO}q*IfVhQK z0hnXnp_QT)@YisiEDy)S6?q`_A^RKLtTO=P5D1#)!YRG8vwDZn70scR-?Otynek(P t4uYe&%q3@fiMe}{f$jZI&!R5GWPTzHP}LzOf(K&|`4`I46_SPl{|myc-BADl literal 13288 zcmeHO)mv0iyQdkXLFrB@>5}daQ9?STySux)kxoTIx>HITq@^3AJI~^KzKe5t{(y5a zz%zT;v-eu>TJNuRxU!-Y>MMd*P*6~)GScEIP*Bhi@PdLMfOnLNb`!uaXh#((QK*Vh zqCF@m_Iw#}kxy>W|8$UA6;$ti>??WMsrG&pi21lM`G{NWUT?3{XEOETGY+gs2H}AC5UcI4z-S?@0 zxs20tM!CshE5A}7Q-gv!j75D2nYmTi`Ctas@!LeQb|#l~{&!(aZGt)xal0+Enb-c) zlEO$7b(X?Y>Tncz(9~g&3Zjt=ins;HTaiK+RI|GXVK~ZM$stHZma?(+Laq6yb}x7O zkHt~5GTO~f;WYATt6W}XDn+F({}yZ>|4>>}&zFpJKot_4krl;jPdOC4v4!CK_wsN!Q!o|1ksw|E*D9 zl;CgCK*@*0`I^ObmxGy+D^j1?O1%c1mV3uV>xKy}+cx8K-F7eDKjohj2{_F3TSA4n zZI&=52NI|wd%U&Dm^S+bnU{-mlX{)_Urfg-x4PNi9oCG! zm5L$aFrTDaX!GR0Jo>8@q}SvStm}0uk-=sh!7(|j=lk^ppU;J{tI}%z=X8Uu-cSk? zq4VBk@cwM2l2j~75wGL6^uzhiSma^Z$CAnYKi|#Ab446hZZ&P1Z$t@T5zz|YFsMP& z4ah%^Wed=`9xVkqkgf2!9=#qZQYn(XSb2U*t+E^D^~TM=RHLWJ6^r@=Csb7E`*14N z{CKr!es{4q88?33?E@8>&BMw%K?Bq8F{f8xy4>o{{_EGTiGg^^J@C5dC-s$fyP>9{ zQa+gZfrQ+!KV3$NikD3-o0J<$;xRxod%Li`c42yRvgUMk___Kc*^2x5c9D|M<0sLP zOzv1V(@}YLli@h@vu3jiiqt*6@ISvlNeXj@eX4*`8Wg&m{>bJ0u-X+E6as(m-*6Po zy-Zem$3i9==ogiw{pXu166qALUgq^bU)FMsM!P&Sc2I~|`Q76M-uGAe0)=v^G4(co zWkEetn4#-=odzfU(hYfvm4{0rqo~oPQs2Gok0zA5zdkO>mxz=t5QTNxI;=ySBHeG> zV>2G2(hPJb9$wk#kCj^n)gej-JGJ#YRSA-B&=cZxw8V=a(8;6O$1PNFTgHR-zU5`nItxC%=$a1;DF#HHm;*}RC4pQFf zXb!CPhGW-S&9h}%`0RXjjW|6U&lAg^>{;E3jSLURq%6jFy}$Z*@te6LEp^k&`n>8M zwty}wp-Moz%|q2hqAvLpFtflpg<<0P5NKhB zS%6Z>Z}zCOixAca`x9J9PM;cFJ^|RZN-K1kvM4a{z+m~W;W}4yTfaBgD!_0Ko`SiJ z@*6e0LHVqYS>=h@LQVOHnAd?@DKopU{4=wJ1L| zY0rGNf{6b|hX1SA(mvT@czI`O(~e^TJ5%NwB*A4RQgBXrNm6d*Tf8<)uXG=I0>`2T zq!;Ti*Wf?nm&5y|aN)yP1WF@>JKM_Vv`eZ9={6+@%cVXU>yXuMa)G(!WAVK5h=^|EER>dSl@WSwjdpb}_EIbA#{CO! zT-^21L#Mg1k<%-8Scvu`Ee*|S#RQXX|E%9cI4F6ineR$P3v~xPIZXBe8xJ+rxO}W7 zO0xzbO2U!``qW`>%RlKwa#+p?^&qp`s7xvd=6P_FihKTQE$YA#7e?w1NIufu)ar?( z+F5iEa6OVty}m5w#83{Xk`!oR+Pb?$+?}gFw|PLlTMOm1dAO*5^Kwj-$@6W&_qAaB zhi!$xnIC+e$J2IFWG2#&(P}TVR%g=o78e3_K#YZ@jm}I)K|=%EQES?UJINu4|*rjPT*R+MhD_a|;*paEGm-A;hseUx)fYmNsd2$gayV$4Aw!F|*~? z`9!3VICA0+0e)oCnjH4@oaHJKnD@O^x?e5B-#}M_Z#*HOM=gbDpo8Xo@TVz71M>vb z7o;+8(l5gA^5sVV|D*rc5eTc+jelf51#907Y=BS5(y*-9*p*YDcY=R3z8Ce18qr}3uo}}Zg!FZhU8^ZA+a9x zFf#z^bT3?17OBJWgPL2z%pSPl_rBw313lL1@y@w}z0vtVExsCTpdH3=4C@Kha=V$f z?MNv+$=Kqchyx%djpF`zGe5MXxNVn{sD7s~$#p#4eODUvz1>Q^_@k~j0lK4i1a5if zmAjzN1JA$ZHa?AfRYkCY2S6y&j>PlGa|AqRK##b_ob?gVTI&ur2e*?%Er%11{7lGg zQ~0(Y1%s4S$==@n;@I~&(_}1LA(dH=tIeuofSsU%A@oGUY;(xJwL-gTeMs);tB|j* z&%g7fd9l$?Ugk1WT`xEZ)Sk?Gd>guQMd$;k0;@ z;WUHuo}A@2&yT0;zo-^PFMepYycO8h=4gTq{uNvr;K)2O?oE+MA{mBGY`i1u5(WO~(7{jLD8pD~^; zwzyW7`w($irLFq2O_zQMjH_=R2RkYzfwlzw^tSm_@dN;8FI)a}o2RP>=+;)>S-yHc z1_i&_TL|I~C!BD&w?W)_xe@jqdbvkLu~4*$Z>rzT0FJ!ah!u*+@qs4={cqLCA~8&tRLsBSs5$bavj7pn zoQj5Kq1)|ls_Y{zy-qX7)?lI(!D0+CA3uDuW6}N_xu|FTR3+sZ>!5M)z&~;mb55O_%5GN21zX14K z0*_fh;p;ChKt6WZ#vS=t-=Pq{fhcQRlIG23-oTtqd;K*u!00#FhcpP0|3 z@cyVpNf7UhtlgZ}?*kTGVnQGzO64JOi1gJJhN*UzeNF85XIL?^Edpfu_97#rVkmlU z57W{^0ne-2wfJ{B?{CpB7oC)k|3$}};7tkPbyR)qyn?zU$^m363`ZZ0okhO0k)(%W zj!W0)*4SdDU7)Kf{NZx{Pb37T3W?!kd_#_M?%^>0lWh6QGwALe4(ZmL8nHG~>h z(C1fQ-+R1$8l`MTR3bwbc|QyE7N`)u0c;LGENa;~LF>i(Eq1bc3<8Q`r96BxevYVS z=Ys_kth=j!ayi~t=}GWn!S}}of(hf#N~NR)e|u)eIT z-f$iEjHl%CHcgQX^JJf)C?I|; zWtlXrr`A9VQN>`jn}sz}kyIU9lEp9Z69s1uU2@WJ)lYyuGWaXZLNtR4_dCy^0MT`e zMcZT5A5q&q9P_7qI@`NP?Y|dErg$``A5xnkyBL(tr?b;<{KH=8cm8)N_7X_pJAhux zB0GvJAmSV^s9#55ZER_xpn>aSu#m9=D;B0QWl?M$%mMcdqxg5g2+v+}Y zEDVL0X*e%~uD2$jhK1#cU&Td6pwsMx?{@c-m`RsE6qo-;R3C*!x|g`{tjG;Sg9A~o z)s65NLfjMCd^S0hOe*g9q0UN|B9{xo?Eh1=3ZH%EOf$r(b>kd`8G+9#n8FhOqcFHs zc)#*>Vp8A0P#i7ym0*$TYW$mrkV`eX=9DQ|aLpv0)d{l!@LFzz*FU}%-8`;^P74js z$lgd2#s59x#ssv{~T@Lpp37slot|m6LO>@i}lpuh4=EsarVINVN!{Bi}q6ZyW zanasY8m}iRo!vPNvtBlAJP7c_TEp)2AGha;m8hL8Mx$Amt?cJB6L)LFvBhtAUx2Zq zPNAma`nnol))!-w&B-FmTB~%|9sLaZ3+`qB-oh&GE}A&{V{}$GHtdQE;~8zNtULs< z^rDjo{i?@NsUgU!_22Ui@i4JB?pURz8wX2dY_}*kv9u-rc;X0mUM3p&2Uud-l4IaD zghVF})*)i&5OQPPy50ZSE_%{L0YEWQwb9%D`bglHR4=ikxi3qPfpHNUyF5qv_4mxW za`l~htg(zb#U~@#^Jk?s)1Qr7*4eb-pHcAW$8tJ`DtmrgM1J=z_xHmJ;@qD%raNw_ z#K`e`%nw}Y^hdt6R;9jG^>yW2>TqM#Me2sewA9|UQM8<{nJsF4etK33MN^tQs1(|E zCPKw)gOs9DcpRw76+_^nz{>5!_y#3G<^h06*mCoq1UeXKP%D@$LG;3yVY*=Z&2O-& z`w}7C`9iBu@?I&!<>P|3vin1eDV+j?18|1}80?*nx@RVL&7 z_NGccCekQOD#!F>{*h0QP*$0Qmz8hDSPq(!wvdR#DSEuWE{R`4$R0`Slqgg{0vOMn zeIw)Glh`WIZ3=;yQKETQ7GGtIlyAS$SLWYPoF0Pdx2?|^piC%E;G@rZ5FuRp0wg)R z>Gd$Bd%#Q;t_@9><;T?_LsQs9;v(Ws_a+F3dgd|26F0T^0AbXa_kP0cbxE`aaPo~I8A$5n+3psA1+_qF4o^Aa`TMz|s z*m#IhE`>26u*P)kZkkg4+oy0KOl-&9f37k4kj`dIbd-)uR>+`Uk(PQE*%!mc%NGPN zXU4g8Q?`(=;0xHy;Ift-r_$z4y6lFZMgF0f%`YQ8o6P6?)EdpAbDPQbui9cFA08Et zrIVaz$OA}}4L=hS5+LSf=P=Oag|!JA@G2U-`yb;0?=VZER~;J2?2}_|`@({WS6yA*7fR~$*2nkxu_2z_RB>an zNKW!s#G7cRy-ECZc2lmtXhPbjI99t=;oA=DMXmzrc#6K!uY9OB+6m7}g15b^s^06i zJ_6^%>8(UH>aG+W$?@2KqRH_1JMOpG(KY4Zk8zJ2ucDaFG^j{n-gEH6LQl{ zO+!Oa{#Uw5S?Ojti}&Nh)#1F+lFOoX9}vExmzo?2!CK%}7F^x*89k3Z!DW0KBD{b*q|y>W?M0 zwW~C)(tL-$4dgjg{;CsLk2uznj=u*>r>HF8PVpD}fWzcr}lR{({BT%c1Hk9=l;M_0I2q?aw#wm`X z%|X>==g&WUQ~M#i^fug+aeuD5U@0^zY02}rO{&gvHbsBQuT-zYrx(4JiGcf)#avaM zb(;Sg{B;9o=U2ipSrGla0n_Pjd`xuTR_qmt<8TH zi!UYq4y_|!&t5c0^JjZH?I*3(?}9P34#r{96#x3(IpGGM?Mv=)`+W?T&60FEE2b5d z>yka#)=O%G+9i9If8)E*RgMPpf z&FJp_4w+9FaPJr9Df-$>`U*`haAH72UV7HajH9A&wfxVx6sfm3e_=#=O3RJ2PMk1g?ryT9E;2fMg7jOnC}60kb92QzHD-?cy z3bmcBp8fiyU~7UakzkbZs`(g^@g%b22`N%)_UBIjP-a67ojQv*Yc=lYCgcca2zGI( zSUg@gEI)Kw)XuKJ{9uQ{;Tg~}g_(B;A)Seg#qe(rCWfMs@SFXnG;x)T!dr_IvVAw# z9xqQhS8I;_*LhZ_e)me;yrs-{=|u>^$=qa3;>o5Cnlb=Y$@ zc7-HrbkQ%;@*@2*(NEukmH3;}!^n)KYI%{5|IiBV4XS^1Mi7GG@%V|wbg2kG7j3<> zwAimZq$yHI4j%SI1WJhG9`C{sL0M$`{L zrKdb?ymn<#Ig1lEf#^pCU6LTE4@Y#`kJ-GeKeo*7O)5#*;quOth|j^5?RT;!>|})O zJWJl-Qu(?%r~NJjruQZb2_FF%Y=&vxXRMNf4Y4vHqFCZEI8Yqu=H0 zBq;*{UDra2LpxRw5?X8xs{BSeS`Gd->}Xq+#)^WFuP-?%9EMdW{_8lH?~C>PizWW} z7*ht{u-Qq9dpKxKa9f?z$XC~b{qbL!hR(xdWHPvK4+ngA8+EYzhs01X0V!KZ^k=|t zU#_7L(YO+)^Wk}zZsN#L#nfk#4)I_K(fn10+D*^-W9t*#1KY?%8o2vB@1t}W>&?Wp_2 zKey$(S7cD@u(k4&pYWcE#4Y!2+p~}NH?@C9`m{x7D$oEse}WR2lhJKS>CDXWDd`Ht zJzowyXl31>c|t-dh`=2iBdqj*m?<5>R-{$!l+NM|`-E<$-&f+bR-BUMJ30c$ffELj2qj2li_-*?~+=E)>6F%wb zwi}V2ygb5$zQrGUF#!+$eyO#;mM(Qi^kI+mZISEo3@B zh{lo`7)Zw_GhLONg*qtk@U!^cshy8W`uT(snf18C*PC|e9nzYe#sr?TVlks?RVDv> zHj(6*N6H#g+uU~Vo%3|$oisc$LHB}Q9gbnwW%rEOPG5pla_8Af+B3QjZEh_dt&2`^ zq$mOeTwZ?5o|R~C=n`hFH7>)5;GBrXH>V{ccma2RmD61thOWlTpc%;L;75kStXbzl zC6V3*iKF|7()Q$`Ktp{Ui;YrD*7!nFk#qI=JlKB-q>PI(nNx~u@OJ=}WuE@x4-7E>RW(NJ+ z3xLIgNH%gy>=v!lZ#ni{yaJrj1chg-Urh+-c>Uz~>)o(}og0`H7?lkU>C#H}?a&wJ^cbboKNHfFTT1e+gBEwLt=r`OxKzn;60#;U6T*BhUX!gT z2h1jKEoK;vr>yMisUe5+rVJ-#Gr!FT6aE>D#M0pKfI{&%!c#*^lRca^$09XriEV#= zLKQ5mgC!l(ynXiEcXC?s4!$wF_3X}|z3+YR{O#8Psg0};n@QB##tq;2?u7LmjY@KC z59!$PNL61ps;B(qnJ;x1hnnZ}(>2FlIIW^rbP3LJ0*S}X3C=@yc&KqouH()$C)7;o zhlHcH1~OZW-@VKodtbC(kg<`VN(WJgxEYG|oE=Map3UFG{r6!UpRU_HMiQw1Z1i_X zD)HOv{mhCby0wg$iXNm0UhP}|wdnR$jAX*(@RwN4&1^^CWCrKGTXRj#aNpeh!SjF^ zpgL#!y~Z(B77lY&dN;(lKOo<+roQ#$(;xnw1D@AN#wAUM9_2&dbZvx=#imv$UYUP$ zta%JxbyEAC1=8_%H(rHA*obHeRcxBpKHHWdG3E~b1U)XNWho90H=dU@Lc8Eo$Z0-F zda+mHxREr6UonHw&mHw7V6#qc4%#Y@W_@myr*snD;$5}(jHNdiU!-m z&KEh)51lzXH_q;{cTBWclmSF6uz~QO6f%97T0T&+=BSM&0#{lP8X4DSD_U*kcSguN zo$QElZG;piM&f>s-6FYDeq?sp(Vr0c{5~`;FsEIT9FQ}gduv?hT^4^r1x~@QWx5zt zk`-ZmM+3jKX8C?HtrOY4BkVENq7k<-VM=2MDUR<>^3e6x_e`K$hYLQpehAun$1zW* z#z>0Jy)YF+-0zm*(#lx-NHjKio|Xc0b$K9+=GT?s*K+($*r@-BVNLZ zlf@dIm^a-dxvKZ(h23x};r$q- z^-|4R*VW{$1J=_hp*K|Krc<$=9~1{X-wig;jCigUS#M{UO~aqudk9T*TaAHQL{i zif(T)gAtpG8B4sV7W2L5)u+}7WgRo1u0c>MD4Y-Hw$Ac(4u_`qnpR=HQp-us3@u=e zCUwewDwkHp^@6(?UsyGw$J$t*QJ$?>`R$HYc1e+m@rEhC*O1d95J7C~%eQoPzR*kW zLQHt^Ft!2$afl!Axv<;rk3MzFD9fUeL(M5tspYPJq9@`AOfJ)KFMH?qqFSNL#Rr)W z#}Lzg$mHTI^}KEtNvT-ZCReV~R}@VC25Vq!@jIme!l3#G9ub<@5Drl)KA=Z&JW}A< zi<*FcP7|>m4pXv2;@`4&fVDsm#8Td_w*5PI^gYv3KBj6QMCF(5vX}Ig`t&!|5Ck+U z0;)3lK3q82lvW+J(h98xJ+<=vvQO=~JMYV}f-JSYnp+%q>?er6sWB;1O4cUf&fZZ8 z!y=+Wo1rJt)Fr<8uF>@E9Say;n4VZPA|A?P=T2nH{wVikL&MjTP~@mQ@52Zf)T$lo zOvmt{f7kqk^3H%QeKhKSr@YZeS*o0u^|OP*(L?~19*QTBpw47O<)_0NTblca^IMT* zYia{o44;`RV2*Fq+4Bs*m53M+{%jr)gzc7xFA$9kEi;C^&vTeN!8U5Nq zQ6jQd_1QT-TKHfl79!(y()FX@fPlLKYaTx)cZp8qMj4;mhU&w?%u0lT!%R7Mncdow zVDC(BS-5bCqSDZWGY=eYPgk=uL!pVwr2K+K;K|Q#2?;hTEiN18zf;7{G8$WsM~{u= zQE})X`o;{kNaaqyBGjGfDC4XE08D0hp?`G!wHjfB+-&3Z*6w@Ro}=d)SCSbFk2^WO zqs-e)e7m>V9OhUfU-`Iq9mMGDW-FEeqsDr}^o>vWpZz;vig`br_Fpx;O-Hcb9VgEa z^lla-Ya{b$~vXymBV5#kwx zmX+aNL;nW!%V7T7Yyblc-HUX`CP^TQS;YvJbIK17rbdc5HW-`eBswWn>o9=zrhqFh z3n=CW9o_LYFA52N8ZH~LU3ybm8s3ZlD<|Y@YnXwKv)b-`eHCYPSB!+z`{IMg zZeA$S(Lt~$++_DTn?X0+9f+Js@wptX?wxrS`mDHZpe{obRgbXTa+KWDLn_BE4`$8( zHak0=Z!5?&g3#N$5`!$q;1dwwJNsO3l`empK6`UH+axPQPVPUJ?Ul+6hnfd0xIw*% z!S%<>S-l`c-LKb>IU#0^-yieEkt!)d*WK+EpMm)Gke`Ed0YpZXr-xhjE*(C4-Buou zxy#J<*r$8%xE-bLu8=GolDM%)AIQG$G}|KQQ;LeP)Y7S#2PW)`c8kl%-jPu1i;9Kw zPWxsImHFw#zLx|dN@B1$Ns~&#UvAqh9{cW9Sx)AyS=GB5lM%L8xbLihKRj#(6cI7E za~KCKZ0wQWUpm_LL-_9_j-MXyiv-mxb-yzH(_hjL;Lw;l{rozyuK&HXOfD^>&;37c zN)QmF3zyzL9y7*K;Jys!UC70D*AtIw|}0ueSQ`jB3|Vt6sH zWUd0l;QDP-ztPPCjtHMqGM)x9YvS;)Uav|>H+-nnZR@pNY4>iGW5cb?>5vEZ_xd$S zRxYldSA1VADf3gDLB-8dyEh-R7oDs&^!m=8CCK|F@wwVGA5^q_G0uCW$SIOboqW7r zQ5whjY5bc8#0DIa1&<0CD_hSZyg)p2jIeQZt)9n>0eGp@KFaXeW&}W;rZq#f%VzOB ztnR=0ioPPlgTl@-4O0(vkpz-m;7{Xr)ZYC8Dq0tuara9wQRTIM;2Kpe^b|lKu?-f! z)T!B3EIGI|q8@j9CGP$IB+A4dx`Wr<{SlxPpo~{z0@TViM6?=g6jGjmig+7z{x0Z} z;tK6@9vJn4OWRr(1Dj<6WF#S@olpyy3&;y-INe=8^g6P^P9XK7K5dO;rV2ish{e-o z`+MDPUXuXZ#K!s_0%T2#= z-0_@pSdg`3S11S~H8gnhmI+I9s7DZ$-tH%N`=c&Q-nlX4NwKdvAQiHoW34O+9BAsC zt35|VTH_1>&-xo)U)HiPp@ry@D?hhbp{K@)R(HpVTFmTJNkXdvZ0o?mzSYq``rRyP z(r`xiI}^M*I|p&*7|L^{~HyVd-_-021U7p_%46Z_J)Mwt`gndNj?+ zvgh%Ke+zZg{AqZ7@@CB0OCUBoQbNK_Mf27WE8jHRU9uKZgZMj+Jn&*kGWsIJ3^82oK;AJR^RfIc#um4!6oKjbm$T6r33K^J|ru2JadH@5)@T|K%P zypF{KD4PuW=X3;IY>+?1&l6SS<4e4+dzVF2*@y`UzVL*yKEgh3=|-+>xV@cUhCZqm z=LkW;TZeK&ab@vh31uBMH!6jt=z&EKjX>C2%?n*{2SE!&G5iqR@_1@$-rQ%FRNgLuXP>-FfEC{OjtMXNpzObwQs;J6tpDN(J>JFrng~xdPvDJf)tS0KW5(&Dn<=+h+W=q zrRu$US56Tb4W)6Stdzk1+x)rp@Ndhk0i$&YlIqjpmWPM#9E%L6#q?_8uZ)Q8;eGx( zkTaUE33w1Z?ZxKuOm6df2xWRz&sn3rUFpbU20xBA?vty~-Q^SFIY3)0=OkP8z8PDawasy0h9?@0EX4PZtX;EJ+ld+uJ!c@@wx$n9K|W+TP#@^uX6d z#c+9Dg|$ZU{YSk#KtK*lXveo9k|%;Ma7D z`~@|7Og;1tb}%!8d>!%Lz3Vl9HZ8xSo8tb=4@*zAtf|m=`~%YWu18jxlR+YcA#!F2 zqgv%U$+-WJd!Yg(v;rnb#2mAU;}ucPlqFXo`NBRA)|OX$i1HYqKjYRR*1(kNf1=-Z zXWfP+*C!gCN@Oz;MYp^vy-GjX7BYDc1rhdxEhQsq>)p~+JDZ_qq^+)ph0>;;fGPBgz-pP@*IR~^oqnkWuUudN1$F&QW7-{h5hUvKxPqIoC6OG8 zO1&*#EZL#=u0;q9WFqfYYMbd^b1k>m(egRU&l-b9?2Y4l z$Ij(D^h=_0+|r)rFnyjXLBR?l4`MHEUcE`gDRe@vDDYSZb=w*+E~pkF+n{H$O)4g1 zQ#`BW(l^YKkm#G*?BAJ=W{J?zd+hz^LPCnJB*k`WwToh13|6?ZHVU0k4-c)quGUzs zdaAh7-kHH+4$DgfmIKdg&~Bq{RyUEA5=HY0xi3F2N;72lg_?^yqZIe2y(V>z5Z06+ z)2B4nWNO^j0?(ePy!gq+Q5-=O`kw(uVbr?Rw38q+hFe-7W9k3)?jNQ8(G{|>OjW9A zPO35mk;gpG#lW9oUABPE09q?bRa|0-{yy?$cu`}XoyO~+U#9z$Tre8L#zL1?DKzt$ zb@J$sssQ>*2wP*^p}Yl;#b|*qSrRQE0T0N4@beh>326j5gKj2{{XEE9m}f*({p{)7 Udln+_=nj;OgrazbsD8lz09wrsegFUf diff --git a/docs/html/classaunit_1_1Verbosity-members.html b/docs/html/classaunit_1_1Verbosity-members.html index c45cc58..7fca0ea 100644 --- a/docs/html/classaunit_1_1Verbosity-members.html +++ b/docs/html/classaunit_1_1Verbosity-members.html @@ -3,7 +3,7 @@ - + AUnit: Member List @@ -22,7 +22,7 @@
    AUnit -  0.4.1 +  0.5.0
    Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
    @@ -31,21 +31,18 @@ - + + - + +
    Verbosity.h +
  • /home/brian/dev/AUnit/src/aunit/Verbosity.h
  • diff --git a/docs/html/classaunit_1_1FCString-members.html b/docs/html/classaunit_1_1internal_1_1FCString-members.html similarity index 50% rename from docs/html/classaunit_1_1FCString-members.html rename to docs/html/classaunit_1_1internal_1_1FCString-members.html index fbde92c..9c4216b 100644 --- a/docs/html/classaunit_1_1FCString-members.html +++ b/docs/html/classaunit_1_1internal_1_1FCString-members.html @@ -3,7 +3,7 @@ - + AUnit: Member List @@ -22,7 +22,7 @@
    AUnit -  0.4.1 +  0.5.0
    Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
    @@ -31,21 +31,18 @@ - + +
    -
    aunit::FCString Member List
    +
    aunit::internal::FCString Member List
    -

    This is the complete list of members for aunit::FCString, including all inherited members.

    +

    This is the complete list of members for aunit::internal::FCString, including all inherited members.

    - - - - - - - - - - + + + + + + + + + +
    cstring (defined in aunit::FCString)aunit::FCString
    FCString() (defined in aunit::FCString)aunit::FCStringinline
    FCString(const char *s) (defined in aunit::FCString)aunit::FCStringinlineexplicit
    FCString(const __FlashStringHelper *s) (defined in aunit::FCString)aunit::FCStringinlineexplicit
    fstring (defined in aunit::FCString)aunit::FCString
    getCString() const (defined in aunit::FCString)aunit::FCStringinline
    getFString() const (defined in aunit::FCString)aunit::FCStringinline
    getType() const (defined in aunit::FCString)aunit::FCStringinline
    kCStringType (defined in aunit::FCString)aunit::FCStringstatic
    kFStringType (defined in aunit::FCString)aunit::FCStringstatic
    cstring (defined in aunit::internal::FCString)aunit::internal::FCString
    FCString() (defined in aunit::internal::FCString)aunit::internal::FCStringinline
    FCString(const char *s) (defined in aunit::internal::FCString)aunit::internal::FCStringinlineexplicit
    FCString(const __FlashStringHelper *s) (defined in aunit::internal::FCString)aunit::internal::FCStringinlineexplicit
    fstring (defined in aunit::internal::FCString)aunit::internal::FCString
    getCString() const (defined in aunit::internal::FCString)aunit::internal::FCStringinline
    getFString() const (defined in aunit::internal::FCString)aunit::internal::FCStringinline
    getType() const (defined in aunit::internal::FCString)aunit::internal::FCStringinline
    kCStringType (defined in aunit::internal::FCString)aunit::internal::FCStringstatic
    kFStringType (defined in aunit::internal::FCString)aunit::internal::FCStringstatic
    diff --git a/docs/html/classaunit_1_1FCString.html b/docs/html/classaunit_1_1internal_1_1FCString.html similarity index 69% rename from docs/html/classaunit_1_1FCString.html rename to docs/html/classaunit_1_1internal_1_1FCString.html index 7e213da..f1e6890 100644 --- a/docs/html/classaunit_1_1FCString.html +++ b/docs/html/classaunit_1_1internal_1_1FCString.html @@ -3,9 +3,9 @@ - + -AUnit: aunit::FCString Class Reference +AUnit: aunit::internal::FCString Class Reference @@ -22,7 +22,7 @@
    AUnit -  0.4.1 +  0.5.0
    Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
    @@ -31,21 +31,18 @@ - + +
    -
    aunit::FCString Class Reference
    +
    aunit::internal::FCString Class Reference

    A union of (const char*) and (const __FlashStringHelper*) with a discriminator. - More...

    + More...

    #include <FCString.h>

    - - - + - - + - - + - - + - +

    Public Member Functions

    +
     FCString (const char *s)
     
    +
     
     FCString (const __FlashStringHelper *s)
     
    +
     
    uint8_t getType () const
     
    +
     
    const char * getCString () const
     
    +
     
    const __FlashStringHelper * getFString () const
     
     
    - - - + - +

    Static Public Attributes

    +
    static const uint8_t kCStringType = 0
     
    +
     
    static const uint8_t kFStringType = 1
     
     

    Detailed Description

    A union of (const char*) and (const __FlashStringHelper*) with a discriminator.

    This allows us to treat these 2 strings like a single object. The major reason this class is needed is because the F() cannot be used outside a function, it can only be used inside a function, so we are forced to use normal c-strings instead of F() strings when manually creating Test or TestOnce instances.

    I deliberately decided not to inherit from Printable. While it is convenient to be able to call Print::print() with an instance of this class, the cost is 2 (AVR) or 4 (Teensy-ARM or ESP8266) extra bytes of static memory for the v-table pointer for each instance. But each instance is only 3 (AVR) or 5 (Teensy-ARM or ESP8266) bytes big, so the cost of 50-100 bytes of static memory for a large suite of 25 unit tests does not seem worth the minor convenience.

    -

    Definition at line 50 of file FCString.h.

    +

    Definition at line 51 of file FCString.h.


    The documentation for this class was generated from the following file:
    diff --git a/docs/html/classes.html b/docs/html/classes.html index 8c66150..153c752 100644 --- a/docs/html/classes.html +++ b/docs/html/classes.html @@ -3,7 +3,7 @@ - + AUnit: Class Index @@ -22,7 +22,7 @@
    AUnit -  0.4.1 +  0.5.0
    Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
    @@ -31,21 +31,18 @@ - + + @@ -80,7 +77,7 @@
      p  
    TestAgain (aunit)   Verbosity (aunit)    TestOnce (aunit)    -FCString (aunit)   Printer (aunit)    +FCString (aunit::internal)   Printer (aunit)   
    a | f | m | p | t | v
    @@ -89,7 +86,7 @@ diff --git a/docs/html/dir_000000_000001.html b/docs/html/dir_000000_000001.html index d16f672..14d0d11 100644 --- a/docs/html/dir_000000_000001.html +++ b/docs/html/dir_000000_000001.html @@ -3,9 +3,9 @@ - + -AUnit: /Users/brian/dev/AUnit/src -> aunit Relation +AUnit: /home/brian/dev/AUnit/src -> aunit Relation @@ -22,7 +22,7 @@
    AUnit -  0.4.1 +  0.5.0
    Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
    @@ -31,21 +31,18 @@ - + +
    -

    src → aunit Relation

    File in srcIncludes file in src/aunit
    AUnit.hAssertion.h
    AUnit.hMetaAssertion.h
    AUnit.hTestMacro.h
    +

    src → aunit Relation

    File in srcIncludes file in src/aunit
    AUnit.hAssertMacros.h
    AUnit.hMetaAssertMacros.h
    AUnit.hTestMacros.h
    AUnitVerbose.hAssertVerboseMacros.h
    AUnitVerbose.hMetaAssertMacros.h
    AUnitVerbose.hTestMacros.h
    diff --git a/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html b/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html index a04c537..db29943 100644 --- a/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html +++ b/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html @@ -3,9 +3,9 @@ - + -AUnit: /Users/brian/dev/AUnit/src Directory Reference +AUnit: /home/brian/dev/AUnit/src Directory Reference @@ -22,7 +22,7 @@
    AUnit -  0.4.1 +  0.5.0
    Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
    @@ -31,21 +31,18 @@ - + +
    Directory dependency graph for src:
    -
    /Users/brian/dev/AUnit/src
    +
    /home/brian/dev/AUnit/src
    - +
    +

    Directories

    + + + +

    +Files

    file  AUnitVerbose.h [code]
     Same as AUnit.h except that the verbose versions of the various assertXxx() macros are provided.
     
    diff --git a/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba_dep.map b/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba_dep.map index 25f54ba..9de086c 100644 --- a/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba_dep.map +++ b/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba_dep.map @@ -1,5 +1,5 @@ - + - + diff --git a/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba_dep.md5 b/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba_dep.md5 index 1ae6e12..acfdfc7 100644 --- a/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba_dep.md5 +++ b/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba_dep.md5 @@ -1 +1 @@ -347b038f55607718478f88d64168d986 \ No newline at end of file +fc37d721c83e103f3808c7e509932f31 \ No newline at end of file diff --git a/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba_dep.png b/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba_dep.png index 392229bc26b4cc30fb6491a33227cfef7001aec1..634c7d3c52bbb8810ebf35865c1f9a522180f768 100644 GIT binary patch literal 2182 zcmai0eLNHD9(Ss9s2f(2Zb$Nxm&~P7t&DYO8;(U@%G+Vp5t1d$R@3azISi$|AM%nZ zuGqX3!!&8Pgu}4VFiV@)F)@tIwzGThKlj|ObD!t)Jiq7jdp^(e{XM_m_w)Nb$>&`i z)pzXQp`xOq?(78hP)fXVyiwbtoL6JR!j$5hD=v;u6~#aMsfwP!{sj7)5}I((?8|J|JL1>1DG7Npx$I`P2N#% z%1<-FjZb3YIR{^0!vfxS$seX3gS%QsvrskT`=a0ds(}TbpTYJ@OLNOI8N89o7CKib zBNAT78n`XDJ+kRP^Y_<@!`t@@7EV5z=U}SgqzO4fla>~n0ieq~MFI*6{sTQ{`bqaNmqcfs& zUxQ8;wxYsqKd?k%Di<;tRk(VqCr&c+ol95T+^fGFS{E&(h6e}30bV4tF@mChX(@z! z(f`f{zU|!o`>I3aE_U73fU}HB3;A>bwvOzDDx5sI*~ z>}f^Mko48s&Rrj@GA3OgO0>52PO>~~X7+Qp`7fh1H#aUFKZ4~uwZD4h&!A2Z_ zjqp+fQdZV`EBc!4t&VJQsxNn|3O4CXoXdalr3EtkXji5IjR(sai*!Y=z(*F$| zA9Ij!=jx@8rQS&Lc9}+yt56`#FkW<>>XS*at;-%);csU_W79jx3-%iA)n#QSsi`8R zbEr4)Rke%yVP4LM2*u0=Q+Xi!Kmr%2jO$kd1me?wabuJC{0EE78e@ZlKUH{|_Ig5{ z+BmJU)f_WP-@n${_x}&`Hn|;M6%!GG&F>blSTR;DHFjvI#a~k@goTCGSoB8iOBpky zXL+ZFhVH3eVo_*d)EW7`Lyl=1l%{ntoCi0YowJ45*d!=-YNH7{ut=qc0JY_1G>t=uohlS3CMC_z>Q0wTYJ&v`hu3bzzt^v5Iy(cC zL&ZYb#Dv@9q*^+}s=)x4zDVd^@+GsG-Yq zVKBE6(|m74Om*c*Zc)+Vbg8C4*}r=-2^ovB!jWztzJ^!wB_nsXp@`KT+kskS0U3D(P8GnJxN-7~sC# zwO%42JgpHzy*%myDhCpg8R@k+nMBoH1cfJax?t`*3zfJN6U;4B$@i9;LxL$i9c+MK zH_Y9_;>Bghl%JNA5Z7i{=GpngZT24;BUz)`NckSNti#l0YrLwwI>FzVldM>k(wMYU z1UmR=Psj{hHnnKC=?^b-@@55XifF zXn{im-Kk`Un<(?Zp5K_CTi;P=LxTE|`A47#Jzd@K8#l)4uMd&^slq53g+dVug*iDn z5{YDSaj|y-kHi9bFAj+xD7SR#vt<9d1NB$QK5IDBK0AAK5au^6}$K zIGkjc~D{5hV7;7zBZq`TQr$DOTulNO5&ZNj$M7u-diUh?JJ5 zQ9U#=IN0#{4mrX*EnOKx!m!0rk3A}=s8|an zQKH0Vdg*2ji;^$us8ieq-zJ>;Lfo==bFJ;Pd%Bd_ViV-Vd!Tjkq{OIhdH3xJ-=oZT@b;-wXiH{_Pl% zW39i#9ByNz%TzZizRJYJSz@9Oza7oIUc_xKV02+9>Ea0s;=p#3M^$3^u@l_#<|Do! zVy`H-WkbUGH{W7fgq+Q*Zh6i2KT5KhefoUd&3Zyk`YPHmMbI{7s@UJ`qQ9ykP2eWr z(XLgU#0un+A#;fT$GE-Xo149w*1Oij%+RuX zX1QO$5>$?2AfN~@PfbSODbKT{2%v8DUa>WkrEw5Ol_FowgfZsZ4--m)tSPa<(d(%*-x zwlRX{C@d@~9-l5|GN{dWGFZAOt0^yd6xvhxP;>FAl~PpQpaJkR{L(KeeK1_eOa3<= z0ER*&*MKA*=P)*DYWo4u+K7@i_2`BieCVT51`MtA&TbCQ4nu0|e&$6*mrpsCc$oAjn` z^x9eyE-j20ixZ5s{$#nixtTmOLq4pos9^g;zdX*>9=8VyS}0~C=U4Qnb2%?IjYake zxr--HRERD1rP<-GtJ~dRciZsIbJPgsHckElghHYFe`fhNm-Cl-Ag5QK<=G``Y^Pfw zO@}i#hvnsWBO=ul9Jh^dS1%j8C(&xTHow>}w|4oN;abax4qLFBr~mT3A8}!}E#L1M zFY8Xr%Oh(fPLvzWjO(0C0lt6dZH<6H+>I>~KC~iRQv(R6n|drYj!#(@l1@W3BkAW+ zQBnPQieg3EjNOEDqGGh*BPDladeIF=Fzqix@DKwzVb$LEXgZNxe<)j=T3P81bNRLo zS8}Ka4iEpKEpB{!!@1GbB>4Qf=z0_GO7M)fmX;QapmH(Wz(87$QzHf=`*TGImX=>| z;9vRrI$J{nZ;#SCFE2vZax~78@!a!O0Kv%6uz$MAVy0q?vA6>{-UY$*H^FO_=Hi4QKcuF|&; z085_#lmjH)#qbWwQh|hwJbjA6jVu*yxDn8x`4U=b#xr$`9i}T+B7K>&NQ+LPgu#qWeTWIgI-t!MRkI=^dCH@nqasC8e4#s2nM)5Zou{Pp+-=E z04XXuYd|~??_DlsECv_yQTSC40IP%HGeDArw<<=OidzMa8&X(BGOsJZhs=#0YoL|h zJB)a;!~9_AW?mG0&8rzP9o4jE}0ACxjxOr;$%zW7xsxa*5q1g&K=VYFXeT zbq{{l`aKplY~Rlhy(#RN#&az@Z1pv+h3v$)BvXiadwIDd#?`9+_<_rPqK#SGQq;;Q zcysUcdeME>a^YMp*IJ?!(jN!^7Qy{0FxK!@KDZN=j@xUAAS} zVIC&`3`n2DC{nB!e(fAg)yL&nwGLo8_+PC?=zt+)wtM1+M zahgz`_W8WR*-#vG1FC|Y)8zW&;K6@#^JHJyob81O0kCtxc!ud6kMgX9GB@b-p^xLb(*-w3_4<)b~{v+z! zJ>4AOi`QY8mrS~6M{zV(S97|o?iC5$!vUliSvP-j!-$4 zBIag?#0u9R;BI15$DQfOrUXUWM(Q1o*dV(2afNN1-jsz{uF`tVZ&Nr#BS^Tk>=^#? z`ZR~OganV@$Jk*~)w@m`iiq_j(K+NpA^>9pQ;WR@Eq&>I4{riGsldm<7VLZZ`0hI9mMnCQi;x*7C(I zLjM|@j_Fq^VUGC-#~q~pcB)az1sP%bym zS?f`_8brRrfiR^D>6Mby^rHn_vVbv!_$&p6|-SP+#? zZ>}Z3P%$tgR#qmzwyn^Oj@C5CsW3M-HU^oOyn00_{dsyCt*D@o+7Z68b|fY$y7S#| zo5AQE8{>{oNRZUlc7xn`q#p!GRL`T9z`kWeNY-835QJB6Tkh@2!j zetYpk+!%qt_>%MBj*c75nKcbQG5Hr_5s2(>IkvX85!8r?h{FuNm9dvm1#l!%DLOV* z*WCQvNU@gKS)0k_6p3NEgqNd(KK`{Kv#r60`*dq->tpReR_`k=;wI&HW{{AsR zBIb`DUx0OH5uMvWRn^s!YHBt{e4??Z%m%G}mK;aqIB#!nPoZ#IN7i7n_YJ(eQC7(Gc|+#w%r|A^C>bE$aT(66N#f(xjo*#4)$-L@fXSaF-i!RyQv0hD*nNgTm+DjVU@c zVjg2T)5-$_1Fd&xP^Q)gMJkGliXhiC#aBM;s|4p`5D3&Nvl}(pSj*XYRR=gn3X$00 z7K^wq(U7i2+{xb~Tt!TJ^P?O;gi&Rv;=evPJ;Retv3gMWiV9+~1mJ3SU!24a!^AWS zN>dwimM9jK>myHFXF_RfrQ&2VGb>2W$vlWJVHc|3Uz%QdukvybFVr9wKgH}6G8cZ{&>Dd ztp$ay!?SSM6*!U5l#Yh+5E_2?Z zEPD^u;_%_la_&rMC5Sq508limdvJyab$|<#m!ZxH4htpY$wOJrs_>OotG7(2EJaw( VLs031?7!;HWMW{cU#IJV{twE4#~T0u diff --git a/docs/html/dir_81cd3825682eb05918933587e078c005.html b/docs/html/dir_81cd3825682eb05918933587e078c005.html index 0b1bcf3..ca7bc56 100644 --- a/docs/html/dir_81cd3825682eb05918933587e078c005.html +++ b/docs/html/dir_81cd3825682eb05918933587e078c005.html @@ -3,9 +3,9 @@ - + -AUnit: /Users/brian/dev/AUnit/src/aunit Directory Reference +AUnit: /home/brian/dev/AUnit/src/aunit Directory Reference @@ -22,7 +22,7 @@
    AUnit -  0.4.1 +  0.5.0
    Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
    @@ -31,21 +31,18 @@ - + +

    Files

    -file  Assertion.h [code] - Various assertXxx() macros are defined in this header.
    +file  AssertMacros.h [code] + Various assertion macros (assertXxx()) are defined in this header.
    +  +file  AssertVerboseMacros.h [code] + Verbose versions of the macros in AssertMacros.h.
    +  +file  Flash.h [code] + Flash strings (using F() macro) on the ESP8266 platform cannot be placed in an inline context, because it interferes with other PROGMEM strings in non-inline contexts.
      -file  MetaAssertion.h [code] - Various assertTestXxx() and checkTestXxx() macros are defined in this header.
    +file  MetaAssertMacros.h [code] + Various assertTestXxx(), checkTestXxx(), assertTestXxxF() and checkTestXxxF() macros are defined in this header.
      -file  TestMacro.h [code] - Various macros (test(), testing(), externTest(), externTesting()) are defined in this header.
    +file  TestMacros.h [code] + Various macros (test(), testF(), testing(), testingF(), externTest(), externTestF(), externTesting(), externTestingF()) are defined in this header.
     
    @@ -89,7 +92,7 @@ diff --git a/docs/html/doxygen.css b/docs/html/doxygen.css index 266c8b3..4f1ab91 100644 --- a/docs/html/doxygen.css +++ b/docs/html/doxygen.css @@ -1,4 +1,4 @@ -/* The standard CSS for doxygen 1.8.14 */ +/* The standard CSS for doxygen 1.8.13 */ body, table, div, p, dl { font: 400 14px/22px Roboto,sans-serif; diff --git a/docs/html/dynsections.js b/docs/html/dynsections.js index 537e3e4..1e6bf07 100644 --- a/docs/html/dynsections.js +++ b/docs/html/dynsections.js @@ -1,26 +1,3 @@ -/* - @licstart The following is the entire license notice for the - JavaScript code in this file. - - Copyright (C) 1997-2017 by Dimitri van Heesch - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - - @licend The above is the entire license notice - for the JavaScript code in this file - */ function toggleVisibility(linkObj) { var base = $(linkObj).attr('id'); @@ -38,7 +15,7 @@ function toggleVisibility(linkObj) summary.hide(); $(linkObj).removeClass('closed').addClass('opened'); $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); - } + } return false; } @@ -60,7 +37,7 @@ function toggleLevel(level) $(this).show(); } else if (l==level+1) { i.removeClass('iconfclosed iconfopen').addClass('iconfclosed'); - a.html('▶'); + a.html('►'); $(this).show(); } else { $(this).hide(); @@ -87,7 +64,7 @@ function toggleFolder(id) // replace down arrow by right arrow for current row var currentRowSpans = currentRow.find("span"); currentRowSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed"); - currentRowSpans.filter(".arrow").html('▶'); + currentRowSpans.filter(".arrow").html('►'); rows.filter("[id^=row_"+id+"]").hide(); // hide all children } else { // we are SHOWING // replace right arrow by down arrow for current row @@ -97,7 +74,7 @@ function toggleFolder(id) // replace down arrows by right arrows for child rows var childRowsSpans = childRows.find("span"); childRowsSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed"); - childRowsSpans.filter(".arrow").html('▶'); + childRowsSpans.filter(".arrow").html('►'); childRows.show(); //show all children } updateStripes(); @@ -117,7 +94,7 @@ function toggleInherit(id) $(img).attr('src',src.substring(0,src.length-10)+'open.png'); } } -/* @license-end */ + $(document).ready(function() { $('.code,.codeRef').each(function() { diff --git a/docs/html/files.html b/docs/html/files.html index 1e2784d..fd9f41c 100644 --- a/docs/html/files.html +++ b/docs/html/files.html @@ -3,7 +3,7 @@ - + AUnit: File List @@ -22,7 +22,7 @@
    AUnit -  0.4.1 +  0.5.0
    Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
    @@ -31,21 +31,18 @@ - + + @@ -72,25 +69,30 @@   src   aunit  Assertion.cpp - Assertion.hVarious assertXxx() macros are defined in this header - Compare.cpp - Compare.h - FCString.h - MetaAssertion.cpp - MetaAssertion.hVarious assertTestXxx() and checkTestXxx() macros are defined in this header - Printer.cpp - Printer.h - Test.cpp - Test.h - TestAgain.cpp - TestAgain.h - TestMacro.hVarious macros (test(), testing(), externTest(), externTesting()) are defined in this header - TestOnce.cpp - TestOnce.h - TestRunner.cpp - TestRunner.h - Verbosity.h + Assertion.h + AssertMacros.hVarious assertion macros (assertXxx()) are defined in this header + AssertVerboseMacros.hVerbose versions of the macros in AssertMacros.h + Compare.cpp + Compare.h + FCString.h + Flash.hFlash strings (using F() macro) on the ESP8266 platform cannot be placed in an inline context, because it interferes with other PROGMEM strings in non-inline contexts + MetaAssertion.cpp + MetaAssertion.h + MetaAssertMacros.hVarious assertTestXxx(), checkTestXxx(), assertTestXxxF() and checkTestXxxF() macros are defined in this header + Printer.cpp + Printer.h + Test.cpp + Test.h + TestAgain.cpp + TestAgain.h + TestMacros.hVarious macros (test(), testF(), testing(), testingF(), externTest(), externTestF(), externTesting(), externTestingF()) are defined in this header + TestOnce.cpp + TestOnce.h + TestRunner.cpp + TestRunner.h + Verbosity.h  AUnit.h + AUnitVerbose.hSame as AUnit.h except that the verbose versions of the various assertXxx() macros are provided @@ -98,7 +100,7 @@ diff --git a/docs/html/functions.html b/docs/html/functions.html index 5003433..272dd2d 100644 --- a/docs/html/functions.html +++ b/docs/html/functions.html @@ -3,7 +3,7 @@ - + AUnit: Class Members @@ -22,7 +22,7 @@
    AUnit -  0.4.1 +  0.5.0
    Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
    @@ -31,21 +31,18 @@ - + + @@ -106,8 +103,11 @@

    - f -

      - g -

        +
      • getLifeCycle() +: aunit::Test +
      • getName() -: aunit::Test +: aunit::Test
      • getNext() : aunit::Test @@ -187,6 +187,21 @@

        - k -

        • kDefault : aunit::Verbosity
        • +
        • kLifeCycleAsserted +: aunit::Test +
        • +
        • kLifeCycleExcluded +: aunit::Test +
        • +
        • kLifeCycleFinished +: aunit::Test +
        • +
        • kLifeCycleNew +: aunit::Test +
        • +
        • kLifeCycleSetup +: aunit::Test +
        • kNone : aunit::Verbosity
        • @@ -196,18 +211,15 @@

          - k -

          • kStatusFailed : aunit::Test
          • -
          • kStatusNew -: aunit::Test -
          • kStatusPassed : aunit::Test
          • -
          • kStatusSetup -: aunit::Test -
          • kStatusSkipped : aunit::Test
          • +
          • kStatusUnknown +: aunit::Test +
          • kTestAll : aunit::Verbosity
          • @@ -260,13 +272,13 @@

            - p -

            @@ -329,7 +341,7 @@

            - t -

              diff --git a/docs/html/functions_func.html b/docs/html/functions_func.html index af967ce..c0bbbf9 100644 --- a/docs/html/functions_func.html +++ b/docs/html/functions_func.html @@ -3,7 +3,7 @@ - + AUnit: Class Members - Functions @@ -22,7 +22,7 @@
              AUnit -  0.4.1 +  0.5.0
              Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
              @@ -31,21 +31,18 @@ - + + @@ -106,8 +103,11 @@

              - f -

                - g -

                  +
                • getLifeCycle() +: aunit::Test +
                • getName() -: aunit::Test +: aunit::Test
                • getNext() : aunit::Test @@ -202,13 +202,13 @@

                  - p -

                  @@ -268,7 +268,7 @@

                  - t -

                    diff --git a/docs/html/functions_type.html b/docs/html/functions_type.html index c7c2046..d7bf820 100644 --- a/docs/html/functions_type.html +++ b/docs/html/functions_type.html @@ -3,7 +3,7 @@ - + AUnit: Class Members - Typedefs @@ -22,7 +22,7 @@
                    AUnit -  0.4.1 +  0.5.0
                    Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
                    @@ -31,21 +31,18 @@ - + + @@ -73,7 +70,7 @@ diff --git a/docs/html/functions_vars.html b/docs/html/functions_vars.html index 501e3df..8a719ad 100644 --- a/docs/html/functions_vars.html +++ b/docs/html/functions_vars.html @@ -3,7 +3,7 @@ - + AUnit: Class Members - Variables @@ -22,7 +22,7 @@
                    AUnit -  0.4.1 +  0.5.0
                    Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
                    @@ -31,21 +31,18 @@ - + + @@ -79,6 +76,21 @@
                  • kDefault : aunit::Verbosity
                  • +
                  • kLifeCycleAsserted +: aunit::Test +
                  • +
                  • kLifeCycleExcluded +: aunit::Test +
                  • +
                  • kLifeCycleFinished +: aunit::Test +
                  • +
                  • kLifeCycleNew +: aunit::Test +
                  • +
                  • kLifeCycleSetup +: aunit::Test +
                  • kNone : aunit::Verbosity
                  • @@ -88,18 +100,15 @@
                  • kStatusFailed : aunit::Test
                  • -
                  • kStatusNew -: aunit::Test -
                  • kStatusPassed : aunit::Test
                  • -
                  • kStatusSetup -: aunit::Test -
                  • kStatusSkipped : aunit::Test
                  • +
                  • kStatusUnknown +: aunit::Test +
                  • kTestAll : aunit::Verbosity
                  • @@ -124,7 +133,7 @@ diff --git a/docs/html/globals.html b/docs/html/globals.html index dfa0309..b671a3b 100644 --- a/docs/html/globals.html +++ b/docs/html/globals.html @@ -3,7 +3,7 @@ - + AUnit: File Members @@ -22,7 +22,7 @@
                    AUnit -  0.4.1 +  0.5.0
                    Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
                    @@ -31,21 +31,18 @@ - + + @@ -66,194 +63,211 @@
                    Here is a list of all documented file members with links to the documentation:

                    - a -

                    - c -

                    - e -

                    - t -

                    @@ -261,7 +275,7 @@

                    - t -

                      diff --git a/docs/html/globals_defs.html b/docs/html/globals_defs.html index e4984f4..740aa47 100644 --- a/docs/html/globals_defs.html +++ b/docs/html/globals_defs.html @@ -3,7 +3,7 @@ - + AUnit: File Members @@ -22,7 +22,7 @@
                      AUnit -  0.4.1 +  0.5.0
                      Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
                      @@ -31,21 +31,18 @@ - + + @@ -66,194 +63,211 @@  

                      - a -

                      - c -

                      - e -

                      - t -

                      @@ -261,7 +275,7 @@

                      - t -

                        diff --git a/docs/html/graph_legend.html b/docs/html/graph_legend.html index 47e4513..71a4983 100644 --- a/docs/html/graph_legend.html +++ b/docs/html/graph_legend.html @@ -3,7 +3,7 @@ - + AUnit: Graph Legend @@ -22,7 +22,7 @@
                        AUnit -  0.4.1 +  0.5.0
                        Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
                        @@ -31,21 +31,18 @@ - + + @@ -101,7 +98,7 @@ diff --git a/docs/html/graph_legend.png b/docs/html/graph_legend.png index 881e40f9c0a2ade46e1af7426db5583529540416..c9415d45868fc800b20a59f7c348816b3ae67086 100644 GIT binary patch literal 18497 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 literal 25694 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 ALjV8( diff --git a/docs/html/hierarchy.html b/docs/html/hierarchy.html index 162c42e..0a72ec0 100644 --- a/docs/html/hierarchy.html +++ b/docs/html/hierarchy.html @@ -3,7 +3,7 @@ - + AUnit: Class Hierarchy @@ -22,7 +22,7 @@
                        AUnit -  0.4.1 +  0.5.0
                        Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
                        @@ -31,21 +31,18 @@ - + + @@ -71,14 +68,14 @@

                        Go to the graphical class hierarchy

                        This inheritance list is sorted roughly, but not completely, alphabetically:
                        [detail level 1234]
                        - + - +
                         Caunit::FCStringA union of (const char*) and (const __FlashStringHelper*) with a discriminator
                         Caunit::internal::FCStringA union of (const char*) and (const __FlashStringHelper*) with a discriminator
                         Caunit::PrinterUtility class that provides a level of indirection to the Print class where test results can be sent
                         Caunit::TestBase class of all test cases
                         Caunit::AssertionAn Assertion class is a subclass of Test and provides various overloaded assertion() functions
                         Caunit::MetaAssertionClass that extends the Assertion class to support the checkTestXxx() and assertTestXxx() macros that look at the status of the named test
                         Caunit::TestAgainSimilar to TestOnce but performs the user-defined test multiple times
                         Caunit::TestOnceSimilar to TestAgain but performs user-defined test only once
                         Caunit::TestRunnerThe class that runs the various test cases defined by the test() and testing() macros
                         Caunit::TestRunnerThe class that runs the various test cases defined by the test() and testing() macros
                         Caunit::VerbosityUtility class to hold the Verbosity constants
                        @@ -87,7 +84,7 @@ diff --git a/docs/html/index.html b/docs/html/index.html index 2d6a2c7..c627b20 100644 --- a/docs/html/index.html +++ b/docs/html/index.html @@ -3,7 +3,7 @@ - + AUnit: AUnit Library @@ -22,7 +22,7 @@
                        AUnit -  0.4.1 +  0.5.0
                        Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
                        @@ -31,21 +31,18 @@ - + + @@ -73,7 +70,7 @@ diff --git a/docs/html/inherit_graph_0.map b/docs/html/inherit_graph_0.map index 61498e0..697fce5 100644 --- a/docs/html/inherit_graph_0.map +++ b/docs/html/inherit_graph_0.map @@ -1,3 +1,3 @@ - + diff --git a/docs/html/inherit_graph_0.md5 b/docs/html/inherit_graph_0.md5 index 2870d63..f29c801 100644 --- a/docs/html/inherit_graph_0.md5 +++ b/docs/html/inherit_graph_0.md5 @@ -1 +1 @@ -171fa8cce96f15bbeb44613b3afeea9a \ No newline at end of file +43f405a8da6b72d437c1596f2981b525 \ No newline at end of file diff --git a/docs/html/inherit_graph_0.png b/docs/html/inherit_graph_0.png index 3f2bb9cb56c1302cab83d20ff2f49ea5971fed50..6eb201465a6ea1289c538ddf9e846c99e2548488 100644 GIT binary patch literal 1781 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 - + diff --git a/docs/html/inherit_graph_1.png b/docs/html/inherit_graph_1.png index 860fb0cdf5ecee5c87962977270363080ed80134..de15f9c51b1a374a37748b6f11ef689103c895bf 100644 GIT binary patch literal 1067 zcmV+`1l0S9P)$SK~!jg?VCSHa$gw7zxPcWBJdhSDn><6K~UfjwYEh=L}6eQ#SNO?xk#4_xp(_uTV* zJzvis4_uCj2n;oF{^z$9FqFg0QW4B76~W9>5t`D#%gYNkH#hP9{rwwy7y!&>GxqlO zWO3QZdU$xi+1Xi3L^0$;@i<;zU*YrlAW0IImzV!HUp4C0@?%g59*>90gntb|5Ng%~fCND(ip63v0zk=R zvZY#TrAq&Me`I7`US48sYz!S89q8-p!{Ol}0QvM%TIM(o7Z(?>SS;Xq9=p4{vU-z~ zlK=pt(O9t^CDT}2TN?mClB9h7o0}W-_xHo?b}Q0VPKzW-*xK4cZ*MQUy1HPu+mX#? zWjStdZ7>QQMT$nF6buH*VzJQL+L|nfD2j^uv)agN*sN?eOHWTvluoCKi0JO_EYWA)ulDwKnx3Af=jZ35HiN-n-MVrN4GmE|9?zGrudiu*d|Z}8Db>uX zc-*8EtyYUjBm%qL4p9^_Iyzcy6w6{JlL-Kz(KIZj2tg1qI5=3f&dA6}#d}J1MWay| z42Gf@&-03M)Jnr^RyLc({QNu|4hQ^xKaP%$WOZ^U__0__F5u7aZAhybp;VX2WP%_F zAR-VE5{U%v@9!1msFj9$DxFRvlgU7%(IAt_V0(KT0FX+hpwsC90B*M%sZmayT4hFc?U$*VD?%3W=gv_cp(&8w|$J()9mXjMl)+QW4B76~W9>5zH(V z!OT(-%q$gA@hs&0{JfPq82?dtR8@-1ETho~jYb2j)!I~1jLMkJ=CW~)h`pbs64?7$ lYJ!=iBA8h!f|;cv{sPeA4SH%Y9SQ&d002ovPDHLkV1iO#^!ES& literal 1538 zcmV+d2L1VoP)Px)yh%hsRA>e5TUjWjZy0|V#!MMoF_tWoWXpQNM3$1IFbK(wI~OQX+*nFY#Auq7 z$exBoLXka6N;EF!f=QTUX6%%GiTD3L@4xTsEZ;eE7R;xB)}xVo|y)onYc!Z^3KoC!{^VR6}zSO6KlZK)D&7< zTa|WIa*118ThQCvt29vRcsdQNudl=4;Gp1!N*2bA>gnm>s#5vH8fa)}fa2m}!CjRs zOmLLcDH;t(fQbeQ%>cT3xnX`U?rZIIz($>*VotZ?b|oFzrSbt^7i(I z>FH^Wbl2YA4&T3j2O}dR_SxLrgs7+}$jZu6Ie%qkMGj<@11UorS=6ng3-3WK?C|gq ztgNiSz`#IjSJQ> z@afYhFgG{n`>(F9SiPmCh3}KC;J%iYmU7P|Bn$rNaeREto?mu8SLgP5_39PZrBnGJ z7B)6E1|A+B;O_1YZ{NO!f`S5G7<5BjU0r;;t*s3rA|hBDm6w{D3MnZmU}IwgZ{ECt zva&M9`}y-HSXfv90_pGX54*d&keHYVXgx@{2KPp0d3hO}otH z9l_Pr6{e=9*jS-`gk;mI4}TAnC3<1T-^XOT{#p+V3?$v%-GsU?^85F1LKRP_J7e>_ zyu3(9M+d(~Q&SUp|NcE|S5#E6y(kFe?(U9!`SOJr8X6L+ShBXZ#(1Zvr);dPtt}ZH z9p%@luC6BI@^%^8DE{-H5BrqO+$;vV^GQyr0_rT}x>+2&gU%q6r2<^i! zqNY+`Ur(r~5*ksjw}oMhK?_PtON0IWeRj$*N%-;Oheih{C@2UrGc$n#1=-ozY>qlh z;TA0{EQILjXx2n4z~lt2n<^XWkW+l{9fwz;Rk70(L08rqVc^Kx&^GGl3u)cp>li0 zIE1c{BaC6VhT<5GuT6=7$;L3DxjsHVLfx!SR<75tUjrsVLbS250r>uvbA#L%E@oj{ z-9FrSO-sE2TUuIz($Z2`TwDZSUthK_o-mFO0P60zCg20gk}e5~?EJ^7YbqB48yOi1 zwY9apDCi+D?qSS)XwusyV#ZiyxfU~g~FVh&zlbs@|oG1ehaNaf|_>>yyB26xEK&4uml zZEQX|$;yIp7w>qOC1a+Vo}LagY2Xj=gA1dWis+Ih;uNQadL9vnmU(w zFB1zX%7U3Hejc0jc8QNIptQcc1|-1b^&$F}1eoX{k{3_{OkN+NZ%KfO9wK=GRc49! zZcw6sqXGOgH&vtr7+!$!WvN8}P6POA58ufOkpbTFgcwqvC^aDcyOAhiQ6rR;bf{5| o7+DfvVnjuaOcG#flp{vgf5TvVB=Gc1pa1{>07*qoM6N<$f=^@8p#T5? diff --git a/docs/html/inherit_graph_2.map b/docs/html/inherit_graph_2.map index bec9046..541c003 100644 --- a/docs/html/inherit_graph_2.map +++ b/docs/html/inherit_graph_2.map @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/docs/html/inherit_graph_2.png b/docs/html/inherit_graph_2.png index 9f6f8671b69b96609e7bf8ed395f64ccd1a14004..322974af328806d59559f9c796f85a325183df96 100644 GIT binary patch literal 6579 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 literal 10209 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 gIlGpnmLA|OtlY - + diff --git a/docs/html/inherit_graph_3.png b/docs/html/inherit_graph_3.png index 404cb386f30360ef693ab8d5d881ec63d60e0bd7..6adea53a8b8dd1c5a2c421483a8ee0562a3a8da7 100644 GIT binary patch delta 1261 zcmV5A+F;7k?!P0ssI2`Iub`00006VoOIv0RI600RN!9r;`8x1gS|xK~!jg z?V3wSI$Ipae}o_J9hc0#~_eRTM2G$OJdNwgoOCiWUVegqBGVVJ##f4SHE!o`Z_mPc_81~NTt%bxj6uMczCF(sYyRrqtVbbP1Cf);Q#>o zZeRYs!`0OIj@Fc?ffSR#=~BoY8% z7zO}jGFi6a@F+DkHLM?*Ot!MJQd?Ua36rVv1Q12b;~7 zWWfoC!+#=?XmWDW@Aq4+RseW@e!jcAOWeq91Hj10$ji%%*=z=Yr>CdHRqil^P$(2K zo6UF|_sL>38i$96eLkPt?N+H&Gcz*`!-&P=_4Rd{rnk1XL?Tfn5=pud09-B?!!QiP zJU%{7Pfw4JkK-ZImypVcr^Nah7#OhGYz)JspMO~Pz=mtdTANrbc6)mpi9`@W7Z(=* zaCdi?rm)k~Q-sjR$4Amge7e(s4{mL3rD>XNA0Hogb#;Y8A&Ep{GMU)i7>0?*V>k`a+>l8V^N9MSl|$6K=OVw-Rt8o)T-%`FEN1#6=>JXf!Gm z3Zv2J;^HCzyuQ9t6a@eli{T-C=iRqNl}uJ$z$ z!BAIMS5Z+hIy%bkv{tLNsi~>3uu!Q~9v&XzQMmaagyQiyMNuA)hwWxqLMkJkQdWB^ zzTXHCXKl6H?K+(fkuPt419s=*{$@c#&eQk{(T2YeZTJh(hQAPP_zTg7zYuNs%MZs1 zNnc43@`KOkYiMZTTE1x`m&=7h;g83Eggl^DtGQhPIR)S?WWV7rL>vA>wBavA8~*Ya XEvWELF#JL=00000NkvXXu0mjf+#Y45 delta 1933 zcmV;82XgrI362kt7k?xO1^@s6y`~xY00001b5ch_0Itp)=>Px+NJ&INRCodHT4!h! zTNM5hW5X6T_LeA?Sg@cX5;dSAnu1Cc3u098hXqj)QBX)wL=6d|qCXM~sE8$rCV_~U z1pQ$FD_9U)uwn1L?3?dA@4U(GY-Y2&8uRuZn4LTK+_~qTGk@oN=iHeMa~T9p+5+A! zkRI-xr#adJ|5`vhiS`6X3uq^CG?5;lokaV9qXi<|N1Qox2AP?e?%n!21T4_5T{~oD zWqD}ofh70u-^am&2R#Prj{mm>u3fu^W5FLBsMz@?Hy9-){eXqnzsyv1!vL zynp{5bUYq(>gCIqBQ7pZ`u&yjH{KUiBzf`T1)4Q$hOn@(D(gyv*REaLL=C>!Id$rk zIS(Jq*RNmAYj2IEOP89g#ful?;>C;Dym_?t_>*DFtr)b)=sjNrw z?c}dqxqlL!J9kz?WWB?O568)qCoyi^IJ4iW;jX)NJRSSpyLX6;jI?%3n}PKG`*$>G z(7=Poj?bSzOMkt3^=$dRb_NAW_!6c^j~?jWy*pa9YK0|BmYDMU_wSE=`}UdFJ9qBH zh!G>?dgI28m^5h;Qc_aTvSmww>D8-O3-9jTyMJOB8n9o#ejvn;A3q+ucI^^A=TL8k z`68%Or%t$e^QQ1B``Nm6t2jW14js^?OBb9tal#y4Qc{8e0|tPoLBliMk?iD~H(44z zd-fE^Qvbg2SNGeuZ=-SJ#@MoD3tF^jf#%Jd3qrkp`&Oj!Jay_+G-=XA>^)}87|^jv zkAEILl0c)K8E8b)Kq)9r!iY*sOT)8g&v5C|C1hu34JRfaqiqXsed~jJa`~Fxy$GH8#iv?%9Sf}Fi_^tpD)Ow zg1}$hIXBURNXj?hXV0F+ty{Nn^ypEtK!kk!_%W_uzYZc?n>KAQZQ3;9(LpIUCnraO zGd@0E`UCk1INh)YAX0Se)=iAdXl9{F12QU|Xz<{{m^pK%44XG^o}dutU?Er;Eq`0K z%w*F@EO4D@`}XaaIB_C|3>kutA3uT-NHi%dEX15Sb5N^RE$rE|2VJ{%Mc=-CB_*-m z@J6#{&60YA{MWBv%bXiFY;at=n$Jmh&P7BUIB+0_4jn2sWeOph=H})K`hNTN4GR}8 z#GpZgpn{6?v#=gEY?u-i(Am2Me1DuaJUkpnjvN7DoNXGH#`Z=EMHHWDMiFZg&fz{r z@dG{IxpPM%)0$#9r^?-gXr?PoHk4G&|X+PoFkx5=Jl)m1s13_H0QJ?)SLs z<)pinU%!5RvCF-C_XK4bP_&gIrWQJ?a%zRLiXX`NKPi6B!nCq#)hZMe6n}tq1XF^w zkfI{ibi)T_C4Y)s>-|+})95p1%n(N*jPszw5UQEtxK4iDq_KDJ-Yo}HlrKa*h;DQi z)<~p4b+R{BUQBpLjEx5aUJ2|ui=V3iT3YP9xS=>Exo6XcoIdpC!7}4u@1zf;R!lIKq z8}1fjVqzo`=gyrgQAMX%v}h3+jcwbu#puzaF=4_4tIj^RxdUSDLVxEVu~4S-kyu(Za-^)6yCD|4+qP{J2j@1CMJrPcp_&hvyOXhF$I5K(^6fW1HwQb}udinan=bFm??tqtN1?gw6pt|s$3gE=ZcMuwYw!P;KEgTZ*+9DYRZ|&p@>i&jC^VL zLP^P}%9*<%9(L5ab!+gjBY)%vOLzD6uwLPNnLj}Rr<*^qNPjJ(dM%)xqVZW&lFey TdP8Rb0000 - + diff --git a/docs/html/inherit_graph_4.png b/docs/html/inherit_graph_4.png index e50b687a3f91a96febddaec4883f9e726562d0c4..07acfbdab21e08d9b56ece66ec573e341777cebe 100644 GIT binary patch literal 1606 zcmV-M2D$l(P)&os=TbIvT2K~97YQYi8ij!``GQN! zUTzApK^B=oY0&645hBzJapJZ(=8awy6~o?!L^2G?%@?M%fh#w6n48<4|HXmBahv{~ z)(+(PT>Z}XJm)#z=eu*B=kPELAp{)Jg~zsmtq2!73vi*c02ew7;LL;R>FK7XCcod$ zmYaW)n3x!qN+pxYXl2EdZZH`7`ud`6>R+d?ug_pGFcmzskyfjXmY*#FhG9VpH>a}z z7di`Yp|b!NItxTQbhFtUy0EN9dwY9oYHHB#kW40PZ*TvzH~Qn3uT8W=7YGD*@7@J~ zsi`TENVIn2ii!%W)%xMX2U_{^<%`8)Ie-5A-*p+G&q#@O=zI3;QK?h_5C{b3=jYdM zoRpN5pP$eCge3?fFE39l7XMwB5&DdjjfCFc-+%b<;e><)sZ`q5)&?tIMrMs+7(oy@ zIXMD>;L)Q;%(KUi9Rq-rl$6k`n00k^wN9rC1On6{K@e3{RaEWs`I?)X)6&v*@7`Ts zU+?vLsSDq}eJhj6-oJkj0KL7va=APyDe1eZ`rb8~978UTL%`eibi=nI)O09001E-Wl`baViK-EODPGMgcU91cfEM@QH?E-p^5 z*CT|+$H!x0Vr(`WbxNgDm6w-WEEc2Dn3I#!*w{$*dG_pCjYcy%Itl>!`S}wQ69$7J zD=Vw1sRrGOSO%UN001 zeLf#TNUc^MI&^65tmqIl8qEqN($KwL@A&vQNs6}U)z#H6Uc3kd0t7)+R#wuw#bObQ z#TbTR7*<$VI5RUt=?4xRpxb0-X42x%pFeFjo6qOV$jG2Xxm-RwJG*n|&f(!(vsWl?(Xik*=%)nb*E3Cb~qfXnW?C#AP7RM)gC{7JT*0S zV|}~dOG`?nQY;ql+O_M_rAscCE3^}xPA8YkMIzD7 zn>Rfk4?^ho@81_MUK9$25{aa-v5^whYIS;gdR$!G!Gi|}1_qcOf_x%`u3x{NkdWYX zI{!B)df=N~NI9CDn=f3ru>SU;p>KSB+k$vJo*zGcbai$0_V#Y3A8x}d0zQBKeDvti zD_5?ZJb7|6{culu1mxxA+3oht_rpEuEWm}%0$k`Uz=h5NVHQ%IP8WS2TMOn#yI!x~ z%+3@?Sa2Mtwx($?#Qi@#>Tq*93vi*c02ew7aG|rne~$n#@w?CL$p8QV07*qoM6N<$ Ef+X|_IsgCw literal 2053 zcmV+g2>SPlP)Px+zez+vRCodHT4!h!K@@(8iCD1rUWmO57DN%Ti-`q$MMV)26e}nOVnb9+K*a_c zMMa{)h*(hq>JPDty({)E_Wpd|BeUM^-R16b7f5pZ;IcD2Z)WH9Z*~*KLgY|HXdpTw zq;!N-4LHV*AV+YF?HD_PG!Q|e#@J;&efl)5TD8i4+v(>s4GbDIh=vRq;4Hz&tNryr4UG?kGRr zZPcw>H{iKBWelsa-@biIIsJ(C`SWMDD6Uqm8l60Ol8P2Bs}jn5hx+p6i`BO`K79D#cI(fdKR%6)wH`fsWI3nnL^v#r z>q?_WjiQw+SL&@_zkU&Pm)jH;W8)Ctuwg@L(4YZTs#J+)%$Q;AyH%@Jv~%Z9tG{K- z7V6x&v-Vf4SV4ma4<@|rfgwtiD4|h_K}2Th(xnMb(6VJqdinAt_3z)GQd3iPF4iz_ z`mSHUPPJ;)qT9D`Q*?ARjTkY)!`OIHG;G)~iiwG#j~_qM@ZrO$RH;(BUpT<4SFd#4 z)vH(Qo2SvEM^l|Tb@U$ozL7pKjeH|w6@0EQ+{o~$yNevYsBp6yB^ z6uxh}-tyaS-MTgJ+O>nl9Iw=EdKiSD@%>ku}_~qDX%Dz4<9~kt+Rajaz1+WsP>;dd&YC-%wdTh?O(op zS?5Zc)V`!}?Vme$PW$7>k7scfzJLEdOGNV6v17Sw*RDF2oSe+Dv9T-)<||jO=sn34 z3^}kao;7gbK<#7C>({SmaSE0+ue^d8SV{@syLV4zC{v~kONL;{O1x~@GVai!gYrT4 zUcGv0`^1S8T(V?IZHsfW7@ZFtI;4FuI+rU~jpgs z`ZzN)lgpPc&pUSP(1-amcH6dXtxZ88F!rTOm;4&rn&hL=ym@n8vSf*lN(SLZjT&kD z+qZA}3@8tZ#Scyp6&0mMfw5s+$Ylt97|Ia%5fE^qcJ11!qnR;W>(#5rYuB!2I9uVu zg&EI>lOPzrfB&wmzKo5*kt0X)gb5Rr4-PFEMV(S_1n|d~u|rPdNSpii?W5YYYm*30 z5}j12P$8e0#$I=kz70u4X&ScknDJn)NW-RXBZZF{Ge)NasG){VnKDI756Tb915&K1 z(Ex*x%auBH>ST4BHETxV9Q6A2Yr=Yv+m%pKP@|FVw{G34`@s6*fOPQSL049=!njAD+VLx&RTuVfcDetV~T_wI@)f{q*RVkdUDJ zs!*W<_36{cD_Td?BAa1-5HcgcFlU}{rV~cQuNugXKCZcjmkcM{(M~n9>gl3)@7{!S zf0Zg#2uL02SZcL(oHWmC(V_(*s{qNv0YOORIAx3*H_otyezn*8U;&z$FGnSQ|Ngz{ zDk=vc0RebP2C&9*+Q9lir{N#~F!|=I2;1z_-?{*Ew{G21pk?O;Si5-fq6NUrIM%*# z=k9P3u!Nix zf?5t(1QG6y5b^lg377;?9|*}2OWA;f)~#DdsPTyQa8bxgilt8@Jm3ImM zZ-${2w#W{{UYsSeG;sX*@m$e`6WO_<*1Wl>W9+ - + AUnit: Class Hierarchy @@ -22,7 +22,7 @@
                        AUnit -  0.4.1 +  0.5.0
                        Unit testing framework for Arduino platforms inspired by ArduinoUnit and Google Test.
                        @@ -31,21 +31,18 @@ - + + @@ -70,33 +67,33 @@
                        -
                        - - +
                        + +
                        - +
                        - - - - - + + + + +
                        - +
                        - +
                        @@ -105,7 +102,7 @@ diff --git a/docs/html/jquery.js b/docs/html/jquery.js index 2771c74..3f1abfb 100644 --- a/docs/html/jquery.js +++ b/docs/html/jquery.js @@ -1,32 +1,4 @@ /* - @licstart The following is the entire license notice for the - JavaScript code in this file. - - Copyright (C) 1997-2017 by Dimitri van Heesch - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - @licend The above is the entire license notice - for the JavaScript code in this file - */ -/*! * jQuery JavaScript Library v1.7.1 * http://jquery.com/ * @@ -42,13 +14,13 @@ * Date: Mon Nov 21 21:11:03 2011 -0500 */ (function(bb,L){var av=bb.document,bu=bb.navigator,bl=bb.location;var b=(function(){var bF=function(b0,b1){return new bF.fn.init(b0,b1,bD)},bU=bb.jQuery,bH=bb.$,bD,bY=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,bM=/\S/,bI=/^\s+/,bE=/\s+$/,bA=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,bN=/^[\],:{}\s]*$/,bW=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,bP=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,bJ=/(?:^|:|,)(?:\s*\[)+/g,by=/(webkit)[ \/]([\w.]+)/,bR=/(opera)(?:.*version)?[ \/]([\w.]+)/,bQ=/(msie) ([\w.]+)/,bS=/(mozilla)(?:.*? rv:([\w.]+))?/,bB=/-([a-z]|[0-9])/ig,bZ=/^-ms-/,bT=function(b0,b1){return(b1+"").toUpperCase()},bX=bu.userAgent,bV,bC,e,bL=Object.prototype.toString,bG=Object.prototype.hasOwnProperty,bz=Array.prototype.push,bK=Array.prototype.slice,bO=String.prototype.trim,bv=Array.prototype.indexOf,bx={};bF.fn=bF.prototype={constructor:bF,init:function(b0,b4,b3){var b2,b5,b1,b6;if(!b0){return this}if(b0.nodeType){this.context=this[0]=b0;this.length=1;return this}if(b0==="body"&&!b4&&av.body){this.context=av;this[0]=av.body;this.selector=b0;this.length=1;return this}if(typeof b0==="string"){if(b0.charAt(0)==="<"&&b0.charAt(b0.length-1)===">"&&b0.length>=3){b2=[null,b0,null]}else{b2=bY.exec(b0)}if(b2&&(b2[1]||!b4)){if(b2[1]){b4=b4 instanceof bF?b4[0]:b4;b6=(b4?b4.ownerDocument||b4:av);b1=bA.exec(b0);if(b1){if(bF.isPlainObject(b4)){b0=[av.createElement(b1[1])];bF.fn.attr.call(b0,b4,true)}else{b0=[b6.createElement(b1[1])]}}else{b1=bF.buildFragment([b2[1]],[b6]);b0=(b1.cacheable?bF.clone(b1.fragment):b1.fragment).childNodes}return bF.merge(this,b0)}else{b5=av.getElementById(b2[2]);if(b5&&b5.parentNode){if(b5.id!==b2[2]){return b3.find(b0)}this.length=1;this[0]=b5}this.context=av;this.selector=b0;return this}}else{if(!b4||b4.jquery){return(b4||b3).find(b0)}else{return this.constructor(b4).find(b0)}}}else{if(bF.isFunction(b0)){return b3.ready(b0)}}if(b0.selector!==L){this.selector=b0.selector;this.context=b0.context}return bF.makeArray(b0,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return bK.call(this,0)},get:function(b0){return b0==null?this.toArray():(b0<0?this[this.length+b0]:this[b0])},pushStack:function(b1,b3,b0){var b2=this.constructor();if(bF.isArray(b1)){bz.apply(b2,b1)}else{bF.merge(b2,b1)}b2.prevObject=this;b2.context=this.context;if(b3==="find"){b2.selector=this.selector+(this.selector?" ":"")+b0}else{if(b3){b2.selector=this.selector+"."+b3+"("+b0+")"}}return b2},each:function(b1,b0){return bF.each(this,b1,b0)},ready:function(b0){bF.bindReady();bC.add(b0);return this},eq:function(b0){b0=+b0;return b0===-1?this.slice(b0):this.slice(b0,b0+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(bK.apply(this,arguments),"slice",bK.call(arguments).join(","))},map:function(b0){return this.pushStack(bF.map(this,function(b2,b1){return b0.call(b2,b1,b2)}))},end:function(){return this.prevObject||this.constructor(null)},push:bz,sort:[].sort,splice:[].splice};bF.fn.init.prototype=bF.fn;bF.extend=bF.fn.extend=function(){var b9,b2,b0,b1,b6,b7,b5=arguments[0]||{},b4=1,b3=arguments.length,b8=false;if(typeof b5==="boolean"){b8=b5;b5=arguments[1]||{};b4=2}if(typeof b5!=="object"&&!bF.isFunction(b5)){b5={}}if(b3===b4){b5=this;--b4}for(;b40){return}bC.fireWith(av,[bF]);if(bF.fn.trigger){bF(av).trigger("ready").off("ready")}}},bindReady:function(){if(bC){return}bC=bF.Callbacks("once memory");if(av.readyState==="complete"){return setTimeout(bF.ready,1)}if(av.addEventListener){av.addEventListener("DOMContentLoaded",e,false);bb.addEventListener("load",bF.ready,false)}else{if(av.attachEvent){av.attachEvent("onreadystatechange",e);bb.attachEvent("onload",bF.ready);var b0=false;try{b0=bb.frameElement==null}catch(b1){}if(av.documentElement.doScroll&&b0){bw()}}}},isFunction:function(b0){return bF.type(b0)==="function"},isArray:Array.isArray||function(b0){return bF.type(b0)==="array"},isWindow:function(b0){return b0&&typeof b0==="object"&&"setInterval" in b0},isNumeric:function(b0){return !isNaN(parseFloat(b0))&&isFinite(b0)},type:function(b0){return b0==null?String(b0):bx[bL.call(b0)]||"object"},isPlainObject:function(b2){if(!b2||bF.type(b2)!=="object"||b2.nodeType||bF.isWindow(b2)){return false}try{if(b2.constructor&&!bG.call(b2,"constructor")&&!bG.call(b2.constructor.prototype,"isPrototypeOf")){return false}}catch(b1){return false}var b0;for(b0 in b2){}return b0===L||bG.call(b2,b0)},isEmptyObject:function(b1){for(var b0 in b1){return false}return true},error:function(b0){throw new Error(b0)},parseJSON:function(b0){if(typeof b0!=="string"||!b0){return null}b0=bF.trim(b0);if(bb.JSON&&bb.JSON.parse){return bb.JSON.parse(b0)}if(bN.test(b0.replace(bW,"@").replace(bP,"]").replace(bJ,""))){return(new Function("return "+b0))()}bF.error("Invalid JSON: "+b0)},parseXML:function(b2){var b0,b1;try{if(bb.DOMParser){b1=new DOMParser();b0=b1.parseFromString(b2,"text/xml")}else{b0=new ActiveXObject("Microsoft.XMLDOM");b0.async="false";b0.loadXML(b2)}}catch(b3){b0=L}if(!b0||!b0.documentElement||b0.getElementsByTagName("parsererror").length){bF.error("Invalid XML: "+b2)}return b0},noop:function(){},globalEval:function(b0){if(b0&&bM.test(b0)){(bb.execScript||function(b1){bb["eval"].call(bb,b1)})(b0)}},camelCase:function(b0){return b0.replace(bZ,"ms-").replace(bB,bT)},nodeName:function(b1,b0){return b1.nodeName&&b1.nodeName.toUpperCase()===b0.toUpperCase()},each:function(b3,b6,b2){var b1,b4=0,b5=b3.length,b0=b5===L||bF.isFunction(b3);if(b2){if(b0){for(b1 in b3){if(b6.apply(b3[b1],b2)===false){break}}}else{for(;b40&&b0[0]&&b0[b1-1])||b1===0||bF.isArray(b0));if(b3){for(;b21?aJ.call(arguments,0):bG;if(!(--bw)){bC.resolveWith(bC,bx)}}}function bz(bF){return function(bG){bB[bF]=arguments.length>1?aJ.call(arguments,0):bG;bC.notifyWith(bE,bB)}}if(e>1){for(;bv
                        a";bI=bv.getElementsByTagName("*");bF=bv.getElementsByTagName("a")[0];if(!bI||!bI.length||!bF){return{}}bG=av.createElement("select");bx=bG.appendChild(av.createElement("option"));bE=bv.getElementsByTagName("input")[0];bJ={leadingWhitespace:(bv.firstChild.nodeType===3),tbody:!bv.getElementsByTagName("tbody").length,htmlSerialize:!!bv.getElementsByTagName("link").length,style:/top/.test(bF.getAttribute("style")),hrefNormalized:(bF.getAttribute("href")==="/a"),opacity:/^0.55/.test(bF.style.opacity),cssFloat:!!bF.style.cssFloat,checkOn:(bE.value==="on"),optSelected:bx.selected,getSetAttribute:bv.className!=="t",enctype:!!av.createElement("form").enctype,html5Clone:av.createElement("nav").cloneNode(true).outerHTML!=="<:nav>",submitBubbles:true,changeBubbles:true,focusinBubbles:false,deleteExpando:true,noCloneEvent:true,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableMarginRight:true};bE.checked=true;bJ.noCloneChecked=bE.cloneNode(true).checked;bG.disabled=true;bJ.optDisabled=!bx.disabled;try{delete bv.test}catch(bC){bJ.deleteExpando=false}if(!bv.addEventListener&&bv.attachEvent&&bv.fireEvent){bv.attachEvent("onclick",function(){bJ.noCloneEvent=false});bv.cloneNode(true).fireEvent("onclick")}bE=av.createElement("input");bE.value="t";bE.setAttribute("type","radio");bJ.radioValue=bE.value==="t";bE.setAttribute("checked","checked");bv.appendChild(bE);bD=av.createDocumentFragment();bD.appendChild(bv.lastChild);bJ.checkClone=bD.cloneNode(true).cloneNode(true).lastChild.checked;bJ.appendChecked=bE.checked;bD.removeChild(bE);bD.appendChild(bv);bv.innerHTML="";if(bb.getComputedStyle){bA=av.createElement("div");bA.style.width="0";bA.style.marginRight="0";bv.style.width="2px";bv.appendChild(bA);bJ.reliableMarginRight=(parseInt((bb.getComputedStyle(bA,null)||{marginRight:0}).marginRight,10)||0)===0}if(bv.attachEvent){for(by in {submit:1,change:1,focusin:1}){bB="on"+by;bw=(bB in bv);if(!bw){bv.setAttribute(bB,"return;");bw=(typeof bv[bB]==="function")}bJ[by+"Bubbles"]=bw}}bD.removeChild(bv);bD=bG=bx=bA=bv=bE=null;b(function(){var bM,bU,bV,bT,bN,bO,bL,bS,bR,e,bP,bQ=av.getElementsByTagName("body")[0];if(!bQ){return}bL=1;bS="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;";bR="visibility:hidden;border:0;";e="style='"+bS+"border:5px solid #000;padding:0;'";bP="
                        ";bM=av.createElement("div");bM.style.cssText=bR+"width:0;height:0;position:static;top:0;margin-top:"+bL+"px";bQ.insertBefore(bM,bQ.firstChild);bv=av.createElement("div");bM.appendChild(bv);bv.innerHTML="
                        t
                        ";bz=bv.getElementsByTagName("td");bw=(bz[0].offsetHeight===0);bz[0].style.display="";bz[1].style.display="none";bJ.reliableHiddenOffsets=bw&&(bz[0].offsetHeight===0);bv.innerHTML="";bv.style.width=bv.style.paddingLeft="1px";b.boxModel=bJ.boxModel=bv.offsetWidth===2;if(typeof bv.style.zoom!=="undefined"){bv.style.display="inline";bv.style.zoom=1;bJ.inlineBlockNeedsLayout=(bv.offsetWidth===2);bv.style.display="";bv.innerHTML="
                        ";bJ.shrinkWrapBlocks=(bv.offsetWidth!==2)}bv.style.cssText=bS+bR;bv.innerHTML=bP;bU=bv.firstChild;bV=bU.firstChild;bN=bU.nextSibling.firstChild.firstChild;bO={doesNotAddBorder:(bV.offsetTop!==5),doesAddBorderForTableAndCells:(bN.offsetTop===5)};bV.style.position="fixed";bV.style.top="20px";bO.fixedPosition=(bV.offsetTop===20||bV.offsetTop===15);bV.style.position=bV.style.top="";bU.style.overflow="hidden";bU.style.position="relative";bO.subtractsBorderForOverflowNotVisible=(bV.offsetTop===-5);bO.doesNotIncludeMarginInBodyOffset=(bQ.offsetTop!==bL);bQ.removeChild(bM);bv=bM=null;b.extend(bJ,bO)});return bJ})();var aS=/^(?:\{.*\}|\[.*\])$/,aA=/([A-Z])/g;b.extend({cache:{},uuid:0,expando:"jQuery"+(b.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},hasData:function(e){e=e.nodeType?b.cache[e[b.expando]]:e[b.expando];return !!e&&!S(e)},data:function(bx,bv,bz,by){if(!b.acceptData(bx)){return}var bG,bA,bD,bE=b.expando,bC=typeof bv==="string",bF=bx.nodeType,e=bF?b.cache:bx,bw=bF?bx[bE]:bx[bE]&&bE,bB=bv==="events";if((!bw||!e[bw]||(!bB&&!by&&!e[bw].data))&&bC&&bz===L){return}if(!bw){if(bF){bx[bE]=bw=++b.uuid}else{bw=bE}}if(!e[bw]){e[bw]={};if(!bF){e[bw].toJSON=b.noop}}if(typeof bv==="object"||typeof bv==="function"){if(by){e[bw]=b.extend(e[bw],bv)}else{e[bw].data=b.extend(e[bw].data,bv)}}bG=bA=e[bw];if(!by){if(!bA.data){bA.data={}}bA=bA.data}if(bz!==L){bA[b.camelCase(bv)]=bz}if(bB&&!bA[bv]){return bG.events}if(bC){bD=bA[bv];if(bD==null){bD=bA[b.camelCase(bv)]}}else{bD=bA}return bD},removeData:function(bx,bv,by){if(!b.acceptData(bx)){return}var bB,bA,bz,bC=b.expando,bD=bx.nodeType,e=bD?b.cache:bx,bw=bD?bx[bC]:bC;if(!e[bw]){return}if(bv){bB=by?e[bw]:e[bw].data;if(bB){if(!b.isArray(bv)){if(bv in bB){bv=[bv]}else{bv=b.camelCase(bv);if(bv in bB){bv=[bv]}else{bv=bv.split(" ")}}}for(bA=0,bz=bv.length;bA-1){return true}}return false},val:function(bx){var e,bv,by,bw=this[0];if(!arguments.length){if(bw){e=b.valHooks[bw.nodeName.toLowerCase()]||b.valHooks[bw.type];if(e&&"get" in e&&(bv=e.get(bw,"value"))!==L){return bv}bv=bw.value;return typeof bv==="string"?bv.replace(aU,""):bv==null?"":bv}return}by=b.isFunction(bx);return this.each(function(bA){var bz=b(this),bB;if(this.nodeType!==1){return}if(by){bB=bx.call(this,bA,bz.val())}else{bB=bx}if(bB==null){bB=""}else{if(typeof bB==="number"){bB+=""}else{if(b.isArray(bB)){bB=b.map(bB,function(bC){return bC==null?"":bC+""})}}}e=b.valHooks[this.nodeName.toLowerCase()]||b.valHooks[this.type];if(!e||!("set" in e)||e.set(this,bB,"value")===L){this.value=bB}})}});b.extend({valHooks:{option:{get:function(e){var bv=e.attributes.value;return !bv||bv.specified?e.value:e.text}},select:{get:function(e){var bA,bv,bz,bx,by=e.selectedIndex,bB=[],bC=e.options,bw=e.type==="select-one";if(by<0){return null}bv=bw?by:0;bz=bw?by+1:bC.length;for(;bv=0});if(!e.length){bv.selectedIndex=-1}return e}}},attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(bA,bx,bB,bz){var bw,e,by,bv=bA.nodeType;if(!bA||bv===3||bv===8||bv===2){return}if(bz&&bx in b.attrFn){return b(bA)[bx](bB)}if(typeof bA.getAttribute==="undefined"){return b.prop(bA,bx,bB)}by=bv!==1||!b.isXMLDoc(bA);if(by){bx=bx.toLowerCase();e=b.attrHooks[bx]||(ao.test(bx)?aY:be)}if(bB!==L){if(bB===null){b.removeAttr(bA,bx);return}else{if(e&&"set" in e&&by&&(bw=e.set(bA,bB,bx))!==L){return bw}else{bA.setAttribute(bx,""+bB);return bB}}}else{if(e&&"get" in e&&by&&(bw=e.get(bA,bx))!==null){return bw}else{bw=bA.getAttribute(bx);return bw===null?L:bw}}},removeAttr:function(bx,bz){var by,bA,bv,e,bw=0;if(bz&&bx.nodeType===1){bA=bz.toLowerCase().split(af);e=bA.length;for(;bw=0)}}})});var bd=/^(?:textarea|input|select)$/i,n=/^([^\.]*)?(?:\.(.+))?$/,J=/\bhover(\.\S+)?\b/,aO=/^key/,bf=/^(?:mouse|contextmenu)|click/,T=/^(?:focusinfocus|focusoutblur)$/,U=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,Y=function(e){var bv=U.exec(e);if(bv){bv[1]=(bv[1]||"").toLowerCase();bv[3]=bv[3]&&new RegExp("(?:^|\\s)"+bv[3]+"(?:\\s|$)")}return bv},j=function(bw,e){var bv=bw.attributes||{};return((!e[1]||bw.nodeName.toLowerCase()===e[1])&&(!e[2]||(bv.id||{}).value===e[2])&&(!e[3]||e[3].test((bv["class"]||{}).value)))},bt=function(e){return b.event.special.hover?e:e.replace(J,"mouseenter$1 mouseleave$1")};b.event={add:function(bx,bC,bJ,bA,by){var bD,bB,bK,bI,bH,bF,e,bG,bv,bz,bw,bE;if(bx.nodeType===3||bx.nodeType===8||!bC||!bJ||!(bD=b._data(bx))){return}if(bJ.handler){bv=bJ;bJ=bv.handler}if(!bJ.guid){bJ.guid=b.guid++}bK=bD.events;if(!bK){bD.events=bK={}}bB=bD.handle;if(!bB){bD.handle=bB=function(bL){return typeof b!=="undefined"&&(!bL||b.event.triggered!==bL.type)?b.event.dispatch.apply(bB.elem,arguments):L};bB.elem=bx}bC=b.trim(bt(bC)).split(" ");for(bI=0;bI=0){bG=bG.slice(0,-1);bw=true}if(bG.indexOf(".")>=0){bx=bG.split(".");bG=bx.shift();bx.sort()}if((!bA||b.event.customEvent[bG])&&!b.event.global[bG]){return}bv=typeof bv==="object"?bv[b.expando]?bv:new b.Event(bG,bv):new b.Event(bG);bv.type=bG;bv.isTrigger=true;bv.exclusive=bw;bv.namespace=bx.join(".");bv.namespace_re=bv.namespace?new RegExp("(^|\\.)"+bx.join("\\.(?:.*\\.)?")+"(\\.|$)"):null;by=bG.indexOf(":")<0?"on"+bG:"";if(!bA){e=b.cache;for(bC in e){if(e[bC].events&&e[bC].events[bG]){b.event.trigger(bv,bD,e[bC].handle.elem,true)}}return}bv.result=L;if(!bv.target){bv.target=bA}bD=bD!=null?b.makeArray(bD):[];bD.unshift(bv);bF=b.event.special[bG]||{};if(bF.trigger&&bF.trigger.apply(bA,bD)===false){return}bB=[[bA,bF.bindType||bG]];if(!bJ&&!bF.noBubble&&!b.isWindow(bA)){bI=bF.delegateType||bG;bH=T.test(bI+bG)?bA:bA.parentNode;bz=null;for(;bH;bH=bH.parentNode){bB.push([bH,bI]);bz=bH}if(bz&&bz===bA.ownerDocument){bB.push([bz.defaultView||bz.parentWindow||bb,bI])}}for(bC=0;bCbA){bH.push({elem:this,matches:bz.slice(bA)})}for(bC=0;bC0?this.on(e,null,bx,bw):this.trigger(e)};if(b.attrFn){b.attrFn[e]=true}if(aO.test(e)){b.event.fixHooks[e]=b.event.keyHooks}if(bf.test(e)){b.event.fixHooks[e]=b.event.mouseHooks}}); -/*! +/* * Sizzle CSS Selector Engine * Copyright 2011, The Dojo Foundation * Released under the MIT, BSD, and GPL Licenses. * More information: http://sizzlejs.com/ */ -(function(){var bH=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,bC="sizcache"+(Math.random()+"").replace(".",""),bI=0,bL=Object.prototype.toString,bB=false,bA=true,bK=/\\/g,bO=/\r\n/g,bQ=/\W/;[0,0].sort(function(){bA=false;return 0});var by=function(bV,e,bY,bZ){bY=bY||[];e=e||av;var b1=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!bV||typeof bV!=="string"){return bY}var bS,b3,b6,bR,b2,b5,b4,bX,bU=true,bT=by.isXML(e),bW=[],b0=bV;do{bH.exec("");bS=bH.exec(b0);if(bS){b0=bS[3];bW.push(bS[1]);if(bS[2]){bR=bS[3];break}}}while(bS);if(bW.length>1&&bD.exec(bV)){if(bW.length===2&&bE.relative[bW[0]]){b3=bM(bW[0]+bW[1],e,bZ)}else{b3=bE.relative[bW[0]]?[e]:by(bW.shift(),e);while(bW.length){bV=bW.shift();if(bE.relative[bV]){bV+=bW.shift()}b3=bM(bV,b3,bZ)}}}else{if(!bZ&&bW.length>1&&e.nodeType===9&&!bT&&bE.match.ID.test(bW[0])&&!bE.match.ID.test(bW[bW.length-1])){b2=by.find(bW.shift(),e,bT);e=b2.expr?by.filter(b2.expr,b2.set)[0]:b2.set[0]}if(e){b2=bZ?{expr:bW.pop(),set:bF(bZ)}:by.find(bW.pop(),bW.length===1&&(bW[0]==="~"||bW[0]==="+")&&e.parentNode?e.parentNode:e,bT);b3=b2.expr?by.filter(b2.expr,b2.set):b2.set;if(bW.length>0){b6=bF(b3)}else{bU=false}while(bW.length){b5=bW.pop();b4=b5;if(!bE.relative[b5]){b5=""}else{b4=bW.pop()}if(b4==null){b4=e}bE.relative[b5](b6,b4,bT)}}else{b6=bW=[]}}if(!b6){b6=b3}if(!b6){by.error(b5||bV)}if(bL.call(b6)==="[object Array]"){if(!bU){bY.push.apply(bY,b6)}else{if(e&&e.nodeType===1){for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&(b6[bX]===true||b6[bX].nodeType===1&&by.contains(e,b6[bX]))){bY.push(b3[bX])}}}else{for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&b6[bX].nodeType===1){bY.push(b3[bX])}}}}}else{bF(b6,bY)}if(bR){by(bR,b1,bY,bZ);by.uniqueSort(bY)}return bY};by.uniqueSort=function(bR){if(bJ){bB=bA;bR.sort(bJ);if(bB){for(var e=1;e0};by.find=function(bX,e,bY){var bW,bS,bU,bT,bV,bR;if(!bX){return[]}for(bS=0,bU=bE.order.length;bS":function(bW,bR){var bV,bU=typeof bR==="string",bS=0,e=bW.length;if(bU&&!bQ.test(bR)){bR=bR.toLowerCase();for(;bS=0)){if(!bS){e.push(bV)}}else{if(bS){bR[bU]=false}}}}return false},ID:function(e){return e[1].replace(bK,"")},TAG:function(bR,e){return bR[1].replace(bK,"").toLowerCase()},CHILD:function(e){if(e[1]==="nth"){if(!e[2]){by.error(e[0])}e[2]=e[2].replace(/^\+|\s*/g,"");var bR=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(e[2]==="even"&&"2n"||e[2]==="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(bR[1]+(bR[2]||1))-0;e[3]=bR[3]-0}else{if(e[2]){by.error(e[0])}}e[0]=bI++;return e},ATTR:function(bU,bR,bS,e,bV,bW){var bT=bU[1]=bU[1].replace(bK,"");if(!bW&&bE.attrMap[bT]){bU[1]=bE.attrMap[bT]}bU[4]=(bU[4]||bU[5]||"").replace(bK,"");if(bU[2]==="~="){bU[4]=" "+bU[4]+" "}return bU},PSEUDO:function(bU,bR,bS,e,bV){if(bU[1]==="not"){if((bH.exec(bU[3])||"").length>1||/^\w/.test(bU[3])){bU[3]=by(bU[3],null,null,bR)}else{var bT=by.filter(bU[3],bR,bS,true^bV);if(!bS){e.push.apply(e,bT)}return false}}else{if(bE.match.POS.test(bU[0])||bE.match.CHILD.test(bU[0])){return true}}return bU},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(bS,bR,e){return !!by(e[3],bS).length},header:function(e){return(/h\d/i).test(e.nodeName)},text:function(bS){var e=bS.getAttribute("type"),bR=bS.type;return bS.nodeName.toLowerCase()==="input"&&"text"===bR&&(e===bR||e===null)},radio:function(e){return e.nodeName.toLowerCase()==="input"&&"radio"===e.type},checkbox:function(e){return e.nodeName.toLowerCase()==="input"&&"checkbox"===e.type},file:function(e){return e.nodeName.toLowerCase()==="input"&&"file"===e.type},password:function(e){return e.nodeName.toLowerCase()==="input"&&"password"===e.type},submit:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"submit"===bR.type},image:function(e){return e.nodeName.toLowerCase()==="input"&&"image"===e.type},reset:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"reset"===bR.type},button:function(bR){var e=bR.nodeName.toLowerCase();return e==="input"&&"button"===bR.type||e==="button"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)},focus:function(e){return e===e.ownerDocument.activeElement}},setFilters:{first:function(bR,e){return e===0},last:function(bS,bR,e,bT){return bR===bT.length-1},even:function(bR,e){return e%2===0},odd:function(bR,e){return e%2===1},lt:function(bS,bR,e){return bRe[3]-0},nth:function(bS,bR,e){return e[3]-0===bR},eq:function(bS,bR,e){return e[3]-0===bR}},filter:{PSEUDO:function(bS,bX,bW,bY){var e=bX[1],bR=bE.filters[e];if(bR){return bR(bS,bW,bX,bY)}else{if(e==="contains"){return(bS.textContent||bS.innerText||bw([bS])||"").indexOf(bX[3])>=0}else{if(e==="not"){var bT=bX[3];for(var bV=0,bU=bT.length;bV=0)}}},ID:function(bR,e){return bR.nodeType===1&&bR.getAttribute("id")===e},TAG:function(bR,e){return(e==="*"&&bR.nodeType===1)||!!bR.nodeName&&bR.nodeName.toLowerCase()===e},CLASS:function(bR,e){return(" "+(bR.className||bR.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(bV,bT){var bS=bT[1],e=by.attr?by.attr(bV,bS):bE.attrHandle[bS]?bE.attrHandle[bS](bV):bV[bS]!=null?bV[bS]:bV.getAttribute(bS),bW=e+"",bU=bT[2],bR=bT[4];return e==null?bU==="!=":!bU&&by.attr?e!=null:bU==="="?bW===bR:bU==="*="?bW.indexOf(bR)>=0:bU==="~="?(" "+bW+" ").indexOf(bR)>=0:!bR?bW&&e!==false:bU==="!="?bW!==bR:bU==="^="?bW.indexOf(bR)===0:bU==="$="?bW.substr(bW.length-bR.length)===bR:bU==="|="?bW===bR||bW.substr(0,bR.length+1)===bR+"-":false},POS:function(bU,bR,bS,bV){var e=bR[2],bT=bE.setFilters[e];if(bT){return bT(bU,bS,bR,bV)}}}};var bD=bE.match.POS,bx=function(bR,e){return"\\"+(e-0+1)};for(var bz in bE.match){bE.match[bz]=new RegExp(bE.match[bz].source+(/(?![^\[]*\])(?![^\(]*\))/.source));bE.leftMatch[bz]=new RegExp(/(^(?:.|\r|\n)*?)/.source+bE.match[bz].source.replace(/\\(\d+)/g,bx))}var bF=function(bR,e){bR=Array.prototype.slice.call(bR,0);if(e){e.push.apply(e,bR);return e}return bR};try{Array.prototype.slice.call(av.documentElement.childNodes,0)[0].nodeType}catch(bP){bF=function(bU,bT){var bS=0,bR=bT||[];if(bL.call(bU)==="[object Array]"){Array.prototype.push.apply(bR,bU)}else{if(typeof bU.length==="number"){for(var e=bU.length;bS";e.insertBefore(bR,e.firstChild);if(av.getElementById(bS)){bE.find.ID=function(bU,bV,bW){if(typeof bV.getElementById!=="undefined"&&!bW){var bT=bV.getElementById(bU[1]);return bT?bT.id===bU[1]||typeof bT.getAttributeNode!=="undefined"&&bT.getAttributeNode("id").nodeValue===bU[1]?[bT]:L:[]}};bE.filter.ID=function(bV,bT){var bU=typeof bV.getAttributeNode!=="undefined"&&bV.getAttributeNode("id");return bV.nodeType===1&&bU&&bU.nodeValue===bT}}e.removeChild(bR);e=bR=null})();(function(){var e=av.createElement("div");e.appendChild(av.createComment(""));if(e.getElementsByTagName("*").length>0){bE.find.TAG=function(bR,bV){var bU=bV.getElementsByTagName(bR[1]);if(bR[1]==="*"){var bT=[];for(var bS=0;bU[bS];bS++){if(bU[bS].nodeType===1){bT.push(bU[bS])}}bU=bT}return bU}}e.innerHTML="";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){bE.attrHandle.href=function(bR){return bR.getAttribute("href",2)}}e=null})();if(av.querySelectorAll){(function(){var e=by,bT=av.createElement("div"),bS="__sizzle__";bT.innerHTML="

                        ";if(bT.querySelectorAll&&bT.querySelectorAll(".TEST").length===0){return}by=function(b4,bV,bZ,b3){bV=bV||av;if(!b3&&!by.isXML(bV)){var b2=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b4);if(b2&&(bV.nodeType===1||bV.nodeType===9)){if(b2[1]){return bF(bV.getElementsByTagName(b4),bZ)}else{if(b2[2]&&bE.find.CLASS&&bV.getElementsByClassName){return bF(bV.getElementsByClassName(b2[2]),bZ)}}}if(bV.nodeType===9){if(b4==="body"&&bV.body){return bF([bV.body],bZ)}else{if(b2&&b2[3]){var bY=bV.getElementById(b2[3]);if(bY&&bY.parentNode){if(bY.id===b2[3]){return bF([bY],bZ)}}else{return bF([],bZ)}}}try{return bF(bV.querySelectorAll(b4),bZ)}catch(b0){}}else{if(bV.nodeType===1&&bV.nodeName.toLowerCase()!=="object"){var bW=bV,bX=bV.getAttribute("id"),bU=bX||bS,b6=bV.parentNode,b5=/^\s*[+~]/.test(b4);if(!bX){bV.setAttribute("id",bU)}else{bU=bU.replace(/'/g,"\\$&")}if(b5&&b6){bV=bV.parentNode}try{if(!b5||b6){return bF(bV.querySelectorAll("[id='"+bU+"'] "+b4),bZ)}}catch(b1){}finally{if(!bX){bW.removeAttribute("id")}}}}}return e(b4,bV,bZ,b3)};for(var bR in e){by[bR]=e[bR]}bT=null})()}(function(){var e=av.documentElement,bS=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.msMatchesSelector;if(bS){var bU=!bS.call(av.createElement("div"),"div"),bR=false;try{bS.call(av.documentElement,"[test!='']:sizzle")}catch(bT){bR=true}by.matchesSelector=function(bW,bY){bY=bY.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!by.isXML(bW)){try{if(bR||!bE.match.PSEUDO.test(bY)&&!/!=/.test(bY)){var bV=bS.call(bW,bY);if(bV||!bU||bW.document&&bW.document.nodeType!==11){return bV}}}catch(bX){}}return by(bY,null,null,[bW]).length>0}}})();(function(){var e=av.createElement("div");e.innerHTML="
                        ";if(!e.getElementsByClassName||e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}bE.order.splice(1,0,"CLASS");bE.find.CLASS=function(bR,bS,bT){if(typeof bS.getElementsByClassName!=="undefined"&&!bT){return bS.getElementsByClassName(bR[1])}};e=null})();function bv(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT0){bU=e;break}}}e=e[bR]}bZ[bT]=bU}}}if(av.documentElement.contains){by.contains=function(bR,e){return bR!==e&&(bR.contains?bR.contains(e):true)}}else{if(av.documentElement.compareDocumentPosition){by.contains=function(bR,e){return !!(bR.compareDocumentPosition(e)&16)}}else{by.contains=function(){return false}}}by.isXML=function(e){var bR=(e?e.ownerDocument||e:0).documentElement;return bR?bR.nodeName!=="HTML":false};var bM=function(bS,e,bW){var bV,bX=[],bU="",bY=e.nodeType?[e]:e;while((bV=bE.match.PSEUDO.exec(bS))){bU+=bV[0];bS=bS.replace(bE.match.PSEUDO,"")}bS=bE.relative[bS]?bS+"*":bS;for(var bT=0,bR=bY.length;bT0){for(bB=bA;bB=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(by,bx){var bv=[],bw,e,bz=this[0];if(b.isArray(by)){var bB=1;while(bz&&bz.ownerDocument&&bz!==bx){for(bw=0;bw-1:b.find.matchesSelector(bz,by)){bv.push(bz);break}else{bz=bz.parentNode;if(!bz||!bz.ownerDocument||bz===bx||bz.nodeType===11){break}}}}bv=bv.length>1?b.unique(bv):bv;return this.pushStack(bv,"closest",by)},index:function(e){if(!e){return(this[0]&&this[0].parentNode)?this.prevAll().length:-1}if(typeof e==="string"){return b.inArray(this[0],b(e))}return b.inArray(e.jquery?e[0]:e,this)},add:function(e,bv){var bx=typeof e==="string"?b(e,bv):b.makeArray(e&&e.nodeType?[e]:e),bw=b.merge(this.get(),bx);return this.pushStack(C(bx[0])||C(bw[0])?bw:b.unique(bw))},andSelf:function(){return this.add(this.prevObject)}});function C(e){return !e||!e.parentNode||e.parentNode.nodeType===11}b.each({parent:function(bv){var e=bv.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(bv,e,bw){return b.dir(bv,"parentNode",bw)},next:function(e){return b.nth(e,2,"nextSibling")},prev:function(e){return b.nth(e,2,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(bv,e,bw){return b.dir(bv,"nextSibling",bw)},prevUntil:function(bv,e,bw){return b.dir(bv,"previousSibling",bw)},siblings:function(e){return b.sibling(e.parentNode.firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.makeArray(e.childNodes)}},function(e,bv){b.fn[e]=function(by,bw){var bx=b.map(this,bv,by);if(!ab.test(e)){bw=by}if(bw&&typeof bw==="string"){bx=b.filter(bw,bx)}bx=this.length>1&&!ay[e]?b.unique(bx):bx;if((this.length>1||a9.test(bw))&&aq.test(e)){bx=bx.reverse()}return this.pushStack(bx,e,P.call(arguments).join(","))}});b.extend({filter:function(bw,e,bv){if(bv){bw=":not("+bw+")"}return e.length===1?b.find.matchesSelector(e[0],bw)?[e[0]]:[]:b.find.matches(bw,e)},dir:function(bw,bv,by){var e=[],bx=bw[bv];while(bx&&bx.nodeType!==9&&(by===L||bx.nodeType!==1||!b(bx).is(by))){if(bx.nodeType===1){e.push(bx)}bx=bx[bv]}return e},nth:function(by,e,bw,bx){e=e||1;var bv=0;for(;by;by=by[bw]){if(by.nodeType===1&&++bv===e){break}}return by},sibling:function(bw,bv){var e=[];for(;bw;bw=bw.nextSibling){if(bw.nodeType===1&&bw!==bv){e.push(bw)}}return e}});function aG(bx,bw,e){bw=bw||0;if(b.isFunction(bw)){return b.grep(bx,function(bz,by){var bA=!!bw.call(bz,by,bz);return bA===e})}else{if(bw.nodeType){return b.grep(bx,function(bz,by){return(bz===bw)===e})}else{if(typeof bw==="string"){var bv=b.grep(bx,function(by){return by.nodeType===1});if(bp.test(bw)){return b.filter(bw,bv,!e)}else{bw=b.filter(bw,bv)}}}}return b.grep(bx,function(bz,by){return(b.inArray(bz,bw)>=0)===e})}function a(e){var bw=aR.split("|"),bv=e.createDocumentFragment();if(bv.createElement){while(bw.length){bv.createElement(bw.pop())}}return bv}var aR="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ag=/ jQuery\d+="(?:\d+|null)"/g,ar=/^\s+/,R=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,d=/<([\w:]+)/,w=/",""],legend:[1,"
                        ","
                        "],thead:[1,"","
                        "],tr:[2,"","
                        "],td:[3,"","
                        "],col:[2,"","
                        "],area:[1,"",""],_default:[0,"",""]},ac=a(av);ax.optgroup=ax.option;ax.tbody=ax.tfoot=ax.colgroup=ax.caption=ax.thead;ax.th=ax.td;if(!b.support.htmlSerialize){ax._default=[1,"div
                        ","
                        "]}b.fn.extend({text:function(e){if(b.isFunction(e)){return this.each(function(bw){var bv=b(this);bv.text(e.call(this,bw,bv.text()))})}if(typeof e!=="object"&&e!==L){return this.empty().append((this[0]&&this[0].ownerDocument||av).createTextNode(e))}return b.text(this)},wrapAll:function(e){if(b.isFunction(e)){return this.each(function(bw){b(this).wrapAll(e.call(this,bw))})}if(this[0]){var bv=b(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){bv.insertBefore(this[0])}bv.map(function(){var bw=this;while(bw.firstChild&&bw.firstChild.nodeType===1){bw=bw.firstChild}return bw}).append(this)}return this},wrapInner:function(e){if(b.isFunction(e)){return this.each(function(bv){b(this).wrapInner(e.call(this,bv))})}return this.each(function(){var bv=b(this),bw=bv.contents();if(bw.length){bw.wrapAll(e)}else{bv.append(e)}})},wrap:function(e){var bv=b.isFunction(e);return this.each(function(bw){b(this).wrapAll(bv?e.call(this,bw):e)})},unwrap:function(){return this.parent().each(function(){if(!b.nodeName(this,"body")){b(this).replaceWith(this.childNodes)}}).end()},append:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.appendChild(e)}})},prepend:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.insertBefore(e,this.firstChild)}})},before:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this)})}else{if(arguments.length){var e=b.clean(arguments);e.push.apply(e,this.toArray());return this.pushStack(e,"before",arguments)}}},after:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this.nextSibling)})}else{if(arguments.length){var e=this.pushStack(this,"after",arguments);e.push.apply(e,b.clean(arguments));return e}}},remove:function(e,bx){for(var bv=0,bw;(bw=this[bv])!=null;bv++){if(!e||b.filter(e,[bw]).length){if(!bx&&bw.nodeType===1){b.cleanData(bw.getElementsByTagName("*"));b.cleanData([bw])}if(bw.parentNode){bw.parentNode.removeChild(bw)}}}return this},empty:function(){for(var e=0,bv;(bv=this[e])!=null;e++){if(bv.nodeType===1){b.cleanData(bv.getElementsByTagName("*"))}while(bv.firstChild){bv.removeChild(bv.firstChild)}}return this},clone:function(bv,e){bv=bv==null?false:bv;e=e==null?bv:e;return this.map(function(){return b.clone(this,bv,e)})},html:function(bx){if(bx===L){return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(ag,""):null}else{if(typeof bx==="string"&&!ae.test(bx)&&(b.support.leadingWhitespace||!ar.test(bx))&&!ax[(d.exec(bx)||["",""])[1].toLowerCase()]){bx=bx.replace(R,"<$1>");try{for(var bw=0,bv=this.length;bw1&&bw0?this.clone(true):this).get();b(bC[bA])[bv](by);bz=bz.concat(by)}return this.pushStack(bz,e,bC.selector)}}});function bg(e){if(typeof e.getElementsByTagName!=="undefined"){return e.getElementsByTagName("*")}else{if(typeof e.querySelectorAll!=="undefined"){return e.querySelectorAll("*")}else{return[]}}}function az(e){if(e.type==="checkbox"||e.type==="radio"){e.defaultChecked=e.checked}}function E(e){var bv=(e.nodeName||"").toLowerCase();if(bv==="input"){az(e)}else{if(bv!=="script"&&typeof e.getElementsByTagName!=="undefined"){b.grep(e.getElementsByTagName("input"),az)}}}function al(e){var bv=av.createElement("div");ac.appendChild(bv);bv.innerHTML=e.outerHTML;return bv.firstChild}b.extend({clone:function(by,bA,bw){var e,bv,bx,bz=b.support.html5Clone||!ah.test("<"+by.nodeName)?by.cloneNode(true):al(by);if((!b.support.noCloneEvent||!b.support.noCloneChecked)&&(by.nodeType===1||by.nodeType===11)&&!b.isXMLDoc(by)){ai(by,bz);e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){if(bv[bx]){ai(e[bx],bv[bx])}}}if(bA){t(by,bz);if(bw){e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){t(e[bx],bv[bx])}}}e=bv=null;return bz},clean:function(bw,by,bH,bA){var bF;by=by||av;if(typeof by.createElement==="undefined"){by=by.ownerDocument||by[0]&&by[0].ownerDocument||av}var bI=[],bB;for(var bE=0,bz;(bz=bw[bE])!=null;bE++){if(typeof bz==="number"){bz+=""}if(!bz){continue}if(typeof bz==="string"){if(!W.test(bz)){bz=by.createTextNode(bz)}else{bz=bz.replace(R,"<$1>");var bK=(d.exec(bz)||["",""])[1].toLowerCase(),bx=ax[bK]||ax._default,bD=bx[0],bv=by.createElement("div");if(by===av){ac.appendChild(bv)}else{a(by).appendChild(bv)}bv.innerHTML=bx[1]+bz+bx[2];while(bD--){bv=bv.lastChild}if(!b.support.tbody){var e=w.test(bz),bC=bK==="table"&&!e?bv.firstChild&&bv.firstChild.childNodes:bx[1]===""&&!e?bv.childNodes:[];for(bB=bC.length-1;bB>=0;--bB){if(b.nodeName(bC[bB],"tbody")&&!bC[bB].childNodes.length){bC[bB].parentNode.removeChild(bC[bB])}}}if(!b.support.leadingWhitespace&&ar.test(bz)){bv.insertBefore(by.createTextNode(ar.exec(bz)[0]),bv.firstChild)}bz=bv.childNodes}}var bG;if(!b.support.appendChecked){if(bz[0]&&typeof(bG=bz.length)==="number"){for(bB=0;bB=0){return bx+"px"}}else{return bx}}}});if(!b.support.opacity){b.cssHooks.opacity={get:function(bv,e){return au.test((e&&bv.currentStyle?bv.currentStyle.filter:bv.style.filter)||"")?(parseFloat(RegExp.$1)/100)+"":e?"1":""},set:function(by,bz){var bx=by.style,bv=by.currentStyle,e=b.isNumeric(bz)?"alpha(opacity="+bz*100+")":"",bw=bv&&bv.filter||bx.filter||"";bx.zoom=1;if(bz>=1&&b.trim(bw.replace(ak,""))===""){bx.removeAttribute("filter");if(bv&&!bv.filter){return}}bx.filter=ak.test(bw)?bw.replace(ak,e):bw+" "+e}}}b(function(){if(!b.support.reliableMarginRight){b.cssHooks.marginRight={get:function(bw,bv){var e;b.swap(bw,{display:"inline-block"},function(){if(bv){e=Z(bw,"margin-right","marginRight")}else{e=bw.style.marginRight}});return e}}}});if(av.defaultView&&av.defaultView.getComputedStyle){aI=function(by,bw){var bv,bx,e;bw=bw.replace(z,"-$1").toLowerCase();if((bx=by.ownerDocument.defaultView)&&(e=bx.getComputedStyle(by,null))){bv=e.getPropertyValue(bw);if(bv===""&&!b.contains(by.ownerDocument.documentElement,by)){bv=b.style(by,bw)}}return bv}}if(av.documentElement.currentStyle){aX=function(bz,bw){var bA,e,by,bv=bz.currentStyle&&bz.currentStyle[bw],bx=bz.style;if(bv===null&&bx&&(by=bx[bw])){bv=by}if(!bc.test(bv)&&bn.test(bv)){bA=bx.left;e=bz.runtimeStyle&&bz.runtimeStyle.left;if(e){bz.runtimeStyle.left=bz.currentStyle.left}bx.left=bw==="fontSize"?"1em":(bv||0);bv=bx.pixelLeft+"px";bx.left=bA;if(e){bz.runtimeStyle.left=e}}return bv===""?"auto":bv}}Z=aI||aX;function p(by,bw,bv){var bA=bw==="width"?by.offsetWidth:by.offsetHeight,bz=bw==="width"?an:a1,bx=0,e=bz.length;if(bA>0){if(bv!=="border"){for(;bx)<[^<]*)*<\/script>/gi,q=/^(?:select|textarea)/i,h=/\s+/,br=/([?&])_=[^&]*/,K=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,A=b.fn.load,aa={},r={},aE,s,aV=["*/"]+["*"];try{aE=bl.href}catch(aw){aE=av.createElement("a");aE.href="";aE=aE.href}s=K.exec(aE.toLowerCase())||[];function f(e){return function(by,bA){if(typeof by!=="string"){bA=by;by="*"}if(b.isFunction(bA)){var bx=by.toLowerCase().split(h),bw=0,bz=bx.length,bv,bB,bC;for(;bw=0){var e=bw.slice(by,bw.length);bw=bw.slice(0,by)}var bx="GET";if(bz){if(b.isFunction(bz)){bA=bz;bz=L}else{if(typeof bz==="object"){bz=b.param(bz,b.ajaxSettings.traditional);bx="POST"}}}var bv=this;b.ajax({url:bw,type:bx,dataType:"html",data:bz,complete:function(bC,bB,bD){bD=bC.responseText;if(bC.isResolved()){bC.done(function(bE){bD=bE});bv.html(e?b("
                        ").append(bD.replace(a6,"")).find(e):bD)}if(bA){bv.each(bA,[bD,bB,bC])}}});return this},serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?b.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||q.test(this.nodeName)||aZ.test(this.type))}).map(function(e,bv){var bw=b(this).val();return bw==null?null:b.isArray(bw)?b.map(bw,function(by,bx){return{name:bv.name,value:by.replace(bs,"\r\n")}}):{name:bv.name,value:bw.replace(bs,"\r\n")}}).get()}});b.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,bv){b.fn[bv]=function(bw){return this.on(bv,bw)}});b.each(["get","post"],function(e,bv){b[bv]=function(bw,by,bz,bx){if(b.isFunction(by)){bx=bx||bz;bz=by;by=L}return b.ajax({type:bv,url:bw,data:by,success:bz,dataType:bx})}});b.extend({getScript:function(e,bv){return b.get(e,L,bv,"script")},getJSON:function(e,bv,bw){return b.get(e,bv,bw,"json")},ajaxSetup:function(bv,e){if(e){am(bv,b.ajaxSettings)}else{e=bv;bv=b.ajaxSettings}am(bv,e);return bv},ajaxSettings:{url:aE,isLocal:aM.test(s[1]),global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":aV},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":bb.String,"text html":true,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{context:true,url:true}},ajaxPrefilter:f(aa),ajaxTransport:f(r),ajax:function(bz,bx){if(typeof bz==="object"){bx=bz;bz=L}bx=bx||{};var bD=b.ajaxSetup({},bx),bS=bD.context||bD,bG=bS!==bD&&(bS.nodeType||bS instanceof b)?b(bS):b.event,bR=b.Deferred(),bN=b.Callbacks("once memory"),bB=bD.statusCode||{},bC,bH={},bO={},bQ,by,bL,bE,bI,bA=0,bw,bK,bJ={readyState:0,setRequestHeader:function(bT,bU){if(!bA){var e=bT.toLowerCase();bT=bO[e]=bO[e]||bT;bH[bT]=bU}return this},getAllResponseHeaders:function(){return bA===2?bQ:null},getResponseHeader:function(bT){var e;if(bA===2){if(!by){by={};while((e=aD.exec(bQ))){by[e[1].toLowerCase()]=e[2]}}e=by[bT.toLowerCase()]}return e===L?null:e},overrideMimeType:function(e){if(!bA){bD.mimeType=e}return this},abort:function(e){e=e||"abort";if(bL){bL.abort(e)}bF(0,e);return this}};function bF(bZ,bU,b0,bW){if(bA===2){return}bA=2;if(bE){clearTimeout(bE)}bL=L;bQ=bW||"";bJ.readyState=bZ>0?4:0;var bT,b4,b3,bX=bU,bY=b0?bj(bD,bJ,b0):L,bV,b2;if(bZ>=200&&bZ<300||bZ===304){if(bD.ifModified){if((bV=bJ.getResponseHeader("Last-Modified"))){b.lastModified[bC]=bV}if((b2=bJ.getResponseHeader("Etag"))){b.etag[bC]=b2}}if(bZ===304){bX="notmodified";bT=true}else{try{b4=G(bD,bY);bX="success";bT=true}catch(b1){bX="parsererror";b3=b1}}}else{b3=bX;if(!bX||bZ){bX="error";if(bZ<0){bZ=0}}}bJ.status=bZ;bJ.statusText=""+(bU||bX);if(bT){bR.resolveWith(bS,[b4,bX,bJ])}else{bR.rejectWith(bS,[bJ,bX,b3])}bJ.statusCode(bB);bB=L;if(bw){bG.trigger("ajax"+(bT?"Success":"Error"),[bJ,bD,bT?b4:b3])}bN.fireWith(bS,[bJ,bX]);if(bw){bG.trigger("ajaxComplete",[bJ,bD]);if(!(--b.active)){b.event.trigger("ajaxStop")}}}bR.promise(bJ);bJ.success=bJ.done;bJ.error=bJ.fail;bJ.complete=bN.add;bJ.statusCode=function(bT){if(bT){var e;if(bA<2){for(e in bT){bB[e]=[bB[e],bT[e]]}}else{e=bT[bJ.status];bJ.then(e,e)}}return this};bD.url=((bz||bD.url)+"").replace(bq,"").replace(c,s[1]+"//");bD.dataTypes=b.trim(bD.dataType||"*").toLowerCase().split(h);if(bD.crossDomain==null){bI=K.exec(bD.url.toLowerCase());bD.crossDomain=!!(bI&&(bI[1]!=s[1]||bI[2]!=s[2]||(bI[3]||(bI[1]==="http:"?80:443))!=(s[3]||(s[1]==="http:"?80:443))))}if(bD.data&&bD.processData&&typeof bD.data!=="string"){bD.data=b.param(bD.data,bD.traditional)}aW(aa,bD,bx,bJ);if(bA===2){return false}bw=bD.global;bD.type=bD.type.toUpperCase();bD.hasContent=!aQ.test(bD.type);if(bw&&b.active++===0){b.event.trigger("ajaxStart")}if(!bD.hasContent){if(bD.data){bD.url+=(M.test(bD.url)?"&":"?")+bD.data;delete bD.data}bC=bD.url;if(bD.cache===false){var bv=b.now(),bP=bD.url.replace(br,"$1_="+bv);bD.url=bP+((bP===bD.url)?(M.test(bD.url)?"&":"?")+"_="+bv:"")}}if(bD.data&&bD.hasContent&&bD.contentType!==false||bx.contentType){bJ.setRequestHeader("Content-Type",bD.contentType)}if(bD.ifModified){bC=bC||bD.url;if(b.lastModified[bC]){bJ.setRequestHeader("If-Modified-Since",b.lastModified[bC])}if(b.etag[bC]){bJ.setRequestHeader("If-None-Match",b.etag[bC])}}bJ.setRequestHeader("Accept",bD.dataTypes[0]&&bD.accepts[bD.dataTypes[0]]?bD.accepts[bD.dataTypes[0]]+(bD.dataTypes[0]!=="*"?", "+aV+"; q=0.01":""):bD.accepts["*"]);for(bK in bD.headers){bJ.setRequestHeader(bK,bD.headers[bK])}if(bD.beforeSend&&(bD.beforeSend.call(bS,bJ,bD)===false||bA===2)){bJ.abort();return false}for(bK in {success:1,error:1,complete:1}){bJ[bK](bD[bK])}bL=aW(r,bD,bx,bJ);if(!bL){bF(-1,"No Transport")}else{bJ.readyState=1;if(bw){bG.trigger("ajaxSend",[bJ,bD])}if(bD.async&&bD.timeout>0){bE=setTimeout(function(){bJ.abort("timeout")},bD.timeout)}try{bA=1;bL.send(bH,bF)}catch(bM){if(bA<2){bF(-1,bM)}else{throw bM}}}return bJ},param:function(e,bw){var bv=[],by=function(bz,bA){bA=b.isFunction(bA)?bA():bA;bv[bv.length]=encodeURIComponent(bz)+"="+encodeURIComponent(bA)};if(bw===L){bw=b.ajaxSettings.traditional}if(b.isArray(e)||(e.jquery&&!b.isPlainObject(e))){b.each(e,function(){by(this.name,this.value)})}else{for(var bx in e){v(bx,e[bx],bw,by)}}return bv.join("&").replace(k,"+")}});function v(bw,by,bv,bx){if(b.isArray(by)){b.each(by,function(bA,bz){if(bv||ap.test(bw)){bx(bw,bz)}else{v(bw+"["+(typeof bz==="object"||b.isArray(bz)?bA:"")+"]",bz,bv,bx)}})}else{if(!bv&&by!=null&&typeof by==="object"){for(var e in by){v(bw+"["+e+"]",by[e],bv,bx)}}else{bx(bw,by)}}}b.extend({active:0,lastModified:{},etag:{}});function bj(bD,bC,bz){var bv=bD.contents,bB=bD.dataTypes,bw=bD.responseFields,by,bA,bx,e;for(bA in bw){if(bA in bz){bC[bw[bA]]=bz[bA]}}while(bB[0]==="*"){bB.shift();if(by===L){by=bD.mimeType||bC.getResponseHeader("content-type")}}if(by){for(bA in bv){if(bv[bA]&&bv[bA].test(by)){bB.unshift(bA);break}}}if(bB[0] in bz){bx=bB[0]}else{for(bA in bz){if(!bB[0]||bD.converters[bA+" "+bB[0]]){bx=bA;break}if(!e){e=bA}}bx=bx||e}if(bx){if(bx!==bB[0]){bB.unshift(bx)}return bz[bx]}}function G(bH,bz){if(bH.dataFilter){bz=bH.dataFilter(bz,bH.dataType)}var bD=bH.dataTypes,bG={},bA,bE,bw=bD.length,bB,bC=bD[0],bx,by,bF,bv,e;for(bA=1;bA=bw.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();bw.animatedProperties[this.prop]=true;for(bA in bw.animatedProperties){if(bw.animatedProperties[bA]!==true){e=false}}if(e){if(bw.overflow!=null&&!b.support.shrinkWrapBlocks){b.each(["","X","Y"],function(bC,bD){bz.style["overflow"+bD]=bw.overflow[bC]})}if(bw.hide){b(bz).hide()}if(bw.hide||bw.show){for(bA in bw.animatedProperties){b.style(bz,bA,bw.orig[bA]);b.removeData(bz,"fxshow"+bA,true);b.removeData(bz,"toggle"+bA,true)}}bv=bw.complete;if(bv){bw.complete=false;bv.call(bz)}}return false}else{if(bw.duration==Infinity){this.now=bx}else{bB=bx-this.startTime;this.state=bB/bw.duration;this.pos=b.easing[bw.animatedProperties[this.prop]](this.state,bB,0,1,bw.duration);this.now=this.start+((this.end-this.start)*this.pos)}this.update()}return true}};b.extend(b.fx,{tick:function(){var bw,bv=b.timers,e=0;for(;e").appendTo(e),bw=bv.css("display");bv.remove();if(bw==="none"||bw===""){if(!a8){a8=av.createElement("iframe");a8.frameBorder=a8.width=a8.height=0}e.appendChild(a8);if(!m||!a8.createElement){m=(a8.contentWindow||a8.contentDocument).document;m.write((av.compatMode==="CSS1Compat"?"":"")+"");m.close()}bv=m.createElement(bx);m.body.appendChild(bv);bw=b.css(bv,"display");e.removeChild(a8)}Q[bx]=bw}return Q[bx]}var V=/^t(?:able|d|h)$/i,ad=/^(?:body|html)$/i;if("getBoundingClientRect" in av.documentElement){b.fn.offset=function(bI){var by=this[0],bB;if(bI){return this.each(function(e){b.offset.setOffset(this,bI,e)})}if(!by||!by.ownerDocument){return null}if(by===by.ownerDocument.body){return b.offset.bodyOffset(by)}try{bB=by.getBoundingClientRect()}catch(bF){}var bH=by.ownerDocument,bw=bH.documentElement;if(!bB||!b.contains(bw,by)){return bB?{top:bB.top,left:bB.left}:{top:0,left:0}}var bC=bH.body,bD=aK(bH),bA=bw.clientTop||bC.clientTop||0,bE=bw.clientLeft||bC.clientLeft||0,bv=bD.pageYOffset||b.support.boxModel&&bw.scrollTop||bC.scrollTop,bz=bD.pageXOffset||b.support.boxModel&&bw.scrollLeft||bC.scrollLeft,bG=bB.top+bv-bA,bx=bB.left+bz-bE;return{top:bG,left:bx}}}else{b.fn.offset=function(bF){var bz=this[0];if(bF){return this.each(function(bG){b.offset.setOffset(this,bF,bG)})}if(!bz||!bz.ownerDocument){return null}if(bz===bz.ownerDocument.body){return b.offset.bodyOffset(bz)}var bC,bw=bz.offsetParent,bv=bz,bE=bz.ownerDocument,bx=bE.documentElement,bA=bE.body,bB=bE.defaultView,e=bB?bB.getComputedStyle(bz,null):bz.currentStyle,bD=bz.offsetTop,by=bz.offsetLeft;while((bz=bz.parentNode)&&bz!==bA&&bz!==bx){if(b.support.fixedPosition&&e.position==="fixed"){break}bC=bB?bB.getComputedStyle(bz,null):bz.currentStyle;bD-=bz.scrollTop;by-=bz.scrollLeft;if(bz===bw){bD+=bz.offsetTop;by+=bz.offsetLeft;if(b.support.doesNotAddBorder&&!(b.support.doesAddBorderForTableAndCells&&V.test(bz.nodeName))){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}bv=bw;bw=bz.offsetParent}if(b.support.subtractsBorderForOverflowNotVisible&&bC.overflow!=="visible"){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}e=bC}if(e.position==="relative"||e.position==="static"){bD+=bA.offsetTop;by+=bA.offsetLeft}if(b.support.fixedPosition&&e.position==="fixed"){bD+=Math.max(bx.scrollTop,bA.scrollTop);by+=Math.max(bx.scrollLeft,bA.scrollLeft)}return{top:bD,left:by}}}b.offset={bodyOffset:function(e){var bw=e.offsetTop,bv=e.offsetLeft;if(b.support.doesNotIncludeMarginInBodyOffset){bw+=parseFloat(b.css(e,"marginTop"))||0;bv+=parseFloat(b.css(e,"marginLeft"))||0}return{top:bw,left:bv}},setOffset:function(bx,bG,bA){var bB=b.css(bx,"position");if(bB==="static"){bx.style.position="relative"}var bz=b(bx),bv=bz.offset(),e=b.css(bx,"top"),bE=b.css(bx,"left"),bF=(bB==="absolute"||bB==="fixed")&&b.inArray("auto",[e,bE])>-1,bD={},bC={},bw,by;if(bF){bC=bz.position();bw=bC.top;by=bC.left}else{bw=parseFloat(e)||0;by=parseFloat(bE)||0}if(b.isFunction(bG)){bG=bG.call(bx,bA,bv)}if(bG.top!=null){bD.top=(bG.top-bv.top)+bw}if(bG.left!=null){bD.left=(bG.left-bv.left)+by}if("using" in bG){bG.using.call(bx,bD)}else{bz.css(bD)}}};b.fn.extend({position:function(){if(!this[0]){return null}var bw=this[0],bv=this.offsetParent(),bx=this.offset(),e=ad.test(bv[0].nodeName)?{top:0,left:0}:bv.offset();bx.top-=parseFloat(b.css(bw,"marginTop"))||0;bx.left-=parseFloat(b.css(bw,"marginLeft"))||0;e.top+=parseFloat(b.css(bv[0],"borderTopWidth"))||0;e.left+=parseFloat(b.css(bv[0],"borderLeftWidth"))||0;return{top:bx.top-e.top,left:bx.left-e.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||av.body;while(e&&(!ad.test(e.nodeName)&&b.css(e,"position")==="static")){e=e.offsetParent}return e})}});b.each(["Left","Top"],function(bv,e){var bw="scroll"+e;b.fn[bw]=function(bz){var bx,by;if(bz===L){bx=this[0];if(!bx){return null}by=aK(bx);return by?("pageXOffset" in by)?by[bv?"pageYOffset":"pageXOffset"]:b.support.boxModel&&by.document.documentElement[bw]||by.document.body[bw]:bx[bw]}return this.each(function(){by=aK(this);if(by){by.scrollTo(!bv?bz:b(by).scrollLeft(),bv?bz:b(by).scrollTop())}else{this[bw]=bz}})}});function aK(e){return b.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}b.each(["Height","Width"],function(bv,e){var bw=e.toLowerCase();b.fn["inner"+e]=function(){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,"padding")):this[bw]():null};b.fn["outer"+e]=function(by){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,by?"margin":"border")):this[bw]():null};b.fn[bw]=function(bz){var bA=this[0];if(!bA){return bz==null?null:this}if(b.isFunction(bz)){return this.each(function(bE){var bD=b(this);bD[bw](bz.call(this,bE,bD[bw]()))})}if(b.isWindow(bA)){var bB=bA.document.documentElement["client"+e],bx=bA.document.body;return bA.document.compatMode==="CSS1Compat"&&bB||bx&&bx["client"+e]||bB}else{if(bA.nodeType===9){return Math.max(bA.documentElement["client"+e],bA.body["scroll"+e],bA.documentElement["scroll"+e],bA.body["offset"+e],bA.documentElement["offset"+e])}else{if(bz===L){var bC=b.css(bA,bw),by=parseFloat(bC);return b.isNumeric(by)?by:bC}else{return this.css(bw,typeof bz==="string"?bz:bz+"px")}}}}});bb.jQuery=bb.$=b;if(typeof define==="function"&&define.amd&&define.amd.jQuery){define("jquery",[],function(){return b})}})(window);/*! +(function(){var bH=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,bC="sizcache"+(Math.random()+"").replace(".",""),bI=0,bL=Object.prototype.toString,bB=false,bA=true,bK=/\\/g,bO=/\r\n/g,bQ=/\W/;[0,0].sort(function(){bA=false;return 0});var by=function(bV,e,bY,bZ){bY=bY||[];e=e||av;var b1=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!bV||typeof bV!=="string"){return bY}var bS,b3,b6,bR,b2,b5,b4,bX,bU=true,bT=by.isXML(e),bW=[],b0=bV;do{bH.exec("");bS=bH.exec(b0);if(bS){b0=bS[3];bW.push(bS[1]);if(bS[2]){bR=bS[3];break}}}while(bS);if(bW.length>1&&bD.exec(bV)){if(bW.length===2&&bE.relative[bW[0]]){b3=bM(bW[0]+bW[1],e,bZ)}else{b3=bE.relative[bW[0]]?[e]:by(bW.shift(),e);while(bW.length){bV=bW.shift();if(bE.relative[bV]){bV+=bW.shift()}b3=bM(bV,b3,bZ)}}}else{if(!bZ&&bW.length>1&&e.nodeType===9&&!bT&&bE.match.ID.test(bW[0])&&!bE.match.ID.test(bW[bW.length-1])){b2=by.find(bW.shift(),e,bT);e=b2.expr?by.filter(b2.expr,b2.set)[0]:b2.set[0]}if(e){b2=bZ?{expr:bW.pop(),set:bF(bZ)}:by.find(bW.pop(),bW.length===1&&(bW[0]==="~"||bW[0]==="+")&&e.parentNode?e.parentNode:e,bT);b3=b2.expr?by.filter(b2.expr,b2.set):b2.set;if(bW.length>0){b6=bF(b3)}else{bU=false}while(bW.length){b5=bW.pop();b4=b5;if(!bE.relative[b5]){b5=""}else{b4=bW.pop()}if(b4==null){b4=e}bE.relative[b5](b6,b4,bT)}}else{b6=bW=[]}}if(!b6){b6=b3}if(!b6){by.error(b5||bV)}if(bL.call(b6)==="[object Array]"){if(!bU){bY.push.apply(bY,b6)}else{if(e&&e.nodeType===1){for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&(b6[bX]===true||b6[bX].nodeType===1&&by.contains(e,b6[bX]))){bY.push(b3[bX])}}}else{for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&b6[bX].nodeType===1){bY.push(b3[bX])}}}}}else{bF(b6,bY)}if(bR){by(bR,b1,bY,bZ);by.uniqueSort(bY)}return bY};by.uniqueSort=function(bR){if(bJ){bB=bA;bR.sort(bJ);if(bB){for(var e=1;e0};by.find=function(bX,e,bY){var bW,bS,bU,bT,bV,bR;if(!bX){return[]}for(bS=0,bU=bE.order.length;bS":function(bW,bR){var bV,bU=typeof bR==="string",bS=0,e=bW.length;if(bU&&!bQ.test(bR)){bR=bR.toLowerCase();for(;bS=0)){if(!bS){e.push(bV)}}else{if(bS){bR[bU]=false}}}}return false},ID:function(e){return e[1].replace(bK,"")},TAG:function(bR,e){return bR[1].replace(bK,"").toLowerCase()},CHILD:function(e){if(e[1]==="nth"){if(!e[2]){by.error(e[0])}e[2]=e[2].replace(/^\+|\s*/g,"");var bR=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(e[2]==="even"&&"2n"||e[2]==="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(bR[1]+(bR[2]||1))-0;e[3]=bR[3]-0}else{if(e[2]){by.error(e[0])}}e[0]=bI++;return e},ATTR:function(bU,bR,bS,e,bV,bW){var bT=bU[1]=bU[1].replace(bK,"");if(!bW&&bE.attrMap[bT]){bU[1]=bE.attrMap[bT]}bU[4]=(bU[4]||bU[5]||"").replace(bK,"");if(bU[2]==="~="){bU[4]=" "+bU[4]+" "}return bU},PSEUDO:function(bU,bR,bS,e,bV){if(bU[1]==="not"){if((bH.exec(bU[3])||"").length>1||/^\w/.test(bU[3])){bU[3]=by(bU[3],null,null,bR)}else{var bT=by.filter(bU[3],bR,bS,true^bV);if(!bS){e.push.apply(e,bT)}return false}}else{if(bE.match.POS.test(bU[0])||bE.match.CHILD.test(bU[0])){return true}}return bU},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(bS,bR,e){return !!by(e[3],bS).length},header:function(e){return(/h\d/i).test(e.nodeName)},text:function(bS){var e=bS.getAttribute("type"),bR=bS.type;return bS.nodeName.toLowerCase()==="input"&&"text"===bR&&(e===bR||e===null)},radio:function(e){return e.nodeName.toLowerCase()==="input"&&"radio"===e.type},checkbox:function(e){return e.nodeName.toLowerCase()==="input"&&"checkbox"===e.type},file:function(e){return e.nodeName.toLowerCase()==="input"&&"file"===e.type},password:function(e){return e.nodeName.toLowerCase()==="input"&&"password"===e.type},submit:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"submit"===bR.type},image:function(e){return e.nodeName.toLowerCase()==="input"&&"image"===e.type},reset:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"reset"===bR.type},button:function(bR){var e=bR.nodeName.toLowerCase();return e==="input"&&"button"===bR.type||e==="button"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)},focus:function(e){return e===e.ownerDocument.activeElement}},setFilters:{first:function(bR,e){return e===0},last:function(bS,bR,e,bT){return bR===bT.length-1},even:function(bR,e){return e%2===0},odd:function(bR,e){return e%2===1},lt:function(bS,bR,e){return bRe[3]-0},nth:function(bS,bR,e){return e[3]-0===bR},eq:function(bS,bR,e){return e[3]-0===bR}},filter:{PSEUDO:function(bS,bX,bW,bY){var e=bX[1],bR=bE.filters[e];if(bR){return bR(bS,bW,bX,bY)}else{if(e==="contains"){return(bS.textContent||bS.innerText||bw([bS])||"").indexOf(bX[3])>=0}else{if(e==="not"){var bT=bX[3];for(var bV=0,bU=bT.length;bV=0)}}},ID:function(bR,e){return bR.nodeType===1&&bR.getAttribute("id")===e},TAG:function(bR,e){return(e==="*"&&bR.nodeType===1)||!!bR.nodeName&&bR.nodeName.toLowerCase()===e},CLASS:function(bR,e){return(" "+(bR.className||bR.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(bV,bT){var bS=bT[1],e=by.attr?by.attr(bV,bS):bE.attrHandle[bS]?bE.attrHandle[bS](bV):bV[bS]!=null?bV[bS]:bV.getAttribute(bS),bW=e+"",bU=bT[2],bR=bT[4];return e==null?bU==="!=":!bU&&by.attr?e!=null:bU==="="?bW===bR:bU==="*="?bW.indexOf(bR)>=0:bU==="~="?(" "+bW+" ").indexOf(bR)>=0:!bR?bW&&e!==false:bU==="!="?bW!==bR:bU==="^="?bW.indexOf(bR)===0:bU==="$="?bW.substr(bW.length-bR.length)===bR:bU==="|="?bW===bR||bW.substr(0,bR.length+1)===bR+"-":false},POS:function(bU,bR,bS,bV){var e=bR[2],bT=bE.setFilters[e];if(bT){return bT(bU,bS,bR,bV)}}}};var bD=bE.match.POS,bx=function(bR,e){return"\\"+(e-0+1)};for(var bz in bE.match){bE.match[bz]=new RegExp(bE.match[bz].source+(/(?![^\[]*\])(?![^\(]*\))/.source));bE.leftMatch[bz]=new RegExp(/(^(?:.|\r|\n)*?)/.source+bE.match[bz].source.replace(/\\(\d+)/g,bx))}var bF=function(bR,e){bR=Array.prototype.slice.call(bR,0);if(e){e.push.apply(e,bR);return e}return bR};try{Array.prototype.slice.call(av.documentElement.childNodes,0)[0].nodeType}catch(bP){bF=function(bU,bT){var bS=0,bR=bT||[];if(bL.call(bU)==="[object Array]"){Array.prototype.push.apply(bR,bU)}else{if(typeof bU.length==="number"){for(var e=bU.length;bS";e.insertBefore(bR,e.firstChild);if(av.getElementById(bS)){bE.find.ID=function(bU,bV,bW){if(typeof bV.getElementById!=="undefined"&&!bW){var bT=bV.getElementById(bU[1]);return bT?bT.id===bU[1]||typeof bT.getAttributeNode!=="undefined"&&bT.getAttributeNode("id").nodeValue===bU[1]?[bT]:L:[]}};bE.filter.ID=function(bV,bT){var bU=typeof bV.getAttributeNode!=="undefined"&&bV.getAttributeNode("id");return bV.nodeType===1&&bU&&bU.nodeValue===bT}}e.removeChild(bR);e=bR=null})();(function(){var e=av.createElement("div");e.appendChild(av.createComment(""));if(e.getElementsByTagName("*").length>0){bE.find.TAG=function(bR,bV){var bU=bV.getElementsByTagName(bR[1]);if(bR[1]==="*"){var bT=[];for(var bS=0;bU[bS];bS++){if(bU[bS].nodeType===1){bT.push(bU[bS])}}bU=bT}return bU}}e.innerHTML="";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){bE.attrHandle.href=function(bR){return bR.getAttribute("href",2)}}e=null})();if(av.querySelectorAll){(function(){var e=by,bT=av.createElement("div"),bS="__sizzle__";bT.innerHTML="

                        ";if(bT.querySelectorAll&&bT.querySelectorAll(".TEST").length===0){return}by=function(b4,bV,bZ,b3){bV=bV||av;if(!b3&&!by.isXML(bV)){var b2=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b4);if(b2&&(bV.nodeType===1||bV.nodeType===9)){if(b2[1]){return bF(bV.getElementsByTagName(b4),bZ)}else{if(b2[2]&&bE.find.CLASS&&bV.getElementsByClassName){return bF(bV.getElementsByClassName(b2[2]),bZ)}}}if(bV.nodeType===9){if(b4==="body"&&bV.body){return bF([bV.body],bZ)}else{if(b2&&b2[3]){var bY=bV.getElementById(b2[3]);if(bY&&bY.parentNode){if(bY.id===b2[3]){return bF([bY],bZ)}}else{return bF([],bZ)}}}try{return bF(bV.querySelectorAll(b4),bZ)}catch(b0){}}else{if(bV.nodeType===1&&bV.nodeName.toLowerCase()!=="object"){var bW=bV,bX=bV.getAttribute("id"),bU=bX||bS,b6=bV.parentNode,b5=/^\s*[+~]/.test(b4);if(!bX){bV.setAttribute("id",bU)}else{bU=bU.replace(/'/g,"\\$&")}if(b5&&b6){bV=bV.parentNode}try{if(!b5||b6){return bF(bV.querySelectorAll("[id='"+bU+"'] "+b4),bZ)}}catch(b1){}finally{if(!bX){bW.removeAttribute("id")}}}}}return e(b4,bV,bZ,b3)};for(var bR in e){by[bR]=e[bR]}bT=null})()}(function(){var e=av.documentElement,bS=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.msMatchesSelector;if(bS){var bU=!bS.call(av.createElement("div"),"div"),bR=false;try{bS.call(av.documentElement,"[test!='']:sizzle")}catch(bT){bR=true}by.matchesSelector=function(bW,bY){bY=bY.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!by.isXML(bW)){try{if(bR||!bE.match.PSEUDO.test(bY)&&!/!=/.test(bY)){var bV=bS.call(bW,bY);if(bV||!bU||bW.document&&bW.document.nodeType!==11){return bV}}}catch(bX){}}return by(bY,null,null,[bW]).length>0}}})();(function(){var e=av.createElement("div");e.innerHTML="
                        ";if(!e.getElementsByClassName||e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}bE.order.splice(1,0,"CLASS");bE.find.CLASS=function(bR,bS,bT){if(typeof bS.getElementsByClassName!=="undefined"&&!bT){return bS.getElementsByClassName(bR[1])}};e=null})();function bv(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT0){bU=e;break}}}e=e[bR]}bZ[bT]=bU}}}if(av.documentElement.contains){by.contains=function(bR,e){return bR!==e&&(bR.contains?bR.contains(e):true)}}else{if(av.documentElement.compareDocumentPosition){by.contains=function(bR,e){return !!(bR.compareDocumentPosition(e)&16)}}else{by.contains=function(){return false}}}by.isXML=function(e){var bR=(e?e.ownerDocument||e:0).documentElement;return bR?bR.nodeName!=="HTML":false};var bM=function(bS,e,bW){var bV,bX=[],bU="",bY=e.nodeType?[e]:e;while((bV=bE.match.PSEUDO.exec(bS))){bU+=bV[0];bS=bS.replace(bE.match.PSEUDO,"")}bS=bE.relative[bS]?bS+"*":bS;for(var bT=0,bR=bY.length;bT0){for(bB=bA;bB=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(by,bx){var bv=[],bw,e,bz=this[0];if(b.isArray(by)){var bB=1;while(bz&&bz.ownerDocument&&bz!==bx){for(bw=0;bw-1:b.find.matchesSelector(bz,by)){bv.push(bz);break}else{bz=bz.parentNode;if(!bz||!bz.ownerDocument||bz===bx||bz.nodeType===11){break}}}}bv=bv.length>1?b.unique(bv):bv;return this.pushStack(bv,"closest",by)},index:function(e){if(!e){return(this[0]&&this[0].parentNode)?this.prevAll().length:-1}if(typeof e==="string"){return b.inArray(this[0],b(e))}return b.inArray(e.jquery?e[0]:e,this)},add:function(e,bv){var bx=typeof e==="string"?b(e,bv):b.makeArray(e&&e.nodeType?[e]:e),bw=b.merge(this.get(),bx);return this.pushStack(C(bx[0])||C(bw[0])?bw:b.unique(bw))},andSelf:function(){return this.add(this.prevObject)}});function C(e){return !e||!e.parentNode||e.parentNode.nodeType===11}b.each({parent:function(bv){var e=bv.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(bv,e,bw){return b.dir(bv,"parentNode",bw)},next:function(e){return b.nth(e,2,"nextSibling")},prev:function(e){return b.nth(e,2,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(bv,e,bw){return b.dir(bv,"nextSibling",bw)},prevUntil:function(bv,e,bw){return b.dir(bv,"previousSibling",bw)},siblings:function(e){return b.sibling(e.parentNode.firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.makeArray(e.childNodes)}},function(e,bv){b.fn[e]=function(by,bw){var bx=b.map(this,bv,by);if(!ab.test(e)){bw=by}if(bw&&typeof bw==="string"){bx=b.filter(bw,bx)}bx=this.length>1&&!ay[e]?b.unique(bx):bx;if((this.length>1||a9.test(bw))&&aq.test(e)){bx=bx.reverse()}return this.pushStack(bx,e,P.call(arguments).join(","))}});b.extend({filter:function(bw,e,bv){if(bv){bw=":not("+bw+")"}return e.length===1?b.find.matchesSelector(e[0],bw)?[e[0]]:[]:b.find.matches(bw,e)},dir:function(bw,bv,by){var e=[],bx=bw[bv];while(bx&&bx.nodeType!==9&&(by===L||bx.nodeType!==1||!b(bx).is(by))){if(bx.nodeType===1){e.push(bx)}bx=bx[bv]}return e},nth:function(by,e,bw,bx){e=e||1;var bv=0;for(;by;by=by[bw]){if(by.nodeType===1&&++bv===e){break}}return by},sibling:function(bw,bv){var e=[];for(;bw;bw=bw.nextSibling){if(bw.nodeType===1&&bw!==bv){e.push(bw)}}return e}});function aG(bx,bw,e){bw=bw||0;if(b.isFunction(bw)){return b.grep(bx,function(bz,by){var bA=!!bw.call(bz,by,bz);return bA===e})}else{if(bw.nodeType){return b.grep(bx,function(bz,by){return(bz===bw)===e})}else{if(typeof bw==="string"){var bv=b.grep(bx,function(by){return by.nodeType===1});if(bp.test(bw)){return b.filter(bw,bv,!e)}else{bw=b.filter(bw,bv)}}}}return b.grep(bx,function(bz,by){return(b.inArray(bz,bw)>=0)===e})}function a(e){var bw=aR.split("|"),bv=e.createDocumentFragment();if(bv.createElement){while(bw.length){bv.createElement(bw.pop())}}return bv}var aR="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ag=/ jQuery\d+="(?:\d+|null)"/g,ar=/^\s+/,R=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,d=/<([\w:]+)/,w=/
                        ",""],legend:[1,"
                        ","
                        "],thead:[1,"
                        ","
                        "],tr:[2,"","
                        "],td:[3,"","
                        "],col:[2,"","
                        "],area:[1,"",""],_default:[0,"",""]},ac=a(av);ax.optgroup=ax.option;ax.tbody=ax.tfoot=ax.colgroup=ax.caption=ax.thead;ax.th=ax.td;if(!b.support.htmlSerialize){ax._default=[1,"div
                        ","
                        "]}b.fn.extend({text:function(e){if(b.isFunction(e)){return this.each(function(bw){var bv=b(this);bv.text(e.call(this,bw,bv.text()))})}if(typeof e!=="object"&&e!==L){return this.empty().append((this[0]&&this[0].ownerDocument||av).createTextNode(e))}return b.text(this)},wrapAll:function(e){if(b.isFunction(e)){return this.each(function(bw){b(this).wrapAll(e.call(this,bw))})}if(this[0]){var bv=b(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){bv.insertBefore(this[0])}bv.map(function(){var bw=this;while(bw.firstChild&&bw.firstChild.nodeType===1){bw=bw.firstChild}return bw}).append(this)}return this},wrapInner:function(e){if(b.isFunction(e)){return this.each(function(bv){b(this).wrapInner(e.call(this,bv))})}return this.each(function(){var bv=b(this),bw=bv.contents();if(bw.length){bw.wrapAll(e)}else{bv.append(e)}})},wrap:function(e){var bv=b.isFunction(e);return this.each(function(bw){b(this).wrapAll(bv?e.call(this,bw):e)})},unwrap:function(){return this.parent().each(function(){if(!b.nodeName(this,"body")){b(this).replaceWith(this.childNodes)}}).end()},append:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.appendChild(e)}})},prepend:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.insertBefore(e,this.firstChild)}})},before:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this)})}else{if(arguments.length){var e=b.clean(arguments);e.push.apply(e,this.toArray());return this.pushStack(e,"before",arguments)}}},after:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this.nextSibling)})}else{if(arguments.length){var e=this.pushStack(this,"after",arguments);e.push.apply(e,b.clean(arguments));return e}}},remove:function(e,bx){for(var bv=0,bw;(bw=this[bv])!=null;bv++){if(!e||b.filter(e,[bw]).length){if(!bx&&bw.nodeType===1){b.cleanData(bw.getElementsByTagName("*"));b.cleanData([bw])}if(bw.parentNode){bw.parentNode.removeChild(bw)}}}return this},empty:function(){for(var e=0,bv;(bv=this[e])!=null;e++){if(bv.nodeType===1){b.cleanData(bv.getElementsByTagName("*"))}while(bv.firstChild){bv.removeChild(bv.firstChild)}}return this},clone:function(bv,e){bv=bv==null?false:bv;e=e==null?bv:e;return this.map(function(){return b.clone(this,bv,e)})},html:function(bx){if(bx===L){return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(ag,""):null}else{if(typeof bx==="string"&&!ae.test(bx)&&(b.support.leadingWhitespace||!ar.test(bx))&&!ax[(d.exec(bx)||["",""])[1].toLowerCase()]){bx=bx.replace(R,"<$1>");try{for(var bw=0,bv=this.length;bw1&&bw0?this.clone(true):this).get();b(bC[bA])[bv](by);bz=bz.concat(by)}return this.pushStack(bz,e,bC.selector)}}});function bg(e){if(typeof e.getElementsByTagName!=="undefined"){return e.getElementsByTagName("*")}else{if(typeof e.querySelectorAll!=="undefined"){return e.querySelectorAll("*")}else{return[]}}}function az(e){if(e.type==="checkbox"||e.type==="radio"){e.defaultChecked=e.checked}}function E(e){var bv=(e.nodeName||"").toLowerCase();if(bv==="input"){az(e)}else{if(bv!=="script"&&typeof e.getElementsByTagName!=="undefined"){b.grep(e.getElementsByTagName("input"),az)}}}function al(e){var bv=av.createElement("div");ac.appendChild(bv);bv.innerHTML=e.outerHTML;return bv.firstChild}b.extend({clone:function(by,bA,bw){var e,bv,bx,bz=b.support.html5Clone||!ah.test("<"+by.nodeName)?by.cloneNode(true):al(by);if((!b.support.noCloneEvent||!b.support.noCloneChecked)&&(by.nodeType===1||by.nodeType===11)&&!b.isXMLDoc(by)){ai(by,bz);e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){if(bv[bx]){ai(e[bx],bv[bx])}}}if(bA){t(by,bz);if(bw){e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){t(e[bx],bv[bx])}}}e=bv=null;return bz},clean:function(bw,by,bH,bA){var bF;by=by||av;if(typeof by.createElement==="undefined"){by=by.ownerDocument||by[0]&&by[0].ownerDocument||av}var bI=[],bB;for(var bE=0,bz;(bz=bw[bE])!=null;bE++){if(typeof bz==="number"){bz+=""}if(!bz){continue}if(typeof bz==="string"){if(!W.test(bz)){bz=by.createTextNode(bz)}else{bz=bz.replace(R,"<$1>");var bK=(d.exec(bz)||["",""])[1].toLowerCase(),bx=ax[bK]||ax._default,bD=bx[0],bv=by.createElement("div");if(by===av){ac.appendChild(bv)}else{a(by).appendChild(bv)}bv.innerHTML=bx[1]+bz+bx[2];while(bD--){bv=bv.lastChild}if(!b.support.tbody){var e=w.test(bz),bC=bK==="table"&&!e?bv.firstChild&&bv.firstChild.childNodes:bx[1]===""&&!e?bv.childNodes:[];for(bB=bC.length-1;bB>=0;--bB){if(b.nodeName(bC[bB],"tbody")&&!bC[bB].childNodes.length){bC[bB].parentNode.removeChild(bC[bB])}}}if(!b.support.leadingWhitespace&&ar.test(bz)){bv.insertBefore(by.createTextNode(ar.exec(bz)[0]),bv.firstChild)}bz=bv.childNodes}}var bG;if(!b.support.appendChecked){if(bz[0]&&typeof(bG=bz.length)==="number"){for(bB=0;bB=0){return bx+"px"}}else{return bx}}}});if(!b.support.opacity){b.cssHooks.opacity={get:function(bv,e){return au.test((e&&bv.currentStyle?bv.currentStyle.filter:bv.style.filter)||"")?(parseFloat(RegExp.$1)/100)+"":e?"1":""},set:function(by,bz){var bx=by.style,bv=by.currentStyle,e=b.isNumeric(bz)?"alpha(opacity="+bz*100+")":"",bw=bv&&bv.filter||bx.filter||"";bx.zoom=1;if(bz>=1&&b.trim(bw.replace(ak,""))===""){bx.removeAttribute("filter");if(bv&&!bv.filter){return}}bx.filter=ak.test(bw)?bw.replace(ak,e):bw+" "+e}}}b(function(){if(!b.support.reliableMarginRight){b.cssHooks.marginRight={get:function(bw,bv){var e;b.swap(bw,{display:"inline-block"},function(){if(bv){e=Z(bw,"margin-right","marginRight")}else{e=bw.style.marginRight}});return e}}}});if(av.defaultView&&av.defaultView.getComputedStyle){aI=function(by,bw){var bv,bx,e;bw=bw.replace(z,"-$1").toLowerCase();if((bx=by.ownerDocument.defaultView)&&(e=bx.getComputedStyle(by,null))){bv=e.getPropertyValue(bw);if(bv===""&&!b.contains(by.ownerDocument.documentElement,by)){bv=b.style(by,bw)}}return bv}}if(av.documentElement.currentStyle){aX=function(bz,bw){var bA,e,by,bv=bz.currentStyle&&bz.currentStyle[bw],bx=bz.style;if(bv===null&&bx&&(by=bx[bw])){bv=by}if(!bc.test(bv)&&bn.test(bv)){bA=bx.left;e=bz.runtimeStyle&&bz.runtimeStyle.left;if(e){bz.runtimeStyle.left=bz.currentStyle.left}bx.left=bw==="fontSize"?"1em":(bv||0);bv=bx.pixelLeft+"px";bx.left=bA;if(e){bz.runtimeStyle.left=e}}return bv===""?"auto":bv}}Z=aI||aX;function p(by,bw,bv){var bA=bw==="width"?by.offsetWidth:by.offsetHeight,bz=bw==="width"?an:a1,bx=0,e=bz.length;if(bA>0){if(bv!=="border"){for(;bx)<[^<]*)*<\/script>/gi,q=/^(?:select|textarea)/i,h=/\s+/,br=/([?&])_=[^&]*/,K=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,A=b.fn.load,aa={},r={},aE,s,aV=["*/"]+["*"];try{aE=bl.href}catch(aw){aE=av.createElement("a");aE.href="";aE=aE.href}s=K.exec(aE.toLowerCase())||[];function f(e){return function(by,bA){if(typeof by!=="string"){bA=by;by="*"}if(b.isFunction(bA)){var bx=by.toLowerCase().split(h),bw=0,bz=bx.length,bv,bB,bC;for(;bw=0){var e=bw.slice(by,bw.length);bw=bw.slice(0,by)}var bx="GET";if(bz){if(b.isFunction(bz)){bA=bz;bz=L}else{if(typeof bz==="object"){bz=b.param(bz,b.ajaxSettings.traditional);bx="POST"}}}var bv=this;b.ajax({url:bw,type:bx,dataType:"html",data:bz,complete:function(bC,bB,bD){bD=bC.responseText;if(bC.isResolved()){bC.done(function(bE){bD=bE});bv.html(e?b("
                        ").append(bD.replace(a6,"")).find(e):bD)}if(bA){bv.each(bA,[bD,bB,bC])}}});return this},serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?b.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||q.test(this.nodeName)||aZ.test(this.type))}).map(function(e,bv){var bw=b(this).val();return bw==null?null:b.isArray(bw)?b.map(bw,function(by,bx){return{name:bv.name,value:by.replace(bs,"\r\n")}}):{name:bv.name,value:bw.replace(bs,"\r\n")}}).get()}});b.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,bv){b.fn[bv]=function(bw){return this.on(bv,bw)}});b.each(["get","post"],function(e,bv){b[bv]=function(bw,by,bz,bx){if(b.isFunction(by)){bx=bx||bz;bz=by;by=L}return b.ajax({type:bv,url:bw,data:by,success:bz,dataType:bx})}});b.extend({getScript:function(e,bv){return b.get(e,L,bv,"script")},getJSON:function(e,bv,bw){return b.get(e,bv,bw,"json")},ajaxSetup:function(bv,e){if(e){am(bv,b.ajaxSettings)}else{e=bv;bv=b.ajaxSettings}am(bv,e);return bv},ajaxSettings:{url:aE,isLocal:aM.test(s[1]),global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":aV},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":bb.String,"text html":true,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{context:true,url:true}},ajaxPrefilter:f(aa),ajaxTransport:f(r),ajax:function(bz,bx){if(typeof bz==="object"){bx=bz;bz=L}bx=bx||{};var bD=b.ajaxSetup({},bx),bS=bD.context||bD,bG=bS!==bD&&(bS.nodeType||bS instanceof b)?b(bS):b.event,bR=b.Deferred(),bN=b.Callbacks("once memory"),bB=bD.statusCode||{},bC,bH={},bO={},bQ,by,bL,bE,bI,bA=0,bw,bK,bJ={readyState:0,setRequestHeader:function(bT,bU){if(!bA){var e=bT.toLowerCase();bT=bO[e]=bO[e]||bT;bH[bT]=bU}return this},getAllResponseHeaders:function(){return bA===2?bQ:null},getResponseHeader:function(bT){var e;if(bA===2){if(!by){by={};while((e=aD.exec(bQ))){by[e[1].toLowerCase()]=e[2]}}e=by[bT.toLowerCase()]}return e===L?null:e},overrideMimeType:function(e){if(!bA){bD.mimeType=e}return this},abort:function(e){e=e||"abort";if(bL){bL.abort(e)}bF(0,e);return this}};function bF(bZ,bU,b0,bW){if(bA===2){return}bA=2;if(bE){clearTimeout(bE)}bL=L;bQ=bW||"";bJ.readyState=bZ>0?4:0;var bT,b4,b3,bX=bU,bY=b0?bj(bD,bJ,b0):L,bV,b2;if(bZ>=200&&bZ<300||bZ===304){if(bD.ifModified){if((bV=bJ.getResponseHeader("Last-Modified"))){b.lastModified[bC]=bV}if((b2=bJ.getResponseHeader("Etag"))){b.etag[bC]=b2}}if(bZ===304){bX="notmodified";bT=true}else{try{b4=G(bD,bY);bX="success";bT=true}catch(b1){bX="parsererror";b3=b1}}}else{b3=bX;if(!bX||bZ){bX="error";if(bZ<0){bZ=0}}}bJ.status=bZ;bJ.statusText=""+(bU||bX);if(bT){bR.resolveWith(bS,[b4,bX,bJ])}else{bR.rejectWith(bS,[bJ,bX,b3])}bJ.statusCode(bB);bB=L;if(bw){bG.trigger("ajax"+(bT?"Success":"Error"),[bJ,bD,bT?b4:b3])}bN.fireWith(bS,[bJ,bX]);if(bw){bG.trigger("ajaxComplete",[bJ,bD]);if(!(--b.active)){b.event.trigger("ajaxStop")}}}bR.promise(bJ);bJ.success=bJ.done;bJ.error=bJ.fail;bJ.complete=bN.add;bJ.statusCode=function(bT){if(bT){var e;if(bA<2){for(e in bT){bB[e]=[bB[e],bT[e]]}}else{e=bT[bJ.status];bJ.then(e,e)}}return this};bD.url=((bz||bD.url)+"").replace(bq,"").replace(c,s[1]+"//");bD.dataTypes=b.trim(bD.dataType||"*").toLowerCase().split(h);if(bD.crossDomain==null){bI=K.exec(bD.url.toLowerCase());bD.crossDomain=!!(bI&&(bI[1]!=s[1]||bI[2]!=s[2]||(bI[3]||(bI[1]==="http:"?80:443))!=(s[3]||(s[1]==="http:"?80:443))))}if(bD.data&&bD.processData&&typeof bD.data!=="string"){bD.data=b.param(bD.data,bD.traditional)}aW(aa,bD,bx,bJ);if(bA===2){return false}bw=bD.global;bD.type=bD.type.toUpperCase();bD.hasContent=!aQ.test(bD.type);if(bw&&b.active++===0){b.event.trigger("ajaxStart")}if(!bD.hasContent){if(bD.data){bD.url+=(M.test(bD.url)?"&":"?")+bD.data;delete bD.data}bC=bD.url;if(bD.cache===false){var bv=b.now(),bP=bD.url.replace(br,"$1_="+bv);bD.url=bP+((bP===bD.url)?(M.test(bD.url)?"&":"?")+"_="+bv:"")}}if(bD.data&&bD.hasContent&&bD.contentType!==false||bx.contentType){bJ.setRequestHeader("Content-Type",bD.contentType)}if(bD.ifModified){bC=bC||bD.url;if(b.lastModified[bC]){bJ.setRequestHeader("If-Modified-Since",b.lastModified[bC])}if(b.etag[bC]){bJ.setRequestHeader("If-None-Match",b.etag[bC])}}bJ.setRequestHeader("Accept",bD.dataTypes[0]&&bD.accepts[bD.dataTypes[0]]?bD.accepts[bD.dataTypes[0]]+(bD.dataTypes[0]!=="*"?", "+aV+"; q=0.01":""):bD.accepts["*"]);for(bK in bD.headers){bJ.setRequestHeader(bK,bD.headers[bK])}if(bD.beforeSend&&(bD.beforeSend.call(bS,bJ,bD)===false||bA===2)){bJ.abort();return false}for(bK in {success:1,error:1,complete:1}){bJ[bK](bD[bK])}bL=aW(r,bD,bx,bJ);if(!bL){bF(-1,"No Transport")}else{bJ.readyState=1;if(bw){bG.trigger("ajaxSend",[bJ,bD])}if(bD.async&&bD.timeout>0){bE=setTimeout(function(){bJ.abort("timeout")},bD.timeout)}try{bA=1;bL.send(bH,bF)}catch(bM){if(bA<2){bF(-1,bM)}else{throw bM}}}return bJ},param:function(e,bw){var bv=[],by=function(bz,bA){bA=b.isFunction(bA)?bA():bA;bv[bv.length]=encodeURIComponent(bz)+"="+encodeURIComponent(bA)};if(bw===L){bw=b.ajaxSettings.traditional}if(b.isArray(e)||(e.jquery&&!b.isPlainObject(e))){b.each(e,function(){by(this.name,this.value)})}else{for(var bx in e){v(bx,e[bx],bw,by)}}return bv.join("&").replace(k,"+")}});function v(bw,by,bv,bx){if(b.isArray(by)){b.each(by,function(bA,bz){if(bv||ap.test(bw)){bx(bw,bz)}else{v(bw+"["+(typeof bz==="object"||b.isArray(bz)?bA:"")+"]",bz,bv,bx)}})}else{if(!bv&&by!=null&&typeof by==="object"){for(var e in by){v(bw+"["+e+"]",by[e],bv,bx)}}else{bx(bw,by)}}}b.extend({active:0,lastModified:{},etag:{}});function bj(bD,bC,bz){var bv=bD.contents,bB=bD.dataTypes,bw=bD.responseFields,by,bA,bx,e;for(bA in bw){if(bA in bz){bC[bw[bA]]=bz[bA]}}while(bB[0]==="*"){bB.shift();if(by===L){by=bD.mimeType||bC.getResponseHeader("content-type")}}if(by){for(bA in bv){if(bv[bA]&&bv[bA].test(by)){bB.unshift(bA);break}}}if(bB[0] in bz){bx=bB[0]}else{for(bA in bz){if(!bB[0]||bD.converters[bA+" "+bB[0]]){bx=bA;break}if(!e){e=bA}}bx=bx||e}if(bx){if(bx!==bB[0]){bB.unshift(bx)}return bz[bx]}}function G(bH,bz){if(bH.dataFilter){bz=bH.dataFilter(bz,bH.dataType)}var bD=bH.dataTypes,bG={},bA,bE,bw=bD.length,bB,bC=bD[0],bx,by,bF,bv,e;for(bA=1;bA=bw.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();bw.animatedProperties[this.prop]=true;for(bA in bw.animatedProperties){if(bw.animatedProperties[bA]!==true){e=false}}if(e){if(bw.overflow!=null&&!b.support.shrinkWrapBlocks){b.each(["","X","Y"],function(bC,bD){bz.style["overflow"+bD]=bw.overflow[bC]})}if(bw.hide){b(bz).hide()}if(bw.hide||bw.show){for(bA in bw.animatedProperties){b.style(bz,bA,bw.orig[bA]);b.removeData(bz,"fxshow"+bA,true);b.removeData(bz,"toggle"+bA,true)}}bv=bw.complete;if(bv){bw.complete=false;bv.call(bz)}}return false}else{if(bw.duration==Infinity){this.now=bx}else{bB=bx-this.startTime;this.state=bB/bw.duration;this.pos=b.easing[bw.animatedProperties[this.prop]](this.state,bB,0,1,bw.duration);this.now=this.start+((this.end-this.start)*this.pos)}this.update()}return true}};b.extend(b.fx,{tick:function(){var bw,bv=b.timers,e=0;for(;e").appendTo(e),bw=bv.css("display");bv.remove();if(bw==="none"||bw===""){if(!a8){a8=av.createElement("iframe");a8.frameBorder=a8.width=a8.height=0}e.appendChild(a8);if(!m||!a8.createElement){m=(a8.contentWindow||a8.contentDocument).document;m.write((av.compatMode==="CSS1Compat"?"":"")+"");m.close()}bv=m.createElement(bx);m.body.appendChild(bv);bw=b.css(bv,"display");e.removeChild(a8)}Q[bx]=bw}return Q[bx]}var V=/^t(?:able|d|h)$/i,ad=/^(?:body|html)$/i;if("getBoundingClientRect" in av.documentElement){b.fn.offset=function(bI){var by=this[0],bB;if(bI){return this.each(function(e){b.offset.setOffset(this,bI,e)})}if(!by||!by.ownerDocument){return null}if(by===by.ownerDocument.body){return b.offset.bodyOffset(by)}try{bB=by.getBoundingClientRect()}catch(bF){}var bH=by.ownerDocument,bw=bH.documentElement;if(!bB||!b.contains(bw,by)){return bB?{top:bB.top,left:bB.left}:{top:0,left:0}}var bC=bH.body,bD=aK(bH),bA=bw.clientTop||bC.clientTop||0,bE=bw.clientLeft||bC.clientLeft||0,bv=bD.pageYOffset||b.support.boxModel&&bw.scrollTop||bC.scrollTop,bz=bD.pageXOffset||b.support.boxModel&&bw.scrollLeft||bC.scrollLeft,bG=bB.top+bv-bA,bx=bB.left+bz-bE;return{top:bG,left:bx}}}else{b.fn.offset=function(bF){var bz=this[0];if(bF){return this.each(function(bG){b.offset.setOffset(this,bF,bG)})}if(!bz||!bz.ownerDocument){return null}if(bz===bz.ownerDocument.body){return b.offset.bodyOffset(bz)}var bC,bw=bz.offsetParent,bv=bz,bE=bz.ownerDocument,bx=bE.documentElement,bA=bE.body,bB=bE.defaultView,e=bB?bB.getComputedStyle(bz,null):bz.currentStyle,bD=bz.offsetTop,by=bz.offsetLeft;while((bz=bz.parentNode)&&bz!==bA&&bz!==bx){if(b.support.fixedPosition&&e.position==="fixed"){break}bC=bB?bB.getComputedStyle(bz,null):bz.currentStyle;bD-=bz.scrollTop;by-=bz.scrollLeft;if(bz===bw){bD+=bz.offsetTop;by+=bz.offsetLeft;if(b.support.doesNotAddBorder&&!(b.support.doesAddBorderForTableAndCells&&V.test(bz.nodeName))){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}bv=bw;bw=bz.offsetParent}if(b.support.subtractsBorderForOverflowNotVisible&&bC.overflow!=="visible"){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}e=bC}if(e.position==="relative"||e.position==="static"){bD+=bA.offsetTop;by+=bA.offsetLeft}if(b.support.fixedPosition&&e.position==="fixed"){bD+=Math.max(bx.scrollTop,bA.scrollTop);by+=Math.max(bx.scrollLeft,bA.scrollLeft)}return{top:bD,left:by}}}b.offset={bodyOffset:function(e){var bw=e.offsetTop,bv=e.offsetLeft;if(b.support.doesNotIncludeMarginInBodyOffset){bw+=parseFloat(b.css(e,"marginTop"))||0;bv+=parseFloat(b.css(e,"marginLeft"))||0}return{top:bw,left:bv}},setOffset:function(bx,bG,bA){var bB=b.css(bx,"position");if(bB==="static"){bx.style.position="relative"}var bz=b(bx),bv=bz.offset(),e=b.css(bx,"top"),bE=b.css(bx,"left"),bF=(bB==="absolute"||bB==="fixed")&&b.inArray("auto",[e,bE])>-1,bD={},bC={},bw,by;if(bF){bC=bz.position();bw=bC.top;by=bC.left}else{bw=parseFloat(e)||0;by=parseFloat(bE)||0}if(b.isFunction(bG)){bG=bG.call(bx,bA,bv)}if(bG.top!=null){bD.top=(bG.top-bv.top)+bw}if(bG.left!=null){bD.left=(bG.left-bv.left)+by}if("using" in bG){bG.using.call(bx,bD)}else{bz.css(bD)}}};b.fn.extend({position:function(){if(!this[0]){return null}var bw=this[0],bv=this.offsetParent(),bx=this.offset(),e=ad.test(bv[0].nodeName)?{top:0,left:0}:bv.offset();bx.top-=parseFloat(b.css(bw,"marginTop"))||0;bx.left-=parseFloat(b.css(bw,"marginLeft"))||0;e.top+=parseFloat(b.css(bv[0],"borderTopWidth"))||0;e.left+=parseFloat(b.css(bv[0],"borderLeftWidth"))||0;return{top:bx.top-e.top,left:bx.left-e.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||av.body;while(e&&(!ad.test(e.nodeName)&&b.css(e,"position")==="static")){e=e.offsetParent}return e})}});b.each(["Left","Top"],function(bv,e){var bw="scroll"+e;b.fn[bw]=function(bz){var bx,by;if(bz===L){bx=this[0];if(!bx){return null}by=aK(bx);return by?("pageXOffset" in by)?by[bv?"pageYOffset":"pageXOffset"]:b.support.boxModel&&by.document.documentElement[bw]||by.document.body[bw]:bx[bw]}return this.each(function(){by=aK(this);if(by){by.scrollTo(!bv?bz:b(by).scrollLeft(),bv?bz:b(by).scrollTop())}else{this[bw]=bz}})}});function aK(e){return b.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}b.each(["Height","Width"],function(bv,e){var bw=e.toLowerCase();b.fn["inner"+e]=function(){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,"padding")):this[bw]():null};b.fn["outer"+e]=function(by){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,by?"margin":"border")):this[bw]():null};b.fn[bw]=function(bz){var bA=this[0];if(!bA){return bz==null?null:this}if(b.isFunction(bz)){return this.each(function(bE){var bD=b(this);bD[bw](bz.call(this,bE,bD[bw]()))})}if(b.isWindow(bA)){var bB=bA.document.documentElement["client"+e],bx=bA.document.body;return bA.document.compatMode==="CSS1Compat"&&bB||bx&&bx["client"+e]||bB}else{if(bA.nodeType===9){return Math.max(bA.documentElement["client"+e],bA.body["scroll"+e],bA.documentElement["scroll"+e],bA.body["offset"+e],bA.documentElement["offset"+e])}else{if(bz===L){var bC=b.css(bA,bw),by=parseFloat(bC);return b.isNumeric(by)?by:bC}else{return this.css(bw,typeof bz==="string"?bz:bz+"px")}}}}});bb.jQuery=bb.$=b;if(typeof define==="function"&&define.amd&&define.amd.jQuery){define("jquery",[],function(){return b})}})(window);/* * jQuery UI 1.8.18 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) @@ -57,7 +29,7 @@ * * http://docs.jquery.com/UI */ -(function(a,d){a.ui=a.ui||{};if(a.ui.version){return}a.extend(a.ui,{version:"1.8.18",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(e,f){return typeof e==="number"?this.each(function(){var g=this;setTimeout(function(){a(g).focus();if(f){f.call(g)}},e)}):this._focus.apply(this,arguments)},scrollParent:function(){var e;if((a.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){e=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(a.curCSS(this,"position",1))&&(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}else{e=this.parents().filter(function(){return(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!e.length?a(document):e},zIndex:function(h){if(h!==d){return this.css("zIndex",h)}if(this.length){var f=a(this[0]),e,g;while(f.length&&f[0]!==document){e=f.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){g=parseInt(f.css("zIndex"),10);if(!isNaN(g)&&g!==0){return g}}f=f.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});a.each(["Width","Height"],function(g,e){var f=e==="Width"?["Left","Right"]:["Top","Bottom"],h=e.toLowerCase(),k={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};function j(m,l,i,n){a.each(f,function(){l-=parseFloat(a.curCSS(m,"padding"+this,true))||0;if(i){l-=parseFloat(a.curCSS(m,"border"+this+"Width",true))||0}if(n){l-=parseFloat(a.curCSS(m,"margin"+this,true))||0}});return l}a.fn["inner"+e]=function(i){if(i===d){return k["inner"+e].call(this)}return this.each(function(){a(this).css(h,j(this,i)+"px")})};a.fn["outer"+e]=function(i,l){if(typeof i!=="number"){return k["outer"+e].call(this,i)}return this.each(function(){a(this).css(h,j(this,i,true,l)+"px")})}});function c(g,e){var j=g.nodeName.toLowerCase();if("area"===j){var i=g.parentNode,h=i.name,f;if(!g.href||!h||i.nodeName.toLowerCase()!=="map"){return false}f=a("img[usemap=#"+h+"]")[0];return !!f&&b(f)}return(/input|select|textarea|button|object/.test(j)?!g.disabled:"a"==j?g.href||e:e)&&b(g)}function b(e){return !a(e).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}a.extend(a.expr[":"],{data:function(g,f,e){return !!a.data(g,e[3])},focusable:function(e){return c(e,!isNaN(a.attr(e,"tabindex")))},tabbable:function(g){var e=a.attr(g,"tabindex"),f=isNaN(e);return(f||e>=0)&&c(g,!f)}});a(function(){var e=document.body,f=e.appendChild(f=document.createElement("div"));f.offsetHeight;a.extend(f.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});a.support.minHeight=f.offsetHeight===100;a.support.selectstart="onselectstart" in f;e.removeChild(f).style.display="none"});a.extend(a.ui,{plugin:{add:function(f,g,j){var h=a.ui[f].prototype;for(var e in j){h.plugins[e]=h.plugins[e]||[];h.plugins[e].push([g,j[e]])}},call:function(e,g,f){var j=e.plugins[g];if(!j||!e.element[0].parentNode){return}for(var h=0;h0){return true}h[e]=1;g=(h[e]>0);h[e]=0;return g},isOverAxis:function(f,e,g){return(f>e)&&(f<(e+g))},isOver:function(j,f,i,h,e,g){return a.ui.isOverAxis(j,i,e)&&a.ui.isOverAxis(f,h,g)}})})(jQuery);/*! +(function(a,d){a.ui=a.ui||{};if(a.ui.version){return}a.extend(a.ui,{version:"1.8.18",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(e,f){return typeof e==="number"?this.each(function(){var g=this;setTimeout(function(){a(g).focus();if(f){f.call(g)}},e)}):this._focus.apply(this,arguments)},scrollParent:function(){var e;if((a.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){e=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(a.curCSS(this,"position",1))&&(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}else{e=this.parents().filter(function(){return(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!e.length?a(document):e},zIndex:function(h){if(h!==d){return this.css("zIndex",h)}if(this.length){var f=a(this[0]),e,g;while(f.length&&f[0]!==document){e=f.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){g=parseInt(f.css("zIndex"),10);if(!isNaN(g)&&g!==0){return g}}f=f.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});a.each(["Width","Height"],function(g,e){var f=e==="Width"?["Left","Right"]:["Top","Bottom"],h=e.toLowerCase(),k={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};function j(m,l,i,n){a.each(f,function(){l-=parseFloat(a.curCSS(m,"padding"+this,true))||0;if(i){l-=parseFloat(a.curCSS(m,"border"+this+"Width",true))||0}if(n){l-=parseFloat(a.curCSS(m,"margin"+this,true))||0}});return l}a.fn["inner"+e]=function(i){if(i===d){return k["inner"+e].call(this)}return this.each(function(){a(this).css(h,j(this,i)+"px")})};a.fn["outer"+e]=function(i,l){if(typeof i!=="number"){return k["outer"+e].call(this,i)}return this.each(function(){a(this).css(h,j(this,i,true,l)+"px")})}});function c(g,e){var j=g.nodeName.toLowerCase();if("area"===j){var i=g.parentNode,h=i.name,f;if(!g.href||!h||i.nodeName.toLowerCase()!=="map"){return false}f=a("img[usemap=#"+h+"]")[0];return !!f&&b(f)}return(/input|select|textarea|button|object/.test(j)?!g.disabled:"a"==j?g.href||e:e)&&b(g)}function b(e){return !a(e).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}a.extend(a.expr[":"],{data:function(g,f,e){return !!a.data(g,e[3])},focusable:function(e){return c(e,!isNaN(a.attr(e,"tabindex")))},tabbable:function(g){var e=a.attr(g,"tabindex"),f=isNaN(e);return(f||e>=0)&&c(g,!f)}});a(function(){var e=document.body,f=e.appendChild(f=document.createElement("div"));f.offsetHeight;a.extend(f.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});a.support.minHeight=f.offsetHeight===100;a.support.selectstart="onselectstart" in f;e.removeChild(f).style.display="none"});a.extend(a.ui,{plugin:{add:function(f,g,j){var h=a.ui[f].prototype;for(var e in j){h.plugins[e]=h.plugins[e]||[];h.plugins[e].push([g,j[e]])}},call:function(e,g,f){var j=e.plugins[g];if(!j||!e.element[0].parentNode){return}for(var h=0;h0){return true}h[e]=1;g=(h[e]>0);h[e]=0;return g},isOverAxis:function(f,e,g){return(f>e)&&(f<(e+g))},isOver:function(j,f,i,h,e,g){return a.ui.isOverAxis(j,i,e)&&a.ui.isOverAxis(f,h,g)}})})(jQuery);/* * jQuery UI Widget 1.8.18 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) @@ -66,7 +38,7 @@ * * http://docs.jquery.com/UI/Widget */ -(function(b,d){if(b.cleanData){var c=b.cleanData;b.cleanData=function(f){for(var g=0,h;(h=f[g])!=null;g++){try{b(h).triggerHandler("remove")}catch(j){}}c(f)}}else{var a=b.fn.remove;b.fn.remove=function(e,f){return this.each(function(){if(!f){if(!e||b.filter(e,[this]).length){b("*",this).add([this]).each(function(){try{b(this).triggerHandler("remove")}catch(g){}})}}return a.call(b(this),e,f)})}}b.widget=function(f,h,e){var g=f.split(".")[0],j;f=f.split(".")[1];j=g+"-"+f;if(!e){e=h;h=b.Widget}b.expr[":"][j]=function(k){return !!b.data(k,f)};b[g]=b[g]||{};b[g][f]=function(k,l){if(arguments.length){this._createWidget(k,l)}};var i=new h();i.options=b.extend(true,{},i.options);b[g][f].prototype=b.extend(true,i,{namespace:g,widgetName:f,widgetEventPrefix:b[g][f].prototype.widgetEventPrefix||f,widgetBaseClass:j},e);b.widget.bridge(f,b[g][f])};b.widget.bridge=function(f,e){b.fn[f]=function(i){var g=typeof i==="string",h=Array.prototype.slice.call(arguments,1),j=this;i=!g&&h.length?b.extend.apply(null,[true,i].concat(h)):i;if(g&&i.charAt(0)==="_"){return j}if(g){this.each(function(){var k=b.data(this,f),l=k&&b.isFunction(k[i])?k[i].apply(k,h):k;if(l!==k&&l!==d){j=l;return false}})}else{this.each(function(){var k=b.data(this,f);if(k){k.option(i||{})._init()}else{b.data(this,f,new e(i,this))}})}return j}};b.Widget=function(e,f){if(arguments.length){this._createWidget(e,f)}};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(f,g){b.data(g,this.widgetName,this);this.element=b(g);this.options=b.extend(true,{},this.options,this._getCreateOptions(),f);var e=this;this.element.bind("remove."+this.widgetName,function(){e.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(f,g){var e=f;if(arguments.length===0){return b.extend({},this.options)}if(typeof f==="string"){if(g===d){return this.options[f]}e={};e[f]=g}this._setOptions(e);return this},_setOptions:function(f){var e=this;b.each(f,function(g,h){e._setOption(g,h)});return this},_setOption:function(e,f){this.options[e]=f;if(e==="disabled"){this.widget()[f?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",f)}return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(e,f,g){var j,i,h=this.options[e];g=g||{};f=b.Event(f);f.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase();f.target=this.element[0];i=f.originalEvent;if(i){for(j in i){if(!(j in f)){f[j]=i[j]}}}this.element.trigger(f,g);return !(b.isFunction(h)&&h.call(this.element[0],f,g)===false||f.isDefaultPrevented())}}})(jQuery);/*! +(function(b,d){if(b.cleanData){var c=b.cleanData;b.cleanData=function(f){for(var g=0,h;(h=f[g])!=null;g++){try{b(h).triggerHandler("remove")}catch(j){}}c(f)}}else{var a=b.fn.remove;b.fn.remove=function(e,f){return this.each(function(){if(!f){if(!e||b.filter(e,[this]).length){b("*",this).add([this]).each(function(){try{b(this).triggerHandler("remove")}catch(g){}})}}return a.call(b(this),e,f)})}}b.widget=function(f,h,e){var g=f.split(".")[0],j;f=f.split(".")[1];j=g+"-"+f;if(!e){e=h;h=b.Widget}b.expr[":"][j]=function(k){return !!b.data(k,f)};b[g]=b[g]||{};b[g][f]=function(k,l){if(arguments.length){this._createWidget(k,l)}};var i=new h();i.options=b.extend(true,{},i.options);b[g][f].prototype=b.extend(true,i,{namespace:g,widgetName:f,widgetEventPrefix:b[g][f].prototype.widgetEventPrefix||f,widgetBaseClass:j},e);b.widget.bridge(f,b[g][f])};b.widget.bridge=function(f,e){b.fn[f]=function(i){var g=typeof i==="string",h=Array.prototype.slice.call(arguments,1),j=this;i=!g&&h.length?b.extend.apply(null,[true,i].concat(h)):i;if(g&&i.charAt(0)==="_"){return j}if(g){this.each(function(){var k=b.data(this,f),l=k&&b.isFunction(k[i])?k[i].apply(k,h):k;if(l!==k&&l!==d){j=l;return false}})}else{this.each(function(){var k=b.data(this,f);if(k){k.option(i||{})._init()}else{b.data(this,f,new e(i,this))}})}return j}};b.Widget=function(e,f){if(arguments.length){this._createWidget(e,f)}};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(f,g){b.data(g,this.widgetName,this);this.element=b(g);this.options=b.extend(true,{},this.options,this._getCreateOptions(),f);var e=this;this.element.bind("remove."+this.widgetName,function(){e.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(f,g){var e=f;if(arguments.length===0){return b.extend({},this.options)}if(typeof f==="string"){if(g===d){return this.options[f]}e={};e[f]=g}this._setOptions(e);return this},_setOptions:function(f){var e=this;b.each(f,function(g,h){e._setOption(g,h)});return this},_setOption:function(e,f){this.options[e]=f;if(e==="disabled"){this.widget()[f?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",f)}return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(e,f,g){var j,i,h=this.options[e];g=g||{};f=b.Event(f);f.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase();f.target=this.element[0];i=f.originalEvent;if(i){for(j in i){if(!(j in f)){f[j]=i[j]}}}this.element.trigger(f,g);return !(b.isFunction(h)&&h.call(this.element[0],f,g)===false||f.isDefaultPrevented())}}})(jQuery);/* * jQuery UI Mouse 1.8.18 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) @@ -78,22 +50,22 @@ * Depends: * jquery.ui.widget.js */ -(function(b,c){var a=false;b(document).mouseup(function(d){a=false});b.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var d=this;this.element.bind("mousedown."+this.widgetName,function(e){return d._mouseDown(e)}).bind("click."+this.widgetName,function(e){if(true===b.data(e.target,d.widgetName+".preventClickEvent")){b.removeData(e.target,d.widgetName+".preventClickEvent");e.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(f){if(a){return}(this._mouseStarted&&this._mouseUp(f));this._mouseDownEvent=f;var e=this,g=(f.which==1),d=(typeof this.options.cancel=="string"&&f.target.nodeName?b(f.target).closest(this.options.cancel).length:false);if(!g||d||!this._mouseCapture(f)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(f)&&this._mouseDelayMet(f)){this._mouseStarted=(this._mouseStart(f)!==false);if(!this._mouseStarted){f.preventDefault();return true}}if(true===b.data(f.target,this.widgetName+".preventClickEvent")){b.removeData(f.target,this.widgetName+".preventClickEvent")}this._mouseMoveDelegate=function(h){return e._mouseMove(h)};this._mouseUpDelegate=function(h){return e._mouseUp(h)};b(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);f.preventDefault();a=true;return true},_mouseMove:function(d){if(b.browser.msie&&!(document.documentMode>=9)&&!d.button){return this._mouseUp(d)}if(this._mouseStarted){this._mouseDrag(d);return d.preventDefault()}if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,d)!==false);(this._mouseStarted?this._mouseDrag(d):this._mouseUp(d))}return !this._mouseStarted},_mouseUp:function(d){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;if(d.target==this._mouseDownEvent.target){b.data(d.target,this.widgetName+".preventClickEvent",true)}this._mouseStop(d)}return false},_mouseDistanceMet:function(d){return(Math.max(Math.abs(this._mouseDownEvent.pageX-d.pageX),Math.abs(this._mouseDownEvent.pageY-d.pageY))>=this.options.distance)},_mouseDelayMet:function(d){return this.mouseDelayMet},_mouseStart:function(d){},_mouseDrag:function(d){},_mouseStop:function(d){},_mouseCapture:function(d){return true}})})(jQuery);(function(c,d){c.widget("ui.resizable",c.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000},_create:function(){var f=this,k=this.options;this.element.addClass("ui-resizable");c.extend(this,{_aspectRatio:!!(k.aspectRatio),aspectRatio:k.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:k.helper||k.ghost||k.animate?k.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){this.element.wrap(c('
                        ').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=k.handles||(!c(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var l=this.handles.split(",");this.handles={};for(var g=0;g
                        ');if(/sw|se|ne|nw/.test(j)){h.css({zIndex:++k.zIndex})}if("se"==j){h.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[j]=".ui-resizable-"+j;this.element.append(h)}}this._renderAxis=function(q){q=q||this.element;for(var n in this.handles){if(this.handles[n].constructor==String){this.handles[n]=c(this.handles[n],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var o=c(this.handles[n],this.element),p=0;p=/sw|ne|nw|se|n|s/.test(n)?o.outerHeight():o.outerWidth();var m=["padding",/ne|nw|n/.test(n)?"Top":/se|sw|s/.test(n)?"Bottom":/^e$/.test(n)?"Right":"Left"].join("");q.css(m,p);this._proportionallyResize()}if(!c(this.handles[n]).length){continue}}};this._renderAxis(this.element);this._handles=c(".ui-resizable-handle",this.element).disableSelection();this._handles.mouseover(function(){if(!f.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}f.axis=i&&i[1]?i[1]:"se"}});if(k.autoHide){this._handles.hide();c(this.element).addClass("ui-resizable-autohide").hover(function(){if(k.disabled){return}c(this).removeClass("ui-resizable-autohide");f._handles.show()},function(){if(k.disabled){return}if(!f.resizing){c(this).addClass("ui-resizable-autohide");f._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var e=function(g){c(g).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){e(this.element);var f=this.element;f.after(this.originalElement.css({position:f.css("position"),width:f.outerWidth(),height:f.outerHeight(),top:f.css("top"),left:f.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);e(this.originalElement);return this},_mouseCapture:function(f){var g=false;for(var e in this.handles){if(c(this.handles[e])[0]==f.target){g=true}}return !this.options.disabled&&g},_mouseStart:function(g){var j=this.options,f=this.element.position(),e=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(e.is(".ui-draggable")||(/absolute/).test(e.css("position"))){e.css({position:"absolute",top:f.top,left:f.left})}this._renderProxy();var k=b(this.helper.css("left")),h=b(this.helper.css("top"));if(j.containment){k+=c(j.containment).scrollLeft()||0;h+=c(j.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:k,top:h};this.size=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalSize=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalPosition={left:k,top:h};this.sizeDiff={width:e.outerWidth()-e.width(),height:e.outerHeight()-e.height()};this.originalMousePosition={left:g.pageX,top:g.pageY};this.aspectRatio=(typeof j.aspectRatio=="number")?j.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var i=c(".ui-resizable-"+this.axis).css("cursor");c("body").css("cursor",i=="auto"?this.axis+"-resize":i);e.addClass("ui-resizable-resizing");this._propagate("start",g);return true},_mouseDrag:function(e){var h=this.helper,g=this.options,m={},q=this,j=this.originalMousePosition,n=this.axis;var r=(e.pageX-j.left)||0,p=(e.pageY-j.top)||0;var i=this._change[n];if(!i){return false}var l=i.apply(this,[e,r,p]),k=c.browser.msie&&c.browser.version<7,f=this.sizeDiff;this._updateVirtualBoundaries(e.shiftKey);if(this._aspectRatio||e.shiftKey){l=this._updateRatio(l,e)}l=this._respectSize(l,e);this._propagate("resize",e);h.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(l);this._trigger("resize",e,this.ui());return false},_mouseStop:function(h){this.resizing=false;var i=this.options,m=this;if(this._helper){var g=this._proportionallyResizeElements,e=g.length&&(/textarea/i).test(g[0].nodeName),f=e&&c.ui.hasScroll(g[0],"left")?0:m.sizeDiff.height,k=e?0:m.sizeDiff.width;var n={width:(m.helper.width()-k),height:(m.helper.height()-f)},j=(parseInt(m.element.css("left"),10)+(m.position.left-m.originalPosition.left))||null,l=(parseInt(m.element.css("top"),10)+(m.position.top-m.originalPosition.top))||null;if(!i.animate){this.element.css(c.extend(n,{top:l,left:j}))}m.helper.height(m.size.height);m.helper.width(m.size.width);if(this._helper&&!i.animate){this._proportionallyResize()}}c("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",h);if(this._helper){this.helper.remove()}return false},_updateVirtualBoundaries:function(g){var j=this.options,i,h,f,k,e;e={minWidth:a(j.minWidth)?j.minWidth:0,maxWidth:a(j.maxWidth)?j.maxWidth:Infinity,minHeight:a(j.minHeight)?j.minHeight:0,maxHeight:a(j.maxHeight)?j.maxHeight:Infinity};if(this._aspectRatio||g){i=e.minHeight*this.aspectRatio;f=e.minWidth/this.aspectRatio;h=e.maxHeight*this.aspectRatio;k=e.maxWidth/this.aspectRatio;if(i>e.minWidth){e.minWidth=i}if(f>e.minHeight){e.minHeight=f}if(hl.width),s=a(l.height)&&i.minHeight&&(i.minHeight>l.height);if(h){l.width=i.minWidth}if(s){l.height=i.minHeight}if(t){l.width=i.maxWidth}if(m){l.height=i.maxHeight}var f=this.originalPosition.left+this.originalSize.width,p=this.position.top+this.size.height;var k=/sw|nw|w/.test(q),e=/nw|ne|n/.test(q);if(h&&k){l.left=f-i.minWidth}if(t&&k){l.left=f-i.maxWidth}if(s&&e){l.top=p-i.minHeight}if(m&&e){l.top=p-i.maxHeight}var n=!l.width&&!l.height;if(n&&!l.left&&l.top){l.top=null}else{if(n&&!l.top&&l.left){l.left=null}}return l},_proportionallyResize:function(){var k=this.options;if(!this._proportionallyResizeElements.length){return}var g=this.helper||this.element;for(var f=0;f');var e=c.browser.msie&&c.browser.version<7,g=(e?1:0),h=(e?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+h,height:this.element.outerHeight()+h,position:"absolute",left:this.elementOffset.left-g+"px",top:this.elementOffset.top-g+"px",zIndex:++i.zIndex});this.helper.appendTo("body").disableSelection()}else{this.helper=this.element}},_change:{e:function(g,f,e){return{width:this.originalSize.width+f}},w:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{left:i.left+f,width:g.width-f}},n:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{top:i.top+e,height:g.height-e}},s:function(g,f,e){return{height:this.originalSize.height+e}},se:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},sw:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[g,f,e]))},ne:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},nw:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[g,f,e]))}},_propagate:function(f,e){c.ui.plugin.call(this,f,[e,this.ui()]);(f!="resize"&&this._trigger(f,e,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});c.extend(c.ui.resizable,{version:"1.8.18"});c.ui.plugin.add("resizable","alsoResize",{start:function(f,g){var e=c(this).data("resizable"),i=e.options;var h=function(j){c(j).each(function(){var k=c(this);k.data("resizable-alsoresize",{width:parseInt(k.width(),10),height:parseInt(k.height(),10),left:parseInt(k.css("left"),10),top:parseInt(k.css("top"),10)})})};if(typeof(i.alsoResize)=="object"&&!i.alsoResize.parentNode){if(i.alsoResize.length){i.alsoResize=i.alsoResize[0];h(i.alsoResize)}else{c.each(i.alsoResize,function(j){h(j)})}}else{h(i.alsoResize)}},resize:function(g,i){var f=c(this).data("resizable"),j=f.options,h=f.originalSize,l=f.originalPosition;var k={height:(f.size.height-h.height)||0,width:(f.size.width-h.width)||0,top:(f.position.top-l.top)||0,left:(f.position.left-l.left)||0},e=function(m,n){c(m).each(function(){var q=c(this),r=c(this).data("resizable-alsoresize"),p={},o=n&&n.length?n:q.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];c.each(o,function(s,u){var t=(r[u]||0)+(k[u]||0);if(t&&t>=0){p[u]=t||null}});q.css(p)})};if(typeof(j.alsoResize)=="object"&&!j.alsoResize.nodeType){c.each(j.alsoResize,function(m,n){e(m,n)})}else{e(j.alsoResize)}},stop:function(e,f){c(this).removeData("resizable-alsoresize")}});c.ui.plugin.add("resizable","animate",{stop:function(i,n){var p=c(this).data("resizable"),j=p.options;var h=p._proportionallyResizeElements,e=h.length&&(/textarea/i).test(h[0].nodeName),f=e&&c.ui.hasScroll(h[0],"left")?0:p.sizeDiff.height,l=e?0:p.sizeDiff.width;var g={width:(p.size.width-l),height:(p.size.height-f)},k=(parseInt(p.element.css("left"),10)+(p.position.left-p.originalPosition.left))||null,m=(parseInt(p.element.css("top"),10)+(p.position.top-p.originalPosition.top))||null;p.element.animate(c.extend(g,m&&k?{top:m,left:k}:{}),{duration:j.animateDuration,easing:j.animateEasing,step:function(){var o={width:parseInt(p.element.css("width"),10),height:parseInt(p.element.css("height"),10),top:parseInt(p.element.css("top"),10),left:parseInt(p.element.css("left"),10)};if(h&&h.length){c(h[0]).css({width:o.width,height:o.height})}p._updateCache(o);p._propagate("resize",i)}})}});c.ui.plugin.add("resizable","containment",{start:function(f,r){var t=c(this).data("resizable"),j=t.options,l=t.element;var g=j.containment,k=(g instanceof c)?g.get(0):(/parent/.test(g))?l.parent().get(0):g;if(!k){return}t.containerElement=c(k);if(/document/.test(g)||g==document){t.containerOffset={left:0,top:0};t.containerPosition={left:0,top:0};t.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var n=c(k),i=[];c(["Top","Right","Left","Bottom"]).each(function(p,o){i[p]=b(n.css("padding"+o))});t.containerOffset=n.offset();t.containerPosition=n.position();t.containerSize={height:(n.innerHeight()-i[3]),width:(n.innerWidth()-i[1])};var q=t.containerOffset,e=t.containerSize.height,m=t.containerSize.width,h=(c.ui.hasScroll(k,"left")?k.scrollWidth:m),s=(c.ui.hasScroll(k)?k.scrollHeight:e);t.parentData={element:k,left:q.left,top:q.top,width:h,height:s}}},resize:function(g,q){var t=c(this).data("resizable"),i=t.options,f=t.containerSize,p=t.containerOffset,m=t.size,n=t.position,r=t._aspectRatio||g.shiftKey,e={top:0,left:0},h=t.containerElement;if(h[0]!=document&&(/static/).test(h.css("position"))){e=p}if(n.left<(t._helper?p.left:0)){t.size.width=t.size.width+(t._helper?(t.position.left-p.left):(t.position.left-e.left));if(r){t.size.height=t.size.width/i.aspectRatio}t.position.left=i.helper?p.left:0}if(n.top<(t._helper?p.top:0)){t.size.height=t.size.height+(t._helper?(t.position.top-p.top):t.position.top);if(r){t.size.width=t.size.height*i.aspectRatio}t.position.top=t._helper?p.top:0}t.offset.left=t.parentData.left+t.position.left;t.offset.top=t.parentData.top+t.position.top;var l=Math.abs((t._helper?t.offset.left-e.left:(t.offset.left-e.left))+t.sizeDiff.width),s=Math.abs((t._helper?t.offset.top-e.top:(t.offset.top-p.top))+t.sizeDiff.height);var k=t.containerElement.get(0)==t.element.parent().get(0),j=/relative|absolute/.test(t.containerElement.css("position"));if(k&&j){l-=t.parentData.left}if(l+t.size.width>=t.parentData.width){t.size.width=t.parentData.width-l;if(r){t.size.height=t.size.width/t.aspectRatio}}if(s+t.size.height>=t.parentData.height){t.size.height=t.parentData.height-s;if(r){t.size.width=t.size.height*t.aspectRatio}}},stop:function(f,n){var q=c(this).data("resizable"),g=q.options,l=q.position,m=q.containerOffset,e=q.containerPosition,i=q.containerElement;var j=c(q.helper),r=j.offset(),p=j.outerWidth()-q.sizeDiff.width,k=j.outerHeight()-q.sizeDiff.height;if(q._helper&&!g.animate&&(/relative/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}if(q._helper&&!g.animate&&(/static/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}}});c.ui.plugin.add("resizable","ghost",{start:function(g,h){var e=c(this).data("resizable"),i=e.options,f=e.size;e.ghost=e.originalElement.clone();e.ghost.css({opacity:0.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof i.ghost=="string"?i.ghost:"");e.ghost.appendTo(e.helper)},resize:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost){e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})}},stop:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost&&e.helper){e.helper.get(0).removeChild(e.ghost.get(0))}}});c.ui.plugin.add("resizable","grid",{resize:function(e,m){var p=c(this).data("resizable"),h=p.options,k=p.size,i=p.originalSize,j=p.originalPosition,n=p.axis,l=h._aspectRatio||e.shiftKey;h.grid=typeof h.grid=="number"?[h.grid,h.grid]:h.grid;var g=Math.round((k.width-i.width)/(h.grid[0]||1))*(h.grid[0]||1),f=Math.round((k.height-i.height)/(h.grid[1]||1))*(h.grid[1]||1);if(/^(se|s|e)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f}else{if(/^(ne)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f}else{if(/^(sw)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.left=j.left-g}else{p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f;p.position.left=j.left-g}}}}});var b=function(e){return parseInt(e,10)||0};var a=function(e){return !isNaN(parseInt(e,10))}})(jQuery);/*! +(function(b,c){var a=false;b(document).mouseup(function(d){a=false});b.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var d=this;this.element.bind("mousedown."+this.widgetName,function(e){return d._mouseDown(e)}).bind("click."+this.widgetName,function(e){if(true===b.data(e.target,d.widgetName+".preventClickEvent")){b.removeData(e.target,d.widgetName+".preventClickEvent");e.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(f){if(a){return}(this._mouseStarted&&this._mouseUp(f));this._mouseDownEvent=f;var e=this,g=(f.which==1),d=(typeof this.options.cancel=="string"&&f.target.nodeName?b(f.target).closest(this.options.cancel).length:false);if(!g||d||!this._mouseCapture(f)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(f)&&this._mouseDelayMet(f)){this._mouseStarted=(this._mouseStart(f)!==false);if(!this._mouseStarted){f.preventDefault();return true}}if(true===b.data(f.target,this.widgetName+".preventClickEvent")){b.removeData(f.target,this.widgetName+".preventClickEvent")}this._mouseMoveDelegate=function(h){return e._mouseMove(h)};this._mouseUpDelegate=function(h){return e._mouseUp(h)};b(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);f.preventDefault();a=true;return true},_mouseMove:function(d){if(b.browser.msie&&!(document.documentMode>=9)&&!d.button){return this._mouseUp(d)}if(this._mouseStarted){this._mouseDrag(d);return d.preventDefault()}if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,d)!==false);(this._mouseStarted?this._mouseDrag(d):this._mouseUp(d))}return !this._mouseStarted},_mouseUp:function(d){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;if(d.target==this._mouseDownEvent.target){b.data(d.target,this.widgetName+".preventClickEvent",true)}this._mouseStop(d)}return false},_mouseDistanceMet:function(d){return(Math.max(Math.abs(this._mouseDownEvent.pageX-d.pageX),Math.abs(this._mouseDownEvent.pageY-d.pageY))>=this.options.distance)},_mouseDelayMet:function(d){return this.mouseDelayMet},_mouseStart:function(d){},_mouseDrag:function(d){},_mouseStop:function(d){},_mouseCapture:function(d){return true}})})(jQuery);(function(c,d){c.widget("ui.resizable",c.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000},_create:function(){var f=this,k=this.options;this.element.addClass("ui-resizable");c.extend(this,{_aspectRatio:!!(k.aspectRatio),aspectRatio:k.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:k.helper||k.ghost||k.animate?k.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){this.element.wrap(c('
                        ').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=k.handles||(!c(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var l=this.handles.split(",");this.handles={};for(var g=0;g');if(/sw|se|ne|nw/.test(j)){h.css({zIndex:++k.zIndex})}if("se"==j){h.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[j]=".ui-resizable-"+j;this.element.append(h)}}this._renderAxis=function(q){q=q||this.element;for(var n in this.handles){if(this.handles[n].constructor==String){this.handles[n]=c(this.handles[n],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var o=c(this.handles[n],this.element),p=0;p=/sw|ne|nw|se|n|s/.test(n)?o.outerHeight():o.outerWidth();var m=["padding",/ne|nw|n/.test(n)?"Top":/se|sw|s/.test(n)?"Bottom":/^e$/.test(n)?"Right":"Left"].join("");q.css(m,p);this._proportionallyResize()}if(!c(this.handles[n]).length){continue}}};this._renderAxis(this.element);this._handles=c(".ui-resizable-handle",this.element).disableSelection();this._handles.mouseover(function(){if(!f.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}f.axis=i&&i[1]?i[1]:"se"}});if(k.autoHide){this._handles.hide();c(this.element).addClass("ui-resizable-autohide").hover(function(){if(k.disabled){return}c(this).removeClass("ui-resizable-autohide");f._handles.show()},function(){if(k.disabled){return}if(!f.resizing){c(this).addClass("ui-resizable-autohide");f._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var e=function(g){c(g).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){e(this.element);var f=this.element;f.after(this.originalElement.css({position:f.css("position"),width:f.outerWidth(),height:f.outerHeight(),top:f.css("top"),left:f.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);e(this.originalElement);return this},_mouseCapture:function(f){var g=false;for(var e in this.handles){if(c(this.handles[e])[0]==f.target){g=true}}return !this.options.disabled&&g},_mouseStart:function(g){var j=this.options,f=this.element.position(),e=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(e.is(".ui-draggable")||(/absolute/).test(e.css("position"))){e.css({position:"absolute",top:f.top,left:f.left})}this._renderProxy();var k=b(this.helper.css("left")),h=b(this.helper.css("top"));if(j.containment){k+=c(j.containment).scrollLeft()||0;h+=c(j.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:k,top:h};this.size=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalSize=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalPosition={left:k,top:h};this.sizeDiff={width:e.outerWidth()-e.width(),height:e.outerHeight()-e.height()};this.originalMousePosition={left:g.pageX,top:g.pageY};this.aspectRatio=(typeof j.aspectRatio=="number")?j.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var i=c(".ui-resizable-"+this.axis).css("cursor");c("body").css("cursor",i=="auto"?this.axis+"-resize":i);e.addClass("ui-resizable-resizing");this._propagate("start",g);return true},_mouseDrag:function(e){var h=this.helper,g=this.options,m={},q=this,j=this.originalMousePosition,n=this.axis;var r=(e.pageX-j.left)||0,p=(e.pageY-j.top)||0;var i=this._change[n];if(!i){return false}var l=i.apply(this,[e,r,p]),k=c.browser.msie&&c.browser.version<7,f=this.sizeDiff;this._updateVirtualBoundaries(e.shiftKey);if(this._aspectRatio||e.shiftKey){l=this._updateRatio(l,e)}l=this._respectSize(l,e);this._propagate("resize",e);h.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(l);this._trigger("resize",e,this.ui());return false},_mouseStop:function(h){this.resizing=false;var i=this.options,m=this;if(this._helper){var g=this._proportionallyResizeElements,e=g.length&&(/textarea/i).test(g[0].nodeName),f=e&&c.ui.hasScroll(g[0],"left")?0:m.sizeDiff.height,k=e?0:m.sizeDiff.width;var n={width:(m.helper.width()-k),height:(m.helper.height()-f)},j=(parseInt(m.element.css("left"),10)+(m.position.left-m.originalPosition.left))||null,l=(parseInt(m.element.css("top"),10)+(m.position.top-m.originalPosition.top))||null;if(!i.animate){this.element.css(c.extend(n,{top:l,left:j}))}m.helper.height(m.size.height);m.helper.width(m.size.width);if(this._helper&&!i.animate){this._proportionallyResize()}}c("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",h);if(this._helper){this.helper.remove()}return false},_updateVirtualBoundaries:function(g){var j=this.options,i,h,f,k,e;e={minWidth:a(j.minWidth)?j.minWidth:0,maxWidth:a(j.maxWidth)?j.maxWidth:Infinity,minHeight:a(j.minHeight)?j.minHeight:0,maxHeight:a(j.maxHeight)?j.maxHeight:Infinity};if(this._aspectRatio||g){i=e.minHeight*this.aspectRatio;f=e.minWidth/this.aspectRatio;h=e.maxHeight*this.aspectRatio;k=e.maxWidth/this.aspectRatio;if(i>e.minWidth){e.minWidth=i}if(f>e.minHeight){e.minHeight=f}if(hl.width),s=a(l.height)&&i.minHeight&&(i.minHeight>l.height);if(h){l.width=i.minWidth}if(s){l.height=i.minHeight}if(t){l.width=i.maxWidth}if(m){l.height=i.maxHeight}var f=this.originalPosition.left+this.originalSize.width,p=this.position.top+this.size.height;var k=/sw|nw|w/.test(q),e=/nw|ne|n/.test(q);if(h&&k){l.left=f-i.minWidth}if(t&&k){l.left=f-i.maxWidth}if(s&&e){l.top=p-i.minHeight}if(m&&e){l.top=p-i.maxHeight}var n=!l.width&&!l.height;if(n&&!l.left&&l.top){l.top=null}else{if(n&&!l.top&&l.left){l.left=null}}return l},_proportionallyResize:function(){var k=this.options;if(!this._proportionallyResizeElements.length){return}var g=this.helper||this.element;for(var f=0;f');var e=c.browser.msie&&c.browser.version<7,g=(e?1:0),h=(e?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+h,height:this.element.outerHeight()+h,position:"absolute",left:this.elementOffset.left-g+"px",top:this.elementOffset.top-g+"px",zIndex:++i.zIndex});this.helper.appendTo("body").disableSelection()}else{this.helper=this.element}},_change:{e:function(g,f,e){return{width:this.originalSize.width+f}},w:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{left:i.left+f,width:g.width-f}},n:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{top:i.top+e,height:g.height-e}},s:function(g,f,e){return{height:this.originalSize.height+e}},se:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},sw:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[g,f,e]))},ne:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},nw:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[g,f,e]))}},_propagate:function(f,e){c.ui.plugin.call(this,f,[e,this.ui()]);(f!="resize"&&this._trigger(f,e,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});c.extend(c.ui.resizable,{version:"1.8.18"});c.ui.plugin.add("resizable","alsoResize",{start:function(f,g){var e=c(this).data("resizable"),i=e.options;var h=function(j){c(j).each(function(){var k=c(this);k.data("resizable-alsoresize",{width:parseInt(k.width(),10),height:parseInt(k.height(),10),left:parseInt(k.css("left"),10),top:parseInt(k.css("top"),10)})})};if(typeof(i.alsoResize)=="object"&&!i.alsoResize.parentNode){if(i.alsoResize.length){i.alsoResize=i.alsoResize[0];h(i.alsoResize)}else{c.each(i.alsoResize,function(j){h(j)})}}else{h(i.alsoResize)}},resize:function(g,i){var f=c(this).data("resizable"),j=f.options,h=f.originalSize,l=f.originalPosition;var k={height:(f.size.height-h.height)||0,width:(f.size.width-h.width)||0,top:(f.position.top-l.top)||0,left:(f.position.left-l.left)||0},e=function(m,n){c(m).each(function(){var q=c(this),r=c(this).data("resizable-alsoresize"),p={},o=n&&n.length?n:q.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];c.each(o,function(s,u){var t=(r[u]||0)+(k[u]||0);if(t&&t>=0){p[u]=t||null}});q.css(p)})};if(typeof(j.alsoResize)=="object"&&!j.alsoResize.nodeType){c.each(j.alsoResize,function(m,n){e(m,n)})}else{e(j.alsoResize)}},stop:function(e,f){c(this).removeData("resizable-alsoresize")}});c.ui.plugin.add("resizable","animate",{stop:function(i,n){var p=c(this).data("resizable"),j=p.options;var h=p._proportionallyResizeElements,e=h.length&&(/textarea/i).test(h[0].nodeName),f=e&&c.ui.hasScroll(h[0],"left")?0:p.sizeDiff.height,l=e?0:p.sizeDiff.width;var g={width:(p.size.width-l),height:(p.size.height-f)},k=(parseInt(p.element.css("left"),10)+(p.position.left-p.originalPosition.left))||null,m=(parseInt(p.element.css("top"),10)+(p.position.top-p.originalPosition.top))||null;p.element.animate(c.extend(g,m&&k?{top:m,left:k}:{}),{duration:j.animateDuration,easing:j.animateEasing,step:function(){var o={width:parseInt(p.element.css("width"),10),height:parseInt(p.element.css("height"),10),top:parseInt(p.element.css("top"),10),left:parseInt(p.element.css("left"),10)};if(h&&h.length){c(h[0]).css({width:o.width,height:o.height})}p._updateCache(o);p._propagate("resize",i)}})}});c.ui.plugin.add("resizable","containment",{start:function(f,r){var t=c(this).data("resizable"),j=t.options,l=t.element;var g=j.containment,k=(g instanceof c)?g.get(0):(/parent/.test(g))?l.parent().get(0):g;if(!k){return}t.containerElement=c(k);if(/document/.test(g)||g==document){t.containerOffset={left:0,top:0};t.containerPosition={left:0,top:0};t.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var n=c(k),i=[];c(["Top","Right","Left","Bottom"]).each(function(p,o){i[p]=b(n.css("padding"+o))});t.containerOffset=n.offset();t.containerPosition=n.position();t.containerSize={height:(n.innerHeight()-i[3]),width:(n.innerWidth()-i[1])};var q=t.containerOffset,e=t.containerSize.height,m=t.containerSize.width,h=(c.ui.hasScroll(k,"left")?k.scrollWidth:m),s=(c.ui.hasScroll(k)?k.scrollHeight:e);t.parentData={element:k,left:q.left,top:q.top,width:h,height:s}}},resize:function(g,q){var t=c(this).data("resizable"),i=t.options,f=t.containerSize,p=t.containerOffset,m=t.size,n=t.position,r=t._aspectRatio||g.shiftKey,e={top:0,left:0},h=t.containerElement;if(h[0]!=document&&(/static/).test(h.css("position"))){e=p}if(n.left<(t._helper?p.left:0)){t.size.width=t.size.width+(t._helper?(t.position.left-p.left):(t.position.left-e.left));if(r){t.size.height=t.size.width/i.aspectRatio}t.position.left=i.helper?p.left:0}if(n.top<(t._helper?p.top:0)){t.size.height=t.size.height+(t._helper?(t.position.top-p.top):t.position.top);if(r){t.size.width=t.size.height*i.aspectRatio}t.position.top=t._helper?p.top:0}t.offset.left=t.parentData.left+t.position.left;t.offset.top=t.parentData.top+t.position.top;var l=Math.abs((t._helper?t.offset.left-e.left:(t.offset.left-e.left))+t.sizeDiff.width),s=Math.abs((t._helper?t.offset.top-e.top:(t.offset.top-p.top))+t.sizeDiff.height);var k=t.containerElement.get(0)==t.element.parent().get(0),j=/relative|absolute/.test(t.containerElement.css("position"));if(k&&j){l-=t.parentData.left}if(l+t.size.width>=t.parentData.width){t.size.width=t.parentData.width-l;if(r){t.size.height=t.size.width/t.aspectRatio}}if(s+t.size.height>=t.parentData.height){t.size.height=t.parentData.height-s;if(r){t.size.width=t.size.height*t.aspectRatio}}},stop:function(f,n){var q=c(this).data("resizable"),g=q.options,l=q.position,m=q.containerOffset,e=q.containerPosition,i=q.containerElement;var j=c(q.helper),r=j.offset(),p=j.outerWidth()-q.sizeDiff.width,k=j.outerHeight()-q.sizeDiff.height;if(q._helper&&!g.animate&&(/relative/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}if(q._helper&&!g.animate&&(/static/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}}});c.ui.plugin.add("resizable","ghost",{start:function(g,h){var e=c(this).data("resizable"),i=e.options,f=e.size;e.ghost=e.originalElement.clone();e.ghost.css({opacity:0.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof i.ghost=="string"?i.ghost:"");e.ghost.appendTo(e.helper)},resize:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost){e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})}},stop:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost&&e.helper){e.helper.get(0).removeChild(e.ghost.get(0))}}});c.ui.plugin.add("resizable","grid",{resize:function(e,m){var p=c(this).data("resizable"),h=p.options,k=p.size,i=p.originalSize,j=p.originalPosition,n=p.axis,l=h._aspectRatio||e.shiftKey;h.grid=typeof h.grid=="number"?[h.grid,h.grid]:h.grid;var g=Math.round((k.width-i.width)/(h.grid[0]||1))*(h.grid[0]||1),f=Math.round((k.height-i.height)/(h.grid[1]||1))*(h.grid[1]||1);if(/^(se|s|e)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f}else{if(/^(ne)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f}else{if(/^(sw)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.left=j.left-g}else{p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f;p.position.left=j.left-g}}}}});var b=function(e){return parseInt(e,10)||0};var a=function(e){return !isNaN(parseInt(e,10))}})(jQuery);/* * jQuery hashchange event - v1.3 - 7/21/2010 * http://benalman.com/projects/jquery-hashchange-plugin/ - * + * * Copyright (c) 2010 "Cowboy" Ben Alman * Dual licensed under the MIT and GPL licenses. * http://benalman.com/about/license/ */ -(function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$('