## @file
# This file contain unit test for CommentParsing
#
# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>
#
# This program and the accompanying materials are licensed and made available
# under the terms and conditions of the BSD License which accompanies this
# distribution. The full text of the license may be found at
# http://opensource.org/licenses/bsd-license.php
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

import os
import unittest

import Logger.Log as Logger
from GenMetaFile.GenInfFile import GenGuidSections
from GenMetaFile.GenInfFile import GenProtocolPPiSections
from GenMetaFile.GenInfFile import GenPcdSections
from GenMetaFile.GenInfFile import GenSpecialSections
from Library.CommentGenerating import GenGenericCommentF
from Library.CommentGenerating import _GetHelpStr
from Object.POM.CommonObject import TextObject
from Object.POM.CommonObject import GuidObject
from Object.POM.CommonObject import ProtocolObject
from Object.POM.CommonObject import PpiObject
from Object.POM.CommonObject import PcdObject
from Object.POM.ModuleObject import HobObject

from Library.String import GetSplitValueList
from Library.DataType import TAB_SPACE_SPLIT
from Library.DataType import TAB_LANGUAGE_EN_US
from Library.DataType import TAB_LANGUAGE_ENG
from Library.DataType import ITEM_UNDEFINED
from Library.DataType import TAB_INF_FEATURE_PCD
from Library import GlobalData
from Library.Misc import CreateDirectory

#
# Test _GetHelpStr
#
class _GetHelpStrTest(unittest.TestCase):
    def setUp(self):
        pass

    def tearDown(self):
        pass

    #
    # Normal case1: have one help text object with Lang = 'en-US'
    #
    def testNormalCase1(self):
        HelpStr = 'Hello world'
        HelpTextObj = TextObject()
        HelpTextObj.SetLang(TAB_LANGUAGE_EN_US)
        HelpTextObj.SetString(HelpStr)

        HelpTextList = [HelpTextObj]
        Result = _GetHelpStr(HelpTextList)
        self.assertEqual(Result, HelpStr)

    #
    # Normal case2: have two help text object with Lang = 'en-US' and other
    #
    def testNormalCase2(self):
        HelpStr = 'Hello world'
        HelpTextObj = TextObject()
        HelpTextObj.SetLang(TAB_LANGUAGE_ENG)
        HelpTextObj.SetString(HelpStr)

        HelpTextList = [HelpTextObj]

        ExpectedStr = 'Hello world1'
        HelpTextObj = TextObject()
        HelpTextObj.SetLang(TAB_LANGUAGE_EN_US)
        HelpTextObj.SetString(ExpectedStr)

        HelpTextList.append(HelpTextObj)

        Result = _GetHelpStr(HelpTextList)
        self.assertEqual(Result, ExpectedStr)

    #
    # Normal case3: have two help text object with Lang = '' and 'eng'
    #
    def testNormalCase3(self):
        HelpStr = 'Hello world'
        HelpTextObj = TextObject()
        HelpTextObj.SetLang('')
        HelpTextObj.SetString(HelpStr)

        HelpTextList = [HelpTextObj]

        ExpectedStr = 'Hello world1'
        HelpTextObj = TextObject()
        HelpTextObj.SetLang(TAB_LANGUAGE_ENG)
        HelpTextObj.SetString(ExpectedStr)

        HelpTextList.append(HelpTextObj)

        Result = _GetHelpStr(HelpTextList)
        self.assertEqual(Result, ExpectedStr)

    #
    # Normal case4: have two help text object with Lang = '' and ''
    #
    def testNormalCase4(self):

        ExpectedStr = 'Hello world1'
        HelpTextObj = TextObject()
        HelpTextObj.SetLang(TAB_LANGUAGE_ENG)
        HelpTextObj.SetString(ExpectedStr)
        HelpTextList = [HelpTextObj]

        HelpStr = 'Hello world'
        HelpTextObj = TextObject()
        HelpTextObj.SetLang('')
        HelpTextObj.SetString(HelpStr)
        HelpTextList.append(HelpTextObj)

        Result = _GetHelpStr(HelpTextList)
        self.assertEqual(Result, ExpectedStr)

    #
    # Normal case: have three help text object with Lang = '','en', 'en-US'
    #
    def testNormalCase5(self):

        ExpectedStr = 'Hello world1'
        HelpTextObj = TextObject()
        HelpTextObj.SetLang(TAB_LANGUAGE_EN_US)
        HelpTextObj.SetString(ExpectedStr)
        HelpTextList = [HelpTextObj]

        HelpStr = 'Hello unknown world'
        HelpTextObj = TextObject()
        HelpTextObj.SetLang('')
        HelpTextObj.SetString(HelpStr)
        HelpTextList.append(HelpTextObj)

        HelpStr = 'Hello mysterious world'
        HelpTextObj = TextObject()
        HelpTextObj.SetLang('')
        HelpTextObj.SetString(HelpStr)
        HelpTextList.append(HelpTextObj)

        Result = _GetHelpStr(HelpTextList)
        self.assertEqual(Result, ExpectedStr)

        HelpTextList.sort()
        self.assertEqual(Result, ExpectedStr)

        HelpTextList.sort(reverse=True)
        self.assertEqual(Result, ExpectedStr)


#
# Test GenGuidSections
#
class GenGuidSectionsTest(unittest.TestCase):
    def setUp(self):
        pass

    def tearDown(self):
        pass

    #
    # This is the API to generate Guid Object to help UnitTest
    #
    def GuidFactory(self, CName, FFE, Usage, GuidType, VariableName, HelpStr):
        Guid = GuidObject()
        Guid.SetCName(CName)
        Guid.SetFeatureFlag(FFE)
        Guid.SetGuidTypeList([GuidType])
        Guid.SetUsage(Usage)
        Guid.SetVariableName(VariableName)

        HelpTextObj = TextObject()
        HelpTextObj.SetLang('')
        HelpTextObj.SetString(HelpStr)
        Guid.SetHelpTextList([HelpTextObj])

        return Guid

    #
    # Normal case: have two GuidObject
    #
    def testNormalCase1(self):
        GuidList = []

        CName = 'Guid1'
        FFE = 'FFE1'
        Usage = 'PRODUCES'
        GuidType = 'Event'
        VariableName = ''
        HelpStr = 'Usage comment line 1'
        Guid1 = self.GuidFactory(CName, FFE, Usage, GuidType,
                                 VariableName, HelpStr)
        GuidList.append(Guid1)

        CName = 'Guid1'
        FFE = 'FFE1'
        Usage = 'CONSUMES'
        GuidType = 'Variable'
        VariableName = ''
        HelpStr = 'Usage comment line 2'
        Guid1 = self.GuidFactory(CName, FFE, Usage, GuidType,
                                 VariableName, HelpStr)
        GuidList.append(Guid1)

        Result = GenGuidSections(GuidList)
        Expected = '''[Guids]
## PRODUCES ## Event # Usage comment line 1
## CONSUMES ## Variable: # Usage comment line 2
Guid1|FFE1'''
        self.assertEqual(Result.strip(), Expected)

    #
    # Normal case: have two GuidObject
    #
    def testNormalCase2(self):
        GuidList = []

        CName = 'Guid1'
        FFE = 'FFE1'
        Usage = 'PRODUCES'
        GuidType = 'Event'
        VariableName = ''
        HelpStr = 'Usage comment line 1'
        Guid1 = self.GuidFactory(CName, FFE, Usage, GuidType,
                                 VariableName, HelpStr)
        GuidList.append(Guid1)

        CName = 'Guid1'
        FFE = 'FFE1'
        Usage = 'UNDEFINED'
        GuidType = 'UNDEFINED'
        VariableName = ''
        HelpStr = 'Generic comment line 1\n Generic comment line 2'
        Guid1 = self.GuidFactory(CName, FFE, Usage, GuidType,
                                 VariableName, HelpStr)
        GuidList.append(Guid1)

        Result = GenGuidSections(GuidList)
        Expected = '''[Guids]
## PRODUCES ## Event # Usage comment line 1
# Generic comment line 1
# Generic comment line 2
Guid1|FFE1'''

        self.assertEqual(Result.strip(), Expected)

    #
    # Normal case: have two GuidObject, one help goes to generic help,
    # the other go into usage comment
    #
    def testNormalCase3(self):
        GuidList = []

        CName = 'Guid1'
        FFE = 'FFE1'
        Usage = 'UNDEFINED'
        GuidType = 'UNDEFINED'
        VariableName = ''
        HelpStr = 'Generic comment'
        Guid1 = self.GuidFactory(CName, FFE, Usage, GuidType,
                                 VariableName, HelpStr)
        GuidList.append(Guid1)

        CName = 'Guid1'
        FFE = 'FFE1'
        Usage = 'PRODUCES'
        GuidType = 'Event'
        VariableName = ''
        HelpStr = 'Usage comment line 1'
        Guid1 = self.GuidFactory(CName, FFE, Usage, GuidType,
                                 VariableName, HelpStr)
        GuidList.append(Guid1)

        Result = GenGuidSections(GuidList)
        Expected = '''[Guids]
# Generic comment
## PRODUCES ## Event # Usage comment line 1
Guid1|FFE1'''

        self.assertEqual(Result.strip(), Expected)

    #
    # Normal case: have one GuidObject, generic comment multiple lines
    #
    def testNormalCase5(self):
        GuidList = []

        CName = 'Guid1'
        FFE = 'FFE1'
        Usage = 'UNDEFINED'
        GuidType = 'UNDEFINED'
        VariableName = ''
        HelpStr = 'Generic comment line1 \n generic comment line 2'
        Guid1 = self.GuidFactory(CName, FFE, Usage, GuidType,
                                 VariableName, HelpStr)
        GuidList.append(Guid1)

        Result = GenGuidSections(GuidList)
        Expected = '''[Guids]
# Generic comment line1
# generic comment line 2
Guid1|FFE1'''

        self.assertEqual(Result.strip(), Expected)

    #
    # Normal case: have one GuidObject, usage comment multiple lines
    #
    def testNormalCase6(self):
        GuidList = []

        CName = 'Guid1'
        FFE = 'FFE1'
        Usage = 'PRODUCES'
        GuidType = 'Event'
        VariableName = ''
        HelpStr = 'Usage comment line 1\n Usage comment line 2'
        Guid1 = self.GuidFactory(CName, FFE, Usage, GuidType,
                                 VariableName, HelpStr)
        GuidList.append(Guid1)

        Result = GenGuidSections(GuidList)
        Expected = '''[Guids]
Guid1|FFE1 ## PRODUCES ## Event # Usage comment line 1  Usage comment line 2
'''
        self.assertEqual(Result.strip(), Expected.strip())

    #
    # Normal case: have one GuidObject, usage comment one line
    #
    def testNormalCase7(self):
        GuidList = []

        CName = 'Guid1'
        FFE = 'FFE1'
        Usage = 'UNDEFINED'
        GuidType = 'UNDEFINED'
        VariableName = ''
        HelpStr = 'Usage comment line 1'
        Guid1 = self.GuidFactory(CName, FFE, Usage, GuidType,
                                 VariableName, HelpStr)
        GuidList.append(Guid1)

        Result = GenGuidSections(GuidList)
        Expected = '''[Guids]
Guid1|FFE1 # Usage comment line 1
'''
        self.assertEqual(Result.strip(), Expected.strip())

    #
    # Normal case: have two GuidObject
    #
    def testNormalCase8(self):
        GuidList = []

        CName = 'Guid1'
        FFE = 'FFE1'
        Usage = 'PRODUCES'
        GuidType = 'Event'
        VariableName = ''
        HelpStr = 'Usage comment line 1\n Usage comment line 2'
        Guid1 = self.GuidFactory(CName, FFE, Usage, GuidType,
                                 VariableName, HelpStr)
        GuidList.append(Guid1)

        CName = 'Guid1'
        FFE = 'FFE1'
        Usage = 'PRODUCES'
        GuidType = 'Event'
        VariableName = ''
        HelpStr = 'Usage comment line 3'
        Guid1 = self.GuidFactory(CName, FFE, Usage, GuidType,
                                 VariableName, HelpStr)
        GuidList.append(Guid1)

        Result = GenGuidSections(GuidList)
        Expected = '''[Guids]
## PRODUCES ## Event # Usage comment line 1  Usage comment line 2
## PRODUCES ## Event # Usage comment line 3
Guid1|FFE1
'''
        self.assertEqual(Result.strip(), Expected.strip())

    #
    # Normal case: have no GuidObject
    #
    def testNormalCase9(self):
        GuidList = []

        Result = GenGuidSections(GuidList)
        Expected = ''
        self.assertEqual(Result.strip(), Expected.strip())

    #
    # Normal case: have one GuidObject with no comment generated
    #
    def testNormalCase10(self):
        GuidList = []

        CName = 'Guid1'
        FFE = 'FFE1'
        Usage = 'UNDEFINED'
        GuidType = 'UNDEFINED'
        VariableName = ''
        HelpStr = ''
        Guid1 = self.GuidFactory(CName, FFE, Usage, GuidType,
                                 VariableName, HelpStr)
        GuidList.append(Guid1)

        Result = GenGuidSections(GuidList)
        Expected = '''[Guids]
Guid1|FFE1
'''
        self.assertEqual(Result.strip(), Expected.strip())

    #
    # Normal case: have three GuidObject
    #
    def testNormalCase11(self):
        GuidList = []

        CName = 'Guid1'
        FFE = 'FFE1'
        Usage = 'UNDEFINED'
        GuidType = 'UNDEFINED'
        VariableName = ''
        HelpStr = 'general comment line 1'
        Guid1 = self.GuidFactory(CName, FFE, Usage, GuidType,
                                 VariableName, HelpStr)
        GuidList.append(Guid1)

        CName = 'Guid1'
        FFE = 'FFE1'
        Usage = 'PRODUCES'
        GuidType = 'Event'
        VariableName = ''
        HelpStr = 'Usage comment line 3'
        Guid1 = self.GuidFactory(CName, FFE, Usage, GuidType,
                                 VariableName, HelpStr)
        GuidList.append(Guid1)

        CName = 'Guid1'
        FFE = 'FFE1'
        Usage = 'UNDEFINED'
        GuidType = 'UNDEFINED'
        VariableName = ''
        HelpStr = 'general comment line 2'
        Guid1 = self.GuidFactory(CName, FFE, Usage, GuidType,
                                 VariableName, HelpStr)
        GuidList.append(Guid1)

        Result = GenGuidSections(GuidList)
        Expected = '''[Guids]
# general comment line 1
## PRODUCES ## Event # Usage comment line 3
# general comment line 2
Guid1|FFE1
'''
        self.assertEqual(Result.strip(), Expected.strip())

    #
    # Normal case: have three GuidObject, with Usage/Type and no help
    #
    def testNormalCase12(self):
        GuidList = []

        CName = 'Guid1'
        FFE = 'FFE1'
        Usage = 'PRODUCES'
        GuidType = 'GUID'
        VariableName = ''
        HelpStr = ''
        Guid1 = self.GuidFactory(CName, FFE, Usage, GuidType,
                                 VariableName, HelpStr)
        GuidList.append(Guid1)

        CName = 'Guid1'
        FFE = 'FFE1'
        Usage = 'PRODUCES'
        GuidType = 'Event'
        VariableName = ''
        HelpStr = ''
        Guid1 = self.GuidFactory(CName, FFE, Usage, GuidType,
                                 VariableName, HelpStr)
        GuidList.append(Guid1)

        CName = 'Guid1'
        FFE = 'FFE1'
        Usage = 'CONSUMES'
        GuidType = 'Event'
        VariableName = ''
        HelpStr = ''
        Guid1 = self.GuidFactory(CName, FFE, Usage, GuidType,
                                 VariableName, HelpStr)
        GuidList.append(Guid1)

        Result = GenGuidSections(GuidList)
        Expected = '''[Guids]
## PRODUCES ## GUID
## PRODUCES ## Event
## CONSUMES ## Event
Guid1|FFE1
'''
        self.assertEqual(Result.strip(), Expected.strip())

#
# Test GenProtocolPPiSections
#
class GenProtocolPPiSectionsTest(unittest.TestCase):
    def setUp(self):
        pass

    def tearDown(self):
        pass

    #
    # This is the API to generate Protocol/Ppi Object to help UnitTest
    #
    def ObjectFactory(self, CName, FFE, Usage, Notify, HelpStr, IsProtocol):
        if IsProtocol:
            Object = ProtocolObject()
        else:
            Object = PpiObject()

        Object.SetCName(CName)
        Object.SetFeatureFlag(FFE)
        Object.SetUsage(Usage)
        Object.SetNotify(Notify)

        HelpTextObj = TextObject()
        HelpTextObj.SetLang('')
        HelpTextObj.SetString(HelpStr)
        Object.SetHelpTextList([HelpTextObj])

        return Object

    #    Usage        Notify    Help    INF Comment
    #1   UNDEFINED    true    Present    ## UNDEFINED ## NOTIFY # Help
    #2   UNDEFINED    true    Not Present    ## UNDEFINED ## NOTIFY
    #3   UNDEFINED    false    Present    ## UNDEFINED # Help
    #4   UNDEFINED    false     Not Present    ## UNDEFINED
    #5   UNDEFINED    Not Present    Present    # Help
    #6   UNDEFINED    Not Present    Not Present    <empty>
    #7   Other        true    Present    ## Other ## NOTIFY # Help
    #8   Other        true    Not Present    ## Other ## NOTIFY
    #9   Other        false    Present    ## Other # Help
    #A   Other        false     Not Present    ## Other
    #B   Other        Not Present    Present    ## Other # Help
    #C   Other        Not Present    Not Present    ## Other

    def testNormalCase1(self):
        ObjectList = []

        CName = 'Guid1'
        FFE = 'FFE1'

        Usage = 'UNDEFINED'
        Notify = True
        HelpStr = 'Help'
        IsProtocol = True
        Object = self.ObjectFactory(CName, FFE, Usage, Notify,
                                 HelpStr, IsProtocol)
        ObjectList.append(Object)


        Result = GenProtocolPPiSections(ObjectList, IsProtocol)
        Expected = '''[Protocols]
Guid1|FFE1 ## UNDEFINED ## NOTIFY # Help'''
        self.assertEqual(Result.strip(), Expected)

        IsProtocol = False
        ObjectList = []
        Object = self.ObjectFactory(CName, FFE, Usage, Notify,
                                 HelpStr, IsProtocol)
        ObjectList.append(Object)


        Result = GenProtocolPPiSections(ObjectList, IsProtocol)
        Expected = '''[Ppis]
Guid1|FFE1 ## UNDEFINED ## NOTIFY # Help'''
        self.assertEqual(Result.strip(), Expected)

    def testNormalCase2(self):
        ObjectList = []

        CName = 'Guid1'
        FFE = 'FFE1'

        Usage = 'UNDEFINED'
        Notify = True
        HelpStr = ''
        IsProtocol = True
        Object = self.ObjectFactory(CName, FFE, Usage, Notify,
                                 HelpStr, IsProtocol)
        ObjectList.append(Object)


        Result = GenProtocolPPiSections(ObjectList, IsProtocol)
        Expected = '''[Protocols]
Guid1|FFE1 ## UNDEFINED ## NOTIFY'''
        self.assertEqual(Result.strip(), Expected)

    def testNormalCase3(self):
        ObjectList = []

        CName = 'Guid1'
        FFE = 'FFE1'

        Usage = 'UNDEFINED'
        Notify = False
        HelpStr = 'Help'
        IsProtocol = True
        Object = self.ObjectFactory(CName, FFE, Usage, Notify,
                                 HelpStr, IsProtocol)
        ObjectList.append(Object)


        Result = GenProtocolPPiSections(ObjectList, IsProtocol)
        Expected = '''[Protocols]
Guid1|FFE1 ## UNDEFINED # Help'''
        self.assertEqual(Result.strip(), Expected)

    def testNormalCase4(self):
        ObjectList = []

        CName = 'Guid1'
        FFE = 'FFE1'

        Usage = 'UNDEFINED'
        Notify = False
        HelpStr = ''
        IsProtocol = True
        Object = self.ObjectFactory(CName, FFE, Usage, Notify,
                                 HelpStr, IsProtocol)
        ObjectList.append(Object)


        Result = GenProtocolPPiSections(ObjectList, IsProtocol)
        Expected = '''[Protocols]
Guid1|FFE1 ## UNDEFINED'''
        self.assertEqual(Result.strip(), Expected)

    def testNormalCase5(self):
        ObjectList = []

        CName = 'Guid1'
        FFE = 'FFE1'

        Usage = 'UNDEFINED'
        Notify = ''
        HelpStr = 'Help'
        IsProtocol = True
        Object = self.ObjectFactory(CName, FFE, Usage, Notify,
                                 HelpStr, IsProtocol)
        ObjectList.append(Object)


        Result = GenProtocolPPiSections(ObjectList, IsProtocol)
        Expected = '''[Protocols]
Guid1|FFE1 # Help'''
        self.assertEqual(Result.strip(), Expected)

    def testNormalCase6(self):
        ObjectList = []

        CName = 'Guid1'
        FFE = 'FFE1'

        Usage = 'UNDEFINED'
        Notify = ''
        HelpStr = ''
        IsProtocol = True
        Object = self.ObjectFactory(CName, FFE, Usage, Notify,
                                 HelpStr, IsProtocol)
        ObjectList.append(Object)


        Result = GenProtocolPPiSections(ObjectList, IsProtocol)
        Expected = '''[Protocols]
Guid1|FFE1'''
        self.assertEqual(Result.strip(), Expected)

    def testNormalCase7(self):
        ObjectList = []

        CName = 'Guid1'
        FFE = 'FFE1'

        Usage = 'PRODUCES'
        Notify = True
        HelpStr = 'Help'
        IsProtocol = True
        Object = self.ObjectFactory(CName, FFE, Usage, Notify,
                                 HelpStr, IsProtocol)
        ObjectList.append(Object)


        Result = GenProtocolPPiSections(ObjectList, IsProtocol)
        Expected = '''[Protocols]
Guid1|FFE1 ## PRODUCES ## NOTIFY # Help'''
        self.assertEqual(Result.strip(), Expected)

    def testNormalCase8(self):
        ObjectList = []

        CName = 'Guid1'
        FFE = 'FFE1'

        Usage = 'PRODUCES'
        Notify = True
        HelpStr = ''
        IsProtocol = True
        Object = self.ObjectFactory(CName, FFE, Usage, Notify,
                                 HelpStr, IsProtocol)
        ObjectList.append(Object)


        Result = GenProtocolPPiSections(ObjectList, IsProtocol)
        Expected = '''[Protocols]
Guid1|FFE1 ## PRODUCES ## NOTIFY'''
        self.assertEqual(Result.strip(), Expected)

    def testNormalCase9(self):
        ObjectList = []

        CName = 'Guid1'
        FFE = 'FFE1'

        Usage = 'PRODUCES'
        Notify = False
        HelpStr = 'Help'
        IsProtocol = True
        Object = self.ObjectFactory(CName, FFE, Usage, Notify,
                                 HelpStr, IsProtocol)
        ObjectList.append(Object)


        Result = GenProtocolPPiSections(ObjectList, IsProtocol)
        Expected = '''[Protocols]
Guid1|FFE1 ## PRODUCES # Help'''
        self.assertEqual(Result.strip(), Expected)

    def testNormalCaseA(self):
        ObjectList = []

        CName = 'Guid1'
        FFE = 'FFE1'

        Usage = 'PRODUCES'
        Notify = False
        HelpStr = ''
        IsProtocol = True
        Object = self.ObjectFactory(CName, FFE, Usage, Notify,
                                 HelpStr, IsProtocol)
        ObjectList.append(Object)


        Result = GenProtocolPPiSections(ObjectList, IsProtocol)
        Expected = '''[Protocols]
Guid1|FFE1 ## PRODUCES'''
        self.assertEqual(Result.strip(), Expected)

    def testNormalCaseB(self):
        ObjectList = []

        CName = 'Guid1'
        FFE = 'FFE1'

        Usage = 'PRODUCES'
        Notify = ''
        HelpStr = 'Help'
        IsProtocol = True
        Object = self.ObjectFactory(CName, FFE, Usage, Notify,
                                 HelpStr, IsProtocol)
        ObjectList.append(Object)


        Result = GenProtocolPPiSections(ObjectList, IsProtocol)
        Expected = '''[Protocols]
Guid1|FFE1 ## PRODUCES # Help'''
        self.assertEqual(Result.strip(), Expected)

    def testNormalCaseC(self):
        ObjectList = []

        CName = 'Guid1'
        FFE = 'FFE1'

        Usage = 'PRODUCES'
        Notify = ''
        HelpStr = ''
        IsProtocol = True
        Object = self.ObjectFactory(CName, FFE, Usage, Notify,
                                 HelpStr, IsProtocol)
        ObjectList.append(Object)


        Result = GenProtocolPPiSections(ObjectList, IsProtocol)
        Expected = '''[Protocols]
Guid1|FFE1 ## PRODUCES'''
        self.assertEqual(Result.strip(), Expected)

#
# Test GenPcdSections
#
class GenPcdSectionsTest(unittest.TestCase):
    def setUp(self):
        pass

    def tearDown(self):
        pass

    #
    # This is the API to generate Pcd Object to help UnitTest
    #
    def ObjectFactory(self, ItemType, TSCName, CName, DValue, FFE, Usage, Str):
        Object = PcdObject()
        HelpStr = Str

        Object.SetItemType(ItemType)
        Object.SetTokenSpaceGuidCName(TSCName)
        Object.SetCName(CName)
        Object.SetDefaultValue(DValue)
        Object.SetFeatureFlag(FFE)
        Object.SetValidUsage(Usage)

        HelpTextObj = TextObject()
        HelpTextObj.SetLang('')
        HelpTextObj.SetString(HelpStr)
        Object.SetHelpTextList([HelpTextObj])

        return Object


    #    Usage        Help    INF Comment
    #1   UNDEFINED    Present    # Help
    #2   UNDEFINED    Not Present    <empty>
    #3   Other        Present    ## Other # Help
    #4   Other        Not Present    ## Other

    def testNormalCase1(self):
        ObjectList = []
        ItemType = 'Pcd'
        TSCName = 'TSCName'
        CName = 'CName'
        DValue = 'DValue'
        FFE = 'FFE'

        Usage = 'UNDEFINED'
        Str = 'Help'

        Object = self.ObjectFactory(ItemType, TSCName, CName, DValue, FFE,
                                    Usage, Str)
        ObjectList.append(Object)

        Result = GenPcdSections(ObjectList)
        Expected = \
            '[Pcd]\n' + \
            'TSCName.CName|DValue|FFE # Help'
        self.assertEqual(Result.strip(), Expected)

    def testNormalCase2(self):
        ObjectList = []
        ItemType = 'Pcd'
        TSCName = 'TSCName'
        CName = 'CName'
        DValue = 'DValue'
        FFE = 'FFE'

        Usage = 'UNDEFINED'
        Str = ''

        Object = self.ObjectFactory(ItemType, TSCName, CName, DValue, FFE,
                                    Usage, Str)
        ObjectList.append(Object)

        Result = GenPcdSections(ObjectList)
        Expected = '[Pcd]\nTSCName.CName|DValue|FFE'
        self.assertEqual(Result.strip(), Expected)

    def testNormalCase3(self):
        ObjectList = []
        ItemType = 'Pcd'
        TSCName = 'TSCName'
        CName = 'CName'
        DValue = 'DValue'
        FFE = 'FFE'

        Usage = 'CONSUMES'
        Str = 'Help'

        Object = self.ObjectFactory(ItemType, TSCName, CName, DValue, FFE,
                                    Usage, Str)
        ObjectList.append(Object)

        Result = GenPcdSections(ObjectList)
        Expected = '[Pcd]\nTSCName.CName|DValue|FFE ## CONSUMES # Help'
        self.assertEqual(Result.strip(), Expected)

    def testNormalCase4(self):
        ObjectList = []
        ItemType = 'Pcd'
        TSCName = 'TSCName'
        CName = 'CName'
        DValue = 'DValue'
        FFE = 'FFE'

        Usage = 'CONSUMES'
        Str = ''

        Object = self.ObjectFactory(ItemType, TSCName, CName, DValue, FFE,
                                    Usage, Str)
        ObjectList.append(Object)

        Result = GenPcdSections(ObjectList)
        Expected = '[Pcd]\nTSCName.CName|DValue|FFE ## CONSUMES'
        self.assertEqual(Result.strip(), Expected)

    #
    # multiple lines for normal usage
    #
    def testNormalCase5(self):
        ObjectList = []
        ItemType = 'Pcd'
        TSCName = 'TSCName'
        CName = 'CName'
        DValue = 'DValue'
        FFE = 'FFE'

        Usage = 'CONSUMES'
        Str = 'commment line 1\ncomment line 2'
        Object = self.ObjectFactory(ItemType, TSCName, CName, DValue, FFE,
                                    Usage, Str)
        ObjectList.append(Object)

        Result = GenPcdSections(ObjectList)
        Expected = '''[Pcd]
TSCName.CName|DValue|FFE ## CONSUMES # commment line 1 comment line 2'''
        self.assertEqual(Result.strip(), Expected)

    #
    # multiple lines for UNDEFINED usage
    #
    def testNormalCase6(self):
        ObjectList = []
        ItemType = 'Pcd'
        TSCName = 'TSCName'
        CName = 'CName'
        DValue = 'DValue'
        FFE = 'FFE'

        Usage = 'UNDEFINED'
        Str = 'commment line 1\ncomment line 2'
        Object = self.ObjectFactory(ItemType, TSCName, CName, DValue, FFE,
                                    Usage, Str)
        ObjectList.append(Object)

        Usage = 'UNDEFINED'
        Str = 'commment line 3'
        Object = self.ObjectFactory(ItemType, TSCName, CName, DValue, FFE,
                                    Usage, Str)
        ObjectList.append(Object)

        Result = GenPcdSections(ObjectList)
        Expected = '''[Pcd]
# commment line 1
# comment line 2
# commment line 3
TSCName.CName|DValue|FFE'''
        self.assertEqual(Result.strip(), Expected)

    #
    # multiple lines for UNDEFINED and normal usage
    #
    def testNormalCase7(self):
        ObjectList = []
        ItemType = 'Pcd'
        TSCName = 'TSCName'
        CName = 'CName'
        DValue = 'DValue'
        FFE = 'FFE'

        Usage = 'UNDEFINED'
        Str = 'commment line 1\ncomment line 2'
        Object = self.ObjectFactory(ItemType, TSCName, CName, DValue, FFE,
                                    Usage, Str)
        ObjectList.append(Object)

        Usage = 'CONSUMES'
        Str = 'Foo'
        Object = self.ObjectFactory(ItemType, TSCName, CName, DValue, FFE,
                                    Usage, Str)
        ObjectList.append(Object)

        Usage = 'UNDEFINED'
        Str = 'commment line 3'
        Object = self.ObjectFactory(ItemType, TSCName, CName, DValue, FFE,
                                    Usage, Str)
        ObjectList.append(Object)

        Result = GenPcdSections(ObjectList)
        Expected = '''[Pcd]
# commment line 1
# comment line 2
## CONSUMES # Foo
# commment line 3
TSCName.CName|DValue|FFE'''
        self.assertEqual(Result.strip(), Expected)

    #    Usage        Help    INF Comment
    #    CONSUMES    Present    # Help (keep <EOL> and insert '#' at beginning of each new line)
    #    CONSUMES    Not Present   <empty>

    #
    # TAB_INF_FEATURE_PCD
    #
    def testNormalCase8(self):
        ObjectList = []
        ItemType = TAB_INF_FEATURE_PCD
        TSCName = 'TSCName'
        CName = 'CName'
        DValue = 'DValue'
        FFE = 'FFE'

        Usage = 'CONSUMES'
        Str = 'commment line 1\ncomment line 2'
        Object = self.ObjectFactory(ItemType, TSCName, CName, DValue, FFE,
                                    Usage, Str)
        ObjectList.append(Object)

        Result = GenPcdSections(ObjectList)
        Expected = '''[FeaturePcd]
# commment line 1
# comment line 2
TSCName.CName|DValue|FFE'''
        self.assertEqual(Result.strip(), Expected)

    #
    # TAB_INF_FEATURE_PCD
    #
    def testNormalCase9(self):
        ObjectList = []
        ItemType = TAB_INF_FEATURE_PCD
        TSCName = 'TSCName'
        CName = 'CName'
        DValue = 'DValue'
        FFE = 'FFE'

        Usage = 'CONSUMES'
        Str = ''
        Object = self.ObjectFactory(ItemType, TSCName, CName, DValue, FFE,
                                    Usage, Str)
        ObjectList.append(Object)

        Result = GenPcdSections(ObjectList)
        Expected = '''[FeaturePcd]
TSCName.CName|DValue|FFE'''
        self.assertEqual(Result.strip(), Expected)

    #
    # TAB_INF_FEATURE_PCD
    #
    def testNormalCase10(self):
        ObjectList = []
        ItemType = TAB_INF_FEATURE_PCD
        TSCName = 'TSCName'
        CName = 'CName'
        DValue = 'DValue'
        FFE = 'FFE'

        Usage = 'PRODUCES'
        Str = 'commment line 1\ncomment line 2'
        Object = self.ObjectFactory(ItemType, TSCName, CName, DValue, FFE,
                                    Usage, Str)
        ObjectList.append(Object)

        Result = GenPcdSections(ObjectList)
        Expected = '''

[FeaturePcd]
# commment line 1
# comment line 2
TSCName.CName|DValue|FFE
'''
        self.assertEqual(Result, Expected)


#
# Test GenSpecialSections of Hob
#
class GenHobSectionsTest(unittest.TestCase):
    def setUp(self):
        pass

    def tearDown(self):
        pass

    #
    # This is the API to generate Event Object to help UnitTest
    #
    def ObjectFactory(self, SupArchList, Type, Usage, Str):
        Object = HobObject()
        HelpStr = Str

        Object.SetHobType(Type)
        Object.SetUsage(Usage)
        Object.SetSupArchList(SupArchList)

        HelpTextObj = TextObject()
        HelpTextObj.SetLang('')
        HelpTextObj.SetString(HelpStr)
        Object.SetHelpTextList([HelpTextObj])

        return Object

    def testNormalCase1(self):
        ObjectList = []
        SupArchList = ['X64']
        Type = 'Foo'
        Usage = 'UNDEFINED'
        Str = 'Help'

        Object = self.ObjectFactory(SupArchList, Type, Usage, Str)
        ObjectList.append(Object)

        Result = GenSpecialSections(ObjectList, 'Hob')
        Expected = '''# [Hob.X64]
# ##
# # Help
# #
# Foo ## UNDEFINED
#
#
'''
        self.assertEqual(Result, Expected)

    def testNormalCase2(self):
        ObjectList = []
        SupArchList = []
        Type = 'Foo'
        Usage = 'UNDEFINED'
        Str = 'Help'

        Object = self.ObjectFactory(SupArchList, Type, Usage, Str)
        ObjectList.append(Object)

        Result = GenSpecialSections(ObjectList, 'Hob')
        Expected = '''# [Hob]
# ##
# # Help
# #
# Foo ## UNDEFINED
#
#
'''
        self.assertEqual(Result, Expected)

    def testNormalCase3(self):
        ObjectList = []
        SupArchList = ['X64']
        Type = 'Foo'
        Usage = 'UNDEFINED'
        Str = '\nComment Line 1\n\n'

        Object = self.ObjectFactory(SupArchList, Type, Usage, Str)
        ObjectList.append(Object)

        Result = GenSpecialSections(ObjectList, 'Hob')
        Expected = '''# [Hob.X64]
# ##
# # Comment Line 1
# #
# Foo ## UNDEFINED
#
#
'''
        self.assertEqual(Result, Expected)

    def testNormalCase4(self):
        ObjectList = []
        SupArchList = ['X64']
        Type = 'Foo'
        Usage = 'UNDEFINED'
        Str = '\nComment Line 1\n'

        Object = self.ObjectFactory(SupArchList, Type, Usage, Str)
        ObjectList.append(Object)

        Result = GenSpecialSections(ObjectList, 'Hob')
        Expected = '''# [Hob.X64]
# ##
# # Comment Line 1
# #
# Foo ## UNDEFINED
#
#
'''
        self.assertEqual(Result, Expected)

    def testNormalCase5(self):
        ObjectList = []
        SupArchList = ['X64']
        Type = 'Foo'
        Usage = 'UNDEFINED'
        Str = 'Comment Line 1\n\n'

        Object = self.ObjectFactory(SupArchList, Type, Usage, Str)
        ObjectList.append(Object)

        Result = GenSpecialSections(ObjectList, 'Hob')
        Expected = '''# [Hob.X64]
# ##
# # Comment Line 1
# #
# Foo ## UNDEFINED
#
#
'''
        self.assertEqual(Result, Expected)

    def testNormalCase6(self):
        ObjectList = []
        SupArchList = ['X64']
        Type = 'Foo'
        Usage = 'UNDEFINED'
        Str = ''

        Object = self.ObjectFactory(SupArchList, Type, Usage, Str)
        ObjectList.append(Object)

        Result = GenSpecialSections(ObjectList, 'Hob')
        Expected = '''# [Hob.X64]
# Foo ## UNDEFINED
#
#
'''
        self.assertEqual(Result, Expected)

    def testNormalCase7(self):
        ObjectList = []
        SupArchList = ['X64']
        Type = 'Foo'
        Usage = 'UNDEFINED'
        Str = '\nNew Stack HoB'


        Object = self.ObjectFactory(SupArchList, Type, Usage, Str)
        ObjectList.append(Object)

        Result = GenSpecialSections(ObjectList, 'Hob')
        Expected = '''# [Hob.X64]
# ##
# # New Stack HoB
# #
# Foo ## UNDEFINED
#
#
'''
        self.assertEqual(Result, Expected)

    def testNormalCase8(self):
        ObjectList = []
        SupArchList = ['X64']
        Type = 'Foo'
        Usage = 'UNDEFINED'
        Str = '\nNew Stack HoB\n\nTail Comment'


        Object = self.ObjectFactory(SupArchList, Type, Usage, Str)
        ObjectList.append(Object)

        Result = GenSpecialSections(ObjectList, 'Hob')
        Expected = '''# [Hob.X64]
# ##
# # New Stack HoB
# #
# # Tail Comment
# #
# Foo ## UNDEFINED
#
#
'''
        self.assertEqual(Result, Expected)

    def testNormalCase9(self):
        ObjectList = []
        SupArchList = ['X64']
        Type = 'Foo'
        Usage = 'UNDEFINED'
        Str = '\n\n'


        Object = self.ObjectFactory(SupArchList, Type, Usage, Str)
        ObjectList.append(Object)

        Result = GenSpecialSections(ObjectList, 'Hob')
        Expected = '''# [Hob.X64]
# ##
# #
# #
# Foo ## UNDEFINED
#
#
'''
        self.assertEqual(Result, Expected)

    def testNormalCase10(self):
        ObjectList = []
        SupArchList = ['X64']
        Type = 'Foo'
        Usage = 'UNDEFINED'
        Str = '\n'

        Object = self.ObjectFactory(SupArchList, Type, Usage, Str)
        ObjectList.append(Object)

        Result = GenSpecialSections(ObjectList, 'Hob')
        Expected = '''# [Hob.X64]
# ##
# #
# #
# Foo ## UNDEFINED
#
#
'''
        self.assertEqual(Result, Expected)

    def testNormalCase11(self):
        ObjectList = []
        SupArchList = ['X64']
        Type = 'Foo'
        Usage = 'UNDEFINED'
        Str = '\n\n\n'

        Object = self.ObjectFactory(SupArchList, Type, Usage, Str)
        ObjectList.append(Object)

        Result = GenSpecialSections(ObjectList, 'Hob')
        Expected = '''# [Hob.X64]
# ##
# #
# #
# Foo ## UNDEFINED
#
#
'''
        self.assertEqual(Result, Expected)

    def testNormalCase12(self):
        ObjectList = []
        SupArchList = ['X64']
        Type = 'Foo'
        Usage = 'UNDEFINED'
        Str = '\n\n\n\n'

        Object = self.ObjectFactory(SupArchList, Type, Usage, Str)
        ObjectList.append(Object)

        Result = GenSpecialSections(ObjectList, 'Hob')
        Expected = '''# [Hob.X64]
# ##
# #
# #
# #
# Foo ## UNDEFINED
#
#
'''
        self.assertEqual(Result, Expected)

#
# Test GenGenericCommentF
#
class GenGenericCommentFTest(unittest.TestCase):
    def setUp(self):
        pass

    def tearDown(self):
        pass

    def testNormalCase1(self):
        CommentLines = 'Comment Line 1'
        Result = GenGenericCommentF(CommentLines)
        Expected = '# Comment Line 1\n'
        self.assertEqual(Result, Expected)

    def testNormalCase2(self):
        CommentLines = '\n'
        Result = GenGenericCommentF(CommentLines)
        Expected = '#\n'
        self.assertEqual(Result, Expected)

    def testNormalCase3(self):
        CommentLines = '\n\n\n'
        Result = GenGenericCommentF(CommentLines)
        Expected = '#\n#\n#\n'
        self.assertEqual(Result, Expected)

    def testNormalCase4(self):
        CommentLines = 'coment line 1\n'
        Result = GenGenericCommentF(CommentLines)
        Expected = '# coment line 1\n'
        self.assertEqual(Result, Expected)

    def testNormalCase5(self):
        CommentLines = 'coment line 1\n coment line 2\n'
        Result = GenGenericCommentF(CommentLines)
        Expected = '# coment line 1\n# coment line 2\n'
        self.assertEqual(Result, Expected)

if __name__ == '__main__':
    Logger.Initialize()
    unittest.main()