Solved: 08 - Switch Statements
Added a contract precondition to apply_operation
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user