# /usr/bin/env python
'''
Created on 20-Dec-2012
Modified 2015 by ON.Lab

Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
or the System Testing Guide page at <https://wiki.onosproject.org/x/WYQg>

    TestON is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 2 of the License, or
    (at your option) any later version.

    TestON is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with TestON.  If not, see <http://www.gnu.org/licenses/>.

'''
import re
import inspect

class OpenSpeak:

    def __init__( self ):
        self.default = ''
        self.flag = 0
        self.CurrentStep = 0
        self.grtrOrLssr = 0

    def compiler( self, **compileParameters ):
        '''
         This method will parse the openspeak file and will write to a python module with the equivalent translations.
         It can accept OpenSpeak syntax in string or an OpenSpeak file as an input parameter.
         Translated form can be written into python module if attribute "WRITETOFILE" is set to 1.
        '''

        args = self.parse_args( [ "OPENSPEAKFILE", "TEXT", "WRITETOFILE", "FILEHANDLE" ], **compileParameters )
        resultString = ''
        Test = "Mininet"
        args[ "WRITETOFILE" ] = args[ "WRITETOFILE" ] if args[ "WRITETOFILE" ] is not None else 1
        self.CurrentStep = 0
        self.CurrentCase = ''

        # here Open Speak file will be parsed by each line and translated.
        if args[ "OPENSPEAKFILE" ] is not None and args[ "TEXT" ] is None and args[ "FILEHANDLE" ] is None:
            self.openspeakfile = args[ "OPENSPEAKFILE" ]
            openSpeakFile = open( args[ "OPENSPEAKFILE" ], "r" ).readlines()

        elif args[ "OPENSPEAKFILE" ] is None and args[ "TEXT" ] and args[ "FILEHANDLE" ] is None:
            openSpeakFile = args[ "TEXT" ].split( "\n" )
        elif args[ "FILEHANDLE" ] and args[ "OPENSPEAKFILE" ] is None and args[ "TEXT" ] is None:
            openSpeakFile = args[ "FILEHANDLE" ].readlines()

        index = 0
        outputFile = []
        testName = re.search( "\/(.*)\.ospk$", self.openspeakfile, 0 )
        testName = testName.group( 1 )
        testName = testName.split( "/" )
        testName = testName[ len( testName )-1 ]
        outputFile.append( "\nclass " + testName + " :" + "\n" )
        outputFile.append( "\n" + " " * 4 + "def __init__(self) :" )
        outputFile.append( "\n" + " " * 8 + "self.default = \'\'" + "\n" )

        while index < len( openSpeakFile ):
            ifelseMatch = re.match( "\s+IF|\s+ELSE|\s+ELIF", openSpeakFile[ index ], flags=0 )
            line = openSpeakFile[ index ]
            repeatMatch = re.match( "\s*REPEAT", openSpeakFile[ index ], flags=0 )
            if ifelseMatch:
                result = self.verify_and_translate( line )
                initialSpaces = len( line ) - len( line.lstrip() )
                self.outLoopSpace = initialSpaces
                nextLine = openSpeakFile[ index + 1 ]
                nextinitialSpaces = len( nextLine ) - len( nextLine.lstrip() )

                while nextinitialSpaces > initialSpaces:
                    try:
                        elseMatch = re.match( "\s*ELSE|\s*ELIF", nextLine, flags=0 )
                        if elseMatch:
                            self.flag = self.flag - 1
                        result = result + self.verify_and_translate( nextLine )
                        nextLine = openSpeakFile[ index + 1 ]
                        nextinitialSpaces = len( nextLine ) - len( nextLine.lstrip() )
                    except IndexError:
                        pass
                    index = index + 1
                self.flag = 0
            elif repeatMatch:
                self.flag = 0
                result = self.verify_and_translate( line )
                index = index + 1
                endMatch = re.match( "\s*END", openSpeakFile[ index ], flags=0 )
                while not endMatch:
                    try:

                        self.flag = self.flag + 1
                        result = result + self.verify_and_translate( openSpeakFile[ index ] )
                        index = index + 1

                    except IndexError:
                        pass

            else:
                self.flag = 0
                result = self.verify_and_translate( line )
                index = index + 1
            outputFile.append( result )

        if args[ "WRITETOFILE" ] == 1:
            testscript = re.sub( "ospk", "py", self.openspeakfile, 0 )
            testScript = open( testscript, "w" )
            for lines in outputFile:
                testScript.write( lines )
            testScript.close()
        return resultString

    def verify_and_translate( self, line ):
        '''
          It will accept the each line and calls the suitable API to conver into pyton equivalent syntax .
          It will return the translated python syntax .
        '''
        lineSpace = re.match( "^\s+", line, flags=0 )
        initialSpaces = len( line ) - len( line.lstrip() )
        line = re.sub( "^\s+", "", line ) if lineSpace else line

        resultString = None
        resultString = "\n" + " " * 4 if str( inspect.stack()[ 1 ][ 3 ] ) == "compiler" else "\n"
        indent = " " * ( 4 + 4 * self.flag ) if self.flag > 0 else " " * 4
        caseMatch = re.search( "^CASE\s+(\d+)", line, flags=0 )
        nameMatch = re.match( "^NAME\s+\"(.*)\"", line, flags=0 )
        commentMatch = re.match( "^COMMENT\s+\"(.*)\"", line, flags=0 )
        stepMatch = re.match( "^STEP\s+\"(.*)\"", line, flags=0 )
        connectMatch = re.match( "^CONNECT\s+(\w+)\s+USING\s+(.*)", line, flags=0 )
        disconnectMatch = re.match( "^DISCONNECT\s+(.*)", line, flags=0 )
        ondoMatch = re.match( "^ON\s+(.*)\s+DO\s+(.*)", line, flags=0 )

        storeMatch = re.match( "^STORE\s+(.*)\s+IN\s+(.*)", line, flags=0 )
        variableMatch = re.match( "^(.*)\s+=\s+(.*)", line, flags=0 )
        assertMatch = re.match( "^ASSERT\s+(\w+)\s+(.*)\s+(.*)\s+ONPASS\s+(.*)\s+ONFAIL\s+(.*)", line, flags=0 )
        logMatch = re.match( "^(ERROR|INFO|DEBUG|CRITICAL|REPORT|EXACT|WARN)\s+(.*)", line, flags=0 )
        ifloop = re.match( "IF\s+(\w+)\s*(..|\w+)\s*(.*)", line, flags=0 )
        elseloopMatch = re.match( "ELSE\s*$", line, flags=0 )
        elifloop = re.match( "ELSE\sIF\s+(\w+)\s*(..|\w+)\s*(.*)", line, flags=0 )
        forloopMatch = re.match( "\s*REPEAT\s+(/d+)\s+TIMES", line, flags=0 )
        experimentalMatch = re.match( "EXPERIMENTAL\s+MODE\s+(\w+)", line, flags=0 )
        repeatMatch = re.match( "\s*REPEAT\s+(\d+)\s+TIMES", line, flags=0 )

        response_pasrse = re.match( "\s*PARSE\s+(\w+)\s+AS\s+(\w+)\s+INTO\s+(\w+)", line, flags=0 )

        if caseMatch:
            self.CurrentStep = 0
            self.CurrentCase = "CASE" + caseMatch.group( 1 )
            resultString = resultString + self.translate_case_block( casenumber=caseMatch.group( 1 ) )
        elif repeatMatch:
            resultString = resultString + indent + self.translate_repeat( repeat=repeatMatch.group( 1 ) )
        elif nameMatch:
            resultString = resultString + indent + self.translate_testcase_name( testname=nameMatch.group( 1 ) )
        elif commentMatch:
            resultString = resultString + indent + self.translate_comment( comment=commentMatch.group( 1 ) )
        elif stepMatch:
            self.CurrentStep = self.CurrentStep + 1
            resultString = resultString + indent + self.translate_step( step=stepMatch.group( 1 ) )
        elif connectMatch:
            resultString = resultString + indent + self.translate_connect( component=connectMatch.group( 1 ),
                                                                           arguments=connectMatch.group( 2 ) )
        elif disconnectMatch:
            resultString = resultString + indent + self.translate_disconnect( component=disconnectMatch.group( 1 ) )
        elif ondoMatch:
            resultString = resultString + indent + self.translate_onDOAs( component=ondoMatch.group( 1 ), action=ondoMatch.group( 2 ) )
        elif storeMatch:
            resultString = resultString + indent + self.translate_store( variable=storeMatch.group( 2 ),
                                                                         value=storeMatch.group( 1 ) )
        elif variableMatch:
            resultString = resultString + indent + self.translate_store( variable=variableMatch.group( 1 ),
                                                                         value=variableMatch.group( 2 ) )
        elif assertMatch:
            resultString = resultString + indent + self.translate_assertion( leftvalue=assertMatch.group( 1 ),
                                                                             operator=assertMatch.group( 2 ),
                                                                             rightvalue=assertMatch.group( 3 ),
                                                                             onpass=assertMatch.group( 4 ),
                                                                             onfail=assertMatch.group( 5 ) )
        elif logMatch:
            resultString = resultString + indent + self.translate_logs( loglevel=logMatch.group( 1 ),
                                                                        message=logMatch.group( 2 ) )
        elif ifloop:

            self.initSpace = initialSpaces
            operand = ifloop.group( 1 )
            operator = ifloop.group( 2 )
            value = ifloop.group( 3 )
            resultString = resultString + indent + "if " + operand + self.translate_if_else_operator( conditionoperator=operator ) + value + ":"
            self.flag = self.flag + 1
        elif experimentalMatch:
            resultString = resultString + indent + self.translate_experimental_mode( mode=experimentalMatch.group( 1 ) )

        elif elseloopMatch:
            if initialSpaces == self.initSpace or initialSpaces == self.outLoopSpace:
                resultString = resultString + indent + "else :"
                self.flag = self.flag + 1
            else:
                indent = " " * ( 4 + 4 * ( self.flag - 1 ) )
                resultString = resultString + indent + "else :"
                self.flag = self.flag + 1

        elif elifloop:

            operand = elifloop.group( 1 )
            operator = elifloop.group( 2 )
            value = elifloop.group( 3 )
            if initialSpaces == self.initSpace or initialSpaces == self.outLoopSpace:
                resultString = resultString + indent + "elif " + operand + self.translate_if_else_operator( conditionoperator=operator ) + value + ":"
                self.flag = self.flag + 1
            else:
                indent = " " * ( 4 + 4 * ( self.flag - 1 ) )
                resultString = resultString + indent + "elif " + operand + self.translate_if_else_operator( conditionoperator=operator ) + value + ":"
                self.flag = self.flag + 1
        elif response_pasrse:
            output_string = response_pasrse.group( 1 )
            req_format = response_pasrse.group( 2 )
            store_in = response_pasrse.group( 3 )
            resultString = resultString + indent + store_in + '= main.response_parser(' + output_string + ",\"" + req_format + "\")"
            self.flag = self.flag + 1

        return resultString

    def translate_repeat( self, **repeatStatement ):
        '''
        this will transalte the repeat statement into a python equivalen while loop
        '''

        args = self.parse_args( [ "REPEAT" ], **repeatStatement )
        resultString = ''

        resultString = "i = 0"
        resultString = resultString + "\n" + " " * 8 + "while i<" + args[ "REPEAT" ] + " :"
        return resultString

    def translate_if_else_operator( self, **loopBlock ):
        '''
          This method will translate if-else loop block into its equivalent python code.
          Whole loop block will be passed into loopBlock List.
          It returns the transalted reuslt as a string.
        '''
        args = self.parse_args( [ "CONDITIONOPERATOR" ], **loopBlock )
        resultString = ''
        # process the loopBlock List translate all statements underlying the given loop block
        equalsMatch = re.match( "EQUALS$|==\s*$", args[ "CONDITIONOPERATOR" ], flags=0 )
        greaterMatch = re.match( "GREATER\s+THAN$|>\s*$", args[ "CONDITIONOPERATOR" ], flags=0 )
        lesserMatch = re.match( "LESSER\s+THAN$|<\s*$", args[ "CONDITIONOPERATOR" ], flags=0 )
        greaterEqualMatch = re.match( "GREATER\s+THAN\s+OR\s+EQUALS$|>=\s*$", args[ "CONDITIONOPERATOR" ], flags=0 )
        lesserEqualMatch = re.match( "LESSER\s+THAN\s+OR\s+EQUALS$|<=\s*$", args[ "CONDITIONOPERATOR" ], flags=0 )
        if equalsMatch:
            resultString = resultString + " == "
        elif greaterMatch:
            resultString = resultString + " > "
        elif lesserMatch:
            resultString = resultString + " < "
        elif greaterEqualMatch:
            resultString = resultString + " >= "
        elif lesserEqualMatch:
            resultString = resultString + " <= "
        else:
            print "\n Error: Given Operator is not listed "

        return resultString

    def translate_experimental_mode( self, **modeType ):
        '''
         This API will translate statment EXPERIMENTAL MODE ON/OFF into python equivalent.
         It will return the transalted value.
         '''
        args = self.parse_args( [ "MODE" ], **modeType )
        resultString = ''
        ONmatch = re.match( "\s*ON", args[ "MODE" ], flags=0 )
        OFFmatch = re.match( "\sOFF", args[ "MODE" ], flags=0 )

        if ONmatch:
            resultString = "main.EXPERIMENTAL_MODE = main.TRUE"
        elif OFFmatch:
            resultString = "main.EXPERIMENTAL_MODE = main.FALSE"

        return resultString

    def interpret( self, **interpetParameters ):
        '''
         This method will accept the OpenSpeak syntax into a string and will return
         a python equivalent translations statement
        '''

        args = self.parse_args( [ "TEXT", "WRITETOFILE" ], **interpetParameters )
        resultString = ''
        # here Open Speak syntax will be translated into python equivalent.
        resultString = self.verify_and_translate( args[ "TEXT" ] )
        lineSpace = re.match( "^\s+", resultString, flags=0 )

        resultString = re.sub( "^\s+", "", resultString ) if lineSpace else resultString
        return resultString

    def translate_logs( self, **logStatement ):
        '''
         This will translate the OpenSpeak log message statements into python equivalent
         to resultString and returns resultString
        '''
        args = self.parse_args( [ "LOGLEVEL", "MESSAGE" ], **logStatement )
        resultString = ''
        # convert the statement here
        message = self.translate_log_message( message=args[ "MESSAGE" ] )
        if args[ "LOGLEVEL" ] == "INFO":
            resultString = resultString + "main.log.info( " + message + " )"
        elif args[ "LOGLEVEL" ] == "ERROR":
            resultString = resultString + "main.log.error( " + message + " )"
        elif args[ "LOGLEVEL" ] == "DEBUG":
            resultString = resultString + "main.log.debug( " + message + " )"
        elif args[ "LOGLEVEL" ] == "REPORT":
            resultString = resultString + "main.log.report( " + message + " )"
        elif args[ "LOGLEVEL" ] == "CRITICAL":
            resultString = resultString + "main.log.critical( " + message + " )"
        elif args[ "LOGLEVEL" ] == "WARN":
            resultString = resultString + "main.log.warn( " + args[ "MESSAGE" ] + ")"
        elif args[ "LOGLEVEL" ] == "EXACT":
            resultString = resultString + "main.log.exact( " + args[ "MESSAGE" ] + ")"

        return resultString

    def translate_log_message( self, **messageStatement ):
        '''
         This API will translate log messages if it is a string or Variable or combination
         of string and variable.
         It will return the analysed and translate message.
        '''
        args = self.parse_args( [ "MESSAGE" ], **messageStatement )
        resultString = ''

        paramsMatch = re.match( "PARAMS\[(.*)\]|STEP\[(.*)\]|TOPO\[(.*)\]|CASE\[(.*)\]|LAST_RESULT|LAST_RESPONSE", args[ "MESSAGE" ], flags=0 )
        stringMatch = re.match( "\s*\"(.*)\"\s*$", args[ "MESSAGE" ], flags=0 )
        stringWidVariableMatch = re.match( "\"(.*)\"\s+\+\s+(.*)", args[ "MESSAGE" ], flags=0 )
        varRefMatch = re.search( "\<(\w+)\>", args[ "MESSAGE" ], flags=0 )
        if paramsMatch:
            resultString = resultString + self.translate_parameters( parameters=args[ "MESSAGE" ] )
        elif stringMatch:
            resultString = resultString + args[ "MESSAGE" ]
        elif stringWidVariableMatch:
            quoteWord = stringWidVariableMatch.group( 1 )
            variableRef = stringWidVariableMatch.group( 2 )
            varMatch = re.search( "PARAMS\[(.*)\]|STEP\[(.*)\]|TOPO\[(.*)\]|CASE\[(.*)\]", variableRef, flags=0 )
            varRefMatch = re.search( "\<(\w+)\>", variableRef, flags=0 )
            if varMatch:
                resultString = resultString + "\"" + quoteWord + "\"" + " + " + self.translate_parameters( parameters=variableRef )
            elif varRefMatch:
                resultString = resultString + "\"" + quoteWord + "\"" + " + " + varRefMatch.group( 1 )
        elif varRefMatch:
            resultString = resultString + varRefMatch.group( 1 )
        else:
            print "\nError : Syntax error , Not defined way to give log message" + args[ "MESSAGE" ]

        return resultString

    def translate_assertion( self, **assertStatement ):
        '''
         This will translate the ASSERT <value1> <COMPARISON OPERATOR> <value2> into python
         equivalent to resultString and returns resultString
        '''
        args = self.parse_args( [ "LEFTVALUE", "OPERATOR", "RIGHTVALUE", "ONPASS", "ONFAIL" ], **assertStatement )
        resultString = ''
        # convert the statement here
        notOperatorMatch = re.search( "NOT\s+(.*)", args[ "OPERATOR" ], flags=0 )
        notOperatorSymbMatch = re.search( "\!(.*)", args[ "OPERATOR" ], flags=0 )
        operator = ''
        lastresultMatch = re.match( "LAST_RESULT", args[ "RIGHTVALUE" ], flags=0 )
        lastresponseMatch = re.match( "LAST_RESPONSE", args[ "RIGHTVALUE" ], flags=0 )
        if lastresultMatch:
            operator = "main.last_result"
        elif lastresponseMatch:
            operator = "main.last_response"
        else:
            operator = args[ "RIGHTVALUE" ]

        if args[ "OPERATOR" ] is None or args[ "OPERATOR" ] == "":
            print "\n Error : Operator has not been specified !!!"
        elif notOperatorMatch or notOperatorSymbMatch:

            operators = notOperatorMatch.group( 1 ) if notOperatorMatch else notOperatorSymbMatch.group( 1 )
            operators = self.translate_operator( operator=operators )
            if self.grtrOrLssr == 0:
                resultString = resultString + "utilities.assert_not_" + operators + "(expect=" + \
                               self.translate_response_result( operator=args[ "RIGHTVALUE" ] ) + ",actual=" + self.translate_response_result( operator=args[ "LEFTVALUE" ] ) + \
                               ",onpass=" + self.translate_assertMessage( message=args[ "ONPASS" ] ) + \
                               ",onfail=" + self.translate_assertMessage( message=args[ "ONFAIL" ] ) + ")"
            else:
                resultString = resultString + "utilities.assert_not_" + operators + "(expect=" + \
                               self.translate_response_result( operator=args[ "LEFTVALUE" ] ) + ",actual=" + self.translate_response_result( operator=args[ "RIGHTVALUE" ] ) + \
                               ",onpass=" + self.translate_assertMessage( message=args[ "ONPASS" ] ) + \
                               ",onfail=" + self.translate_assertMessage( message=args[ "ONFAIL" ] ) + ")"

        else:
            operators = self.translate_operator( operator=args[ "OPERATOR" ] )
            if self.grtrOrLssr == 0:
                resultString = resultString + "utilities.assert_" + operators + "(expect=" + \
                               self.translate_response_result( operator=args[ "RIGHTVALUE" ] ) + \
                               ",actual=" + self.translate_response_result( operator=args[ "LEFTVALUE" ] ) + \
                               ",onpass=" + self.translate_assertMessage( message=args[ "ONPASS" ] ) + \
                               ",onfail=" + self.translate_assertMessage( message=args[ "ONFAIL" ] ) + ")"
            else:
                resultString = resultString + "utilities.assert_" + operators + "(expect=" + \
                               self.translate_response_result( operator=args[ "LEFTVALUE" ] ) + \
                               ",actual=" + self.translate_response_result( operator=args[ "RIGHTVALUE" ] ) + \
                               ",onpass=" + self.translate_assertMessage( message=args[ "ONPASS" ] ) + \
                               ",onfail=" + self.translate_assertMessage( message=args[ "ONFAIL" ] ) + ")"

        return resultString

    def translate_response_result( self, **operatorStatement ):
        '''
         It will translate the LAST_RESPONSE or LAST_RESULT statement into its equivalent.
         It returns the translate form in resulString.
        '''
        args = self.parse_args( [ "OPERATOR" ], **operatorStatement )
        resultString = ''
        lastResultMatch = re.match( "LAST_RESULT", args[ "OPERATOR" ], flags=0 )
        lastResponseMatch = re.match( "LAST_RESPONSE", args[ "OPERATOR" ], flags=0 )
        if lastResultMatch:
            resultString = resultString + "main.last_result"
        elif lastResponseMatch:
            resultString = resultString + "main.last_response"
        else:
            resultString = resultString + args[ "OPERATOR" ]
        return resultString

    def translate_assertMessage( self, **messageStatement ):
        '''
         This API will facilitate the translation of assert ONPASS or ONFAIL messages . The message can be
         a string or calling another API in OpenSpeak syntax.
         It will return the translated message
        '''
        args = self.parse_args( [ "MESSAGE" ], **messageStatement )

        connectMatch = re.search( "CONNECT\s+(\w+)\s+USING\s+(.*)", args[ "MESSAGE" ], flags=0 )
        disconnectMatch = re.search( "DISCONNECT\s+(.*)", args[ "MESSAGE" ], flags=0 )
        ondoMatch = re.search( "ON\s+(.*)\s+DO\s+(.*)", args[ "MESSAGE" ], flags=0 )
        paramsMatch = re.search( "PARAMS\[(.*)\]|STEP\[(.*)\]|TOPO\[(.*)\]|CASE\[(.*)\]", args[ "MESSAGE" ], flags=0 )
        stringMatch = re.search( "\"(.*)\"|\'(.*)\'", args[ "MESSAGE" ], flags=0 )
        variableMatch = re.search( "\<(.*)\>", args[ "MESSAGE" ], flags=0 )

        resultString = ''
        if connectMatch:
            resultString = resultString + self.translate_connect( component=connectMatch.group( 1 ),
                                                                  arguments=connectMatch.group( 2 ) )
        elif disconnectMatch:
            resultString = resultString + self.translate_disconnect( component=disconnectMatch.group( 1 ) )
        elif ondoMatch:
            resultString = resultString + self.translate_onDOAs( component=ondoMatch.group( 1 ),
                                                                 action=ondoMatch.group( 2 ) )
        elif paramsMatch:
            resultString = resultString + self.translate_parameters( parameters=args[ "MESSAGE" ] )
        elif stringMatch:
            resultString = resultString + "\"" + stringMatch.group( 1 ) + "\""
        elif variableMatch:
            resultString = resultString + variableMatch.group( 1 )
        elif args[ "MESSAGE" ] is None:
            print "\n Error : Please pass a message or action for assertion "

        return resultString

    def translate_operator( self, **operatorStatement ):
        '''
          It will translate the operator for assertion , by ensuring against given arguments.
          It will return the translated assertion operator.
        '''
        args = self.parse_args( [ "OPERATOR" ], **operatorStatement )

        resultString = ''
        equalsMatch = re.match( "EQUALS$|==$", args[ "OPERATOR" ], flags=0 )
        greaterMatch = re.match( "GREATER\s+THAN$|>$", args[ "OPERATOR" ], flags=0 )
        lesserMatch = re.match( "LESSER\s+THAN$|<$", args[ "OPERATOR" ], flags=0 )
        stringMatch = re.match( "MATCHES|~$", args[ "OPERATOR" ], flags=0 )
        greaterEqualMatch = re.match( "GREATER\s+THAN\s+OR\s+EQUALS$|>=$", args[ "OPERATOR" ], flags=0 )
        lesserEqualMatch = re.match( "LESSER\s+THAN\s+OR\s+EQUALS$|<=$", args[ "OPERATOR" ], flags=0 )
        if equalsMatch:

            resultString = resultString + "equals"
        elif greaterMatch:
            self.grtrOrLssr = self.grtrOrLssr + 1
            resultString = resultString + "greater"
        elif lesserMatch:
            self.grtrOrLssr = self.grtrOrLssr + 1
            resultString = resultString + "lesser"
        elif stringMatch:

            resultString = resultString + "matches"
        elif greaterEqualMatch:

            resultString = resultString + "greater_equals"
        elif lesserEqualMatch:

            resultString = resultString + "lesser_equals"
        else:
            print "\n Error: Given Operator is not listed for assertion"
        return resultString

    def translate_store( self, **storeStatement ):
        '''
         This will translate the STORE <variable> IN <value> or <variable> = <value>
         into python equivalent to resultString and returns resultString
        '''
        args = self.parse_args( [ "VARIABLE", "VALUE" ], **storeStatement )
        resultString = ''
        # convert the statement here
        ondoMatch = re.match( "^\s*ON\s+(.*)\s+DO\s+(.*)", args[ "VALUE" ], flags=0 )
        paramsMatch = re.match( "^\s*PARAMS\[(.*)\]|STEP\[(.*)\]|TOPO\[(.*)\]|CASE\[(.*)\]|LAST_RESULT|LAST_RESPONSE", args[ "VALUE" ], flags=0 )
        if paramsMatch:
            argString = self.translate_parameters( parameters=args[ "VALUE" ] )
            resultString = args[ "VARIABLE" ] + " = " + argString
        elif ondoMatch:
            resultString = args[ "VARIABLE" ] + " = " + self.translate_onDOAs( component=ondoMatch.group( 1 ), action=ondoMatch.group( 2 ) )
        else:
            resultString = args[ "VARIABLE" ] + " = " + args[ "VALUE" ]

        return resultString

    def translate_disconnect( self, **disconnectStatement ):
        '''
         This will translate the DISCONNECT <component_name> into python
         equivalent to resultString and returns resultString
        '''
        args = self.parse_args( [ "COMPONENT" ], **disconnectStatement )
        resultString = ''
        # convert the statement here
        resultString = "main." + args[ "COMPONENT" ] + ".disconnect()"
        return resultString

    def translate_onDOAs( self, **onDoStatement ):
        '''
         This will translate the ON <component> DO <action> USING <arg1> AS <value1>,<arg2> AS <value2>
         into python equivalent to resultString and returns resultString
        '''
        args = self.parse_args( [ "COMPONENT", "ACTION", "ARGUMENTS" ], **onDoStatement )
        subString = ''

        usingMatch = re.match( "\s*(.*)\s+USING\s+(.*)", args[ "ACTION" ], flags=0 )
        action = ''
        if usingMatch:
            action = usingMatch.group( 1 )
            arguments = usingMatch.group( 2 )
            subString = self.translate_usingas( arguments=arguments )

        else:
            andCheck = re.search( "(.*)\s+AND\s+(.*)", args[ "ACTION" ], flags=0 )

            action = action + "()"
            if andCheck:
                action = andCheck.group( 1 ) + "()"
                subString = subString + self.handle_conjuction( statement=andCheck.group( 2 ) )
            else:
                action = args[ "ACTION" ]
                action = action + "()"
        # convert the statement here
        resultString = "main." + args[ "COMPONENT" ] + "." + action + subString
        return resultString

    def handle_conjuction( self, **conjuctStatement ):
        '''
        This will handle the conjuctions
        '''

        args = self.parse_args( [ "STATEMENT" ], **conjuctStatement )
        subSentence = ''

        storeMatch = re.match( "\s*STORE\s+(.*)\s+IN\s+(.*)", args[ "STATEMENT" ], flags=0 )
        assertMatch = re.match( "\s*ASSERT\s+(\w+)\s+(.*)\s+(.*)\s+ONPASS\s+(.*)\s+ONFAIL\s+(.*)", args[ "STATEMENT" ], flags=0 )
        if storeMatch:
            subSentence = "\n" + " " * 8 + self.translate_store( variable=storeMatch.group( 2 ),
                                                                         value=storeMatch.group( 1 ) )
        elif assertMatch:
            subSentence = "\n" + " " * 8 + self.translate_assertion( leftvalue=assertMatch.group( 1 ),
                                                                     operator=assertMatch.group( 2 ),
                                                                     rightvalue=assertMatch.group( 3 ),
                                                                     onpass=assertMatch.group( 4 ),
                                                                     onfail=assertMatch.group( 5 ) )
        return subSentence

    def translate_usingas( self, **argumentAS ):
        '''
         This will tranlate USING argument AS value Statement into equivalent argument passing.
         It will return translated form into resultString
        '''
        args = self.parse_args( [ "ARGUMENTS" ], **argumentAS )
        resultString = ''
        argsList = []
        subString = ''
        subSentence = ''
        line = ''
        andCheck = re.search( "(.*)\s+AND\s+(.*)", args[ "ARGUMENTS" ], flags=0 )
        if andCheck:
            line = andCheck.group( 1 )
            subSentence = self.handle_conjuction( statement=andCheck.group( 2 ) )
        else:
            line = args[ "ARGUMENTS" ]

        argsMatch = re.search( "(.*),(.*)", line, flags=0 )

        if args[ "ARGUMENTS" ] is None or args[ "ARGUMENTS" ] == '':
            subString = ''
        elif argsMatch:

            argsList = line.split( "," )
            for index, arguments in enumerate( argsList ):
                argMatch = re.search( "(.*)\s+AS\s+(.*)", arguments, flags=0 )
                if argMatch:
                    argsKey = argMatch.group( 1 )
                    argsValue = argMatch.group( 2 )
                    paramsMatch = re.search( "PARAMS\[(.*)\]|STEP\[(.*)\]|TOPO\[(.*)\]|CASE\[(.*)\]|LAST_RESPONSE|LAST_RESULT", argsValue, flags=0 )
                    if not paramsMatch:
                        if index == len( argsList ) - 1:
                            subString = subString + argsKey + "=" + argsValue
                        else:
                            subString = subString + argsKey + "=" + argsValue + ", "
                    else:
                        argString = self.translate_parameters( parameters=argsValue )
                        if index == len( argsList ) - 1:
                            subString = subString + argsKey + "=" + argString
                        else:
                            subString = subString + argsKey + "=" + argString + ", "
                else:
                    if index == len( argsList ) - 1:
                        subString = subString + arguments
                    else:
                        subString = subString + arguments + ", "
        else:
            argMatch = re.search( "(.*)\s+AS\s+(.*)", args[ "ARGUMENTS" ], flags=0 )
            if argMatch:
                argsKey = argMatch.group( 1 )
                argsValue = argMatch.group( 2 )
                paramsMatch = re.search( "PARAMS\[(.*)\]|STEP\[(.*)\]|TOPO\[(.*)\]|CASE\[(.*)\]|LAST_RESPONSE|LAST_RESULT", argsValue, flags=0 )
                if not paramsMatch:
                    subString = subString + argsKey + "=" + argsValue
                else:
                    argString = self.translate_parameters( parameters=argsValue )
                    subString = subString + argsKey + "=" + argString
            else:
                paramsMatch = re.match( "PARAMS\[(.*)\]|STEP\[(.*)\]|TOPO\[(.*)\]|CASE\[(.*)\]|LAST_RESPONSE|LAST_RESULT", line, flags=0 )
                if paramsMatch:
                    subString = subString + self.translate_parameters( parameters=line )
                else:
                    subString = subString + line
        resultString = "(" + subString + ")" + subSentence
        return resultString

    def translate_connect( self, **connectStatement ):
        '''
         This will translate the CONNECT <component_name> USING1 <arg1> AS <value1>, <arg2> AS <value2>
         into python equivalent to resultString and returns resultString
        '''
        args = self.parse_args( [ "COMPONENT", "ARGUMENTS" ], **connectStatement )
        resultString = ''
        subString = self.translate_usingas( arguments=args[ "ARGUMENTS" ] )
        # convert the statement here
        resultString = "main." + args[ "COMPONENT" ] + ".connect( " + subString + " )"
        return resultString

    def translate_parameters( self, **parameterStatement ):
        '''
         This will translate the OpenSpeak Case and Params parameters into python equivalent
         to resultString and returns resultString
        '''
        args = self.parse_args( [ "PARAMETERS" ], **parameterStatement )
        argument = args[ "PARAMETERS" ]
        resultString = ''
        # match arguments
        paramsMatch = re.search( "PARAMS((\[(.*)\])*)", argument, flags=0 )
        stepsMatch = re.search( "STEP((\[(.*)\])*)", argument, flags=0 )
        casesMatch = re.search( "CASE((\[(.*)\])*)", argument, flags=0 )
        topoMatch = re.search( "TOPO((\[(.*)\])*)", argument, flags=0 )
        lastResultMatch = re.match( "LAST_RESULT", argument, flags=0 )
        lastResponseMatch = re.match( "LAST_RESPONSE", argument, flags=0 )
        # convert the statement here
        if paramsMatch:
            params = paramsMatch.group( 1 )
            resultString = resultString + "main.params" + self._argsCheck( checkvar=params )
        elif stepsMatch:
            resultString = resultString + "main.params[\'" + self.CurrentCase + \
                           "\'][\'STEP" + str( self.CurrentStep ) + "\']" + \
                           self._argsCheck( checkvar=stepsMatch.group( 1 ) )
        elif casesMatch:
            resultString = resultString + "main.params[\'" + self.CurrentCase + "\']" + \
                           self._argsCheck( checkvar=casesMatch.group( 1 ) )
        elif topoMatch:
            resultString = resultString + "main.componentDictionary" + \
                           self._argsCheck( checkvar=topoMatch.group( 1 ) )
        elif lastResultMatch:
            resultString = resultString + "main.last_result"
        elif lastResponseMatch:
            resultString = resultString + "main.last_response"
        return resultString

    def _argsCheck( self, **args ):
        ''' This API will check if given argument is varibale reference or String and will translate accordingly.
            It will return the tanslate form in resultString.
         '''
        args = self.parse_args( [ "CHECKVAR" ], **args )
        params = args[ "CHECKVAR" ]
        argsList = params.split( "]" )
        resultString = ''
        del argsList[ len( argsList ) - 1 ]
        for index, paramArgs in enumerate( argsList ):
            argsWidVariable = re.search( "(\"|\')\s*(\w+)\s*(\'|\")", paramArgs, flags=0 )
            if argsWidVariable:
                resultString = resultString + "[\'" + argsWidVariable.group( 2 ) + "\']"
            else:
                resultString = resultString + paramArgs + "]"
        return resultString

    def translate_step( self, **stepStatement ):
        '''
         This will translate the STEP "DO SOMETHING HERE" into python equivalent
         to resultString and returns resultString
        '''
        args = self.parse_args( [ "STEP" ], **stepStatement )
        resultString = ''
        resultString = "main.step(\"" + args[ "STEP" ] + "\")"
        # convert the statement here
        return resultString

    def translate_comment( self, **commentStatement ):
        '''
         This will translate the COMMENT "DO SOMETHING HERE" into python equivalent
         to resultString and returns resultString
        '''
        args = self.parse_args( [ "COMMENT" ], **commentStatement )
        resultString = ''
        resultString = "#" + args[ "COMMENT" ]
        # convert the statement here
        return resultString

    def translate_testcase_name( self, **nameStatement ):
        '''
         This method will convert NAME "<Testcase_name>" into python equivalent statement
         to resultString and returns resultString
        '''
        args = self.parse_args( [ "TESTNAME" ], **nameStatement )

        resultString = ''
        resultString = "main.case(\"" + args[ "TESTNAME" ] + "\")"
        # convert the statement here
        return resultString

    def translate_case_block( self, **caseBlock ):
        '''
         This method will translate the case block in test script .
         It returns the translated equivalent python code for test script
        '''
        args = self.parse_args( [ "CASENUMBER" ], **caseBlock )
        resultString = ""
        resultString = "def CASE" + str( args[ "CASENUMBER" ] ) + "(self,main) :\n"
        # process the caseBlock List translate all statements underlying the given case
        return resultString

    def translate_loop_block( self, *loopBlock ):
        '''
         This method will translate for loop block into its equivalent python code.
         Whole loop block will be passed into loopBlock List.
         It returns the transalted reuslt as a string.
        '''
        resultString = ''
        # process the loopBlock List translate all statements underlying the given loop block
        return resultString

    def translate_conjuction( self, conjuctionStatement ):
        '''
         This will translate the AND conjuction statements into python equivalent
         to resultString and returns resultString
        '''
        resultString = ''
        # convert the statement here
        return resultString

    def parse_args( self, args, **kwargs ):
        '''
        It will accept the (key,value) pair and will return the (key,value) pairs with keys in uppercase.
        '''
        newArgs = {}
        for key, value in kwargs.iteritems():
            if isinstance( args, list ) and str.upper( key ) in args:
                for each in args:
                    if each == str.upper( key ):
                        newArgs[ str( each ) ] = value
                    elif each != str.upper( key ) and str( each ) not in newArgs:
                        newArgs[ str( each ) ] = None
        return newArgs
