From d55938b34d6b7ee2c2d7da8483aaed5c8b9078a0 Mon Sep 17 00:00:00 2001 From: Johnny Richard Date: Sun, 16 Apr 2023 01:10:35 +0200 Subject: util: Create string_view tool to optimize memory usage We are allocating heap memory to create tokens value, we can minimize the number of allocations if we start using string_view. We have other problems, right now the tokens value ownership are quite unclear once the AST nodes also share the memory allocation done by token_get_next_token function. It's important to clarify we also have memory leaks on the current implementation. Hence, we are going to start using string_view to make the memory management easier. :^) Signed-off-by: Johnny Richard --- test/string_view_test.c | 97 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 test/string_view_test.c (limited to 'test/string_view_test.c') diff --git a/test/string_view_test.c b/test/string_view_test.c new file mode 100644 index 0000000..130ec2c --- /dev/null +++ b/test/string_view_test.c @@ -0,0 +1,97 @@ +/* +* Copyright (C) 2023 Johnny Richard +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +*/ +#define MUNIT_ENABLE_ASSERT_ALIASES +#include "munit.h" +#include "string_view.h" + +static MunitResult +test_create_new(const MunitParameter params[], + void *user_data_or_fixture) +{ + char *str = "hello world"; + string_view_t sv = string_view_new(str, strlen(str)); + + assert_string_equal("hello world", (char *) sv.str); + assert_int(sv.size, ==, strlen(str)); + + return MUNIT_OK; +} + +static MunitResult +test_from_str(const MunitParameter params[], + void *user_data_or_fixture) +{ + char *str = "hello world"; + + string_view_t sv = string_view_from_str(str); + + assert_string_equal(str, (char *) sv.str); + assert_int(sv.size, ==, strlen(str)); + + return MUNIT_OK; +} + +static MunitResult +test_to_str(const MunitParameter params[], + void *user_data_or_fixture) +{ + char *str = "hello world"; + + string_view_t sv = string_view_new(str, 5); + + char actual[sv.size + 1]; + string_view_to_str(&sv, actual); + + assert_string_equal(actual, "hello"); + + return MUNIT_OK; +} + +static MunitResult +test_eq(const MunitParameter params[], + void *user_data_or_fixture) +{ + string_view_t a = string_view_from_str("hello"); + string_view_t b = string_view_from_str("world"); + + assert_false(string_view_eq(a, b)); + + b = string_view_from_str("hello"); + + assert_true(string_view_eq(a, b)); + + return MUNIT_OK; +} + +static MunitTest tests[] = { + { "/test_create_new", test_create_new, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL }, + { "/test_from_str", test_from_str, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL }, + { "/test_to_str", test_to_str, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL }, + { "/test_eq", test_eq, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL }, + { NULL, NULL, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL } +}; + +static const MunitSuite suite = { + "/string_view", tests, NULL, 1, MUNIT_SUITE_OPTION_NONE +}; + +int +main(int argc, char *argv[]) +{ + return munit_suite_main(&suite, NULL, argc, argv); + return EXIT_SUCCESS; +} -- cgit v1.2.3