# Copyright 2016 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import unittest

from blinkpy.common.path_finder import PathFinder
from blinkpy.common.path_finder import RELATIVE_WEB_TESTS
from blinkpy.common.system.filesystem_mock import MockFileSystem


class TestPathFinder(unittest.TestCase):

    def test_chromium_base(self):
        finder = PathFinder(MockFileSystem())
        self.assertEqual(finder.chromium_base(), '/mock-checkout')

    def test_path_from_chromium_base(self):
        finder = PathFinder(MockFileSystem())
        self.assertEqual(
            finder.path_from_chromium_base('foo', 'bar.baz'),
            '/mock-checkout/foo/bar.baz')

    def test_web_tests_dir(self):
        finder = PathFinder(MockFileSystem())
        self.assertEqual(
            finder.web_tests_dir(),
            '/mock-checkout/' + RELATIVE_WEB_TESTS[:-1])

    def test_web_tests_dir_with_backslash_sep(self):
        filesystem = MockFileSystem()
        filesystem.sep = '\\'
        filesystem.path_to_module = lambda _: (
            'C:\\mock-checkout\\third_party\\blink\\tools\\blinkpy\\foo.py')
        finder = PathFinder(filesystem)
        self.assertEqual(
            finder.web_tests_dir(),
            'C:\\mock-checkout\\third_party\\blink\\web_tests')

    def test_perf_tests_dir(self):
        finder = PathFinder(MockFileSystem())
        self.assertEqual(
            finder.perf_tests_dir(),
            '/mock-checkout/third_party/blink/perf_tests')

    def test_path_from_web_tests(self):
        finder = PathFinder(MockFileSystem())
        self.assertEqual(
            finder.path_from_web_tests('external', 'wpt'),
            '/mock-checkout/' + RELATIVE_WEB_TESTS + 'external/wpt')

    def test_depot_tools_base_not_found(self):
        filesystem = MockFileSystem()
        filesystem.path_to_module = lambda _: (
            '/mock-checkout/third_party/blink/tools/blinkpy/common/'
            'path_finder.py')
        finder = PathFinder(filesystem)
        self.assertIsNone(finder.depot_tools_base())

    def test_depot_tools_base_exists(self):
        filesystem = MockFileSystem()
        filesystem.path_to_module = lambda _: (
            '/checkout/third_party/blink/tools/blinkpy/common/'
            'path_finder.py')
        filesystem.maybe_make_directory(
            '/checkout/third_party/depot_tools')
        finder = PathFinder(filesystem)
        self.assertEqual(
            finder.depot_tools_base(), '/checkout/third_party/depot_tools')
