#!/usr/bin/env python
'''
Created on 26-Dec-2012

@author: Anil Kumar (anilkumar.s@paxterrasolutions.com)


    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,e:
                    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):
            #print statementsList[index]
            m= re.match('def\s+CASE(\d+)',statementsList[index],0)
            self.caseBlock = []
            if m:
                #print m.group(1)
                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,e:
                    #print 'IndexError'
                    print ''
    
                self.caseCode [str(m.group(1))] = self.caseBlock
                #print "Case CODE "+self.caseCode [str(m.group(1))]
            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,e:
                    #print '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
