# test_varExpand.py -- Portage Unit Testing Functionality
# Copyright 2006-2017 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

from portage.tests import TestCase
from portage.util import varexpand


class VarExpandTestCase(TestCase):
    def testVarExpandPass(self):
        varDict = {"a": "5", "b": "7", "c": "-5"}
        for key in varDict:
            result = varexpand(f"${key}", varDict)

            self.assertFalse(
                result != varDict[key],
                msg="Got %s != %s, from varexpand(%s, %s)"
                % (result, varDict[key], "$%s" % key, varDict),
            )
            result = varexpand("${%s}" % key, varDict)
            self.assertFalse(
                result != varDict[key],
                msg="Got %s != %s, from varexpand(%s, %s)"
                % (result, varDict[key], "${%s}" % key, varDict),
            )

    def testVarExpandBackslashes(self):
        r"""
        We want to behave like bash does when expanding a variable
        assignment in a sourced file, in which case it performs
        backslash removal for \\ and \$ but nothing more. It also
        removes escaped newline characters. Note that we don't
        handle escaped quotes here, since getconfig() uses shlex
        to handle that earlier.
        """

        varDict = {}
        tests = [
            ("\\", "\\"),
            ("\\\\", "\\"),
            ("\\\\\\", "\\\\"),
            ("\\\\\\\\", "\\\\"),
            ("\\$", "$"),
            ("\\\\$", "\\$"),
            ("\\a", "\\a"),
            ("\\b", "\\b"),
            ("\\n", "\\n"),
            ("\\r", "\\r"),
            ("\\t", "\\t"),
            ("\\\n", ""),
            ('\\"', '\\"'),
            ("\\'", "\\'"),
        ]
        for test in tests:
            result = varexpand(test[0], varDict)
            self.assertFalse(
                result != test[1],
                msg=f"Got {result} != {test[1]} from varexpand({test[0]}, {varDict})",
            )

    def testVarExpandDoubleQuotes(self):
        varDict = {"a": "5"}
        tests = [('"${a}"', '"5"')]
        for test in tests:
            result = varexpand(test[0], varDict)
            self.assertFalse(
                result != test[1],
                msg=f"Got {result} != {test[1]} from varexpand({test[0]}, {varDict})",
            )

    def testVarExpandSingleQuotes(self):
        varDict = {"a": "5"}
        tests = [("'${a}'", "'${a}'")]
        for test in tests:
            result = varexpand(test[0], varDict)
            self.assertFalse(
                result != test[1],
                msg=f"Got {result} != {test[1]} from varexpand({test[0]}, {varDict})",
            )

    def testVarExpandFail(self):
        varDict = {"a": "5", "b": "7", "c": "15"}

        testVars = ["fail"]

        for var in testVars:
            result = varexpand(f"${var}", varDict)
            self.assertFalse(
                len(result),
                msg="Got %s == %s, from varexpand(%s, %s)"
                % (result, var, "$%s" % var, varDict),
            )

            result = varexpand("${%s}" % var, varDict)
            self.assertFalse(
                len(result),
                msg="Got %s == %s, from varexpand(%s, %s)"
                % (result, var, "${%s}" % var, varDict),
            )
