From 4b76f2eb69fa74a004addd5b6dfc287011af3f9b Mon Sep 17 00:00:00 2001 From: BrittanyBi Date: Sun, 3 Mar 2019 17:32:52 -0700 Subject: [PATCH 01/15] PAN-10 code & test corrections. Node class extracted from ParserService class. --- .../msudenver/tsp/services/parser/Node.java | 34 ++++++ .../tsp/services/parser/ParserService.java | 108 ++++++++++++++++++ .../services/parser/ParserServiceTest.java | 70 +++++++++++- 3 files changed, 210 insertions(+), 2 deletions(-) create mode 100644 services/src/main/java/edu/msudenver/tsp/services/parser/Node.java diff --git a/services/src/main/java/edu/msudenver/tsp/services/parser/Node.java b/services/src/main/java/edu/msudenver/tsp/services/parser/Node.java new file mode 100644 index 0000000..8f9893f --- /dev/null +++ b/services/src/main/java/edu/msudenver/tsp/services/parser/Node.java @@ -0,0 +1,34 @@ +package edu.msudenver.tsp.services.parser; + +public class Node +{ + String statement; + Node left; + Node right; + Node center; + Node parent; + int depth; + + public Node(final String s, final Node p) + { + statement = s + "\n"; + left = null; + right = null; + center = null; + parent = p; + if(p != null) depth = p.depth + 1; + else depth = 0; + } + + @Override + public String toString() + { + String returnVal = this.depth + ": " + this.statement; + + if(this.left != null) returnVal += "... " + this.left.toString(); + if(this.center != null) returnVal += "... " + this.center.toString(); + if(this.right != null) returnVal += "... " + this.right.toString(); + + return returnVal; + } +} \ No newline at end of file diff --git a/services/src/main/java/edu/msudenver/tsp/services/parser/ParserService.java b/services/src/main/java/edu/msudenver/tsp/services/parser/ParserService.java index 747521d..ca24a9b 100644 --- a/services/src/main/java/edu/msudenver/tsp/services/parser/ParserService.java +++ b/services/src/main/java/edu/msudenver/tsp/services/parser/ParserService.java @@ -7,12 +7,15 @@ import edu.msudenver.tsp.persistence.controller.TheoremController; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.ArrayList; + @Service class ParserService { private final DefinitionController definitionController; private final TheoremController theoremController; private final NotationController notationController; private final ProofController proofController; + Node root; @Autowired public ParserService(final DefinitionController definitionController, final TheoremController theoremController, @@ -23,4 +26,109 @@ class ParserService { this.proofController = proofController; } + public void driveParsingProcess(final String userInput) + { + final Node tree; + ArrayList statements = new ArrayList<>(); + + tree = parseRawInput(userInput); + statements = retrieveStatements(tree); + retrieveDefinitions(statements); + } + + public Node parseRawInput(String input) + { + // convert to the same case for easier processing + input = input.toLowerCase(); + + root = new Node(input, null); + + // special case: nothing is submitted + if(input.equals("")) + { + return root; + } + + // eliminate periods at the end of the input + if(input.charAt(input.length()-1) == '.') + { + input = input.substring(0, input.length()-1); + } + + recurse(root); + + return root; + } + + private void recurse(final Node current) + { + int iContain; + + if(current.statement.contains("let")) + { + current.left = new Node("let", + current); + iContain = (current.statement.contains("if") ? current.statement.indexOf("if") : current.statement.length()); + + current.left.center = new Node(current.statement.substring(current.statement.indexOf("let")+3, + iContain), + current.left); + recurse(current.left.center); + } + + + if(current.statement.contains("if")) + { + current.center = new Node("if", + current); + iContain = (current.statement.contains("then") ? current.statement.indexOf("then") : current.statement.length()); + + current.center.center = new Node(current.statement.substring(current.statement.indexOf("if")+2, + iContain), + current.center); + recurse(current.center.center); + } + + + if(current.statement.contains("then")) + { + current.right = new Node("then", + current); + current.right.center = new Node(current.statement.substring(current.statement.indexOf("then")+4), + current.right); + recurse(current.right.center); + } + } + + public ArrayList retrieveStatements(final Node parsedTree) + { + ArrayList statementList = new ArrayList<>(); + + statementList = traverse(parsedTree, statementList); + + return statementList; + } + + private ArrayList traverse(final Node node, final ArrayList statementList) + { + if(node == null) return statementList; + + if(!(node.statement.contains("let") || node.statement.contains("if") || node.statement.contains("then"))) + { + statementList.add(node.statement.trim()); + } + + traverse(node.left, statementList); + + traverse(node.center, statementList); + + traverse(node.right, statementList); + + return statementList; + } + + public void retrieveDefinitions(final ArrayList list) + { + // stub + } } diff --git a/services/src/test/java/edu/msudenver/tsp/services/parser/ParserServiceTest.java b/services/src/test/java/edu/msudenver/tsp/services/parser/ParserServiceTest.java index 1ae6e5e..0d007c8 100644 --- a/services/src/test/java/edu/msudenver/tsp/services/parser/ParserServiceTest.java +++ b/services/src/test/java/edu/msudenver/tsp/services/parser/ParserServiceTest.java @@ -1,17 +1,83 @@ package edu.msudenver.tsp.services.parser; +import edu.msudenver.tsp.persistence.controller.DefinitionController; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; +import java.util.ArrayList; + import static org.junit.Assert.assertEquals; +import static org.mockito.Matchers.anyString; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public class ParserServiceTest { + @Mock + DefinitionController definitionControllerMock = mock(DefinitionController.class); + + @Mock + ParserService mps = mock(ParserService.class); + + ParserService ps = new ParserService(definitionControllerMock, null, + null, null); + @Test - public void test() { - assertEquals(3,3); + public void testEmptyStringEqualsEmptyString() { + assertEquals("0: \n", ps.parseRawInput("").toString()); } + @Test + public void testUselessStringEqualsUselessString() { + assertEquals("0: cat\n", ps.parseRawInput("cat").toString()); + } + + @Test + public void testSingleIfReturnsIfPlusEmptyString() { + assertEquals("0: if\n... 1: if\n... 2: \n\n", ps.parseRawInput("if").toString()); + } + + @Test + public void testBaseCaseIfXIsEvenThenXSquaredIsEven() { + final String expected = "0: if x is even then x^2 is even\n" + + "... 1: if\n" + + "... 2: x is even \n" + + "... 1: then\n" + + "... 2: x^2 is even\n\n"; + + final String testCase = "if x is even then x^2 is even"; + + assertEquals(expected, ps.parseRawInput(testCase).toString()); + } + + @Test + public void testEmptyStringReturnsEmptyList() { + final ArrayList expectedList = new ArrayList<>(); + expectedList.add(""); + + + + when(mps.parseRawInput(anyString())).thenReturn(new Node("", null)); + + assertEquals(expectedList, ps.retrieveStatements(mps.parseRawInput(""))); + } + + @Test + public void testBaseCaseReturnsXIsEven() { + final ArrayList expectation = new ArrayList<>(); + expectation.add("x is even"); + expectation.add("x^2 is even"); + + ps.root = new Node("if x is even then x^2 is even", null); + ps.root.center = new Node("if", ps.root); + ps.root.center.center = new Node(" x is even ", ps.root.center); + ps.root.right = new Node("then", ps.root); + ps.root.right.center = new Node(" x^2 is even", ps.root.right); + when(mps.parseRawInput(anyString())).thenReturn(ps.root); + + assertEquals(expectation, ps.retrieveStatements(mps.parseRawInput("baseCase"))); + } } \ No newline at end of file From e47f2556f6514f08ae2397b2dc64d3a60882e023 Mon Sep 17 00:00:00 2001 From: BrittanyBi Date: Sun, 3 Mar 2019 18:51:11 -0700 Subject: [PATCH 02/15] PAN-10 code & tests. 100% coverage. Node class extracted from ParserService class. ParserConfig deleted because it wasn't being used. --- .../tsp/services/parser/ParserConfig.java | 11 ---- .../tsp/services/parser/ParserService.java | 27 ++++++---- .../services/parser/ParserServiceTest.java | 51 ++++++++++++++++++- 3 files changed, 66 insertions(+), 23 deletions(-) delete mode 100644 services/src/main/java/edu/msudenver/tsp/services/parser/ParserConfig.java diff --git a/services/src/main/java/edu/msudenver/tsp/services/parser/ParserConfig.java b/services/src/main/java/edu/msudenver/tsp/services/parser/ParserConfig.java deleted file mode 100644 index eb1c4f2..0000000 --- a/services/src/main/java/edu/msudenver/tsp/services/parser/ParserConfig.java +++ /dev/null @@ -1,11 +0,0 @@ -package edu.msudenver.tsp.services.parser; - -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; - -@Configuration -@ComponentScan -//@PropertySource("classpath:development.properties") -public class ParserConfig { - -} diff --git a/services/src/main/java/edu/msudenver/tsp/services/parser/ParserService.java b/services/src/main/java/edu/msudenver/tsp/services/parser/ParserService.java index ca24a9b..4bf6e49 100644 --- a/services/src/main/java/edu/msudenver/tsp/services/parser/ParserService.java +++ b/services/src/main/java/edu/msudenver/tsp/services/parser/ParserService.java @@ -29,7 +29,7 @@ class ParserService { public void driveParsingProcess(final String userInput) { final Node tree; - ArrayList statements = new ArrayList<>(); + final ArrayList statements; tree = parseRawInput(userInput); statements = retrieveStatements(tree); @@ -41,6 +41,12 @@ class ParserService { // convert to the same case for easier processing input = input.toLowerCase(); + // eliminate periods at the end of the input + /*if(input.charAt(input.length()-1) == '.') + { + input.substring(0, input.length()-1); + }*/ + root = new Node(input, null); // special case: nothing is submitted @@ -49,12 +55,6 @@ class ParserService { return root; } - // eliminate periods at the end of the input - if(input.charAt(input.length()-1) == '.') - { - input = input.substring(0, input.length()-1); - } - recurse(root); return root; @@ -68,7 +68,14 @@ class ParserService { { current.left = new Node("let", current); - iContain = (current.statement.contains("if") ? current.statement.indexOf("if") : current.statement.length()); + + if(current.statement.contains("if")){ + iContain = current.statement.indexOf("if"); + } else if(current.statement.contains("then")){ + iContain = current.statement.indexOf("then"); + } else { + iContain = current.statement.length(); + } current.left.center = new Node(current.statement.substring(current.statement.indexOf("let")+3, iContain), @@ -102,9 +109,9 @@ class ParserService { public ArrayList retrieveStatements(final Node parsedTree) { - ArrayList statementList = new ArrayList<>(); + final ArrayList statementList = new ArrayList<>(); - statementList = traverse(parsedTree, statementList); + traverse(parsedTree, statementList); return statementList; } diff --git a/services/src/test/java/edu/msudenver/tsp/services/parser/ParserServiceTest.java b/services/src/test/java/edu/msudenver/tsp/services/parser/ParserServiceTest.java index 0d007c8..e2d32ed 100644 --- a/services/src/test/java/edu/msudenver/tsp/services/parser/ParserServiceTest.java +++ b/services/src/test/java/edu/msudenver/tsp/services/parser/ParserServiceTest.java @@ -53,13 +53,50 @@ public class ParserServiceTest { assertEquals(expected, ps.parseRawInput(testCase).toString()); } + @Test + public void testLetXBeEvenThenXSquaredIsEven() { + final String expected = "0: let x be even. then x^2 is even.\n" + + "... 1: let\n" + + "... 2: x be even. \n" + + "... 1: then\n" + + "... 2: x^2 is even.\n\n"; + + final String testCase = "Let x be even. Then x^2 is even."; + + assertEquals(expected, ps.parseRawInput(testCase).toString()); + } + + @Test + public void testLetIfThen() { + final String expected = "0: let a. if b, then c.\n" + + "... 1: let\n" + + "... 2: a. \n" + + "... 1: if\n" + + "... 2: b, \n" + + "... 1: then\n" + + "... 2: c.\n\n"; + + final String testCase = "Let a. If b, then c."; + + assertEquals(expected, ps.parseRawInput(testCase).toString()); + } + + @Test + public void testLetAlone() { + final String expected = "0: let a be equal to b.\n" + + "... 1: let\n" + + "... 2: a be equal to b.\n\n"; + + final String testCase = "Let a be equal to b."; + + assertEquals(expected, ps.parseRawInput(testCase).toString()); + } + @Test public void testEmptyStringReturnsEmptyList() { final ArrayList expectedList = new ArrayList<>(); expectedList.add(""); - - when(mps.parseRawInput(anyString())).thenReturn(new Node("", null)); assertEquals(expectedList, ps.retrieveStatements(mps.parseRawInput(""))); @@ -80,4 +117,14 @@ public class ParserServiceTest { assertEquals(expectation, ps.retrieveStatements(mps.parseRawInput("baseCase"))); } + + @Test + public void testDriveParsingProcess() { + mps.root = new Node("", null); + final ArrayList testdummy = new ArrayList<>(); + when(mps.parseRawInput(anyString())).thenReturn(mps.root); + when(mps.retrieveStatements(mps.root)).thenReturn(testdummy); + + ps.driveParsingProcess(""); + } } \ No newline at end of file From cbaea65b5653c4dfff43d271acfa95c0ee582ec8 Mon Sep 17 00:00:00 2001 From: BrittanyBi Date: Sun, 3 Mar 2019 18:58:34 -0700 Subject: [PATCH 03/15] PAN-10 travis.yml update --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8faab01..f7ce2ec 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,8 +13,7 @@ addons: - mysql-client before_install: - - chmod +x pandamonium-theorem-prover/gradlew - - cd pandamonium-theorem-prover + - chmod +x gradlew before_script: - mysql_upgrade --force -uroot From e4594dc9009546cde0f58adca9fd3d12c82324b9 Mon Sep 17 00:00:00 2001 From: BrittanyBi Date: Sun, 3 Mar 2019 19:01:01 -0700 Subject: [PATCH 04/15] PAN-10 deleted commented-out code --- .../edu/msudenver/tsp/services/parser/ParserService.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/services/src/main/java/edu/msudenver/tsp/services/parser/ParserService.java b/services/src/main/java/edu/msudenver/tsp/services/parser/ParserService.java index 4bf6e49..98e6c6a 100644 --- a/services/src/main/java/edu/msudenver/tsp/services/parser/ParserService.java +++ b/services/src/main/java/edu/msudenver/tsp/services/parser/ParserService.java @@ -41,12 +41,6 @@ class ParserService { // convert to the same case for easier processing input = input.toLowerCase(); - // eliminate periods at the end of the input - /*if(input.charAt(input.length()-1) == '.') - { - input.substring(0, input.length()-1); - }*/ - root = new Node(input, null); // special case: nothing is submitted From fae060e0395035d290fefad7a68f59332a1a0a52 Mon Sep 17 00:00:00 2001 From: Alex Tusa <41128169+atusa17@users.noreply.github.com> Date: Mon, 4 Mar 2019 17:57:37 -0700 Subject: [PATCH 05/15] Update README.md --- README.md | 50 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index dc1251a..34d5ce3 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,50 @@ # Pandamonium Theorem Prover -This is the main repository for the Technical Software Project +This project contains several different modules for different parts of the system. + +* [psersistence](persistence/README.md) +* [web-server](src/README.md) + +## Getting Started + +1. Clone the project. `git clone git@github.com:atusa17/tsp.git` +2. Open the `pandamonium-theorem-prover` folder with IntelliJ. Use auto-import for a Gradle project. +3. Individual Components have their own README. Continue there. + +## Running the Tests + +This project is unit tested with JUnit and Mockito. You can run the unit tests with IntelliJ or Gradle. To run them with IntelliJ, browse to any `*Test.java` file and use IntelliJ's built-in test runner to run or debug the test. To run all the unit tests with Gradle: + +* On a Linux or Macintosh machine: + $ ./gradlew test +* On a Windows machine: + $ gradlew.bat test + +You can also test modules individually: + +* On a Linux or Macintosh machine: + + $ ./gradlew persistence:test + +* On a Windows machine: + + $ gradlew.bat persistence:test + +## Integration Tests + +To run the integration tests with IntelliJ, browse to any `*Test.java` file residing in any module name `integrationTest` and use IntelliJ's built-in test runner to run or debug the test. To run all the integration tests with Gradle: + +* On a Linux or Macintosh machine: + + $ ./gradlew integrationTest + +* On a Windows machine + + $ gradlew.bat integrationTest + +## Built with + +* [Spring Boot](https://projects.spring.io/spring-boot/) - Web framework +* [Spring Web Flow](https://projects.spring.io/spring-webflow/) - MVC framework +* [Gradle](https://gradle.org/) - Dependency management +* [JUnit](http://junit.org/junit4/) - Unit tests +* [Mockito](http://site.mockito.org/) - Mock objects library From b154648fdfb759a334c27f321a206e93adb94e99 Mon Sep 17 00:00:00 2001 From: Alex Tusa <41128169+atusa17@users.noreply.github.com> Date: Mon, 4 Mar 2019 17:59:00 -0700 Subject: [PATCH 06/15] Update README.md --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 34d5ce3..43c138b 100644 --- a/README.md +++ b/README.md @@ -15,19 +15,19 @@ This project contains several different modules for different parts of the syste This project is unit tested with JUnit and Mockito. You can run the unit tests with IntelliJ or Gradle. To run them with IntelliJ, browse to any `*Test.java` file and use IntelliJ's built-in test runner to run or debug the test. To run all the unit tests with Gradle: * On a Linux or Macintosh machine: - $ ./gradlew test + $ ./gradlew test * On a Windows machine: - $ gradlew.bat test + $ gradlew.bat test You can also test modules individually: * On a Linux or Macintosh machine: - $ ./gradlew persistence:test + $ ./gradlew persistence:test * On a Windows machine: - $ gradlew.bat persistence:test + $ gradlew.bat persistence:test ## Integration Tests @@ -35,11 +35,11 @@ To run the integration tests with IntelliJ, browse to any `*Test.java` file resi * On a Linux or Macintosh machine: - $ ./gradlew integrationTest + $ ./gradlew integrationTest * On a Windows machine - $ gradlew.bat integrationTest + $ gradlew.bat integrationTest ## Built with From 953f8d807cb25965204ecbd698e9692ff4f299d1 Mon Sep 17 00:00:00 2001 From: Alex Tusa <41128169+atusa17@users.noreply.github.com> Date: Mon, 4 Mar 2019 18:01:24 -0700 Subject: [PATCH 07/15] Update README.md --- README.md | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 43c138b..9141861 100644 --- a/README.md +++ b/README.md @@ -15,19 +15,22 @@ This project contains several different modules for different parts of the syste This project is unit tested with JUnit and Mockito. You can run the unit tests with IntelliJ or Gradle. To run them with IntelliJ, browse to any `*Test.java` file and use IntelliJ's built-in test runner to run or debug the test. To run all the unit tests with Gradle: * On a Linux or Macintosh machine: - $ ./gradlew test + + ```$ ./gradlew test``` + * On a Windows machine: - $ gradlew.bat test + + ```$ gradlew.bat test``` You can also test modules individually: * On a Linux or Macintosh machine: - $ ./gradlew persistence:test + ```$ ./gradlew persistence:test``` * On a Windows machine: - $ gradlew.bat persistence:test + ```$ gradlew.bat persistence:test``` ## Integration Tests @@ -35,11 +38,11 @@ To run the integration tests with IntelliJ, browse to any `*Test.java` file resi * On a Linux or Macintosh machine: - $ ./gradlew integrationTest + ```$ ./gradlew integrationTest``` * On a Windows machine - $ gradlew.bat integrationTest + ```$ gradlew.bat integrationTest``` ## Built with From f2498f4bda3180785bb772d5ce35a8331f0927e8 Mon Sep 17 00:00:00 2001 From: Alex Tusa <41128169+atusa17@users.noreply.github.com> Date: Mon, 4 Mar 2019 18:01:52 -0700 Subject: [PATCH 08/15] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9141861..aa68281 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Pandamonium Theorem Prover This project contains several different modules for different parts of the system. -* [psersistence](persistence/README.md) +* [persistence](persistence/README.md) * [web-server](src/README.md) ## Getting Started From 0b6e18b795b6c6af22eab9b67340c3d8b9b83d24 Mon Sep 17 00:00:00 2001 From: Alex Tusa <41128169+atusa17@users.noreply.github.com> Date: Mon, 4 Mar 2019 18:12:33 -0700 Subject: [PATCH 09/15] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index aa68281..1f5edb6 100644 --- a/README.md +++ b/README.md @@ -51,3 +51,4 @@ To run the integration tests with IntelliJ, browse to any `*Test.java` file resi * [Gradle](https://gradle.org/) - Dependency management * [JUnit](http://junit.org/junit4/) - Unit tests * [Mockito](http://site.mockito.org/) - Mock objects library +* [Lombok](https://projectlombok.org/) - Boilerplate Code Generator From 0167ac1a11e4b1aeb5efd79f137289dfde3daf11 Mon Sep 17 00:00:00 2001 From: Alex Tusa <41128169+atusa17@users.noreply.github.com> Date: Mon, 4 Mar 2019 18:13:36 -0700 Subject: [PATCH 10/15] Create README.md --- persistence/README.md | 61 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 persistence/README.md diff --git a/persistence/README.md b/persistence/README.md new file mode 100644 index 0000000..4258ce9 --- /dev/null +++ b/persistence/README.md @@ -0,0 +1,61 @@ +## PTP Persistence API + +The PTP Persistence API is the web API for accessing the theorems database. + + + +## Running from IntelliJ + +* Create a new run configuration in IntelliJ. + + ``` + Name: "PTP Persistence API Tomcat" + Application Server: Tomcat (8.5.12) + HTTP Port: 8090 + JMX Port: 1090 + Deployment tabe: Deploy persistence-api.war (exploded) + ``` +## Running the Tests + +This project is unit tested with JUnit and Mockito. You can run the unit tests with IntelliJ or Gradle. To run them with IntelliJ, browse to any `*Test.java` file and use IntelliJ's built-in test runner to run or debug the test. To run all the unit tests with Gradle: + +* On a Linux or Macintosh machine: + + ```$ ./gradlew test``` + +* On a Windows machine: + + ```$ gradlew.bat test``` + +You can also test modules individually: + +* On a Linux or Macintosh machine: + + ```$ ./gradlew persistence:test``` + +* On a Windows machine: + + ```$ gradlew.bat persistence:test``` + +## Integration Tests + +To run the integration tests with IntelliJ, browse to any `*Test.java` file residing in any module name `integrationTest` and use IntelliJ's built-in test runner to run or debug the test. To run all the integration tests with Gradle: + +* On a Linux or Macintosh machine: + + ```$ ./gradlew integrationTest``` + +* On a Windows machine + + ```$ gradlew.bat integrationTest``` + +## Built with + +* [Spring Boot](https://projects.spring.io/spring-boot/) - Web framework +* [Spring Web Flow](https://projects.spring.io/spring-webflow/) - MVC framework +* [Spring Data](https://spring.io/projects/spring-data/) - Persistence framework +* [Gradle](https://gradle.org/) - Dependency management +* [JUnit](http://junit.org/junit4/) - Unit tests +* [Mockito](http://site.mockito.org/) - Mock objects library +* [Lombok](https://projectlombok.org/) - Boilerplate Code Generator +* [Hibernate ORM](http://hibernate.org/orm/) - Object/Relational Mapping From 27e56039f48c0b1d4f396693e6e34ebfa6710abc Mon Sep 17 00:00:00 2001 From: Alex Tusa <41128169+atusa17@users.noreply.github.com> Date: Mon, 4 Mar 2019 18:15:22 -0700 Subject: [PATCH 11/15] Create README.md --- src/README.md | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/README.md diff --git a/src/README.md b/src/README.md new file mode 100644 index 0000000..6ee4af6 --- /dev/null +++ b/src/README.md @@ -0,0 +1,58 @@ +## PTP Persistence API + +The PTP Persistence API is the web API for accessing the theorems database. + + + +## Running from IntelliJ + +* Create a new run configuration in IntelliJ. + + ``` + Name: "Pandamonium Theorem Prover Tomcat" + Application Server: Tomcat (8.5.12) + HTTP Port: 8080 + JMX Port: 1080 + Deployment tabe: Deploy pandamonium-theorem-prover.war (exploded) + ``` +## Running the Tests + +This project is unit tested with JUnit and Mockito. You can run the unit tests with IntelliJ or Gradle. To run them with IntelliJ, browse to any `*Test.java` file and use IntelliJ's built-in test runner to run or debug the test. To run all the unit tests with Gradle: + +* On a Linux or Macintosh machine: + + ```$ ./gradlew test``` + +* On a Windows machine: + + ```$ gradlew.bat test``` + +You can also test modules individually: + +* On a Linux or Macintosh machine: + + ```$ ./gradlew persistence:test``` + +* On a Windows machine: + + ```$ gradlew.bat persistence:test``` + +## Integration Tests + +To run the integration tests with IntelliJ, browse to any `*Test.java` file residing in any module name `integrationTest` and use IntelliJ's built-in test runner to run or debug the test. To run all the integration tests with Gradle: + +* On a Linux or Macintosh machine: + + ```$ ./gradlew integrationTest``` + +* On a Windows machine + + ```$ gradlew.bat integrationTest``` + +## Built with + +* [Spring Boot](https://projects.spring.io/spring-boot/) - Web framework +* [Gradle](https://gradle.org/) - Dependency management +* [JUnit](http://junit.org/junit4/) - Unit tests +* [Mockito](http://site.mockito.org/) - Mock objects library +* [Lombok](https://projectlombok.org/) - Boilerplate Code Generator From 6f5bbab5ac46e33855bf15032929daef378490d7 Mon Sep 17 00:00:00 2001 From: BrittanyBi Date: Mon, 4 Mar 2019 21:23:45 -0700 Subject: [PATCH 12/15] PAN-10 Corrected many styling errors which required little refactoring. --- .../msudenver/tsp/services/parser/Node.java | 16 ++-- .../tsp/services/parser/ParserService.java | 43 ++++------ .../services/parser/ParserServiceTest.java | 86 +++++++++++-------- 3 files changed, 79 insertions(+), 66 deletions(-) diff --git a/services/src/main/java/edu/msudenver/tsp/services/parser/Node.java b/services/src/main/java/edu/msudenver/tsp/services/parser/Node.java index 8f9893f..2cf31d8 100644 --- a/services/src/main/java/edu/msudenver/tsp/services/parser/Node.java +++ b/services/src/main/java/edu/msudenver/tsp/services/parser/Node.java @@ -9,15 +9,21 @@ public class Node Node parent; int depth; - public Node(final String s, final Node p) + public Node(final String statement, final Node parent) { - statement = s + "\n"; + this.statement = statement + "\n"; left = null; right = null; center = null; - parent = p; - if(p != null) depth = p.depth + 1; - else depth = 0; + this.parent = parent; + if(parent != null) + { + depth = parent.depth + 1; + } + else + { + depth = 0; + } } @Override diff --git a/services/src/main/java/edu/msudenver/tsp/services/parser/ParserService.java b/services/src/main/java/edu/msudenver/tsp/services/parser/ParserService.java index 98e6c6a..d440fb6 100644 --- a/services/src/main/java/edu/msudenver/tsp/services/parser/ParserService.java +++ b/services/src/main/java/edu/msudenver/tsp/services/parser/ParserService.java @@ -15,7 +15,7 @@ class ParserService { private final TheoremController theoremController; private final NotationController notationController; private final ProofController proofController; - Node root; + private Node root; @Autowired public ParserService(final DefinitionController definitionController, final TheoremController theoremController, @@ -26,24 +26,24 @@ class ParserService { this.proofController = proofController; } - public void driveParsingProcess(final String userInput) + public boolean parseUserInput(final String userInput) { - final Node tree; - final ArrayList statements; + try { + final Node tree = parseRawInput(userInput); + final ArrayList statements = retrieveStatements(tree); - tree = parseRawInput(userInput); - statements = retrieveStatements(tree); - retrieveDefinitions(statements); + return true; + } catch(final Exception e) { + return false; + } } public Node parseRawInput(String input) { - // convert to the same case for easier processing input = input.toLowerCase(); root = new Node(input, null); - // special case: nothing is submitted if(input.equals("")) { return root; @@ -56,7 +56,7 @@ class ParserService { private void recurse(final Node current) { - int iContain; + int wordBeginsHere; if(current.statement.contains("let")) { @@ -64,15 +64,15 @@ class ParserService { current); if(current.statement.contains("if")){ - iContain = current.statement.indexOf("if"); + wordBeginsHere = current.statement.indexOf("if"); } else if(current.statement.contains("then")){ - iContain = current.statement.indexOf("then"); + wordBeginsHere = current.statement.indexOf("then"); } else { - iContain = current.statement.length(); + wordBeginsHere = current.statement.length(); } - current.left.center = new Node(current.statement.substring(current.statement.indexOf("let")+3, - iContain), + current.left.center = new Node(current.statement.substring(current.statement.indexOf("let")+"let".length(), + wordBeginsHere), current.left); recurse(current.left.center); } @@ -82,10 +82,10 @@ class ParserService { { current.center = new Node("if", current); - iContain = (current.statement.contains("then") ? current.statement.indexOf("then") : current.statement.length()); + wordBeginsHere = (current.statement.contains("then") ? current.statement.indexOf("then") : current.statement.length()); - current.center.center = new Node(current.statement.substring(current.statement.indexOf("if")+2, - iContain), + current.center.center = new Node(current.statement.substring(current.statement.indexOf("if")+"if".length(), + wordBeginsHere), current.center); recurse(current.center.center); } @@ -95,7 +95,7 @@ class ParserService { { current.right = new Node("then", current); - current.right.center = new Node(current.statement.substring(current.statement.indexOf("then")+4), + current.right.center = new Node(current.statement.substring(current.statement.indexOf("then")+"then".length()), current.right); recurse(current.right.center); } @@ -127,9 +127,4 @@ class ParserService { return statementList; } - - public void retrieveDefinitions(final ArrayList list) - { - // stub - } } diff --git a/services/src/test/java/edu/msudenver/tsp/services/parser/ParserServiceTest.java b/services/src/test/java/edu/msudenver/tsp/services/parser/ParserServiceTest.java index e2d32ed..9cd2005 100644 --- a/services/src/test/java/edu/msudenver/tsp/services/parser/ParserServiceTest.java +++ b/services/src/test/java/edu/msudenver/tsp/services/parser/ParserServiceTest.java @@ -3,12 +3,13 @@ package edu.msudenver.tsp.services.parser; import edu.msudenver.tsp.persistence.controller.DefinitionController; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.Mock; +import org.mockito.InjectMocks; import org.mockito.runners.MockitoJUnitRunner; import java.util.ArrayList; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -16,28 +17,35 @@ import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public class ParserServiceTest { - @Mock - DefinitionController definitionControllerMock = mock(DefinitionController.class); + private final DefinitionController definitionControllerMock = mock(DefinitionController.class); + private final ParserService mockParserService = mock(ParserService.class); - @Mock - ParserService mps = mock(ParserService.class); - - ParserService ps = new ParserService(definitionControllerMock, null, + @InjectMocks + private final ParserService parserService = new ParserService(definitionControllerMock, null, null, null); @Test public void testEmptyStringEqualsEmptyString() { - assertEquals("0: \n", ps.parseRawInput("").toString()); + final String expected = "0: \n"; + final String actual = parserService.parseRawInput("").toString(); + + assertEquals(expected, actual); } @Test public void testUselessStringEqualsUselessString() { - assertEquals("0: cat\n", ps.parseRawInput("cat").toString()); + final String expected = "0: cat\n"; + final String actual = parserService.parseRawInput("cat").toString(); + + assertEquals(expected, actual); } @Test public void testSingleIfReturnsIfPlusEmptyString() { - assertEquals("0: if\n... 1: if\n... 2: \n\n", ps.parseRawInput("if").toString()); + final String expected = "0: if\n... 1: if\n... 2: \n\n"; + final String actual = parserService.parseRawInput("if").toString(); + + assertEquals(expected, actual); } @Test @@ -48,9 +56,9 @@ public class ParserServiceTest { "... 1: then\n" + "... 2: x^2 is even\n\n"; - final String testCase = "if x is even then x^2 is even"; + final String actual = parserService.parseRawInput("if x is even then x^2 is even").toString(); - assertEquals(expected, ps.parseRawInput(testCase).toString()); + assertEquals(expected, actual); } @Test @@ -61,9 +69,9 @@ public class ParserServiceTest { "... 1: then\n" + "... 2: x^2 is even.\n\n"; - final String testCase = "Let x be even. Then x^2 is even."; + final String actual = parserService.parseRawInput("Let x be even. Then x^2 is even.").toString(); - assertEquals(expected, ps.parseRawInput(testCase).toString()); + assertEquals(expected, actual); } @Test @@ -76,20 +84,20 @@ public class ParserServiceTest { "... 1: then\n" + "... 2: c.\n\n"; - final String testCase = "Let a. If b, then c."; + final String actual = parserService.parseRawInput("Let a. If b, then c.").toString(); - assertEquals(expected, ps.parseRawInput(testCase).toString()); + assertEquals(expected, actual); } @Test - public void testLetAlone() { + public void testLetStatementWithoutAnyIfOrThenStatements() { final String expected = "0: let a be equal to b.\n" + "... 1: let\n" + "... 2: a be equal to b.\n\n"; - final String testCase = "Let a be equal to b."; + final String actual = parserService.parseRawInput("Let a be equal to b.").toString(); - assertEquals(expected, ps.parseRawInput(testCase).toString()); + assertEquals(expected, actual); } @Test @@ -97,34 +105,38 @@ public class ParserServiceTest { final ArrayList expectedList = new ArrayList<>(); expectedList.add(""); - when(mps.parseRawInput(anyString())).thenReturn(new Node("", null)); + when(mockParserService.parseRawInput(anyString())).thenReturn(new Node("", null)); + final ArrayList actualList = parserService.retrieveStatements(mockParserService.parseRawInput("")); - assertEquals(expectedList, ps.retrieveStatements(mps.parseRawInput(""))); + assertEquals(expectedList, actualList); } @Test public void testBaseCaseReturnsXIsEven() { - final ArrayList expectation = new ArrayList<>(); - expectation.add("x is even"); - expectation.add("x^2 is even"); + final ArrayList expectedList = new ArrayList<>(); + expectedList.add("x is even"); + expectedList.add("x^2 is even"); - ps.root = new Node("if x is even then x^2 is even", null); - ps.root.center = new Node("if", ps.root); - ps.root.center.center = new Node(" x is even ", ps.root.center); - ps.root.right = new Node("then", ps.root); - ps.root.right.center = new Node(" x^2 is even", ps.root.right); - when(mps.parseRawInput(anyString())).thenReturn(ps.root); + final Node testNode = new Node("if x is even then x^2 is even", null); + testNode.center = new Node("if", testNode); + testNode.center.center = new Node(" x is even ", testNode.center); + testNode.right = new Node("then", testNode); + testNode.right.center = new Node(" x^2 is even", testNode.right); - assertEquals(expectation, ps.retrieveStatements(mps.parseRawInput("baseCase"))); + when(mockParserService.parseRawInput(anyString())).thenReturn(testNode); + final ArrayList actualList = parserService.retrieveStatements(mockParserService.parseRawInput("baseCase")); + + assertEquals(expectedList, actualList); } @Test - public void testDriveParsingProcess() { - mps.root = new Node("", null); - final ArrayList testdummy = new ArrayList<>(); - when(mps.parseRawInput(anyString())).thenReturn(mps.root); - when(mps.retrieveStatements(mps.root)).thenReturn(testdummy); + public void testDriveParseUserInput() { + final Node testNode = new Node("", null); + when(mockParserService.parseRawInput(anyString())).thenReturn(testNode); + when(mockParserService.retrieveStatements(testNode)).thenReturn(new ArrayList<>()); - ps.driveParsingProcess(""); + final boolean successfulTestDrive = parserService.parseUserInput(""); + + assertTrue(successfulTestDrive); } } \ No newline at end of file From 357e9b23cce433582406d03e6e6650775141211c Mon Sep 17 00:00:00 2001 From: BrittanyBi Date: Mon, 4 Mar 2019 22:24:27 -0700 Subject: [PATCH 13/15] PAN-10 Refactored direct access of fields to getter and setter methods. --- .../msudenver/tsp/services/parser/Node.java | 15 ++-- .../tsp/services/parser/ParserService.java | 76 +++++++++---------- .../services/parser/ParserServiceTest.java | 17 +++-- 3 files changed, 54 insertions(+), 54 deletions(-) diff --git a/services/src/main/java/edu/msudenver/tsp/services/parser/Node.java b/services/src/main/java/edu/msudenver/tsp/services/parser/Node.java index 2cf31d8..2b92dec 100644 --- a/services/src/main/java/edu/msudenver/tsp/services/parser/Node.java +++ b/services/src/main/java/edu/msudenver/tsp/services/parser/Node.java @@ -1,13 +1,16 @@ package edu.msudenver.tsp.services.parser; +import lombok.Getter; +import lombok.Setter; + public class Node { - String statement; - Node left; - Node right; - Node center; - Node parent; - int depth; + @Getter private final String statement; + @Getter @Setter private Node left; + @Getter @Setter private Node right; + @Getter @Setter private Node center; + @Getter private final Node parent; + @Getter private final int depth; public Node(final String statement, final Node parent) { diff --git a/services/src/main/java/edu/msudenver/tsp/services/parser/ParserService.java b/services/src/main/java/edu/msudenver/tsp/services/parser/ParserService.java index d440fb6..58e894d 100644 --- a/services/src/main/java/edu/msudenver/tsp/services/parser/ParserService.java +++ b/services/src/main/java/edu/msudenver/tsp/services/parser/ParserService.java @@ -8,6 +8,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; +import java.util.List; @Service class ParserService { @@ -30,7 +31,7 @@ class ParserService { { try { final Node tree = parseRawInput(userInput); - final ArrayList statements = retrieveStatements(tree); + final List statements = retrieveStatements(tree); return true; } catch(final Exception e) { @@ -58,72 +59,67 @@ class ParserService { { int wordBeginsHere; - if(current.statement.contains("let")) + if(current.getStatement().contains("let")) { - current.left = new Node("let", - current); + current.setLeft(new Node("let", current)); - if(current.statement.contains("if")){ - wordBeginsHere = current.statement.indexOf("if"); - } else if(current.statement.contains("then")){ - wordBeginsHere = current.statement.indexOf("then"); + if(current.getStatement().contains("if")){ + wordBeginsHere = current.getStatement().indexOf("if"); + } else if(current.getStatement().contains("then")){ + wordBeginsHere = current.getStatement().indexOf("then"); } else { - wordBeginsHere = current.statement.length(); + wordBeginsHere = current.getStatement().length(); } - current.left.center = new Node(current.statement.substring(current.statement.indexOf("let")+"let".length(), + current.getLeft().setCenter(new Node(current.getStatement().substring(current.getStatement().indexOf("let")+"let".length(), wordBeginsHere), - current.left); - recurse(current.left.center); + current.getLeft())); + recurse(current.getLeft().getCenter()); } - if(current.statement.contains("if")) + if(current.getStatement().contains("if")) { - current.center = new Node("if", - current); - wordBeginsHere = (current.statement.contains("then") ? current.statement.indexOf("then") : current.statement.length()); + current.setCenter(new Node("if", current)); + wordBeginsHere = (current.getStatement().contains("then") ? current.getStatement().indexOf("then") : current.getStatement().length()); - current.center.center = new Node(current.statement.substring(current.statement.indexOf("if")+"if".length(), + current.getCenter().setCenter(new Node(current.getStatement().substring(current.getStatement().indexOf("if")+"if".length(), wordBeginsHere), - current.center); - recurse(current.center.center); + current.getCenter())); + recurse(current.getCenter().getCenter()); } - if(current.statement.contains("then")) + if(current.getStatement().contains("then")) { - current.right = new Node("then", - current); - current.right.center = new Node(current.statement.substring(current.statement.indexOf("then")+"then".length()), - current.right); - recurse(current.right.center); + current.setRight(new Node("then", current)); + current.getRight().setCenter(new Node(current.getStatement().substring(current.getStatement().indexOf("then")+"then".length()), + current.getRight())); + recurse(current.getRight().getCenter()); } } - public ArrayList retrieveStatements(final Node parsedTree) + public List retrieveStatements(final Node parsedTree) { - final ArrayList statementList = new ArrayList<>(); - - traverse(parsedTree, statementList); - - return statementList; + return populateStatementList(parsedTree, new ArrayList<>()); } - private ArrayList traverse(final Node node, final ArrayList statementList) + private ArrayList populateStatementList(final Node node, final ArrayList statementList) { - if(node == null) return statementList; - - if(!(node.statement.contains("let") || node.statement.contains("if") || node.statement.contains("then"))) + if(node == null) { - statementList.add(node.statement.trim()); + return statementList; } - traverse(node.left, statementList); + final String statement = node.getStatement().trim(); + if(!(statement.contains("let") || statement.contains("if") || statement.contains("then"))) + { + statementList.add(statement); + } - traverse(node.center, statementList); - - traverse(node.right, statementList); + populateStatementList(node.getLeft(), statementList); + populateStatementList(node.getCenter(), statementList); + populateStatementList(node.getRight(), statementList); return statementList; } diff --git a/services/src/test/java/edu/msudenver/tsp/services/parser/ParserServiceTest.java b/services/src/test/java/edu/msudenver/tsp/services/parser/ParserServiceTest.java index 9cd2005..829a02a 100644 --- a/services/src/test/java/edu/msudenver/tsp/services/parser/ParserServiceTest.java +++ b/services/src/test/java/edu/msudenver/tsp/services/parser/ParserServiceTest.java @@ -7,6 +7,7 @@ import org.mockito.InjectMocks; import org.mockito.runners.MockitoJUnitRunner; import java.util.ArrayList; +import java.util.List; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -102,29 +103,29 @@ public class ParserServiceTest { @Test public void testEmptyStringReturnsEmptyList() { - final ArrayList expectedList = new ArrayList<>(); + final List expectedList = new ArrayList<>(); expectedList.add(""); when(mockParserService.parseRawInput(anyString())).thenReturn(new Node("", null)); - final ArrayList actualList = parserService.retrieveStatements(mockParserService.parseRawInput("")); + final List actualList = parserService.retrieveStatements(mockParserService.parseRawInput("")); assertEquals(expectedList, actualList); } @Test public void testBaseCaseReturnsXIsEven() { - final ArrayList expectedList = new ArrayList<>(); + final List expectedList = new ArrayList<>(); expectedList.add("x is even"); expectedList.add("x^2 is even"); final Node testNode = new Node("if x is even then x^2 is even", null); - testNode.center = new Node("if", testNode); - testNode.center.center = new Node(" x is even ", testNode.center); - testNode.right = new Node("then", testNode); - testNode.right.center = new Node(" x^2 is even", testNode.right); + testNode.setCenter(new Node("if", testNode)); + testNode.getCenter().setCenter(new Node(" x is even ", testNode.getCenter())); + testNode.setRight(new Node("then", testNode)); + testNode.getRight().setCenter(new Node(" x^2 is even", testNode.getRight())); when(mockParserService.parseRawInput(anyString())).thenReturn(testNode); - final ArrayList actualList = parserService.retrieveStatements(mockParserService.parseRawInput("baseCase")); + final List actualList = parserService.retrieveStatements(mockParserService.parseRawInput("baseCase")); assertEquals(expectedList, actualList); } From 2f5aef80925bd2e4d8aff7c443021059b99e696d Mon Sep 17 00:00:00 2001 From: BrittanyBi Date: Mon, 4 Mar 2019 23:00:26 -0700 Subject: [PATCH 14/15] PAN-10 ParserService.recurse() code refactored to be more readable. --- .../tsp/services/parser/ParserService.java | 48 ++++++++++++------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/services/src/main/java/edu/msudenver/tsp/services/parser/ParserService.java b/services/src/main/java/edu/msudenver/tsp/services/parser/ParserService.java index 58e894d..d8f8782 100644 --- a/services/src/main/java/edu/msudenver/tsp/services/parser/ParserService.java +++ b/services/src/main/java/edu/msudenver/tsp/services/parser/ParserService.java @@ -57,35 +57,46 @@ class ParserService { private void recurse(final Node current) { - int wordBeginsHere; + int startIndex; + int endIndex; + final String statement = current.getStatement(); + String nextStatement; - if(current.getStatement().contains("let")) + if(statement.equals("")) + { + return; + } + + if(statement.contains("let")) { current.setLeft(new Node("let", current)); - if(current.getStatement().contains("if")){ - wordBeginsHere = current.getStatement().indexOf("if"); - } else if(current.getStatement().contains("then")){ - wordBeginsHere = current.getStatement().indexOf("then"); + startIndex = statement.indexOf("let")+"let".length(); + + if(statement.contains("if")){ + endIndex = statement.indexOf("if"); + } else if(statement.contains("then")){ + endIndex = statement.indexOf("then"); } else { - wordBeginsHere = current.getStatement().length(); + endIndex = statement.length(); } - current.getLeft().setCenter(new Node(current.getStatement().substring(current.getStatement().indexOf("let")+"let".length(), - wordBeginsHere), - current.getLeft())); + nextStatement = statement.substring(startIndex, endIndex); + + current.getLeft().setCenter(new Node(nextStatement, current.getLeft())); recurse(current.getLeft().getCenter()); } - if(current.getStatement().contains("if")) + if(statement.contains("if")) { current.setCenter(new Node("if", current)); - wordBeginsHere = (current.getStatement().contains("then") ? current.getStatement().indexOf("then") : current.getStatement().length()); - current.getCenter().setCenter(new Node(current.getStatement().substring(current.getStatement().indexOf("if")+"if".length(), - wordBeginsHere), - current.getCenter())); + startIndex = statement.indexOf("if")+"if".length(); + endIndex = (statement.contains("then") ? statement.indexOf("then") : statement.length()); + nextStatement = statement.substring(startIndex, endIndex); + + current.getCenter().setCenter(new Node(nextStatement, current.getCenter())); recurse(current.getCenter().getCenter()); } @@ -93,8 +104,11 @@ class ParserService { if(current.getStatement().contains("then")) { current.setRight(new Node("then", current)); - current.getRight().setCenter(new Node(current.getStatement().substring(current.getStatement().indexOf("then")+"then".length()), - current.getRight())); + + startIndex = statement.indexOf("then")+"then".length(); + nextStatement = statement.substring(startIndex); + + current.getRight().setCenter(new Node(nextStatement, current.getRight())); recurse(current.getRight().getCenter()); } } From 103d09bb0e6a529ed1b866dd15e8a5ba29a7f295 Mon Sep 17 00:00:00 2001 From: atusa17 Date: Tue, 5 Mar 2019 11:48:18 -0700 Subject: [PATCH 15/15] PAN-10 added a null check to the recurse method --- .../tsp/services/parser/ParserService.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/services/src/main/java/edu/msudenver/tsp/services/parser/ParserService.java b/services/src/main/java/edu/msudenver/tsp/services/parser/ParserService.java index d8f8782..0106b8b 100644 --- a/services/src/main/java/edu/msudenver/tsp/services/parser/ParserService.java +++ b/services/src/main/java/edu/msudenver/tsp/services/parser/ParserService.java @@ -35,8 +35,9 @@ class ParserService { return true; } catch(final Exception e) { - return false; + e.printStackTrace(); } + return false; } public Node parseRawInput(String input) @@ -59,14 +60,16 @@ class ParserService { { int startIndex; int endIndex; - final String statement = current.getStatement(); - String nextStatement; + final String statement; - if(statement.equals("")) - { + if (current != null) { + statement = current.getStatement(); + } else { return; } + String nextStatement; + if(statement.contains("let")) { current.setLeft(new Node("let", current));