#!/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.
"""Path conversion test."""

import os
import unittest

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()
