## @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.

from __future__ import print_function
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!')

