it2s-itss-ldm/tests/test_order.c

165 lines
6.9 KiB
C

#include <it2s-asn/etsi-its-v2/cpm/EI2_CollectivePerceptionMessage.h>
#include <order.h>
#include <unity.h>
void setUp(void) {
// set stuff up here
}
void tearDown(void) {
// clean stuff up here
}
void test_ldm_order_new(void) {
EI2_OrderTuple_t *tuple1 = calloc(1, sizeof(*tuple1));
OCTET_STRING_fromBuf(&tuple1->attribute, "referenceTime", -1);
tuple1->orderingDirection = EI2_OrderingDirection_ascending;
EI2_Order_t *asn_order = calloc(1, sizeof(*asn_order));
ASN_SEQUENCE_ADD(&asn_order->list, tuple1);
// asn_fprint(stdout, &asn_DEF_EI2_Order, asn_order);
ldm_order_t *order = ldm_order_new(asn_order, ldm_data_type_CPM);
TEST_ASSERT_MESSAGE(order != NULL, "New order should not return NULL when type is CPM and order is valid");
EI2_CollectivePerceptionMessage_t **cpm_arr = calloc(10, sizeof(*cpm_arr));
for (int i = 0; i < 10; ++i) {
cpm_arr[i] = calloc(1, sizeof(*cpm_arr[i]));
asn_uint642INTEGER(&cpm_arr[i]->payload.managementContainer.referenceTime, 1000 - i);
}
ldm_order_apply(order, (void **)cpm_arr, 10);
for (int i = 0; i < 10; ++i) {
uint64_t ref_time;
asn_INTEGER2uint64(&cpm_arr[i]->payload.managementContainer.referenceTime, &ref_time);
TEST_ASSERT_MESSAGE(ref_time == (uint64_t)(1000 - 9 + i), "Order should sort the array by referenceTime in ascending order");
}
ldm_order_release(order);
// change ordering direction
tuple1->orderingDirection = EI2_OrderingDirection_descending;
order = ldm_order_new(asn_order, ldm_data_type_CPM);
TEST_ASSERT_MESSAGE(order != NULL, "New order should not return NULL when type is CPM and order is valid");
ldm_order_apply(order, (void **)cpm_arr, 10);
for (int i = 0; i < 10; ++i) {
uint64_t ref_time;
asn_INTEGER2uint64(&cpm_arr[i]->payload.managementContainer.referenceTime, &ref_time);
TEST_ASSERT_MESSAGE(ref_time == (uint64_t)(1000 - i), "Order should sort the array by referenceTime in descending order");
}
ldm_order_release(order);
// two tuples in the order (only one is apply due to not having tiebreakers)
EI2_OrderTuple_t *tuple2 = calloc(1, sizeof(*tuple1));
OCTET_STRING_fromBuf(&tuple2->attribute, "referenceTime", -1);
tuple2->orderingDirection = EI2_OrderingDirection_ascending;
ASN_SEQUENCE_ADD(&asn_order->list, tuple2);
order = ldm_order_new(asn_order, ldm_data_type_CPM);
TEST_ASSERT_MESSAGE(order != NULL, "New order should not return NULL when type is CPM and order is valid");
ldm_order_apply(order, (void **)cpm_arr, 10);
for (int i = 0; i < 10; ++i) {
uint64_t ref_time;
asn_INTEGER2uint64(&cpm_arr[i]->payload.managementContainer.referenceTime, &ref_time);
TEST_ASSERT_MESSAGE(ref_time == (uint64_t)(1000 - i), "Order should sort the array by referenceTime in descending order");
ASN_STRUCT_FREE(asn_DEF_EI2_CollectivePerceptionMessage, cpm_arr[i]);
}
ldm_order_release(order);
ASN_STRUCT_FREE(asn_DEF_EI2_Order, asn_order);
free(cpm_arr);
}
void test_ldm_order_multiple(void) {
EI2_OrderTuple_t *tuple1 = calloc(1, sizeof(*tuple1));
OCTET_STRING_fromBuf(&tuple1->attribute, "referenceTime", -1);
tuple1->orderingDirection = EI2_OrderingDirection_ascending;
EI2_OrderTuple_t *tuple2 = calloc(1, sizeof(*tuple2));
OCTET_STRING_fromBuf(&tuple2->attribute, "altitude", -1);
tuple2->orderingDirection = EI2_OrderingDirection_descending;
EI2_OrderTuple_t *tuple3 = calloc(1, sizeof(*tuple3));
OCTET_STRING_fromBuf(&tuple3->attribute, "latitude", -1);
tuple3->orderingDirection = EI2_OrderingDirection_descending;
EI2_Order_t *asn_order = calloc(1, sizeof(*asn_order));
ASN_SEQUENCE_ADD(&asn_order->list, tuple1);
ASN_SEQUENCE_ADD(&asn_order->list, tuple2);
ASN_SEQUENCE_ADD(&asn_order->list, tuple3);
ldm_order_t *order = ldm_order_new(asn_order, ldm_data_type_CPM);
TEST_ASSERT_MESSAGE(order != NULL, "New order should not return NULL when type is CPM and order is valid");
EI2_CollectivePerceptionMessage_t **cpm_arr = calloc(100, sizeof(*cpm_arr));
for (int i = 0; i < 100; ++i) {
cpm_arr[i] = calloc(1, sizeof(*cpm_arr[i]));
asn_uint642INTEGER(&cpm_arr[i]->payload.managementContainer.referenceTime, rand() % 1000000);
cpm_arr[i]->payload.managementContainer.referencePosition.altitude.altitudeValue = rand() % 1000;
cpm_arr[i]->payload.managementContainer.referencePosition.latitude = rand() % 1000000;
}
uint64_t ref_val;
asn_INTEGER2uint64(&cpm_arr[0]->payload.managementContainer.referenceTime, &ref_val);
for (int i = 1; i <= 20; ++i) {
asn_uint642INTEGER(&cpm_arr[i * 3]->payload.managementContainer.referenceTime, ref_val);
}
for (int i = 1; i <= 10; ++i) {
cpm_arr[i * 6]->payload.managementContainer.referencePosition.altitude.altitudeValue =
cpm_arr[0]->payload.managementContainer.referencePosition.altitude.altitudeValue;
}
for (int i = 1; i <= 5; ++i) {
cpm_arr[i * 9]->payload.managementContainer.referencePosition.latitude =
cpm_arr[0]->payload.managementContainer.referencePosition.latitude;
}
ldm_order_apply(order, (void **)cpm_arr, 100);
for (int i = 0; i < 100; ++i) {
uint64_t ref_time;
asn_INTEGER2uint64(&cpm_arr[i]->payload.managementContainer.referenceTime, &ref_time);
int32_t alt = cpm_arr[i]->payload.managementContainer.referencePosition.altitude.altitudeValue;
int32_t lat = cpm_arr[i]->payload.managementContainer.referencePosition.latitude;
if (i > 0) {
uint64_t prev_ref_time;
asn_INTEGER2uint64(&cpm_arr[i - 1]->payload.managementContainer.referenceTime, &prev_ref_time);
TEST_ASSERT_MESSAGE(ref_time >= prev_ref_time, "Order should sort the array by referenceTime in ascending order");
if (ref_time == prev_ref_time) {
TEST_ASSERT_MESSAGE(alt <= cpm_arr[i - 1]->payload.managementContainer.referencePosition.altitude.altitudeValue,
"Order should sort the array by altitude in descending order when referenceTime is equal");
if (alt == cpm_arr[i - 1]->payload.managementContainer.referencePosition.altitude.altitudeValue) {
TEST_ASSERT_MESSAGE(lat <= cpm_arr[i - 1]->payload.managementContainer.referencePosition.latitude,
"Order should sort the array by latitude in descending order when altitude is equal");
}
}
}
}
for (int i = 0; i < 100; ++i) {
ASN_STRUCT_FREE(asn_DEF_EI2_CollectivePerceptionMessage, cpm_arr[i]);
}
ldm_order_release(order);
ASN_STRUCT_FREE(asn_DEF_EI2_Order, asn_order);
free(cpm_arr);
}
int main(void) {
UNITY_BEGIN();
RUN_TEST(test_ldm_order_new);
RUN_TEST(test_ldm_order_multiple);
return UNITY_END();
}