diff --git a/modules-template/.gitignore b/modules-template/.gitignore
deleted file mode 100644
index f06b466..0000000
--- a/modules-template/.gitignore
+++ /dev/null
@@ -1,7 +0,0 @@
-# ignore maven build folder
-target/
-
-# pom-derived eclipse jdt files
-.project
-.classpath
-org.eclipse.*.prefs
diff --git a/modules-template/core/pom.xml b/modules-template/core/pom.xml
deleted file mode 100644
index abaca3e..0000000
--- a/modules-template/core/pom.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-
- 4.0.0
- it1901
- modules-core
-
-
- it1901
- modules-template
- 0.0.1-SNAPSHOT
- ..
-
-
-
-
-
-
- org.junit.jupiter
- junit-jupiter-api
-
-
- org.junit.jupiter
- junit-jupiter-engine
-
-
- org.junit.jupiter
- junit-jupiter-params
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
-
-
-
-
diff --git a/modules-template/core/src/main/java/core/Calc.java b/modules-template/core/src/main/java/core/Calc.java
deleted file mode 100644
index ed63b11..0000000
--- a/modules-template/core/src/main/java/core/Calc.java
+++ /dev/null
@@ -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 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 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 op) throws IllegalStateException {
- if (getOperandCount() < 2) {
- throw new IllegalStateException("Too few operands (" + getOperandCount() + ") on the stack");
- }
- var op2 = popOperand();
- var op1 = 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
- }
-}
\ No newline at end of file
diff --git a/modules-template/core/src/test/java/core/CalcTest.java b/modules-template/core/src/test/java/core/CalcTest.java
deleted file mode 100644
index 11df469..0000000
--- a/modules-template/core/src/test/java/core/CalcTest.java
+++ /dev/null
@@ -1,115 +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 testPeekOperand() {
- Calc calc = new Calc(1.0, 3.14);
- Assertions.assertEquals(3.14, calc.peekOperand());
- Assertions.assertThrows(IllegalArgumentException.class, () -> new Calc().peekOperand());
- }
-
- @Test
- public void testPeekOperandN() {
- Calc calc = new Calc(1.0, 3.14);
- Assertions.assertEquals(3.14, calc.peekOperand(0));
- Assertions.assertEquals(1.0, calc.peekOperand(1));
- Assertions.assertThrows(IllegalArgumentException.class, () -> calc.peekOperand(2));
- }
-
- @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);
- }
-
- @Test
- public void testPopOperand_emptyStack() {
- Assertions.assertThrows(IllegalStateException.class, () -> new Calc().popOperand());
- }
-
- @Test
- public void testPerformOperation1() {
- Calc calc = new Calc(1.0);
- Assertions.assertEquals(-1.0, calc.performOperation(n -> -n));
- checkCalc(calc, -1.0);
- }
-
- @Test
- public void testPerformOperation1_emptyOperandStack() {
- Assertions.assertThrows(IllegalStateException.class, () -> new Calc().performOperation(n -> -n));
- }
-
-
- @Test
- public void testPerformOperation2() {
- Calc calc = new Calc(1.0, 3.0);
- Assertions.assertEquals(-2.0, calc.performOperation((n1, n2) -> n1 - n2));
- checkCalc(calc, -2.0);
- }
-
- @Test
- public void testPerformOperation2_lessThanTwoOperands() {
- Assertions.assertThrows(IllegalStateException.class, () -> new Calc(1.0).performOperation((n1, n2) -> n1 - n2));
- Assertions.assertThrows(IllegalStateException.class, () -> new Calc().performOperation((n1, n2) -> n1 - n2));
- }
-
- @Test
- public void testSwap() {
- Calc calc = new Calc(1.0, 3.14);
- checkCalc(calc, 3.14, 1.0);
- calc.swap();
- checkCalc(calc, 1.0, 3.14);
- calc.swap();
- checkCalc(calc, 3.14, 1.0);
- }
-
- @Test
- public void testSwap_lessThanTwoOperands() {
- Assertions.assertThrows(IllegalStateException.class, () -> new Calc(1.0).swap());
- Assertions.assertThrows(IllegalStateException.class, () -> new Calc().swap());
- }
-
- @Test
- public void testDup() {
- 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);
- }
-
- @Test
- public void testDup_emptyOperandStack() {
- Assertions.assertThrows(IllegalStateException.class, () -> new Calc().dup());
- }
-}
diff --git a/modules-template/pom.xml b/modules-template/pom.xml
deleted file mode 100644
index f0e8d58..0000000
--- a/modules-template/pom.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-
- 4.0.0
- it1901
- modules-template
- 0.0.1-SNAPSHOT
- pom
-
-
- UTF-8
- 16
- 16
-
-
-
-
-
- org.junit.jupiter
- junit-jupiter-api
- 5.7.2
- test
-
-
- org.junit.jupiter
- junit-jupiter-engine
- 5.7.2
- test
-
-
- org.junit.jupiter
- junit-jupiter-params
- 5.7.2
- test
-
-
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
- 3.8.1
-
- 16
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- 3.0.0-M5
-
-
-
-
-
-
- core
- ui
-
-
diff --git a/modules-template/ui/pom.xml b/modules-template/ui/pom.xml
deleted file mode 100644
index 0660fec..0000000
--- a/modules-template/ui/pom.xml
+++ /dev/null
@@ -1,92 +0,0 @@
-
- 4.0.0
- modules-ui
-
-
- it1901
- modules-template
- 0.0.1-SNAPSHOT
- ..
-
-
-
-
-
- it1901
- modules-core
- 0.0.1-SNAPSHOT
-
-
-
-
- org.openjfx
- javafx-controls
- 16
-
-
- org.openjfx
- javafx-fxml
- 16
-
-
-
-
- org.junit.jupiter
- junit-jupiter-api
-
-
- org.junit.jupiter
- junit-jupiter-engine
-
-
- org.junit.jupiter
- junit-jupiter-params
-
-
-
-
- org.testfx
- testfx-core
- 4.0.16-alpha
- test
-
-
- org.testfx
- testfx-junit5
- 4.0.16-alpha
- test
-
-
- org.hamcrest
- hamcrest
- 2.2
- test
-
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
-
-
-
- org.openjfx
- javafx-maven-plugin
- 0.0.6
-
-
-
- app.App
-
-
-
-
-
diff --git a/modules-template/ui/src/main/java/ui/App.java b/modules-template/ui/src/main/java/ui/App.java
deleted file mode 100644
index acead69..0000000
--- a/modules-template/ui/src/main/java/ui/App.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package ui;
-
-import javafx.application.Application;
-import javafx.fxml.FXMLLoader;
-import javafx.scene.Parent;
-import javafx.scene.Scene;
-import javafx.stage.Stage;
-
-import java.io.IOException;
-
-/**
- * JavaFX App
- */
-public class App extends Application {
-
- @Override
- public void start(Stage stage) throws IOException {
- FXMLLoader fxmlLoader = new FXMLLoader(this.getClass().getResource("App.fxml"));
- Parent parent = fxmlLoader.load();
- stage.setScene(new Scene(parent));
- stage.show();
- }
-
- public static void main(String[] args) {
- launch();
- }
-}
\ No newline at end of file
diff --git a/modules-template/ui/src/main/java/ui/AppController.java b/modules-template/ui/src/main/java/ui/AppController.java
deleted file mode 100644
index 2002d48..0000000
--- a/modules-template/ui/src/main/java/ui/AppController.java
+++ /dev/null
@@ -1,135 +0,0 @@
-package ui;
-
-import core.Calc;
-
-import java.util.List;
-import java.util.function.BinaryOperator;
-import java.util.function.UnaryOperator;
-
-import javafx.event.ActionEvent;
-import javafx.fxml.FXML;
-import javafx.scene.control.Label;
-import javafx.scene.control.Labeled;
-import javafx.scene.control.ListView;
-
-public class AppController {
-
- private Calc calc;
-
- public AppController() {
- calc = new Calc(0.0, 0.0, 0.0);
- }
-
- public Calc getCalc() {
- return calc;
- }
-
- public void setCalc(Calc calc) {
- this.calc = calc;
- updateOperandsView();
- }
-
- @FXML
- private ListView operandsView;
-
- @FXML
- private Label operandView;
-
- @FXML
- void initialize() {
- updateOperandsView();
- }
-
- private void updateOperandsView() {
- List operands = operandsView.getItems();
- operands.clear();
- int elementCount = Math.min(calc.getOperandCount(), 3);
- for (int i = 0; i < elementCount; i++) {
- operands.add(calc.peekOperand(elementCount - i - 1));
- }
- }
-
- private String getOperandString() {
- return operandView.getText();
- }
-
- private boolean hasOperand() {
- return ! getOperandString().isBlank();
- }
-
- private double getOperand() {
- return Double.valueOf(operandView.getText());
- }
-
- private void setOperand(String operandString) {
- operandView.setText(operandString);
- }
-
- @FXML
- void handleEnter() {
- if (hasOperand()) {
- calc.pushOperand(getOperand());
- } else {
- calc.dup();
- }
- setOperand("");
- updateOperandsView();
- }
-
- private void appendToOperand(String s) {
- // TODO
- }
-
- @FXML
- void handleDigit(ActionEvent ae) {
- if (ae.getSource() instanceof Labeled l) {
- // TODO append button label to operand
- }
- }
-
- @FXML
- void handlePoint() {
- var operandString = getOperandString();
- if (operandString.contains(".")) {
- // TODO remove characters after point
- } else {
- // TODO append point
- }
- }
-
- @FXML
- void handleClear() {
- // TODO clear operand
- }
-
- @FXML
- void handleSwap() {
- // TODO clear operand
- }
-
- private void performOperation(UnaryOperator op) {
- // TODO
- }
-
- private void performOperation(boolean swap, BinaryOperator op) {
- if (hasOperand()) {
- // TODO push operand first
- }
- // TODO perform operation, but swap first if needed
- }
-
- @FXML
- void handleOpAdd() {
- // TODO
- }
-
- @FXML
- void handleOpSub() {
- // TODO
- }
-
- @FXML
- void handleOpMult() {
- // TODO
- }
-}
diff --git a/modules-template/ui/src/main/resources/ui/App.fxml b/modules-template/ui/src/main/resources/ui/App.fxml
deleted file mode 100644
index ff280af..0000000
--- a/modules-template/ui/src/main/resources/ui/App.fxml
+++ /dev/null
@@ -1,64 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/modules-template/ui/src/test/java/ui/AppTest.java b/modules-template/ui/src/test/java/ui/AppTest.java
deleted file mode 100644
index 3c6e991..0000000
--- a/modules-template/ui/src/test/java/ui/AppTest.java
+++ /dev/null
@@ -1,130 +0,0 @@
-package ui;
-
-import javafx.fxml.FXMLLoader;
-import javafx.scene.Parent;
-import javafx.scene.Scene;
-import javafx.scene.control.Label;
-import javafx.scene.control.ListView;
-import javafx.stage.Stage;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.stream.Stream;
-
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.Arguments;
-import org.junit.jupiter.params.provider.MethodSource;
-import org.testfx.framework.junit5.ApplicationTest;
-import org.testfx.matcher.control.LabeledMatchers;
-
-/**
- * TestFX App test
- */
-public class AppTest extends ApplicationTest {
-
- private AppController controller;
- private Parent root;
-
- @Override
- public void start(Stage stage) throws IOException {
- FXMLLoader fxmlLoader = new FXMLLoader(this.getClass().getResource("App.fxml"));
- root = fxmlLoader.load();
- controller = fxmlLoader.getController();
- stage.setScene(new Scene(root));
- stage.show();
- }
-
- public Parent getRootNode() {
- return root;
- }
-
- private String enterLabel = """
- E
- n
- t
- e
- r
- """.stripTrailing();
-
- private void click(String... labels) {
- for (var label : labels) {
- clickOn(LabeledMatchers.hasText(label));
- }
- }
-
- private String getOperandString() {
- return ((Label) getRootNode().lookup("#operandView")).getText();
- }
-
- private ListView getOperandsView() {
- return (ListView) getRootNode().lookup("#operandsView");
- }
-
- private void checkView(double... operands) {
- for (int i = 0; i < operands.length; i++) {
- Assertions.assertEquals(operands[i], controller.getCalc().peekOperand(i), "Wrong value at #" + i + " of operand stack");
- }
- List viewItems = getOperandsView().getItems();
- for (int i = 0; i < operands.length; i++) {
- Assertions.assertEquals(operands[i], viewItems.get(viewItems.size() - i - 1), "Wrong value at #" + i + " of operands view");
- }
- }
-
- private void checkView(String operandString, double... operands) {
- Assertions.assertEquals(operandString, getOperandString());
- checkView(operands);
- }
-
- // see https://www.baeldung.com/parameterized-tests-junit-5
- // about @ParameterizedTest
-
- @ParameterizedTest
- @MethodSource
- public void testClicksOperand(String labels, String operandString) {
- for (var label : labels.split(" ")) {
- click(label);
- }
- checkView(operandString);
- }
-
- private static Stream testClicksOperand() {
- return Stream.of(
- Arguments.of("2 7", "27"),
- Arguments.of("2 7 .", "27."),
- Arguments.of("2 7 . 5", "27.5"),
- Arguments.of("2 7 . 5 .", "27.")
- );
- }
-
- @ParameterizedTest
- @MethodSource
- public void testClicksOperands(String labels, String operandsString) {
- for (var label : labels.split(" ")) {
- click(label.equals("\n") ? enterLabel : label);
- }
- checkView("", Stream.of(operandsString.split(" ")).mapToDouble(Double::valueOf).toArray());
- }
-
- private static Stream testClicksOperands() {
- return Stream.of(
- Arguments.of("2 7 . 5 \n", "27.5"),
- Arguments.of("2 7 \n", "27.0"),
- Arguments.of("2 \n 7 \n 5 \n", "5.0", "7.0", "2.0"),
- Arguments.of("2 7 . \n", "27.0"),
- Arguments.of("2 7 . 5 \n", "27.5"),
- Arguments.of("2 \n 7 +", "9.0"),
- Arguments.of("2 \n 7 -", "-5.0"),
- Arguments.of("2 \n 7 *", "14.0"),
- Arguments.of("6 \n 3 /", "2.0"),
- Arguments.of("2 5 \n √", "5.0")
- );
- }
-
- @Test
- public void testPi() {
- click("π");
- checkView("", Math.PI);
- }
-}
diff --git a/modules-template/ui/src/test/java/ui/README.md b/modules-template/ui/src/test/java/ui/README.md
deleted file mode 100644
index 0cc5980..0000000
--- a/modules-template/ui/src/test/java/ui/README.md
+++ /dev/null
@@ -1,38 +0,0 @@
-# Tests for the RPN calculator
-
-This folder/package contains tests based on TestFX for the RPN Calculator (currently only one test class).
-
-As can be seen when launching, the app contains a list (top) showing the operands
-(topmost operand at the bottom), a text field (below list, initially empty) for a new operand and
-the buttons for digits, enter, decimal point, operations etc.
-
-## What is tested
-
-The tests simulate clicks on the buttons and checks that the underlying Calc object,
-the list (a view of the Calc object's operand stack) and the text field are updated as expected.
-E.g. if you click buttons `2 3 . 5` the string `23.5` should be shown,
-while the list is not affected. If you then click `enter`, the text field should be emptied, the operand stack should have `23.5` at the top and the list should have `23.5` at the bottom
-(logically the top of the operand stack).
-
-Below are the specific cases that are tested.
-
-buttons to click `=>` text field content:
-
-- `2 7` => `27`
-- `2 7 .` => `27.`
-- `2 7 . 5` => `27.5`
-- `2 7 . 5 .` => `27.` (cut at decimal point)
-
-buttons to click `=>` operand stack/list content (from the bottom):
-
-- `2 7 . 5 enter"` => `27.5`
-- `2 7 enter` => `27.0"`
-- `2 enter 7 enter 5 enter` => `5.0 7.0 2.0`
-- `2 7 . enter` => `27.0`
-- `2 7 . 5 enter` => `27.5`
-- `2 enter 7 +` => `9.0`
-- `2 enter 7 -` => `-5.0`
-- `2 enter 7 *` => `14.0`
-- `6 enter 3 /` => `2.0`
-- `2 5 enter √` => `5.0`
-- `π` => `3.1415...` (the value of the `Math.PI` constant)
diff --git a/packages-template/.gitignore b/packages-template/.gitignore
deleted file mode 100644
index f06b466..0000000
--- a/packages-template/.gitignore
+++ /dev/null
@@ -1,7 +0,0 @@
-# ignore maven build folder
-target/
-
-# pom-derived eclipse jdt files
-.project
-.classpath
-org.eclipse.*.prefs
diff --git a/packages-template/pom.xml b/packages-template/pom.xml
deleted file mode 100644
index 7c81cbc..0000000
--- a/packages-template/pom.xml
+++ /dev/null
@@ -1,98 +0,0 @@
-
- 4.0.0
- it1901
- packages-template
- 0.0.1-SNAPSHOT
-
-
- UTF-8
- 16
- 16
-
-
-
-
-
-
- org.openjfx
- javafx-controls
- 16
-
-
- org.openjfx
- javafx-fxml
- 16
-
-
-
-
- org.junit.jupiter
- junit-jupiter-api
- 5.7.2
- test
-
-
- org.junit.jupiter
- junit-jupiter-engine
- 5.7.2
- test
-
-
- org.junit.jupiter
- junit-jupiter-params
- 5.7.2
- test
-
-
-
-
- org.testfx
- testfx-core
- 4.0.16-alpha
- test
-
-
- org.testfx
- testfx-junit5
- 4.0.16-alpha
- test
-
-
- org.hamcrest
- hamcrest
- 2.2
- test
-
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
- 3.8.1
-
- 16
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- 3.0.0-M5
-
-
-
- org.openjfx
- javafx-maven-plugin
- 0.0.6
-
-
-
- app.App
-
-
-
-
-
diff --git a/packages-template/src/main/java/core/Calc.java b/packages-template/src/main/java/core/Calc.java
deleted file mode 100644
index ed63b11..0000000
--- a/packages-template/src/main/java/core/Calc.java
+++ /dev/null
@@ -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 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 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 op) throws IllegalStateException {
- if (getOperandCount() < 2) {
- throw new IllegalStateException("Too few operands (" + getOperandCount() + ") on the stack");
- }
- var op2 = popOperand();
- var op1 = 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
- }
-}
\ No newline at end of file
diff --git a/packages-template/src/main/java/ui/App.java b/packages-template/src/main/java/ui/App.java
deleted file mode 100644
index acead69..0000000
--- a/packages-template/src/main/java/ui/App.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package ui;
-
-import javafx.application.Application;
-import javafx.fxml.FXMLLoader;
-import javafx.scene.Parent;
-import javafx.scene.Scene;
-import javafx.stage.Stage;
-
-import java.io.IOException;
-
-/**
- * JavaFX App
- */
-public class App extends Application {
-
- @Override
- public void start(Stage stage) throws IOException {
- FXMLLoader fxmlLoader = new FXMLLoader(this.getClass().getResource("App.fxml"));
- Parent parent = fxmlLoader.load();
- stage.setScene(new Scene(parent));
- stage.show();
- }
-
- public static void main(String[] args) {
- launch();
- }
-}
\ No newline at end of file
diff --git a/packages-template/src/main/java/ui/AppController.java b/packages-template/src/main/java/ui/AppController.java
deleted file mode 100644
index 2002d48..0000000
--- a/packages-template/src/main/java/ui/AppController.java
+++ /dev/null
@@ -1,135 +0,0 @@
-package ui;
-
-import core.Calc;
-
-import java.util.List;
-import java.util.function.BinaryOperator;
-import java.util.function.UnaryOperator;
-
-import javafx.event.ActionEvent;
-import javafx.fxml.FXML;
-import javafx.scene.control.Label;
-import javafx.scene.control.Labeled;
-import javafx.scene.control.ListView;
-
-public class AppController {
-
- private Calc calc;
-
- public AppController() {
- calc = new Calc(0.0, 0.0, 0.0);
- }
-
- public Calc getCalc() {
- return calc;
- }
-
- public void setCalc(Calc calc) {
- this.calc = calc;
- updateOperandsView();
- }
-
- @FXML
- private ListView operandsView;
-
- @FXML
- private Label operandView;
-
- @FXML
- void initialize() {
- updateOperandsView();
- }
-
- private void updateOperandsView() {
- List operands = operandsView.getItems();
- operands.clear();
- int elementCount = Math.min(calc.getOperandCount(), 3);
- for (int i = 0; i < elementCount; i++) {
- operands.add(calc.peekOperand(elementCount - i - 1));
- }
- }
-
- private String getOperandString() {
- return operandView.getText();
- }
-
- private boolean hasOperand() {
- return ! getOperandString().isBlank();
- }
-
- private double getOperand() {
- return Double.valueOf(operandView.getText());
- }
-
- private void setOperand(String operandString) {
- operandView.setText(operandString);
- }
-
- @FXML
- void handleEnter() {
- if (hasOperand()) {
- calc.pushOperand(getOperand());
- } else {
- calc.dup();
- }
- setOperand("");
- updateOperandsView();
- }
-
- private void appendToOperand(String s) {
- // TODO
- }
-
- @FXML
- void handleDigit(ActionEvent ae) {
- if (ae.getSource() instanceof Labeled l) {
- // TODO append button label to operand
- }
- }
-
- @FXML
- void handlePoint() {
- var operandString = getOperandString();
- if (operandString.contains(".")) {
- // TODO remove characters after point
- } else {
- // TODO append point
- }
- }
-
- @FXML
- void handleClear() {
- // TODO clear operand
- }
-
- @FXML
- void handleSwap() {
- // TODO clear operand
- }
-
- private void performOperation(UnaryOperator op) {
- // TODO
- }
-
- private void performOperation(boolean swap, BinaryOperator op) {
- if (hasOperand()) {
- // TODO push operand first
- }
- // TODO perform operation, but swap first if needed
- }
-
- @FXML
- void handleOpAdd() {
- // TODO
- }
-
- @FXML
- void handleOpSub() {
- // TODO
- }
-
- @FXML
- void handleOpMult() {
- // TODO
- }
-}
diff --git a/packages-template/src/main/resources/ui/App.fxml b/packages-template/src/main/resources/ui/App.fxml
deleted file mode 100644
index ff280af..0000000
--- a/packages-template/src/main/resources/ui/App.fxml
+++ /dev/null
@@ -1,64 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/packages-template/src/test/java/core/CalcTest.java b/packages-template/src/test/java/core/CalcTest.java
deleted file mode 100644
index 11df469..0000000
--- a/packages-template/src/test/java/core/CalcTest.java
+++ /dev/null
@@ -1,115 +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 testPeekOperand() {
- Calc calc = new Calc(1.0, 3.14);
- Assertions.assertEquals(3.14, calc.peekOperand());
- Assertions.assertThrows(IllegalArgumentException.class, () -> new Calc().peekOperand());
- }
-
- @Test
- public void testPeekOperandN() {
- Calc calc = new Calc(1.0, 3.14);
- Assertions.assertEquals(3.14, calc.peekOperand(0));
- Assertions.assertEquals(1.0, calc.peekOperand(1));
- Assertions.assertThrows(IllegalArgumentException.class, () -> calc.peekOperand(2));
- }
-
- @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);
- }
-
- @Test
- public void testPopOperand_emptyStack() {
- Assertions.assertThrows(IllegalStateException.class, () -> new Calc().popOperand());
- }
-
- @Test
- public void testPerformOperation1() {
- Calc calc = new Calc(1.0);
- Assertions.assertEquals(-1.0, calc.performOperation(n -> -n));
- checkCalc(calc, -1.0);
- }
-
- @Test
- public void testPerformOperation1_emptyOperandStack() {
- Assertions.assertThrows(IllegalStateException.class, () -> new Calc().performOperation(n -> -n));
- }
-
-
- @Test
- public void testPerformOperation2() {
- Calc calc = new Calc(1.0, 3.0);
- Assertions.assertEquals(-2.0, calc.performOperation((n1, n2) -> n1 - n2));
- checkCalc(calc, -2.0);
- }
-
- @Test
- public void testPerformOperation2_lessThanTwoOperands() {
- Assertions.assertThrows(IllegalStateException.class, () -> new Calc(1.0).performOperation((n1, n2) -> n1 - n2));
- Assertions.assertThrows(IllegalStateException.class, () -> new Calc().performOperation((n1, n2) -> n1 - n2));
- }
-
- @Test
- public void testSwap() {
- Calc calc = new Calc(1.0, 3.14);
- checkCalc(calc, 3.14, 1.0);
- calc.swap();
- checkCalc(calc, 1.0, 3.14);
- calc.swap();
- checkCalc(calc, 3.14, 1.0);
- }
-
- @Test
- public void testSwap_lessThanTwoOperands() {
- Assertions.assertThrows(IllegalStateException.class, () -> new Calc(1.0).swap());
- Assertions.assertThrows(IllegalStateException.class, () -> new Calc().swap());
- }
-
- @Test
- public void testDup() {
- 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);
- }
-
- @Test
- public void testDup_emptyOperandStack() {
- Assertions.assertThrows(IllegalStateException.class, () -> new Calc().dup());
- }
-}
diff --git a/packages-template/src/test/java/ui/AppTest.java b/packages-template/src/test/java/ui/AppTest.java
deleted file mode 100644
index 3c6e991..0000000
--- a/packages-template/src/test/java/ui/AppTest.java
+++ /dev/null
@@ -1,130 +0,0 @@
-package ui;
-
-import javafx.fxml.FXMLLoader;
-import javafx.scene.Parent;
-import javafx.scene.Scene;
-import javafx.scene.control.Label;
-import javafx.scene.control.ListView;
-import javafx.stage.Stage;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.stream.Stream;
-
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.Arguments;
-import org.junit.jupiter.params.provider.MethodSource;
-import org.testfx.framework.junit5.ApplicationTest;
-import org.testfx.matcher.control.LabeledMatchers;
-
-/**
- * TestFX App test
- */
-public class AppTest extends ApplicationTest {
-
- private AppController controller;
- private Parent root;
-
- @Override
- public void start(Stage stage) throws IOException {
- FXMLLoader fxmlLoader = new FXMLLoader(this.getClass().getResource("App.fxml"));
- root = fxmlLoader.load();
- controller = fxmlLoader.getController();
- stage.setScene(new Scene(root));
- stage.show();
- }
-
- public Parent getRootNode() {
- return root;
- }
-
- private String enterLabel = """
- E
- n
- t
- e
- r
- """.stripTrailing();
-
- private void click(String... labels) {
- for (var label : labels) {
- clickOn(LabeledMatchers.hasText(label));
- }
- }
-
- private String getOperandString() {
- return ((Label) getRootNode().lookup("#operandView")).getText();
- }
-
- private ListView getOperandsView() {
- return (ListView) getRootNode().lookup("#operandsView");
- }
-
- private void checkView(double... operands) {
- for (int i = 0; i < operands.length; i++) {
- Assertions.assertEquals(operands[i], controller.getCalc().peekOperand(i), "Wrong value at #" + i + " of operand stack");
- }
- List viewItems = getOperandsView().getItems();
- for (int i = 0; i < operands.length; i++) {
- Assertions.assertEquals(operands[i], viewItems.get(viewItems.size() - i - 1), "Wrong value at #" + i + " of operands view");
- }
- }
-
- private void checkView(String operandString, double... operands) {
- Assertions.assertEquals(operandString, getOperandString());
- checkView(operands);
- }
-
- // see https://www.baeldung.com/parameterized-tests-junit-5
- // about @ParameterizedTest
-
- @ParameterizedTest
- @MethodSource
- public void testClicksOperand(String labels, String operandString) {
- for (var label : labels.split(" ")) {
- click(label);
- }
- checkView(operandString);
- }
-
- private static Stream testClicksOperand() {
- return Stream.of(
- Arguments.of("2 7", "27"),
- Arguments.of("2 7 .", "27."),
- Arguments.of("2 7 . 5", "27.5"),
- Arguments.of("2 7 . 5 .", "27.")
- );
- }
-
- @ParameterizedTest
- @MethodSource
- public void testClicksOperands(String labels, String operandsString) {
- for (var label : labels.split(" ")) {
- click(label.equals("\n") ? enterLabel : label);
- }
- checkView("", Stream.of(operandsString.split(" ")).mapToDouble(Double::valueOf).toArray());
- }
-
- private static Stream testClicksOperands() {
- return Stream.of(
- Arguments.of("2 7 . 5 \n", "27.5"),
- Arguments.of("2 7 \n", "27.0"),
- Arguments.of("2 \n 7 \n 5 \n", "5.0", "7.0", "2.0"),
- Arguments.of("2 7 . \n", "27.0"),
- Arguments.of("2 7 . 5 \n", "27.5"),
- Arguments.of("2 \n 7 +", "9.0"),
- Arguments.of("2 \n 7 -", "-5.0"),
- Arguments.of("2 \n 7 *", "14.0"),
- Arguments.of("6 \n 3 /", "2.0"),
- Arguments.of("2 5 \n √", "5.0")
- );
- }
-
- @Test
- public void testPi() {
- click("π");
- checkView("", Math.PI);
- }
-}
diff --git a/packages-template/src/test/java/ui/README.md b/packages-template/src/test/java/ui/README.md
deleted file mode 100644
index 0cc5980..0000000
--- a/packages-template/src/test/java/ui/README.md
+++ /dev/null
@@ -1,38 +0,0 @@
-# Tests for the RPN calculator
-
-This folder/package contains tests based on TestFX for the RPN Calculator (currently only one test class).
-
-As can be seen when launching, the app contains a list (top) showing the operands
-(topmost operand at the bottom), a text field (below list, initially empty) for a new operand and
-the buttons for digits, enter, decimal point, operations etc.
-
-## What is tested
-
-The tests simulate clicks on the buttons and checks that the underlying Calc object,
-the list (a view of the Calc object's operand stack) and the text field are updated as expected.
-E.g. if you click buttons `2 3 . 5` the string `23.5` should be shown,
-while the list is not affected. If you then click `enter`, the text field should be emptied, the operand stack should have `23.5` at the top and the list should have `23.5` at the bottom
-(logically the top of the operand stack).
-
-Below are the specific cases that are tested.
-
-buttons to click `=>` text field content:
-
-- `2 7` => `27`
-- `2 7 .` => `27.`
-- `2 7 . 5` => `27.5`
-- `2 7 . 5 .` => `27.` (cut at decimal point)
-
-buttons to click `=>` operand stack/list content (from the bottom):
-
-- `2 7 . 5 enter"` => `27.5`
-- `2 7 enter` => `27.0"`
-- `2 enter 7 enter 5 enter` => `5.0 7.0 2.0`
-- `2 7 . enter` => `27.0`
-- `2 7 . 5 enter` => `27.5`
-- `2 enter 7 +` => `9.0`
-- `2 enter 7 -` => `-5.0`
-- `2 enter 7 *` => `14.0`
-- `6 enter 3 /` => `2.0`
-- `2 5 enter √` => `5.0`
-- `π` => `3.1415...` (the value of the `Math.PI` constant)