Implemented interpreter pattern.

This commit is contained in:
tylerlaberge
2016-08-14 13:04:14 -04:00
parent d19b902285
commit 3c39f908cf
2 changed files with 54 additions and 66 deletions

View File

@@ -6,6 +6,11 @@ class Context(object):
Context class as part of the Interpreter design pattern. Context class as part of the Interpreter design pattern.
""" """
def __init__(self, in_data): def __init__(self, in_data):
"""
Initialize a new Context class.
@param in_data: The starting input of this context.
"""
self.in_data = in_data self.in_data = in_data
self.out_data = None self.out_data = None
@@ -47,7 +52,7 @@ class TerminalExpression(Expression, metaclass=ABCMeta):
""" """
Initialize a new TerminalExpression instance. Initialize a new TerminalExpression instance.
@param literal: A literal representing this TerminalExpression. @param literal: A literal value representing this TerminalExpression.
""" """
self.literal = literal self.literal = literal

View File

@@ -69,6 +69,40 @@ class ExpressionTestCase(TestCase):
self.assertEquals('FOO', self.context.out_data) self.assertEquals('FOO', self.context.out_data)
class TerminalExpressionTestCase(TestCase):
"""
Unit testing class for the TerminalExpression class.
"""
def setUp(self):
"""
Initialize testing data.
"""
class ConcreteTerminal(TerminalExpression):
def interpret(self, context):
return self.literal
self.concrete_terminal_class = ConcreteTerminal
def test_init(self):
"""
Test the __init__ method.
@raise AssertionError: If the test fails.
"""
terminal = self.concrete_terminal_class('foo')
self.assertEquals('foo', terminal.literal)
def test_interpret(self):
"""
Test the interpret method.
@raise AssertionError: If the test fails.
"""
terminal = self.concrete_terminal_class('bar')
self.assertEquals('bar', terminal.interpret(Context('')))
class NonTerminalExpressionTestCase(TestCase): class NonTerminalExpressionTestCase(TestCase):
""" """
Unit testing class for the NonTerminalExpression class. Unit testing class for the NonTerminalExpression class.
@@ -82,12 +116,13 @@ class NonTerminalExpressionTestCase(TestCase):
def interpret(self, context): def interpret(self, context):
return self.literal return self.literal
class RomanExpression(NonTerminalExpression, metaclass=ABCMeta): class RomanNonTerminalExpression(NonTerminalExpression, metaclass=ABCMeta):
def interpret(self, context): def interpret(self, context):
if context.out_data is None: if context.out_data is None:
context.out_data = 0 context.out_data = 0
if len(context.in_data) == 0: if len(context.in_data) == 0:
return return
@@ -107,27 +142,23 @@ class NonTerminalExpressionTestCase(TestCase):
context.out_data += 1 * self.multiplier() context.out_data += 1 * self.multiplier()
context.in_data = context.in_data[1:] context.in_data = context.in_data[1:]
@abstractmethod
def one(self): def one(self):
pass return self.expressions['one'].interpret(None)
@abstractmethod
def four(self): def four(self):
pass return self.expressions['four'].interpret(None)
@abstractmethod
def five(self): def five(self):
pass return self.expressions['five'].interpret(None)
@abstractmethod
def nine(self): def nine(self):
pass return self.expressions['nine'].interpret(None)
@abstractmethod @abstractmethod
def multiplier(self): def multiplier(self):
pass pass
class ThousandExpression(RomanExpression): class ThousandExpression(RomanNonTerminalExpression):
def __init__(self): def __init__(self):
one_terminal = RomanTerminalExpression('M') one_terminal = RomanTerminalExpression('M')
@@ -136,23 +167,11 @@ class NonTerminalExpressionTestCase(TestCase):
nine_terminal = RomanTerminalExpression(' ') nine_terminal = RomanTerminalExpression(' ')
super().__init__(one=one_terminal, four=four_terminal, five=five_terminal, nine=nine_terminal) super().__init__(one=one_terminal, four=four_terminal, five=five_terminal, nine=nine_terminal)
def one(self):
return self.expressions['one'].interpret(None)
def four(self):
return self.expressions['four'].interpret(None)
def five(self):
return self.expressions['five'].interpret(None)
def nine(self):
return self.expressions['nine'].interpret(None)
def multiplier(self): def multiplier(self):
return 1000 return 1000
class HundredExpression(RomanExpression): class HundredExpression(RomanNonTerminalExpression):
def __init__(self): def __init__(self):
one_terminal = RomanTerminalExpression('C') one_terminal = RomanTerminalExpression('C')
@@ -161,23 +180,11 @@ class NonTerminalExpressionTestCase(TestCase):
nine_terminal = RomanTerminalExpression('CM') nine_terminal = RomanTerminalExpression('CM')
super().__init__(one=one_terminal, four=four_terminal, five=five_terminal, nine=nine_terminal) super().__init__(one=one_terminal, four=four_terminal, five=five_terminal, nine=nine_terminal)
def one(self):
return self.expressions['one'].interpret(None)
def four(self):
return self.expressions['four'].interpret(None)
def five(self):
return self.expressions['five'].interpret(None)
def nine(self):
return self.expressions['nine'].interpret(None)
def multiplier(self): def multiplier(self):
return 100 return 100
class TenExpression(RomanExpression): class TenExpression(RomanNonTerminalExpression):
def __init__(self): def __init__(self):
one_terminal = RomanTerminalExpression('X') one_terminal = RomanTerminalExpression('X')
@@ -186,23 +193,11 @@ class NonTerminalExpressionTestCase(TestCase):
nine_terminal = RomanTerminalExpression('XC') nine_terminal = RomanTerminalExpression('XC')
super().__init__(one=one_terminal, four=four_terminal, five=five_terminal, nine=nine_terminal) super().__init__(one=one_terminal, four=four_terminal, five=five_terminal, nine=nine_terminal)
def one(self):
return self.expressions['one'].interpret(None)
def four(self):
return self.expressions['four'].interpret(None)
def five(self):
return self.expressions['five'].interpret(None)
def nine(self):
return self.expressions['nine'].interpret(None)
def multiplier(self): def multiplier(self):
return 10 return 10
class OneExpression(RomanExpression): class OneExpression(RomanNonTerminalExpression):
def __init__(self): def __init__(self):
one_terminal = RomanTerminalExpression('I') one_terminal = RomanTerminalExpression('I')
@@ -211,18 +206,6 @@ class NonTerminalExpressionTestCase(TestCase):
nine_terminal = RomanTerminalExpression('IX') nine_terminal = RomanTerminalExpression('IX')
super().__init__(one=one_terminal, four=four_terminal, five=five_terminal, nine=nine_terminal) super().__init__(one=one_terminal, four=four_terminal, five=five_terminal, nine=nine_terminal)
def one(self):
return self.expressions['one'].interpret(None)
def four(self):
return self.expressions['four'].interpret(None)
def five(self):
return self.expressions['five'].interpret(None)
def nine(self):
return self.expressions['nine'].interpret(None)
def multiplier(self): def multiplier(self):
return 1 return 1