Index: third_party/crazy_linker/crazy_linker/minitest/minitest.h |
diff --git a/third_party/crazy_linker/crazy_linker/minitest/minitest.h b/third_party/crazy_linker/crazy_linker/minitest/minitest.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..487b0e66f1a92c3d1175a2ed61260722216aae72 |
--- /dev/null |
+++ b/third_party/crazy_linker/crazy_linker/minitest/minitest.h |
@@ -0,0 +1,465 @@ |
+// Copyright (C) 2013 The Android Open Source Project |
+// All rights reserved. |
+// |
+// Redistribution and use in source and binary forms, with or without |
+// modification, are permitted provided that the following conditions |
+// are met: |
+// // Redistributions of source code must retain the above copyright |
+// notice, this list of conditions and the following disclaimer. |
+// // Redistributions in binary form must reproduce the above copyright |
+// notice, this list of conditions and the following disclaimer in |
+// the documentation and/or other materials provided with the |
+// distribution. |
+// |
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS |
+// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE |
+// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, |
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
+// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS |
+// OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED |
+// AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT |
+// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
+// SUCH DAMAGE. |
+ |
+#ifndef MINITEST_MINITEST_H |
+#define MINITEST_MINITEST_H |
+ |
+// Minitest is a minimalistic unit testing framework designed specifically |
+// for the Android support library. |
+// |
+// - Unit tests must be written in C++, but no C++ runtime implementation |
+// is either required or _supported_. This is by design. |
+// |
+// _ Inspired by GoogleTest, you can use the TEST macro to define a new |
+// test case easily, and it can contain EXPECT_XX|ASSERT_XX statements. |
+// |
+// For example: |
+// |
+// TEST(stdio, strlen) { |
+// EXPECT_EQ(3, strlen("foo")); |
+// EXPECT_EQ(1, srlen("a")); |
+// } |
+// |
+// However, there are important differences / limitations: |
+// |
+// o You cannot stream strings into an except or assert statement. |
+// Minitest provides a TEST_TEXT macro to do that instead. |
+// |
+// In other words, replace: |
+// |
+// EXPECT_EQ(expected, expression) << "When checking 'foo'"; |
+// |
+// With: |
+// TEST_TEXT << "When checking 'foo'"; |
+// EXPECT_EQ(expected, expression); |
+// |
+// The context text is only printed on failure. |
+// |
+// o TEST_F() is not supported (for now). |
+// |
+// o EXPECT/ASSERT statements only work inside a TESET() function, not |
+// in a function called by it. |
+// |
+// o No test death detection. |
+// |
+// - You can use minitest::Format() to stream formatted output into |
+// a TEST_TEXT context, as in: |
+// |
+// for (size_t n = 0; n < kMaxCount; n++) { |
+// TEST_TEXT << "Checking string : " |
+// << minitest;:Format("%z/%z", n+1, kMaxCount); |
+// EXPECT_EQ(kExpected[n], Foo(kString[n])); |
+// } |
+// |
+#include <stdio.h> |
+#include <string.h> |
+ |
+namespace minitest { |
+ |
+namespace internal { |
+ |
+// AddConst<T>::type adds a 'const' qualifier to type T. |
+// Examples: |
+// int -> const int |
+// char* -> const char* const |
+// const char* -> const char* const |
+// char* const -> const char* const |
+template <typename T> |
+struct AddConst { |
+ typedef const T type; |
+}; |
+template <typename T> |
+struct AddConst<const T> { |
+ typedef const T type; |
+}; |
+template <typename T> |
+struct AddConst<T*> { |
+ typedef const T* const type; |
+}; |
+template <typename T> |
+struct AddConst<const T*> { |
+ typedef const T* const type; |
+}; |
+ |
+// String class used to accumulate error messages. |
+// Very similar to std::string but also supports streaming into it |
+// for easier formatted output, as in: |
+// |
+// String str; |
+// int x = 42; |
+// str << "x is '" << x << "'\n"; |
+// |
+// You can also use minitest::Format() as in: |
+// |
+// str << minitest::Format("Hex value %08x\n", x); |
+// |
+class String { |
+public: |
+ String() : str_(NULL), size_(0), capacity_(0) {} |
+ String(const char* str, size_t len); |
+ |
+ explicit String(const char* str) { |
+ String(str, ::strlen(str)); |
+ } |
+ |
+ String(const String& other) { |
+ String(other.str_, other.size_); |
+ } |
+ |
+ String& operator=(const String& other) { |
+ (*this) += other; |
+ return *this; |
+ } |
+ |
+ char& operator[](size_t index) { |
+ return str_[index]; |
+ } |
+ |
+ ~String() { Clear(); } |
+ |
+ const char* c_str() const { return str_; } |
+ const char* data() const { return str_; } |
+ size_t size() const { return size_; } |
+ bool empty() const { return size_ == 0; } |
+ |
+ String& operator+=(const String& other); |
+ String& operator+=(const char* str); |
+ String& operator+=(char ch); |
+ |
+ String operator+(const String& other) const { |
+ String result(*this); |
+ result += other; |
+ return result; |
+ } |
+ |
+ String operator+(const char* str) const { |
+ String result(*this); |
+ result += str; |
+ return result; |
+ } |
+ |
+ // Basic formatting operators. |
+ String& operator<<(const String& other); |
+ String& operator<<(const char* str); |
+ |
+#define MINITEST_OPERATOR_LL_(ParamType) \ |
+ String& operator<<(ParamType v) |
+ |
+ MINITEST_OPERATOR_LL_(bool); |
+ MINITEST_OPERATOR_LL_(char); |
+ MINITEST_OPERATOR_LL_(signed char); |
+ MINITEST_OPERATOR_LL_(short); |
+ MINITEST_OPERATOR_LL_(int); |
+ MINITEST_OPERATOR_LL_(long); |
+ MINITEST_OPERATOR_LL_(long long); |
+ MINITEST_OPERATOR_LL_(unsigned char); |
+ MINITEST_OPERATOR_LL_(unsigned short); |
+ MINITEST_OPERATOR_LL_(unsigned int); |
+ MINITEST_OPERATOR_LL_(unsigned long); |
+ MINITEST_OPERATOR_LL_(unsigned long long); |
+ MINITEST_OPERATOR_LL_(float); |
+ MINITEST_OPERATOR_LL_(double); |
+ MINITEST_OPERATOR_LL_(const void*); |
+ |
+#undef MINITEST_OPERATOR_LL_ |
+ |
+ void Clear(); |
+ void Resize(size_t new_size); |
+ |
+private: |
+ void Reserve(size_t new_capacity); |
+ char* str_; |
+ size_t size_; |
+ size_t capacity_; |
+}; |
+ |
+} // namespace internal |
+ |
+// A helper function that can be used to generate formatted output |
+// as a temporary string. Use like printf(), but returns a new String |
+// object. Useful to stream into TEST_TEXT() objects, as in: |
+// |
+// TEST_TEXT << "Using " |
+// << minitest::Format("%08d", bytes) |
+// << " bytes"; |
+// |
+internal::String Format(const char* format, ...); |
+ |
+class TestCase { |
+public: |
+ enum Result { |
+ PASS = 0, |
+ FAIL, |
+ FATAL |
+ }; |
+ |
+ TestCase() : result_(PASS) {} |
+ ~TestCase() {} |
+ |
+ void Failure(); |
+ void FatalFailure(); |
+ |
+ Result result() { return result_; } |
+ |
+ internal::String& GetText(); |
+ |
+private: |
+ Result result_; |
+ internal::String text_; |
+}; |
+ |
+// Type of a function defined through the TEST(<test>,<case>) macro. |
+typedef void (TestFunction)(TestCase* testcase); |
+ |
+// Used internally to register new test functions. |
+void RegisterTest(const char* test_name, |
+ const char* case_name, |
+ TestFunction* test_function); |
+ |
+#define MINITEST_TEST_FUNCTION(testname, casename) \ |
+ MINITEST_TEST_FUNCTION_(testname, casename) |
+ |
+#define MINITEST_TEST_FUNCTION_(testname, casename) \ |
+ minitest_##testname##_##casename |
+ |
+#define TEST(testname, casename) \ |
+ static void MINITEST_TEST_FUNCTION(testname, casename)(minitest::TestCase*); \ |
+ static void __attribute__((constructor)) \ |
+ RegisterMiniTest##testname##_##casename() { \ |
+ minitest::RegisterTest(#testname, #casename, \ |
+ &MINITEST_TEST_FUNCTION(testname, casename)); \ |
+ } \ |
+ void MINITEST_TEST_FUNCTION(testname, casename)(\ |
+ minitest::TestCase* minitest_testcase) |
+ |
+// Use this macro to add context text before an EXPECT or ASSERT statement |
+// For example: |
+// |
+// for (size_t n = 0; n < MAX; ++n) { |
+// TEST_TEXT << "When checking " << kStrings[n]; |
+// EXPECT_STREQ(kExpected[n], kStrings[n]); |
+// } |
+// |
+// The text will only be printed in case of failure in the next |
+// EXPECT/ASSERT statement. |
+// |
+#define TEST_TEXT minitest_testcase->GetText() |
+ |
+// EXPECT_TRUE() must evaluate to something that supports the << operator |
+// to receive debugging strings only in case of failure. |
+#define EXPECT_TRUE(expression) \ |
+ do { \ |
+ if (!(expression)) { \ |
+ printf("EXPECT_TRUE:%s:%d: expression '%s' returned 'false', expected 'true'\n", \ |
+ __FILE__, __LINE__, #expression); \ |
+ minitest_testcase->Failure(); \ |
+ } \ |
+ } while (0) |
+ |
+#define EXPECT_FALSE(expression) \ |
+ do { \ |
+ if (!!(expression)) { \ |
+ printf("EXPECT_FALSE:%s:%d: expression '%s' returned 'true', expected 'false'\n", \ |
+ __FILE__, __LINE__, #expression); \ |
+ minitest_testcase->Failure(); \ |
+ } \ |
+ } while (0) |
+ |
+#define MINITEST_DEFINE_LOCAL_EXPR_(varname, expr) \ |
+ typedef minitest::internal::AddConst<__typeof__(expr)>::type \ |
+ varname##Type; \ |
+ const varname##Type varname = (expr); |
+ |
+#define MINITEST_EXPECT_ASSERT_BINOP_(opname, op, expected, expression, is_assert) \ |
+ do { \ |
+ MINITEST_DEFINE_LOCAL_EXPR_(minitest_expected, expected); \ |
+ MINITEST_DEFINE_LOCAL_EXPR_(minitest_actual, expression); \ |
+ if (!(minitest_actual op minitest_expected)) { \ |
+ printf("%s" #opname ":%s:%d: with expression '%s'\n", \ |
+ is_assert ? "ASSERT_" : "EXPECT_", __FILE__, __LINE__, \ |
+ #expression); \ |
+ minitest::internal::String minitest_str; \ |
+ minitest_str << minitest_actual; \ |
+ printf("actual : %s\n", minitest_str.c_str()); \ |
+ minitest_str.Clear(); \ |
+ minitest_str << minitest_expected; \ |
+ printf("expected : %s\n", minitest_str.c_str()); \ |
+ if (is_assert) { \ |
+ minitest_testcase->FatalFailure(); \ |
+ return; \ |
+ } \ |
+ minitest_testcase->Failure(); \ |
+ } \ |
+ } while (0) |
+ |
+#define MINITEST_EXPECT_BINOP_(opname, op, expected, expression) \ |
+ MINITEST_EXPECT_ASSERT_BINOP_(opname, op, expected, expression, false) |
+ |
+#define EXPECT_EQ(expected, expression) \ |
+ MINITEST_EXPECT_BINOP_(EQ, ==, expected, expression) |
+ |
+#define EXPECT_NE(expected, expression) \ |
+ MINITEST_EXPECT_BINOP_(NE, !=, expected, expression) |
+ |
+#define EXPECT_LE(expected, expression) \ |
+ MINITEST_EXPECT_BINOP_(LE, <=, expected, expression) |
+ |
+#define EXPECT_LT(expected, expression) \ |
+ MINITEST_EXPECT_BINOP_(LT, <, expected, expression) |
+ |
+#define EXPECT_GE(expected, expression) \ |
+ MINITEST_EXPECT_BINOP_(GE, >=, expected, expression) |
+ |
+#define EXPECT_GT(expected, expression) \ |
+ MINITEST_EXPECT_BINOP_(GT, >, expected, expression) |
+ |
+#define MINITEST_EXPECT_ASSERT_STR_(expected, expression, is_eq, is_assert) \ |
+ do { \ |
+ const char* minitest_prefix = is_assert ? "ASSERT_STR" : "EXPECT_STR"; \ |
+ const char* minitest_suffix = is_eq ? "EQ" : "NEQ"; \ |
+ const char* minitest_expected = (expected); \ |
+ const char* minitest_actual = (expression); \ |
+ if (minitest_actual == NULL) { \ |
+ printf("%s%s:%s:%d: expression '%s' is NULL!\n", \ |
+ minitest_prefix, minitest_suffix, \ |
+ __FILE__, __LINE__, #expression); \ |
+ minitest_testcase->Failure(); \ |
+ } else { \ |
+ bool minitest_eq = !strcmp(minitest_expected, minitest_actual); \ |
+ if (minitest_eq != is_eq) { \ |
+ printf("%s%s:%s:%d: with expression '%s'\n", \ |
+ minitest_prefix, minitest_suffix, \ |
+ __FILE__, __LINE__, #expression); \ |
+ printf("actual : %s\n", minitest_actual); \ |
+ printf("expected : %s\n", minitest_expected); \ |
+ minitest_testcase->Failure(); \ |
+ } \ |
+ } \ |
+ } while (0) |
+ |
+#define EXPECT_STREQ(expected, expression) \ |
+ MINITEST_EXPECT_ASSERT_STR_(expected, expression, true, false) |
+ |
+#define EXPECT_STRNEQ(expected, expression) \ |
+ MINITEST_EXPECT_ASSERT_STR_(expected, expression, false, false) |
+ |
+#define MINITEST_EXPECT_ASSERT_MEM_(expected, expected_len, expression, expression_len, is_eq, is_assert) \ |
+ do { \ |
+ const char* minitest_prefix = is_assert ? "ASSERT_MEM" : "EXPECT_MEM"; \ |
+ const char* minitest_suffix = is_eq ? "EQ" : "NEQ"; \ |
+ const char* minitest_expected = (expected); \ |
+ size_t minitest_expected_len = static_cast<size_t>(expected_len); \ |
+ const char* minitest_actual = (expression); \ |
+ size_t minitest_actual_len = static_cast<size_t>(expression_len); \ |
+ if (minitest_actual == NULL) { \ |
+ printf("%s%s:%s:%d: expression '%s' is NULL!\n", \ |
+ minitest_prefix, minitest_suffix, \ |
+ __FILE__, __LINE__, #expression); \ |
+ minitest_testcase->Failure(); \ |
+ } else if (minitest_actual_len != minitest_expected_len) { \ |
+ printf("%s:%s:%s:%d: size mistmatch for expression '%s'\n", \ |
+ minitest_prefix, minitest_suffix, \ |
+ __FILE__, __LINE__, #expression); \ |
+ printf("actual size : %d (0x%x)\n", minitest_actual_len, minitest_actual_len); \ |
+ printf("expected size : %d (0x%x)\n", minitest_expected_len, minitest_expected_len); \ |
+ minitest_testcase->Failure(); \ |
+ } else { \ |
+ bool minitest_eq = !memcmp(minitest_expected, minitest_actual, minitest_expected_len); \ |
+ if (minitest_eq != is_eq) { \ |
+ printf("%s%s:%s:%d: with expression '%s' of %d bytes\n", \ |
+ minitest_prefix, minitest_suffix, \ |
+ __FILE__, __LINE__, #expression, minitest_expected_len); \ |
+ printf("actual : '%.*s'\n", minitest_expected_len, minitest_actual); \ |
+ printf("expected : '%.*s'\n", minitest_expected_len, minitest_expected); \ |
+ minitest_testcase->Failure(); \ |
+ } \ |
+ } \ |
+ } while (0) |
+ |
+#define EXPECT_MEMEQ(expected, expected_len, expression, expression_len) \ |
+ MINITEST_EXPECT_ASSERT_MEM_(expected, expected_len, expression, expression_len, true, false) |
+ |
+#define EXPECT_MEMNEQ(expected, expected_len, expression, expression_len) \ |
+ MINITEST_EXPECT_ASSERT_MEM_(expected, expected_len, expression, expression_len, false, false) |
+ |
+#define ASSERT_TRUE(expression) \ |
+ do { \ |
+ if (!(expression)) { \ |
+ printf("ASSERT_TRUE:%s:%d: expression '%s' return 'false', expected 'true'\n", \ |
+ __FILE__, __LINE__, #expression); \ |
+ minitest_testcase->FatalFailure(); \ |
+ return; \ |
+ } \ |
+ } while (0) |
+ |
+#define ASSERT_FALSE(expression) \ |
+ do { \ |
+ if (!!(expression)) { \ |
+ printf("ASSERT_FALSE:%s:%d: expression '%s' return 'true', expected 'false'\n", \ |
+ __FILE__, __LINE__, #expression); \ |
+ minitest_testcase->FatalFailure(); \ |
+ return; \ |
+ } \ |
+ } while (0) |
+ |
+#define MINITEST_ASSERT_BINOP_(opname, op, expected, expression) \ |
+ MINITEST_EXPECT_ASSERT_BINOP_(opname, op, expected, expression, true) |
+ |
+#define ASSERT_EQ(expected, expression) \ |
+ MINITEST_ASSERT_BINOP_(EQ, ==, expected, expression) |
+ |
+#define ASSERT_NE(expected, expression) \ |
+ MINITEST_ASSERT_BINOP_(NE, !=, expected, expression) |
+ |
+#define ASSERT_LE(expected, expression) \ |
+ MINITEST_ASSERT_BINOP_(LE, <=, expected, expression) |
+ |
+#define ASSERT_LT(expected, expression) \ |
+ MINITEST_ASSERT_BINOP_(LT, <, expected, expression) |
+ |
+#define ASSERT_GE(expected, expression) \ |
+ MINITEST_ASSERT_BINOP_(GE, >=, expected, expression) |
+ |
+#define ASSERT_GT(expected, expression) \ |
+ MINITEST_ASSERT_BINOP_(GT, >, expected, expression) |
+ |
+#define ASSERT_STREQ(expected, expression) \ |
+ MINITEST_EXPECT_ASSERT_STR_(expected, expression, true, true) |
+ |
+#define ASSERT_STRNEQ(expected, expression) \ |
+ MINITEST_EXPECT_ASSERT_STR_(expected, expression, false, true) |
+ |
+#define ASSERT_MEMEQ(expected, expected_len, expression, expression_len) \ |
+ MINITEST_EXPECT_ASSERT_MEM_(expected, expected_len, expression, expression_len, true, true) |
+ |
+#define ASSERT_MEMNEQ(expected, expected_len, expression, expression_len) \ |
+ MINITEST_EXPECT_ASSERT_MEM_(expected, expected_len, expression, expression_len, false, true) |
+ |
+#define ARRAY_LEN(x) (sizeof(x)/sizeof((x)[0])) |
+ |
+} // namespace minitest |
+ |
+#endif // MINITEST_MINITEST_H |