/*
-Minetest-c55
-Copyright (C) 2010 celeron55, Perttu Ahola <celeron55@gmail.com>
+Minetest
+Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
#include "inventory.h"
#include "util/numeric.h"
#include "util/serialize.h"
+#include "noise.h" // PseudoRandom used for random data for compression
+#include "clientserver.h" // LATEST_PROTOCOL_VERSION
+#include <algorithm>
/*
Asserts that the exception occurs
}
};
+struct TestNodedefSerialization: public TestBase
+{
+ void Run()
+ {
+ ContentFeatures f;
+ f.name = "default:stone";
+ for(int i = 0; i < 6; i++)
+ f.tiledef[i].name = "default_stone.png";
+ f.is_ground_content = true;
+ std::ostringstream os(std::ios::binary);
+ f.serialize(os, LATEST_PROTOCOL_VERSION);
+ verbosestream<<"Test ContentFeatures size: "<<os.str().size()<<std::endl;
+ std::istringstream is(os.str(), std::ios::binary);
+ ContentFeatures f2;
+ f2.deSerialize(is);
+ UASSERT(f.walkable == f2.walkable);
+ UASSERT(f.node_box.type == f2.node_box.type);
+ }
+};
+
struct TestCompress: public TestBase
{
void Run()
}
}
+
+ // Test zlib wrapper with large amounts of data (larger than its
+ // internal buffers)
+ {
+ infostream<<"Test: Testing zlib wrappers with a large amount "
+ <<"of pseudorandom data"<<std::endl;
+ u32 size = 50000;
+ infostream<<"Test: Input size of large compressZlib is "
+ <<size<<std::endl;
+ std::string data_in;
+ data_in.resize(size);
+ PseudoRandom pseudorandom(9420);
+ for(u32 i=0; i<size; i++)
+ data_in[i] = pseudorandom.range(0,255);
+ std::ostringstream os_compressed(std::ios::binary);
+ compressZlib(data_in, os_compressed);
+ infostream<<"Test: Output size of large compressZlib is "
+ <<os_compressed.str().size()<<std::endl;
+ std::istringstream is_compressed(os_compressed.str(), std::ios::binary);
+ std::ostringstream os_decompressed(std::ios::binary);
+ decompressZlib(is_compressed, os_decompressed);
+ infostream<<"Test: Output size of large decompressZlib is "
+ <<os_decompressed.str().size()<<std::endl;
+ std::string str_decompressed = os_decompressed.str();
+ UTEST(str_decompressed.size() == data_in.size(), "Output size not"
+ " equal (output: %u, input: %u)",
+ (unsigned int)str_decompressed.size(), (unsigned int)data_in.size());
+ for(u32 i=0; i<size && i<str_decompressed.size(); i++){
+ UTEST(str_decompressed[i] == data_in[i],
+ "index out[%i]=%i differs from in[%i]=%i",
+ i, str_decompressed[i], i, data_in[i]);
+ }
+ }
}
};
// An area that is 1 bigger in x+ and z-
VoxelArea d(v3s16(-2,-2,-3), v3s16(3,2,2));
- core::list<VoxelArea> aa;
+ std::list<VoxelArea> aa;
d.diff(c, aa);
// Correct results
- core::array<VoxelArea> results;
+ std::vector<VoxelArea> results;
results.push_back(VoxelArea(v3s16(-2,-2,-3),v3s16(3,2,-3)));
results.push_back(VoxelArea(v3s16(3,-2,-2),v3s16(3,2,2)));
UASSERT(aa.size() == results.size());
infostream<<"Result of diff:"<<std::endl;
- for(core::list<VoxelArea>::Iterator
- i = aa.begin(); i != aa.end(); i++)
+ for(std::list<VoxelArea>::const_iterator
+ i = aa.begin(); i != aa.end(); ++i)
{
i->print(infostream);
infostream<<std::endl;
- s32 j = results.linear_search(*i);
- UASSERT(j != -1);
- results.erase(j, 1);
+ std::vector<VoxelArea>::iterator j = std::find(results.begin(), results.end(), *i);
+ UASSERT(j != results.end());
+ results.erase(j);
}
}
VoxelArea a(v3s16(0,0,0), v3s16(2,2,2));
{
- core::map<v3s16, bool> light_sources;
+ std::set<v3s16> light_sources;
voxalgo::setLight(v, a, 0, ndef);
voxalgo::SunlightPropagateResult res = voxalgo::propagateSunlight(
v, a, true, light_sources, ndef);
}
v.setNodeNoRef(v3s16(0,0,0), MapNode(CONTENT_STONE));
{
- core::map<v3s16, bool> light_sources;
+ std::set<v3s16> light_sources;
voxalgo::setLight(v, a, 0, ndef);
voxalgo::SunlightPropagateResult res = voxalgo::propagateSunlight(
v, a, true, light_sources, ndef);
== LIGHT_SUN);
}
{
- core::map<v3s16, bool> light_sources;
+ std::set<v3s16> light_sources;
voxalgo::setLight(v, a, 0, ndef);
voxalgo::SunlightPropagateResult res = voxalgo::propagateSunlight(
v, a, false, light_sources, ndef);
}
v.setNodeNoRef(v3s16(1,3,2), MapNode(CONTENT_STONE));
{
- core::map<v3s16, bool> light_sources;
+ std::set<v3s16> light_sources;
voxalgo::setLight(v, a, 0, ndef);
voxalgo::SunlightPropagateResult res = voxalgo::propagateSunlight(
v, a, true, light_sources, ndef);
== 0);
}
{
- core::map<v3s16, bool> light_sources;
+ std::set<v3s16> light_sources;
voxalgo::setLight(v, a, 0, ndef);
voxalgo::SunlightPropagateResult res = voxalgo::propagateSunlight(
v, a, false, light_sources, ndef);
v.setNodeNoRef(v3s16(1,-1,2), n);
}
{
- core::map<v3s16, bool> light_sources;
+ std::set<v3s16> light_sources;
voxalgo::setLight(v, a, 0, ndef);
voxalgo::SunlightPropagateResult res = voxalgo::propagateSunlight(
v, a, true, light_sources, ndef);
UASSERT(res.bottom_sunlight_valid == true);
}
{
- core::map<v3s16, bool> light_sources;
+ std::set<v3s16> light_sources;
voxalgo::setLight(v, a, 0, ndef);
voxalgo::SunlightPropagateResult res = voxalgo::propagateSunlight(
v, a, false, light_sources, ndef);
v.setNodeNoRef(v3s16(1,-1,2), n);
}
{
- core::map<v3s16, bool> light_sources;
+ std::set<v3s16> light_sources;
voxalgo::setLight(v, a, 0, ndef);
voxalgo::SunlightPropagateResult res = voxalgo::propagateSunlight(
v, a, true, light_sources, ndef);
UASSERT(res.bottom_sunlight_valid == false);
}
{
- core::map<v3s16, bool> light_sources;
+ std::set<v3s16> light_sources;
voxalgo::setLight(v, a, 0, ndef);
voxalgo::SunlightPropagateResult res = voxalgo::propagateSunlight(
v, a, false, light_sources, ndef);
}
v.setNodeNoRef(v3s16(1,3,2), MapNode(CONTENT_IGNORE));
{
- core::map<v3s16, bool> light_sources;
+ std::set<v3s16> light_sources;
voxalgo::setLight(v, a, 0, ndef);
voxalgo::SunlightPropagateResult res = voxalgo::propagateSunlight(
v, a, true, light_sources, ndef);
v.setNode(v3s16(1,1,2), n);
}
{
- core::map<v3s16, bool> light_sources;
- core::map<v3s16, u8> unlight_from;
+ std::set<v3s16> light_sources;
+ std::map<v3s16, u8> unlight_from;
voxalgo::clearLightAndCollectSources(v, a, LIGHTBANK_DAY,
ndef, light_sources, unlight_from);
//v.print(dstream, ndef, VOXELPRINT_LIGHT_DAY);
UASSERT(v.getNode(v3s16(0,1,1)).getLight(LIGHTBANK_DAY, ndef)
== 0);
- UASSERT(light_sources.find(v3s16(1,1,1)) != NULL);
+ UASSERT(light_sources.find(v3s16(1,1,1)) != light_sources.end());
UASSERT(light_sources.size() == 1);
- UASSERT(unlight_from.find(v3s16(1,1,2)) != NULL);
+ UASSERT(unlight_from.find(v3s16(1,1,2)) != unlight_from.end());
UASSERT(unlight_from.size() == 1);
}
}
{
std::string serialized_inventory =
"List 0 32\n"
+ "Width 3\n"
"Empty\n"
"Empty\n"
"Empty\n"
std::string serialized_inventory_2 =
"List main 32\n"
+ "Width 5\n"
"Empty\n"
"Empty\n"
"Empty\n"
inv.getList("0")->setName("main");
UASSERT(!inv.getList("0"));
UASSERT(inv.getList("main"));
+ UASSERT(inv.getList("main")->getWidth() == 3);
+ inv.getList("main")->setWidth(5);
std::ostringstream inv_os(std::ios::binary);
inv.serialize(inv_os);
UASSERT(inv_os.str() == serialized_inventory_2);
void Run()
{
const int port = 30003;
- UDPSocket socket;
- socket.Bind(port);
- const char sendbuffer[] = "hello world!";
- socket.Send(Address(127,0,0,1,port), sendbuffer, sizeof(sendbuffer));
+ // IPv6 socket test
+ {
+ UDPSocket socket6(true);
+ socket6.Bind(port);
- sleep_ms(50);
+ const char sendbuffer[] = "hello world!";
+ IPv6AddressBytes bytes;
+ bytes.bytes[15] = 1;
+ socket6.Send(Address(&bytes, port), sendbuffer, sizeof(sendbuffer));
- char rcvbuffer[256];
- memset(rcvbuffer, 0, sizeof(rcvbuffer));
- Address sender;
- for(;;)
+ sleep_ms(50);
+
+ char rcvbuffer[256];
+ memset(rcvbuffer, 0, sizeof(rcvbuffer));
+ Address sender;
+ for(;;)
+ {
+ int bytes_read = socket6.Receive(sender, rcvbuffer, sizeof(rcvbuffer));
+ if(bytes_read < 0)
+ break;
+ }
+ //FIXME: This fails on some systems
+ UASSERT(strncmp(sendbuffer, rcvbuffer, sizeof(sendbuffer))==0);
+ UASSERT(memcmp(sender.getAddress6().sin6_addr.s6_addr, Address(&bytes, 0).getAddress6().sin6_addr.s6_addr, 16) == 0);
+ }
+
+ // IPv4 socket test
{
- int bytes_read = socket.Receive(sender, rcvbuffer, sizeof(rcvbuffer));
- if(bytes_read < 0)
- break;
+ UDPSocket socket(false);
+ socket.Bind(port);
+
+ const char sendbuffer[] = "hello world!";
+ socket.Send(Address(127,0,0,1,port), sendbuffer, sizeof(sendbuffer));
+
+ sleep_ms(50);
+
+ char rcvbuffer[256];
+ memset(rcvbuffer, 0, sizeof(rcvbuffer));
+ Address sender;
+ for(;;)
+ {
+ int bytes_read = socket.Receive(sender, rcvbuffer, sizeof(rcvbuffer));
+ if(bytes_read < 0)
+ break;
+ }
+ //FIXME: This fails on some systems
+ UASSERT(strncmp(sendbuffer, rcvbuffer, sizeof(sendbuffer))==0);
+ UASSERT(sender.getAddress().sin_addr.s_addr == Address(127,0,0,1, 0).getAddress().sin_addr.s_addr);
}
- //FIXME: This fails on some systems
- UASSERT(strncmp(sendbuffer, rcvbuffer, sizeof(sendbuffer))==0);
- UASSERT(sender.getAddress() == Address(127,0,0,1, 0).getAddress());
}
};
Handler hand_client("client");
infostream<<"** Creating server Connection"<<std::endl;
- con::Connection server(proto_id, 512, 5.0, &hand_server);
+ con::Connection server(proto_id, 512, 5.0, false, &hand_server);
server.Serve(30001);
infostream<<"** Creating client Connection"<<std::endl;
- con::Connection client(proto_id, 512, 5.0, &hand_client);
-
+ con::Connection client(proto_id, 512, 5.0, false, &hand_client);
+
UASSERT(hand_server.count == 0);
UASSERT(hand_client.count == 0);
// Server should not have added client yet
UASSERT(hand_server.count == 0);
- sleep_ms(50);
+ sleep_ms(100);
try
{
TEST(TestSettings);
TEST(TestCompress);
TEST(TestSerialization);
+ TEST(TestNodedefSerialization);
TESTPARAMS(TestMapNode, ndef);
TESTPARAMS(TestVoxelManipulator, ndef);
TESTPARAMS(TestVoxelAlgorithms, ndef);
TEST(TestConnection);
dout_con<<"=== END RUNNING UNIT TESTS FOR CONNECTION ==="<<std::endl;
}
+
+ delete idef;
+ delete ndef;
+
if(tests_failed == 0){
infostream<<"run_tests(): "<<tests_failed<<" / "<<tests_run<<" tests failed."<<std::endl;
infostream<<"run_tests() passed."<<std::endl;