diff --git a/bin/.gitignore b/bin/.gitignore new file mode 100644 index 0000000..2079672 --- /dev/null +++ b/bin/.gitignore @@ -0,0 +1,2 @@ +/Spreadsheet.class +/SpreadsheetTest.class diff --git a/bin/Spreadsheet.class b/bin/Spreadsheet.class index 92b411f..c6ff102 100644 Binary files a/bin/Spreadsheet.class and b/bin/Spreadsheet.class differ diff --git a/bin/SpreadsheetTest.class b/bin/SpreadsheetTest.class index e7086bd..fadfe84 100644 Binary files a/bin/SpreadsheetTest.class and b/bin/SpreadsheetTest.class differ diff --git a/src/Spreadsheet.java b/src/Spreadsheet.java index e4f120b..d12df52 100644 --- a/src/Spreadsheet.java +++ b/src/Spreadsheet.java @@ -1,18 +1,128 @@ public class Spreadsheet { + String [][] sheet = new String [20][20]; + String [] abcd = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T"}; public String get(String cell) { - // to be implemented - return null; + String letter = cell.substring(0, 1); + String column = cell.substring(1, 2); + int columnNumber, rowNumber; + + rowNumber = searchCellRow(letter); + columnNumber = searchCellColumn(column); + + return sheet[rowNumber][columnNumber]; + } + + private int searchCellColumn(String column) { + boolean found = false; + int counter = 0; + while (!found && counter < 20) { + if (column.equals(String.valueOf(counter))) { + found = true; + } + else { + ++counter; + } + } + return counter; + } + + private int searchCellRow(String letter) { + boolean found = false; + int counter = 0; + + while (!found && counter < 20) { + if (letter.equals(abcd[counter])) { + found = true; + } + else { + ++counter; + } + } + return counter; } public void set(String cell, String value) { - // to be implemented + String letter = cell.substring(0, 1); + String column = cell.substring(1, 2); + + sheet[searchCellRow(letter)][searchCellColumn(column)] = value; } public String evaluate(String cell) { - // to be implemented + String value = get(cell); + for (int i = 0; i < value.length(); i++) { + if ((value.charAt(i) == '+') || (value.charAt(i) == '-') || (value.charAt(i) == '*') || (value.charAt(i) == '/')) { + return calculator(value); + } + } + if (value.charAt(0) == '=') { + if ((Character.isAlphabetic(value.charAt(1)) && (Character.isDigit(value.charAt(2))))) { + String refCell = value.substring(1, 3); + String circular = "=" + cell; + if (get(refCell) != circular) { + return get(refCell); + } + else { + return "#Circular"; + } + } + String realValue = ""; + for (int i = 1; i < value.length(); i++) { + realValue = realValue + value.charAt(i); + } + value = realValue; + } + + if (isANumber(value)) { + return value; + } + else if (isAString(value)) { + String realString = ""; + for (int i = 1; i < value.length() - 1; i++) { + realString = realString + value.charAt(i); + } + return realString; + } + else { + return "#Error"; + } + } + + private String calculator(String value) { + int calc; return null; } + + private boolean isAString(String value) { + if ((value.charAt(0) == '\'') && (value.charAt(value.length() - 1) == '\'')){ + return true; + } + else { + return false; + } + } + + private Boolean isANumber(String value) { + int counter = 0; + if (value.isEmpty()) { + return false; + } + if (value.charAt(counter) == '-') { + if (value.length() > 1) { + ++counter; + } + else { + return false; + } + } + for (; counter < value.length(); ++counter) { + if (!Character.isDigit(value.charAt(counter))) { + return false; + } + } + return true; + } } diff --git a/tests/SpreadsheetTest.java b/tests/SpreadsheetTest.java index 9e0936a..32c601c 100644 --- a/tests/SpreadsheetTest.java +++ b/tests/SpreadsheetTest.java @@ -5,11 +5,72 @@ public class SpreadsheetTest { + Spreadsheet sheet = new Spreadsheet(); - @Test - public void test() { - fail("Not yet implemented"); - + @Test public void testSetA4_12() { + String cell = "A4"; + sheet.set(cell, "12"); + assertEquals("12", sheet.get(cell)); } + + @Test public void testSetB12_4() { + String cell = "B12"; + sheet.set(cell, "4"); + assertEquals("4", sheet.get(cell)); + } + + @Test public void evaluateString_StringWithQuotes() { + String cell = "B12"; + sheet.set(cell, "'thisIsAString'"); + assertEquals("thisIsAString", sheet.evaluate(cell)); + } + @Test public void evaluateUnquotedString_Error() { + String cell = "A1"; + sheet.set(cell, "'thisIsNotAString"); + assertEquals("#Error", sheet.evaluate(cell)); + } + @Test public void evaluateInvalidNumber_Error() { + String cell = "A1"; + sheet.set(cell, "324as"); + assertEquals("#Error", sheet.evaluate(cell)); + } + @Test public void evaluateNegativeNumber_minus10() { + String cell = "F2"; + sheet.set(cell, "-10"); + assertEquals("-10", sheet.evaluate(cell)); + } + @Test public void evaluateStringEquals_StringWithoutEqual() { + String cell = "D9"; + sheet.set(cell, "='thisIsAString'"); + assertEquals("thisIsAString", sheet.evaluate(cell)); + } + @Test public void evaluateNumberEquals_NumberWithoutEqual() { + String cell = "C5"; + sheet.set(cell, "=-15"); + assertEquals("-15", sheet.evaluate(cell)); + } + @Test public void evaluateStringEqualsWithError_Error() { + String cell = "C5"; + sheet.set(cell, "=='thisIsAString"); + assertEquals("#Error", sheet.evaluate(cell)); + } + @Test public void evaluateRefCell_valueInF2() { + String cell = "C5"; + sheet.set(cell, "=F2"); + assertEquals(sheet.get("F2"), sheet.evaluate(cell)); + } + @Test public void evaluateIncorrectRefCell_Error() { + String cell = "C6"; + sheet.set(cell, "=2F"); + assertEquals("#Error", sheet.evaluate(cell)); + } + @Test public void evaluateCircularRefCell_Circular() { + String cell = "F2"; + sheet.set("C5", "=F2"); + sheet.set(cell, "=C5"); + assertEquals("#Circular", sheet.evaluate(cell)); + } + + }