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))
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))
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
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))
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))
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))
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)
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))
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)
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)
def calculateAnsAndPushToOperandStack(operandStack, operatorStack): st.pushStack(operandStack, calculateAndReturnAnsToken(operandStack, operatorStack))
def pushTokenToStack(token, operandStack, operatorStack): if token.tokenType == "OPERATOR_TOKEN": st.pushStack(operatorStack, token) elif token.tokenType == "OPERAND_TOKEN": st.pushStack(operandStack, token)
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