Add support for sum expressions in evaluate()

This commit is contained in:
Camden Dixie O'Brien 2024-10-24 16:47:38 +01:00
parent 8ba4035afc
commit 79494cd0ba
2 changed files with 99 additions and 1 deletions

View File

@ -4,5 +4,7 @@ int evaluate(const expression_t *expression)
{ {
if (expression->is_number) if (expression->is_number)
return expression->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;
} }

View File

@ -24,10 +24,106 @@ static void number_4321_is_evaluated_as_4321(void)
ASSERT_EQUAL(4321, result); 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) int main(void)
{ {
TESTING_BEGIN(); TESTING_BEGIN();
RUN_TEST(number_1234_is_evaluated_as_1234); RUN_TEST(number_1234_is_evaluated_as_1234);
RUN_TEST(number_4321_is_evaluated_as_4321); 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(); TESTING_END();
} }