From 79494cd0ba107aa8f7db6d178fa105463554e10e Mon Sep 17 00:00:00 2001 From: Camden Dixie O'Brien Date: Thu, 24 Oct 2024 16:47:38 +0100 Subject: [PATCH] Add support for sum expressions in evaluate() --- lib/evaluator.c | 4 +- tests/evaluator_tests.c | 96 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+), 1 deletion(-) diff --git a/lib/evaluator.c b/lib/evaluator.c index a40d6cd..88daee1 100644 --- a/lib/evaluator.c +++ b/lib/evaluator.c @@ -4,5 +4,7 @@ int evaluate(const expression_t *expression) { if (expression->is_number) return expression->number; - return 0; + const int x = evaluate(expression->application.operands[0]); + const int y = evaluate(expression->application.operands[1]); + return x + y; } diff --git a/tests/evaluator_tests.c b/tests/evaluator_tests.c index dfc2361..c2ed1a9 100644 --- a/tests/evaluator_tests.c +++ b/tests/evaluator_tests.c @@ -24,10 +24,106 @@ static void number_4321_is_evaluated_as_4321(void) 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); +} + 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); TESTING_END(); }