#!/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 os
import unittest

import _env  # pylint: disable=unused-import,relative-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'),
        os.path.join('another/location', 'path.txt'))

  def testAddPrefix(self):
    self.assertEqual(
        ConvertPath('this/is/a/path.txt', output_prefix='banana_'),
        os.path.join('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'),
        os.path.join('then/that', 'is', 'a', 'path.txt'))


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