#include "track_sharing/kml_xml_stream.h" #include #include #include static char names[2048]; int main() { const std::string xml = "0,0]]>179,1 -179,-2"; for (size_t split = 0; split <= xml.size(); ++split) { track_sharing::KmlXmlStream parser(names, sizeof(names)); track_sharing::GeometryExtent extent; assert(parser.feed(reinterpret_cast(xml.data()), split) && parser.feed(reinterpret_cast(xml.data() + split), xml.size() - split) && parser.finish(extent)); assert(extent.points == 2 && extent.west == 1790000000 && extent.east == -1790000000); } for (const std::string text : {"", "", "", "", "\xc0\xaf"}) { track_sharing::KmlXmlStream parser(names, sizeof(names)); track_sharing::GeometryExtent extent; assert(!(parser.feed(reinterpret_cast(text.data()), text.size()) && parser.finish(extent))); } for (const auto& sample : {std::pair{"id=\"1\" id=\"2\"", false}, {"a:id=\"1\" b:id=\"2\" xmlns:a=\"urn:same\" xmlns:b=\"urn:same\"", false}, {"a:id=\"1\" b:id=\"2\" xmlns:a=\"urn:a\" xmlns:b=\"urn:b\"", true}, {"id=\"1\" a:id=\"2\" xmlns:a=\"http://www.opengis.net/kml/2.2\"", true}, {"a:id=\"1\"", false}}) { const std::string source = std::string("1,2"; track_sharing::KmlXmlStream parser(names, sizeof(names)); track_sharing::GeometryExtent extent; const bool valid = parser.feed(reinterpret_cast(source.data()), source.size()) && parser.finish(extent); assert(valid == sample.second); } for (const auto& sample : {std::pair{"中文:属性=\"1\" xmlns:中文=\"urn:a\"", true}, {"\xcc\x80id=\"1\"", false}}) { const std::string source = std::string("1,2"; track_sharing::KmlXmlStream parser(names, sizeof(names)); track_sharing::GeometryExtent extent; assert((parser.feed(reinterpret_cast(source.data()), source.size()) && parser.finish(extent)) == sample.second); } const std::string body = "1,2"; const std::string declaration = "\xef\xbb\xbf"; const std::string declared = declaration + body; for (size_t split = 0; split <= declared.size(); ++split) { track_sharing::KmlXmlStream parser(names, sizeof(names)); track_sharing::GeometryExtent extent; assert(parser.feed(reinterpret_cast(declared.data()), split) && parser.feed(reinterpret_cast(declared.data() + split), declared.size() - split) && parser.finish(extent)); } for (const char* declaration : {"", "", ""}) { const std::string source = declaration + body; track_sharing::KmlXmlStream parser(names, sizeof(names)); track_sharing::GeometryExtent extent; assert(!(parser.feed(reinterpret_cast(source.data()), source.size()) && parser.finish(extent))); } for (unsigned times = 0; times < 3; ++times) { std::string source = ""; for (unsigned i = 0; i < times; ++i) source += "2026-10-11T00:00:00Z"; source += "1 2 3"; track_sharing::KmlXmlStream parser(names, sizeof(names)); track_sharing::GeometryExtent extent; assert((parser.feed(reinterpret_cast(source.data()), source.size()) && parser.finish(extent)) == (times < 2)); } const std::string tracks = "2026-10-11T00:00:00Z1 2 32 3 4"; track_sharing::KmlXmlStream trackParser(names, sizeof(names)); track_sharing::GeometryExtent trackExtent; assert(trackParser.feed(reinterpret_cast(tracks.data()), tracks.size()) && trackParser.finish(trackExtent) && trackExtent.points == 2); for (const auto& sample : {std::pair{"2026-02-31T00:00:00Z", false}, {"2024-02-29T00:00:00+14:00", true}, {"2024-02-29T00:00:00+14:01", false}, {"", true}}) { const std::string source = std::string("") + sample.first + "1 2 3"; track_sharing::KmlXmlStream parser(names, sizeof(names)); track_sharing::GeometryExtent extent; bool valid = true; for (const auto ch : source) if (!parser.feed(reinterpret_cast(&ch), 1)) { valid = false; break; } valid = valid && parser.finish(extent); assert(valid == sample.second); } }