Checks.h 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. #ifndef UNITTEST_CHECKS_H
  2. #define UNITTEST_CHECKS_H
  3. #include "Config.h"
  4. #include "TestResults.h"
  5. #include "MemoryOutStream.h"
  6. namespace UnitTest {
  7. template< typename Value >
  8. bool Check(Value const value)
  9. {
  10. return !!value; // doing double negative to avoid silly VS warnings
  11. }
  12. template< typename Expected, typename Actual >
  13. void CheckEqual(TestResults& results, Expected const& expected, Actual const& actual, TestDetails const& details)
  14. {
  15. if (!(expected == actual))
  16. {
  17. UnitTest::MemoryOutStream stream;
  18. stream << "Expected " << expected << " but was " << actual;
  19. results.OnTestFailure(details, stream.GetText());
  20. }
  21. }
  22. void CheckEqual(TestResults& results, char const* expected, char const* actual, TestDetails const& details);
  23. void CheckEqual(TestResults& results, char* expected, char* actual, TestDetails const& details);
  24. void CheckEqual(TestResults& results, char* expected, char const* actual, TestDetails const& details);
  25. void CheckEqual(TestResults& results, char const* expected, char* actual, TestDetails const& details);
  26. template< typename Expected, typename Actual, typename Tolerance >
  27. bool AreClose(Expected const& expected, Actual const& actual, Tolerance const& tolerance)
  28. {
  29. return (actual >= (expected - tolerance)) && (actual <= (expected + tolerance));
  30. }
  31. template< typename Expected, typename Actual, typename Tolerance >
  32. void CheckClose(TestResults& results, Expected const& expected, Actual const& actual, Tolerance const& tolerance,
  33. TestDetails const& details)
  34. {
  35. if (!AreClose(expected, actual, tolerance))
  36. {
  37. UnitTest::MemoryOutStream stream;
  38. stream << "Expected " << expected << " +/- " << tolerance << " but was " << actual;
  39. results.OnTestFailure(details, stream.GetText());
  40. }
  41. }
  42. template< typename Expected, typename Actual >
  43. void CheckArrayEqual(TestResults& results, Expected const& expected, Actual const& actual,
  44. int const count, TestDetails const& details)
  45. {
  46. bool equal = true;
  47. for (int i = 0; i < count; ++i)
  48. equal &= (expected[i] == actual[i]);
  49. if (!equal)
  50. {
  51. UnitTest::MemoryOutStream stream;
  52. stream << "Expected [ ";
  53. for (int expectedIndex = 0; expectedIndex < count; ++expectedIndex)
  54. stream << expected[expectedIndex] << " ";
  55. stream << "] but was [ ";
  56. for (int actualIndex = 0; actualIndex < count; ++actualIndex)
  57. stream << actual[actualIndex] << " ";
  58. stream << "]";
  59. results.OnTestFailure(details, stream.GetText());
  60. }
  61. }
  62. template< typename Expected, typename Actual, typename Tolerance >
  63. bool ArrayAreClose(Expected const& expected, Actual const& actual, int const count, Tolerance const& tolerance)
  64. {
  65. bool equal = true;
  66. for (int i = 0; i < count; ++i)
  67. equal &= AreClose(expected[i], actual[i], tolerance);
  68. return equal;
  69. }
  70. template< typename Expected, typename Actual, typename Tolerance >
  71. void CheckArrayClose(TestResults& results, Expected const& expected, Actual const& actual,
  72. int const count, Tolerance const& tolerance, TestDetails const& details)
  73. {
  74. bool equal = ArrayAreClose(expected, actual, count, tolerance);
  75. if (!equal)
  76. {
  77. UnitTest::MemoryOutStream stream;
  78. stream << "Expected [ ";
  79. for (int expectedIndex = 0; expectedIndex < count; ++expectedIndex)
  80. stream << expected[expectedIndex] << " ";
  81. stream << "] +/- " << tolerance << " but was [ ";
  82. for (int actualIndex = 0; actualIndex < count; ++actualIndex)
  83. stream << actual[actualIndex] << " ";
  84. stream << "]";
  85. results.OnTestFailure(details, stream.GetText());
  86. }
  87. }
  88. template< typename Expected, typename Actual, typename Tolerance >
  89. void CheckArray2DClose(TestResults& results, Expected const& expected, Actual const& actual,
  90. int const rows, int const columns, Tolerance const& tolerance, TestDetails const& details)
  91. {
  92. bool equal = true;
  93. for (int i = 0; i < rows; ++i)
  94. equal &= ArrayAreClose(expected[i], actual[i], columns, tolerance);
  95. if (!equal)
  96. {
  97. UnitTest::MemoryOutStream stream;
  98. stream << "Expected [ ";
  99. for (int expectedRow = 0; expectedRow < rows; ++expectedRow)
  100. {
  101. stream << "[ ";
  102. for (int expectedColumn = 0; expectedColumn < columns; ++expectedColumn)
  103. stream << expected[expectedRow][expectedColumn] << " ";
  104. stream << "] ";
  105. }
  106. stream << "] +/- " << tolerance << " but was [ ";
  107. for (int actualRow = 0; actualRow < rows; ++actualRow)
  108. {
  109. stream << "[ ";
  110. for (int actualColumn = 0; actualColumn < columns; ++actualColumn)
  111. stream << actual[actualRow][actualColumn] << " ";
  112. stream << "] ";
  113. }
  114. stream << "]";
  115. results.OnTestFailure(details, stream.GetText());
  116. }
  117. }
  118. }
  119. #endif