summaryrefslogtreecommitdiffstats
path: root/mmc_updater/src/tests/TestUtils.h
diff options
context:
space:
mode:
Diffstat (limited to 'mmc_updater/src/tests/TestUtils.h')
-rw-r--r--mmc_updater/src/tests/TestUtils.h108
1 files changed, 108 insertions, 0 deletions
diff --git a/mmc_updater/src/tests/TestUtils.h b/mmc_updater/src/tests/TestUtils.h
new file mode 100644
index 00000000..68d97da5
--- /dev/null
+++ b/mmc_updater/src/tests/TestUtils.h
@@ -0,0 +1,108 @@
+#pragma once
+
+#include <iostream>
+#include <functional>
+#include <string>
+#include <vector>
+
+template <class T>
+class TestList
+{
+ public:
+ void addTest(void (T::*test)())
+ {
+ m_tests.push_back(std::mem_fun(test));
+ }
+
+ int size() const
+ {
+ return m_tests.size();
+ }
+
+ void runTest(T* testInstance, int i)
+ {
+ m_tests.at(i)(testInstance);
+ }
+
+ private:
+ std::vector<std::mem_fun_t<void,T> > m_tests;
+};
+
+class TestUtils
+{
+ public:
+ template <class X, class Y>
+ static void compare(const X& x, const Y& y, const char* xString, const char* yString)
+ {
+ if (x != y)
+ {
+ throw "Actual and expected values differ. "
+ "Actual: " + toString(x,xString) +
+ " Expected: " + toString(y,yString);
+ }
+ }
+
+ template <typename T>
+ static std::string toString(T value, const char* context)
+ {
+ return "Unprintable: " + std::string(context);
+ }
+
+ template <class T>
+ static int runTest(class TestList<T>& tests) throw ()
+ {
+ std::string errorText;
+ try
+ {
+ T testInstance;
+ for (int i=0; i < tests.size(); i++)
+ {
+ tests.runTest(&testInstance,i);
+ }
+ }
+ catch (const std::exception& ex)
+ {
+ errorText = ex.what();
+ }
+ catch (const std::string& error)
+ {
+ errorText = error;
+ }
+ catch (...)
+ {
+ errorText = "Unknown exception";
+ }
+
+ if (errorText.empty())
+ {
+ std::cout << "Test passed" << std::endl;
+ return 0;
+ }
+ else
+ {
+ std::cout << "Test failed: " << errorText << std::endl;
+ return 1;
+ }
+ }
+};
+
+template <>
+inline std::string TestUtils::toString(const std::string& value, const char*)
+{
+ return value;
+}
+template <>
+inline std::string TestUtils::toString(std::string value, const char*)
+{
+ return value;
+}
+template <>
+inline std::string TestUtils::toString(const char* value, const char*)
+{
+ return value;
+}
+
+#define TEST_COMPARE(x,y) \
+ TestUtils::compare(x,y,#x,#y);
+
+