1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3# pylint: disable=no-self-use, pointless-statement, missing-docstring, no-member, len-as-condition
4
5from ..pattern import StringPattern, RePattern
6from ..processors import ConflictSolver
7from ..rules import execute_rule
8from ..match import Matches
9
10
11def test_conflict_1():
12    input_string = "abcdefghijklmnopqrstuvwxyz"
13
14    pattern = StringPattern("ijklmn", "kl", "abcdef", "ab", "ef", "yz")
15    matches = Matches(pattern.matches(input_string))
16
17    execute_rule(ConflictSolver(), matches, None)
18
19    values = [x.value for x in matches]
20
21    assert values == ["ijklmn", "abcdef", "yz"]
22
23
24def test_conflict_2():
25    input_string = "abcdefghijklmnopqrstuvwxyz"
26
27    pattern = StringPattern("ijklmn", "jklmnopqrst")
28    matches = Matches(pattern.matches(input_string))
29
30    execute_rule(ConflictSolver(), matches, None)
31
32    values = [x.value for x in matches]
33
34    assert values == ["jklmnopqrst"]
35
36
37def test_conflict_3():
38    input_string = "abcdefghijklmnopqrstuvwxyz"
39
40    pattern = StringPattern("ijklmnopqrst", "jklmnopqrst")
41    matches = Matches(pattern.matches(input_string))
42
43    execute_rule(ConflictSolver(), matches, None)
44
45    values = [x.value for x in matches]
46
47    assert values == ["ijklmnopqrst"]
48
49
50def test_conflict_4():
51    input_string = "123456789"
52
53    pattern = StringPattern("123", "456789")
54    matches = Matches(pattern.matches(input_string))
55
56    execute_rule(ConflictSolver(), matches, None)
57
58    values = [x.value for x in matches]
59    assert values == ["123", "456789"]
60
61
62def test_conflict_5():
63    input_string = "123456789"
64
65    pattern = StringPattern("123456", "789")
66    matches = Matches(pattern.matches(input_string))
67
68    execute_rule(ConflictSolver(), matches, None)
69
70    values = [x.value for x in matches]
71    assert values == ["123456", "789"]
72
73
74def test_prefer_longer_parent():
75    input_string = "xxx.1x02.xxx"
76
77    re1 = RePattern("([0-9]+)x([0-9]+)", name='prefer', children=True, formatter=int)
78    re2 = RePattern("x([0-9]+)", name='skip', children=True)
79
80    matches = Matches(re1.matches(input_string))
81    matches.extend(re2.matches(input_string))
82
83    execute_rule(ConflictSolver(), matches, None)
84    assert len(matches) == 2
85    assert matches[0].value == 1
86    assert matches[1].value == 2
87
88
89def test_conflict_solver_1():
90    input_string = "123456789"
91
92    re1 = StringPattern("2345678", conflict_solver=lambda match, conflicting: '__default__')
93    re2 = StringPattern("34567")
94
95    matches = Matches(re1.matches(input_string))
96    matches.extend(re2.matches(input_string))
97
98    execute_rule(ConflictSolver(), matches, None)
99    assert len(matches) == 1
100    assert matches[0].value == "2345678"
101
102
103def test_conflict_solver_2():
104    input_string = "123456789"
105
106    re1 = StringPattern("2345678", conflict_solver=lambda match, conflicting: '__default__')
107    re2 = StringPattern("34567", conflict_solver=lambda match, conflicting: conflicting)
108
109    matches = Matches(re1.matches(input_string))
110    matches.extend(re2.matches(input_string))
111
112    execute_rule(ConflictSolver(), matches, None)
113    assert len(matches) == 1
114    assert matches[0].value == "34567"
115
116
117def test_conflict_solver_3():
118    input_string = "123456789"
119
120    re1 = StringPattern("2345678", conflict_solver=lambda match, conflicting: match)
121    re2 = StringPattern("34567")
122
123    matches = Matches(re1.matches(input_string))
124    matches.extend(re2.matches(input_string))
125
126    execute_rule(ConflictSolver(), matches, None)
127    assert len(matches) == 1
128    assert matches[0].value == "34567"
129
130
131def test_conflict_solver_4():
132    input_string = "123456789"
133
134    re1 = StringPattern("2345678")
135    re2 = StringPattern("34567", conflict_solver=lambda match, conflicting: conflicting)
136
137    matches = Matches(re1.matches(input_string))
138    matches.extend(re2.matches(input_string))
139
140    execute_rule(ConflictSolver(), matches, None)
141    assert len(matches) == 1
142    assert matches[0].value == "34567"
143
144
145def test_conflict_solver_5():
146    input_string = "123456789"
147
148    re1 = StringPattern("2345678", conflict_solver=lambda match, conflicting: conflicting)
149    re2 = StringPattern("34567")
150
151    matches = Matches(re1.matches(input_string))
152    matches.extend(re2.matches(input_string))
153
154    execute_rule(ConflictSolver(), matches, None)
155    assert len(matches) == 1
156    assert matches[0].value == "2345678"
157
158
159def test_conflict_solver_6():
160    input_string = "123456789"
161
162    re1 = StringPattern("2345678")
163    re2 = StringPattern("34567", conflict_solver=lambda match, conflicting: conflicting)
164
165    matches = Matches(re1.matches(input_string))
166    matches.extend(re2.matches(input_string))
167
168    execute_rule(ConflictSolver(), matches, None)
169    assert len(matches) == 1
170    assert matches[0].value == "34567"
171
172
173def test_conflict_solver_7():
174    input_string = "102"
175
176    re1 = StringPattern("102")
177    re2 = StringPattern("02")
178
179    matches = Matches(re2.matches(input_string))
180    matches.extend(re1.matches(input_string))
181
182    execute_rule(ConflictSolver(), matches, None)
183    assert len(matches) == 1
184    assert matches[0].value == "102"
185
186
187def test_unresolved():
188    input_string = "123456789"
189
190    re1 = StringPattern("23456")
191    re2 = StringPattern("34567")
192
193    matches = Matches(re1.matches(input_string))
194    matches.extend(re2.matches(input_string))
195
196    execute_rule(ConflictSolver(), matches, None)
197    assert len(matches) == 2
198
199    re1 = StringPattern("34567")
200    re2 = StringPattern("2345678", conflict_solver=lambda match, conflicting: None)
201
202    matches = Matches(re1.matches(input_string))
203    matches.extend(re2.matches(input_string))
204
205    execute_rule(ConflictSolver(), matches, None)
206    assert len(matches) == 2
207
208    re1 = StringPattern("34567", conflict_solver=lambda match, conflicting: None)
209    re2 = StringPattern("2345678")
210
211    matches = Matches(re1.matches(input_string))
212    matches.extend(re2.matches(input_string))
213
214    execute_rule(ConflictSolver(), matches, None)
215    assert len(matches) == 2
216