Blame tests/base-test.cc

Packit de3218
#include <cstdlib>
Packit de3218
#include <cstring>
Packit de3218
#include <ctime>
Packit de3218
#include <string>
Packit de3218
#include <vector>
Packit de3218
Packit de3218
#include <marisa.h>
Packit de3218
Packit de3218
#include "marisa-assert.h"
Packit de3218
Packit de3218
namespace {
Packit de3218
Packit de3218
void TestTypes() {
Packit de3218
  TEST_START();
Packit de3218
Packit de3218
  ASSERT(sizeof(marisa_uint8) == 1);
Packit de3218
  ASSERT(sizeof(marisa_uint16) == 2);
Packit de3218
  ASSERT(sizeof(marisa_uint32) == 4);
Packit de3218
  ASSERT(sizeof(marisa_uint64) == 8);
Packit de3218
Packit de3218
  ASSERT(MARISA_WORD_SIZE == (sizeof(std::size_t) * 8));
Packit de3218
Packit de3218
  ASSERT(MARISA_UINT8_MAX == 0xFFU);
Packit de3218
  ASSERT(MARISA_UINT16_MAX == 0xFFFFU);
Packit de3218
  ASSERT(MARISA_UINT32_MAX == 0xFFFFFFFFU);
Packit de3218
  ASSERT(MARISA_UINT64_MAX == 0xFFFFFFFFFFFFFFFFULL);
Packit de3218
Packit de3218
  ASSERT(sizeof(marisa::UInt8) == 1);
Packit de3218
  ASSERT(sizeof(marisa::UInt16) == 2);
Packit de3218
  ASSERT(sizeof(marisa::UInt32) == 4);
Packit de3218
  ASSERT(sizeof(marisa::UInt64) == 8);
Packit de3218
Packit de3218
  TEST_END();
Packit de3218
}
Packit de3218
Packit de3218
void TestSwap() {
Packit de3218
  TEST_START();
Packit de3218
Packit de3218
  int x = 100, y = 200;
Packit de3218
  marisa::swap(x, y);
Packit de3218
  ASSERT(x == 200);
Packit de3218
  ASSERT(y == 100);
Packit de3218
Packit de3218
  double a = 1.23, b = 2.34;
Packit de3218
  marisa::swap(a, b);
Packit de3218
  ASSERT(a == 2.34);
Packit de3218
  ASSERT(b == 1.23);
Packit de3218
Packit de3218
  TEST_END();
Packit de3218
}
Packit de3218
Packit de3218
void TestException() {
Packit de3218
  TEST_START();
Packit de3218
Packit de3218
  try {
Packit de3218
    MARISA_THROW(MARISA_OK, "Message");
Packit de3218
  } catch (const marisa::Exception &ex) {
Packit de3218
    ASSERT(std::strcmp(ex.filename(), __FILE__) == 0);
Packit de3218
    ASSERT(ex.line() == (__LINE__ - 3));
Packit de3218
    ASSERT(ex.error_code() == MARISA_OK);
Packit de3218
    ASSERT(std::strstr(ex.error_message(), "Message") != NULL);
Packit de3218
  }
Packit de3218
Packit de3218
  EXCEPT(MARISA_THROW(MARISA_OK, "OK"), MARISA_OK);
Packit de3218
  EXCEPT(MARISA_THROW(MARISA_NULL_ERROR, "NULL"), MARISA_NULL_ERROR);
Packit de3218
Packit de3218
  TEST_END();
Packit de3218
}
Packit de3218
Packit de3218
void TestKey() {
Packit de3218
  TEST_START();
Packit de3218
Packit de3218
  const char * const str = "apple";
Packit de3218
Packit de3218
  marisa::Key key;
Packit de3218
Packit de3218
  ASSERT(key.ptr() == NULL);
Packit de3218
  ASSERT(key.length() == 0);
Packit de3218
Packit de3218
  key.set_str(str);
Packit de3218
Packit de3218
  ASSERT(key.ptr() == str);
Packit de3218
  ASSERT(key.length() == std::strlen(str));
Packit de3218
Packit de3218
  key.set_str(str, 4);
Packit de3218
Packit de3218
  ASSERT(key.ptr() == str);
Packit de3218
  ASSERT(key.length() == 4);
Packit de3218
Packit de3218
  key.set_weight(1.0);
Packit de3218
Packit de3218
  ASSERT(key.weight() == 1.0);
Packit de3218
Packit de3218
  key.set_id(100);
Packit de3218
Packit de3218
  ASSERT(key.id() == 100);
Packit de3218
Packit de3218
  TEST_END();
Packit de3218
}
Packit de3218
Packit de3218
void TestKeyset() {
Packit de3218
  TEST_START();
Packit de3218
Packit de3218
  marisa::Keyset keyset;
Packit de3218
Packit de3218
  ASSERT(keyset.size() == 0);
Packit de3218
  ASSERT(keyset.empty());
Packit de3218
  ASSERT(keyset.total_length() == 0);
Packit de3218
Packit de3218
  std::vector<std::string> keys;
Packit de3218
  keys.push_back("apple");
Packit de3218
  keys.push_back("orange");
Packit de3218
  keys.push_back("banana");
Packit de3218
Packit de3218
  std::size_t total_length = 0;
Packit de3218
  for (std::size_t i = 0; i < keys.size(); ++i) {
Packit de3218
    keyset.push_back(keys[i].c_str());
Packit de3218
    ASSERT(keyset.size() == (i + 1));
Packit de3218
    ASSERT(!keyset.empty());
Packit de3218
Packit de3218
    total_length += keys[i].length();
Packit de3218
    ASSERT(keyset.total_length() == total_length);
Packit de3218
Packit de3218
    ASSERT(keyset[i].length() == keys[i].length());
Packit de3218
    ASSERT(std::memcmp(keyset[i].ptr(), keys[i].c_str(),
Packit de3218
        keyset[i].length()) == 0);
Packit de3218
    ASSERT(keyset[i].weight() == 1.0);
Packit de3218
  }
Packit de3218
Packit de3218
  keyset.clear();
Packit de3218
Packit de3218
  marisa::Key key;
Packit de3218
Packit de3218
  key.set_str("123");
Packit de3218
  keyset.push_back(key);
Packit de3218
  ASSERT(keyset[0].length() == 3);
Packit de3218
  ASSERT(std::memcmp(keyset[0].ptr(), "123", 3) == 0);
Packit de3218
Packit de3218
  key.set_str("456");
Packit de3218
  keyset.push_back(key, '\0');
Packit de3218
  ASSERT(keyset[1].length() == 3);
Packit de3218
  ASSERT(std::memcmp(keyset[1].ptr(), "456", 3) == 0);
Packit de3218
  ASSERT(std::strcmp(keyset[1].ptr(), "456") == 0);
Packit de3218
Packit de3218
  key.set_str("789");
Packit de3218
  keyset.push_back(key, '0');
Packit de3218
  ASSERT(keyset[2].length() == 3);
Packit de3218
  ASSERT(std::memcmp(keyset[2].ptr(), "789", 3) == 0);
Packit de3218
  ASSERT(std::memcmp(keyset[2].ptr(), "7890", 4) == 0);
Packit de3218
Packit de3218
  ASSERT(keyset.size() == 3);
Packit de3218
Packit de3218
  keyset.clear();
Packit de3218
Packit de3218
  ASSERT(keyset.size() == 0);
Packit de3218
  ASSERT(keyset.total_length() == 0);
Packit de3218
Packit de3218
  keys.resize(1000);
Packit de3218
  std::vector<float> weights(keys.size());
Packit de3218
Packit de3218
  total_length = 0;
Packit de3218
  for (std::size_t i = 0; i < keys.size(); ++i) {
Packit de3218
    keys[i].resize(std::rand() % (marisa::Keyset::EXTRA_BLOCK_SIZE * 2));
Packit de3218
    for (std::size_t j = 0; j < keys[i].length(); ++j) {
Packit de3218
      keys[i][j] = (char)(std::rand() & 0xFF);
Packit de3218
    }
Packit de3218
    weights[i] = 100.0F * std::rand() / RAND_MAX;
Packit de3218
Packit de3218
    keyset.push_back(keys[i].c_str(), keys[i].length(), weights[i]);
Packit de3218
    total_length += keys[i].length();
Packit de3218
    ASSERT(keyset.total_length() == total_length);
Packit de3218
  }
Packit de3218
Packit de3218
  ASSERT(keyset.size() == keys.size());
Packit de3218
  for (std::size_t i = 0; i < keys.size(); ++i) {
Packit de3218
    ASSERT(keyset[i].length() == keys[i].length());
Packit de3218
    ASSERT(std::memcmp(keyset[i].ptr(), keys[i].c_str(),
Packit de3218
        keyset[i].length()) == 0);
Packit de3218
    ASSERT(keyset[i].weight() == weights[i]);
Packit de3218
  }
Packit de3218
Packit de3218
  keyset.reset();
Packit de3218
Packit de3218
  ASSERT(keyset.size() == 0);
Packit de3218
  ASSERT(keyset.total_length() == 0);
Packit de3218
Packit de3218
  total_length = 0;
Packit de3218
  for (std::size_t i = 0; i < keys.size(); ++i) {
Packit de3218
    keys[i].resize(std::rand() % (marisa::Keyset::EXTRA_BLOCK_SIZE * 2));
Packit de3218
    for (std::size_t j = 0; j < keys[i].length(); ++j) {
Packit de3218
      keys[i][j] = (char)(std::rand() & 0xFF);
Packit de3218
    }
Packit de3218
    weights[i] = 100.0F * std::rand() / RAND_MAX;
Packit de3218
Packit de3218
    keyset.push_back(keys[i].c_str(), keys[i].length(), weights[i]);
Packit de3218
    total_length += keys[i].length();
Packit de3218
    ASSERT(keyset.total_length() == total_length);
Packit de3218
  }
Packit de3218
Packit de3218
  ASSERT(keyset.size() == keys.size());
Packit de3218
  for (std::size_t i = 0; i < keys.size(); ++i) {
Packit de3218
    ASSERT(keyset[i].length() == keys[i].length());
Packit de3218
    ASSERT(std::memcmp(keyset[i].ptr(), keys[i].c_str(),
Packit de3218
        keyset[i].length()) == 0);
Packit de3218
    ASSERT(keyset[i].weight() == weights[i]);
Packit de3218
  }
Packit de3218
Packit de3218
  TEST_END();
Packit de3218
}
Packit de3218
Packit de3218
void TestQuery() {
Packit de3218
  TEST_START();
Packit de3218
Packit de3218
  marisa::Query query;
Packit de3218
Packit de3218
  ASSERT(query.ptr() == NULL);
Packit de3218
  ASSERT(query.length() == 0);
Packit de3218
  ASSERT(query.id() == 0);
Packit de3218
Packit de3218
  const char *str = "apple";
Packit de3218
  query.set_str(str);
Packit de3218
Packit de3218
  ASSERT(query.ptr() == str);
Packit de3218
  ASSERT(query.length() == std::strlen(str));
Packit de3218
Packit de3218
  query.set_str(str, 3);
Packit de3218
Packit de3218
  ASSERT(query.ptr() == str);
Packit de3218
  ASSERT(query.length() == 3);
Packit de3218
Packit de3218
  query.set_id(100);
Packit de3218
Packit de3218
  ASSERT(query.id() == 100);
Packit de3218
Packit de3218
  query.clear();
Packit de3218
Packit de3218
  ASSERT(query.ptr() == NULL);
Packit de3218
  ASSERT(query.length() == 0);
Packit de3218
  ASSERT(query.id() == 0);
Packit de3218
Packit de3218
  TEST_END();
Packit de3218
}
Packit de3218
Packit de3218
void TestAgent() {
Packit de3218
  TEST_START();
Packit de3218
Packit de3218
  marisa::Agent agent;
Packit de3218
Packit de3218
  ASSERT(agent.query().ptr() == NULL);
Packit de3218
  ASSERT(agent.query().length() == 0);
Packit de3218
  ASSERT(agent.query().id() == 0);
Packit de3218
Packit de3218
  ASSERT(agent.key().ptr() == NULL);
Packit de3218
  ASSERT(agent.key().length() == 0);
Packit de3218
Packit de3218
  ASSERT(!agent.has_state());
Packit de3218
Packit de3218
  const char *query_str = "query";
Packit de3218
  const char *key_str = "key";
Packit de3218
Packit de3218
  agent.set_query(query_str);
Packit de3218
  agent.set_query(123);
Packit de3218
  agent.set_key(key_str);
Packit de3218
  agent.set_key(234);
Packit de3218
Packit de3218
  ASSERT(agent.query().ptr() == query_str);
Packit de3218
  ASSERT(agent.query().length() == std::strlen(query_str));
Packit de3218
  ASSERT(agent.query().id() == 123);
Packit de3218
Packit de3218
  ASSERT(agent.key().ptr() == key_str);
Packit de3218
  ASSERT(agent.key().length() == std::strlen(key_str));
Packit de3218
  ASSERT(agent.key().id() == 234);
Packit de3218
Packit de3218
  agent.init_state();
Packit de3218
Packit de3218
  ASSERT(agent.has_state());
Packit de3218
Packit de3218
  EXCEPT(agent.init_state(), MARISA_STATE_ERROR);
Packit de3218
Packit de3218
  agent.clear();
Packit de3218
Packit de3218
  ASSERT(agent.query().ptr() == NULL);
Packit de3218
  ASSERT(agent.query().length() == 0);
Packit de3218
  ASSERT(agent.query().id() == 0);
Packit de3218
Packit de3218
  ASSERT(agent.key().ptr() == NULL);
Packit de3218
  ASSERT(agent.key().length() == 0);
Packit de3218
Packit de3218
  ASSERT(!agent.has_state());
Packit de3218
Packit de3218
  TEST_END();
Packit de3218
}
Packit de3218
Packit de3218
}  // namespace
Packit de3218
Packit de3218
int main() try {
Packit de3218
  TestTypes();
Packit de3218
  TestSwap();
Packit de3218
  TestException();
Packit de3218
  TestKey();
Packit de3218
  TestKeyset();
Packit de3218
  TestQuery();
Packit de3218
  TestAgent();
Packit de3218
Packit de3218
  return 0;
Packit de3218
} catch (const marisa::Exception &ex) {
Packit de3218
  std::cerr << ex.what() << std::endl;
Packit de3218
  throw;
Packit de3218
}