blob: 1618430c5d29056cfcb1e084cb6f1a908ac2315f [file] [log] [blame]
# Copyright 2009-2010 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
from portage.tests import TestCase
from portage.exception import InvalidDependString
from portage.dep import Atom, use_reduce
class UseReduceTestCase(object):
def __init__(self, deparray, uselist=[], masklist=[], \
matchall=0, excludeall=[], is_src_uri=False, \
eapi="0", opconvert=False, flat=False, expected_result=None, \
is_valid_flag=None, token_class=None):
self.deparray = deparray
self.uselist = uselist
self.masklist = masklist
self.matchall = matchall
self.excludeall = excludeall
self.is_src_uri = is_src_uri
self.eapi = eapi
self.opconvert = opconvert
self.flat = flat
self.is_valid_flag = is_valid_flag
self.token_class = token_class
self.expected_result = expected_result
def run(self):
try:
return use_reduce(self.deparray, self.uselist, self.masklist, \
self.matchall, self.excludeall, self.is_src_uri, self.eapi, \
self.opconvert, self.flat, self.is_valid_flag, self.token_class)
except InvalidDependString as e:
raise InvalidDependString("%s: %s" % (e, self.deparray))
class UseReduce(TestCase):
def always_true(self, ununsed_parameter):
return True
def always_false(self, ununsed_parameter):
return False
def testUseReduce(self):
EAPI_WITH_SRC_URI_ARROWS = "2"
EAPI_WITHOUT_SRC_URI_ARROWS = "0"
test_cases = (
UseReduceTestCase(
"a? ( A ) b? ( B ) !c? ( C ) !d? ( D )",
uselist = ["a", "b", "c", "d"],
expected_result = ["A", "B"]
),
UseReduceTestCase(
"a? ( A ) b? ( B ) !c? ( C ) !d? ( D )",
uselist = ["a", "b", "c"],
expected_result = ["A", "B", "D"]
),
UseReduceTestCase(
"a? ( A ) b? ( B ) !c? ( C ) !d? ( D )",
uselist = ["b", "c"],
expected_result = ["B", "D"]
),
UseReduceTestCase(
"a? ( A ) b? ( B ) !c? ( C ) !d? ( D )",
matchall = True,
expected_result = ["A", "B", "C", "D"]
),
UseReduceTestCase(
"a? ( A ) b? ( B ) !c? ( C ) !d? ( D )",
masklist = ["a", "c"],
expected_result = ["C", "D"]
),
UseReduceTestCase(
"a? ( A ) b? ( B ) !c? ( C ) !d? ( D )",
matchall = True,
masklist = ["a", "c"],
expected_result = ["B", "C", "D"]
),
UseReduceTestCase(
"a? ( A ) b? ( B ) !c? ( C ) !d? ( D )",
uselist = ["a", "b"],
masklist = ["a", "c"],
expected_result = ["B", "C", "D"]
),
UseReduceTestCase(
"a? ( A ) b? ( B ) !c? ( C ) !d? ( D )",
excludeall = ["a", "c"],
expected_result = ["D"]
),
UseReduceTestCase(
"a? ( A ) b? ( B ) !c? ( C ) !d? ( D )",
uselist = ["b"],
excludeall = ["a", "c"],
expected_result = ["B", "D"]
),
UseReduceTestCase(
"a? ( A ) b? ( B ) !c? ( C ) !d? ( D )",
matchall = True,
excludeall = ["a", "c"],
expected_result = ["A", "B", "D"]
),
UseReduceTestCase(
"a? ( A ) b? ( B ) !c? ( C ) !d? ( D )",
matchall = True,
excludeall = ["a", "c"],
masklist = ["b"],
expected_result = ["A", "D"]
),
UseReduceTestCase(
"a? ( b? ( AB ) )",
uselist = ["a", "b"],
expected_result = ["AB"]
),
UseReduceTestCase(
"a? ( b? ( AB ) C )",
uselist = ["a"],
expected_result = ["C"]
),
UseReduceTestCase(
"a? ( b? ( || ( AB CD ) ) )",
uselist = ["a", "b"],
expected_result = ["||", ["AB", "CD"]]
),
UseReduceTestCase(
"|| ( || ( a? ( A ) b? ( B ) ) )",
uselist = ["a", "b"],
expected_result = ["||", ["A", "B"]]
),
UseReduceTestCase(
"|| ( || ( a? ( A ) b? ( B ) ) )",
uselist = ["a"],
expected_result = ["A"]
),
UseReduceTestCase(
"|| ( || ( a? ( A ) b? ( B ) ) )",
uselist = [],
expected_result = []
),
UseReduceTestCase(
"|| ( || ( a? ( || ( A c? ( C ) ) ) b? ( B ) ) )",
uselist = [],
expected_result = []
),
UseReduceTestCase(
"|| ( || ( a? ( || ( A c? ( C ) ) ) b? ( B ) ) )",
uselist = ["a"],
expected_result = ["A"]
),
UseReduceTestCase(
"|| ( || ( a? ( || ( A c? ( C ) ) ) b? ( B ) ) )",
uselist = ["b"],
expected_result = ["B"]
),
UseReduceTestCase(
"|| ( || ( a? ( || ( A c? ( C ) ) ) b? ( B ) ) )",
uselist = ["c"],
expected_result = []
),
UseReduceTestCase(
"|| ( || ( a? ( || ( A c? ( C ) ) ) b? ( B ) ) )",
uselist = ["a", "c"],
expected_result = ["||", [ "A", "C"]]
),
#paren_reduce tests
UseReduceTestCase(
"A",
expected_result = ["A"]),
UseReduceTestCase(
"( A )",
expected_result = ["A"]),
UseReduceTestCase(
"|| ( A B )",
expected_result = [ "||", ["A", "B"] ]),
UseReduceTestCase(
"|| ( ( A B ) C )",
expected_result = [ "||", [ ["A", "B"], "C"] ]),
UseReduceTestCase(
"|| ( ( A B ) ( C ) )",
expected_result = [ "||", [ ["A", "B"], "C"] ]),
UseReduceTestCase(
"|| ( A || ( B C ) )",
expected_result = [ "||", ["A", "B", "C"]]),
UseReduceTestCase(
"|| ( A || ( B C D ) )",
expected_result = [ "||", ["A", "B", "C", "D"] ]),
UseReduceTestCase(
"|| ( A || ( B || ( C D ) E ) )",
expected_result = [ "||", ["A", "B", "C", "D", "E"] ]),
UseReduceTestCase(
"( || ( ( ( A ) B ) ) )",
expected_result = ["A", "B"] ),
UseReduceTestCase(
"( || ( || ( ( A ) B ) ) )",
expected_result = [ "||", ["A", "B"] ]),
UseReduceTestCase(
"( || ( || ( ( A ) B ) ) )",
expected_result = [ "||", ["A", "B"] ]),
UseReduceTestCase(
"|| ( A )",
expected_result = ["A"]),
UseReduceTestCase(
"( || ( || ( || ( A ) foo? ( B ) ) ) )",
expected_result = ["A"]),
UseReduceTestCase(
"( || ( || ( || ( A ) foo? ( B ) ) ) )",
uselist = ["foo"],
expected_result = [ "||", ["A", "B"] ]),
UseReduceTestCase(
"( || ( || ( bar? ( A ) || ( foo? ( B ) ) ) ) )",
expected_result = []),
UseReduceTestCase(
"( || ( || ( bar? ( A ) || ( foo? ( B ) ) ) ) )",
uselist = ["foo", "bar"],
expected_result = [ "||", [ "A", "B" ] ]),
UseReduceTestCase(
"A || ( bar? ( C ) ) foo? ( bar? ( C ) ) B",
expected_result = ["A", "B"]),
UseReduceTestCase(
"|| ( A ) || ( B )",
expected_result = ["A", "B"]),
UseReduceTestCase(
"foo? ( A ) foo? ( B )",
expected_result = []),
UseReduceTestCase(
"foo? ( A ) foo? ( B )",
uselist = ["foo"],
expected_result = ["A", "B"]),
UseReduceTestCase(
"|| ( A B ) C",
expected_result = ['||', ['A', 'B'], 'C']),
UseReduceTestCase(
"A || ( B C )",
expected_result = ['A', '||', ['B', 'C']]),
#SRC_URI stuff
UseReduceTestCase(
"http://foo/bar -> blah.tbz2",
is_src_uri = True,
eapi = EAPI_WITH_SRC_URI_ARROWS,
expected_result = ["http://foo/bar", "->", "blah.tbz2"]),
UseReduceTestCase(
"foo? ( http://foo/bar -> blah.tbz2 )",
uselist = [],
is_src_uri = True,
eapi = EAPI_WITH_SRC_URI_ARROWS,
expected_result = []),
UseReduceTestCase(
"foo? ( http://foo/bar -> blah.tbz2 )",
uselist = ["foo"],
is_src_uri = True,
eapi = EAPI_WITH_SRC_URI_ARROWS,
expected_result = ["http://foo/bar", "->", "blah.tbz2"]),
UseReduceTestCase(
"http://foo/bar -> bar.tbz2 foo? ( ftp://foo/a )",
uselist = [],
is_src_uri = True,
eapi = EAPI_WITH_SRC_URI_ARROWS,
expected_result = ["http://foo/bar", "->", "bar.tbz2"]),
UseReduceTestCase(
"http://foo/bar -> bar.tbz2 foo? ( ftp://foo/a )",
uselist = ["foo"],
is_src_uri = True,
eapi = EAPI_WITH_SRC_URI_ARROWS,
expected_result = ["http://foo/bar", "->", "bar.tbz2", "ftp://foo/a"]),
UseReduceTestCase(
"http://foo.com/foo http://foo/bar -> blah.tbz2",
uselist = ["foo"],
is_src_uri = True,
eapi = EAPI_WITH_SRC_URI_ARROWS,
expected_result = ["http://foo.com/foo", "http://foo/bar", "->", "blah.tbz2"]),
#opconvert tests
UseReduceTestCase(
"A",
opconvert = True,
expected_result = ["A"]),
UseReduceTestCase(
"( A )",
opconvert = True,
expected_result = ["A"]),
UseReduceTestCase(
"|| ( A B )",
opconvert = True,
expected_result = [['||', 'A', 'B']]),
UseReduceTestCase(
"|| ( ( A B ) C )",
opconvert = True,
expected_result = [['||', ['A', 'B'], 'C']]),
UseReduceTestCase(
"|| ( A || ( B C ) )",
opconvert = True,
expected_result = [['||', 'A', 'B', 'C']]),
UseReduceTestCase(
"|| ( A || ( B C D ) )",
opconvert = True,
expected_result = [['||', 'A', 'B', 'C', 'D']]),
UseReduceTestCase(
"|| ( A || ( B || ( C D ) E ) )",
expected_result = [ "||", ["A", "B", "C", "D", "E"] ]),
UseReduceTestCase(
"( || ( ( ( A ) B ) ) )",
opconvert = True,
expected_result = [ "A", "B" ] ),
UseReduceTestCase(
"( || ( || ( ( A ) B ) ) )",
opconvert = True,
expected_result = [['||', 'A', 'B']]),
UseReduceTestCase(
"|| ( A B ) C",
opconvert = True,
expected_result = [['||', 'A', 'B'], 'C']),
UseReduceTestCase(
"A || ( B C )",
opconvert = True,
expected_result = ['A', ['||', 'B', 'C']]),
UseReduceTestCase(
"A foo? ( || ( B || ( bar? ( || ( C D E ) ) !bar? ( F ) ) ) ) G",
uselist = ["foo", "bar"],
opconvert = True,
expected_result = ['A', ['||', 'B', 'C', 'D', 'E'], 'G']),
UseReduceTestCase(
"A foo? ( || ( B || ( bar? ( || ( C D E ) ) !bar? ( F ) ) ) ) G",
uselist = ["foo", "bar"],
opconvert = False,
expected_result = ['A', '||', ['B', 'C', 'D', 'E'], 'G']),
UseReduceTestCase(
"|| ( A )",
opconvert = True,
expected_result = ["A"]),
UseReduceTestCase(
"( || ( || ( || ( A ) foo? ( B ) ) ) )",
expected_result = ["A"]),
UseReduceTestCase(
"( || ( || ( || ( A ) foo? ( B ) ) ) )",
uselist = ["foo"],
opconvert = True,
expected_result = [['||', 'A', 'B']]),
UseReduceTestCase(
"( || ( || ( bar? ( A ) || ( foo? ( B ) ) ) ) )",
opconvert = True,
expected_result = []),
UseReduceTestCase(
"( || ( || ( bar? ( A ) || ( foo? ( B ) ) ) ) )",
uselist = ["foo", "bar"],
opconvert = True,
expected_result = [['||', 'A', 'B']]),
UseReduceTestCase(
"A || ( bar? ( C ) ) foo? ( bar? ( C ) ) B",
opconvert = True,
expected_result = ["A", "B"]),
UseReduceTestCase(
"|| ( A ) || ( B )",
opconvert = True,
expected_result = ["A", "B"]),
UseReduceTestCase(
"foo? ( A ) foo? ( B )",
opconvert = True,
expected_result = []),
UseReduceTestCase(
"foo? ( A ) foo? ( B )",
uselist = ["foo"],
opconvert = True,
expected_result = ["A", "B"]),
UseReduceTestCase(
"|| ( foo? ( || ( A B ) ) )",
uselist = ["foo"],
opconvert = True,
expected_result = [['||', 'A', 'B']]),
UseReduceTestCase(
"|| ( ( A B ) foo? ( || ( C D ) ) )",
uselist = ["foo"],
opconvert = True,
expected_result = [['||', ['A', 'B'], 'C', 'D']]),
UseReduceTestCase(
"|| ( ( A B ) foo? ( || ( C D ) ) )",
uselist = ["foo"],
opconvert = False,
expected_result = ['||', [['A', 'B'], 'C', 'D']]),
UseReduceTestCase(
"|| ( ( A B ) || ( C D ) )",
expected_result = ['||', [['A', 'B'], 'C', 'D']]),
UseReduceTestCase(
"|| ( ( A B ) || ( C D || ( E ( F G ) || ( H ) ) ) )",
expected_result = ['||', [['A', 'B'], 'C', 'D', 'E', ['F', 'G'], 'H']]),
UseReduceTestCase(
"|| ( ( A B ) || ( C D || ( E ( F G ) || ( H ) ) ) )",
opconvert = True,
expected_result = [['||', ['A', 'B'], 'C', 'D', 'E', ['F', 'G'], 'H']]),
UseReduceTestCase(
"|| ( foo? ( A B ) )",
uselist = ["foo"],
expected_result = ['A', 'B']),
UseReduceTestCase(
"|| ( || ( foo? ( A B ) ) )",
uselist = ["foo"],
expected_result = ['A', 'B']),
UseReduceTestCase(
"|| ( || ( || ( a? ( b? ( c? ( || ( || ( || ( d? ( e? ( f? ( A B ) ) ) ) ) ) ) ) ) ) ) )",
uselist = ["a", "b", "c", "d", "e", "f"],
expected_result = ['A', 'B']),
UseReduceTestCase(
"|| ( || ( ( || ( a? ( ( b? ( c? ( || ( || ( || ( ( d? ( e? ( f? ( A B ) ) ) ) ) ) ) ) ) ) ) ) ) ) )",
uselist = ["a", "b", "c", "d", "e", "f"],
expected_result = ['A', 'B']),
UseReduceTestCase(
"|| ( ( A ( || ( B ) ) ) )",
expected_result = ['A', 'B']),
UseReduceTestCase(
"|| ( ( A B ) || ( foo? ( bar? ( ( C D || ( baz? ( E ) ( F G ) || ( H ) ) ) ) ) ) )",
uselist = ["foo", "bar", "baz"],
expected_result = ['||', [['A', 'B'], ['C', 'D', '||', ['E', ['F', 'G'], 'H']]]]),
UseReduceTestCase(
"|| ( ( A B ) || ( foo? ( bar? ( ( C D || ( baz? ( E ) ( F G ) || ( H ) ) ) ) ) ) )",
uselist = ["foo", "bar", "baz"],
opconvert = True,
expected_result = [['||', ['A', 'B'], ['C', 'D', ['||', 'E', ['F', 'G'], 'H']]]]),
UseReduceTestCase(
"|| ( foo? ( A B ) )",
uselist = ["foo"],
opconvert=True,
expected_result = ['A', 'B']),
UseReduceTestCase(
"|| ( || ( foo? ( A B ) ) )",
uselist = ["foo"],
opconvert=True,
expected_result = ['A', 'B']),
UseReduceTestCase(
"|| ( || ( || ( a? ( b? ( c? ( || ( || ( || ( d? ( e? ( f? ( A B ) ) ) ) ) ) ) ) ) ) ) )",
uselist = ["a", "b", "c", "d", "e", "f"],
opconvert=True,
expected_result = ['A', 'B']),
#flat test
UseReduceTestCase(
"A",
flat = True,
expected_result = ["A"]),
UseReduceTestCase(
"( A )",
flat = True,
expected_result = ["A"]),
UseReduceTestCase(
"|| ( A B )",
flat = True,
expected_result = [ "||", "A", "B" ] ),
UseReduceTestCase(
"|| ( A || ( B C ) )",
flat = True,
expected_result = [ "||", "A", "||", "B", "C" ]),
UseReduceTestCase(
"|| ( A || ( B C D ) )",
flat = True,
expected_result = [ "||", "A", "||", "B", "C", "D" ]),
UseReduceTestCase(
"|| ( A || ( B || ( C D ) E ) )",
flat = True,
expected_result = [ "||", "A", "||", "B", "||", "C", "D", "E" ]),
UseReduceTestCase(
"( || ( ( ( A ) B ) ) )",
flat = True,
expected_result = [ "||", "A", "B"] ),
UseReduceTestCase(
"( || ( || ( ( A ) B ) ) )",
flat = True,
expected_result = [ "||", "||", "A", "B" ]),
UseReduceTestCase(
"( || ( || ( ( A ) B ) ) )",
flat = True,
expected_result = [ "||", "||", "A", "B" ]),
UseReduceTestCase(
"|| ( A )",
flat = True,
expected_result = ["||", "A"]),
UseReduceTestCase(
"( || ( || ( || ( A ) foo? ( B ) ) ) )",
expected_result = ["A"]),
UseReduceTestCase(
"( || ( || ( || ( A ) foo? ( B ) ) ) )",
uselist = ["foo"],
flat = True,
expected_result = [ "||", "||","||", "A", "B" ]),
UseReduceTestCase(
"( || ( || ( bar? ( A ) || ( foo? ( B ) ) ) ) )",
flat = True,
expected_result = ["||", "||","||"]),
UseReduceTestCase(
"( || ( || ( bar? ( A ) || ( foo? ( B ) ) ) ) )",
uselist = ["foo", "bar"],
flat = True,
expected_result = [ "||", "||", "A", "||", "B" ]),
UseReduceTestCase(
"A || ( bar? ( C ) ) foo? ( bar? ( C ) ) B",
flat = True,
expected_result = ["A", "||", "B"]),
UseReduceTestCase(
"|| ( A ) || ( B )",
flat = True,
expected_result = ["||", "A", "||", "B"]),
UseReduceTestCase(
"foo? ( A ) foo? ( B )",
flat = True,
expected_result = []),
UseReduceTestCase(
"foo? ( A ) foo? ( B )",
uselist = ["foo"],
flat = True,
expected_result = ["A", "B"]),
#use flag validation
UseReduceTestCase(
"foo? ( A )",
uselist = ["foo"],
is_valid_flag = self.always_true,
expected_result = ["A"]),
UseReduceTestCase(
"foo? ( A )",
is_valid_flag = self.always_true,
expected_result = []),
#token_class
UseReduceTestCase(
"foo? ( dev-libs/A )",
uselist = ["foo"],
token_class=Atom,
expected_result = ["dev-libs/A"]),
UseReduceTestCase(
"foo? ( dev-libs/A )",
token_class=Atom,
expected_result = []),
)
test_cases_xfail = (
UseReduceTestCase("? ( A )"),
UseReduceTestCase("!? ( A )"),
UseReduceTestCase("( A"),
UseReduceTestCase("A )"),
UseReduceTestCase("||( A B )"),
UseReduceTestCase("|| (A B )"),
UseReduceTestCase("|| ( A B)"),
UseReduceTestCase("|| ( A B"),
UseReduceTestCase("|| A B )"),
UseReduceTestCase("|| A B"),
UseReduceTestCase("|| ( A B ) )"),
UseReduceTestCase("|| || B C"),
UseReduceTestCase("|| ( A B || )"),
UseReduceTestCase("a? A"),
UseReduceTestCase("( || ( || || ( A ) foo? ( B ) ) )"),
UseReduceTestCase("( || ( || bar? ( A ) foo? ( B ) ) )"),
UseReduceTestCase("foo?"),
UseReduceTestCase("foo? || ( A )"),
UseReduceTestCase("|| ( )"),
UseReduceTestCase("foo? ( )"),
#SRC_URI stuff
UseReduceTestCase("http://foo/bar -> blah.tbz2", is_src_uri = True, eapi = EAPI_WITHOUT_SRC_URI_ARROWS),
UseReduceTestCase("|| ( http://foo/bar -> blah.tbz2 )", is_src_uri = True, eapi = EAPI_WITH_SRC_URI_ARROWS),
UseReduceTestCase("http://foo/bar -> foo? ( ftp://foo/a )", is_src_uri = True, eapi = EAPI_WITH_SRC_URI_ARROWS),
UseReduceTestCase("http://foo/bar blah.tbz2 ->", is_src_uri = True, eapi = EAPI_WITH_SRC_URI_ARROWS),
UseReduceTestCase("-> http://foo/bar blah.tbz2 )", is_src_uri = True, eapi = EAPI_WITH_SRC_URI_ARROWS),
UseReduceTestCase("http://foo/bar ->", is_src_uri = True, eapi = EAPI_WITH_SRC_URI_ARROWS),
UseReduceTestCase("http://foo/bar -> foo? ( http://foo.com/foo )", is_src_uri = True, eapi = EAPI_WITH_SRC_URI_ARROWS),
UseReduceTestCase("foo? ( http://foo/bar -> ) blah.tbz2", is_src_uri = True, eapi = EAPI_WITH_SRC_URI_ARROWS),
UseReduceTestCase("http://foo/bar -> foo/blah.tbz2", is_src_uri = True, eapi = EAPI_WITH_SRC_URI_ARROWS),
UseReduceTestCase("http://foo/bar -> -> bar.tbz2 foo? ( ftp://foo/a )", is_src_uri = True, eapi = EAPI_WITH_SRC_URI_ARROWS),
UseReduceTestCase("http://foo/bar -> bar.tbz2 foo? ( ftp://foo/a )", is_src_uri = False, eapi = EAPI_WITH_SRC_URI_ARROWS),
UseReduceTestCase(
"A",
opconvert = True,
flat = True),
#use flag validation
UseReduceTestCase("1.0? ( A )"),
UseReduceTestCase("!1.0? ( A )"),
UseReduceTestCase("!? ( A )"),
UseReduceTestCase("!?? ( A )"),
UseReduceTestCase(
"foo? ( A )",
is_valid_flag = self.always_false,
),
UseReduceTestCase(
"foo? ( A )",
uselist = ["foo"],
is_valid_flag = self.always_false,
),
#token_class
UseReduceTestCase(
"foo? ( A )",
uselist = ["foo"],
token_class=Atom),
UseReduceTestCase(
"A(B",
token_class=Atom),
)
for test_case in test_cases:
# If it fails then show the input, since lots of our
# test cases have the same output but different input,
# making it difficult deduce which test has failed.
self.assertEqual(test_case.run(), test_case.expected_result,
"input: '%s' result: %s != %s" % (test_case.deparray,
test_case.run(), test_case.expected_result))
for test_case in test_cases_xfail:
self.assertRaisesMsg(test_case.deparray, (InvalidDependString, ValueError), test_case.run)