/* Copyright (C) 2010 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/ComponentManager.h" #include "simulation2/components/ICmpTemplateManager.h" #include "simulation2/components/ICmpTest.h" #include "simulation2/MessageTypes.h" #include "simulation2/system/ParamNode.h" #include "simulation2/system/SimContext.h" #include "simulation2/Simulation2.h" #include "graphics/Terrain.h" #include "ps/Filesystem.h" #include "ps/CLogger.h" #include "ps/XML/Xeromyces.h" class TestCmpTemplateManager : public CxxTest::TestSuite { public: void setUp() { g_VFS = CreateVfs(20 * MiB); TS_ASSERT_OK(g_VFS->Mount(L"", DataDir()/L"mods/_test.sim", VFS_MOUNT_MUST_EXIST)); TS_ASSERT_OK(g_VFS->Mount(L"cache", DataDir()/L"_testcache")); CXeromyces::Startup(); } void tearDown() { CXeromyces::Terminate(); g_VFS.reset(); DeleteDirectory(DataDir()/L"_testcache"); } void test_LoadTemplate() { CSimContext context; CComponentManager man(context); man.LoadComponentTypes(); entity_id_t ent1 = 1, ent2 = 2; CParamNode noParam; TS_ASSERT(man.AddComponent(ent1, CID_TemplateManager, noParam)); ICmpTemplateManager* tempMan = static_cast (man.QueryInterface(ent1, IID_TemplateManager)); TS_ASSERT(tempMan != NULL); const CParamNode* basic = tempMan->LoadTemplate(ent2, "basic", -1); TS_ASSERT(basic != NULL); TS_ASSERT_WSTR_EQUALS(basic->ToXML(), L"12345"); const CParamNode* inherit2 = tempMan->LoadTemplate(ent2, "inherit2", -1); TS_ASSERT(inherit2 != NULL); TS_ASSERT_WSTR_EQUALS(inherit2->ToXML(), L"d2e1f1g2"); const CParamNode* inherit1 = tempMan->LoadTemplate(ent2, "inherit1", -1); TS_ASSERT(inherit1 != NULL); TS_ASSERT_WSTR_EQUALS(inherit1->ToXML(), L"d1e1f1"); const CParamNode* actor = tempMan->LoadTemplate(ent2, "actor|example1", -1); TS_ASSERT(actor != NULL); TS_ASSERT_WSTR_EQUALS(actor->ToXML(), L"0uprightfalseexample1"); const CParamNode* preview = tempMan->LoadTemplate(ent2, "preview|unit", -1); TS_ASSERT(preview != NULL); TS_ASSERT_WSTR_EQUALS(preview->ToXML(), L"0uprightfalseexample"); const CParamNode* previewobstruct = tempMan->LoadTemplate(ent2, "preview|unitobstruct", -1); TS_ASSERT(previewobstruct != NULL); TS_ASSERT_WSTR_EQUALS(previewobstruct->ToXML(), L"1.00uprightfalseexample"); const CParamNode* previewactor = tempMan->LoadTemplate(ent2, "preview|actor|example2", -1); TS_ASSERT(previewactor != NULL); TS_ASSERT_WSTR_EQUALS(previewactor->ToXML(), L"0uprightfalseexample2"); } void test_LoadTemplate_errors() { CSimContext context; CComponentManager man(context); man.LoadComponentTypes(); entity_id_t ent1 = 1, ent2 = 2; CParamNode noParam; TS_ASSERT(man.AddComponent(ent1, CID_TemplateManager, noParam)); ICmpTemplateManager* tempMan = static_cast (man.QueryInterface(ent1, IID_TemplateManager)); TS_ASSERT(tempMan != NULL); TestLogger logger; TS_ASSERT(tempMan->LoadTemplate(ent2, "illformed", -1) == NULL); TS_ASSERT(tempMan->LoadTemplate(ent2, "invalid", -1) == NULL); TS_ASSERT(tempMan->LoadTemplate(ent2, "nonexistent", -1) == NULL); TS_ASSERT(tempMan->LoadTemplate(ent2, "inherit-loop", -1) == NULL); TS_ASSERT(tempMan->LoadTemplate(ent2, "inherit-broken", -1) == NULL); TS_ASSERT(tempMan->LoadTemplate(ent2, "inherit-special", -1) == NULL); TS_ASSERT(tempMan->LoadTemplate(ent2, "preview|nonexistent", -1) == NULL); } void test_LoadTemplate_multiple() { CSimContext context; CComponentManager man(context); man.LoadComponentTypes(); entity_id_t ent1 = 1, ent2 = 2; CParamNode noParam; TS_ASSERT(man.AddComponent(ent1, CID_TemplateManager, noParam)); ICmpTemplateManager* tempMan = static_cast (man.QueryInterface(ent1, IID_TemplateManager)); TS_ASSERT(tempMan != NULL); const CParamNode* basicA = tempMan->LoadTemplate(ent2, "basic", -1); TS_ASSERT(basicA != NULL); const CParamNode* basicB = tempMan->LoadTemplate(ent2, "basic", -1); TS_ASSERT(basicA == basicB); const CParamNode* inherit2A = tempMan->LoadTemplate(ent2, "inherit2", -1); TS_ASSERT(inherit2A != NULL); const CParamNode* inherit2B = tempMan->LoadTemplate(ent2, "inherit2", -1); TS_ASSERT(inherit2A == inherit2B); TestLogger logger; TS_ASSERT(tempMan->LoadTemplate(ent2, "nonexistent", -1) == NULL); TS_ASSERT(tempMan->LoadTemplate(ent2, "nonexistent", -1) == NULL); TS_ASSERT(tempMan->LoadTemplate(ent2, "inherit-loop", -1) == NULL); TS_ASSERT(tempMan->LoadTemplate(ent2, "inherit-loop", -1) == NULL); TS_ASSERT(tempMan->LoadTemplate(ent2, "inherit-broken", -1) == NULL); TS_ASSERT(tempMan->LoadTemplate(ent2, "inherit-broken", -1) == NULL); } }; class TestCmpTemplateManager_2 : public CxxTest::TestSuite { public: void setUp() { g_VFS = CreateVfs(20 * MiB); TS_ASSERT_OK(g_VFS->Mount(L"", DataDir()/L"mods/public", VFS_MOUNT_MUST_EXIST)); TS_ASSERT_OK(g_VFS->Mount(L"cache", DataDir()/L"_testcache")); CXeromyces::Startup(); } void tearDown() { CXeromyces::Terminate(); g_VFS.reset(); DeleteDirectory(DataDir()/L"_testcache"); } // This just attempts loading every public entity, to check there's no validation errors void test_load_all_DISABLED() // disabled since it's a bit slow and noisy { CTerrain dummy; CSimulation2 sim(NULL, &dummy); sim.LoadDefaultScripts(); sim.ResetState(); CmpPtr cmpTempMan(sim, SYSTEM_ENTITY); TS_ASSERT(!cmpTempMan.null()); std::vector templates = cmpTempMan->FindAllTemplates(); for (size_t i = 0; i < templates.size(); ++i) { std::wstring name = templates[i]; printf("# %ls\n", name.c_str()); const CParamNode* p = cmpTempMan->GetTemplate(CStr8(name)); TS_ASSERT(p != NULL); } } };