| #include <sstream> |
| #include <string> |
| |
| #include <marisa/tail.h> |
| |
| #include "assert.h" |
| |
| namespace { |
| |
| void TestBinaryTail() { |
| TEST_START(); |
| |
| marisa::Tail tail; |
| |
| ASSERT(tail.size() == 0); |
| ASSERT(tail.empty()); |
| ASSERT(tail.total_size() == sizeof(marisa::UInt32)); |
| |
| marisa::Vector<marisa::String> keys; |
| tail.build(keys, NULL, MARISA_BINARY_TAIL); |
| |
| ASSERT(tail.size() == 0); |
| ASSERT(tail.empty()); |
| ASSERT(tail.total_size() == sizeof(marisa::UInt32)); |
| |
| keys.push_back(marisa::String("")); |
| marisa::Vector<marisa::UInt32> offsets; |
| tail.build(keys, &offsets, MARISA_BINARY_TAIL); |
| |
| ASSERT(tail.size() == 1); |
| ASSERT(tail.mode() == MARISA_BINARY_TAIL); |
| ASSERT(!tail.empty()); |
| ASSERT(tail.total_size() == (sizeof(marisa::UInt32) + tail.size())); |
| ASSERT(offsets.size() == keys.size() + 1); |
| ASSERT(offsets[0] == 1); |
| ASSERT(offsets[1] == tail.size()); |
| |
| const char binary_key[] = { 'N', 'P', '\0', 'T', 'r', 'i', 'e' }; |
| keys[0] = marisa::String(binary_key, sizeof(binary_key)); |
| tail.build(keys, &offsets, MARISA_TEXT_TAIL); |
| |
| ASSERT(tail.size() == sizeof(binary_key) + 1); |
| ASSERT(tail.mode() == MARISA_BINARY_TAIL); |
| ASSERT(!tail.empty()); |
| ASSERT(tail.total_size() == (sizeof(marisa::UInt32) + tail.size())); |
| ASSERT(offsets.size() == keys.size() + 1); |
| ASSERT(offsets[0] == 1); |
| ASSERT(offsets[1] == tail.size()); |
| |
| tail.build(keys, &offsets, MARISA_BINARY_TAIL); |
| |
| ASSERT(tail.size() == sizeof(binary_key) + 1); |
| ASSERT(tail.mode() == MARISA_BINARY_TAIL); |
| ASSERT(!tail.empty()); |
| ASSERT(tail.total_size() == (sizeof(marisa::UInt32) + tail.size())); |
| ASSERT(offsets.size() == keys.size() + 1); |
| ASSERT(offsets[0] == 1); |
| ASSERT(offsets[1] == tail.size()); |
| |
| keys.clear(); |
| keys.push_back(marisa::String("abc")); |
| keys.push_back(marisa::String("bc")); |
| keys.push_back(marisa::String("abc")); |
| keys.push_back(marisa::String("c")); |
| keys.push_back(marisa::String("ABC")); |
| keys.push_back(marisa::String("AB")); |
| |
| tail.build(keys, NULL, MARISA_BINARY_TAIL); |
| |
| ASSERT(tail.size() == 15); |
| ASSERT(tail.mode() == MARISA_BINARY_TAIL); |
| ASSERT(!tail.empty()); |
| ASSERT(tail.total_size() == (sizeof(marisa::UInt32) + tail.size())); |
| |
| tail.build(keys, &offsets, MARISA_BINARY_TAIL); |
| |
| ASSERT(tail.size() == 15); |
| ASSERT(tail.mode() == MARISA_BINARY_TAIL); |
| ASSERT(!tail.empty()); |
| ASSERT(tail.total_size() == (sizeof(marisa::UInt32) + tail.size())); |
| ASSERT(offsets.size() == 7); |
| for (marisa::UInt32 i = 0; i < keys.size(); ++i) { |
| ASSERT(marisa::String(reinterpret_cast<const char *>(tail[offsets[i]]), |
| offsets[i + 1] - offsets[i]) == keys[i]); |
| } |
| |
| tail.save("tail-test.dat"); |
| tail.clear(); |
| |
| ASSERT(tail.size() == 0); |
| ASSERT(tail.empty()); |
| ASSERT(tail.total_size() == sizeof(marisa::UInt32)); |
| |
| marisa::Mapper mapper; |
| tail.mmap(&mapper, "tail-test.dat"); |
| |
| ASSERT(tail.size() == 15); |
| ASSERT(tail.mode() == MARISA_BINARY_TAIL); |
| ASSERT(!tail.empty()); |
| ASSERT(tail.total_size() == (sizeof(marisa::UInt32) + tail.size())); |
| for (marisa::UInt32 i = 0; i < keys.size(); ++i) { |
| ASSERT(marisa::String(reinterpret_cast<const char *>(tail[offsets[i]]), |
| offsets[i + 1] - offsets[i]) == keys[i]); |
| } |
| |
| tail.clear(); |
| tail.load("tail-test.dat"); |
| |
| ASSERT(tail.size() == 15); |
| ASSERT(tail.mode() == MARISA_BINARY_TAIL); |
| ASSERT(!tail.empty()); |
| ASSERT(tail.total_size() == (sizeof(marisa::UInt32) + tail.size())); |
| for (marisa::UInt32 i = 0; i < keys.size(); ++i) { |
| ASSERT(marisa::String(reinterpret_cast<const char *>(tail[offsets[i]]), |
| offsets[i + 1] - offsets[i]) == keys[i]); |
| } |
| |
| std::stringstream stream; |
| tail.write(stream); |
| |
| tail.clear(); |
| tail.read(stream); |
| |
| ASSERT(tail.size() == 15); |
| ASSERT(tail.mode() == MARISA_BINARY_TAIL); |
| ASSERT(!tail.empty()); |
| ASSERT(tail.total_size() == (sizeof(marisa::UInt32) + tail.size())); |
| for (marisa::UInt32 i = 0; i < keys.size(); ++i) { |
| ASSERT(marisa::String(reinterpret_cast<const char *>(tail[offsets[i]]), |
| offsets[i + 1] - offsets[i]) == keys[i]); |
| } |
| |
| TEST_END(); |
| } |
| |
| void TestTextTail() { |
| TEST_START(); |
| |
| marisa::Tail tail; |
| marisa::Vector<marisa::String> keys; |
| tail.build(keys, NULL, MARISA_TEXT_TAIL); |
| |
| ASSERT(tail.size() == 0); |
| ASSERT(tail.empty()); |
| ASSERT(tail.total_size() == sizeof(marisa::UInt32)); |
| |
| keys.push_back(marisa::String("")); |
| marisa::Vector<marisa::UInt32> offsets; |
| tail.build(keys, &offsets, MARISA_TEXT_TAIL); |
| |
| ASSERT(tail.size() == 2); |
| ASSERT(tail.mode() == MARISA_TEXT_TAIL); |
| ASSERT(!tail.empty()); |
| ASSERT(tail.total_size() == (sizeof(marisa::UInt32) + tail.size())); |
| ASSERT(offsets.size() == keys.size()); |
| ASSERT(offsets[0] == 1); |
| ASSERT(*tail[offsets[0]] == '\0'); |
| |
| keys.clear(); |
| keys.push_back(marisa::String("abc")); |
| keys.push_back(marisa::String("bc")); |
| keys.push_back(marisa::String("abc")); |
| keys.push_back(marisa::String("c")); |
| keys.push_back(marisa::String("ABC")); |
| keys.push_back(marisa::String("AB")); |
| |
| tail.build(keys, NULL, MARISA_TEXT_TAIL); |
| |
| ASSERT(tail.size() == 12); |
| ASSERT(tail.mode() == MARISA_TEXT_TAIL); |
| ASSERT(!tail.empty()); |
| ASSERT(tail.total_size() == (sizeof(marisa::UInt32) + tail.size())); |
| |
| tail.build(keys, &offsets, MARISA_TEXT_TAIL); |
| |
| ASSERT(tail.size() == 12); |
| ASSERT(tail.mode() == MARISA_TEXT_TAIL); |
| ASSERT(!tail.empty()); |
| ASSERT(tail.total_size() == (sizeof(marisa::UInt32) + tail.size())); |
| ASSERT(offsets.size() == keys.size()); |
| for (marisa::UInt32 i = 0; i < keys.size(); ++i) { |
| ASSERT(marisa::String(reinterpret_cast<const char *>( |
| tail[offsets[i]])) == keys[i]); |
| } |
| |
| tail.save("tail-test.dat"); |
| tail.clear(); |
| |
| ASSERT(tail.size() == 0); |
| ASSERT(tail.empty()); |
| ASSERT(tail.total_size() == sizeof(marisa::UInt32)); |
| |
| marisa::Mapper mapper; |
| tail.mmap(&mapper, "tail-test.dat"); |
| |
| ASSERT(tail.size() == 12); |
| ASSERT(tail.mode() == MARISA_TEXT_TAIL); |
| ASSERT(!tail.empty()); |
| ASSERT(tail.total_size() == sizeof(marisa::UInt32) + tail.size()); |
| for (marisa::UInt32 i = 0; i < keys.size(); ++i) { |
| ASSERT(marisa::String(reinterpret_cast<const char *>( |
| tail[offsets[i]])) == keys[i]); |
| } |
| |
| tail.clear(); |
| tail.load("tail-test.dat"); |
| |
| ASSERT(tail.size() == 12); |
| ASSERT(tail.mode() == MARISA_TEXT_TAIL); |
| ASSERT(!tail.empty()); |
| ASSERT(tail.total_size() == sizeof(marisa::UInt32) + tail.size()); |
| for (marisa::UInt32 i = 0; i < keys.size(); ++i) { |
| ASSERT(marisa::String(reinterpret_cast<const char *>( |
| tail[offsets[i]])) == keys[i]); |
| } |
| |
| std::stringstream stream; |
| tail.write(stream); |
| |
| tail.clear(); |
| tail.read(stream); |
| |
| ASSERT(tail.size() == 12); |
| ASSERT(tail.mode() == MARISA_TEXT_TAIL); |
| ASSERT(!tail.empty()); |
| ASSERT(tail.total_size() == sizeof(marisa::UInt32) + tail.size()); |
| for (marisa::UInt32 i = 0; i < keys.size(); ++i) { |
| ASSERT(marisa::String(reinterpret_cast<const char *>( |
| tail[offsets[i]])) == keys[i]); |
| } |
| |
| TEST_END(); |
| } |
| |
| } // namespace |
| |
| int main() { |
| TestBinaryTail(); |
| TestTextTail(); |
| |
| return 0; |
| } |