fix: harden small core containers
This commit is contained in:
@@ -76,3 +76,37 @@ hmap_long_utf8_keys(struct ct *t)
|
||||
cleanup:
|
||||
hmapfree(h);
|
||||
}
|
||||
|
||||
void
|
||||
hmap_binary_keys_and_invalid_lengths(struct ct *t)
|
||||
{
|
||||
Hmap *h;
|
||||
Hnode *n;
|
||||
Str key, other;
|
||||
|
||||
h = hmapalloc(1);
|
||||
CT_CHECK(t, h != nil);
|
||||
key.n = 3;
|
||||
key.r[0] = 'a';
|
||||
key.r[1] = 0;
|
||||
key.r[2] = 'b';
|
||||
other = key;
|
||||
other.r[2] = 'c';
|
||||
hmapset(&h, &key, "one", 3);
|
||||
hmapset(&h, &other, "two", 3);
|
||||
n = hmapget(h, &key);
|
||||
if(CT_CHECK(t, n != nil)){
|
||||
CT_EQ_INT(t, 3, n->klen);
|
||||
CT_EQ_MEM(t, "one", n->val, n->vlen);
|
||||
}
|
||||
n = hmapget(h, &other);
|
||||
if(CT_CHECK(t, n != nil))
|
||||
CT_EQ_MEM(t, "two", n->val, n->vlen);
|
||||
hmapset(&h, &key, "bad", -1);
|
||||
hmapset(&h, &key, nil, 1);
|
||||
n = hmapget(h, &key);
|
||||
if(CT_CHECK(t, n != nil))
|
||||
CT_EQ_MEM(t, "one", n->val, n->vlen);
|
||||
CT_EQ_PTR(t, nil, hmapalloc(0));
|
||||
hmapfree(h);
|
||||
}
|
||||
|
||||
@@ -82,3 +82,21 @@ str_utf8_capacity(struct ct *t)
|
||||
CT_EQ_STR(t, "😀", buf);
|
||||
CT_EQ_INT(t, 'Z', buf[5]);
|
||||
}
|
||||
|
||||
void
|
||||
str_invalid_and_full_appends(struct ct *t)
|
||||
{
|
||||
Str s;
|
||||
int i;
|
||||
|
||||
sinit(&s, nil, 1);
|
||||
CT_EQ_INT(t, 0, s.n);
|
||||
sinit(&s, "x", -1);
|
||||
CT_EQ_INT(t, 0, s.n);
|
||||
for(i = 0; i < Maxrunes; i++)
|
||||
s.r[i] = 'a';
|
||||
s.n = Maxrunes;
|
||||
sputr(&s, 'z');
|
||||
CT_EQ_INT(t, Maxrunes, s.n);
|
||||
CT_EQ_INT(t, 'a', s.r[Maxrunes-1]);
|
||||
}
|
||||
|
||||
@@ -17,9 +17,12 @@ Str shownpre(Im*);
|
||||
void str_init_utf8(struct ct*);
|
||||
void str_edit_and_alias(struct ct*);
|
||||
void str_utf8_capacity(struct ct*);
|
||||
void str_invalid_and_full_appends(struct ct*);
|
||||
void hmap_set_replace_and_grow(struct ct*);
|
||||
void hmap_long_utf8_keys(struct ct*);
|
||||
void hmap_binary_keys_and_invalid_lengths(struct ct*);
|
||||
void trie_exact_prefix_and_duplicate(struct ct*);
|
||||
void trie_optional_outputs_and_invalid_lengths(struct ct*);
|
||||
void production_maps_load(struct ct*);
|
||||
void transmap_states(struct ct*);
|
||||
void korean_sequences(struct ct*);
|
||||
|
||||
@@ -34,6 +34,29 @@ cleanup:
|
||||
trieclose(trie);
|
||||
}
|
||||
|
||||
void
|
||||
trie_optional_outputs_and_invalid_lengths(struct ct *t)
|
||||
{
|
||||
char *v;
|
||||
Trie *trie;
|
||||
int n;
|
||||
|
||||
trie = trieopen("data/trie.map");
|
||||
CT_CHECK(t, trieget(trie, "a", 1, nil) != nil);
|
||||
v = nil;
|
||||
CT_CHECK(t, trielookup(trie, "a", 1, &v, nil));
|
||||
CT_CHECK(t, v != nil);
|
||||
n = -1;
|
||||
CT_CHECK(t, trielookup(trie, "a", 1, nil, &n));
|
||||
CT_EQ_INT(t, 5, n);
|
||||
CT_CHECK(t, trielookup(trie, "dupli", 5, nil, nil));
|
||||
CT_EQ_PTR(t, nil, trieget(trie, nil, 1, &n));
|
||||
CT_EQ_PTR(t, nil, trieget(trie, "a", -1, &n));
|
||||
CT_CHECK(t, !trielookup(trie, nil, 1, &v, &n));
|
||||
CT_CHECK(t, !trielookup(trie, "a", -1, &v, &n));
|
||||
trieclose(trie);
|
||||
}
|
||||
|
||||
void
|
||||
production_maps_load(struct ct *t)
|
||||
{
|
||||
|
||||
@@ -66,9 +66,12 @@ static const struct ct_test tests[] = {
|
||||
{ "str/init-utf8", str_init_utf8 },
|
||||
{ "str/edit-and-alias", str_edit_and_alias },
|
||||
{ "str/utf8-capacity", str_utf8_capacity },
|
||||
{ "str/invalid-full-appends", str_invalid_and_full_appends },
|
||||
{ "hmap/set-replace-grow", hmap_set_replace_and_grow },
|
||||
{ "hmap/long-utf8-keys", hmap_long_utf8_keys },
|
||||
{ "hmap/binary-invalid-lengths", hmap_binary_keys_and_invalid_lengths },
|
||||
{ "trie/exact-prefix-duplicate", trie_exact_prefix_and_duplicate },
|
||||
{ "trie/optional-invalid-lengths", trie_optional_outputs_and_invalid_lengths },
|
||||
{ "map/production-lifecycle", production_maps_load },
|
||||
{ "transmap/states", transmap_states },
|
||||
{ "hangul/sequences", korean_sequences },
|
||||
|
||||
Reference in New Issue
Block a user