#============================================================================ 
#Name        : test_ccm_4pn.py 
#Part of     : Helium 

#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
#All rights reserved.
#This component and the accompanying materials are made available
#under the terms of the License "Eclipse Public License v1.0"
#which accompanies this distribution, and is available
#at the URL "http://www.eclipse.org/legal/epl-v10.html".
#
#Initial Contributors:
#Nokia Corporation - initial contribution.
#
#Contributors:
#
#Description:
#===============================================================================

""" Test cases for ccm python toolkit.

"""
# pylint: disable=R0201

import unittest
import ccm
import logging


_logger = logging.getLogger('test.ccm')


class FourPartNameTest(unittest.TestCase):
    """ Unit test case for testing four part name of a ccm project """
    def testSimpleFourPartNameParsing(self):
        """Test the parsing of a simple four part name"""
        strfpn = "simple.test-myversion1:ascii:mydb#1"
        fpn = ccm.FourPartName(strfpn)
        assert fpn.name == "simple.test"
        assert fpn.version == "myversion1"
        assert fpn.type == "ascii"
        assert fpn.instance == "mydb#1"
        assert strfpn == str(fpn)
        assert strfpn == fpn.objectname

    def testSpacesFourPartNameParsing(self):
        """Test the parsing of a four part name that contains spaces"""
        strfpn = "simple test.ext - myversion1 :ascii:mydb#1"
        fpn = ccm.FourPartName(strfpn)
        assert fpn.name == "simple test.ext "
        assert fpn.version == " myversion1 "
        assert fpn.type == "ascii"
        assert fpn.instance == "mydb#1"
        assert strfpn == str(fpn)
        assert strfpn == fpn.objectname

    def testHyphenedFourPartNameParsing(self):
        """Test the parsing of a hyphened four part name"""
        strfpn = "simple-test.ext-myversion1:ascii:mydb#1"
        fpn = ccm.FourPartName(strfpn)
        assert fpn.name == "simple-test.ext"
        assert fpn.version == "myversion1"
        assert fpn.type == "ascii"
        assert fpn.instance == "mydb#1"
        assert strfpn == str(fpn)
        assert strfpn == fpn.objectname
   
    def testReleasedefParsing(self):
        """Test the parsing of a releasedef four part name"""
        strfpn = "myproject:myversion1:releasedef:mydb#1"
        fpn = ccm.FourPartName(strfpn)
        assert fpn.name == "myproject"
        assert fpn.version == "myversion1"
        assert fpn.type == "releasedef"
        assert fpn.instance == "mydb#1"
        assert strfpn == str(fpn)
        assert strfpn == fpn.objectname

    def testEquality(self):
        """Test equality and same familly function"""
        # testing different name
        fpn1 = ccm.FourPartName("simple.test-myversion1:ascii:mydb#1")
        fpn2 = ccm.FourPartName("simple.testx-myversion1:ascii:mydb#1")
        assert fpn1 != fpn2
        assert not fpn1.is_same_family(fpn2), "Should not be from the same family"
        # testing different version
        fpn2 = ccm.FourPartName("simple.test-myversion2:ascii:mydb#1")
        assert fpn1 != fpn2
        assert fpn1.is_same_family(fpn2), "Should be from the same family"
        # testing different type
        fpn2 = ccm.FourPartName("simple.test-myversion1:ascii2:mydb#1")
        assert fpn1 != fpn2
        assert not fpn1.is_same_family(fpn2), "Should not be from the same family"
        # testing different instance
        fpn2 = ccm.FourPartName("simple.test-myversion1:ascii:mydb#2")
        assert fpn1 != fpn2
        assert not fpn1.is_same_family(fpn2), "Should not be from the same family"

    def testConvert(self):
        """ Test task displayname tranformation"""
        fpn = ccm.FourPartName("Task mydb#123")
        assert fpn.type == "task"
        # Test folder displayname tranformation
        fpn = ccm.FourPartName("Folder mydb#123")
        assert fpn.type == "folder"
        # Test Release tag displayname tranformation
        fpn = ccm.FourPartName("mc/integration")
        assert fpn.name == "mc"
        assert fpn.version == "integration"
        assert fpn.type == "releasedef"
        assert fpn.instance == "1"

        fpn = ccm.FourPartName("BTHID/3.2_2007_wk03")
        assert fpn.name == "BTHID"
        assert fpn.version == "3.2_2007_wk03"
        assert fpn.type == "releasedef"
        assert fpn.instance == "1"
        
        fpn = ccm.FourPartName("DRM_0.9")
        assert fpn.name == "none"
        assert fpn.version == "DRM_0.9"
        assert fpn.type == "releasedef"
        assert fpn.instance == "1"

        try:
            fpn = ccm.FourPartName("task mydb#123")
            assert False, "Should raise InvalidFourPartNameException when parsing'task mydb#123'"
        except ccm.InvalidFourPartNameException:
            pass

        try:
            fpn = ccm.FourPartName("folder mydb#123")
            assert False, "Should raise InvalidFourPartNameException when parsing'folder mydb#123'"
        except ccm.InvalidFourPartNameException:
            pass
            
            
class InvalidFourPartNameExceptionTest(unittest.TestCase):
    """ Unit test case for testing invalid four part name of a ccm project """
    def testOutput(self):
        """ Test the exception shows the arguments. """
        ex = ccm.InvalidFourPartNameException('foo')
        assert str(ex) == 'foo'


if __name__ == "__main__":
    unittest.main()
