|
|
@@ -11,7 +11,6 @@
|
|
|
|
|
|
#include "MapComparer.h"
|
|
|
|
|
|
-#include "../lib/ScopeGuard.h"
|
|
|
#include "../lib/mapping/CMap.h"
|
|
|
|
|
|
#define VCMI_CHECK_FIELD_EQUAL_P(field) EXPECT_EQ(actual->field, expected->field)
|
|
|
@@ -272,188 +271,3 @@ void MapComparer::operator() (const std::unique_ptr<CMap>& actual, const std::un
|
|
|
this->expected = expected.get();
|
|
|
compare();
|
|
|
}
|
|
|
-
|
|
|
-//JsonMapComparer
|
|
|
-JsonMapComparer::JsonMapComparer(bool strict_)
|
|
|
- : strict(strict_)
|
|
|
-{
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-vstd::ScopeGuard<JsonMapComparer::TScopeGuard> JsonMapComparer::pushName(const std::string & name)
|
|
|
-{
|
|
|
- namePath.push_back(name);
|
|
|
- return vstd::makeScopeGuard<TScopeGuard>([this](){namePath.pop_back();});
|
|
|
-}
|
|
|
-
|
|
|
-std::string JsonMapComparer::buildMessage(const std::string & message)
|
|
|
-{
|
|
|
- std::stringstream buf;
|
|
|
-
|
|
|
- for(auto & s : namePath)
|
|
|
- buf << s << "|";
|
|
|
- buf << " " << message;
|
|
|
- return buf.str();
|
|
|
-}
|
|
|
-
|
|
|
-void JsonMapComparer::addError(const std::string & message)
|
|
|
-{
|
|
|
- FAIL()<<buildMessage(message);
|
|
|
-}
|
|
|
-
|
|
|
-bool JsonMapComparer::isEmpty(const JsonNode & value)
|
|
|
-{
|
|
|
- switch (value.getType())
|
|
|
- {
|
|
|
- case JsonNode::JsonType::DATA_NULL:
|
|
|
- return true;
|
|
|
- case JsonNode::JsonType::DATA_BOOL:
|
|
|
- return !value.Bool();
|
|
|
- case JsonNode::JsonType::DATA_FLOAT:
|
|
|
- return value.Float() == 0;
|
|
|
- case JsonNode::JsonType::DATA_STRING:
|
|
|
- return value.String() == "";
|
|
|
- case JsonNode::JsonType::DATA_VECTOR:
|
|
|
- return value.Vector().empty();
|
|
|
- case JsonNode::JsonType::DATA_STRUCT:
|
|
|
- return value.Struct().empty();
|
|
|
- break;
|
|
|
- default:
|
|
|
- EXPECT_TRUE(false) << "Unknown Json type";
|
|
|
- return false;
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-void JsonMapComparer::check(const bool condition, const std::string & message)
|
|
|
-{
|
|
|
- if(strict)
|
|
|
- ASSERT_TRUE(condition) << buildMessage(message);
|
|
|
- else
|
|
|
- EXPECT_TRUE(condition) << buildMessage(message);
|
|
|
-}
|
|
|
-
|
|
|
-void JsonMapComparer::checkEqualInteger(const si64 actual, const si64 expected)
|
|
|
-{
|
|
|
- if(actual != expected)
|
|
|
- {
|
|
|
- check(false, boost::str(boost::format("'%d' != '%d'") % actual % expected));
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-void JsonMapComparer::checkEqualFloat(const double actual, const double expected)
|
|
|
-{
|
|
|
- if(std::abs(actual - expected) > 1e-6)
|
|
|
- {
|
|
|
- check(false, boost::str(boost::format("'%d' != '%d' (diff %d)") % actual % expected % (expected - actual)));
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-void JsonMapComparer::checkEqualString(const std::string & actual, const std::string & expected)
|
|
|
-{
|
|
|
- if(actual != expected)
|
|
|
- {
|
|
|
- check(false, boost::str(boost::format("'%s' != '%s'") % actual % expected));
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-void JsonMapComparer::checkEqualJson(const JsonMap & actual, const JsonMap & expected)
|
|
|
-{
|
|
|
- for(const auto & p : expected)
|
|
|
- checkStructField(actual, p.first, p.second);
|
|
|
- for(const auto & p : actual)
|
|
|
- checkExcessStructField(p.second, p.first, expected);
|
|
|
-}
|
|
|
-
|
|
|
-void JsonMapComparer::checkEqualJson(const JsonVector & actual, const JsonVector & expected)
|
|
|
-{
|
|
|
- check(actual.size() == expected.size(), "size mismatch");
|
|
|
-
|
|
|
- size_t sz = std::min(actual.size(), expected.size());
|
|
|
-
|
|
|
- for(size_t idx = 0; idx < sz; idx ++)
|
|
|
- {
|
|
|
- auto guard = pushName(boost::to_string(idx));
|
|
|
-
|
|
|
- checkEqualJson(actual.at(idx), expected.at(idx));
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-void JsonMapComparer::checkEqualJson(const JsonNode & actual, const JsonNode & expected)
|
|
|
-{
|
|
|
- //name has been pushed before
|
|
|
-
|
|
|
- const bool validType = actual.getType() == expected.getType();
|
|
|
-
|
|
|
- if(!validType)
|
|
|
- addError("type mismatch");
|
|
|
-
|
|
|
- //do detail checks avoiding assertions in JsonNode
|
|
|
- if(validType)
|
|
|
- {
|
|
|
- switch (actual.getType())
|
|
|
- {
|
|
|
- case JsonNode::JsonType::DATA_NULL:
|
|
|
- break; //do nothing
|
|
|
- case JsonNode::JsonType::DATA_BOOL:
|
|
|
- check(actual.Bool() == expected.Bool(), "mismatch");
|
|
|
- break;
|
|
|
- case JsonNode::JsonType::DATA_FLOAT:
|
|
|
- checkEqualFloat(actual.Float(),expected.Float());
|
|
|
- break;
|
|
|
- case JsonNode::JsonType::DATA_STRING:
|
|
|
- checkEqualString(actual.String(),expected.String());
|
|
|
- break;
|
|
|
- case JsonNode::JsonType::DATA_VECTOR:
|
|
|
- checkEqualJson(actual.Vector(), expected.Vector());
|
|
|
- break;
|
|
|
- case JsonNode::JsonType::DATA_STRUCT:
|
|
|
- checkEqualJson(actual.Struct(), expected.Struct());
|
|
|
- break;
|
|
|
- case JsonNode::JsonType::DATA_INTEGER:
|
|
|
- checkEqualInteger(actual.Integer(), expected.Integer());
|
|
|
- break;
|
|
|
- default:
|
|
|
- FAIL() << "Unknown Json type";
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-void JsonMapComparer::checkExcessStructField(const JsonNode & actualValue, const std::string & name, const JsonMap & expected)
|
|
|
-{
|
|
|
- auto guard = pushName(name);
|
|
|
-
|
|
|
- if(!vstd::contains(expected, name))
|
|
|
- {
|
|
|
- if(!isEmpty(actualValue))
|
|
|
- addError("excess");
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-void JsonMapComparer::checkStructField(const JsonMap & actual, const std::string & name, const JsonNode & expectedValue)
|
|
|
-{
|
|
|
- auto guard = pushName(name);
|
|
|
- if(!vstd::contains(actual, name))
|
|
|
- {
|
|
|
- if(!isEmpty(expectedValue))
|
|
|
- addError("missing");
|
|
|
- }
|
|
|
- else
|
|
|
- checkEqualJson(actual.at(name), expectedValue);
|
|
|
-}
|
|
|
-
|
|
|
-void JsonMapComparer::compare(const std::string & name, const JsonNode & actual, const JsonNode & expected)
|
|
|
-{
|
|
|
- auto guard = pushName(name);
|
|
|
- checkEqualJson(actual, expected);
|
|
|
-}
|
|
|
-
|
|
|
-void JsonMapComparer::compareHeader(const JsonNode & actual, const JsonNode & expected)
|
|
|
-{
|
|
|
- compare("hdr", actual, expected);
|
|
|
-}
|
|
|
-
|
|
|
-void JsonMapComparer::compareObjects(const JsonNode & actual, const JsonNode & expected)
|
|
|
-{
|
|
|
- compare("obj", actual, expected);
|
|
|
-}
|