150 lines
4.7 KiB
C
150 lines
4.7 KiB
C
#include "evaluator.h"
|
|
#include "memory_pool.h"
|
|
#include "testing.h"
|
|
|
|
static memory_pool_t pool;
|
|
|
|
static void number_1234_is_evaluated_as_1234(void)
|
|
{
|
|
init_memory_pool(&pool);
|
|
expression_t *expression = allocate_expression(&pool);
|
|
expression->is_number = true;
|
|
expression->number = 1234;
|
|
const int result = evaluate(expression);
|
|
ASSERT_EQUAL(1234, result);
|
|
}
|
|
|
|
static void number_4321_is_evaluated_as_4321(void)
|
|
{
|
|
init_memory_pool(&pool);
|
|
expression_t *expression = allocate_expression(&pool);
|
|
expression->is_number = true;
|
|
expression->number = 4321;
|
|
const int result = evaluate(expression);
|
|
ASSERT_EQUAL(4321, result);
|
|
}
|
|
|
|
static void sum_of_14_and_31_evaluates_to_45(void)
|
|
{
|
|
init_memory_pool(&pool);
|
|
expression_t *operand0 = allocate_expression(&pool);
|
|
operand0->is_number = true;
|
|
operand0->number = 14;
|
|
expression_t *operand1 = allocate_expression(&pool);
|
|
operand1->is_number = true;
|
|
operand1->number = 31;
|
|
expression_t *expression = allocate_expression(&pool);
|
|
expression->is_number = false;
|
|
expression->application.operator= OPERATOR_ADD;
|
|
expression->application.operands[0] = operand0;
|
|
expression->application.operands[1] = operand1;
|
|
|
|
const int result = evaluate(expression);
|
|
ASSERT_EQUAL(45, result);
|
|
}
|
|
|
|
static void sum_of_72_and_6_evaluates_to_78(void)
|
|
{
|
|
init_memory_pool(&pool);
|
|
expression_t *operand0 = allocate_expression(&pool);
|
|
operand0->is_number = true;
|
|
operand0->number = 72;
|
|
expression_t *operand1 = allocate_expression(&pool);
|
|
operand1->is_number = true;
|
|
operand1->number = 6;
|
|
expression_t *expression = allocate_expression(&pool);
|
|
expression->is_number = false;
|
|
expression->application.operator= OPERATOR_ADD;
|
|
expression->application.operands[0] = operand0;
|
|
expression->application.operands[1] = operand1;
|
|
|
|
const int result = evaluate(expression);
|
|
ASSERT_EQUAL(78, result);
|
|
}
|
|
|
|
static void sum_of_21_and_the_sum_of_9_and_31_evaluates_to_61(void)
|
|
{
|
|
init_memory_pool(&pool);
|
|
expression_t *operand0 = allocate_expression(&pool);
|
|
operand0->is_number = true;
|
|
operand0->number = 21;
|
|
expression_t *operand10 = allocate_expression(&pool);
|
|
operand10->is_number = true;
|
|
operand10->number = 9;
|
|
expression_t *operand11 = allocate_expression(&pool);
|
|
operand11->is_number = true;
|
|
operand11->number = 31;
|
|
expression_t *operand1 = allocate_expression(&pool);
|
|
operand1->is_number = false;
|
|
operand1->application.operator= OPERATOR_ADD;
|
|
operand1->application.operands[0] = operand10;
|
|
operand1->application.operands[1] = operand11;
|
|
expression_t *expression = allocate_expression(&pool);
|
|
expression->is_number = false;
|
|
expression->application.operator= OPERATOR_ADD;
|
|
expression->application.operands[0] = operand0;
|
|
expression->application.operands[1] = operand1;
|
|
|
|
const int result = evaluate(expression);
|
|
ASSERT_EQUAL(61, result);
|
|
}
|
|
|
|
static void sum_of_the_sum_of_4_and_66_and_83_evaluates_to_153(void)
|
|
{
|
|
init_memory_pool(&pool);
|
|
expression_t *operand00 = allocate_expression(&pool);
|
|
operand00->is_number = true;
|
|
operand00->number = 4;
|
|
expression_t *operand01 = allocate_expression(&pool);
|
|
operand01->is_number = true;
|
|
operand01->number = 66;
|
|
expression_t *operand0 = allocate_expression(&pool);
|
|
operand0->is_number = false;
|
|
operand0->application.operator= OPERATOR_ADD;
|
|
operand0->application.operands[0] = operand00;
|
|
operand0->application.operands[1] = operand01;
|
|
expression_t *operand1 = allocate_expression(&pool);
|
|
operand1->is_number = true;
|
|
operand1->number = 83;
|
|
expression_t *expression = allocate_expression(&pool);
|
|
expression->is_number = false;
|
|
expression->application.operator= OPERATOR_ADD;
|
|
expression->application.operands[0] = operand0;
|
|
expression->application.operands[1] = operand1;
|
|
|
|
const int result = evaluate(expression);
|
|
ASSERT_EQUAL(153, result);
|
|
}
|
|
|
|
static void subtraction_of_56_from_88_evaluates_to_32(void)
|
|
{
|
|
init_memory_pool(&pool);
|
|
expression_t *operand0 = allocate_expression(&pool);
|
|
operand0->is_number = true;
|
|
operand0->number = 88;
|
|
expression_t *operand1 = allocate_expression(&pool);
|
|
operand1->is_number = true;
|
|
operand1->number = 56;
|
|
expression_t *expression = allocate_expression(&pool);
|
|
expression->is_number = false;
|
|
expression->application.operator= OPERATOR_SUBTRACT;
|
|
expression->application.operands[0] = operand0;
|
|
expression->application.operands[1] = operand1;
|
|
|
|
const int result = evaluate(expression);
|
|
ASSERT_EQUAL(32, result);
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
TESTING_BEGIN();
|
|
RUN_TEST(number_1234_is_evaluated_as_1234);
|
|
RUN_TEST(number_4321_is_evaluated_as_4321);
|
|
RUN_TEST(sum_of_14_and_31_evaluates_to_45);
|
|
RUN_TEST(sum_of_72_and_6_evaluates_to_78);
|
|
RUN_TEST(sum_of_21_and_the_sum_of_9_and_31_evaluates_to_61);
|
|
RUN_TEST(sum_of_the_sum_of_4_and_66_and_83_evaluates_to_153);
|
|
RUN_TEST(subtraction_of_56_from_88_evaluates_to_32);
|
|
TESTING_END();
|
|
}
|