Serene Runtime 1.0.0
C runtime for the Serene programming language
Loading...
Searching...
No Matches
symbol_tests.h
Go to the documentation of this file.
1/* -*- C -*-
2 * Serene programming language
3 * Copyright (C) 2019-2026 Sameer Rahmani <[email protected]>
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <https://www.gnu.org/licenses/>.
17 */
18
19#pragma once
20
21#include "base.h"
22#include "serene/rt/core.h"
24#include "serene/rt/protocols.h"
25#include "serene/rt/strings.h"
26#include "serene/rt/symbols.h"
27
28#define SYMBOL_TESTS(X) \
29 X("symbol::make", test_symbol_make), \
30 X("symbol::intern_symbol", test_symbol_intern), \
31 X("symbol::gensym", test_gensym)
32
33static void test_symbol_make() {
34 MAKE_ENGINE(mm, engine);
35 MAKE_CONTEXT(engine, ctx);
36
37 srn_value_t *name = srn_string_make(ctx, &absurd_metadata, "serene.tests");
39 srn_value_t *symbol_name = srn_string_make(ctx, &absurd_metadata, "foo");
40 srn_value_t *sym =
41 srn_symbol_make(ctx, &absurd_metadata, AS_NS(ns), AS_STRING(symbol_name));
42
43 TEST_CHECK(IS_A(sym, VSymbol));
44 TEST_CHECK(AS_SYMBOL(sym)->ns == AS_NS(ns));
45
46 TEST_CHECK(srn_string_eq(AS_SYMBOL(sym)->name, AS_STRING(symbol_name)));
47
48 RELEASE_CONTEXT(ctx);
49 SHUTDOWN_ENGINE(mm, engine);
50}
51
52static void test_symbol_intern() {
53 MAKE_ENGINE(mm, engine);
54 MAKE_CONTEXT(engine, ctx);
55
56 srn_value_t *name = srn_string_make(ctx, &absurd_metadata, "serene.tests");
57 srn_value_t *symname = srn_string_make(ctx, &absurd_metadata, "foo");
58
61
62 srn_value_t *symbol =
64
65 TEST_CHECK(AS_NS(ns)->sym_table.len == 1);
66 TEST_CHECK(IS_A(symbol, VSymbol));
67 TEST_CHECK(srn_string_eq(AS_SYMBOL(symbol)->name, AS_STRING(symname)));
68
69 srn_value_t *symbol1 =
71 TEST_CHECK(AS_NS(ns)->sym_table.len == 1);
72 TEST_CHECK(IS_A(symbol1, VSymbol));
73 TEST_CHECK(srn_string_eq(AS_SYMBOL(symbol1)->name, AS_STRING(symname)));
74 srn_value_t *check = srn_value_eq(ctx, symbol, symbol1);
75 TEST_CHECK(IS_TRUE(check));
76
77 RELEASE_CONTEXT(ctx);
78 SHUTDOWN_ENGINE(mm, engine);
79}
80
81static void test_gensym() {
82 MAKE_ENGINE(mm, engine);
83 MAKE_CONTEXT(engine, ctx);
84
85 srn_value_t *name = srn_string_make(ctx, &absurd_metadata, "serene.tests");
87
88 srn_value_t *sym1 = srn_symbol_gen(ctx, &absurd_metadata, AS_NS(ns), nullptr);
89 srn_value_t *sym2 = srn_symbol_gen(ctx, &absurd_metadata, AS_NS(ns), nullptr);
90
91 srn_value_t *sym1_name = srn_string_make(ctx, &absurd_metadata, "gensym_101");
92 srn_value_t *sym2_name = srn_string_make(ctx, &absurd_metadata, "gensym_102");
93
94 // gensym should intern the symbol
95 TEST_CHECK(AS_NS(ns)->sym_table.len == 2);
96
97 TEST_CHECK(IS_A(sym1, VSymbol));
98 TEST_CHECK(IS_A(sym2, VSymbol));
99
100 TEST_CHECK(srn_string_eq(AS_SYMBOL(sym1)->name, AS_STRING(sym1_name)));
101 TEST_CHECK(srn_string_eq(AS_SYMBOL(sym2)->name, AS_STRING(sym2_name)));
102
103 RELEASE_CONTEXT(ctx);
104 SHUTDOWN_ENGINE(mm, engine);
105}
#define TEST_CHECK(cond)
Definition acutest.h:96
#define RELEASE_CONTEXT(x)
Definition base.h:46
#define SHUTDOWN_ENGINE(mm, engine)
Definition base.h:38
#define MAKE_ENGINE(mm, engine)
Definition base.h:32
#define MAKE_CONTEXT(engine, x)
Definition base.h:42
static srn_metadata_t absurd_metadata
We use this for testing.
Definition core.h:66
#define AS_SYMBOL(value_ref)
Definition core.h:172
@ VNamespace
Definition core.h:122
@ VSymbol
Definition core.h:124
#define AS_STRING(value_ref)
Definition core.h:171
#define AS_NS(value_ref)
Definition core.h:170
#define IS_A(value_ref, field)
Definition core.h:162
#define IS_TRUE(value_ref)
Definition core.h:163
srn_value_t * srn_namespace_make(srn_context_t *ctx, srn_metadata_t *metadata, srn_string_t *name)
Creates a new namespace in the give context.
Definition namespaces.c:27
srn_value_t * srn_value_eq(srn_context_t *ctx, const srn_value_t *a, const srn_value_t *b)
Check to values for equality. Return a boolean.
Definition protocols.c:38
srn_value_t * srn_string_make(srn_context_t *ctx, srn_metadata_t *metadata, const char *src)
Create a string from a null terminated C string.
Definition strings.c:50
bool srn_string_eq(const srn_string_t *a, const srn_string_t *b)
Definition strings.c:76
srn_value_tag_t type
Definition core.h:132
static void test_gensym()
static void test_symbol_intern()
static void test_symbol_make()
srn_value_t * srn_symbol_make(srn_context_t *ctx, srn_metadata_t *metadata, srn_namespace_t *ns, srn_string_t *name)
Create a new symbol. IT DOES NOT INTERNALIZE THE SYMBOL.
Definition symbols.c:29
srn_value_t * srn_symbol_intern(srn_context_t *ctx, srn_metadata_t *metadata, srn_namespace_t *ns, srn_string_t *symbol_name)
Definition symbols.c:43
srn_value_t * srn_symbol_gen(srn_context_t *ctx, srn_metadata_t *metadata, srn_namespace_t *ns, srn_string_t *optional_name)
Definition symbols.c:72