summaryrefslogtreecommitdiff
path: root/tests/common/pathname.py
blob: 23ca2b0a85c1175128af4c4666de73b912f5290f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96

from chrysacase import ChrysalideTestCase
from pychrysalide.common import build_relative_filename, build_absolute_filename


class TestPathnames(ChrysalideTestCase):
    """TestCase for common pathname features."""

    @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."""

        for tst in self._tests:

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

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


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

        for tst in self._tests:

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

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


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

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

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


    def testPathnameSamples(self):
        """Play with some path samples."""

        filename = build_absolute_filename('/tmp/deep', '../myfile')
        self.assertEqual(filename, '/myfile')

        filename = build_absolute_filename('/tmp/deep/', '../myfile')
        self.assertEqual(filename, '/tmp/myfile')

        filename = build_relative_filename('/tmp/deep', '/myfile')
        self.assertEqual(filename, '../myfile')