Here's my solution in Python to William Wake's Test First Challenge, as of the end of Part 2
"""Simple spreadsheet
"""
from string import strip
class Sheet:
def __init__(self):
self.cells = {}
self.literals = {}
def get(self, cell):
return str(self.cells.get(cell, ""))
def put(self, cell, value):
self.literals[cell] = value
testValue = str(strip(value))
if testValue.isdigit():
self.cells[cell] = eval(testValue)
elif value and value[0] == '=':
try:
self.cells[cell] = eval(value[1:])
except SyntaxError:
self.cells[cell] = "#Error"
else:
self.cells[cell] = value
def getLiteral(self, cell):
return self.literals.get(cell, "")
def getFormula(self, cell):
return self.getLiteral(cell)
Here are the python unit tests for the above:
import unittest
from sheet import Sheet
class TestSheet(unittest.TestCase):
def test1A_EmptyCells(self):
sheet = Sheet()
self.assertEqual(sheet.get("A1"), "")
self.assertEqual(sheet.get("ZX347"), "")
def test1B_TextCells(self):
sheet = Sheet()
theCell = "A21"
sheet.put(theCell, "A string")
self.assertEqual(sheet.get(theCell), "A string")
sheet.put(theCell, "A different string")
self.assertEqual(sheet.get(theCell), "A different string")
sheet.put(theCell, "")
self.assertEqual(sheet.get(theCell), "")
def test1C_NumericCells(self):
sheet = Sheet()
theCell = "A21"
sheet.put(theCell, "X99") # "Obvious" string
self.assertEqual(sheet.get(theCell), "X99")
sheet.put(theCell, "14") # "Obvious" number
self.assertEqual(sheet.get(theCell), "14")
sheet.put(theCell, " 99 X") # Whole string must be numeric
self.assertEqual(sheet.get(theCell), " 99 X")
sheet.put(theCell, " 1234 ") # Blanks ignored
self.assertEqual(sheet.get(theCell), "1234")
sheet.put(theCell, " ") # Just a blank
self.assertEqual(sheet.get(theCell), " ")
def test1D_LiteralVals(self):
sheet = Sheet()
theCell = "A21"
sheet.put(theCell, "Some string")
self.assertEqual(sheet.getLiteral(theCell), "Some string")
sheet.put(theCell, " 1234 ")
self.assertEqual(sheet.getLiteral(theCell), " 1234 ")
sheet.put(theCell, "=7") # Foreshadowing formulas:)
self.assertEqual(sheet.getLiteral(theCell), "=7")
def testManyCells(self):
sheet = Sheet()
sheet.put("A1", "8")
sheet.put("X27", "10")
sheet.put("ZX901", "4")
self.assertEqual("8", sheet.get("A1"), "A1")
self.assertEqual("10", sheet.get("X27"), "X27")
self.assertEqual("4", sheet.get("ZX901"), "ZX901")
sheet.put("A1", "12")
self.assertEqual("12", sheet.get("A1"), "A1 after")
self.assertEqual("10", sheet.get("X27"), "X27 same")
self.assertEqual("4", sheet.get("ZX901"), "X27 same")
def testFormulaSpec(self):
sheet = Sheet()
sheet.put("B1", " =7") # note leading space
self.assertEqual(" =7", sheet.get("B1"), "Not a formula")
self.assertEqual(" =7", sheet.getFormula("B1"), "Unchanged" )
def testConstantFormula(self):
sheet = Sheet()
sheet.put("A1", "=7")
self.assertEqual("=7", sheet.getFormula("A1"), "Formula")
self.assertEqual("7", sheet.get("A1"), "Value")
def testParentheses(self):
sheet = Sheet()
sheet.put("A1", "=(7)")
self.assertEqual("7", sheet.get("A1"), "Parends")
def testDeepParentheses(self):
sheet = Sheet()
sheet.put("A1", "=((((10))))")
self.assertEqual("10", sheet.get("A1"), "Parends")
def testMultiply(self):
sheet = Sheet()
sheet.put("A1", "=2*3*4")
self.assertEqual("24", sheet.get("A1"), "Times")
def testAdd(self):
sheet = Sheet()
sheet.put("A1", "=71+2+3")
self.assertEqual("76", sheet.get("A1"), "Add")
def testPrecedence(self):
sheet = Sheet()
sheet.put("A1", "=7+2*3")
self.assertEqual("13", sheet.get("A1"), "Precedence")
def testFullExpression(self):
sheet = Sheet()
sheet.put("A1", "=7*(2+3)*((((2+1))))")
self.assertEqual("105", sheet.get("A1"), "Expr")
def testSimpleFormulaError(self):
sheet = Sheet()
sheet.put("A1", "=7*")
self.assertEqual("#Error", sheet.get("A1"), "Error")
def testParenthesisError(self):
sheet = Sheet()
sheet.put("A1", "=(((((7))")
self.assertEqual("#Error", sheet.get("A1"), "Error" )
def _test(verbose=0):
unittest.main()
if __name__ == '__main__':
_test(0)