#!/usr/bin/env python
"""
Created on 26-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 sys


class TestParser:

    def __init__( self, testFile ):
        try:
            testFileHandler = open( testFile, 'r' )
        except IOError:
            print "No such file " + testFile
            sys.exit( 0 )

        testFileList = testFileHandler.readlines()
        self.testscript = testFileList
        self.caseCode = {}
        self.caseBlock = ''
        self.statementsList = []
        index = 0
        self.statementsList = []
        # initialSpaces = len( line ) -len( line.lstrip() )
        while index < len( testFileList ):
            testFileList[ index ] = re.sub( "^\s{8}|^\s{4}", "", testFileList[ index ] )
            # Skip multiline comments
            if re.match( '^(\'\'\' )|^( \"\"\" )', testFileList[ index ], 0 ):
                index = index + 1
                try:
                    while not re.match( '^\s*(\'\'\' )|^\s*( \"\"\" )', testFileList[ index ], 0 ):
                        index = index + 1
                except IndexError:
                    print ''

            # skip empty lines and single line comments
            elif not re.match( '#|^\s*$', testFileList[ index ], 0 ):
                self.statementsList.append( testFileList[ index ] )
            index = index + 1

    def case_code( self ):
        index = 0
        statementsList = self.statementsList
        while index < len( statementsList ):
            m = re.match( 'def\s+CASE(\d+)', statementsList[ index ], 0 )
            self.caseBlock = []
            if m:
                index = index + 1
                try:
                    while not re.match( '\s*def\s+CASE(\d+)', statementsList[ index ], 0 ):
                        self.caseBlock.append( statementsList[ index ] )
                        if index < len( statementsList ) - 1:
                            index = index + 1
                        else:
                            break
                    index = index - 1
                except IndexError:
                    print ''
                self.caseCode[ str( m.group( 1 ) ) ] = self.caseBlock
            index = index + 1
        return self.caseCode

    def step_code( self, caseStatements ):
        index = 0
        step = 0
        stepCode = {}
        step_flag = False
        while index < len( caseStatements ):
            m = re.match( 'main\.step', caseStatements[ index ], 0 )
            stepBlock = ''
            if m:
                step_flag = True
                if step == 0:
                    i = 0
                    block = ''
                    while i < index:
                        block += caseStatements[ i ]
                        i = i + 1
                    stepCode[ step ] = block
                    step = step + 1
                stepBlock = stepBlock + caseStatements[ index ]
                index = index + 1
                try:
                    while not re.match( 'main\.step', caseStatements[ index ], 0 ):
                        stepBlock = stepBlock + caseStatements[ index ]
                        if index < len( caseStatements ) - 1:
                            index = index + 1
                        else:
                            break
                    index = index - 1
                except IndexError:
                    print ''
                stepCode[ step ] = stepBlock
                step = step + 1
            index = index + 1
        # If there is no step defined !!
        if not step_flag:
            stepCode[ step ] = "".join( caseStatements )
        return stepCode

    def getStepCode( self ):
        case_step_code = {}
        case_block = self.case_code()
        for case in case_block:
            case_step_code[ case ] = {}
            step_block = self.step_code( case_block[ case ] )
            for step in step_block:
                case_step_code[ case ][ step ] = step_block[ step ]
        return case_step_code
