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