/* Copyright (C) 2015 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * 0 A.D. is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with 0 A.D. If not, see . */ #include "lib/self_test.h" #include "ps/XML/Xeromyces.h" #include "lib/file/io/write_buffer.h" #include class TestXeroXMB : public CxxTest::TestSuite { private: shared_ptr m_Buffer; XMBFile parse(const char* doc) { xmlDocPtr xmlDoc = xmlReadMemory(doc, int(strlen(doc)), "", NULL, XML_PARSE_NONET|XML_PARSE_NOCDATA); WriteBuffer buffer; PSRETURN ret = CXeromyces::CreateXMB(xmlDoc, buffer); xmlFreeDoc(xmlDoc); TS_ASSERT_EQUALS(ret, PSRETURN_OK); XMBFile xmb; m_Buffer = buffer.Data(); // hold a reference TS_ASSERT(xmb.Initialise((const char*)m_Buffer.get())); return xmb; } void tearDown() { m_Buffer.reset(); } public: void test_basic() { XMBFile xmb (parse("\n bar \n\n\nbar\n")); TS_ASSERT_DIFFERS(xmb.GetElementID("test"), -1); TS_ASSERT_DIFFERS(xmb.GetElementID("foo"), -1); TS_ASSERT_EQUALS(xmb.GetElementID("bar"), -1); TS_ASSERT_DIFFERS(xmb.GetAttributeID("x"), -1); TS_ASSERT_EQUALS(xmb.GetAttributeID("y"), -1); TS_ASSERT_EQUALS(xmb.GetAttributeID("test"), -1); int el_test = xmb.GetElementID("test"); int el_foo = xmb.GetElementID("foo"); int at_x = xmb.GetAttributeID("x"); XMBElement root = xmb.GetRoot(); TS_ASSERT_EQUALS(root.GetNodeName(), el_test); TS_ASSERT_EQUALS(root.GetLineNumber(), -1); TS_ASSERT_EQUALS(CStr(root.GetText()), ""); TS_ASSERT_EQUALS(root.GetChildNodes().size(), 2); XMBElement child = root.GetChildNodes()[0]; TS_ASSERT_EQUALS(child.GetNodeName(), el_foo); TS_ASSERT_EQUALS(child.GetLineNumber(), 2); TS_ASSERT_EQUALS(child.GetChildNodes().size(), 0); TS_ASSERT_EQUALS(CStr(child.GetText()), "bar"); TS_ASSERT_EQUALS(root.GetChildNodes()[1].GetLineNumber(), 5); TS_ASSERT_EQUALS(child.GetAttributes().size(), 1); XMBAttribute attr = child.GetAttributes()[0]; TS_ASSERT_EQUALS(attr.Name, at_x); TS_ASSERT_EQUALS(CStr(attr.Value), " y "); } void test_GetFirstNamedItem() { XMBFile xmb (parse(" A B C D ")); XMBElement root = xmb.GetRoot(); TS_ASSERT_EQUALS(root.GetChildNodes().size(), 4); XMBElement x = root.GetChildNodes().GetFirstNamedItem(xmb.GetElementID("x")); XMBElement y = root.GetChildNodes().GetFirstNamedItem(xmb.GetElementID("y")); XMBElement w = root.GetChildNodes().GetFirstNamedItem(xmb.GetElementID("w")); TS_ASSERT_EQUALS(x.GetNodeName(), xmb.GetElementID("x")); TS_ASSERT_EQUALS(CStr(x.GetText()), "A"); TS_ASSERT_EQUALS(y.GetNodeName(), xmb.GetElementID("y")); TS_ASSERT_EQUALS(CStr(y.GetText()), "C"); TS_ASSERT_EQUALS(w.GetNodeName(), -1); TS_ASSERT_EQUALS(CStr(w.GetText()), ""); TS_ASSERT_EQUALS(w.GetLineNumber(), -1); TS_ASSERT_EQUALS(w.GetChildNodes().size(), 0); TS_ASSERT_EQUALS(w.GetAttributes().size(), 0); } void test_doctype_ignored() { XMBFile xmb (parse("")); TS_ASSERT_DIFFERS(xmb.GetElementID("foo"), -1); } void test_complex_parse() { XMBFile xmb (parse("\t\n \tx <>&"'bar\n\nbazqux")); TS_ASSERT_EQUALS(CStr(xmb.GetRoot().GetText()), "x <>&\"'foobar\n\nbazqux"); } void test_unicode() { XMBFile xmb (parse("ሴ\xE1\x88\xB4")); CStrW text; text = xmb.GetRoot().GetText().FromUTF8(); TS_ASSERT_EQUALS((int)text.length(), 2); TS_ASSERT_EQUALS(text[0], 0x1234); TS_ASSERT_EQUALS(text[1], 0x1234); text = xmb.GetRoot().GetAttributes()[0].Value.FromUTF8(); TS_ASSERT_EQUALS((int)text.length(), 2); TS_ASSERT_EQUALS(text[0], 0x1234); TS_ASSERT_EQUALS(text[1], 0x1234); } void test_iso88591() { XMBFile xmb (parse("ሴ\xE1\x88\xB4")); CStrW text; text = xmb.GetRoot().GetText().FromUTF8(); TS_ASSERT_EQUALS((int)text.length(), 4); TS_ASSERT_EQUALS(text[0], 0x1234); TS_ASSERT_EQUALS(text[1], 0x00E1); TS_ASSERT_EQUALS(text[2], 0x0088); TS_ASSERT_EQUALS(text[3], 0x00B4); text = xmb.GetRoot().GetAttributes()[0].Value.FromUTF8(); TS_ASSERT_EQUALS((int)text.length(), 4); TS_ASSERT_EQUALS(text[0], 0x1234); TS_ASSERT_EQUALS(text[1], 0x00E1); TS_ASSERT_EQUALS(text[2], 0x0088); TS_ASSERT_EQUALS(text[3], 0x00B4); } };