1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
# Copyright 2017-2024 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
from portage.tests import TestCase
from portage.dep import Atom, use_reduce
from portage.dep.dep_check import _overlap_dnf
class OverlapDNFTestCase(TestCase):
def testOverlapDNF(self):
test_cases = (
(
"|| ( cat/A cat/B ) cat/E || ( cat/C cat/D )",
[["||", "cat/A", "cat/B"], "cat/E", ["||", "cat/C", "cat/D"]],
),
(
"|| ( cat/A cat/B ) cat/D || ( cat/B cat/C )",
[
"cat/D",
[
"||",
["cat/A", "cat/B"],
["cat/A", "cat/C"],
["cat/B", "cat/B"],
["cat/B", "cat/C"],
],
],
),
(
"|| ( cat/A cat/B ) || ( cat/C cat/D ) || ( ( cat/B cat/E ) cat/F )",
[
[
"||",
["cat/A", "cat/B", "cat/E"],
["cat/A", "cat/F"],
["cat/B", "cat/B", "cat/E"],
["cat/B", "cat/F"],
],
["||", "cat/C", "cat/D"],
],
),
)
for dep_str, result in test_cases:
self.assertEqual(
_overlap_dnf(use_reduce(dep_str, token_class=Atom, opconvert=True)),
result,
)
class DuplicateOverlapDNFTestCase(TestCase):
def testDuplicateOverlapDNF(self):
"""
Demonstrate deduplication of any-of blocks, preventing unnecessary
DNF expansion for duplicate any-of blocks as in bug 891137.
"""
test_cases = (
("|| ( cat/A cat/B ) || ( cat/A cat/B )", [["||", "cat/A", "cat/B"]]),
(
"|| ( cat/A cat/B ) cat/E || ( cat/C cat/D ) || ( cat/A cat/B )",
["cat/E", ["||", "cat/A", "cat/B"], ["||", "cat/C", "cat/D"]],
),
(
"|| ( cat/A cat/B ) cat/D || ( cat/B cat/C ) || ( cat/A cat/B )",
[
"cat/D",
[
"||",
["cat/A", "cat/B"],
["cat/A", "cat/C"],
["cat/B", "cat/B"],
["cat/B", "cat/C"],
],
],
),
(
"|| ( cat/A cat/B ) || ( cat/C cat/D ) || ( ( cat/B cat/E ) cat/F ) || ( cat/A cat/B )",
[
[
"||",
["cat/A", "cat/B", "cat/E"],
["cat/A", "cat/F"],
["cat/B", "cat/B", "cat/E"],
["cat/B", "cat/F"],
],
["||", "cat/C", "cat/D"],
],
),
)
for dep_str, result in test_cases:
self.assertEqual(
_overlap_dnf(use_reduce(dep_str, token_class=Atom, opconvert=True)),
result,
)
|