# -*- coding: utf-8 -*-
# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

import libscanbuild.shell as sut
import unittest


class ShellTest(unittest.TestCase):

    def test_encode_decode_are_same(self):
        def test(value):
            self.assertEqual(sut.encode(sut.decode(value)), value)

        test("")
        test("clang")
        test("clang this and that")

    def test_decode_encode_are_same(self):
        def test(value):
            self.assertEqual(sut.decode(sut.encode(value)), value)

        test([])
        test(['clang'])
        test(['clang', 'this', 'and', 'that'])
        test(['clang', 'this and', 'that'])
        test(['clang', "it's me", 'again'])
        test(['clang', 'some "words" are', 'quoted'])

    def test_encode(self):
        self.assertEqual(sut.encode(['clang', "it's me", 'again']),
                         'clang "it\'s me" again')
        self.assertEqual(sut.encode(['clang', "it(s me", 'again)']),
                         'clang "it(s me" "again)"')
        self.assertEqual(sut.encode(['clang', 'redirect > it']),
                         'clang "redirect > it"')
        self.assertEqual(sut.encode(['clang', '-DKEY="VALUE"']),
                         'clang -DKEY=\\"VALUE\\"')
        self.assertEqual(sut.encode(['clang', '-DKEY="value with spaces"']),
                         'clang -DKEY=\\"value with spaces\\"')
