|
@@ -0,0 +1,103 @@
|
|
|
+#include "ua_types.h"
|
|
|
+#include "ua_types_generated_handling.h"
|
|
|
+#include "ua_util.h"
|
|
|
+#include "check.h"
|
|
|
+
|
|
|
+/* copied definition */
|
|
|
+UA_StatusCode parse_numericrange(const UA_String *str, UA_NumericRange *range);
|
|
|
+
|
|
|
+START_TEST(parseRange) {
|
|
|
+ UA_NumericRange range;
|
|
|
+ UA_String str = UA_STRING("1:2,0:3,5");
|
|
|
+ UA_StatusCode retval = parse_numericrange(&str, &range);
|
|
|
+ ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
|
|
|
+ ck_assert_int_eq(range.dimensionsSize,3);
|
|
|
+ ck_assert_int_eq(range.dimensions[0].min,1);
|
|
|
+ ck_assert_int_eq(range.dimensions[0].max,2);
|
|
|
+ ck_assert_int_eq(range.dimensions[1].min,0);
|
|
|
+ ck_assert_int_eq(range.dimensions[1].max,3);
|
|
|
+ ck_assert_int_eq(range.dimensions[2].min,5);
|
|
|
+ ck_assert_int_eq(range.dimensions[2].max,5);
|
|
|
+ UA_free(range.dimensions);
|
|
|
+} END_TEST
|
|
|
+
|
|
|
+START_TEST(parseRangeMinEqualMax) {
|
|
|
+ UA_NumericRange range;
|
|
|
+ UA_String str = UA_STRING("1:2,1:1");
|
|
|
+ UA_StatusCode retval = parse_numericrange(&str, &range);
|
|
|
+ ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
|
|
|
+ ck_assert_int_eq(range.dimensionsSize,2);
|
|
|
+ ck_assert_int_eq(range.dimensions[0].min,1);
|
|
|
+ ck_assert_int_eq(range.dimensions[0].max,2);
|
|
|
+ ck_assert_int_eq(range.dimensions[1].min,1);
|
|
|
+ ck_assert_int_eq(range.dimensions[1].max,1);
|
|
|
+ UA_free(range.dimensions);
|
|
|
+} END_TEST
|
|
|
+
|
|
|
+START_TEST(copySimpleArrayRange) {
|
|
|
+ UA_Variant v, v2;
|
|
|
+ UA_Variant_init(&v);
|
|
|
+ UA_Variant_init(&v2);
|
|
|
+ UA_UInt32 arr[5] = {1,2,3,4,5};
|
|
|
+ UA_Variant_setArray(&v, arr, 5, &UA_TYPES[UA_TYPES_UINT32]);
|
|
|
+
|
|
|
+ UA_NumericRange r;
|
|
|
+ UA_String sr = UA_STRING("1:3");
|
|
|
+ UA_StatusCode retval = parse_numericrange(&sr, &r);
|
|
|
+ ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
|
|
|
+
|
|
|
+ retval = UA_Variant_copyRange(&v, &v2, r);
|
|
|
+ ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
|
|
|
+ ck_assert_int_eq(3, v2.arrayLength);
|
|
|
+ ck_assert_int_eq(2, *(UA_UInt32*)v2.data);
|
|
|
+
|
|
|
+ UA_Variant_deleteMembers(&v2);
|
|
|
+ UA_free(r.dimensions);
|
|
|
+}
|
|
|
+END_TEST
|
|
|
+
|
|
|
+START_TEST(copyIntoStringArrayRange) {
|
|
|
+ UA_Variant v, v2;
|
|
|
+ UA_Variant_init(&v);
|
|
|
+ UA_Variant_init(&v2);
|
|
|
+ UA_String arr[2];
|
|
|
+ arr[0] = UA_STRING("abcd");
|
|
|
+ arr[1] = UA_STRING("wxyz");
|
|
|
+ UA_Variant_setArray(&v, arr, 5, &UA_TYPES[UA_TYPES_STRING]);
|
|
|
+
|
|
|
+ UA_NumericRange r;
|
|
|
+ UA_String sr = UA_STRING("0:1,1:2");
|
|
|
+ UA_StatusCode retval = parse_numericrange(&sr, &r);
|
|
|
+ ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
|
|
|
+
|
|
|
+ retval = UA_Variant_copyRange(&v, &v2, r);
|
|
|
+ ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
|
|
|
+ ck_assert_int_eq(2, v2.arrayLength);
|
|
|
+
|
|
|
+ UA_String s1 = UA_STRING("bc");
|
|
|
+ UA_String s2 = UA_STRING("xy");
|
|
|
+ UA_String *arr2 = v2.data;
|
|
|
+ ck_assert(UA_String_equal(&arr2[0], &s1));
|
|
|
+ ck_assert(UA_String_equal(&arr2[1], &s2));
|
|
|
+
|
|
|
+ UA_Variant_deleteMembers(&v2);
|
|
|
+ UA_free(r.dimensions);
|
|
|
+}
|
|
|
+END_TEST
|
|
|
+
|
|
|
+int main(void) {
|
|
|
+ Suite *s = suite_create("Test Variant Range Access");
|
|
|
+ TCase *tc = tcase_create("test cases");
|
|
|
+ tcase_add_test(tc, parseRange);
|
|
|
+ tcase_add_test(tc, parseRangeMinEqualMax);
|
|
|
+ tcase_add_test(tc, copySimpleArrayRange);
|
|
|
+ tcase_add_test(tc, copyIntoStringArrayRange);
|
|
|
+ suite_add_tcase(s, tc);
|
|
|
+
|
|
|
+ SRunner *sr = srunner_create(s);
|
|
|
+ srunner_run_all (sr, CK_NORMAL);
|
|
|
+ int number_failed = srunner_ntests_failed(sr);
|
|
|
+ srunner_free(sr);
|
|
|
+
|
|
|
+ return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
|
|
|
+}
|