diff options
author | Vyacheslav Tyutyunkov <tve@softmotions.com> | 2017-03-24 15:56:06 +0700 |
---|---|---|
committer | Ćukasz Stelmach <l.stelmach@samsung.com> | 2017-04-20 12:45:35 +0200 |
commit | 5ffbf0182884ea5c1f5632f102b07168bcb30b43 (patch) | |
tree | fda15b8110a3b9c424d99f2b3f879d1c358c9c2b | |
parent | e9a62d9693c1b42d44e277febf8de58cf2643db0 (diff) | |
download | ejdb-5ffbf0182884ea5c1f5632f102b07168bcb30b43.tar.gz ejdb-5ffbf0182884ea5c1f5632f102b07168bcb30b43.tar.bz2 ejdb-5ffbf0182884ea5c1f5632f102b07168bcb30b43.zip |
#170
-rw-r--r-- | src/bson/bson.c | 2 | ||||
-rw-r--r-- | src/bson/tests/bsontest.c | 54 |
2 files changed, 54 insertions, 2 deletions
diff --git a/src/bson/bson.c b/src/bson/bson.c index 16b6e51..6ecde34 100644 --- a/src/bson/bson.c +++ b/src/bson/bson.c @@ -1829,7 +1829,7 @@ static void _bson_fix_duplicate_keys(bson_iterator *it, bson *bso) { int ind = 0; int j = -1; while(++j < TCLISTNUM(dups)) { - buf = tclistval(dups, TCLISTNUM(dups) - 1, &bufsz); + buf = tclistval(dups, j, &bufsz); memcpy(&itoff, buf, sizeof(itoff)); it2.cur = it->cur + itoff; it2.first = itoff == 0 ? it->first : 0; diff --git a/src/bson/tests/bsontest.c b/src/bson/tests/bsontest.c index 935c3da..b31ab0d 100644 --- a/src/bson/tests/bsontest.c +++ b/src/bson/tests/bsontest.c @@ -152,6 +152,57 @@ void testCheckDuplicates(void) { CU_ASSERT_EQUAL(bson_iterator_int(&it), 1); } +void testCheckDuplicates2(void) { + bson b, b2; + bson_iterator it, sit; + bson_type bt; + + bson_init(&b); + bson_append_start_array(&b, "array"); + bson_append_int(&b, "0", 1); + bson_append_finish_array(&b); + bson_append_start_array(&b, "array"); + bson_append_int(&b, "0", 3); + bson_append_int(&b, "1", 4); + bson_append_finish_array(&b); + bson_finish(&b); + CU_ASSERT_FALSE_FATAL(b.err); + + CU_ASSERT_TRUE_FATAL(bson_check_duplicate_keys(&b)); + + bson_init(&b2); + bson_fix_duplicate_keys(&b, &b2); + bson_finish(&b2); + CU_ASSERT_FALSE_FATAL(b2.err); + + CU_ASSERT_FALSE_FATAL(bson_check_duplicate_keys(&b2)); + + BSON_ITERATOR_INIT(&it, &b2); + bt = bson_iterator_next(&it); + CU_ASSERT_EQUAL_FATAL(bt, BSON_ARRAY); + CU_ASSERT_STRING_EQUAL_FATAL(BSON_ITERATOR_KEY(&it), "array"); + BSON_ITERATOR_SUBITERATOR(&it, &sit); + + bt = bson_iterator_next(&sit); + CU_ASSERT_STRING_EQUAL_FATAL(BSON_ITERATOR_KEY(&sit), "0"); + CU_ASSERT_TRUE_FATAL(BSON_IS_NUM_TYPE(bt)); + CU_ASSERT_EQUAL_FATAL(bson_iterator_int(&sit), 1); + bt = bson_iterator_next(&sit); + CU_ASSERT_STRING_EQUAL_FATAL(BSON_ITERATOR_KEY(&sit), "1"); + CU_ASSERT_TRUE_FATAL(BSON_IS_NUM_TYPE(bt)); + CU_ASSERT_EQUAL_FATAL(bson_iterator_int(&sit), 3); + bt = bson_iterator_next(&sit); + CU_ASSERT_STRING_EQUAL_FATAL(BSON_ITERATOR_KEY(&sit), "2"); + CU_ASSERT_TRUE_FATAL(BSON_IS_NUM_TYPE(bt)); + CU_ASSERT_EQUAL_FATAL(bson_iterator_int(&sit), 4); + + bt = bson_iterator_next(&sit); + CU_ASSERT_EQUAL_FATAL(bt, BSON_EOO); + + bson_destroy(&b2); + bson_destroy(&b); +} + int main() { setlocale(LC_ALL, "en_US.UTF-8"); CU_pSuite pSuite = NULL; @@ -168,7 +219,8 @@ int main() { } /* Add the tests to the suite */ - if ((NULL == CU_add_test(pSuite, "testCheckDuplicates", testCheckDuplicates)) + if ((NULL == CU_add_test(pSuite, "testCheckDuplicates", testCheckDuplicates)) || + (NULL == CU_add_test(pSuite, "testCheckDuplicates2", testCheckDuplicates2)) ) { CU_cleanup_registry(); return CU_get_error(); |