Test First Challenge Solution

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)



Joshua Macy