Test and fix the "operator after equals" case.

This commit is contained in:
Gender Shrapnel 2024-02-08 18:19:48 +01:00
parent 719444c06e
commit b586bfe11e
Signed by: modzero
SSH Key Fingerprint: SHA256:hsF2onMcqHsX09jLIFn7GvltdH9NTfFd/1tCnBNfQ4g
2 changed files with 24 additions and 10 deletions

View File

@ -44,15 +44,14 @@ public record Calculator(CalculatorState State, string LeftOperand, CalculatorOp
public Calculator() : this(CalculatorState.AfterEquals, "0", null, "0") { }
public Calculator OperatorPressed(CalculatorOperator op) => this with
{
LeftOperand = State switch {
CalculatorState.AfterOperator or CalculatorState.AfterEquals => RightOperand,
public Calculator OperatorPressed(CalculatorOperator op) => new(
LeftOperand: State switch {
CalculatorState.AfterOperator or CalculatorState.AfterEquals => Display,
CalculatorState.AfterDigit => Evaluate(),
},
Operator = op,
State = CalculatorState.AfterOperator,
};
Operator: op,
RightOperand: Display,
State: CalculatorState.AfterOperator);
public Calculator EqualsPressed() => this with {
LeftOperand = Evaluate(),
@ -61,7 +60,7 @@ public record Calculator(CalculatorState State, string LeftOperand, CalculatorOp
public Calculator DigitPressed(string digit) => this with {
LeftOperand = State switch {
CalculatorState.AfterEquals or CalculatorState.AfterOperator => RightOperand,
CalculatorState.AfterEquals or CalculatorState.AfterOperator => Display,
CalculatorState.AfterDigit => LeftOperand,
},
RightOperand = State switch {

View File

@ -40,4 +40,19 @@ public class CalculatorTests
calculator = calculator.EqualsPressed();
Assert.Equal("8", calculator.Display);
}
[Fact]
public void OperatorAfterEquals()
{
var calculator = new Calculator()
.DigitPressed("2")
.OperatorPressed(CalculatorOperator.Multiplication)
.DigitPressed("3")
.EqualsPressed();
Assert.Equal("6", calculator.Display);
calculator = calculator.OperatorPressed(CalculatorOperator.Addition);
Assert.Equal("6", calculator.Display);
calculator = calculator.EqualsPressed();
Assert.Equal("12", calculator.Display);
}
}