From 4b76f2eb69fa74a004addd5b6dfc287011af3f9b Mon Sep 17 00:00:00 2001 From: BrittanyBi Date: Sun, 3 Mar 2019 17:32:52 -0700 Subject: [PATCH 1/8] 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 2/8] 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 3/8] 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 4/8] 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 6f5bbab5ac46e33855bf15032929daef378490d7 Mon Sep 17 00:00:00 2001 From: BrittanyBi Date: Mon, 4 Mar 2019 21:23:45 -0700 Subject: [PATCH 5/8] 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 6/8] 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 7/8] 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 8/8] 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));