Solved: 08 - Switch Statements

Added a contract precondition to apply_operation
This commit is contained in:
David Gil de Gómez Pérez
2026-08-12 14:58:20 +03:00
parent 88cc7728a6
commit 626b01cf8a
3 changed files with 39 additions and 11 deletions
@@ -7,7 +7,9 @@ namespace control_flow {
enum class Operation { Add, Subtract, Multiply, Divide, Unknown }; enum class Operation { Add, Subtract, Multiply, Divide, Unknown };
[[nodiscard]] auto parse_operation(char op) -> Operation; [[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; [[nodiscard]] auto day_name(int day) -> std::string;
} // namespace control_flow } // namespace control_flow
@@ -2,20 +2,40 @@
namespace control_flow { namespace control_flow {
auto parse_operation(char op) -> Operation { // enum class Operation { Add, Subtract, Multiply, Divide, Unknown };
(void)op; auto parse_operation(const char op) -> Operation {
return Operation::Unknown; 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 { auto apply_operation(const Operation op, const int lhs, const int rhs) -> int
(void)op; (void)lhs; (void)rhs; pre(op != Operation::Unknown)
return 0; {
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 { auto day_name(const int day) -> std::string {
// TODO: 1=Monday ... 7=Sunday, else "Invalid" switch (day) {
(void)day; case 1: return "Monday";
return "Invalid"; 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 } // namespace control_flow
@@ -9,6 +9,12 @@ TEST(SwitchStatements, ParseOperation) {
TEST(SwitchStatements, ApplyOperation) { 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::Add, 2, 3), 5);
EXPECT_EQ(control_flow::apply_operation(control_flow::Operation::Multiply, 4, 5), 20); 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) { TEST(SwitchStatements, DayName) {