1
0
Fork 0
mirror of https://github.com/systemed/tilemaker synced 2025-02-21 13:24:09 +01:00
tilemaker/test/attribute_store.test.cpp
Colin Dellow 7f03430456
Fix #750: allow no more than 512 attribute names (#760)
This fixes two issues:

- use an unsigned type, so we can use the whole 9 bits and have 512
  keys, not 256
- fix the bounds check in AttributeKeyStore to reflex the lower
  threshold that was introduced in #618

Hat tip @oobayly for reporting this.
2024-09-21 14:10:28 +01:00

130 lines
3.6 KiB
C++

#include <iostream>
#include <algorithm>
#include "external/minunit.h"
#include "attribute_store.h"
MU_TEST(test_attribute_store) {
AttributeStore store;
store.reset();
mu_check(store.size() == 0);
AttributeSet s1;
store.addAttribute(s1, "str1", std::string("someval"), 0);
store.addAttribute(s1, "str2", std::string("a very long string"), 14);
store.addAttribute(s1, "bool1", false, 0);
store.addAttribute(s1, "bool2", true, 0);
store.addAttribute(s1, "float1", (float)42.0, 4);
const auto s1Index = store.add(s1);
mu_check(store.size() == 1);
const auto s1Pairs = store.getUnsafe(s1Index);
mu_check(s1Pairs.size() == 5);
const auto str1 = std::find_if(s1Pairs.begin(), s1Pairs.end(), [&store](auto ap) {
return ap->keyIndex == store.keyStore.key2index("str1");
});
mu_check(str1 != s1Pairs.end());
mu_check((*str1)->hasStringValue());
mu_check((*str1)->stringValue() == "someval");
const auto str2 = std::find_if(s1Pairs.begin(), s1Pairs.end(), [&store](auto ap) {
return ap->keyIndex == store.keyStore.key2index("str2");
});
mu_check(str2 != s1Pairs.end());
mu_check((*str2)->hasStringValue());
mu_check((*str2)->stringValue() == "a very long string");
mu_check((*str2)->minzoom == 14);
const auto bool1 = std::find_if(s1Pairs.begin(), s1Pairs.end(), [&store](auto ap) {
return ap->keyIndex == store.keyStore.key2index("bool1");
});
mu_check(bool1 != s1Pairs.end());
mu_check((*bool1)->hasBoolValue());
mu_check((*bool1)->boolValue() == false);
const auto bool2 = std::find_if(s1Pairs.begin(), s1Pairs.end(), [&store](auto ap) {
return ap->keyIndex == store.keyStore.key2index("bool2");
});
mu_check(bool2 != s1Pairs.end());
mu_check((*bool2)->hasBoolValue());
mu_check((*bool2)->boolValue() == true);
const auto float1 = std::find_if(s1Pairs.begin(), s1Pairs.end(), [&store](auto ap) {
return ap->keyIndex == store.keyStore.key2index("float1");
});
mu_check(float1 != s1Pairs.end());
mu_check((*float1)->hasFloatValue());
mu_check((*float1)->floatValue() == 42);
mu_check((*float1)->minzoom == 4);
}
MU_TEST(test_attribute_store_reuses) {
AttributeStore store;
store.reset();
mu_check(store.size() == 0);
{
AttributeSet s1a;
store.addAttribute(s1a, "str1", std::string("someval"), 0);
const auto s1aIndex = store.add(s1a);
AttributeSet s1b;
store.addAttribute(s1b, "str1", std::string("someval"), 0);
const auto s1bIndex = store.add(s1b);
mu_check(s1aIndex == s1bIndex);
}
{
AttributeSet s1a;
store.addAttribute(s1a, "str1", std::string("this is a very long string"), 0);
const auto s1aIndex = store.add(s1a);
AttributeSet s1b;
store.addAttribute(s1b, "str1", std::string("this is a very long string"), 0);
const auto s1bIndex = store.add(s1b);
mu_check(s1aIndex == s1bIndex);
}
}
MU_TEST(test_attribute_store_capacity) {
// We support a maximum of 511 attribute name, so confirm that we can roundtrip
// this value.
AttributePair pair(511, true, 0);
mu_check(pair.keyIndex == 511);
// Confirm that the attribute store will throw if we try to add more than 511 keys.
AttributeKeyStore keys;
for (int i = 1; i <= 511; i++) {
const uint16_t keyIndex = keys.key2index("key" + std::to_string(i));
mu_check(keyIndex == i);
}
// Trying to add a 512th key should throw
bool caughtException = false;
try {
keys.key2index("key512");
} catch (std::out_of_range) {
caughtException = true;
}
mu_check(caughtException == true);
}
MU_TEST_SUITE(test_suite_attribute_store) {
MU_RUN_TEST(test_attribute_store);
MU_RUN_TEST(test_attribute_store_reuses);
MU_RUN_TEST(test_attribute_store_capacity);
}
int main() {
MU_RUN_SUITE(test_suite_attribute_store);
MU_REPORT();
return MU_EXIT_CODE;
}