X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/7233106ddd4d22acaefbba0e6167350caaafe65d..39c935d6d5ee86d153f6f7e6a10d723ae7c57f6f:/src/xbt/dict_test.cpp?ds=sidebyside diff --git a/src/xbt/dict_test.cpp b/src/xbt/dict_test.cpp index 5facbd8a55..e06ed0810c 100644 --- a/src/xbt/dict_test.cpp +++ b/src/xbt/dict_test.cpp @@ -1,6 +1,6 @@ /* dict - a generic dictionary, variation over hash table */ -/* Copyright (c) 2004-2019. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2004-2021. The SimGrid Team. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ @@ -8,19 +8,14 @@ #include "xbt/dict.h" #include "simgrid/Exception.hpp" +#include "xbt/random.hpp" #include #include -#include #include "catch.hpp" #define STR(str) ((str) ? (str) : "(null)") -#define REQUIRE_THROWS_XBT_EX(...) \ - REQUIRE_THROWS_MATCHES((__VA_ARGS__), xbt_ex, Catch::Matchers::Predicate( \ - [](xbt_ex const& e) { return e.category == not_found_error; }, \ - "category not_found_error")) - static constexpr int NB_ELM = 20000; static constexpr int SIZEOFKEY = 1024; @@ -30,7 +25,7 @@ static void debugged_add_ext(xbt_dict_t head, const char* key, const char* data_ INFO("Add " << STR(data_to_fill) << " under " << STR(key)); - xbt_dict_set(head, key, data, nullptr); + xbt_dict_set(head, key, data); } static void debugged_add(xbt_dict_t head, const char* key) @@ -54,10 +49,10 @@ static xbt_dict_t new_fixture() return head; } -static void search_ext(xbt_dict_t head, const char* key, const char* data) +static void search_ext(const_xbt_dict_t head, const char* key, const char* data) { INFO("Search " << STR(key)); - char* found = (char*)xbt_dict_get(head, key); + auto* found = static_cast(xbt_dict_get_or_null(head, key)); INFO("Found " << STR(found)); if (data) { REQUIRE(found); // data do not match expectations: found null while searching for data @@ -68,7 +63,7 @@ static void search_ext(xbt_dict_t head, const char* key, const char* data) } } -static void search(xbt_dict_t head, const char* key) +static void search(const_xbt_dict_t head, const char* key) { search_ext(head, key, key); } @@ -76,10 +71,10 @@ static void search(xbt_dict_t head, const char* key) static void debugged_remove(xbt_dict_t head, const char* key) { INFO("Remove '" << STR(key) << "'"); - xbt_dict_remove(head, key); + xbt_dict_remove_ext(head, key, strlen(key)); } -static void traverse(xbt_dict_t head) +static void traverse(const_xbt_dict_t head) { xbt_dict_cursor_t cursor = nullptr; char* key; @@ -92,13 +87,13 @@ static void traverse(xbt_dict_t head) } } -static void search_not_found(xbt_dict_t head, const char* data) +static void search_not_found(const_xbt_dict_t head, const char* data) { INFO("Search " << STR(data) << " (expected not to be found)"); - REQUIRE_THROWS_XBT_EX(data = (const char*)xbt_dict_get(head, data)); + REQUIRE(xbt_dict_get_or_null(head, data) == nullptr); } -static void count(xbt_dict_t dict, int length) +static void count(const_xbt_dict_t dict, int length) { INFO("Count elements (expecting " << length << ")"); REQUIRE(xbt_dict_length(dict) == length); // Announced length differs @@ -113,26 +108,7 @@ static void count(xbt_dict_t dict, int length) REQUIRE(effective == length); // Effective length differs } -static void count_check_get_key(xbt_dict_t dict, int length) -{ - xbt_dict_cursor_t cursor; - char* key; - void* data; - int effective = 0; - - INFO("Count elements (expecting " << length << "), and test the getkey function"); - REQUIRE(xbt_dict_length(dict) == length); // Announced length differs - - xbt_dict_foreach (dict, cursor, key, data) { - effective++; - char* key2 = xbt_dict_get_key(dict, data); - xbt_assert(not strcmp(key, key2), "The data was registered under %s instead of %s as expected", key2, key); - } - - REQUIRE(effective == length); // Effective length differs -} - -static int countelems(xbt_dict_t head) +static int countelems(const_xbt_dict_t head) { xbt_dict_cursor_t cursor; char* key; @@ -147,7 +123,6 @@ static int countelems(xbt_dict_t head) TEST_CASE("xbt::dict: dict data container", "dict") { - SECTION("Basic usage: change, retrieve and traverse homogeneous dicts") { INFO("Traversal the null dictionary"); @@ -156,12 +131,12 @@ TEST_CASE("xbt::dict: dict data container", "dict") INFO("Traversal and search the empty dictionary"); xbt_dict_t head = xbt_dict_new_homogeneous(&free); traverse(head); - REQUIRE_THROWS_XBT_EX(debugged_remove(head, "12346")); + REQUIRE_THROWS_AS(debugged_remove(head, "12346"), std::out_of_range); xbt_dict_free(&head); INFO("Traverse the full dictionary"); head = new_fixture(); - count_check_get_key(head, 7); + count(head, 7); debugged_add_ext(head, "toto", "tutu"); search_ext(head, "toto", "tutu"); @@ -176,29 +151,29 @@ TEST_CASE("xbt::dict: dict data container", "dict") /* CHANGING */ head = new_fixture(); - count_check_get_key(head, 7); + count(head, 7); INFO("Change 123 to 'Changed 123'"); - xbt_dict_set(head, "123", xbt_strdup("Changed 123"), nullptr); - count_check_get_key(head, 7); + xbt_dict_set(head, "123", xbt_strdup("Changed 123")); + count(head, 7); INFO("Change 123 back to '123'"); - xbt_dict_set(head, "123", xbt_strdup("123"), nullptr); - count_check_get_key(head, 7); + xbt_dict_set(head, "123", xbt_strdup("123")); + count(head, 7); INFO("Change 12a to 'Dummy 12a'"); - xbt_dict_set(head, "12a", xbt_strdup("Dummy 12a"), nullptr); - count_check_get_key(head, 7); + xbt_dict_set(head, "12a", xbt_strdup("Dummy 12a")); + count(head, 7); INFO("Change 12a to '12a'"); - xbt_dict_set(head, "12a", xbt_strdup("12a"), nullptr); - count_check_get_key(head, 7); + xbt_dict_set(head, "12a", xbt_strdup("12a")); + count(head, 7); INFO("Traverse the resulting dictionary"); traverse(head); /* RETRIEVE */ INFO("Search 123"); - char* data = (char*)xbt_dict_get(head, "123"); + const char* data = (char*)xbt_dict_get_or_null(head, "123"); REQUIRE((data && strcmp("123", data) == 0)); search_not_found(head, "Can't be found"); @@ -228,7 +203,7 @@ TEST_CASE("xbt::dict: dict data container", "dict") xbt_dict_t head = new_fixture(); count(head, 7); INFO("Remove non existing data"); - REQUIRE_THROWS_XBT_EX(debugged_remove(head, "Does not exist")); + REQUIRE_THROWS_AS(debugged_remove(head, "Does not exist"), std::out_of_range); traverse(head); xbt_dict_free(&head); @@ -247,7 +222,7 @@ TEST_CASE("xbt::dict: dict data container", "dict") debugged_remove(head, "123456"); traverse(head); count(head, 3); - REQUIRE_THROWS_XBT_EX(debugged_remove(head, "12346")); + REQUIRE_THROWS_AS(debugged_remove(head, "12346"), std::out_of_range); traverse(head); debugged_remove(head, "1234"); traverse(head); @@ -255,14 +230,7 @@ TEST_CASE("xbt::dict: dict data container", "dict") traverse(head); debugged_remove(head, "123"); traverse(head); - REQUIRE_THROWS_XBT_EX(debugged_remove(head, "12346")); - traverse(head); - - INFO("Free dict, create new fresh one, and then reset the dict"); - xbt_dict_free(&head); - head = new_fixture(); - xbt_dict_reset(head); - count(head, 0); + REQUIRE_THROWS_AS(debugged_remove(head, "12346"), std::out_of_range); traverse(head); INFO("Free the dictionary twice"); @@ -275,7 +243,7 @@ TEST_CASE("xbt::dict: dict data container", "dict") xbt_dict_t head = new_fixture(); INFO("Store nullptr under 'null'"); - xbt_dict_set(head, "null", nullptr, nullptr); + xbt_dict_set(head, "null", nullptr); search_ext(head, "null", nullptr); INFO("Check whether I see it while traversing..."); @@ -296,29 +264,26 @@ TEST_CASE("xbt::dict: dict data container", "dict") SECTION("Crash test") { - std::random_device rd; - std::default_random_engine rnd_engine(rd()); - for (int i = 0; i < 10; i++) { INFO("CRASH test number " << i + 1 << " (" << 10 - i - 1 << " to go)"); INFO("Fill the struct, count its elems and frees the structure"); INFO("using 1000 elements with " << SIZEOFKEY << " chars long randomized keys."); xbt_dict_t head = xbt_dict_new_homogeneous(free); for (int j = 0; j < 1000; j++) { - char* data = nullptr; - char* key = (char*)xbt_malloc(SIZEOFKEY); + const char* data = nullptr; + auto* key = static_cast(xbt_malloc(SIZEOFKEY)); do { for (int k = 0; k < SIZEOFKEY - 1; k++) { - key[k] = rnd_engine() % ('z' - 'a') + 'a'; + key[k] = simgrid::xbt::random::uniform_int('a', 'z'); } key[SIZEOFKEY - 1] = '\0'; data = (char*)xbt_dict_get_or_null(head, key); } while (data != nullptr); - xbt_dict_set(head, key, key, nullptr); - data = (char*)xbt_dict_get(head, key); - REQUIRE(not strcmp(key, data)); // Retrieved value != Injected value + xbt_dict_set(head, key, key); + data = (char*)xbt_dict_get_or_null(head, key); + REQUIRE((data && not strcmp(key, data))); // Retrieved value != Injected value count(head, j + 1); } @@ -330,24 +295,24 @@ TEST_CASE("xbt::dict: dict data container", "dict") xbt_dict_t head = xbt_dict_new_homogeneous(&free); INFO("Fill " << NB_ELM << " elements, with keys being the number of element"); for (int j = 0; j < NB_ELM; j++) { - char* key = (char*)xbt_malloc(10); + auto* key = static_cast(xbt_malloc(10)); snprintf(key, 10, "%d", j); - xbt_dict_set(head, key, key, nullptr); + xbt_dict_set(head, key, key); } INFO("Count the elements (retrieving the key and data for each)"); INFO("There is " << countelems(head) << " elements"); INFO("Search my " << NB_ELM << " elements 20 times"); - char* key = (char*)xbt_malloc(10); + auto* key = static_cast(xbt_malloc(10)); for (int i = 0; i < 20; i++) { for (int j = 0; j < NB_ELM; j++) { snprintf(key, 10, "%d", j); - void* data = xbt_dict_get(head, key); - REQUIRE(not strcmp(key, (char*)data)); // with get, key != data - data = xbt_dict_get_ext(head, key, strlen(key)); - REQUIRE(not strcmp(key, (char*)data)); // with get_ext, key != data + void* data = xbt_dict_get_or_null(head, key); + REQUIRE((data && not strcmp(key, (char*)data))); // with get, key != data + data = xbt_dict_get_or_null_ext(head, key, strlen(key)); + REQUIRE((data && not strcmp(key, (char*)data))); // with get_ext, key != data } } xbt_free(key); @@ -356,7 +321,7 @@ TEST_CASE("xbt::dict: dict data container", "dict") key = (char*)xbt_malloc(10); for (int j = 0; j < NB_ELM; j++) { snprintf(key, 10, "%d", j); - xbt_dict_remove(head, key); + xbt_dict_remove_ext(head, key, strlen(key)); } xbt_free(key); @@ -365,20 +330,20 @@ TEST_CASE("xbt::dict: dict data container", "dict") xbt_dict_free(&head); } - SECTION("Test dictionnary with int keys") + SECTION("Test dictionary with int keys") { xbt_dict_t dict = xbt_dict_new_homogeneous(nullptr); int count = 500; INFO("Insert elements"); for (int i = 0; i < count; ++i) - xbt_dict_set_ext(dict, (char*)&i, sizeof(i), (void*)(intptr_t)i, nullptr); - REQUIRE(xbt_dict_size(dict) == (unsigned)count); // Bad number of elements in the dictionnary + xbt_dict_set_ext(dict, (char*)&i, sizeof(i), (void*)(intptr_t)i); + REQUIRE(xbt_dict_size(dict) == (unsigned)count); // Bad number of elements in the dictionary INFO("Check elements"); for (int i = 0; i < count; ++i) { - xbt_dict_get_ext(dict, (char*)&i, sizeof(i)); - REQUIRE(xbt_dict_size(dict) == (unsigned)count); // Unexpected value at index i + void* data = xbt_dict_get_or_null_ext(dict, (char*)&i, sizeof(i)); + REQUIRE((intptr_t)data == i); // Unexpected value at index i } INFO("Free the array");