Serene Runtime 1.0.0-dev
C runtime for the Serene programming language
Loading...
Searching...
No Matches
symbol_tests.h File Reference
#include "base.h"
#include "serene/rt/core.h"
#include "serene/rt/namespaces.h"
#include "serene/rt/protocols.h"
#include "serene/rt/strings.h"
#include "serene/rt/symbols.h"
Include dependency graph for symbol_tests.h:

Go to the source code of this file.

Macros

#define SYMBOL_TESTS(X)

Functions

static void test_symbol_make ()
static void test_symbol_intern ()
static void test_gensym ()
static void test_gensym_freshness ()

Macro Definition Documentation

◆ SYMBOL_TESTS

#define SYMBOL_TESTS ( X)
Value:
X("symbol::make", test_symbol_make), X("symbol::intern_symbol", test_symbol_intern), \
X("symbol::gensym", test_gensym), X("symbol::gensym_freshness", test_gensym_freshness)
static void test_gensym_freshness()
static void test_gensym()
static void test_symbol_intern()
static void test_symbol_make()

Definition at line 28 of file symbol_tests.h.

28#define SYMBOL_TESTS(X) \
29 X("symbol::make", test_symbol_make), X("symbol::intern_symbol", test_symbol_intern), \
30 X("symbol::gensym", test_gensym), X("symbol::gensym_freshness", test_gensym_freshness)

Function Documentation

◆ test_gensym()

void test_gensym ( )
static

Definition at line 77 of file symbol_tests.h.

77 {
78 MAKE_ENGINE(mm, engine);
79 MAKE_CONTEXT(engine, ctx);
80
81 srn_value_t *name = srn_string_make(ctx, &absurd_metadata, "serene.tests");
83
84 srn_value_t *sym1 = srn_symbol_gen(ctx, &absurd_metadata, AS_NS(ns), nullptr);
85 srn_value_t *sym2 = srn_symbol_gen(ctx, &absurd_metadata, AS_NS(ns), nullptr);
86
87 srn_value_t *sym1_name = srn_string_make(ctx, &absurd_metadata, "gensym_101");
88 srn_value_t *sym2_name = srn_string_make(ctx, &absurd_metadata, "gensym_102");
89
90 // gensym should intern the symbol
91 TEST_CHECK(AS_NS(ns)->sym_table.len == 2);
92
93 TEST_CHECK(IS_A(sym1, VSymbol));
94 TEST_CHECK(IS_A(sym2, VSymbol));
95
96 TEST_CHECK(srn_string_eq(AS_SYMBOL(sym1)->name, AS_STRING(sym1_name)));
97 TEST_CHECK(srn_string_eq(AS_SYMBOL(sym2)->name, AS_STRING(sym2_name)));
98
99 RELEASE_CONTEXT(ctx);
100 SHUTDOWN_ENGINE(mm, engine);
101}
#define TEST_CHECK(cond)
Definition acutest.h:95
#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
srn_metadata_t absurd_metadata
We use this for testing. Defined once in core.c.
Definition core.c:26
#define AS_SYMBOL(value_ref)
Definition core.h:177
@ VSymbol
Definition core.h:124
#define AS_STRING(value_ref)
Definition core.h:176
#define AS_NS(value_ref)
Definition core.h:175
#define IS_A(value_ref, field)
Definition core.h:167
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:28
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:51
bool srn_string_eq(const srn_string_t *a, const srn_string_t *b)
Definition strings.c:79
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:80
Here is the call graph for this function:

◆ test_gensym_freshness()

void test_gensym_freshness ( )
static

Definition at line 106 of file symbol_tests.h.

106 {
107 MAKE_ENGINE(mm, engine);
108 MAKE_CONTEXT(engine, ctx);
109
110 srn_value_t *name = srn_string_make(ctx, &absurd_metadata, "serene.tests");
112
113 // Occupy the exact spelling the next generated symbol would take. The
114 // namespace consumed id 100, so the next object id is 101 (the counter
115 // behavior symbol::gensym pins).
116 srn_value_t *taken = srn_string_make(ctx, &absurd_metadata, "gensym_101");
117 srn_value_t *user_sym = srn_symbol_intern(ctx, &absurd_metadata, AS_NS(ns), AS_STRING(taken));
118 TEST_CHECK(IS_A(user_sym, VSymbol));
119
120 srn_value_t *g = srn_symbol_gen(ctx, &absurd_metadata, AS_NS(ns), nullptr);
122
123 // Not the occupant, not its spelling, and interned alongside it.
124 TEST_CHECK(g != user_sym);
125 TEST_CHECK(!srn_string_eq(AS_SYMBOL(g)->name, AS_STRING(taken)));
126 TEST_CHECK(AS_NS(ns)->sym_table.len == 2);
127
128 RELEASE_CONTEXT(ctx);
129 SHUTDOWN_ENGINE(mm, engine);
130}
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:44
Here is the call graph for this function:

◆ test_symbol_intern()

void test_symbol_intern ( )
static

Definition at line 50 of file symbol_tests.h.

50 {
51 MAKE_ENGINE(mm, engine);
52 MAKE_CONTEXT(engine, ctx);
53
54 srn_value_t *name = srn_string_make(ctx, &absurd_metadata, "serene.tests");
55 srn_value_t *symname = srn_string_make(ctx, &absurd_metadata, "foo");
56
59
60 srn_value_t *symbol = srn_symbol_intern(ctx, &absurd_metadata, AS_NS(ns), AS_STRING(symname));
61
62 TEST_CHECK(AS_NS(ns)->sym_table.len == 1);
63 TEST_CHECK(IS_A(symbol, VSymbol));
64 TEST_CHECK(srn_string_eq(AS_SYMBOL(symbol)->name, AS_STRING(symname)));
65
66 srn_value_t *symbol1 = srn_symbol_intern(ctx, &absurd_metadata, AS_NS(ns), AS_STRING(symname));
67 TEST_CHECK(AS_NS(ns)->sym_table.len == 1);
68 TEST_CHECK(IS_A(symbol1, VSymbol));
69 TEST_CHECK(srn_string_eq(AS_SYMBOL(symbol1)->name, AS_STRING(symname)));
70 srn_value_t *check = srn_value_eq(ctx, symbol, symbol1);
71 TEST_CHECK(IS_TRUE(check));
72
73 RELEASE_CONTEXT(ctx);
74 SHUTDOWN_ENGINE(mm, engine);
75}
@ VNamespace
Definition core.h:122
#define IS_TRUE(value_ref)
Definition core.h:168
srn_value_t * srn_value_eq(const 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_tag_t type
Definition core.h:132
Here is the call graph for this function:

◆ test_symbol_make()

void test_symbol_make ( )
static

Definition at line 32 of file symbol_tests.h.

32 {
33 MAKE_ENGINE(mm, engine);
34 MAKE_CONTEXT(engine, ctx);
35
36 srn_value_t *name = srn_string_make(ctx, &absurd_metadata, "serene.tests");
38 srn_value_t *symbol_name = srn_string_make(ctx, &absurd_metadata, "foo");
39 srn_value_t *sym = srn_symbol_make(ctx, &absurd_metadata, AS_NS(ns), AS_STRING(symbol_name));
40
41 TEST_CHECK(IS_A(sym, VSymbol));
42 TEST_CHECK(AS_SYMBOL(sym)->ns == AS_NS(ns));
43
44 TEST_CHECK(srn_string_eq(AS_SYMBOL(sym)->name, AS_STRING(symbol_name)));
45
46 RELEASE_CONTEXT(ctx);
47 SHUTDOWN_ENGINE(mm, engine);
48}
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
Here is the call graph for this function: