Index: ppapi/tests/test_case.h |
diff --git a/ppapi/tests/test_case.h b/ppapi/tests/test_case.h |
index 0a96c9b6652e4d11ba5082a95b4ed03d68a301cc..177e227d46522b1ae2a3cb0a84b36d73267d3a34 100644 |
--- a/ppapi/tests/test_case.h |
+++ b/ppapi/tests/test_case.h |
@@ -9,6 +9,7 @@ |
#include <limits> |
#include <map> |
#include <set> |
+#include <sstream> |
#include <string> |
#include "ppapi/c/pp_resource.h" |
@@ -273,6 +274,56 @@ class TestCaseFactory { |
static TestCaseFactory* head_; |
}; |
+ |
+// This is an implementation detail, for use by ASSERT macros. |
+template <class T> |
+struct StringinatorBase { |
+ static std::string ToString(const T& value, const std::string& s) { |
+ std::stringstream stream; |
+ stream << value; |
+ return s + "(" + stream.str() + ")"; |
+ } |
+ private: |
+ // Not implemented, do not use. |
+ StringinatorBase(); |
+ ~StringinatorBase(); |
+}; |
+// The default version is for types that are not known to be stringifiable. |
+// TODO(dmichael): Are there some useful traits for this? |
+template <class T> |
+struct Stringinator { |
+ static std::string ToString(const T& value, const std::string& s) { |
+ return s; |
+ } |
+ private: |
+ // Not implemented, do not use. |
+ Stringinator(); |
+ ~Stringinator(); |
+}; |
+#define STRINGINATOR_FOR_TYPE(type) \ |
+template <> \ |
+struct Stringinator<type> : public StringinatorBase<type> {}; |
+STRINGINATOR_FOR_TYPE(int32_t); |
+STRINGINATOR_FOR_TYPE(uint32_t); |
+STRINGINATOR_FOR_TYPE(int64_t); |
+STRINGINATOR_FOR_TYPE(uint64_t); |
+STRINGINATOR_FOR_TYPE(float); |
+STRINGINATOR_FOR_TYPE(double); |
+STRINGINATOR_FOR_TYPE(bool); |
+STRINGINATOR_FOR_TYPE(std::string); |
+//TODO(dmichael): Put this somewhere else |
+template <class T> |
+std::string ToString(const T& param, const char* s) { |
+ return Stringinator<T>::ToString(param, std::string(s)); |
+} |
+// This overload is necessary to allow values from pp_errors.h such as PP_OK to |
+// work. They won't automatically convert to an integral type to instantiate the |
+// above template. |
+inline std::string ToString(int32_t param, const char* s) { |
+ return Stringinator<int32_t>::ToString(param, std::string(s)); |
+} |
+#define TO_STRING(param) ToString(param, #param) |
+ |
// Use the REGISTER_TEST_CASE macro in your TestCase implementation file to |
// register your TestCase. If your test is named TestFoo, then add the |
// following to test_foo.cc: |
@@ -373,7 +424,13 @@ class TestCaseFactory { |
return MakeFailureMessage(__FILE__, __LINE__, #cmd); \ |
} while (false) |
#define ASSERT_FALSE(cmd) ASSERT_TRUE(!(cmd)) |
-#define ASSERT_EQ(a, b) ASSERT_TRUE((a) == (b)) |
+#define ASSERT_BINARY_INTERNAL(a, op, b) \ |
+ do { \ |
+ if (!((a) op (b))) \ |
+ return MakeFailureMessage(__FILE__, __LINE__, \ |
+ (TO_STRING((a)) + " " #op " " + TO_STRING((b))).c_str()); \ |
+ } while (false) |
+#define ASSERT_EQ(a, b) ASSERT_BINARY_INTERNAL((a), ==, (b)) |
#define ASSERT_NE(a, b) ASSERT_TRUE((a) != (b)) |
#define ASSERT_LT(a, b) ASSERT_TRUE((a) < (b)) |
#define ASSERT_LE(a, b) ASSERT_TRUE((a) <= (b)) |