def testPythonGetAllClassesAndFunctionsAnnotations(self):

        expectedFunctions = [
            'myPrint', 'add', 'subtract', 'innerFunction', 'outerFunction',
            'noParamsFunction', 'mySubstring', 'processList', 'processDict'
        ]
        expectedClasses = [
            'MyClass', 'ClassWithDummyParameters', 'NonAnnotatedClass',
            'ClassWithConstructor', 'ClassWithStaticAndClassMethods'
        ]

        def verifyStates(classes, functions, expectedAnnotClasses,
                         expectedAnnotFunctions):
            def verifyContainer(container, expectedContainer,
                                expectedAnnotations):
                i = 0
                for pythonObj, annotState in container:
                    self.assertEqual(pythonObj, expectedContainer[i])
                    status = AnnotationState.ANNOTATED if pythonObj in expectedAnnotations else AnnotationState.NOT_ANNOTATED
                    self.assertEqual(annotState, status)
                    i += 1

            verifyContainer(classes, expectedClasses, expectedAnnotClasses)
            verifyContainer(functions, expectedFunctions,
                            expectedAnnotFunctions)

        #Check without annotations
        mainFileName = 'mainFileForTests.py'
        myFunctionsFileName = os.path.join(TEST_FILES_FOLDER, "MyFunctions.py")

        mySourceCodeParser = SourceCodeParser(
            ProgramExecution.Languages.PYTHON, mainFileName)
        classes, functions = mySourceCodeParser.getAllClassesAndFunctionsAnnotations(
            myFunctionsFileName, "MyFunctions")

        #No annotations expected, just the function and classes names
        verifyStates(classes,
                     functions,
                     expectedAnnotClasses=[],
                     expectedAnnotFunctions=[])

        #Now, annotate a couple of functions and classes
        mainFileBackup = mainFileName + ".mybkp"
        try:
            shutil.copy(mainFileName, mainFileBackup)
            #Annotate main file
            mySourceCodeParser.annotateMainFile("dumpFileName.json")
            #Annotate a couple of classes
            mySourceCodeParser.annotatePythonObject("MyFunctions.MyClass",
                                                    False)
            mySourceCodeParser.annotatePythonObject(
                "MyFunctions.ClassWithConstructor", False)
            expectedAnnotClasses = ['MyClass', 'ClassWithConstructor']
            #Annotate a couple of functions
            mySourceCodeParser.annotatePythonObject("MyFunctions", True,
                                                    'subtract')
            mySourceCodeParser.annotatePythonObject("MyFunctions", True,
                                                    'outerFunction')
            expectedAnnotFunctions = ['subtract', 'outerFunction']

            #Get states, and verify annotations
            classes, functions = mySourceCodeParser.getAllClassesAndFunctionsAnnotations(
                myFunctionsFileName, "MyFunctions")
            verifyStates(classes, functions, expectedAnnotClasses,
                         expectedAnnotFunctions)
        finally:
            if os.path.exists(mainFileBackup):
                shutil.copy(mainFileBackup, mainFileName)
                os.remove(mainFileBackup)
    def testCppGetAllClassesAndFunctionsAnnotations(self):
        MY_HEADER = "MyFunctions.h"
        expectedFunctions = [
            'myPrint', 'add', 'subtract', 'innerFunction', 'outerFunction',
            'noParamsFunction', 'mySubstring', 'processVector', 'processIntMap'
        ]
        expectedClasses = [
            'MyClass', 'ClassWithConstructor', 'ClassWithStaticMethods'
        ]

        def verifyStates(classes, functions, expectedAnnotClasses,
                         expectedAnnotFunctions):
            def verifyContainer(container, expectedContainer,
                                expectedAnnotations):
                i = 0
                for obj, annotState in container:
                    self.assertEqual(obj, expectedContainer[i])
                    status = AnnotationState.ANNOTATED if obj in expectedAnnotations else AnnotationState.NOT_ANNOTATED
                    self.assertEqual(annotState, status)
                    i += 1

            verifyContainer(classes, expectedClasses, expectedAnnotClasses)
            verifyContainer(functions, expectedFunctions,
                            expectedAnnotFunctions)

        #Check without annotations
        mainFileName = os.path.join(TEST_FILES_FOLDER,
                                    "testAnnotateMainCpp.cpp")
        myFunctionsFileName = os.path.join(TEST_FILES_FOLDER, MY_HEADER)

        mySourceCodeParser = SourceCodeParser(
            ProgramExecution.Languages.C_PLUS_PLUS, mainFileName)
        classes, functions = mySourceCodeParser.getAllClassesAndFunctionsAnnotations(
            myFunctionsFileName, )

        #No annotations expected, just the function and classes names
        verifyStates(classes,
                     functions,
                     expectedAnnotClasses=[],
                     expectedAnnotFunctions=[])

        #Now, annotate a couple of functions and classes
        myFunctionsFileBackup = myFunctionsFileName + ".mybkp"
        resultFileName = os.path.join(TEST_FILES_FOLDER,
                                      myFunctionsFileName + "_result.h")
        resultFileName2 = resultFileName + ".2"
        try:
            shutil.copy(myFunctionsFileName, myFunctionsFileBackup)

            #Annotate a couple of classes
            expectedAnnotClasses = ['MyClass', 'ClassWithConstructor']
            mySourceCodeParser.annotateCppClasses(myFunctionsFileName,
                                                  resultFileName, MY_HEADER,
                                                  expectedAnnotClasses)

            #Annotate a couple of functions
            expectedAnnotFunctions = ['subtract', 'outerFunction']
            mySourceCodeParser.annotateCppFunctions(resultFileName,
                                                    resultFileName2, MY_HEADER,
                                                    expectedAnnotFunctions)

            #Get states, and verify annotations
            classes, functions = mySourceCodeParser.getAllClassesAndFunctionsAnnotations(
                resultFileName2, MY_HEADER)
            verifyStates(classes, functions, expectedAnnotClasses,
                         expectedAnnotFunctions)
        finally:
            if os.path.exists(myFunctionsFileBackup):
                shutil.copy(myFunctionsFileBackup, myFunctionsFileName)
                os.remove(myFunctionsFileBackup)
            if os.path.exists(resultFileName):
                os.remove(resultFileName)
            if os.path.exists(resultFileName2):
                os.remove(resultFileName2)