/* * Copyright (C) 2023 Carlos Maniero * * 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 "lexer.h" #include "munit.h" void make_lexer_from_static_src(lexer_t *lexer, char *src, int srclen) { lexer->srclen = 0; lexer->cur = 0; lexer->row = 0; lexer->bol = 0; lexer->src = src; lexer->srclen = srclen; } void assert_token_at(char *source, int token_index, token_kind_t expected_kind, char *expected) { lexer_t lexer; token_t token; make_lexer_from_static_src(&lexer, source, strlen(source)); while (token_index > 0) { lexer_next_token(&lexer, &token); token_index--; } lexer_next_token(&lexer, &token); char actual[token.value.size + 1]; string_view_to_str(&token.value, actual); assert_string_equal(token_kind_to_str(expected_kind), token_kind_to_str(token.kind)); assert_int(expected_kind, ==, token.kind); assert_string_equal(expected, actual); } static MunitResult test_tokenize_number(const MunitParameter params[], void *user_data_or_fixture) { assert_token_at("1", 0, TOKEN_NUMBER, "1"); assert_token_at(" 13 ", 0, TOKEN_NUMBER, "13"); assert_token_at(" \n 13 ", 0, TOKEN_NUMBER, "13"); return MUNIT_OK; } static MunitResult test_tokenize_op(const MunitParameter params[], void *user_data_or_fixture) { assert_token_at(" + 2", 0, TOKEN_PLUS, "+"); assert_token_at(" - \n", 0, TOKEN_MINUS, "-"); assert_token_at(" * ;", 0, TOKEN_STAR, "*"); assert_token_at(" / ", 0, TOKEN_SLASH, "/"); assert_token_at(" = ", 0, TOKEN_EQUAL, "="); assert_token_at("1 * 2", 0, TOKEN_NUMBER, "1"); assert_token_at("1 * 2", 1, TOKEN_STAR, "*"); assert_token_at("1 * 2", 2, TOKEN_NUMBER, "2"); return MUNIT_OK; } static MunitResult test_tokenize_unknown(const MunitParameter params[], void *user_data_or_fixture) { assert_token_at(" @ ", 0, TOKEN_UNKNOWN, "@"); assert_token_at(" $ ", 0, TOKEN_UNKNOWN, "$"); return MUNIT_OK; } static MunitTest tests[] = { { "/test_tokenize_digit", test_tokenize_number, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL }, { "/test_tokenize_op", test_tokenize_op, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL }, { "/test_tokenize_unknown", test_tokenize_unknown, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL }, { NULL, NULL, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL } }; static const MunitSuite suite = { "/lexer_test", tests, NULL, 1, MUNIT_SUITE_OPTION_NONE }; int main(int argc, char *argv[]) { return munit_suite_main(&suite, NULL, argc, argv); return EXIT_SUCCESS; }