Fikset feil i kode og test

This commit is contained in:
Hallvard Trætteberg 2021-08-27 09:29:07 +00:00
parent 84bd1ee37f
commit 6de15986b3
11 changed files with 25 additions and 154 deletions

View File

@ -1,2 +1,7 @@
# ignore maven build folder # ignore maven build folder
target/ target/
# pom-derived eclipse jdt files
.project
.classpath
org.eclipse.*.prefs

View File

@ -38,7 +38,7 @@ public class Calc {
* @throws IllegalArgumentException if n is larger than the operand count * @throws IllegalArgumentException if n is larger than the operand count
*/ */
public double peekOperand(int n) { public double peekOperand(int n) {
if (n > getOperandCount()) { if (n >= getOperandCount()) {
throw new IllegalArgumentException("Cannot peek at position " + n + " when the operand count is " + getOperandCount()); throw new IllegalArgumentException("Cannot peek at position " + n + " when the operand count is " + getOperandCount());
} }
return operandStack.get(getOperandCount() - n - 1); return operandStack.get(getOperandCount() - n - 1);
@ -102,7 +102,7 @@ public class Calc {
* @throws IllegalStateException if the operand count is less than two * @throws IllegalStateException if the operand count is less than two
*/ */
public void swap() { public void swap() {
// TODO
} }
/** /**

View File

@ -86,10 +86,11 @@ public class CalcTest {
@Test @Test
public void testSwap() { public void testSwap() {
Calc calc = new Calc(1.0, 3.14); Calc calc = new Calc(1.0, 3.14);
calc.swap();
checkCalc(calc, 3.14, 1.0); checkCalc(calc, 3.14, 1.0);
calc.swap(); calc.swap();
checkCalc(calc, 1.0, 3.14); checkCalc(calc, 1.0, 3.14);
calc.swap();
checkCalc(calc, 3.14, 1.0);
} }
@Test @Test

View File

@ -1,2 +1,7 @@
# ignore maven build folder # ignore maven build folder
target/ target/
# pom-derived eclipse jdt files
.project
.classpath
org.eclipse.*.prefs

View File

@ -37,7 +37,7 @@ public class Calc {
* @throws IllegalArgumentException if n is larger than the operand count * @throws IllegalArgumentException if n is larger than the operand count
*/ */
public double peekOperand(int n) { public double peekOperand(int n) {
if (n > getOperandCount()) { if (n >= getOperandCount()) {
throw new IllegalArgumentException("Cannot peek at position " + n + " when the operand count is " + getOperandCount()); throw new IllegalArgumentException("Cannot peek at position " + n + " when the operand count is " + getOperandCount());
} }
return operandStack.get(getOperandCount() - n - 1); return operandStack.get(getOperandCount() - n - 1);

View File

@ -86,10 +86,11 @@ public class CalcTest {
@Test @Test
public void testSwap() { public void testSwap() {
Calc calc = new Calc(1.0, 3.14); Calc calc = new Calc(1.0, 3.14);
calc.swap();
checkCalc(calc, 3.14, 1.0); checkCalc(calc, 3.14, 1.0);
calc.swap(); calc.swap();
checkCalc(calc, 1.0, 3.14); checkCalc(calc, 1.0, 3.14);
calc.swap();
checkCalc(calc, 3.14, 1.0);
} }
@Test @Test

View File

@ -1,108 +0,0 @@
package core;
import java.util.ArrayList;
import java.util.List;
import java.util.function.BinaryOperator;
import java.util.function.UnaryOperator;
public class Calc {
private final List<Double> operandStack;
public Calc(double... operands) {
operandStack = new ArrayList<>(operands.length + 2);
for (var d : operands) {
operandStack.add(d);
}
}
/**
* @return the number of operands on the stack
*/
public int getOperandCount() {
return operandStack.size();
}
/**
* Pushes a new operand onto top of the stack.
* @param d the new operand
*/
public void pushOperand(double d) {
operandStack.add(d);
}
/**
* @param n the place (from the top) to peek
* @return the n'th operand from the top
* @throws IllegalArgumentException if n is larger than the operand count
*/
public double peekOperand(int n) {
if (n > getOperandCount()) {
throw new IllegalArgumentException("Cannot peek at position " + n + " when the operand count is " + getOperandCount());
}
return operandStack.get(getOperandCount() - n - 1);
}
/**
* @return the top operand
*/
public double peekOperand() {
return peekOperand(0);
}
/**
* Removes and returns the top operand.
* @return the top operand
* @throws IllegalStateException if the stack is empty
*/
public double popOperand() {
if (getOperandCount() == 0) {
throw new IllegalStateException("Cannot pop from an empty stack");
}
return operandStack.remove(operandStack.size() - 1);
}
/**
* Performs the provided operation in the top operand, and
* replaces it with the result.
* @param op the operation to perform
* @return the result of performing the operation
* @throws IllegalStateException if the operand stack is empty
*/
public double performOperation(UnaryOperator<Double> op) throws IllegalStateException {
// TODO
return 0.0;
}
/**
* Performs the provided operation in the two topmost operands, and
* replaces them with the result.
* @param op the operation to perform
* @return the result of performing the operation
* @throws IllegalStateException if the operand count is less than two
*/
public double performOperation(BinaryOperator<Double> op) throws IllegalStateException {
if (getOperandCount() < 2) {
throw new IllegalStateException("Too few operands (" + getOperandCount() + ") on the stack");
}
var op1 = popOperand();
var op2 = popOperand();
var result = op.apply(op1, op2);
pushOperand(result);
return result;
}
/**
* Swaps the two topmost operands.
*/
public void swap() {
// TODO
}
/**
* Duplicates the top operand.
*/
public void dup() {
// TODO
}
}

View File

@ -1,39 +0,0 @@
package core;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
public class CalcTest {
private static void checkCalc(Calc calc, double... operands) {
Assertions.assertEquals(operands.length, calc.getOperandCount(), "Wrong operand count");
for (int i = 0; i < operands.length; i++) {
Assertions.assertEquals(operands[i], calc.peekOperand(i), "Wrong value at #" + i + " of operand stack");
}
}
@Test
public void testCalc() {
checkCalc(new Calc());
checkCalc(new Calc(1.0), 1.0);
checkCalc(new Calc(3.14, 1.0), 1.0, 3.14);
}
@Test
public void testPushOperand() {
Calc calc = new Calc();
calc.pushOperand(1.0);
checkCalc(calc, 1.0);
calc.pushOperand(3.14);
checkCalc(calc, 3.14, 1.0);
}
@Test
public void testPopOperand() {
Calc calc = new Calc(1.0, 3.14);
Assertions.assertEquals(3.14, calc.popOperand());
checkCalc(calc, 1.0);
Assertions.assertEquals(1.0, calc.popOperand());
checkCalc(calc);
}
}

View File

@ -1,2 +1,7 @@
# ignore maven build folder # ignore maven build folder
target/ target/
# pom-derived eclipse jdt files
.project
.classpath
org.eclipse.*.prefs

View File

@ -37,7 +37,7 @@ public class Calc {
* @throws IllegalArgumentException if n is larger than the operand count * @throws IllegalArgumentException if n is larger than the operand count
*/ */
public double peekOperand(int n) { public double peekOperand(int n) {
if (n > getOperandCount()) { if (n >= getOperandCount()) {
throw new IllegalArgumentException("Cannot peek at position " + n + " when the operand count is " + getOperandCount()); throw new IllegalArgumentException("Cannot peek at position " + n + " when the operand count is " + getOperandCount());
} }
return operandStack.get(getOperandCount() - n - 1); return operandStack.get(getOperandCount() - n - 1);

View File

@ -86,10 +86,11 @@ public class CalcTest {
@Test @Test
public void testSwap() { public void testSwap() {
Calc calc = new Calc(1.0, 3.14); Calc calc = new Calc(1.0, 3.14);
calc.swap();
checkCalc(calc, 3.14, 1.0); checkCalc(calc, 3.14, 1.0);
calc.swap(); calc.swap();
checkCalc(calc, 1.0, 3.14); checkCalc(calc, 1.0, 3.14);
calc.swap();
checkCalc(calc, 3.14, 1.0);
} }
@Test @Test