1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
#include "Globals.h"
#include "../TestHelpers.h"
#include "BlockTypePalette.h"
/** Tests the BlockTypePalette's basic APIs - creation, addition, querying. */
static void testBasic()
{
LOGD("Testing the basic BlockTypePalette's APIs...");
// Check inserting different block type names:
BlockTypePalette pal;
TEST_EQUAL(pal.index("testblock", BlockState()), 0); // Insert the first entry
TEST_EQUAL(pal.index("testblock", BlockState()), 0); // Check that it's not inserted again
TEST_EQUAL(pal.maybeIndex("testblock", BlockState()), (std::make_pair<UInt32, bool>(0, true)));
TEST_EQUAL(pal.maybeIndex("nonexistent", BlockState()).second, false);
TEST_EQUAL(pal.index("another", BlockState()), 1); // Insert the second entry
TEST_EQUAL(pal.index("another", BlockState()), 1); // Check that it's not inserted twice
TEST_EQUAL(pal.maybeIndex("another", BlockState()), (std::make_pair<UInt32, bool>(1, true)));
TEST_EQUAL(pal.maybeIndex("testblock", BlockState()), (std::make_pair<UInt32, bool>(0, true))); // The first one stayed
// Check same block type name, different BlockState:
BlockState bs1;
BlockState bs2("key1", "value1");
BlockState bs3({{"key1", "value1"}, {"key2", "value2"}});
BlockState bs2Copy(bs2);
TEST_EQUAL(pal.index("multistate", bs1), 2);
TEST_EQUAL(pal.index("multistate", bs2), 3);
TEST_EQUAL(pal.index("multistate", bs3), 4);
TEST_EQUAL(pal.index("multistate", bs2Copy), 3); // Different BlockState instance, but same content
TEST_EQUAL(pal.count(), 5);
// Check the entry() API:
TEST_EQUAL(pal.entry(0), (std::make_pair<AString, BlockState>("testblock", BlockState())));
TEST_EQUAL(pal.entry(1), (std::make_pair<AString, BlockState>("another", BlockState())));
TEST_EQUAL(pal.entry(2), (std::make_pair<AString, BlockState>("multistate", BlockState(bs1)))); // make_pair requires a copy of the state
TEST_EQUAL(pal.entry(3), (std::make_pair<AString, BlockState>("multistate", BlockState(bs2))));
TEST_EQUAL(pal.entry(4), (std::make_pair<AString, BlockState>("multistate", BlockState(bs3))));
}
/** Tests creating the transform map between two palettes. */
static void testTransform()
{
LOGD("Testing the createTransformMap API...");
// Create two palettes with some overlap:
BlockTypePalette pal1, pal2;
pal1.index("block1", BlockState());
pal1.index("block2", BlockState());
pal1.index("block3", BlockState());
pal1.index("block4", BlockState());
pal1.index("block5", BlockState("key1", "value1"));
pal2.index("block0", BlockState());
pal2.index("block2", BlockState()); // overlap
pal2.index("block3", BlockState()); // overlap
pal2.index("block4", BlockState("key1", "value1"));
pal2.index("block5", BlockState("key1", "value1")); // overlap
pal2.index("block6", BlockState("key1", "value1"));
// Check the transform map:
auto trans = pal1.createTransformMap(pal2);
TEST_EQUAL(pal1.maybeIndex("block1", BlockState()), (std::make_pair<UInt32, bool>(0, true)));
TEST_EQUAL(pal1.maybeIndex("block2", BlockState()), (std::make_pair<UInt32, bool>(1, true)));
TEST_EQUAL(pal1.maybeIndex("block3", BlockState()), (std::make_pair<UInt32, bool>(2, true)));
TEST_EQUAL(pal1.maybeIndex("block4", BlockState()), (std::make_pair<UInt32, bool>(3, true)));
TEST_EQUAL(pal1.maybeIndex("block5", BlockState("key1", "value1")), (std::make_pair<UInt32, bool>(4, true)));
TEST_EQUAL(pal1.maybeIndex("block0", BlockState()), (std::make_pair<UInt32, bool>(5, true)));
TEST_EQUAL(pal1.maybeIndex("block4", BlockState("key1", "value1")), (std::make_pair<UInt32, bool>(6, true)));
TEST_EQUAL(pal1.maybeIndex("block6", BlockState("key1", "value1")), (std::make_pair<UInt32, bool>(7, true)));
TEST_EQUAL(trans.size(), 6);
TEST_EQUAL(trans[0], 5);
TEST_EQUAL(trans[1], 1);
TEST_EQUAL(trans[2], 2);
TEST_EQUAL(trans[3], 6);
TEST_EQUAL(trans[4], 4);
TEST_EQUAL(trans[5], 7);
}
int main()
{
LOGD("BlockTypePaletteTest started");
try
{
testBasic();
testTransform();
}
catch (const TestException & exc)
{
LOGERROR("BlockTypePaletteTest has failed, an exception was thrown: %s", exc.mMessage.c_str());
return 1;
}
catch (const std::exception & exc)
{
LOGERROR("BlockTypePaletteTest has failed, an exception was thrown: %s", exc.what());
return 1;
}
catch (...)
{
LOGERROR("BlockTypePaletteTest has failed, an unhandled exception was thrown.");
return 1;
}
LOGD("BlockTypePaletteTest finished");
return 0;
}
|