#include "env.h" #include "prim.h" #include "unity.h" static am_t am; void setUp(void) { am_init(&am); } void tearDown(void) { } static void test_add_empty_list_is_0(void) { am.regs[EXPR] = expr_str_symbol(&am, "+"); env_fetch(&am); TEST_ASSERT_NOT_NULL(am.regs[VAL]); TEST_ASSERT_TRUE(am.regs[VAL]->is_atom); TEST_ASSERT_EQUAL(ATOM_TYPE_PRIM_PROC, am.regs[VAL]->atom.type); am.regs[ARGL] = expr_empty_list(&am); am.regs[VAL]->atom.prim_proc(&am); TEST_ASSERT_NOT_NULL(am.regs[VAL]); TEST_ASSERT_TRUE(am.regs[VAL]->is_atom); TEST_ASSERT_EQUAL(ATOM_TYPE_INTEGER, am.regs[VAL]->atom.type); TEST_ASSERT_EQUAL(0, am.regs[VAL]->atom.integer); } static void test_add_1_2_3_is_6(void) { am.regs[EXPR] = expr_str_symbol(&am, "+"); env_fetch(&am); TEST_ASSERT_NOT_NULL(am.regs[VAL]); TEST_ASSERT_TRUE(am.regs[VAL]->is_atom); TEST_ASSERT_EQUAL(ATOM_TYPE_PRIM_PROC, am.regs[VAL]->atom.type); am.regs[ARGL] = expr_pair( &am, expr_integer(&am, 1), expr_pair( &am, expr_integer(&am, 2), expr_pair(&am, expr_integer(&am, 3), expr_empty_list(&am)))); am.regs[VAL]->atom.prim_proc(&am); TEST_ASSERT_NOT_NULL(am.regs[VAL]); TEST_ASSERT_TRUE(am.regs[VAL]->is_atom); TEST_ASSERT_EQUAL(ATOM_TYPE_INTEGER, am.regs[VAL]->atom.type); TEST_ASSERT_EQUAL(6, am.regs[VAL]->atom.integer); } static void test_mul_empty_list_is_1(void) { am.regs[EXPR] = expr_str_symbol(&am, "*"); env_fetch(&am); TEST_ASSERT_NOT_NULL(am.regs[VAL]); TEST_ASSERT_TRUE(am.regs[VAL]->is_atom); TEST_ASSERT_EQUAL(ATOM_TYPE_PRIM_PROC, am.regs[VAL]->atom.type); am.regs[ARGL] = expr_empty_list(&am); am.regs[VAL]->atom.prim_proc(&am); TEST_ASSERT_NOT_NULL(am.regs[VAL]); TEST_ASSERT_TRUE(am.regs[VAL]->is_atom); TEST_ASSERT_EQUAL(ATOM_TYPE_INTEGER, am.regs[VAL]->atom.type); TEST_ASSERT_EQUAL(1, am.regs[VAL]->atom.integer); } static void test_mul_2_3_4_is_24(void) { am.regs[EXPR] = expr_str_symbol(&am, "*"); env_fetch(&am); TEST_ASSERT_NOT_NULL(am.regs[VAL]); TEST_ASSERT_TRUE(am.regs[VAL]->is_atom); TEST_ASSERT_EQUAL(ATOM_TYPE_PRIM_PROC, am.regs[VAL]->atom.type); am.regs[ARGL] = expr_pair( &am, expr_integer(&am, 2), expr_pair( &am, expr_integer(&am, 3), expr_pair(&am, expr_integer(&am, 4), expr_empty_list(&am)))); am.regs[VAL]->atom.prim_proc(&am); TEST_ASSERT_NOT_NULL(am.regs[VAL]); TEST_ASSERT_TRUE(am.regs[VAL]->is_atom); TEST_ASSERT_EQUAL(ATOM_TYPE_INTEGER, am.regs[VAL]->atom.type); TEST_ASSERT_EQUAL(24, am.regs[VAL]->atom.integer); } static void test_sub_1_is_minus_1(void) { am.regs[EXPR] = expr_str_symbol(&am, "-"); env_fetch(&am); TEST_ASSERT_NOT_NULL(am.regs[VAL]); TEST_ASSERT_TRUE(am.regs[VAL]->is_atom); TEST_ASSERT_EQUAL(ATOM_TYPE_PRIM_PROC, am.regs[VAL]->atom.type); am.regs[ARGL] = expr_pair(&am, expr_integer(&am, 1), expr_empty_list(&am)); am.regs[VAL]->atom.prim_proc(&am); TEST_ASSERT_NOT_NULL(am.regs[VAL]); TEST_ASSERT_TRUE(am.regs[VAL]->is_atom); TEST_ASSERT_EQUAL(ATOM_TYPE_INTEGER, am.regs[VAL]->atom.type); TEST_ASSERT_EQUAL(-1, am.regs[VAL]->atom.integer); } static void test_sub_5_4_3_is_minus_2(void) { am.regs[EXPR] = expr_str_symbol(&am, "-"); env_fetch(&am); TEST_ASSERT_NOT_NULL(am.regs[VAL]); TEST_ASSERT_TRUE(am.regs[VAL]->is_atom); TEST_ASSERT_EQUAL(ATOM_TYPE_PRIM_PROC, am.regs[VAL]->atom.type); am.regs[ARGL] = expr_pair( &am, expr_integer(&am, 5), expr_pair( &am, expr_integer(&am, 4), expr_pair(&am, expr_integer(&am, 3), expr_empty_list(&am)))); am.regs[VAL]->atom.prim_proc(&am); TEST_ASSERT_NOT_NULL(am.regs[VAL]); TEST_ASSERT_TRUE(am.regs[VAL]->is_atom); TEST_ASSERT_EQUAL(ATOM_TYPE_INTEGER, am.regs[VAL]->atom.type); TEST_ASSERT_EQUAL(-2, am.regs[VAL]->atom.integer); } int main(void) { UNITY_BEGIN(); RUN_TEST(test_add_empty_list_is_0); RUN_TEST(test_add_1_2_3_is_6); RUN_TEST(test_mul_empty_list_is_1); RUN_TEST(test_mul_2_3_4_is_24); RUN_TEST(test_sub_1_is_minus_1); RUN_TEST(test_sub_5_4_3_is_minus_2); return UNITY_END(); }