#!/usr/bin/python3-dbg
# -*- coding: utf-8 -*-


# Tests minimalistes pour valider la construction de chemins relatifs et absolus.


from chrysacase import ChrysalideTestCase
from pychrysalide.common import pathname


class TestPathNames(ChrysalideTestCase):
    """TestCase for common.pathname.build*"""

    @classmethod
    def setUpClass(cls):

        super(TestPathNames, cls).setUpClass()

        cls._tests = [
            {
                'ref'      : '/a/b/d',
                'target'   : '/a/b/e/f',
                'relative' : 'e/f'
            },
            {
                'ref'      : '/a/b/c/d',
                'target'   : '/a/b/f',
                'relative' : '../f'
            },
            {
                'ref'      : '/a/b/c/d',
                'target'   : '/a/b/c/e',
                'relative' : 'e'
            },
            {
                'ref'      : '/a/bb/c/d',
                'target'   : '/a/b/e/f',
                'relative' : '../../b/e/f'
            },
            {
                'ref'      : '/a/b/c/d',
                'target'   : '/a/bb/e/f',
                'relative' : '../../bb/e/f'
            },
            {
                'ref'      : '/a/b/c/d',
                'target'   : '/f',
                'relative' : '../../../f'
            },
            {
                'ref'      : '/z/b/c/d',
                'target'   : '/a/b/e/f',
                'relative' : '../../../a/b/e/f'
            },
            {
                'ref'      : '/a/bbb/c/d',
                'target'   : '/a/bbc/e/f',
                'relative' : '../../bbc/e/f'
            }
        ]


    def testBuildingRelative(self):
        """Build valid relative paths."""

        build_relative = pathname.build_relative_filename

        for tst in self._tests:

            got = build_relative(tst['ref'], tst['target'])

            self.assertEqual(got, tst['relative'])


    def testBuildingAbsolute(self):
        """Build valid absolute paths."""

        build_absolute = pathname.build_absolute_filename

        for tst in self._tests:

            got = build_absolute(tst['ref'], tst['relative'])

            self.assertEqual(got, tst['target'])


    def testBuildingWrongAbsolute(self):
        """Build invalid absolute paths."""

        build_absolute = pathname.build_absolute_filename

        with self.assertRaisesRegex(Exception, 'Relative path is too deep.'):

            got = build_absolute('/a/b', '../../c')