## @file
# This file contain unit test for CommentParsing
#
# Copyright (c) 2011 - 2018, 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 unittest

import Logger.Log as Logger
from Library.CommentParsing import ParseHeaderCommentSection, \
                                   ParseGenericComment, \
                                   ParseDecPcdGenericComment, \
                                   ParseDecPcdTailComment
from Library.CommentParsing import _IsCopyrightLine
from Library.StringUtils import GetSplitValueList
from Library.DataType import TAB_SPACE_SPLIT
from Library.DataType import TAB_LANGUAGE_EN_US

#
# Test ParseHeaderCommentSection
#
class ParseHeaderCommentSectionTest(unittest.TestCase):
    def setUp(self):
        pass

    def tearDown(self):
        pass
 
    #
    # Normal case1: have license/copyright/license above @file
    #
    def testNormalCase1(self):
        TestCommentLines1 = \
        '''# License1
        # License2
        #
        ## @file
        # example abstract 
        # 
        # example description
        # 
        # Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
        # 
        # License3 
        #'''
        
        CommentList = GetSplitValueList(TestCommentLines1, "\n")
        LineNum = 0
        TestCommentLinesList = []
        for Comment in CommentList:
            LineNum += 1
            TestCommentLinesList.append((Comment, LineNum))
            
        Abstract, Description, Copyright, License = \
            ParseHeaderCommentSection(TestCommentLinesList, "PhonyFile")
        
        ExpectedAbstract = 'example abstract'
        self.assertEqual(Abstract, ExpectedAbstract)
        
        ExpectedDescription = 'example description'
        self.assertEqual(Description, ExpectedDescription)
        
        ExpectedCopyright = \
            'Copyright (c) 2007 - 2010,'\
            ' Intel Corporation. All rights reserved.<BR>'
        self.assertEqual(Copyright, ExpectedCopyright)
        
        ExpectedLicense = 'License1\nLicense2\n\nLicense3'
        self.assertEqual(License, ExpectedLicense)

    #
    # Normal case2: have license/copyright above @file, but no copyright after
    #
    def testNormalCase2(self):
        TestCommentLines2 = \
        ''' # License1
        # License2
        #
        ## @file
        # example abstract 
        # 
        # example description
        #
        #Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
        #
        ##'''
        
        CommentList = GetSplitValueList(TestCommentLines2, "\n")
        LineNum = 0
        TestCommentLinesList = []
        for Comment in CommentList:
            LineNum += 1
            TestCommentLinesList.append((Comment, LineNum))
            
        Abstract, Description, Copyright, License = \
            ParseHeaderCommentSection(TestCommentLinesList, "PhonyFile")
        
        ExpectedAbstract = 'example abstract'
        self.assertEqual(Abstract, ExpectedAbstract)
        
        ExpectedDescription = 'example description'
        self.assertEqual(Description, ExpectedDescription)
        
        ExpectedCopyright = \
            'Copyright (c) 2007 - 2010, Intel Corporation.'\
            ' All rights reserved.<BR>'
        self.assertEqual(Copyright, ExpectedCopyright)
        
        ExpectedLicense = 'License1\nLicense2'
        self.assertEqual(License, ExpectedLicense)
        

    #
    # Normal case2: have license/copyright/license above @file, 
    # but no abstract/description
    #
    def testNormalCase3(self):
        TestCommentLines3 = \
        ''' # License1
        # License2
        #
        ## @file 
        # Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
        #
        # License3 Line1
        # License3 Line2
        ##'''
     
        CommentList = GetSplitValueList(TestCommentLines3, "\n")
        LineNum = 0
        TestCommentLinesList = []
        for Comment in CommentList:
            LineNum += 1
            TestCommentLinesList.append((Comment, LineNum))
            
        Abstract, Description, Copyright, License = \
            ParseHeaderCommentSection(TestCommentLinesList, "PhonyFile")
        
        ExpectedAbstract = ''
        self.assertEqual(Abstract, ExpectedAbstract)
        
        ExpectedDescription = ''
        self.assertEqual(Description, ExpectedDescription)
        
        ExpectedCopyright = \
            'Copyright (c) 2007 - 2010,'\
            ' Intel Corporation. All rights reserved.<BR>'
        self.assertEqual(Copyright, ExpectedCopyright)
        
        ExpectedLicense = \
            'License1\n' \
            'License2\n\n' \
            'License3 Line1\n' \
            'License3 Line2'
        self.assertEqual(License, ExpectedLicense)        
           
    #
    # Normal case4: format example in spec
    #
    def testNormalCase4(self):
        TestCommentLines = \
        '''
        ## @file
        # Abstract
        #
        # Description
        #
        # Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
        #
        # License
        #
        ##'''
     
        CommentList = GetSplitValueList(TestCommentLines, "\n")
        LineNum = 0
        TestCommentLinesList = []
        for Comment in CommentList:
            LineNum += 1
            TestCommentLinesList.append((Comment, LineNum))
            
        Abstract, Description, Copyright, License = \
            ParseHeaderCommentSection(TestCommentLinesList, "PhonyFile")
        
        ExpectedAbstract = 'Abstract'
        self.assertEqual(Abstract, ExpectedAbstract)
        
        ExpectedDescription = 'Description'
        self.assertEqual(Description, ExpectedDescription)
        
        ExpectedCopyright = \
            'Copyright (c) 2007 - 2010, Intel Corporation.'\
            ' All rights reserved.<BR>'
        self.assertEqual(Copyright, ExpectedCopyright)
        
        ExpectedLicense = \
            'License'
        self.assertEqual(License, ExpectedLicense)

    #
    # Normal case5: other line between copyright
    #
    def testNormalCase5(self):
        TestCommentLines = \
        '''
        ## @file
        # Abstract
        #
        # Description
        #
        # Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
        # other line        
        # Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
        #
        # License
        #
        ##'''
     
        CommentList = GetSplitValueList(TestCommentLines, "\n")
        LineNum = 0
        TestCommentLinesList = []
        for Comment in CommentList:
            LineNum += 1
            TestCommentLinesList.append((Comment, LineNum))
            
        Abstract, Description, Copyright, License = \
            ParseHeaderCommentSection(TestCommentLinesList, "PhonyFile")
        
        ExpectedAbstract = 'Abstract'
        self.assertEqual(Abstract, ExpectedAbstract)
        
        ExpectedDescription = 'Description'
        self.assertEqual(Description, ExpectedDescription)
        
        ExpectedCopyright = \
            'Copyright (c) 2007 - 2010, Intel Corporation.'\
            ' All rights reserved.<BR>\n'\
            'Copyright (c) 2007 - 2010, Intel Corporation.'\
            ' All rights reserved.<BR>'
        self.assertEqual(Copyright, ExpectedCopyright)
        
        ExpectedLicense = \
            'License'
        self.assertEqual(License, ExpectedLicense)

    #
    # Normal case6: multiple lines of copyright
    #
    def testNormalCase6(self):
        TestCommentLines = \
        '''
        ## @file
        # Abstract
        #
        # Description
        #
        # Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
        # Copyright (c) 2007 - 2010, FOO1 Corporation. All rights reserved.<BR>      
        # Copyright (c) 2007 - 2010, FOO2 Corporation. All rights reserved.<BR>
        #
        # License
        #
        ##'''
     
        CommentList = GetSplitValueList(TestCommentLines, "\n")
        LineNum = 0
        TestCommentLinesList = []
        for Comment in CommentList:
            LineNum += 1
            TestCommentLinesList.append((Comment, LineNum))
            
        Abstract, Description, Copyright, License = \
            ParseHeaderCommentSection(TestCommentLinesList, "PhonyFile")
        
        ExpectedAbstract = 'Abstract'
        self.assertEqual(Abstract, ExpectedAbstract)
        
        ExpectedDescription = 'Description'
        self.assertEqual(Description, ExpectedDescription)
        
        ExpectedCopyright = \
            'Copyright (c) 2007 - 2010, Intel Corporation.'\
            ' All rights reserved.<BR>\n'\
            'Copyright (c) 2007 - 2010, FOO1 Corporation.'\
            ' All rights reserved.<BR>\n'\
            'Copyright (c) 2007 - 2010, FOO2 Corporation.'\
            ' All rights reserved.<BR>'
        self.assertEqual(Copyright, ExpectedCopyright)
        
        ExpectedLicense = \
            'License'
        self.assertEqual(License, ExpectedLicense)

    #
    # Normal case7: Abstract not present
    #
    def testNormalCase7(self):
        TestCommentLines = \
        '''
        ## @file
        #
        # Description
        #
        # Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
        # Copyright (c) 2007 - 2010, FOO1 Corporation. All rights reserved.<BR>      
        # Copyright (c) 2007 - 2010, FOO2 Corporation. All rights reserved.<BR>
        #
        # License
        #
        ##'''
     
        CommentList = GetSplitValueList(TestCommentLines, "\n")
        LineNum = 0
        TestCommentLinesList = []
        for Comment in CommentList:
            LineNum += 1
            TestCommentLinesList.append((Comment, LineNum))
            
        Abstract, Description, Copyright, License = \
            ParseHeaderCommentSection(TestCommentLinesList, "PhonyFile")
        
        ExpectedAbstract = ''
        self.assertEqual(Abstract, ExpectedAbstract)
        
        ExpectedDescription = 'Description'
        self.assertEqual(Description, ExpectedDescription)
        
        ExpectedCopyright = \
            'Copyright (c) 2007 - 2010, Intel Corporation.'\
            ' All rights reserved.<BR>\n'\
            'Copyright (c) 2007 - 2010, FOO1 Corporation.'\
            ' All rights reserved.<BR>\n'\
            'Copyright (c) 2007 - 2010, FOO2 Corporation.'\
            ' All rights reserved.<BR>'
        self.assertEqual(Copyright, ExpectedCopyright)
        
        ExpectedLicense = \
            'License'
        self.assertEqual(License, ExpectedLicense)

    #
    # Normal case8: Description not present
    #
    def testNormalCase8(self):
        TestCommentLines = \
        '''
        ## @file
        # Abstact
        #
        # Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
        #
        # License
        #
        ##'''
     
        CommentList = GetSplitValueList(TestCommentLines, "\n")
        LineNum = 0
        TestCommentLinesList = []
        for Comment in CommentList:
            LineNum += 1
            TestCommentLinesList.append((Comment, LineNum))
            
        Abstract, Description, Copyright, License = \
            ParseHeaderCommentSection(TestCommentLinesList, "PhonyFile")
        
        ExpectedAbstract = 'Abstact'
        self.assertEqual(Abstract, ExpectedAbstract)
        
        ExpectedDescription = ''
        self.assertEqual(Description, ExpectedDescription)
        
        ExpectedCopyright = \
            'Copyright (c) 2007 - 2010, Intel Corporation.'\
            ' All rights reserved.<BR>'
        self.assertEqual(Copyright, ExpectedCopyright)
        
        ExpectedLicense = \
            'License'
        self.assertEqual(License, ExpectedLicense)
                
    #
    # Error case1: No copyright found
    #
    def testErrorCase1(self):
        TestCommentLines = \
        '''
        ## @file
        # Abstract
        #
        # Description
        #
        # License
        #
        ##'''
     
        CommentList = GetSplitValueList(TestCommentLines, "\n")
        LineNum = 0
        TestCommentLinesList = []
        for Comment in CommentList:
            LineNum += 1
            TestCommentLinesList.append((Comment, LineNum))
        
        self.assertRaises(Logger.FatalError, 
                          ParseHeaderCommentSection, 
                          TestCommentLinesList,
                          "PhonyFile")    

    #
    # Error case2: non-empty non-comment lines passed in
    #
    def testErrorCase2(self):
        TestCommentLines = \
        '''
        ## @file
        # Abstract
        #
        this is invalid line
        # Description
        #
        # Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>        
        # License
        #
        ##'''
     
        CommentList = GetSplitValueList(TestCommentLines, "\n")
        LineNum = 0
        TestCommentLinesList = []
        for Comment in CommentList:
            LineNum += 1
            TestCommentLinesList.append((Comment, LineNum))
        
        self.assertRaises(Logger.FatalError, 
                          ParseHeaderCommentSection, 
                          TestCommentLinesList,
                          "PhonyFile")   

#
# Test ParseGenericComment
#
class ParseGenericCommentTest(unittest.TestCase):
    def setUp(self):
        pass

    def tearDown(self):
        pass
 
    #
    # Normal case1: one line of comment
    #
    def testNormalCase1(self):
        TestCommentLines = \
        '''# hello world'''
     
        CommentList = GetSplitValueList(TestCommentLines, "\n")
        LineNum = 0
        TestCommentLinesList = []
        for Comment in CommentList:
            LineNum += 1
            TestCommentLinesList.append((Comment, LineNum))

        HelptxtObj = ParseGenericComment(TestCommentLinesList, 'testNormalCase1')
        self.failIf(not HelptxtObj)
        self.assertEqual(HelptxtObj.GetString(), 'hello world')
        self.assertEqual(HelptxtObj.GetLang(), TAB_LANGUAGE_EN_US)

    #
    # Normal case2: multiple lines of comment
    #
    def testNormalCase2(self):
        TestCommentLines = \
        '''## hello world
        # second line'''
     
        CommentList = GetSplitValueList(TestCommentLines, "\n")
        LineNum = 0
        TestCommentLinesList = []
        for Comment in CommentList:
            LineNum += 1
            TestCommentLinesList.append((Comment, LineNum))
        
        HelptxtObj = ParseGenericComment(TestCommentLinesList, 'testNormalCase2')
        self.failIf(not HelptxtObj)
        self.assertEqual(HelptxtObj.GetString(), 
                         'hello world\n' + 'second line')
        self.assertEqual(HelptxtObj.GetLang(), TAB_LANGUAGE_EN_US)

    #
    # Normal case3: multiple lines of comment, non comment lines will be skipped
    #
    def testNormalCase3(self):
        TestCommentLines = \
        '''## hello world
        This is not comment line'''
     
        CommentList = GetSplitValueList(TestCommentLines, "\n")
        LineNum = 0
        TestCommentLinesList = []
        for Comment in CommentList:
            LineNum += 1
            TestCommentLinesList.append((Comment, LineNum))
        
        HelptxtObj = ParseGenericComment(TestCommentLinesList, 'testNormalCase3')
        self.failIf(not HelptxtObj)
        self.assertEqual(HelptxtObj.GetString(), 
                         'hello world\n\n')
        self.assertEqual(HelptxtObj.GetLang(), TAB_LANGUAGE_EN_US)

#
# Test ParseDecPcdGenericComment
#
class ParseDecPcdGenericCommentTest(unittest.TestCase):
    def setUp(self):
        pass

    def tearDown(self):
        pass
 
    #
    # Normal case1: comments with no special comment
    #
    def testNormalCase1(self):
        TestCommentLines = \
        '''## hello world
        # second line'''
     
        CommentList = GetSplitValueList(TestCommentLines, "\n")
        LineNum = 0
        TestCommentLinesList = []
        for Comment in CommentList:
            LineNum += 1
            TestCommentLinesList.append((Comment, LineNum))
        
        (HelpTxt, PcdErr) = \
            ParseDecPcdGenericComment(TestCommentLinesList, 'testNormalCase1')
        self.failIf(not HelpTxt)
        self.failIf(PcdErr)
        self.assertEqual(HelpTxt, 
                         'hello world\n' + 'second line')
       
       
    #
    # Normal case2: comments with valid list
    #
    def testNormalCase2(self):
        TestCommentLines = \
        '''## hello world
        # second line
        # @ValidList 1, 2, 3
        # other line'''
     
        CommentList = GetSplitValueList(TestCommentLines, "\n")
        LineNum = 0
        TestCommentLinesList = []
        for Comment in CommentList:
            LineNum += 1
            TestCommentLinesList.append((Comment, LineNum))
        
        (HelpTxt, PcdErr) = \
            ParseDecPcdGenericComment(TestCommentLinesList, 'UnitTest')
        self.failIf(not HelpTxt)
        self.failIf(not PcdErr)
        self.assertEqual(HelpTxt, 
                         'hello world\n' + 'second line\n' + 'other line')
        ExpectedList = GetSplitValueList('1 2 3', TAB_SPACE_SPLIT)
        ActualList = [item for item in \
            GetSplitValueList(PcdErr.GetValidValue(), TAB_SPACE_SPLIT) if item]
        self.assertEqual(ExpectedList, ActualList)
        self.failIf(PcdErr.GetExpression())
        self.failIf(PcdErr.GetValidValueRange())

    #
    # Normal case3: comments with valid range
    #
    def testNormalCase3(self):
        TestCommentLines = \
        '''## hello world
        # second line
        # @ValidRange LT 1 AND GT 2
        # other line'''
     
        CommentList = GetSplitValueList(TestCommentLines, "\n")
        LineNum = 0
        TestCommentLinesList = []
        for Comment in CommentList:
            LineNum += 1
            TestCommentLinesList.append((Comment, LineNum))
        
        (HelpTxt, PcdErr) = \
            ParseDecPcdGenericComment(TestCommentLinesList, 'UnitTest')
        self.failIf(not HelpTxt)
        self.failIf(not PcdErr)
        self.assertEqual(HelpTxt, 
                         'hello world\n' + 'second line\n' + 'other line')
        self.assertEqual(PcdErr.GetValidValueRange().strip(), 'LT 1 AND GT 2')
        self.failIf(PcdErr.GetExpression())
        self.failIf(PcdErr.GetValidValue())

    #
    # Normal case4: comments with valid expression
    #
    def testNormalCase4(self):
        TestCommentLines = \
        '''## hello world
        # second line
        # @Expression LT 1 AND GT 2
        # other line'''
     
        CommentList = GetSplitValueList(TestCommentLines, "\n")
        LineNum = 0
        TestCommentLinesList = []
        for Comment in CommentList:
            LineNum += 1
            TestCommentLinesList.append((Comment, LineNum))
        
        (HelpTxt, PcdErr) = \
            ParseDecPcdGenericComment(TestCommentLinesList, 'UnitTest')
        self.failIf(not HelpTxt)
        self.failIf(not PcdErr)
        self.assertEqual(HelpTxt, 
                         'hello world\n' + 'second line\n' + 'other line')
        self.assertEqual(PcdErr.GetExpression().strip(), 'LT 1 AND GT 2')
        self.failIf(PcdErr.GetValidValueRange())
        self.failIf(PcdErr.GetValidValue())

    #
    # Normal case5: comments with valid expression and no generic comment
    #
    def testNormalCase5(self):
        TestCommentLines = \
        '''# @Expression LT 1 AND GT 2'''
     
        CommentList = GetSplitValueList(TestCommentLines, "\n")
        LineNum = 0
        TestCommentLinesList = []
        for Comment in CommentList:
            LineNum += 1
            TestCommentLinesList.append((Comment, LineNum))
        
        (HelpTxt, PcdErr) = \
            ParseDecPcdGenericComment(TestCommentLinesList, 'UnitTest')
        self.failIf(HelpTxt)
        self.failIf(not PcdErr)
        self.assertEqual(PcdErr.GetExpression().strip(), 'LT 1 AND GT 2')
        self.failIf(PcdErr.GetValidValueRange())
        self.failIf(PcdErr.GetValidValue())
 
    #
    # Normal case6: comments with only generic help text
    #
    def testNormalCase6(self):
        TestCommentLines = \
        '''#'''
     
        CommentList = GetSplitValueList(TestCommentLines, "\n")
        LineNum = 0
        TestCommentLinesList = []
        for Comment in CommentList:
            LineNum += 1
            TestCommentLinesList.append((Comment, LineNum))
        
        (HelpTxt, PcdErr) = \
            ParseDecPcdGenericComment(TestCommentLinesList, 'UnitTest')
        self.assertEqual(HelpTxt, '\n')
        self.failIf(PcdErr)

        
        
    #
    # Error case1: comments with both expression and valid list, use later
    # ignore the former and with a warning message
    #
    def testErrorCase1(self):
        TestCommentLines = \
        '''## hello world
        # second line
        # @ValidList 1, 2, 3        
        # @Expression LT 1 AND GT 2
        # other line'''
     
        CommentList = GetSplitValueList(TestCommentLines, "\n")
        LineNum = 0
        TestCommentLinesList = []
        for Comment in CommentList:
            LineNum += 1
            TestCommentLinesList.append((Comment, LineNum))
        
        try:
            ParseDecPcdGenericComment(TestCommentLinesList, 'UnitTest')
        except Logger.FatalError:
            pass

#
# Test ParseDecPcdTailComment
#
class ParseDecPcdTailCommentTest(unittest.TestCase):
    def setUp(self):
        pass

    def tearDown(self):
        pass
 
    #
    # Normal case1: comments with no SupModeList
    #
    def testNormalCase1(self):
        TestCommentLines = \
        '''## #hello world'''
     
        CommentList = GetSplitValueList(TestCommentLines, "\n")
        LineNum = 0
        TestCommentLinesList = []
        for Comment in CommentList:
            LineNum += 1
            TestCommentLinesList.append((Comment, LineNum))
        
        (SupModeList, HelpStr) = \
            ParseDecPcdTailComment(TestCommentLinesList, 'UnitTest')
        self.failIf(not HelpStr)
        self.failIf(SupModeList)
        self.assertEqual(HelpStr, 
                         'hello world')

    #
    # Normal case2: comments with one SupMode
    #
    def testNormalCase2(self):
        TestCommentLines = \
        '''## BASE #hello world'''
     
        CommentList = GetSplitValueList(TestCommentLines, "\n")
        LineNum = 0
        TestCommentLinesList = []
        for Comment in CommentList:
            LineNum += 1
            TestCommentLinesList.append((Comment, LineNum))
        
        (SupModeList, HelpStr) = \
            ParseDecPcdTailComment(TestCommentLinesList, 'UnitTest')
        self.failIf(not HelpStr)
        self.failIf(not SupModeList)
        self.assertEqual(HelpStr, 
                         'hello world')
        self.assertEqual(SupModeList, 
                         ['BASE'])
        
    #
    # Normal case3: comments with more than one SupMode
    #
    def testNormalCase3(self):
        TestCommentLines = \
        '''## BASE  UEFI_APPLICATION #hello world'''
     
        CommentList = GetSplitValueList(TestCommentLines, "\n")
        LineNum = 0
        TestCommentLinesList = []
        for Comment in CommentList:
            LineNum += 1
            TestCommentLinesList.append((Comment, LineNum))
        
        (SupModeList, HelpStr) = \
            ParseDecPcdTailComment(TestCommentLinesList, 'UnitTest')
        self.failIf(not HelpStr)
        self.failIf(not SupModeList)
        self.assertEqual(HelpStr, 
                         'hello world')
        self.assertEqual(SupModeList, 
                         ['BASE', 'UEFI_APPLICATION'])

    #
    # Normal case4: comments with more than one SupMode, no help text
    #
    def testNormalCase4(self):
        TestCommentLines = \
        '''## BASE  UEFI_APPLICATION'''
     
        CommentList = GetSplitValueList(TestCommentLines, "\n")
        LineNum = 0
        TestCommentLinesList = []
        for Comment in CommentList:
            LineNum += 1
            TestCommentLinesList.append((Comment, LineNum))
        
        (SupModeList, HelpStr) = \
            ParseDecPcdTailComment(TestCommentLinesList, 'UnitTest')
        self.failIf(HelpStr)
        self.failIf(not SupModeList)
        self.assertEqual(SupModeList, 
                         ['BASE', 'UEFI_APPLICATION'])

    #
    # Normal case5: general comments with no supModList, extract from real case 
    #
    def testNormalCase5(self):
        TestCommentLines = \
        ''' # 1 = 128MB, 2 = 256MB, 3 = MAX'''
     
        CommentList = GetSplitValueList(TestCommentLines, "\n")
        LineNum = 0
        TestCommentLinesList = []
        for Comment in CommentList:
            LineNum += 1
            TestCommentLinesList.append((Comment, LineNum))
        
        (SupModeList, HelpStr) = \
            ParseDecPcdTailComment(TestCommentLinesList, 'UnitTest')
        self.failIf(not HelpStr)
        self.assertEqual(HelpStr, 
                         '1 = 128MB, 2 = 256MB, 3 = MAX')
        self.failIf(SupModeList)
        

    #
    # Error case2: comments with supModList contains valid and invalid 
    # module type
    #
    def testErrorCase2(self):
        TestCommentLines = \
        '''## BASE INVALID_MODULE_TYPE #hello world'''
     
        CommentList = GetSplitValueList(TestCommentLines, "\n")
        LineNum = 0
        TestCommentLinesList = []
        for Comment in CommentList:
            LineNum += 1
            TestCommentLinesList.append((Comment, LineNum))
        
        try:
            ParseDecPcdTailComment(TestCommentLinesList, 'UnitTest')
        except Logger.FatalError:
            pass


#
# Test _IsCopyrightLine
#
class _IsCopyrightLineTest(unittest.TestCase):
    def setUp(self):
        pass

    def tearDown(self):
        pass

    #
    # Normal case
    #
    def testCase1(self):
        Line = 'this is a copyright ( line'
        Result = _IsCopyrightLine(Line)
        self.failIf(not Result)

    #
    # Normal case
    #
    def testCase2(self):
        Line = 'this is a Copyright ( line'
        Result = _IsCopyrightLine(Line)
        self.failIf(not Result)

    #
    # Normal case
    #
    def testCase3(self):
        Line = 'this is not aCopyright ( line'
        Result = _IsCopyrightLine(Line)
        self.failIf(Result)
 
    #
    # Normal case
    #
    def testCase4(self):
        Line = 'this is Copyright( line'
        Result = _IsCopyrightLine(Line)
        self.failIf(not Result)

    #
    # Normal case
    #
    def testCase5(self):
        Line = 'this is Copyright         (line'
        Result = _IsCopyrightLine(Line)
        self.failIf(not Result)

    #
    # Normal case
    #
    def testCase6(self):
        Line = 'this is not Copyright line'
        Result = _IsCopyrightLine(Line)
        self.failIf(Result)

    #
    # Normal case
    #
    def testCase7(self):
        Line = 'Copyright (c) line'
        Result = _IsCopyrightLine(Line)
        self.failIf(not Result)

    #
    # Normal case
    #
    def testCase8(self):
        Line = ' Copyright (c) line'
        Result = _IsCopyrightLine(Line)
        self.failIf(not Result)

    #
    # Normal case
    #
    def testCase9(self):
        Line = 'not a Copyright '
        Result = _IsCopyrightLine(Line)
        self.failIf(Result)
        
if __name__ == '__main__':
    Logger.Initialize()
    unittest.main()