calculator/tests/test_parser.py

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),
),
)