## @file
# This file contain unit test for Test [Binary] section part of InfParser 
#
# Copyright (c) 2011, 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 Object.Parser.InfObject as InfObject
from Object.Parser.InfCommonObject import CurrentLine
from Object.Parser.InfCommonObject import InfLineCommentObject
from Object.Parser.InfBinaryObject import InfBinariesObject
import Logger.Log as Logger
import Library.GlobalData as Global
##
# Test Common binary item
#

#-------------start of common binary item test input--------------------------#

#
# Only has 1 element, binary item Type
#
SectionStringsCommonItem1 = \
"""
GUID
"""
#
# Have 2 elements, binary item Type and FileName
#
SectionStringsCommonItem2 = \
"""
GUID | Test/Test.guid
"""

#
# Have 3 elements, Type | FileName | Target | Family | TagName | FeatureFlagExp
#
SectionStringsCommonItem3 = \
"""
GUID | Test/Test.guid | DEBUG
"""

#
# Have 3 elements, Type | FileName | Target 
# Target with MACRO defined in [Define] section
#
SectionStringsCommonItem4 = \
"""
GUID | Test/Test.guid | $(TARGET)
"""

#
# Have 3 elements, Type | FileName | Target 
# FileName with MACRO defined in [Binary] section
#
SectionStringsCommonItem5 = \
"""
DEFINE BINARY_FILE_PATH = Test
GUID | $(BINARY_FILE_PATH)/Test.guid | $(TARGET)
"""

#
# Have 4 elements, Type | FileName | Target | Family
#
SectionStringsCommonItem6 = \
"""
GUID | Test/Test.guid | DEBUG | *
"""

#
# Have 4 elements, Type | FileName | Target | Family
#
SectionStringsCommonItem7 = \
"""
GUID | Test/Test.guid | DEBUG | MSFT
"""

#
# Have 5 elements, Type | FileName | Target | Family | TagName
#
SectionStringsCommonItem8 = \
"""
GUID | Test/Test.guid | DEBUG | MSFT | TEST
"""

#
# Have 6 elements, Type | FileName | Target | Family | TagName | FFE
#
SectionStringsCommonItem9 = \
"""
GUID | Test/Test.guid | DEBUG | MSFT | TEST | TRUE
"""

#
# Have 7 elements, Type | FileName | Target | Family | TagName | FFE | Overflow
# Test wrong format
#
SectionStringsCommonItem10 = \
"""
GUID | Test/Test.guid | DEBUG | MSFT | TEST | TRUE | OVERFLOW
"""

#-------------end of common binary item test input----------------------------#



#-------------start of VER type binary item test input------------------------#

#
# Has 1 element, error format 
#
SectionStringsVerItem1 = \
"""
VER
"""
#
# Have 5 elements, error format(Maximum elements amount is 4)
#
SectionStringsVerItem2 = \
"""
VER | Test/Test.ver | * | TRUE | OverFlow
"""

#
# Have 2 elements, Type | FileName
#
SectionStringsVerItem3 = \
"""
VER | Test/Test.ver
"""

#
# Have 3 elements, Type | FileName | Target
#
SectionStringsVerItem4 = \
"""
VER | Test/Test.ver | DEBUG
"""

#
# Have 4 elements, Type | FileName | Target | FeatureFlagExp
#
SectionStringsVerItem5 = \
"""
VER | Test/Test.ver | DEBUG | TRUE
"""

#
# Exist 2 VER items, both opened.
#
SectionStringsVerItem6 = \
"""
VER | Test/Test.ver | * | TRUE
VER | Test/Test2.ver | * | TRUE
"""


#
# Exist 2 VER items, only 1 opened.
#
SectionStringsVerItem7 = \
"""
VER | Test/Test.ver | * | TRUE
VER | Test/Test2.ver | * | FALSE
"""

#-------------end of VER type binary item test input--------------------------#


#-------------start of UI type binary item test input-------------------------#

#
# Test only one UI section can exist
#
SectionStringsUiItem1 = \
"""
UI | Test/Test.ui | * | TRUE
UI | Test/Test2.ui | * | TRUE
"""

SectionStringsUiItem2 = \
"""
UI | Test/Test.ui | * | TRUE
SEC_UI | Test/Test2.ui | * | TRUE
"""

SectionStringsUiItem3 = \
"""
UI | Test/Test.ui | * | TRUE
UI | Test/Test2.ui | * | FALSE
"""

#
# Has 1 element, error format 
#
SectionStringsUiItem4 = \
"""
UI
"""
#
# Have 5 elements, error format(Maximum elements amount is 4)
#
SectionStringsUiItem5 = \
"""
UI | Test/Test.ui | * | TRUE | OverFlow
"""

#
# Have 2 elements, Type | FileName
#
SectionStringsUiItem6 = \
"""
UI | Test/Test.ui
"""

#
# Have 3 elements, Type | FileName | Target
#
SectionStringsUiItem7 = \
"""
UI | Test/Test.ui | DEBUG
"""

#
# Have 4 elements, Type | FileName | Target | FeatureFlagExp
#
SectionStringsUiItem8 = \
"""
UI | Test/Test.ui | DEBUG | TRUE
"""
#---------------end of UI type binary item test input-------------------------#


gFileName = "BinarySectionTest.inf"

##
# Construct SectionString for call section parser usage.
#
def StringToSectionString(String):
    Lines = String.split('\n')
    LineNo = 0
    SectionString = []
    for Line in Lines:
        if Line.strip() == '':
            continue
        SectionString.append((Line, LineNo, ''))
        LineNo = LineNo + 1
        
    return SectionString

def PrepareTest(String):
    SectionString = StringToSectionString(String)
    ItemList = []
    for Item in SectionString:
        ValueList = Item[0].split('|')
        for count in range(len(ValueList)):
            ValueList[count] = ValueList[count].strip()
        if len(ValueList) >= 2:
            #
            # Create a temp file for test.
            #
            FileName = os.path.normpath(os.path.realpath(ValueList[1].strip()))
            try:
                TempFile  = open (FileName, "w")    
                TempFile.close()
            except:
                print "File Create Error"
        CurrentLine = CurrentLine()
        CurrentLine.SetFileName("Test")
        CurrentLine.SetLineString(Item[0])
        CurrentLine.SetLineNo(Item[1])
        InfLineCommentObject = InfLineCommentObject()
        
        ItemList.append((ValueList, InfLineCommentObject, CurrentLine))
                
    return ItemList

if __name__ == '__main__':
    Logger.Initialize()
    
    InfBinariesInstance = InfBinariesObject()
    ArchList = ['COMMON']
    Global.gINF_MODULE_DIR = os.getcwd()
    
    AllPassedFlag = True
    
    #
    # For All Ui test
    #
    UiStringList = [ 
                    SectionStringsUiItem1,
                    SectionStringsUiItem2,
                    SectionStringsUiItem3,
                    SectionStringsUiItem4,
                    SectionStringsUiItem5,
                    SectionStringsUiItem6,
                    SectionStringsUiItem7,
                    SectionStringsUiItem8 
                    ]
    
    for Item in UiStringList:        
        Ui = PrepareTest(Item)
        if Item == SectionStringsUiItem4 or Item == SectionStringsUiItem5:
            try:
                InfBinariesInstance.SetBinary(Ui = Ui, ArchList = ArchList)
            except Logger.FatalError:
                pass
        else:
            try:		
                InfBinariesInstance.SetBinary(Ui = Ui, ArchList = ArchList)
            except:
                AllPassedFlag = False   				
 
    #
    # For All Ver Test
    #
    VerStringList = [
                     SectionStringsVerItem1,
                     SectionStringsVerItem2,
                     SectionStringsVerItem3,
                     SectionStringsVerItem4,
                     SectionStringsVerItem5,
                     SectionStringsVerItem6,
                     SectionStringsVerItem7
                     ]
    for Item in VerStringList:        
        Ver = PrepareTest(Item)
        if Item == SectionStringsVerItem1 or \
           Item == SectionStringsVerItem2:
            
            try:
                InfBinariesInstance.SetBinary(Ver = Ver, ArchList = ArchList)
            except:
                pass
                    
        else:
            try:
                InfBinariesInstance.SetBinary(Ver = Ver, ArchList = ArchList)
            except:
                AllPassedFlag = False   
    
    #
    # For All Common Test
    #    
    CommonStringList = [
                     SectionStringsCommonItem1,
                     SectionStringsCommonItem2,
                     SectionStringsCommonItem3,
                     SectionStringsCommonItem4,
                     SectionStringsCommonItem5,
                     SectionStringsCommonItem6,
                     SectionStringsCommonItem7,
                     SectionStringsCommonItem8,
                     SectionStringsCommonItem9,
                     SectionStringsCommonItem10
                     ]

    for Item in CommonStringList:        
        CommonBin = PrepareTest(Item)
        if Item == SectionStringsCommonItem10 or \
           Item == SectionStringsCommonItem1:
            
            try:
                InfBinariesInstance.SetBinary(CommonBinary = CommonBin, ArchList = ArchList)
            except:
                pass
                    
        else:
            try:
                InfBinariesInstance.SetBinary(Ver = Ver, ArchList = ArchList)
            except:
                print "Test Failed!"
                AllPassedFlag = False
    
    if AllPassedFlag :
        print 'All tests passed...'
    else:
        print 'Some unit test failed!'

