1 #include <sstream> 2 #include <string> 3 4 #include <marisa/tail.h> 5 6 #include "assert.h" 7 8 namespace { 9 10 void TestBinaryTail() { 11 TEST_START(); 12 13 marisa::Tail tail; 14 15 ASSERT(tail.size() == 0); 16 ASSERT(tail.empty()); 17 ASSERT(tail.total_size() == sizeof(marisa::UInt32)); 18 19 marisa::Vector<marisa::String> keys; 20 tail.build(keys, NULL, MARISA_BINARY_TAIL); 21 22 ASSERT(tail.size() == 0); 23 ASSERT(tail.empty()); 24 ASSERT(tail.total_size() == sizeof(marisa::UInt32)); 25 26 keys.push_back(marisa::String("")); 27 marisa::Vector<marisa::UInt32> offsets; 28 tail.build(keys, &offsets, MARISA_BINARY_TAIL); 29 30 ASSERT(tail.size() == 1); 31 ASSERT(tail.mode() == MARISA_BINARY_TAIL); 32 ASSERT(!tail.empty()); 33 ASSERT(tail.total_size() == (sizeof(marisa::UInt32) + tail.size())); 34 ASSERT(offsets.size() == keys.size() + 1); 35 ASSERT(offsets[0] == 1); 36 ASSERT(offsets[1] == tail.size()); 37 38 const char binary_key[] = { 'N', 'P', '\0', 'T', 'r', 'i', 'e' }; 39 keys[0] = marisa::String(binary_key, sizeof(binary_key)); 40 tail.build(keys, &offsets, MARISA_TEXT_TAIL); 41 42 ASSERT(tail.size() == sizeof(binary_key) + 1); 43 ASSERT(tail.mode() == MARISA_BINARY_TAIL); 44 ASSERT(!tail.empty()); 45 ASSERT(tail.total_size() == (sizeof(marisa::UInt32) + tail.size())); 46 ASSERT(offsets.size() == keys.size() + 1); 47 ASSERT(offsets[0] == 1); 48 ASSERT(offsets[1] == tail.size()); 49 50 tail.build(keys, &offsets, MARISA_BINARY_TAIL); 51 52 ASSERT(tail.size() == sizeof(binary_key) + 1); 53 ASSERT(tail.mode() == MARISA_BINARY_TAIL); 54 ASSERT(!tail.empty()); 55 ASSERT(tail.total_size() == (sizeof(marisa::UInt32) + tail.size())); 56 ASSERT(offsets.size() == keys.size() + 1); 57 ASSERT(offsets[0] == 1); 58 ASSERT(offsets[1] == tail.size()); 59 60 keys.clear(); 61 keys.push_back(marisa::String("abc")); 62 keys.push_back(marisa::String("bc")); 63 keys.push_back(marisa::String("abc")); 64 keys.push_back(marisa::String("c")); 65 keys.push_back(marisa::String("ABC")); 66 keys.push_back(marisa::String("AB")); 67 68 tail.build(keys, NULL, MARISA_BINARY_TAIL); 69 70 ASSERT(tail.size() == 15); 71 ASSERT(tail.mode() == MARISA_BINARY_TAIL); 72 ASSERT(!tail.empty()); 73 ASSERT(tail.total_size() == (sizeof(marisa::UInt32) + tail.size())); 74 75 tail.build(keys, &offsets, MARISA_BINARY_TAIL); 76 77 ASSERT(tail.size() == 15); 78 ASSERT(tail.mode() == MARISA_BINARY_TAIL); 79 ASSERT(!tail.empty()); 80 ASSERT(tail.total_size() == (sizeof(marisa::UInt32) + tail.size())); 81 ASSERT(offsets.size() == 7); 82 for (marisa::UInt32 i = 0; i < keys.size(); ++i) { 83 ASSERT(marisa::String(reinterpret_cast<const char *>(tail[offsets[i]]), 84 offsets[i + 1] - offsets[i]) == keys[i]); 85 } 86 87 tail.save("tail-test.dat"); 88 tail.clear(); 89 90 ASSERT(tail.size() == 0); 91 ASSERT(tail.empty()); 92 ASSERT(tail.total_size() == sizeof(marisa::UInt32)); 93 94 marisa::Mapper mapper; 95 tail.mmap(&mapper, "tail-test.dat"); 96 97 ASSERT(tail.size() == 15); 98 ASSERT(tail.mode() == MARISA_BINARY_TAIL); 99 ASSERT(!tail.empty()); 100 ASSERT(tail.total_size() == (sizeof(marisa::UInt32) + tail.size())); 101 for (marisa::UInt32 i = 0; i < keys.size(); ++i) { 102 ASSERT(marisa::String(reinterpret_cast<const char *>(tail[offsets[i]]), 103 offsets[i + 1] - offsets[i]) == keys[i]); 104 } 105 106 tail.clear(); 107 tail.load("tail-test.dat"); 108 109 ASSERT(tail.size() == 15); 110 ASSERT(tail.mode() == MARISA_BINARY_TAIL); 111 ASSERT(!tail.empty()); 112 ASSERT(tail.total_size() == (sizeof(marisa::UInt32) + tail.size())); 113 for (marisa::UInt32 i = 0; i < keys.size(); ++i) { 114 ASSERT(marisa::String(reinterpret_cast<const char *>(tail[offsets[i]]), 115 offsets[i + 1] - offsets[i]) == keys[i]); 116 } 117 118 std::stringstream stream; 119 tail.write(stream); 120 121 tail.clear(); 122 tail.read(stream); 123 124 ASSERT(tail.size() == 15); 125 ASSERT(tail.mode() == MARISA_BINARY_TAIL); 126 ASSERT(!tail.empty()); 127 ASSERT(tail.total_size() == (sizeof(marisa::UInt32) + tail.size())); 128 for (marisa::UInt32 i = 0; i < keys.size(); ++i) { 129 ASSERT(marisa::String(reinterpret_cast<const char *>(tail[offsets[i]]), 130 offsets[i + 1] - offsets[i]) == keys[i]); 131 } 132 133 TEST_END(); 134 } 135 136 void TestTextTail() { 137 TEST_START(); 138 139 marisa::Tail tail; 140 marisa::Vector<marisa::String> keys; 141 tail.build(keys, NULL, MARISA_TEXT_TAIL); 142 143 ASSERT(tail.size() == 0); 144 ASSERT(tail.empty()); 145 ASSERT(tail.total_size() == sizeof(marisa::UInt32)); 146 147 keys.push_back(marisa::String("")); 148 marisa::Vector<marisa::UInt32> offsets; 149 tail.build(keys, &offsets, MARISA_TEXT_TAIL); 150 151 ASSERT(tail.size() == 2); 152 ASSERT(tail.mode() == MARISA_TEXT_TAIL); 153 ASSERT(!tail.empty()); 154 ASSERT(tail.total_size() == (sizeof(marisa::UInt32) + tail.size())); 155 ASSERT(offsets.size() == keys.size()); 156 ASSERT(offsets[0] == 1); 157 ASSERT(*tail[offsets[0]] == '\0'); 158 159 keys.clear(); 160 keys.push_back(marisa::String("abc")); 161 keys.push_back(marisa::String("bc")); 162 keys.push_back(marisa::String("abc")); 163 keys.push_back(marisa::String("c")); 164 keys.push_back(marisa::String("ABC")); 165 keys.push_back(marisa::String("AB")); 166 167 tail.build(keys, NULL, MARISA_TEXT_TAIL); 168 169 ASSERT(tail.size() == 12); 170 ASSERT(tail.mode() == MARISA_TEXT_TAIL); 171 ASSERT(!tail.empty()); 172 ASSERT(tail.total_size() == (sizeof(marisa::UInt32) + tail.size())); 173 174 tail.build(keys, &offsets, MARISA_TEXT_TAIL); 175 176 ASSERT(tail.size() == 12); 177 ASSERT(tail.mode() == MARISA_TEXT_TAIL); 178 ASSERT(!tail.empty()); 179 ASSERT(tail.total_size() == (sizeof(marisa::UInt32) + tail.size())); 180 ASSERT(offsets.size() == keys.size()); 181 for (marisa::UInt32 i = 0; i < keys.size(); ++i) { 182 ASSERT(marisa::String(reinterpret_cast<const char *>( 183 tail[offsets[i]])) == keys[i]); 184 } 185 186 tail.save("tail-test.dat"); 187 tail.clear(); 188 189 ASSERT(tail.size() == 0); 190 ASSERT(tail.empty()); 191 ASSERT(tail.total_size() == sizeof(marisa::UInt32)); 192 193 marisa::Mapper mapper; 194 tail.mmap(&mapper, "tail-test.dat"); 195 196 ASSERT(tail.size() == 12); 197 ASSERT(tail.mode() == MARISA_TEXT_TAIL); 198 ASSERT(!tail.empty()); 199 ASSERT(tail.total_size() == sizeof(marisa::UInt32) + tail.size()); 200 for (marisa::UInt32 i = 0; i < keys.size(); ++i) { 201 ASSERT(marisa::String(reinterpret_cast<const char *>( 202 tail[offsets[i]])) == keys[i]); 203 } 204 205 tail.clear(); 206 tail.load("tail-test.dat"); 207 208 ASSERT(tail.size() == 12); 209 ASSERT(tail.mode() == MARISA_TEXT_TAIL); 210 ASSERT(!tail.empty()); 211 ASSERT(tail.total_size() == sizeof(marisa::UInt32) + tail.size()); 212 for (marisa::UInt32 i = 0; i < keys.size(); ++i) { 213 ASSERT(marisa::String(reinterpret_cast<const char *>( 214 tail[offsets[i]])) == keys[i]); 215 } 216 217 std::stringstream stream; 218 tail.write(stream); 219 220 tail.clear(); 221 tail.read(stream); 222 223 ASSERT(tail.size() == 12); 224 ASSERT(tail.mode() == MARISA_TEXT_TAIL); 225 ASSERT(!tail.empty()); 226 ASSERT(tail.total_size() == sizeof(marisa::UInt32) + tail.size()); 227 for (marisa::UInt32 i = 0; i < keys.size(); ++i) { 228 ASSERT(marisa::String(reinterpret_cast<const char *>( 229 tail[offsets[i]])) == keys[i]); 230 } 231 232 TEST_END(); 233 } 234 235 } // namespace 236 237 int main() { 238 TestBinaryTail(); 239 TestTextTail(); 240 241 return 0; 242 } 243