From 626b01cf8a349353beb00d80c35281fde5282152 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Gil=20de=20G=C3=B3mez=20P=C3=A9rez?= Date: Wed, 12 Aug 2026 14:58:20 +0300 Subject: [PATCH] Solved: 08 - Switch Statements Added a contract precondition to apply_operation --- .../include/switch_statements.hpp | 4 +- .../02_control_flow/src/switch_statements.cpp | 40 ++++++++++++++----- .../test/switch_statements_test.cpp | 6 +++ 3 files changed, 39 insertions(+), 11 deletions(-) diff --git a/modules/02_control_flow/include/switch_statements.hpp b/modules/02_control_flow/include/switch_statements.hpp index 8a5de1c..ad3ea9d 100644 --- a/modules/02_control_flow/include/switch_statements.hpp +++ b/modules/02_control_flow/include/switch_statements.hpp @@ -7,7 +7,9 @@ namespace control_flow { enum class Operation { Add, Subtract, Multiply, Divide, Unknown }; [[nodiscard]] auto parse_operation(char op) -> Operation; -[[nodiscard]] auto apply_operation(Operation op, int lhs, int rhs) -> int; +// ReSharper disable once CppConstParameterInDeclaration +[[nodiscard]] auto apply_operation(const Operation op, const int lhs, const int rhs) -> int + pre(op != Operation::Unknown); [[nodiscard]] auto day_name(int day) -> std::string; } // namespace control_flow diff --git a/modules/02_control_flow/src/switch_statements.cpp b/modules/02_control_flow/src/switch_statements.cpp index 0f72466..a4d87ef 100644 --- a/modules/02_control_flow/src/switch_statements.cpp +++ b/modules/02_control_flow/src/switch_statements.cpp @@ -2,20 +2,40 @@ namespace control_flow { -auto parse_operation(char op) -> Operation { - (void)op; - return Operation::Unknown; + // enum class Operation { Add, Subtract, Multiply, Divide, Unknown }; +auto parse_operation(const char op) -> Operation { + switch (op) { + case '+': return Operation::Add; + case '-': return Operation::Subtract; + case '*': return Operation::Multiply; + case '/': return Operation::Divide; + default: return Operation::Unknown; + } } -auto apply_operation(Operation op, int lhs, int rhs) -> int { - (void)op; (void)lhs; (void)rhs; - return 0; +auto apply_operation(const Operation op, const int lhs, const int rhs) -> int + pre(op != Operation::Unknown) +{ + switch (op) { + case Operation::Add: return lhs + rhs; + case Operation::Subtract: return lhs - rhs; + case Operation::Multiply: return lhs * rhs; + case Operation::Divide: return lhs / rhs; + default: return -1; // Unreachable due to contract + } } -auto day_name(int day) -> std::string { - // TODO: 1=Monday ... 7=Sunday, else "Invalid" - (void)day; - return "Invalid"; +auto day_name(const int day) -> std::string { + switch (day) { + case 1: return "Monday"; + case 2: return "Tuesday"; + case 3: return "Wednesday"; + case 4: return "Thursday"; + case 5: return "Friday"; + case 6: return "Saturday"; + case 7: return "Sunday"; + default: return "Invalid"; + } } } // namespace control_flow diff --git a/modules/02_control_flow/test/switch_statements_test.cpp b/modules/02_control_flow/test/switch_statements_test.cpp index f36ef32..334b858 100644 --- a/modules/02_control_flow/test/switch_statements_test.cpp +++ b/modules/02_control_flow/test/switch_statements_test.cpp @@ -9,6 +9,12 @@ TEST(SwitchStatements, ParseOperation) { TEST(SwitchStatements, ApplyOperation) { EXPECT_EQ(control_flow::apply_operation(control_flow::Operation::Add, 2, 3), 5); EXPECT_EQ(control_flow::apply_operation(control_flow::Operation::Multiply, 4, 5), 20); + // Breach of contract + EXPECT_DEATH( + { + (void)control_flow::apply_operation(control_flow::Operation::Unknown, 2, 3); + }, + "contract violation"); } TEST(SwitchStatements, DayName) {