#!/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
