#!/usr/bin/env python
# Copyright 2017 The Cobalt Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import unittest

import _env  # pylint: disable=unused-import
from cobalt.build.path_conversion import ConvertPath


class PathConversionTest(unittest.TestCase):

  def testNoop(self):
    self.assertEqual(ConvertPath('this/is/a/path.txt'), 'this/is/a/path.txt')

  def testOutputDirectory(self):
    self.assertEqual(
        ConvertPath('this/is/a/path.txt', output_directory='another/location'),
        'another/location/path.txt')

  def testAddPrefix(self):
    self.assertEqual(
        ConvertPath('this/is/a/path.txt', output_prefix='banana_'),
        'this/is/a/banana_path.txt')

  def testChangeExtension(self):
    self.assertEqual(
        ConvertPath('this/is/a/path.txt', output_extension='clown'),
        'this/is/a/path.clown')

  def testSlashes(self):
    self.assertEqual(
        ConvertPath('this\\is\\a\\path.txt', forward_slashes=True),
        'this/is/a/path.txt')

    self.assertEqual(
        ConvertPath('this\\is\\a\\path.txt', forward_slashes=False),
        'this\\is\\a\\path.txt')

  def testBaseDirectory(self):
    self.assertEqual(
        ConvertPath(
            'if/this/is/a/path.txt',
            output_directory='then/that',
            base_directory='if/this'), 'then/that/is/a/path.txt')


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