# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

from mozpack.path import (
    relpath,
    join,
    normpath,
    dirname,
    commonprefix,
    basename,
    split,
    splitext,
    basedir,
    match,
    rebase,
)
import unittest
import mozunit
import os


class TestPath(unittest.TestCase):
    def test_relpath(self):
        self.assertEqual(relpath('foo', 'foo'), '')
        self.assertEqual(relpath(os.path.join('foo', 'bar'), 'foo/bar'), '')
        self.assertEqual(relpath(os.path.join('foo', 'bar'), 'foo'), 'bar')
        self.assertEqual(relpath(os.path.join('foo', 'bar', 'baz'), 'foo'),
                         'bar/baz')
        self.assertEqual(relpath(os.path.join('foo', 'bar'), 'foo/bar/baz'),
                         '..')
        self.assertEqual(relpath(os.path.join('foo', 'bar'), 'foo/baz'),
                         '../bar')
        self.assertEqual(relpath('foo/', 'foo'), '')
        self.assertEqual(relpath('foo/bar/', 'foo'), 'bar')

    def test_join(self):
        self.assertEqual(join('foo', 'bar', 'baz'), 'foo/bar/baz')
        self.assertEqual(join('foo', '', 'bar'), 'foo/bar')
        self.assertEqual(join('', 'foo', 'bar'), 'foo/bar')
        self.assertEqual(join('', 'foo', '/bar'), '/bar')

    def test_normpath(self):
        self.assertEqual(normpath(os.path.join('foo', 'bar', 'baz',
                                               '..', 'qux')), 'foo/bar/qux')

    def test_dirname(self):
        self.assertEqual(dirname('foo/bar/baz'), 'foo/bar')
        self.assertEqual(dirname('foo/bar'), 'foo')
        self.assertEqual(dirname('foo'), '')
        self.assertEqual(dirname('foo/bar/'), 'foo/bar')

    def test_commonprefix(self):
        self.assertEqual(commonprefix([os.path.join('foo', 'bar', 'baz'),
                                       'foo/qux', 'foo/baz/qux']), 'foo/')
        self.assertEqual(commonprefix([os.path.join('foo', 'bar', 'baz'),
                                       'foo/qux', 'baz/qux']), '')

    def test_basename(self):
        self.assertEqual(basename('foo/bar/baz'), 'baz')
        self.assertEqual(basename('foo/bar'), 'bar')
        self.assertEqual(basename('foo'), 'foo')
        self.assertEqual(basename('foo/bar/'), '')

    def test_split(self):
        self.assertEqual(split(os.path.join('foo', 'bar', 'baz')),
                         ['foo', 'bar', 'baz'])

    def test_splitext(self):
        self.assertEqual(splitext(os.path.join('foo', 'bar', 'baz.qux')),
                         ('foo/bar/baz', '.qux'))

    def test_basedir(self):
        foobarbaz = os.path.join('foo', 'bar', 'baz')
        self.assertEqual(basedir(foobarbaz, ['foo', 'bar', 'baz']), 'foo')
        self.assertEqual(basedir(foobarbaz, ['foo', 'foo/bar', 'baz']),
                         'foo/bar')
        self.assertEqual(basedir(foobarbaz, ['foo/bar', 'foo', 'baz']),
                         'foo/bar')
        self.assertEqual(basedir(foobarbaz, ['foo', 'bar', '']), 'foo')
        self.assertEqual(basedir(foobarbaz, ['bar', 'baz', '']), '')

    def test_match(self):
        self.assertTrue(match('foo', ''))
        self.assertTrue(match('foo/bar/baz.qux', 'foo/bar'))
        self.assertTrue(match('foo/bar/baz.qux', 'foo'))
        self.assertTrue(match('foo', '*'))
        self.assertTrue(match('foo/bar/baz.qux', 'foo/bar/*'))
        self.assertTrue(match('foo/bar/baz.qux', 'foo/bar/*'))
        self.assertTrue(match('foo/bar/baz.qux', 'foo/bar/*'))
        self.assertTrue(match('foo/bar/baz.qux', 'foo/bar/*'))
        self.assertTrue(match('foo/bar/baz.qux', 'foo/*/baz.qux'))
        self.assertTrue(match('foo/bar/baz.qux', '*/bar/baz.qux'))
        self.assertTrue(match('foo/bar/baz.qux', '*/*/baz.qux'))
        self.assertTrue(match('foo/bar/baz.qux', '*/*/*'))
        self.assertTrue(match('foo/bar/baz.qux', 'foo/*/*'))
        self.assertTrue(match('foo/bar/baz.qux', 'foo/*/*.qux'))
        self.assertTrue(match('foo/bar/baz.qux', 'foo/b*/*z.qux'))
        self.assertTrue(match('foo/bar/baz.qux', 'foo/b*r/ba*z.qux'))
        self.assertFalse(match('foo/bar/baz.qux', 'foo/b*z/ba*r.qux'))
        self.assertTrue(match('foo/bar/baz.qux', '**'))
        self.assertTrue(match('foo/bar/baz.qux', '**/baz.qux'))
        self.assertTrue(match('foo/bar/baz.qux', '**/bar/baz.qux'))
        self.assertTrue(match('foo/bar/baz.qux', 'foo/**/baz.qux'))
        self.assertTrue(match('foo/bar/baz.qux', 'foo/**/*.qux'))
        self.assertTrue(match('foo/bar/baz.qux', '**/foo/bar/baz.qux'))
        self.assertTrue(match('foo/bar/baz.qux', 'foo/**/bar/baz.qux'))
        self.assertTrue(match('foo/bar/baz.qux', 'foo/**/bar/*.qux'))
        self.assertTrue(match('foo/bar/baz.qux', 'foo/**/*.qux'))
        self.assertTrue(match('foo/bar/baz.qux', '**/*.qux'))
        self.assertFalse(match('foo/bar/baz.qux', '**.qux'))
        self.assertFalse(match('foo/bar', 'foo/*/bar'))

    def test_rebase(self):
        self.assertEqual(rebase('foo', 'foo/bar', 'bar/baz'), 'baz')
        self.assertEqual(rebase('foo', 'foo', 'bar/baz'), 'bar/baz')
        self.assertEqual(rebase('foo/bar', 'foo', 'baz'), 'bar/baz')

if __name__ == '__main__':
    mozunit.main()
