From 74b2917ea1fdbae6cacf17493e4d8e0d4824aab1 Mon Sep 17 00:00:00 2001 From: Brady Six Date: Thu, 15 Jun 2023 11:02:20 -0700 Subject: [PATCH 1/3] Add interface and junit implementation --- src/main/java/StringManipulation.java | 65 +++++++- src/test/java/StringManipulationTest.java | 182 +++++++++++++++++----- 2 files changed, 203 insertions(+), 44 deletions(-) diff --git a/src/main/java/StringManipulation.java b/src/main/java/StringManipulation.java index 4deb6f1..cdcf6c1 100644 --- a/src/main/java/StringManipulation.java +++ b/src/main/java/StringManipulation.java @@ -1,32 +1,85 @@ +import java.util.Arrays; + public class StringManipulation implements StringManipulationInterface { + private String string; + @Override public String getString() { - return null; + return this.string; } @Override public void setString(String string) { + this.string = string; } @Override public int count() { - return 0; + //If string is null or blank, return 0. + if(this.string == null || this.string.isBlank()) return 0; + /* + Otherwise, get the number of words in string, which are + separated by one or more whitespace characters. + */ + return string.split("[\\s\\r\\t\\n]+").length; } @Override public String removeNthCharacter(int n, boolean maintainSpacing) { - return null; + //check null string + if(this.string == null) return null; + // check n <= 0 + if(n <= 0) throw new IllegalArgumentException("N must be greater than 0"); + // check n > string string + if(n > this.string.length()) throw new IndexOutOfBoundsException("Index out of bounds"); + //edge cases + if(n == 1 && !maintainSpacing) return ""; + if(n == 1 && maintainSpacing) return this.string.replaceAll(".", " "); + + StringBuilder b = new StringBuilder(); + for(int i = 0; i < this.string.length(); i++) { + if((i+1) % n == 0) { + if(maintainSpacing) b.append(' '); + } else { + b.append(this.string.charAt(i)); + } + } + return b.toString(); } @Override - public String[] getSubStrings(int startWord, int endWord) { - return null; + public String[] getSubStrings(int startWord, int endWord){ + //check null string + if(this.string == null) return null; + //check startWord <= 0 + if(startWord <= 0) throw new IllegalArgumentException("startWord must be greater than zero"); + //check endWord <= 0 + if(endWord <= 0) throw new IllegalArgumentException("endWord must be greater than zero"); + //check startWord > endWord + if(startWord > endWord) throw new IllegalArgumentException("startWord cannot be larger than endWord"); + //check string.count() < endWord + if(this.count() < endWord) throw new IndexOutOfBoundsException("endWord cannot be larger than the total word count"); + + return Arrays.copyOfRange(this.string.split("[\\s\\r\\t\\n]+"), startWord-1, endWord); } @Override public String restoreString(int[] indices) { - return null; + //check null string + if(this.string == null) return null; + //check unequal lengths + if(this.string.length() != indices.length) throw new IllegalArgumentException("String length must match array length"); + //check valid indices + for(int i = 0; i < indices.length; i++) { + if(indices[i] < 0 || indices[i] >= this.string.length()) throw new IndexOutOfBoundsException("Invalid array index"); + } + //average case + StringBuilder b = new StringBuilder(); + for(int i = 0; i < indices.length; i++) { + b.append(this.string.charAt(indices[i])); + } + return b.toString(); } diff --git a/src/test/java/StringManipulationTest.java b/src/test/java/StringManipulationTest.java index 6692c2c..71e959d 100644 --- a/src/test/java/StringManipulationTest.java +++ b/src/test/java/StringManipulationTest.java @@ -19,6 +19,7 @@ public void tearDown() { manipulatedstring = null; } + //Many word case @Test public void testCount1() { manipulatedstring.setString("This is my string"); @@ -26,88 +27,185 @@ public void testCount1() { assertEquals(4, length); } + //Empty string case @Test public void testCount2() { - fail("Not yet implemented"); + manipulatedstring.setString(""); + int length = manipulatedstring.count(); + assertEquals(0, length); } + //Null string case @Test public void testCount3() { - fail("Not yet implemented"); + manipulatedstring.setString(null); //Not really needed (because string starts null), but kept for clarity. + int length = manipulatedstring.count(); + assertEquals(0, length); } + //One word case @Test public void testCount4() { - fail("Not yet implemented"); + manipulatedstring.setString("Supercalifragilisticexpialidocious"); + int length = manipulatedstring.count(); + assertEquals(1, length); + } + + //Only spaces case + @Test + public void testCount5() { + manipulatedstring.setString(" "); + int length = manipulatedstring.count(); + assertEquals(0, length); + } + + //Only tab case + @Test + public void testCount6() { + manipulatedstring.setString("\t\t\t"); + int length = manipulatedstring.count(); + assertEquals(0, length); + } + + //Only carriage return case + @Test + public void testCount7() { + manipulatedstring.setString("\r"); + int length = manipulatedstring.count(); + assertEquals(0, length); } + //Only newlines case + @Test + public void testCount8() { + manipulatedstring.setString("\n\n\n"); + int length = manipulatedstring.count(); + assertEquals(0, length); + } + + //Multiple spaces between words case + @Test + public void testCount9() { + manipulatedstring.setString("Lots of space between"); + int length = manipulatedstring.count(); + assertEquals(4, length); + } + + //Do not maintain spacing case @Test public void testRemoveNthCharacter1() { manipulatedstring.setString("I'd b3tt3r put s0me d161ts in this 5tr1n6, right?"); assertEquals("I' bttr uts0e 16tsinths trn6 rgh?", manipulatedstring.removeNthCharacter(3, false)); } + //Maintain spacing case @Test public void testRemoveNthCharacter2() { manipulatedstring.setString("I'd b3tt3r put s0me d161ts in this 5tr1n6, right?"); assertEquals("I' b tt r ut s0 e 16 ts in th s tr n6 r gh ?", manipulatedstring.removeNthCharacter(3, true)); } + //Throws IndexOutOfBoundsException when n larger than string length @Test public void testRemoveNthCharacter3() { - fail("Not yet implemented"); + manipulatedstring.setString("abcdef"); + Exception e = assertThrows(IndexOutOfBoundsException.class, () -> manipulatedstring.removeNthCharacter(7, false)); + assertEquals("Index out of bounds", e.getMessage()); } + //Throws IllegalArgumentException when n is negative @Test public void testRemoveNthCharacter4() { - fail("Not yet implemented"); + manipulatedstring.setString("foobar"); + Exception e = assertThrows(IllegalArgumentException.class, () -> manipulatedstring.removeNthCharacter(-2, false)); + assertEquals("N must be greater than 0", e.getMessage()); } + //Throws IllegalArgumentException when n is zero @Test public void testRemoveNthCharacter5() { - fail("Not yet implemented"); + manipulatedstring.setString("foobar"); + Exception e = assertThrows(IllegalArgumentException.class, () -> manipulatedstring.removeNthCharacter(0, false)); + assertEquals("N must be greater than 0", e.getMessage()); } + //n=1, do not maintain spacing case @Test public void testRemoveNthCharacter6() { - fail("Not yet implemented"); + manipulatedstring.setString("12345 6789"); + String result = manipulatedstring.removeNthCharacter(1, false); + int length = result.length(); + assertEquals(0, length); } + //n=1, maintain spacing case @Test public void testRemoveNthCharacter7() { - fail("Not yet implemented"); + manipulatedstring.setString("12345 6789"); + String result = manipulatedstring.removeNthCharacter(1, true); + int length = result.length(); + assertEquals(10, length); + } + + //null string case + @Test + public void testRemoveNthCharacter8() { + manipulatedstring.setString(null); + String s = manipulatedstring.removeNthCharacter(3, true); + assertNull(s); } + //Average case @Test - public void testGeSubStrings1() { + public void testGetSubStrings1() { manipulatedstring.setString("This is my string"); - String [] sStings = manipulatedstring.getSubStrings(3, 4); + String [] sStrings = manipulatedstring.getSubStrings(3, 4); - assertEquals(sStings[0], "my"); - assertEquals(sStings[1], "string"); + assertEquals(sStrings[0], "my"); + assertEquals(sStrings[1], "string"); } + //Throws IllegalArgumentException when startword <= 0 @Test - public void testGeSubStrings2() { - fail("Not yet implemented"); + public void testGetSubStrings2() { + manipulatedstring.setString("It's beginning to look a lot like Christmas"); + Exception e = assertThrows(IllegalArgumentException.class, () -> manipulatedstring.getSubStrings(-1, 3)); + assertEquals("startWord must be greater than zero", e.getMessage()); } + + //Throws IllegalArgumentException when endword <= 0 @Test - public void testGeSubStrings3() { - fail("Not yet implemented"); + public void testGetSubStrings3() { + manipulatedstring.setString("I used to wish I was, but I'm glad I'm not"); + Exception e = assertThrows(IllegalArgumentException.class, () -> manipulatedstring.getSubStrings(1, -3)); + assertEquals("endWord must be greater than zero", e.getMessage()); } + + //Throws IllegalArgumentException when startword > endword @Test - public void testGeSubStrings4() { - fail("Not yet implemented"); + public void testGetSubStrings4() { + manipulatedstring.setString("I know the roads to riches and I know the ways to fame"); + Exception e = assertThrows(IllegalArgumentException.class, () -> manipulatedstring.getSubStrings(7, 4)); + assertEquals("startWord cannot be larger than endWord", e.getMessage()); } + + //Throws IndexOutOfBoundsException when string.count() < endword @Test - public void testGeSubStrings5() { - fail("Not yet implemented"); + public void testGetSubStrings5() { + manipulatedstring.setString("Balloons are deflating"); + Exception e = assertThrows(IndexOutOfBoundsException.class, () -> manipulatedstring.getSubStrings(1, 4)); + assertEquals("endWord cannot be larger than the total word count", e.getMessage()); } + + //null string @Test - public void testGeSubStrings6() { - fail("Not yet implemented"); + public void testGetSubStrings6() { + manipulatedstring.setString(null); + String[] array = manipulatedstring.getSubStrings(2, 4); + assertNull(array); } + //Average case @Test public void testRestoreString1() { @@ -118,32 +216,40 @@ public void testRestoreString1() assertEquals(restoreString, "rat"); } + //unequal lengths case. Throws IllegalArgumentException @Test - public void testRestoreString2() - { - fail("Not yet implemented"); - + public void testRestoreString2() { + manipulatedstring.setString("extraordinary"); + int[] indices = {0,1,2,3,4}; + Exception e = assertThrows(IllegalArgumentException.class, () -> manipulatedstring.restoreString(indices)); + assertEquals("String length must match array length", e.getMessage()); } + //negative index. Throws IndexOutOfBoundsException @Test - public void testRestoreString3() - { - fail("Not yet implemented"); - + public void testRestoreString3() { + manipulatedstring.setString("tubular"); + int[] indices = {-1,2,3,4,5,6,7}; + Exception e = assertThrows(IndexOutOfBoundsException.class, () -> manipulatedstring.restoreString(indices)); + assertEquals("Invalid array index", e.getMessage()); } + //index > string length. Throws IndexOutOfBoundsException @Test - public void testRestoreString4() - { - fail("Not yet implemented"); - + public void testRestoreString4() { + manipulatedstring.setString("radical"); + int[] indices = {1,2,3,4,5,6,10}; + Exception e = assertThrows(IndexOutOfBoundsException.class, () -> manipulatedstring.restoreString(indices)); + assertEquals("Invalid array index", e.getMessage()); } + //null string @Test - public void testRestoreString5() - { - fail("Not yet implemented"); - + public void testRestoreString5() { + manipulatedstring.setString(null); + int[] indices = {1,2,3,4}; + String result = manipulatedstring.restoreString(indices); + assertNull(result); } } From 1fb8fb6377008758c05f2f6cb53af945fd6f83c0 Mon Sep 17 00:00:00 2001 From: Brady Six Date: Mon, 19 Jun 2023 23:45:16 -0700 Subject: [PATCH 2/3] Remove split() regex redundancies --- src/main/java/StringManipulation.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/StringManipulation.java b/src/main/java/StringManipulation.java index cdcf6c1..0c837fa 100644 --- a/src/main/java/StringManipulation.java +++ b/src/main/java/StringManipulation.java @@ -18,11 +18,12 @@ public void setString(String string) { public int count() { //If string is null or blank, return 0. if(this.string == null || this.string.isBlank()) return 0; + /* Otherwise, get the number of words in string, which are separated by one or more whitespace characters. */ - return string.split("[\\s\\r\\t\\n]+").length; + return string.split("\\s+").length; } @Override @@ -61,7 +62,7 @@ public String[] getSubStrings(int startWord, int endWord){ //check string.count() < endWord if(this.count() < endWord) throw new IndexOutOfBoundsException("endWord cannot be larger than the total word count"); - return Arrays.copyOfRange(this.string.split("[\\s\\r\\t\\n]+"), startWord-1, endWord); + return Arrays.copyOfRange(this.string.split("\\s+"), startWord-1, endWord); } @Override From 696f3df695f4ea5f9db163f71aebb879ae222918 Mon Sep 17 00:00:00 2001 From: Brady Six Date: Mon, 19 Jun 2023 23:47:04 -0700 Subject: [PATCH 3/3] Add spaces between comments --- src/main/java/StringManipulation.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main/java/StringManipulation.java b/src/main/java/StringManipulation.java index 0c837fa..ce548ce 100644 --- a/src/main/java/StringManipulation.java +++ b/src/main/java/StringManipulation.java @@ -30,14 +30,20 @@ public int count() { public String removeNthCharacter(int n, boolean maintainSpacing) { //check null string if(this.string == null) return null; + // check n <= 0 if(n <= 0) throw new IllegalArgumentException("N must be greater than 0"); + // check n > string string if(n > this.string.length()) throw new IndexOutOfBoundsException("Index out of bounds"); + //edge cases if(n == 1 && !maintainSpacing) return ""; if(n == 1 && maintainSpacing) return this.string.replaceAll(".", " "); + // builds the string. every multiple of n is either + // replaced with whitespace or removed from the result, + // depending on the boolean value passed. StringBuilder b = new StringBuilder(); for(int i = 0; i < this.string.length(); i++) { if((i+1) % n == 0) { @@ -53,12 +59,16 @@ public String removeNthCharacter(int n, boolean maintainSpacing) { public String[] getSubStrings(int startWord, int endWord){ //check null string if(this.string == null) return null; + //check startWord <= 0 if(startWord <= 0) throw new IllegalArgumentException("startWord must be greater than zero"); + //check endWord <= 0 if(endWord <= 0) throw new IllegalArgumentException("endWord must be greater than zero"); + //check startWord > endWord if(startWord > endWord) throw new IllegalArgumentException("startWord cannot be larger than endWord"); + //check string.count() < endWord if(this.count() < endWord) throw new IndexOutOfBoundsException("endWord cannot be larger than the total word count"); @@ -69,12 +79,15 @@ public String[] getSubStrings(int startWord, int endWord){ public String restoreString(int[] indices) { //check null string if(this.string == null) return null; + //check unequal lengths if(this.string.length() != indices.length) throw new IllegalArgumentException("String length must match array length"); + //check valid indices for(int i = 0; i < indices.length; i++) { if(indices[i] < 0 || indices[i] >= this.string.length()) throw new IndexOutOfBoundsException("Invalid array index"); } + //average case StringBuilder b = new StringBuilder(); for(int i = 0; i < indices.length; i++) {