114 lines
3.5 KiB
Python
114 lines
3.5 KiB
Python
import unittest
|
|
from calculator.tokens import Token, TokenType
|
|
from calculator.parser_ import Parser
|
|
from calculator.nodes import (
|
|
NumberNode,
|
|
AddNode,
|
|
SubtractNode,
|
|
MultiplyNode,
|
|
DivideNode,
|
|
PowerNode,
|
|
ModuloNode,
|
|
)
|
|
|
|
|
|
class TestParser(unittest.TestCase):
|
|
def test_empty(self):
|
|
tokens = []
|
|
node = Parser(tokens).parse()
|
|
self.assertEqual(node, None)
|
|
|
|
def test_numbers(self):
|
|
tokens = [Token(TokenType.NUMBER, 100)]
|
|
node = Parser(tokens).parse()
|
|
self.assertEqual(node, NumberNode(100))
|
|
|
|
def test_individual_operations(self):
|
|
tokens = [
|
|
Token(TokenType.NUMBER, 21),
|
|
Token(TokenType.PLUS),
|
|
Token(TokenType.NUMBER, 23),
|
|
]
|
|
node = Parser(tokens).parse()
|
|
self.assertEqual(node, AddNode(NumberNode(21), NumberNode(23)))
|
|
|
|
tokens = [
|
|
Token(TokenType.NUMBER, 21),
|
|
Token(TokenType.MINUS),
|
|
Token(TokenType.NUMBER, 23),
|
|
]
|
|
node = Parser(tokens).parse()
|
|
self.assertEqual(node, SubtractNode(NumberNode(21), NumberNode(23)))
|
|
|
|
tokens = [
|
|
Token(TokenType.NUMBER, 21),
|
|
Token(TokenType.MULTIPLY),
|
|
Token(TokenType.NUMBER, 23),
|
|
]
|
|
node = Parser(tokens).parse()
|
|
self.assertEqual(node, MultiplyNode(NumberNode(21), NumberNode(23)))
|
|
|
|
tokens = [
|
|
Token(TokenType.NUMBER, 21),
|
|
Token(TokenType.DIVIDE),
|
|
Token(TokenType.NUMBER, 23),
|
|
]
|
|
node = Parser(tokens).parse()
|
|
self.assertEqual(node, DivideNode(NumberNode(21), NumberNode(23)))
|
|
|
|
tokens = [
|
|
Token(TokenType.NUMBER, 21),
|
|
Token(TokenType.POWER),
|
|
Token(TokenType.NUMBER, 23),
|
|
]
|
|
node = Parser(tokens).parse()
|
|
self.assertEqual(node, PowerNode(NumberNode(21), NumberNode(23)))
|
|
|
|
tokens = [
|
|
Token(TokenType.NUMBER, 21),
|
|
Token(TokenType.MODULO),
|
|
Token(TokenType.NUMBER, 23),
|
|
]
|
|
node = Parser(tokens).parse()
|
|
self.assertEqual(node, ModuloNode(NumberNode(21), NumberNode(23)))
|
|
|
|
def test_full_expression(self):
|
|
tokens = [
|
|
Token(TokenType.LPAREN),
|
|
Token(TokenType.NUMBER, 10),
|
|
Token(TokenType.POWER),
|
|
Token(TokenType.NUMBER, 2),
|
|
Token(TokenType.PLUS),
|
|
Token(TokenType.LPAREN),
|
|
Token(TokenType.NUMBER, 21),
|
|
Token(TokenType.DIVIDE),
|
|
Token(TokenType.NUMBER, 7),
|
|
Token(TokenType.PLUS),
|
|
Token(TokenType.NUMBER, 7),
|
|
Token(TokenType.RPAREN),
|
|
Token(TokenType.MINUS),
|
|
Token(TokenType.NUMBER, 5),
|
|
Token(TokenType.MULTIPLY),
|
|
Token(TokenType.NUMBER, 2),
|
|
Token(TokenType.RPAREN),
|
|
Token(TokenType.MODULO),
|
|
Token(TokenType.NUMBER, 100),
|
|
]
|
|
|
|
node = Parser(tokens).parse()
|
|
self.assertEqual(
|
|
node,
|
|
ModuloNode(
|
|
SubtractNode(
|
|
AddNode(
|
|
PowerNode(NumberNode(10), NumberNode(2)),
|
|
AddNode(
|
|
DivideNode(NumberNode(21), NumberNode(7)),
|
|
NumberNode(7),
|
|
),
|
|
),
|
|
MultiplyNode(NumberNode(5), NumberNode(2)),
|
|
),
|
|
NumberNode(100),
|
|
),
|
|
)
|