#!/usr/bin/env python
# Copyright 2017 Google Inc. 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()
