2017-06-15 13:22:55 -07:00
|
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
|
/* Copyright (c) FIRST 2017. All Rights Reserved. */
|
|
|
|
|
/* Open Source Software - may be modified and shared by FRC teams. The code */
|
|
|
|
|
/* must be accompanied by the FIRST BSD license file in the root directory of */
|
|
|
|
|
/* the project. */
|
|
|
|
|
/*----------------------------------------------------------------------------*/#ifndef UNIT_JSON_H_
|
|
|
|
|
#define UNIT_JSON_H_
|
|
|
|
|
|
|
|
|
|
#include <ostream>
|
|
|
|
|
|
2018-04-29 23:33:19 -07:00
|
|
|
#include "wpi/json.h"
|
2017-06-15 13:22:55 -07:00
|
|
|
|
|
|
|
|
namespace wpi {
|
|
|
|
|
|
|
|
|
|
inline
|
|
|
|
|
void PrintTo(const json& j, std::ostream* os) {
|
|
|
|
|
*os << j.dump();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class JsonTest {
|
|
|
|
|
public:
|
|
|
|
|
static const json::json_value& GetValue(const json& j) {
|
|
|
|
|
return j.m_value;
|
|
|
|
|
}
|
|
|
|
|
static json::pointer GetObject(json::iterator it) {
|
|
|
|
|
return it.m_object;
|
|
|
|
|
}
|
|
|
|
|
static json::const_pointer GetObject(json::const_iterator it) {
|
|
|
|
|
return it.m_object;
|
|
|
|
|
}
|
|
|
|
|
static std::string pop_back(json::json_pointer& p) {
|
|
|
|
|
return p.pop_back();
|
|
|
|
|
}
|
|
|
|
|
static json::json_pointer top(const json::json_pointer& p) {
|
|
|
|
|
return p.top();
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
} // namespace wpi
|
|
|
|
|
|
|
|
|
|
// clang warns on TEST_THROW_MSG(x == y, ...) saying the result is unused.
|
|
|
|
|
// suppress this warning.
|
|
|
|
|
#if defined(__clang__)
|
|
|
|
|
#pragma GCC diagnostic ignored "-Wunused-comparison"
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
// variant of GTEST_TEST_THROW_ that also checks the exception's message.
|
|
|
|
|
#define TEST_THROW_MSG(statement, expected_exception, expected_msg, fail) \
|
|
|
|
|
GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
|
|
|
|
|
if (::testing::internal::ConstCharPtr gtest_msg = "") { \
|
|
|
|
|
bool gtest_caught_expected = false; \
|
|
|
|
|
try { \
|
|
|
|
|
GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
|
|
|
|
|
} \
|
|
|
|
|
catch (expected_exception const& gtest_ex) { \
|
|
|
|
|
gtest_caught_expected = true; \
|
|
|
|
|
if (::std::string(gtest_ex.what()) != expected_msg) { \
|
|
|
|
|
::testing::AssertionResult gtest_ar = ::testing::AssertionFailure(); \
|
|
|
|
|
gtest_ar \
|
|
|
|
|
<< "Expected: " #statement " throws an exception with message \"" \
|
|
|
|
|
<< expected_msg "\".\n Actual: it throws message \"" \
|
|
|
|
|
<< gtest_ex.what() << "\"."; \
|
|
|
|
|
fail(gtest_ar.failure_message()); \
|
|
|
|
|
} \
|
|
|
|
|
} \
|
|
|
|
|
catch (...) { \
|
|
|
|
|
gtest_msg.value = \
|
|
|
|
|
"Expected: " #statement " throws an exception of type " \
|
|
|
|
|
#expected_exception ".\n Actual: it throws a different type."; \
|
|
|
|
|
goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
|
|
|
|
|
} \
|
|
|
|
|
if (!gtest_caught_expected) { \
|
|
|
|
|
gtest_msg.value = \
|
|
|
|
|
"Expected: " #statement " throws an exception of type " \
|
|
|
|
|
#expected_exception ".\n Actual: it throws nothing."; \
|
|
|
|
|
goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
|
|
|
|
|
} \
|
|
|
|
|
} else \
|
|
|
|
|
GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__): \
|
|
|
|
|
fail(gtest_msg.value)
|
|
|
|
|
|
|
|
|
|
#define EXPECT_THROW_MSG(statement, expected_exception, expected_msg) \
|
|
|
|
|
TEST_THROW_MSG(statement, expected_exception, expected_msg, GTEST_NONFATAL_FAILURE_)
|
|
|
|
|
|
|
|
|
|
#define ASSERT_THROW_MSG(statement, expected_exception, expected_msg) \
|
|
|
|
|
TEST_THROW_MSG(statement, expected_exception, expected_msg, GTEST_FATAL_FAILURE_)
|
|
|
|
|
|
|
|
|
|
#endif
|