3 Copyright (C) 2010-2014 kwolekr, Ryan Kwolek <kwolekr@minetest.net>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as published by
7 the Free Software Foundation; either version 2.1 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22 #include "exceptions.h"
25 class TestObjDef : public TestBase
28 TestObjDef() { TestManager::registerTestModule(this); }
29 const char *getName() { return "TestObjDef"; }
31 void runTests(IGameDef *gamedef);
34 void testAddGetSetClear();
38 static TestObjDef g_test_instance;
40 void TestObjDef::runTests(IGameDef *gamedef)
43 TEST(testAddGetSetClear);
47 ////////////////////////////////////////////////////////////////////////////////
49 /* Minimal implementation of ObjDef and ObjDefManager subclass */
51 class MyObjDef : public ObjDef
56 auto def = new MyObjDef();
58 def->testvalue = testvalue;
65 class MyObjDefManager : public ObjDefManager
68 MyObjDefManager(ObjDefType type) : ObjDefManager(NULL, type){};
69 MyObjDefManager *clone() const
71 auto mgr = new MyObjDefManager();
72 ObjDefManager::cloneTo(mgr);
80 void TestObjDef::testHandles()
84 ObjDefType type = OBJDEF_GENERIC;
86 ObjDefHandle handle = ObjDefManager::createHandle(9530, OBJDEF_ORE, 47);
88 UASSERTEQ(ObjDefHandle, 0xAF507B55, handle);
90 UASSERT(ObjDefManager::decodeHandle(handle, &index, &type, &uid));
92 UASSERTEQ(u32, 9530, index);
93 UASSERTEQ(u32, 47, uid);
94 UASSERTEQ(ObjDefHandle, OBJDEF_ORE, type);
97 void TestObjDef::testAddGetSetClear()
99 ObjDefManager testmgr(NULL, OBJDEF_GENERIC);
100 ObjDefHandle hObj0, hObj1, hObj2, hObj3;
101 ObjDef *obj0, *obj1, *obj2, *obj3;
103 UASSERTEQ(ObjDefType, testmgr.getType(), OBJDEF_GENERIC);
106 obj0->name = "foobar";
107 hObj0 = testmgr.add(obj0);
108 UASSERT(hObj0 != OBJDEF_INVALID_HANDLE);
109 UASSERTEQ(u32, obj0->index, 0);
112 obj1->name = "FooBaz";
113 hObj1 = testmgr.add(obj1);
114 UASSERT(hObj1 != OBJDEF_INVALID_HANDLE);
115 UASSERTEQ(u32, obj1->index, 1);
119 hObj2 = testmgr.add(obj2);
120 UASSERT(hObj2 != OBJDEF_INVALID_HANDLE);
121 UASSERTEQ(u32, obj2->index, 2);
124 obj3->name = "foobaz";
125 hObj3 = testmgr.add(obj3);
126 UASSERT(hObj3 == OBJDEF_INVALID_HANDLE);
128 UASSERTEQ(size_t, testmgr.getNumObjects(), 3);
130 UASSERT(testmgr.get(hObj0) == obj0);
131 UASSERT(testmgr.getByName("FOOBAZ") == obj1);
133 UASSERT(testmgr.set(hObj0, obj3) == obj0);
134 UASSERT(testmgr.get(hObj0) == obj3);
138 UASSERTEQ(size_t, testmgr.getNumObjects(), 0);
141 void TestObjDef::testClone()
143 MyObjDefManager testmgr(OBJDEF_GENERIC);
144 ObjDefManager *mgrcopy;
145 MyObjDef *obj, *temp2;
150 obj->testvalue = 0xee00ff11;
151 hObj = testmgr.add(obj);
152 UASSERT(hObj != OBJDEF_INVALID_HANDLE);
154 mgrcopy = testmgr.clone();
156 UASSERTEQ(ObjDefType, mgrcopy->getType(), testmgr.getType());
157 UASSERTEQ(size_t, mgrcopy->getNumObjects(), testmgr.getNumObjects());
159 // 1) check that the same handle is still valid on the copy
160 temp1 = mgrcopy->get(hObj);
162 UASSERT(temp1 == mgrcopy->getRaw(0));
163 // 2) check that the copy has the correct C++ class
164 temp2 = dynamic_cast<MyObjDef *>(temp1);
166 // 3) check that it was correctly copied
167 UASSERTEQ(u32, obj->testvalue, temp2->testvalue);
168 // 4) check that it was copied AT ALL (not the same)
169 UASSERT(obj != temp2);