Skip to content
Snippets Groups Projects
Commit 2bb4bff1 authored by Christopher Bohn's avatar Christopher Bohn :thinking:
Browse files

Added vertical & horizontal center alignment

parent fa3a9267
No related branches found
No related tags found
No related merge requests found
...@@ -206,9 +206,9 @@ stringBox.placeString("foo\nbar baz",-1,-1); ...@@ -206,9 +206,9 @@ stringBox.placeString("foo\nbar baz",-1,-1);
If two inserted strings overlap, the string inserted last will overwrite a portion of the string written first: If two inserted strings overlap, the string inserted last will overwrite a portion of the string written first:
``` ```
stringBox.placeString("foo\nbar", Vertical.TOP, 2, Horizontal.LEFT, 10) stringBox.placeString("foo\nbar", Vertical.TOP, 2, Horizontal.LEFT, 10)
.placeString("larry\ncurly\nmoe", Vertical.BOTTOM, 5, Horizontal.LEFT, 6) .placeString("larry\ncurly\nmoe", Vertical.BOTTOM, 6, Horizontal.LEFT, 6)
.placeString("quux\nxyzzy", Vertical.TOP, 3, Horizontal.RIGHT, 20) .placeString("quux\nxyzzy", Vertical.TOP, 3, Horizontal.RIGHT, 20)
.placeString("one\ntwo\nthree", Vertical.BOTTOM, 10, Horizontal.RIGHT, 15); .placeString("one\ntwo\nthree", Vertical.BOTTOM, 11, Horizontal.RIGHT, 15);
``` ```
...@@ -302,11 +302,20 @@ Equivalent to `placeString(string, Vertical.TOP, topRow, Horizontal.LEFT, leftCo ...@@ -302,11 +302,20 @@ Equivalent to `placeString(string, Vertical.TOP, topRow, Horizontal.LEFT, leftCo
#### `public StringBox placeString(String string, Vertical verticalAlignment, int verticalPosition, Horizontal horizontalAlignment, int horizontalPosition)` #### `public StringBox placeString(String string, Vertical verticalAlignment, int verticalPosition, Horizontal horizontalAlignment, int horizontalPosition)`
Places a string in the StringBox. If `verticalAlignment` is `TOP` then the string's first line will be in the Places a string in the StringBox.
`verticalPosition`'th row, and each subsequent line will be in each subsequent row. If `verticalAlignment` is `BOTTOM`
then the string's last line will be in the `verticalPosition`'th row, and each preceding line will be in each preceding If `verticalAlignment` is `TOP` then the string's first line will be in the `verticalPosition`'th row, and each
row. If `horizontalAlignment` is `LEFT` then each line will be left-justified to the `horizontalPosition`'th column. If subsequent line will be in each subsequent row. If `verticalAlignment` is `BOTTOM` then the string's last line will be
`horizontalAlignment` is `RIGHT` then each line will be right-justified to the `horizontalPosition`'th column. in the row immediately preceding the `verticalPosition`'th row, and each preceding line will be in each preceding row.
If `horizontalAlignment` is `LEFT` then each line will be left-justified to the `horizontalPosition`'th column. If
`horizontalAlignment` is `RIGHT` then each line will be right-justified to the `horizontalPosition`'th column; that is,
the rightmost character will be immediately to the left of the `horizontalPosition`'th column.
In cases of `CENTER` alignment: if there are an odd number of lines then the center line will be on the
`verticalPosition`'th row. Similarly, if there are an odd number of characters in a line then the center character will
be in the `horizontalPosition`'th column. If there are an even number of rows (or characters) then the row (character)
immediately below (to the right of) the midpoint will be in the designated row (column).
* **Parameters:** * **Parameters:**
* `string` — the string to be placed in the StringBox * `string` — the string to be placed in the StringBox
......
...@@ -29,12 +29,12 @@ public class StringBox { ...@@ -29,12 +29,12 @@ public class StringBox {
/** /**
* Horizontal alignment directives * Horizontal alignment directives
*/ */
public enum Horizontal {LEFT, RIGHT} public enum Horizontal {LEFT, CENTER, RIGHT}
/** /**
* Vertical alignment directives * Vertical alignment directives
*/ */
public enum Vertical {TOP, BOTTOM} public enum Vertical {TOP, CENTER, BOTTOM}
private int maximumWidth; private int maximumWidth;
private int maximumHeight; private int maximumHeight;
...@@ -106,13 +106,23 @@ public class StringBox { ...@@ -106,13 +106,23 @@ public class StringBox {
} }
/** /**
* <p>Places a string in the StringBox. If <code>verticalAlignment</code> is <code>TOP</code> then the string's * <p>Places a string in the StringBox.</p>
* first line will be in the <code>verticalPosition</code>'th row, and each subsequent line will be in each *
* subsequent row. If <code>verticalAlignment</code> is <code>BOTTOM</code> then the string's last line will be in * <p>If <code>verticalAlignment</code> is <code>TOP</code> then the string's first line will be in the
* the <code>verticalPosition</code>'th row, and each preceding line will be in each preceding row. If * <code>verticalPosition</code>'th row, and each subsequent line will be in each subsequent row. If
* <code>horizontalAlignment</code> is <code>LEFT</code> then each line will be left-justified to the * <code>verticalAlignment</code> is <code>BOTTOM</code> then the string's last line will be in the row immediately
* preceding the <code>verticalPosition</code>'th row, and each preceding line will be in each preceding row.</p>
*
* <p>If <code>horizontalAlignment</code> is <code>LEFT</code> then each line will be left-justified to the
* <code>horizontalPosition</code>'th column. If <code>horizontalAlignment</code> is <code>RIGHT</code> then each * <code>horizontalPosition</code>'th column. If <code>horizontalAlignment</code> is <code>RIGHT</code> then each
* line will be right-justified to the <code>horizontalPosition</code>'th column.</p> * line will be right-justified to the <code>horizontalPosition</code>'th column; that is, the rightmost character
* will be immediately to the left of the <code>horizontalPosition</code>'th column.</p>
*
* <p>In cases of <code>CENTER</code> alignment: if there are an odd number of lines then the center line will be on
* the <code>verticalPosition</code>'th row. Similarly, if there are an odd number of characters in a line then the
* center character will be in the <code>horizontalPosition</code>'th column. If there are an even number of rows
* (or characters) then the row (character) immediately below (to the right of) the midpoint will be in the
* designated row (column).</p>
* *
* @param string the string to be placed in the StringBox * @param string the string to be placed in the StringBox
* @param verticalAlignment vertical alignment directive (top/bottom) * @param verticalAlignment vertical alignment directive (top/bottom)
...@@ -127,7 +137,8 @@ public class StringBox { ...@@ -127,7 +137,8 @@ public class StringBox {
String[] strings = string != null ? string.split(System.lineSeparator()) : nullishString; String[] strings = string != null ? string.split(System.lineSeparator()) : nullishString;
// This would benefit from the switch expression in JDK 12/13 // This would benefit from the switch expression in JDK 12/13
int topRow = verticalAlignment == Vertical.TOP ? verticalPosition : int topRow = verticalAlignment == Vertical.TOP ? verticalPosition :
verticalAlignment == Vertical.BOTTOM ? verticalPosition - strings.length + 1 : verticalAlignment == Vertical.BOTTOM ? verticalPosition - strings.length :
verticalAlignment == Vertical.CENTER ? verticalPosition - strings.length / 2 :
0; 0;
int firstRow = Math.max(topRow, 0); int firstRow = Math.max(topRow, 0);
int lastRow = Math.min(topRow + strings.length, maximumHeight); int lastRow = Math.min(topRow + strings.length, maximumHeight);
...@@ -280,6 +291,7 @@ public class StringBox { ...@@ -280,6 +291,7 @@ public class StringBox {
.replace("\n", "\\"); .replace("\n", "\\");
int leftColumn = horizontalAlignment == Horizontal.LEFT ? horizontalPosition : int leftColumn = horizontalAlignment == Horizontal.LEFT ? horizontalPosition :
horizontalAlignment == Horizontal.RIGHT ? horizontalPosition - modifiedString.length() : horizontalAlignment == Horizontal.RIGHT ? horizontalPosition - modifiedString.length() :
horizontalAlignment == Horizontal.CENTER ? horizontalPosition - modifiedString.length() / 2 :
0; 0;
if (leftColumn > rightEdge) { if (leftColumn > rightEdge) {
int paddingSize = leftColumn - rightEdge; int paddingSize = leftColumn - rightEdge;
......
...@@ -23,8 +23,10 @@ public class StringBoxTest { ...@@ -23,8 +23,10 @@ public class StringBoxTest {
stringRow = new StringBox.StringRow(10); stringRow = new StringBox.StringRow(10);
} }
@SuppressWarnings("EmptyMethod")
@After @After
public void tearDown() { public void tearDown() {
// intentionally empty
} }
/* Tests for one row */ /* Tests for one row */
...@@ -142,7 +144,8 @@ public class StringBoxTest { ...@@ -142,7 +144,8 @@ public class StringBoxTest {
int position1 = 3; int position1 = 3;
String input2 = "bar"; String input2 = "bar";
int position2 = 5; int position2 = 5;
@SuppressWarnings("SpellCheckingInspection") String expectedOutput = " fooar"; //noinspection SpellCheckingInspection
String expectedOutput = " fooar";
// Act // Act
String actualOutput = stringRow.placeSubstringAlignLeft(input2, position2).placeSubstringAlignLeft(input1, String actualOutput = stringRow.placeSubstringAlignLeft(input2, position2).placeSubstringAlignLeft(input1,
position1).toString(); position1).toString();
...@@ -157,7 +160,8 @@ public class StringBoxTest { ...@@ -157,7 +160,8 @@ public class StringBoxTest {
int position1 = 7; int position1 = 7;
String input2 = "bar"; String input2 = "bar";
int position2 = 5; int position2 = 5;
@SuppressWarnings("SpellCheckingInspection") String expectedOutput = " bafoo"; //noinspection SpellCheckingInspection
String expectedOutput = " bafoo";
// Act // Act
String actualOutput = stringRow.placeSubstringAlignLeft(input2, position2).placeSubstringAlignLeft(input1, String actualOutput = stringRow.placeSubstringAlignLeft(input2, position2).placeSubstringAlignLeft(input1,
position1).toString(); position1).toString();
...@@ -189,6 +193,30 @@ public class StringBoxTest { ...@@ -189,6 +193,30 @@ public class StringBoxTest {
assertEquals(expectedOutput, actualOutput); assertEquals(expectedOutput, actualOutput);
} }
@Test
public void testCenterOddNumberOfCharacters() {
// Arrange
String input = "foo";
int position = 5;
String expectedOutput = " foo";
// Act
String actualOutput = stringRow.placeSubstring(input, StringBox.Horizontal.CENTER, position).toString();
// Assert
assertEquals(expectedOutput, actualOutput);
}
@Test
public void testCenterEvenNumberOfCharacter() {
// Arrange
String input = "foobar";
int position = 5;
String expectedOutput = " foobar";
// Act
String actualOutput = stringRow.placeSubstring(input, StringBox.Horizontal.CENTER, position).toString();
// Assert
assertEquals(expectedOutput, actualOutput);
}
/* Tests for multiple rows */ /* Tests for multiple rows */
@Test @Test
...@@ -207,13 +235,14 @@ public class StringBoxTest { ...@@ -207,13 +235,14 @@ public class StringBoxTest {
@Test @Test
public void testNormalCases() { public void testNormalCases() {
// Arrange // Arrange
@SuppressWarnings("SpellCheckingInspection") String[] inputs = { //noinspection SpellCheckingInspection
String[] inputs = {
String.format("foo%nbar"), String.format("foo%nbar"),
String.format("larry%ncurly%nmoe"), String.format("larry%ncurly%nmoe"),
String.format("quux%nxyzzy"), String.format("quux%nxyzzy"),
String.format("one%ntwo%nthree") String.format("one%ntwo%nthree")
}; };
int[] rows = {2, 5, 3, 10}; int[] rows = {2, 6, 3, 11};
int[] columns = {10, 5, 20, 15}; int[] columns = {10, 5, 20, 15};
//noinspection SpellCheckingInspection //noinspection SpellCheckingInspection
String expectedOutput = String.format( String expectedOutput = String.format(
...@@ -298,4 +327,32 @@ public class StringBoxTest { ...@@ -298,4 +327,32 @@ public class StringBoxTest {
"Dimensions 0×3 are too small.", exception.getMessage()); "Dimensions 0×3 are too small.", exception.getMessage());
} }
} }
@Test
public void testCenterOddNumberOfLines() {
// Arrange
String input = String.format("f%no%no");
int row = 5;
int column = 0;
String expectedOutput = String.format("%n%n%n%nf%no%no");
// Act
String actualOutput = stringBox.placeString(input, StringBox.Vertical.CENTER, row,
StringBox.Horizontal.CENTER, column).toString(false);
// Assert
assertEquals(expectedOutput, actualOutput);
}
@Test
public void testCenterEvenNumberOfLines() {
// Arrange
String input = String.format("f%no%no%nb%na%nr");
int row = 5;
int column = 0;
String expectedOutput = String.format("%n%nf%no%no%nb%na%nr");
// Act
String actualOutput = stringBox.placeString(input, StringBox.Vertical.CENTER, row,
StringBox.Horizontal.CENTER, column).toString(false);
// Assert
assertEquals(expectedOutput, actualOutput);
}
} }
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment