/* Copyright (C) 2022 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 "simulation2/system/ParamNode.h"
#include "ps/CLogger.h"
#include "ps/XML/Xeromyces.h"
class TestParamNode : public CxxTest::TestSuite
{
public:
void setUp()
{
CXeromyces::Startup();
}
void tearDown()
{
CXeromyces::Terminate();
}
void test_basic()
{
CParamNode node;
TS_ASSERT_EQUALS(CParamNode::LoadXMLString(node, " 1 234"), PSRETURN_OK);
TS_ASSERT(node.GetChild("test").IsOk());
TS_ASSERT(!node.GetChild("Test").IsOk());
TS_ASSERT_STR_EQUALS(node.GetChild("test").ToString(), "");
TS_ASSERT(node.GetChild("test").GetChild("Foo").IsOk());
TS_ASSERT_EQUALS(node.GetChild("test").GetChild("Foo").ToInt(), 1);
TS_ASSERT_STR_EQUALS(node.GetChild("test").GetChild("Foo").ToString(), "1");
TS_ASSERT_EQUALS(node.GetChild("test").GetChild("Bar").ToInt(), 24);
TS_ASSERT_STR_EQUALS(node.GetChild("test").GetChild("Bar").ToString(), "24");
TS_ASSERT_EQUALS(node.GetChild("test").GetChild("Bar").GetChild("Baz").ToInt(), 3);
TS_ASSERT(node.GetChild("test").GetChild("Qux").IsOk());
TS_ASSERT(!node.GetChild("test").GetChild("Qux").GetChild("Baz").IsOk());
TS_ASSERT_STR_EQUALS(node.GetChild("test").ToXMLString(), node.GetOnlyChild().ToXMLString());
CParamNode nullOne(false);
CParamNode nullTwo = nullOne;
CParamNode nullThree(nullOne);
TS_ASSERT(!nullOne.IsOk());
TS_ASSERT(!nullTwo.IsOk());
TS_ASSERT(!nullThree.IsOk());
TS_ASSERT_STR_EQUALS(nullOne.ToString(), "");
TS_ASSERT(nullOne.ToInt() == 0);
TS_ASSERT(nullOne.ToFixed().ToDouble() == 0);
}
void test_attrs()
{
CParamNode node;
TS_ASSERT_EQUALS(CParamNode::LoadXMLString(node, " 3 "), PSRETURN_OK);
TS_ASSERT(node.GetChild("test").IsOk());
TS_ASSERT(node.GetChild("test").GetChild("@x").IsOk());
TS_ASSERT(node.GetChild("test").GetChild("@y").IsOk());
TS_ASSERT(node.GetChild("test").GetChild("z").IsOk());
TS_ASSERT(node.GetChild("test").GetChild("w").IsOk());
TS_ASSERT(node.GetChild("test").GetChild("w").GetChild("@a").IsOk());
TS_ASSERT_EQUALS(node.GetChild("test").GetChild("@x").ToInt(), 1);
TS_ASSERT_EQUALS(node.GetChild("test").GetChild("@y").ToInt(), 2);
TS_ASSERT_EQUALS(node.GetChild("test").GetChild("z").ToInt(), 3);
TS_ASSERT_EQUALS(node.GetChild("test").GetChild("w").GetChild("@a").ToInt(), 4);
}
void test_ToXMLString()
{
CParamNode node;
TS_ASSERT_EQUALS(CParamNode::LoadXMLString(node, " 3 "), PSRETURN_OK);
TS_ASSERT_STR_EQUALS(node.ToXMLString(), "3");
}
void test_overlay_basic()
{
CParamNode node;
TS_ASSERT_EQUALS(CParamNode::LoadXMLString(node, " 3 4 "), PSRETURN_OK);
TS_ASSERT_EQUALS(CParamNode::LoadXMLString(node, " 7 8 "), PSRETURN_OK);
TS_ASSERT_STR_EQUALS(node.ToXMLString(), "378");
}
void test_overlay_disable()
{
CParamNode node;
TS_ASSERT_EQUALS(CParamNode::LoadXMLString(node, " 1 2 "), PSRETURN_OK);
TS_ASSERT_EQUALS(CParamNode::LoadXMLString(node, " "), PSRETURN_OK);
TS_ASSERT_STR_EQUALS(node.ToXMLString(), "2");
}
void test_overlay_replace()
{
CParamNode node;
TS_ASSERT_EQUALS(CParamNode::LoadXMLString(node, " 2 "), PSRETURN_OK);
TS_ASSERT_EQUALS(CParamNode::LoadXMLString(node, " "), PSRETURN_OK);
TS_ASSERT_STR_EQUALS(node.ToXMLString(), "");
}
void test_overlay_tokens()
{
CParamNode node;
TS_ASSERT_EQUALS(CParamNode::LoadXMLString(node, " x ya b\nc\tdm n"), PSRETURN_OK);
TS_ASSERT_EQUALS(CParamNode::LoadXMLString(node, " -y z wn o"), PSRETURN_OK);
TS_ASSERT_STR_EQUALS(node.ToXMLString(), "x z wa b c dn o");
}
void test_overlay_remove_nonexistent_token()
{
// regression test; this used to cause a crash because of a failure to check whether the token being removed was present
TestLogger logger;
CParamNode node;
TS_ASSERT_EQUALS(CParamNode::LoadXMLString(node, " -nonexistenttoken X"), PSRETURN_OK);
TS_ASSERT_STR_EQUALS(node.ToXMLString(), "X");
}
void test_overlay_remove_empty_token()
{
TestLogger logger;
CParamNode node;
TS_ASSERT_EQUALS(CParamNode::LoadXMLString(node, " Y - X "), PSRETURN_OK);
TS_ASSERT_STR_EQUALS(node.ToXMLString(), "Y X");
}
void test_overlay_filtered()
{
CParamNode node;
TS_ASSERT_EQUALS(CParamNode::LoadXMLString(node, " toberemoved "), PSRETURN_OK);
TS_ASSERT_EQUALS(CParamNode::LoadXMLString(node, " "), PSRETURN_OK);
TS_ASSERT_STR_EQUALS(node.ToXMLString(), "");
CParamNode node2;
TS_ASSERT_EQUALS(CParamNode::LoadXMLString(node2, " bcde "), PSRETURN_OK);
TS_ASSERT_EQUALS(CParamNode::LoadXMLString(node2, " c2 "), PSRETURN_OK);
TS_ASSERT_STR_EQUALS(node2.ToXMLString(), "bc2");
}
void test_overlay_merge()
{
CParamNode node;
TS_ASSERT_EQUALS(CParamNode::LoadXMLString(node, " foobar foo "), PSRETURN_OK);
TS_ASSERT_EQUALS(CParamNode::LoadXMLString(node, " testbaz willnotbeincluded textmore text "), PSRETURN_OK);
TS_ASSERT_STR_EQUALS(node.ToXMLString(), "testbarbazmore texttextfoo");
}
void test_overlay_merge_empty()
{
// 'merge' nodes don't change the original value.
CParamNode node;
TS_ASSERT_EQUALS(CParamNode::LoadXMLString(node, "foobar"), PSRETURN_OK);
TS_ASSERT_EQUALS(CParamNode::LoadXMLString(node, "skippedreplaced"), PSRETURN_OK);
TS_ASSERT_STR_EQUALS(node.ToXMLString(), "foobar");
}
void test_overlay_filtered_merge()
{
CParamNode node;
TS_ASSERT_EQUALS(CParamNode::LoadXMLString(node, " 1200 "), PSRETURN_OK);
TS_ASSERT_EQUALS(CParamNode::LoadXMLString(node, " bar 1 "), PSRETURN_OK);
TS_ASSERT_STR_EQUALS(node.ToXMLString(), "11200bar");
}
void test_overlay_ops()
{
CParamNode node;
TS_ASSERT_EQUALS(CParamNode::LoadXMLString(node, "555"), PSRETURN_OK);
TS_ASSERT_EQUALS(CParamNode::LoadXMLString(node, "530.55"), PSRETURN_OK);
TS_ASSERT_STR_EQUALS(node.ToXMLString(), "10153");
}
void test_types()
{
CParamNode node;
TS_ASSERT_EQUALS(CParamNode::LoadXMLString(node, "+010.75true"), PSRETURN_OK);
TS_ASSERT(node.GetChild("test").IsOk());
TS_ASSERT(node.GetChild("test").GetChild("n").IsOk());
TS_ASSERT_EQUALS(node.GetChild("test").GetChild("n").ToString(), "+010.75");
TS_ASSERT_EQUALS(node.GetChild("test").GetChild("n").ToInt(), 10);
TS_ASSERT_EQUALS(node.GetChild("test").GetChild("n").ToFixed().ToDouble(), 10.75);
TS_ASSERT_EQUALS(node.GetChild("test").GetChild("n").ToBool(), false);
TS_ASSERT_EQUALS(node.GetChild("test").GetChild("t").ToBool(), true);
}
void test_escape()
{
TS_ASSERT_STR_EQUALS(CParamNode::EscapeXMLString("test"), "test");
TS_ASSERT_STR_EQUALS(CParamNode::EscapeXMLString("x < y << z"), "x < y << z");
TS_ASSERT_STR_EQUALS(CParamNode::EscapeXMLString("x < y \"&' y > z ]]> "), "x < y "&' y > z ]]> ");
TS_ASSERT_STR_EQUALS(CParamNode::EscapeXMLString(" \r\n\t "), "
");
}
};