Implement mostly correct parsing
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
#include <stdlib.h>
|
||||
#include <unity.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "nihilispm.h"
|
||||
#include "nihilispm_internal.h"
|
||||
@@ -15,21 +16,7 @@ void tearDown(void) {
|
||||
nl_object_delete(response);
|
||||
}
|
||||
|
||||
/* void test_parse_null() { */
|
||||
/* result = nl_parse("()"); */
|
||||
/* TEST_ASSERT_EQUAL(result->result, 0); */
|
||||
/* TEST_ASSERT_NOT_NULL(result->statement); */
|
||||
/* TEST_ASSERT_NULL(result->statement->car); */
|
||||
/* TEST_ASSERT_NULL(result->statement->cdr); */
|
||||
/* } */
|
||||
|
||||
/* void test_parse_error() { */
|
||||
/* result = nl_parse("("); */
|
||||
/* TEST_ASSERT_EQUAL(result->result, 0); */
|
||||
/* TEST_ASSERT_NULL(result->statement); */
|
||||
/* } */
|
||||
|
||||
void test_token_next_empty_str() {
|
||||
static void test_token_next_empty_str(void) {
|
||||
const char *input = "";
|
||||
const char *curr = input;
|
||||
|
||||
@@ -39,7 +26,7 @@ void test_token_next_empty_str() {
|
||||
TEST_ASSERT_EQUAL('\0', *curr);
|
||||
}
|
||||
|
||||
void test_token_next_only_whitespace() {
|
||||
static void test_token_next_only_whitespace(void) {
|
||||
const char *input = " \n";
|
||||
const char *curr = input;
|
||||
|
||||
@@ -49,7 +36,7 @@ void test_token_next_only_whitespace() {
|
||||
TEST_ASSERT_EQUAL('\0', *curr);
|
||||
}
|
||||
|
||||
void test_token_next_lparen() {
|
||||
static void test_token_next_lparen(void) {
|
||||
const char *input = "(";
|
||||
const char *curr = input;
|
||||
|
||||
@@ -62,7 +49,7 @@ void test_token_next_lparen() {
|
||||
TEST_ASSERT_EQUAL('\0', *curr);
|
||||
}
|
||||
|
||||
void test_token_next_rparen() {
|
||||
static void test_token_next_rparen(void) {
|
||||
const char *input = ")";
|
||||
const char *curr = input;
|
||||
|
||||
@@ -75,7 +62,7 @@ void test_token_next_rparen() {
|
||||
TEST_ASSERT_EQUAL('\0', *curr);
|
||||
}
|
||||
|
||||
void test_token_next_lrparen() {
|
||||
static void test_token_next_lrparen(void) {
|
||||
const char *input = "()";
|
||||
const char *curr = input;
|
||||
|
||||
@@ -97,7 +84,7 @@ void test_token_next_lrparen() {
|
||||
TEST_ASSERT_EQUAL('\0', *curr);
|
||||
}
|
||||
|
||||
void test_token_next_string() {
|
||||
static void test_token_next_string(void) {
|
||||
const char *input = "\"foo\"";
|
||||
const char *curr = input;
|
||||
|
||||
@@ -110,7 +97,7 @@ void test_token_next_string() {
|
||||
TEST_ASSERT_EQUAL('\0', *curr);
|
||||
}
|
||||
|
||||
void test_token_next_string_w_whitespace() {
|
||||
static void test_token_next_string_w_whitespace(void) {
|
||||
const char *input = " \"foo\" ";
|
||||
const char *curr = input;
|
||||
|
||||
@@ -123,7 +110,7 @@ void test_token_next_string_w_whitespace() {
|
||||
TEST_ASSERT_EQUAL_STRING(" ", curr);
|
||||
}
|
||||
|
||||
void test_token_next_symbol() {
|
||||
static void test_token_next_symbol(void) {
|
||||
const char *input = "foo";
|
||||
const char *curr = input;
|
||||
|
||||
@@ -136,7 +123,7 @@ void test_token_next_symbol() {
|
||||
TEST_ASSERT_EQUAL_STRING("", curr);
|
||||
}
|
||||
|
||||
void test_token_next_symbol_w_whitespace() {
|
||||
static void test_token_next_symbol_w_whitespace(void) {
|
||||
const char *input = " foo ";
|
||||
const char *curr = input;
|
||||
|
||||
@@ -149,13 +136,13 @@ void test_token_next_symbol_w_whitespace() {
|
||||
TEST_ASSERT_EQUAL_STRING(" ", curr);
|
||||
}
|
||||
|
||||
void test_tokenize_empty_str() {
|
||||
static void test_tokenize_empty_str(void) {
|
||||
response = nl_tokenize("");
|
||||
|
||||
TEST_ASSERT_NULL(response);
|
||||
}
|
||||
|
||||
void test_tokenize_nil() {
|
||||
static void test_tokenize_nil(void) {
|
||||
response = nl_tokenize("()");
|
||||
|
||||
TEST_ASSERT_NOT_NULL(response);
|
||||
@@ -175,7 +162,7 @@ void test_tokenize_nil() {
|
||||
TEST_ASSERT_NULL(token2->cell.cdr);
|
||||
}
|
||||
|
||||
void test_tokenize_statement() {
|
||||
static void test_tokenize_statement(void) {
|
||||
response = nl_tokenize("(foo)");
|
||||
|
||||
TEST_ASSERT_NOT_NULL(response);
|
||||
@@ -200,21 +187,28 @@ void test_tokenize_statement() {
|
||||
TEST_ASSERT_EQUAL_STRING(")", token3->cell.car->string);
|
||||
}
|
||||
|
||||
void test_parse_empty_str() {
|
||||
response = nl_parse("");
|
||||
static void test_parse_atom_symbol(void) {
|
||||
response = nl_parse_token_atom(nl_symbol_create(strdup("foo")));
|
||||
|
||||
TEST_ASSERT_EQUAL(response->type, NL_TYPE_SYMBOL);
|
||||
TEST_ASSERT_EQUAL_STRING(response->symbol, "foo");
|
||||
}
|
||||
|
||||
static void test_parse_atom_lparen(void) {
|
||||
response = nl_parse_token_atom(nl_symbol_create(strdup("(")));
|
||||
|
||||
TEST_ASSERT_NULL(response);
|
||||
}
|
||||
|
||||
void test_parse_symbol() {
|
||||
response = nl_parse("foo");
|
||||
static void test_parse_atom_rparen(void) {
|
||||
response = nl_parse_token_atom(nl_symbol_create(strdup(")")));
|
||||
|
||||
TEST_ASSERT_NOT_NULL(response);
|
||||
TEST_ASSERT_EQUAL(NL_TYPE_SYMBOL, response->type);
|
||||
TEST_ASSERT_EQUAL_STRING(NL_TYPE_SYMBOL, "foo");
|
||||
TEST_ASSERT_NULL(response);
|
||||
}
|
||||
|
||||
void test_parse_nil() {
|
||||
response = nl_parse("()");
|
||||
|
||||
static void test_parse_empty_str(void) {
|
||||
response = nl_parse("");
|
||||
|
||||
TEST_ASSERT_NOT_NULL(response);
|
||||
TEST_ASSERT_EQUAL(NL_TYPE_CELL, response->type);
|
||||
@@ -222,26 +216,118 @@ void test_parse_nil() {
|
||||
TEST_ASSERT_NULL(response->cell.cdr);
|
||||
}
|
||||
|
||||
void test_parse_list_1elem() {
|
||||
static void test_parse_symbol(void) {
|
||||
response = nl_parse("foo");
|
||||
|
||||
TEST_ASSERT_NOT_NULL(response);
|
||||
TEST_ASSERT_EQUAL(NL_TYPE_CELL, response->type);
|
||||
|
||||
TEST_ASSERT_NOT_NULL(response->cell.car);
|
||||
TEST_ASSERT_EQUAL(response->cell.car->type, NL_TYPE_SYMBOL);
|
||||
TEST_ASSERT_EQUAL_STRING(response->cell.car->symbol, "foo");
|
||||
}
|
||||
|
||||
static void test_parse_nil(void) {
|
||||
response = nl_parse("()");
|
||||
|
||||
TEST_ASSERT_NOT_NULL(response);
|
||||
TEST_ASSERT_EQUAL(NL_TYPE_CELL, response->type);
|
||||
TEST_ASSERT_NOT_NULL(response->cell.car);
|
||||
TEST_ASSERT_NULL(response->cell.cdr);
|
||||
|
||||
TEST_ASSERT_EQUAL(NL_TYPE_CELL, response->cell.car->type);
|
||||
TEST_ASSERT_NULL(response->cell.car->cell.car);
|
||||
TEST_ASSERT_NULL(response->cell.car->cell.cdr);
|
||||
}
|
||||
|
||||
static void test_parse_list_1elem(void) {
|
||||
response = nl_parse("(foo)");
|
||||
|
||||
TEST_ASSERT_NOT_NULL(response);
|
||||
TEST_ASSERT_EQUAL(NL_TYPE_CELL, response->type);
|
||||
|
||||
TEST_ASSERT_NOT_NULL(response->cell.car);
|
||||
TEST_ASSERT_EQUAL(NL_TYPE_SYMBOL, response->cell.car->type);
|
||||
TEST_ASSERT_EQUAL_STRING("foo", response->cell.car->symbol);
|
||||
TEST_ASSERT_NULL(response->cell.cdr);
|
||||
|
||||
TEST_ASSERT_EQUAL(NL_TYPE_CELL, response->cell.car->type);
|
||||
TEST_ASSERT_NULL(response->cell.car->cell.cdr);
|
||||
|
||||
TEST_ASSERT_EQUAL(NL_TYPE_SYMBOL, response->cell.car->cell.car->type);
|
||||
TEST_ASSERT_EQUAL_STRING("foo", response->cell.car->cell.car->symbol);
|
||||
}
|
||||
|
||||
void test_parse_list_2elem() {
|
||||
static void test_parse_list_2elem(void) {
|
||||
response = nl_parse("(foo bar)");
|
||||
|
||||
TEST_ASSERT_NOT_NULL(response);
|
||||
TEST_ASSERT_EQUAL(NL_TYPE_CELL, response->type);
|
||||
|
||||
TEST_ASSERT_NOT_NULL(response->cell.car);
|
||||
TEST_ASSERT_NULL(response->cell.cdr);
|
||||
|
||||
TEST_ASSERT_EQUAL(NL_TYPE_CELL, response->cell.car->type);
|
||||
TEST_ASSERT_NOT_NULL(response->cell.car->cell.cdr);
|
||||
|
||||
TEST_ASSERT_EQUAL(NL_TYPE_SYMBOL, response->cell.car->cell.car->type);
|
||||
TEST_ASSERT_EQUAL_STRING("foo", response->cell.car->cell.car->symbol);
|
||||
|
||||
TEST_ASSERT_EQUAL(NL_TYPE_CELL, response->cell.car->cell.cdr->type);
|
||||
TEST_ASSERT_EQUAL(NL_TYPE_SYMBOL, response->cell.car->cell.cdr->cell.car->type);
|
||||
TEST_ASSERT_EQUAL_STRING("bar", response->cell.car->cell.cdr->cell.car->string);
|
||||
|
||||
}
|
||||
|
||||
static void test_parse_2elem(void) {
|
||||
response = nl_parse("foo bar");
|
||||
|
||||
TEST_ASSERT_NOT_NULL(response);
|
||||
TEST_ASSERT_EQUAL(NL_TYPE_CELL, response->type);
|
||||
|
||||
TEST_ASSERT_NOT_NULL(response->cell.car);
|
||||
TEST_ASSERT_EQUAL(NL_TYPE_SYMBOL, response->cell.car->type);
|
||||
TEST_ASSERT_EQUAL_STRING("foo", response->cell.car->symbol);
|
||||
|
||||
TEST_ASSERT_NOT_NULL(response->cell.cdr);
|
||||
TEST_ASSERT_EQUAL(NL_TYPE_CELL, response->cell.cdr->type);
|
||||
|
||||
TEST_ASSERT_EQUAL(NL_TYPE_SYMBOL, response->cell.cdr->cell.car->type);
|
||||
TEST_ASSERT_EQUAL_STRING("bar", response->cell.cdr->cell.car->symbol);
|
||||
}
|
||||
|
||||
static void test_parse_2elem_str(void) {
|
||||
response = nl_parse("\"foo\" \"bar\"");
|
||||
|
||||
TEST_ASSERT_NOT_NULL(response);
|
||||
TEST_ASSERT_EQUAL(NL_TYPE_CELL, response->type);
|
||||
|
||||
TEST_ASSERT_NOT_NULL(response->cell.car);
|
||||
TEST_ASSERT_EQUAL(NL_TYPE_STRING, response->cell.car->type);
|
||||
TEST_ASSERT_EQUAL_STRING("foo", response->cell.car->string);
|
||||
|
||||
TEST_ASSERT_NOT_NULL(response->cell.cdr);
|
||||
TEST_ASSERT_EQUAL(NL_TYPE_CELL, response->cell.cdr->type);
|
||||
|
||||
TEST_ASSERT_EQUAL(NL_TYPE_STRING, response->cell.cdr->cell.car->type);
|
||||
TEST_ASSERT_EQUAL_STRING("bar", response->cell.cdr->cell.car->string);
|
||||
}
|
||||
|
||||
static void test_parse_nested(void) {
|
||||
response = nl_parse("((foo))");
|
||||
|
||||
TEST_ASSERT_NOT_NULL(response);
|
||||
TEST_ASSERT_EQUAL(NL_TYPE_CELL, response->type);
|
||||
|
||||
TEST_ASSERT_NOT_NULL(response->cell.car);
|
||||
TEST_ASSERT_NULL(response->cell.cdr);
|
||||
|
||||
TEST_ASSERT_EQUAL(NL_TYPE_CELL, response->cell.car->type);
|
||||
TEST_ASSERT_NULL(response->cell.car->cell.cdr);
|
||||
|
||||
TEST_ASSERT_EQUAL(NL_TYPE_CELL, response->cell.car->cell.car->type);
|
||||
TEST_ASSERT_NULL(response->cell.car->cell.car->cell.cdr);
|
||||
|
||||
TEST_ASSERT_EQUAL(NL_TYPE_SYMBOL, response->cell.car->cell.car->cell.car->type);
|
||||
TEST_ASSERT_EQUAL_STRING("foo", response->cell.car->cell.car->cell.car->symbol);
|
||||
}
|
||||
|
||||
|
||||
@@ -259,5 +345,16 @@ int main(void) {
|
||||
RUN_TEST(test_tokenize_empty_str);
|
||||
RUN_TEST(test_tokenize_nil);
|
||||
RUN_TEST(test_tokenize_statement);
|
||||
RUN_TEST(test_parse_atom_symbol);
|
||||
RUN_TEST(test_parse_atom_lparen);
|
||||
RUN_TEST(test_parse_atom_rparen);
|
||||
RUN_TEST(test_parse_empty_str);
|
||||
RUN_TEST(test_parse_symbol);
|
||||
RUN_TEST(test_parse_nil);
|
||||
RUN_TEST(test_parse_list_1elem);
|
||||
RUN_TEST(test_parse_list_2elem);
|
||||
RUN_TEST(test_parse_2elem);
|
||||
RUN_TEST(test_parse_2elem_str);
|
||||
RUN_TEST(test_parse_nested);
|
||||
return UNITY_END();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user