1 # Copyright 2009-2010 Gentoo Foundation
2 # Distributed under the terms of the GNU General Public License v2
4 from portage.tests import TestCase
5 from portage.exception import InvalidDependString
6 from portage.dep import Atom, use_reduce
8 class UseReduceTestCase(object):
9 def __init__(self, deparray, uselist=[], masklist=[], \
10 matchall=0, excludeall=[], is_src_uri=False, \
11 eapi=None, opconvert=False, flat=False, expected_result=None, \
12 is_valid_flag=None, token_class=None):
13 self.deparray = deparray
14 self.uselist = uselist
15 self.masklist = masklist
16 self.matchall = matchall
17 self.excludeall = excludeall
18 self.is_src_uri = is_src_uri
20 self.opconvert = opconvert
22 self.is_valid_flag = is_valid_flag
23 self.token_class = token_class
24 self.expected_result = expected_result
27 return use_reduce(self.deparray, self.uselist, self.masklist, \
28 self.matchall, self.excludeall, self.is_src_uri, self.eapi, \
29 self.opconvert, self.flat, self.is_valid_flag, self.token_class)
31 class UseReduce(TestCase):
33 def always_true(self, ununsed_parameter):
36 def always_false(self, ununsed_parameter):
39 def testUseReduce(self):
41 EAPI_WITH_SRC_URI_ARROWS = "2"
42 EAPI_WITHOUT_SRC_URI_ARROWS = "0"
46 "a? ( A ) b? ( B ) !c? ( C ) !d? ( D )",
47 uselist = ["a", "b", "c", "d"],
48 expected_result = ["A", "B"]
51 "a? ( A ) b? ( B ) !c? ( C ) !d? ( D )",
52 uselist = ["a", "b", "c"],
53 expected_result = ["A", "B", "D"]
56 "a? ( A ) b? ( B ) !c? ( C ) !d? ( D )",
58 expected_result = ["B", "D"]
62 "a? ( A ) b? ( B ) !c? ( C ) !d? ( D )",
64 expected_result = ["A", "B", "C", "D"]
67 "a? ( A ) b? ( B ) !c? ( C ) !d? ( D )",
68 masklist = ["a", "c"],
69 expected_result = ["C", "D"]
72 "a? ( A ) b? ( B ) !c? ( C ) !d? ( D )",
74 masklist = ["a", "c"],
75 expected_result = ["B", "C", "D"]
78 "a? ( A ) b? ( B ) !c? ( C ) !d? ( D )",
80 masklist = ["a", "c"],
81 expected_result = ["B", "C", "D"]
84 "a? ( A ) b? ( B ) !c? ( C ) !d? ( D )",
85 excludeall = ["a", "c"],
86 expected_result = ["D"]
89 "a? ( A ) b? ( B ) !c? ( C ) !d? ( D )",
91 excludeall = ["a", "c"],
92 expected_result = ["B", "D"]
95 "a? ( A ) b? ( B ) !c? ( C ) !d? ( D )",
97 excludeall = ["a", "c"],
98 expected_result = ["A", "B", "D"]
101 "a? ( A ) b? ( B ) !c? ( C ) !d? ( D )",
103 excludeall = ["a", "c"],
105 expected_result = ["A", "D"]
111 uselist = ["a", "b"],
112 expected_result = ["AB"]
115 "a? ( b? ( AB ) C )",
117 expected_result = ["C"]
120 "a? ( b? ( || ( AB CD ) ) )",
121 uselist = ["a", "b"],
122 expected_result = ["||", ["AB", "CD"]]
125 "|| ( || ( a? ( A ) b? ( B ) ) )",
126 uselist = ["a", "b"],
127 expected_result = ["||", ["A", "B"]]
130 "|| ( || ( a? ( A ) b? ( B ) ) )",
132 expected_result = ["A"]
135 "|| ( || ( a? ( A ) b? ( B ) ) )",
140 "|| ( || ( a? ( || ( A c? ( C ) ) ) b? ( B ) ) )",
145 "|| ( || ( a? ( || ( A c? ( C ) ) ) b? ( B ) ) )",
147 expected_result = ["A"]
150 "|| ( || ( a? ( || ( A c? ( C ) ) ) b? ( B ) ) )",
152 expected_result = ["B"]
155 "|| ( || ( a? ( || ( A c? ( C ) ) ) b? ( B ) ) )",
160 "|| ( || ( a? ( || ( A c? ( C ) ) ) b? ( B ) ) )",
161 uselist = ["a", "c"],
162 expected_result = ["||", [ "A", "C"]]
168 expected_result = ["A"]),
171 expected_result = ["A"]),
174 expected_result = [ "||", ["A", "B"] ]),
177 expected_result = [ "||", [ ["A", "B"], "C"] ]),
179 "|| ( ( A B ) ( C ) )",
180 expected_result = [ "||", [ ["A", "B"], "C"] ]),
182 "|| ( A || ( B C ) )",
183 expected_result = [ "||", ["A", "B", "C"]]),
185 "|| ( A || ( B C D ) )",
186 expected_result = [ "||", ["A", "B", "C", "D"] ]),
188 "|| ( A || ( B || ( C D ) E ) )",
189 expected_result = [ "||", ["A", "B", "C", "D", "E"] ]),
191 "( || ( ( ( A ) B ) ) )",
192 expected_result = ["A", "B"] ),
194 "( || ( || ( ( A ) B ) ) )",
195 expected_result = [ "||", ["A", "B"] ]),
197 "( || ( || ( ( A ) B ) ) )",
198 expected_result = [ "||", ["A", "B"] ]),
201 expected_result = ["A"]),
203 "( || ( || ( || ( A ) foo? ( B ) ) ) )",
204 expected_result = ["A"]),
206 "( || ( || ( || ( A ) foo? ( B ) ) ) )",
208 expected_result = [ "||", ["A", "B"] ]),
210 "( || ( || ( bar? ( A ) || ( foo? ( B ) ) ) ) )",
211 expected_result = []),
213 "( || ( || ( bar? ( A ) || ( foo? ( B ) ) ) ) )",
214 uselist = ["foo", "bar"],
215 expected_result = [ "||", [ "A", "B" ] ]),
217 "A || ( ) foo? ( ) B",
218 expected_result = ["A", "B"]),
221 expected_result = ["A", "B"]),
223 "foo? ( A ) foo? ( B )",
224 expected_result = []),
226 "foo? ( A ) foo? ( B )",
228 expected_result = ["A", "B"]),
232 "http://foo/bar -> blah.tbz2",
234 eapi = EAPI_WITH_SRC_URI_ARROWS,
235 expected_result = ["http://foo/bar", "->", "blah.tbz2"]),
237 "foo? ( http://foo/bar -> blah.tbz2 )",
240 eapi = EAPI_WITH_SRC_URI_ARROWS,
241 expected_result = []),
243 "foo? ( http://foo/bar -> blah.tbz2 )",
246 eapi = EAPI_WITH_SRC_URI_ARROWS,
247 expected_result = ["http://foo/bar", "->", "blah.tbz2"]),
249 "http://foo/bar -> bar.tbz2 foo? ( ftp://foo/a )",
252 eapi = EAPI_WITH_SRC_URI_ARROWS,
253 expected_result = ["http://foo/bar", "->", "bar.tbz2"]),
255 "http://foo/bar -> bar.tbz2 foo? ( ftp://foo/a )",
258 eapi = EAPI_WITH_SRC_URI_ARROWS,
259 expected_result = ["http://foo/bar", "->", "bar.tbz2", "ftp://foo/a"]),
261 "http://foo.com/foo http://foo/bar -> blah.tbz2",
264 eapi = EAPI_WITH_SRC_URI_ARROWS,
265 expected_result = ["http://foo.com/foo", "http://foo/bar", "->", "blah.tbz2"]),
271 expected_result = ["A"]),
275 expected_result = ["A"]),
279 expected_result = ["||", "A", "B"]),
283 expected_result = [ "||", ["A", "B"], "C" ]),
285 "|| ( A || ( B C ) )",
287 expected_result = ["||", "A", "B", "C"]),
289 "|| ( A || ( B C D ) )",
291 expected_result = ["||", "A", "B", "C", "D"]),
293 "|| ( A || ( B || ( C D ) E ) )",
294 expected_result = [ "||", ["A", "B", "C", "D", "E"] ]),
296 "( || ( ( ( A ) B ) ) )",
298 expected_result = [ "A", "B" ] ),
300 "( || ( || ( ( A ) B ) ) )",
302 expected_result = ["||", "A", "B"]),
304 "( || ( || ( ( A ) B ) ) )",
306 expected_result = ["||", "A", "B"]),
310 expected_result = ["A"]),
312 "( || ( || ( || ( A ) foo? ( B ) ) ) )",
313 expected_result = ["A"]),
315 "( || ( || ( || ( A ) foo? ( B ) ) ) )",
318 expected_result = ["||", "A", "B"]),
320 "( || ( || ( bar? ( A ) || ( foo? ( B ) ) ) ) )",
322 expected_result = []),
324 "( || ( || ( bar? ( A ) || ( foo? ( B ) ) ) ) )",
325 uselist = ["foo", "bar"],
327 expected_result = ["||", "A", "B"]),
329 "A || ( ) foo? ( ) B",
331 expected_result = ["A", "B"]),
335 expected_result = ["A", "B"]),
337 "foo? ( A ) foo? ( B )",
339 expected_result = []),
341 "foo? ( A ) foo? ( B )",
344 expected_result = ["A", "B"]),
346 "|| ( foo? ( || ( A B ) ) )",
349 expected_result = ["||", "A", "B"]),
352 "|| ( ( A B ) foo? ( || ( C D ) ) )",
355 expected_result = ['||', ['A', 'B'], 'C', 'D']),
358 "|| ( ( A B ) foo? ( || ( C D ) ) )",
361 expected_result = ['||', [['A', 'B'], 'C', 'D']]),
364 "|| ( ( A B ) || ( C D ) )",
365 expected_result = ['||', [['A', 'B'], 'C', 'D']]),
368 "|| ( ( A B ) || ( C D || ( E ( F G ) || ( H ) ) ) )",
369 expected_result = ['||', [['A', 'B'], 'C', 'D', 'E', ['F', 'G'], 'H']]),
372 "|| ( foo? ( A B ) )",
374 expected_result = ['A', 'B']),
377 "|| ( || ( foo? ( A B ) ) )",
379 expected_result = ['A', 'B']),
382 "|| ( || ( || ( a? ( b? ( c? ( || ( || ( || ( d? ( e? ( f? ( A B ) ) ) ) ) ) ) ) ) ) ) )",
383 uselist = ["a", "b", "c", "d", "e", "f"],
384 expected_result = ['A', 'B']),
387 "|| ( || ( ( || ( a? ( ( b? ( c? ( || ( || ( || ( ( d? ( e? ( f? ( A B ) ) ) ) ) ) ) ) ) ) ) ) ) ) )",
388 uselist = ["a", "b", "c", "d", "e", "f"],
389 expected_result = ['A', 'B']),
392 "|| ( ( A ( || ( B ) ) ) )",
393 expected_result = ['A', 'B']),
396 "|| ( ( A B ) || ( foo? ( bar? ( ( C D || ( baz? ( E ) ( F G ) || ( H ) ) ) ) ) ) )",
397 uselist = ["foo", "bar", "baz"],
398 expected_result = ['||', [['A', 'B'], 'C', 'D', '||', ['E', ['F', 'G'], 'H']]]),
401 "|| ( foo? ( A B ) )",
404 expected_result = ['A', 'B']),
407 "|| ( || ( foo? ( A B ) ) )",
410 expected_result = ['A', 'B']),
413 "|| ( || ( || ( a? ( b? ( c? ( || ( || ( || ( d? ( e? ( f? ( A B ) ) ) ) ) ) ) ) ) ) ) )",
414 uselist = ["a", "b", "c", "d", "e", "f"],
416 expected_result = ['A', 'B']),
422 expected_result = ["A"]),
426 expected_result = ["A"]),
430 expected_result = [ "||", "A", "B" ] ),
432 "|| ( A || ( B C ) )",
434 expected_result = [ "||", "A", "||", "B", "C" ]),
436 "|| ( A || ( B C D ) )",
438 expected_result = [ "||", "A", "||", "B", "C", "D" ]),
440 "|| ( A || ( B || ( C D ) E ) )",
442 expected_result = [ "||", "A", "||", "B", "||", "C", "D", "E" ]),
444 "( || ( ( ( A ) B ) ) )",
446 expected_result = [ "||", "A", "B"] ),
448 "( || ( || ( ( A ) B ) ) )",
450 expected_result = [ "||", "||", "A", "B" ]),
452 "( || ( || ( ( A ) B ) ) )",
454 expected_result = [ "||", "||", "A", "B" ]),
458 expected_result = ["||", "A"]),
460 "( || ( || ( || ( A ) foo? ( B ) ) ) )",
461 expected_result = ["A"]),
463 "( || ( || ( || ( A ) foo? ( B ) ) ) )",
466 expected_result = [ "||", "||","||", "A", "B" ]),
468 "( || ( || ( bar? ( A ) || ( foo? ( B ) ) ) ) )",
470 expected_result = ["||", "||","||"]),
472 "( || ( || ( bar? ( A ) || ( foo? ( B ) ) ) ) )",
473 uselist = ["foo", "bar"],
475 expected_result = [ "||", "||", "A", "||", "B" ]),
477 "A || ( ) foo? ( ) B",
479 expected_result = ["A", "||", "B"]),
483 expected_result = ["||", "A", "||", "B"]),
485 "foo? ( A ) foo? ( B )",
487 expected_result = []),
489 "foo? ( A ) foo? ( B )",
492 expected_result = ["A", "B"]),
498 is_valid_flag = self.always_true,
499 expected_result = ["A"]),
502 is_valid_flag = self.always_true,
503 expected_result = []),
507 "foo? ( dev-libs/A )",
510 expected_result = ["dev-libs/A"]),
512 "foo? ( dev-libs/A )",
514 expected_result = []),
518 UseReduceTestCase("? ( A )"),
519 UseReduceTestCase("!? ( A )"),
520 UseReduceTestCase("( A"),
521 UseReduceTestCase("A )"),
522 UseReduceTestCase("||( A B )"),
523 UseReduceTestCase("|| (A B )"),
524 UseReduceTestCase("|| ( A B)"),
525 UseReduceTestCase("|| ( A B"),
526 UseReduceTestCase("|| A B )"),
527 UseReduceTestCase("|| A B"),
528 UseReduceTestCase("|| ( A B ) )"),
529 UseReduceTestCase("|| || B C"),
530 UseReduceTestCase("|| ( A B || )"),
531 UseReduceTestCase("a? A"),
532 UseReduceTestCase("( || ( || || ( A ) foo? ( B ) ) )"),
533 UseReduceTestCase("( || ( || bar? ( A ) foo? ( B ) ) )"),
534 UseReduceTestCase("foo?"),
535 UseReduceTestCase("foo? || ( A )"),
538 UseReduceTestCase("http://foo/bar -> blah.tbz2", is_src_uri = True, eapi = EAPI_WITHOUT_SRC_URI_ARROWS),
539 UseReduceTestCase("|| ( http://foo/bar -> blah.tbz2 )", is_src_uri = True, eapi = EAPI_WITH_SRC_URI_ARROWS),
540 UseReduceTestCase("http://foo/bar -> foo? ( ftp://foo/a )", is_src_uri = True, eapi = EAPI_WITH_SRC_URI_ARROWS),
541 UseReduceTestCase("http://foo/bar blah.tbz2 ->", is_src_uri = True, eapi = EAPI_WITH_SRC_URI_ARROWS),
542 UseReduceTestCase("-> http://foo/bar blah.tbz2 )", is_src_uri = True, eapi = EAPI_WITH_SRC_URI_ARROWS),
543 UseReduceTestCase("http://foo/bar ->", is_src_uri = True, eapi = EAPI_WITH_SRC_URI_ARROWS),
544 UseReduceTestCase("http://foo/bar -> foo? ( http://foo.com/foo )", is_src_uri = True, eapi = EAPI_WITH_SRC_URI_ARROWS),
545 UseReduceTestCase("foo? ( http://foo/bar -> ) blah.tbz2", is_src_uri = True, eapi = EAPI_WITH_SRC_URI_ARROWS),
546 UseReduceTestCase("http://foo/bar -> foo/blah.tbz2", is_src_uri = True, eapi = EAPI_WITH_SRC_URI_ARROWS),
547 UseReduceTestCase("http://foo/bar -> -> bar.tbz2 foo? ( ftp://foo/a )", is_src_uri = True, eapi = EAPI_WITH_SRC_URI_ARROWS),
549 UseReduceTestCase("http://foo/bar -> bar.tbz2 foo? ( ftp://foo/a )", is_src_uri = False, eapi = EAPI_WITH_SRC_URI_ARROWS),
557 UseReduceTestCase("1.0? ( A )"),
558 UseReduceTestCase("!1.0? ( A )"),
559 UseReduceTestCase("!? ( A )"),
560 UseReduceTestCase("!?? ( A )"),
563 is_valid_flag = self.always_false,
568 is_valid_flag = self.always_false,
581 for test_case in test_cases:
582 # If it fails then show the input, since lots of our
583 # test cases have the same output but different input,
584 # making it difficult deduce which test has failed.
585 self.assertEqual(test_case.run(), test_case.expected_result,
586 "input: '%s' result: %s != %s" % (test_case.deparray,
587 test_case.run(), test_case.expected_result))
589 for test_case in test_cases_xfail:
590 self.assertRaisesMsg(test_case.deparray, (InvalidDependString, ValueError), test_case.run)