/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "ua_util_internal.h" #include #include #include "check.h" static UA_KeyValueMap* keyValueMap_setup(size_t n, size_t offsetKey, size_t offsetValue) { UA_KeyValueMap *kvm = UA_KeyValueMap_new(); for(size_t i=0; imap[i].key, &kvmCopy.map[i].key)); } UA_KeyValueMap_delete(kvm); UA_KeyValueMap_clear(&kvmCopy); } END_TEST START_TEST(CheckKVMCountMergedIntersecting) { UA_KeyValueMap *kvmLhs = keyValueMap_setup(10, 0, 0); UA_KeyValueMap *kvmRhs = keyValueMap_setup(10, 5, 10); /** key00: 0 key01: 1 ... key09: 9 --------------------- key05: 10 key06: 11 ... key14: 19 */ UA_KeyValueMap_merge(kvmLhs, kvmRhs); ck_assert_uint_eq(kvmLhs->mapSize, 15); for(size_t i = 0; i < kvmLhs->mapSize; i++) { char key[10]; snprintf(key, 10, "key%02d", (UA_UInt16) i); const UA_UInt16 *value = (const UA_UInt16*) UA_KeyValueMap_getScalar(kvmLhs, UA_QUALIFIEDNAME(0, key), &UA_TYPES[UA_TYPES_UINT16]); if(i < 5) { ck_assert_uint_eq(*value, i); } else { ck_assert_uint_eq(*value, i+5); } } UA_KeyValueMap_delete(kvmLhs); UA_KeyValueMap_delete(kvmRhs); } END_TEST START_TEST(CheckKVMCountMergedCommon) { UA_KeyValueMap *kvmLhs = keyValueMap_setup(10, 0, 0); UA_KeyValueMap *kvmRhs = keyValueMap_setup(10, 0, 10); UA_KeyValueMap_merge(kvmLhs, kvmRhs); ck_assert_uint_eq(kvmLhs->mapSize, 10); for(size_t i = 0; i < kvmLhs->mapSize; i++) { char key[10]; snprintf(key, 10, "key%02d", (UA_UInt16) i); const UA_UInt16 *value = (const UA_UInt16*) UA_KeyValueMap_getScalar(kvmLhs, UA_QUALIFIEDNAME(0, key), &UA_TYPES[UA_TYPES_UINT16]); ck_assert_uint_eq(*value, i+10); } UA_KeyValueMap_delete(kvmLhs); UA_KeyValueMap_delete(kvmRhs); } END_TEST START_TEST(CheckKVMCountMergedComplementary) { UA_KeyValueMap *kvmLhs = keyValueMap_setup(10, 0, 0); UA_KeyValueMap *kvmRhs = keyValueMap_setup(10, 10, 10); UA_KeyValueMap_merge(kvmLhs, kvmRhs); ck_assert_uint_eq(kvmLhs->mapSize, 20); for(size_t i = 0; i < kvmLhs->mapSize; i++) { char key[10]; snprintf(key, 10, "key%02d", (UA_UInt16) i); const UA_UInt16 *value = (const UA_UInt16*) UA_KeyValueMap_getScalar(kvmLhs, UA_QUALIFIEDNAME(0, key), &UA_TYPES[UA_TYPES_UINT16]); ck_assert_uint_eq(*value, i); } UA_KeyValueMap_delete(kvmLhs); UA_KeyValueMap_delete(kvmRhs); } END_TEST int main(void) { Suite *s = suite_create("Test KeyValueMap Utilities"); TCase *tc = tcase_create("test cases"); tcase_add_test(tc, CheckNullArgs); tcase_add_test(tc, CheckKVMContains); tcase_add_test(tc, CheckKVMCopy); tcase_add_test(tc, CheckKVMCountMergedIntersecting); tcase_add_test(tc, CheckKVMCountMergedComplementary); tcase_add_test(tc, CheckKVMCountMergedCommon); suite_add_tcase(s, tc); SRunner *sr = srunner_create(s); srunner_set_fork_status(sr, CK_NOFORK); srunner_run_all (sr, CK_NORMAL); int number_failed = srunner_ntests_failed(sr); srunner_free(sr); return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; }