Ejemplo n.º 1
0
    def test_e_isOperatorInStackSamePrecedenceWithCurrentToken_given_not_empty_stack_and_invalid_operator_token_expect_exception(
            self):
        # isOperatorInStackHigherPrecedence(operatorStack, token)
        operatorStack = []  # Initialise operator stack

        # Initialise operator token to insert to stack
        operatorToken = operatorT.OperatorToken()
        operatorToken.associativity = dictConstant.RIGHT_TO_LEFT
        operatorToken.precedence = dictConstant.STRONG
        operatorToken.symbol = '+'
        operatorToken.affix = "PREFIX"
        operatorToken.tokenType = "OPERATOR_TOKEN"

        # Initialise current token
        currentToken = operatorT.OperatorToken()
        currentToken.associativity = dictConstant.RIGHT_TO_LEFT
        currentToken.precedence = dictConstant.STRONG
        currentToken.symbol = '+'
        currentToken.affix = "PREFIX"
        currentToken.tokenType = "INVALID"

        # Push operator token into stack
        stack.pushStack(operatorStack, operatorToken)

        self.assertEqual(
            False,
            operatorT.isOperatorInStackSamePrecedenceWithCurrentToken(
                operatorStack, currentToken))
Ejemplo n.º 2
0
    def test_c_isOperatorInStackSamePrecedenceWithCurrentToken_given_prefix_plus_at_stack_and_prefix_minus_as_token_expect_True(
            self):
        operatorStack = []  # Initialise operator stack

        # Initialise operator token to insert to stack
        operatorToken = operatorT.OperatorToken()
        operatorToken.associativity = dictConstant.RIGHT_TO_LEFT
        operatorToken.precedence = dictConstant.STRONG
        operatorToken.symbol = '+'
        operatorToken.affix = "PREFIX"
        operatorToken.tokenType = "OPERATOR_TOKEN"

        # Initialise current token
        currentToken = operatorT.OperatorToken()
        currentToken.associativity = dictConstant.RIGHT_TO_LEFT
        currentToken.precedence = dictConstant.STRONG
        currentToken.symbol = '+'
        currentToken.affix = "PREFIX"
        currentToken.tokenType = "OPERATOR_TOKEN"
        # Push operator token into stack
        stack.pushStack(operatorStack, operatorToken)
        # isOperatorInStackHigherPrecedence(operatorStack, token)
        self.assertEqual(
            True,
            operatorT.isOperatorInStackSamePrecedenceWithCurrentToken(
                operatorStack, currentToken))
Ejemplo n.º 3
0
def createAndPushTokenToStack(listIndex, expressionList, operandStack, operatorStack, previousToken):
    currentChar = expressionList[listIndex]
    if sI.isNumber(currentChar):  # formatNumber(number)
        token = operandT.createOperandToken(sI.formatNumber(sI.stringToNumber(currentChar)))
        st.pushStack(operandStack, token)
    elif sI.isOperator(currentChar):  # Raise exception when non operator detected
        token = operatorT.createOperatorToken(operatorT.getOperatorStrAffix(getCharFromToken(previousToken),
                                                                            expressionList[listIndex + 1],
                                                                            currentChar))
        st.pushStack(operatorStack, token)
    return token
Ejemplo n.º 4
0
    def test_d_isStacksReadyForOperation_given_1_plus_in_stack_expect_no(self):
        expressionList = [
            "1", "+", "2"
        ]  # The function uses next character to determine affix type
        operandStack = []
        operatorStack = []

        # createToken(listIndex, expressionList, previousToken)
        token1 = sY.createToken(0, expressionList, None)
        # pushStack(stack, data)
        st.pushStack(operandStack, token1)
        token2 = sY.createToken(1, expressionList, token1)
        # isStacksReadyForOperation(operandStack, operatorStack, token)
        self.assertEqual(
            "NO",
            sY.isStacksReadyForOperation(operandStack, operatorStack, token2))
Ejemplo n.º 5
0
    def test_b_isNoOfTokensValidForOperation_given_1_operand_and_no_operator_expect_true(
            self):
        expressionList = [
            "-", "2"
        ]  # The function uses next character to determine affix type
        operandStack = []
        operatorStack = []

        # createToken(listIndex, expressionList, previousToken)
        token1 = sY.createToken(0, expressionList, None)
        # pushStack(stack, data)
        st.pushStack(operandStack, token1)
        token2 = sY.createToken(1, expressionList, token1)
        st.pushStack(operatorStack, token2)
        # isNoOfTokensValidForOperation(operandStack, operatorStack)
        self.assertEqual(
            False, sY.isNoOfTokensValidForOperation(operandStack,
                                                    operatorStack))
Ejemplo n.º 6
0
    def test_c_isStacksReadyForOperation_given_1_plus_minus_3_token_is_minus_expect_same_precedence_but_xready(
            self):
        expressionList = [
            "1", "+", "-", "3"
        ]  # The function uses next character to determine affix type
        operandStack = []
        operatorStack = []

        # createToken(listIndex, expressionList, previousToken)
        token1 = sY.createToken(0, expressionList, None)
        # pushStack(stack, data)
        st.pushStack(operandStack, token1)
        token2 = sY.createToken(1, expressionList, token1)
        st.pushStack(operatorStack, token2)
        token3 = sY.createToken(2, expressionList, token1)
        # isStacksReadyForOperation(operandStack, operatorStack, token)
        self.assertEqual(
            "SAME_PRECEDENCE_BUT_XREADY",
            sY.isStacksReadyForOperation(operandStack, operatorStack, token3))
Ejemplo n.º 7
0
    def test_b_calculateAnsAndPushToOperandStack_given_10_divide_2_expect_5_in_operand_stack(
            self):
        expressionList = [
            "10", "/", "2"
        ]  # The function uses next character to determine affix type
        operandStack = []
        operatorStack = []
        # createToken(listIndex, expressionList, previousToken)
        token1 = sY.createToken(0, expressionList, None)
        # pushStack(stack, data)
        st.pushStack(operandStack, token1)
        token2 = sY.createToken(1, expressionList, token1)
        st.pushStack(operatorStack, token2)
        token3 = sY.createToken(2, expressionList, token2)
        st.pushStack(operandStack, token3)

        # calculateAnsAndPushToOperandStack(operandStack, operatorStack)
        sY.calculateAnsAndPushToOperandStack(operandStack, operatorStack)
        self.assertEqual(10 / 2, operandStack[0].num)
Ejemplo n.º 8
0
    def test_a_isStacksReadyForOperation_given_1_multiply_2_token_is_minus_expect_yes(
            self):
        expressionList = [
            "1", "*", "2", "-", "3"
        ]  # The function uses next character to determine affix type
        operandStack = []
        operatorStack = []

        # createToken(listIndex, expressionList, previousToken)
        token1 = sY.createToken(0, expressionList, None)
        # pushStack(stack, data)
        st.pushStack(operandStack, token1)
        token2 = sY.createToken(1, expressionList, token1)
        st.pushStack(operatorStack, token2)
        token3 = sY.createToken(2, expressionList, token1)
        st.pushStack(operandStack, token3)
        token4 = sY.createToken(3, expressionList, token1)
        # isStacksReadyForOperation(operandStack, operatorStack, token)
        self.assertEqual(
            "YES",
            sY.isStacksReadyForOperation(operandStack, operatorStack, token4))
Ejemplo n.º 9
0
    def test_d_calculateAndReturnAnsToken_given_10p5_divide_5point1_expect_return_token_with_correct_num__and_correct_token_attributes(
            self):
        expressionList = [
            "10.5", "/", 5.1
        ]  # The function uses next character to determine affix type
        operandStack = []
        operatorStack = []
        # createToken(listIndex, expressionList, previousToken)
        token1 = sY.createToken(0, expressionList, None)
        # pushStack(stack, data)
        st.pushStack(operandStack, token1)
        token2 = sY.createToken(1, expressionList, token1)
        st.pushStack(operatorStack, token2)
        token3 = sY.createToken(2, expressionList, token2)
        st.pushStack(operandStack, token3)

        # calculateAndReturnAnsToken(operandStack, operatorStack)
        ansToken = sY.calculateAndReturnAnsToken(operandStack, operatorStack)
        self.assertEqual(10.5 / 5.1, ansToken.num)
        self.assertEqual("float", ansToken.numType)
        self.assertEqual("OPERAND_TOKEN", ansToken.tokenType)
Ejemplo n.º 10
0
    def test_a_calculateAndReturnAnsToken_given_2_plus_100_expect_return_token_with_num_and_correct_token_attributes(
            self):
        expressionList = [
            "2", "+", "100"
        ]  # The function uses next character to determine affix type
        operandStack = []
        operatorStack = []
        # createToken(listIndex, expressionList, previousToken)
        token1 = sY.createToken(0, expressionList, None)
        # pushStack(stack, data)
        st.pushStack(operandStack, token1)
        token2 = sY.createToken(1, expressionList, token1)
        st.pushStack(operatorStack, token2)
        token3 = sY.createToken(2, expressionList, token2)
        st.pushStack(operandStack, token3)

        # calculateAndReturnAnsToken(operandStack, operatorStack)
        ansToken = sY.calculateAndReturnAnsToken(operandStack, operatorStack)
        self.assertEqual(2 + 100, ansToken.num)
        self.assertEqual("int", ansToken.numType)
        self.assertEqual("OPERAND_TOKEN", ansToken.tokenType)
Ejemplo n.º 11
0
def calculateAnsAndPushToOperandStack(operandStack, operatorStack):
    st.pushStack(operandStack, calculateAndReturnAnsToken(operandStack, operatorStack))
Ejemplo n.º 12
0
def pushTokenToStack(token, operandStack, operatorStack):
    if token.tokenType == "OPERATOR_TOKEN":
        st.pushStack(operatorStack, token)

    elif token.tokenType == "OPERAND_TOKEN":
        st.pushStack(operandStack, token)
Ejemplo n.º 13
0
 def test_a_pushStack_global_stack_push_123_expect_123_pushed(self):
     stack.initStack(myGlobal.myStack)       # Clear the element in stack
     stack.pushStack(myGlobal.myStack, "123")  # Push the data as first element
     self.assertEqual("123", myGlobal.myStack[0])  # Verify the first element