X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Ftest.cpp;h=6588f113c4d622975685cf7d29f43f48c85948cd;hb=ef0ec3155440b770103cc5ad36819659d7ce2c1b;hp=d3c17f70cb42fda2403bb27108f87e33e6823328;hpb=87554408ca667bfb86a6472d4835a893e457c0ba;p=dragonfireclient.git diff --git a/src/test.cpp b/src/test.cpp index d3c17f70c..6588f113c 100644 --- a/src/test.cpp +++ b/src/test.cpp @@ -23,7 +23,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "map.h" #include "player.h" #include "main.h" -#include "heightmap.h" #include "socket.h" #include "connection.h" #include "utility.h" @@ -31,6 +30,11 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "voxel.h" #include #include "porting.h" +#include "content_mapnode.h" +#include "nodedef.h" +#include "mapsector.h" +#include "settings.h" +#include "log.h" /* Asserts that the exception occurs @@ -43,13 +47,71 @@ with this program; if not, write to the Free Software Foundation, Inc., assert(exception_thrown);\ } +/* + A few item and node definitions for those tests that need them +*/ + +#define CONTENT_STONE 0 +#define CONTENT_GRASS 0x800 + +void define_some_nodes(IWritableItemDefManager *idef, IWritableNodeDefManager *ndef) +{ + content_t i; + ItemDefinition itemdef; + ContentFeatures f; + + /* + Stone + */ + i = CONTENT_STONE; + itemdef = ItemDefinition(); + itemdef.type = ITEM_NODE; + itemdef.name = "default:stone"; + itemdef.description = "Stone"; + itemdef.groups["cracky"] = 3; + itemdef.inventory_image = "[inventorycube" + "{default_stone.png" + "{default_stone.png" + "{default_stone.png"; + f = ContentFeatures(); + f.name = itemdef.name; + for(int i = 0; i < 6; i++) + f.tname_tiles[i] = "default_stone.png"; + f.is_ground_content = true; + idef->registerItem(itemdef); + ndef->set(i, f); + + /* + Grass + */ + i = CONTENT_GRASS; + itemdef = ItemDefinition(); + itemdef.type = ITEM_NODE; + itemdef.name = "default:dirt_with_grass"; + itemdef.description = "Dirt with grass"; + itemdef.groups["crumbly"] = 3; + itemdef.inventory_image = "[inventorycube" + "{default_grass.png" + "{default_dirt.png&default_grass_side.png" + "{default_dirt.png&default_grass_side.png"; + f = ContentFeatures(); + f.name = itemdef.name; + f.tname_tiles[0] = "default_grass.png"; + f.tname_tiles[1] = "default_dirt.png"; + for(int i = 2; i < 6; i++) + f.tname_tiles[i] = "default_dirt.png^default_grass_side.png"; + f.is_ground_content = true; + idef->registerItem(itemdef); + ndef->set(i, f); +} + struct TestUtilities { void Run() { - /*dstream<<"wrapDegrees(100.0) = "< std::string mkstr(const char (&s)[N]) + { + return std::string(s, N - 1); + } + + void Run() + { + // Tests some serialization primitives + + assert(serializeString("") == mkstr("\0\0")); + assert(serializeWideString(L"") == mkstr("\0\0")); + assert(serializeLongString("") == mkstr("\0\0\0\0")); + assert(serializeJsonString("") == "\"\""); + std::string teststring = "Hello world!"; + assert(serializeString(teststring) == + mkstr("\0\14Hello world!")); + assert(serializeWideString(narrow_to_wide(teststring)) == + mkstr("\0\14\0H\0e\0l\0l\0o\0 \0w\0o\0r\0l\0d\0!")); + assert(serializeLongString(teststring) == + mkstr("\0\0\0\14Hello world!")); + assert(serializeJsonString(teststring) == + "\"Hello world!\""); + + std::string teststring2; + std::wstring teststring2_w; + std::string teststring2_w_encoded; + { + std::ostringstream tmp_os; + std::wostringstream tmp_os_w; + std::ostringstream tmp_os_w_encoded; + for(int i = 0; i < 256; i++) + { + tmp_os<<(char)i; + tmp_os_w<<(wchar_t)i; + tmp_os_w_encoded<<(char)0<<(char)i; + } + teststring2 = tmp_os.str(); + teststring2_w = tmp_os_w.str(); + teststring2_w_encoded = tmp_os_w_encoded.str(); + } + assert(serializeString(teststring2) == + mkstr("\1\0") + teststring2); + assert(serializeWideString(teststring2_w) == + mkstr("\1\0") + teststring2_w_encoded); + assert(serializeLongString(teststring2) == + mkstr("\0\0\1\0") + teststring2); + // MSVC fails when directly using "\\\\" + std::string backslash = "\\"; + assert(serializeJsonString(teststring2) == + mkstr("\"") + + "\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007" + + "\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f" + + "\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017" + + "\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f" + + " !\\\"" + teststring2.substr(0x23, 0x2f-0x23) + + "\\/" + teststring2.substr(0x30, 0x5c-0x30) + + backslash + backslash + teststring2.substr(0x5d, 0x7f-0x5d) + "\\u007f" + + "\\u0080\\u0081\\u0082\\u0083\\u0084\\u0085\\u0086\\u0087" + + "\\u0088\\u0089\\u008a\\u008b\\u008c\\u008d\\u008e\\u008f" + + "\\u0090\\u0091\\u0092\\u0093\\u0094\\u0095\\u0096\\u0097" + + "\\u0098\\u0099\\u009a\\u009b\\u009c\\u009d\\u009e\\u009f" + + "\\u00a0\\u00a1\\u00a2\\u00a3\\u00a4\\u00a5\\u00a6\\u00a7" + + "\\u00a8\\u00a9\\u00aa\\u00ab\\u00ac\\u00ad\\u00ae\\u00af" + + "\\u00b0\\u00b1\\u00b2\\u00b3\\u00b4\\u00b5\\u00b6\\u00b7" + + "\\u00b8\\u00b9\\u00ba\\u00bb\\u00bc\\u00bd\\u00be\\u00bf" + + "\\u00c0\\u00c1\\u00c2\\u00c3\\u00c4\\u00c5\\u00c6\\u00c7" + + "\\u00c8\\u00c9\\u00ca\\u00cb\\u00cc\\u00cd\\u00ce\\u00cf" + + "\\u00d0\\u00d1\\u00d2\\u00d3\\u00d4\\u00d5\\u00d6\\u00d7" + + "\\u00d8\\u00d9\\u00da\\u00db\\u00dc\\u00dd\\u00de\\u00df" + + "\\u00e0\\u00e1\\u00e2\\u00e3\\u00e4\\u00e5\\u00e6\\u00e7" + + "\\u00e8\\u00e9\\u00ea\\u00eb\\u00ec\\u00ed\\u00ee\\u00ef" + + "\\u00f0\\u00f1\\u00f2\\u00f3\\u00f4\\u00f5\\u00f6\\u00f7" + + "\\u00f8\\u00f9\\u00fa\\u00fb\\u00fc\\u00fd\\u00fe\\u00ff" + + "\""); + + { + std::istringstream is(serializeString(teststring2), std::ios::binary); + assert(deSerializeString(is) == teststring2); + assert(!is.eof()); + is.get(); + assert(is.eof()); + } + { + std::istringstream is(serializeWideString(teststring2_w), std::ios::binary); + assert(deSerializeWideString(is) == teststring2_w); + assert(!is.eof()); + is.get(); + assert(is.eof()); + } + { + std::istringstream is(serializeLongString(teststring2), std::ios::binary); + assert(deSerializeLongString(is) == teststring2); + assert(!is.eof()); + is.get(); + assert(is.eof()); + } + { + std::istringstream is(serializeJsonString(teststring2), std::ios::binary); + //dstream< "; + infostream<<"str_out.size()="< "; for(u32 i=0; i "; + infostream<<"str_out.size()="< "; for(u32 i=0; iget(n).light_propagates == true); + n.setContent(LEGN(nodedef, "CONTENT_STONE")); + assert(nodedef->get(n).light_propagates == false); } }; struct TestVoxelManipulator { - void Run() + void Run(INodeDefManager *nodedef) { /* VoxelArea @@ -224,12 +431,12 @@ struct TestVoxelManipulator assert(aa.size() == results.size()); - dstream<<"Result of diff:"<::Iterator i = aa.begin(); i != aa.end(); i++) { - i->print(dstream); - dstream<print(infostream); + infostream<=0; y--) - for(s16 x=0; x active_nodes; - v.updateAreaWaterPressure(area, active_nodes); - - v.print(dstream, VOXELPRINT_WATERPRESSURE); - - //s16 highest_y = -32768; - /* - NOTE: These are commented out because this behaviour is changed - all the time - */ - //assert(v.getWaterPressure(v3s16(7, 1, 1), highest_y, 0) == -1); - //assert(highest_y == 3); - /*assert(v.getWaterPressure(v3s16(7, 1, 1), highest_y, 0) == 3); - //assert(highest_y == 3);*/ - - active_nodes.clear(); - active_nodes[v3s16(9,1,0)] = 1; - //v.flowWater(active_nodes, 0, true, 1000); - v.flowWater(active_nodes, 0, false, 1000); - - dstream<<"Final result of flowWater:"< light_sources; @@ -518,14 +673,14 @@ struct TestMapBlock assert(b.getNode(v3s16(1,1,0)).getLight(LIGHTBANK_DAY) == 0); assert(b.getNode(v3s16(1,0,0)).getLight(LIGHTBANK_DAY) == 0); assert(b.getNode(v3s16(1,2,3)).getLight(LIGHTBANK_DAY) == LIGHT_SUN); - assert(b.getFaceLight(1000, p, v3s16(0,1,0)) == LIGHT_SUN); - assert(b.getFaceLight(1000, p, v3s16(0,-1,0)) == 0); - assert(b.getFaceLight(0, p, v3s16(0,-1,0)) == 0); + assert(b.getFaceLight2(1000, p, v3s16(0,1,0)) == LIGHT_SUN); + assert(b.getFaceLight2(1000, p, v3s16(0,-1,0)) == 0); + assert(b.getFaceLight2(0, p, v3s16(0,-1,0)) == 0); // According to MapBlock::getFaceLight, // The face on the z+ side should have double-diminished light //assert(b.getFaceLight(p, v3s16(0,0,1)) == diminish_light(diminish_light(LIGHT_MAX))); // The face on the z+ side should have diminished light - assert(b.getFaceLight(1000, p, v3s16(0,0,1)) == diminish_light(LIGHT_MAX)); + assert(b.getFaceLight2(1000, p, v3s16(0,0,1)) == diminish_light(LIGHT_MAX)); } /* Check how the block handles being in between blocks with some non-sunlight @@ -561,7 +716,7 @@ struct TestMapBlock for(u16 y=0; ysetHeightmap(dummyheightmap); + ServerMapSector sector(&parent, v2s16(1,1)); - EXCEPTION_CHECK(InvalidPositionException, sector.getBlockNoCreate(0)); - EXCEPTION_CHECK(InvalidPositionException, sector.getBlockNoCreate(1)); + assert(sector.getBlockNoCreateNoEx(0) == 0); + assert(sector.getBlockNoCreateNoEx(1) == 0); MapBlock * bref = sector.createBlankBlock(-2); - EXCEPTION_CHECK(InvalidPositionException, sector.getBlockNoCreate(0)); - assert(sector.getBlockNoCreate(-2) == bref); + assert(sector.getBlockNoCreateNoEx(0) == 0); + assert(sector.getBlockNoCreateNoEx(-2) == bref); //TODO: Check for AlreadyExistsException @@ -653,134 +806,7 @@ struct TestMapSector } }; - -struct TestHeightmap -{ - void TestSingleFixed() - { - const s16 BS1 = 4; - OneChildHeightmap hm1(BS1); - - // Test that it is filled with < GROUNDHEIGHT_VALID_MINVALUE - for(s16 y=0; y<=BS1; y++){ - for(s16 x=0; x<=BS1; x++){ - v2s16 p(x,y); - assert(hm1.m_child.getGroundHeight(p) - < GROUNDHEIGHT_VALID_MINVALUE); - } - } - - hm1.m_child.setGroundHeight(v2s16(1,0), 2.0); - //hm1.m_child.print(); - assert(fabs(hm1.getGroundHeight(v2s16(1,0))-2.0)<0.001); - hm1.setGroundHeight(v2s16(0,1), 3.0); - assert(fabs(hm1.m_child.getGroundHeight(v2s16(0,1))-3.0)<0.001); - - // Fill with -1.0 - for(s16 y=0; y<=BS1; y++){ - for(s16 x=0; x<=BS1; x++){ - v2s16 p(x,y); - hm1.m_child.setGroundHeight(p, -1.0); - } - } - - f32 corners[] = {0.0, 0.0, 1.0, 1.0}; - hm1.m_child.generateContinued(0.0, 0.0, corners); - - hm1.m_child.print(); - assert(fabs(hm1.m_child.getGroundHeight(v2s16(1,0))-0.2)<0.05); - assert(fabs(hm1.m_child.getGroundHeight(v2s16(4,3))-0.7)<0.05); - assert(fabs(hm1.m_child.getGroundHeight(v2s16(4,4))-1.0)<0.05); - } - - void TestUnlimited() - { - //g_heightmap_debugprint = true; - const s16 BS1 = 4; - /*UnlimitedHeightmap hm1(BS1, - new ConstantGenerator(0.0), - new ConstantGenerator(0.0), - new ConstantGenerator(5.0));*/ - PointAttributeDatabase padb; - UnlimitedHeightmap hm1(BS1, &padb); - // Go through it so it generates itself - for(s16 y=0; y<=BS1; y++){ - for(s16 x=0; x<=BS1; x++){ - v2s16 p(x,y); - hm1.getGroundHeight(p); - } - } - // Print it - dstream<<"UnlimitedHeightmap hm1:"<setGroundHeight(p1, v1); - // Read from UnlimitedHeightmap - assert(fabs(hm1.getGroundHeight(p1)-v1)<0.001); - } - - void Random() - { - dstream<<"Running random code (get a human to check this)"<addPoint(v2s16(-BS1,0), Attribute(0)); - padb.getList("hm_randmax")->addPoint(v2s16(-BS1,0), Attribute(0)); - padb.getList("hm_randfactor")->addPoint(v2s16(-BS1,0), Attribute(0.0)); - - padb.getList("hm_baseheight")->addPoint(v2s16(0,0), Attribute(-20)); - padb.getList("hm_randmax")->addPoint(v2s16(0,0), Attribute(0)); - padb.getList("hm_randfactor")->addPoint(v2s16(0,0), Attribute(0.5)); - - padb.getList("hm_baseheight")->addPoint(v2s16(BS1*2,BS1), Attribute(0)); - padb.getList("hm_randmax")->addPoint(v2s16(BS1*2,BS1), Attribute(30)); - padb.getList("hm_randfactor")->addPoint(v2s16(BS1*2,BS1), Attribute(0.63)); - - UnlimitedHeightmap hm1(BS1, &padb); - - // Force hm1 to generate a some heightmap - hm1.getGroundHeight(v2s16(0,0)); - hm1.getGroundHeight(v2s16(0,BS1)); - /*hm1.getGroundHeight(v2s16(BS1,-1)); - hm1.getGroundHeight(v2s16(BS1-1,-1));*/ - hm1.print(); - - // Get the (0,0) and (1,0) heightmaps - /*FixedHeightmap * hr00 = hm1.getHeightmap(v2s16(0,0)); - FixedHeightmap * hr01 = hm1.getHeightmap(v2s16(1,0)); - f32 corners[] = {1.0, 1.0, 1.0, 1.0}; - hr00->generateContinued(0.0, 0.0, corners); - hm1.print();*/ - - //assert(0); - } - - void Run() - { - //srand(7); // Get constant random - srand(time(0)); // Get better random - - TestSingleFixed(); - TestUnlimited(); - Random(); - } -}; +#endif struct TestSocket { @@ -843,15 +869,15 @@ struct TestConnection assert(readU8(&p1.data[6]) == channel); assert(readU8(&p1.data[7]) == data1[0]); - //dstream<<"initial data1[0]="<<((u32)data1[0]&0xff)< data; + infostream<<"** running client.Receive()"< data = SharedBufferFromString("Hello World!"); - dstream<<"** running client.Send()"< data1 = SharedBufferFromString("hello1"); SharedBuffer data2 = SharedBufferFromString("Hello2"); Address client_address = - server.GetPeer(peer_id_client)->address; + server.GetPeerAddress(peer_id_client); - dstream<<"*** Sending packets in wrong order (2,1,2)" + infostream<<"*** Sending packets in wrong order (2,1,2)" <channels[chn]; + con::Channel *ch = &server.getPeer(peer_id_client)->channels[chn]; u16 sn = ch->next_outgoing_seqnum; ch->next_outgoing_seqnum = sn+1; server.Send(peer_id_client, chn, data2, true); @@ -1035,90 +1087,149 @@ struct TestConnection sleep_ms(50); - dstream<<"*** Receiving the packets"< recvdata; u32 size; - dstream<<"** running client.Receive()"<20) - dstream<<"..."; - dstream<20) + infostream<<"..."; + infostream< recvdata; + infostream<<"** running client.Receive()"<20) - dstream<<"..."; - dstream<