diff --git a/coding/coding_tests/CMakeLists.txt b/coding/coding_tests/CMakeLists.txt index 4c9be6026b..01353348a0 100644 --- a/coding/coding_tests/CMakeLists.txt +++ b/coding/coding_tests/CMakeLists.txt @@ -43,6 +43,7 @@ set( var_serial_vector_test.cpp varint_test.cpp writer_test.cpp + xml_parser_tests.cpp zip_creator_test.cpp zip_reader_test.cpp zlib_test.cpp @@ -57,6 +58,7 @@ omim_link_libraries( coding base geometry + expat jansson minizip succinct diff --git a/coding/coding_tests/xml_parser_tests.cpp b/coding/coding_tests/xml_parser_tests.cpp index 6f70f09bee..bfa13a4bcd 100644 --- a/coding/coding_tests/xml_parser_tests.cpp +++ b/coding/coding_tests/xml_parser_tests.cpp @@ -1 +1,135 @@ -#pragma once +#include "testing/testing.hpp" + +#include "coding/parse_xml.hpp" +#include "coding/reader.hpp" + +#include +#include + +namespace +{ +std::string const smokeXml = R"( + + +)"; + +std::string const longXml = R"( + + + + + + + + + + + + + + + + + + +)"; + +class SmokeDispatcher +{ +public: + void CharData(std::string const &) {} + void AddAttr(std::string const &, std::string const &) {} + bool Push(std::string const & push) + { + TEST_EQUAL(push, "root", ()); + return true; + } + void Pop(std::string const & v) { TEST_EQUAL(v, "root", ()); } +}; + +class Dispatcher +{ +public: + using PairsOfStrings = std::vector>; + using Strings = std::vector; + + void CharData(std::string const & ch) {} + + void AddAttr(std::string const & key, std::string const & value) + { + m_addAttrs.emplace_back(key, value); + } + + bool Push(std::string const & push) + { + m_pushes.push_back(push); + return true; + } + + void Pop(std::string const & v) + { + m_pops.push_back(v); + } + + void TestAddAttrs(PairsOfStrings const & addAttrs) + { + TestEquality(m_addAttrs, addAttrs); + } + + void TestPushes(Strings const & pushes) + { + TestEquality(m_pushes, pushes); + } + + void TestPops(Strings const & pops) + { + TestEquality(m_pops, pops); + } + +private: + template + void TestEquality(F const & f1, F const & f2) + { + TEST_EQUAL(f1.size(), f2.size(), ()); + for (size_t i = 0; i < f1.size(); ++i) + TEST_EQUAL(f1[i], f2[i], (i)); + } + + PairsOfStrings m_addAttrs; + Strings m_pushes; + Strings m_pops; +}; + +template +void TestXML(std::string const & xmlStr, D & dispatcher) +{ + std::vector xml(xmlStr.cbegin(), xmlStr.cend()); + MemReader reader(xml.data(), xml.size()); + ReaderSource source(reader); + + ParseXML(source, dispatcher); +} + +UNIT_TEST(XmlParser_SmokeTest) +{ + Dispatcher d; + TestXML(smokeXml, d); + d.TestAddAttrs({}); + d.TestPushes({"root"}); + d.TestPops({"root"}); +} + +UNIT_TEST(XmlParser_LongTest) +{ + Dispatcher d; + TestXML(longXml, d); + d.TestAddAttrs({std::make_pair("vertical", "bottom"), std::make_pair("horizontal", "left"), + std::make_pair("x", "10"), std::make_pair("vertical", "center"), + std::make_pair("vertical", "top"), std::make_pair("vertical", "top"), + std::make_pair("x", "34"), std::make_pair("y", "48")}); + d.TestPushes({"root", "ruler", "portrait", "anchor", "offset", "compass", "portrait", "anchor", + "relative", "landscape", "relative", "offset"}); + d.TestPops({"anchor", "offset", "portrait", "ruler", "anchor", "relative", "portrait", "relative", + "offset", "landscape", "compass", "root"}); +} +} // namespace