FOSSology  4.4.0
Open Source License Compliance by Open Source Software
HighlightProcessorTest.php
1 <?php
2 /*
3  SPDX-FileCopyrightText: © 2014-2015 Siemens AG
4  Author: Andreas Würl
5 
6  SPDX-License-Identifier: GPL-2.0-only
7 */
8 
9 namespace Fossology\Lib\View;
10 
15 use Mockery as M;
16 
17 class HighlightProcessorTest extends \PHPUnit\Framework\TestCase
18 {
20  private $license1;
22  private $licenseDao;
24  var $highlight;
25 
26  function setUp() : void
27  {
28  $this->license1 = new License(10, "shortName", "fullName", "licenseFullText", 4, "URL", 2);
29 
30  $this->licenseDao = M::mock(LicenseDao::class)
31  ->shouldReceive('getLicenseById')->with($this->license1->getId())
32  ->andReturn($this->license1)->getMock();
33 
34  $this->highlight = new HighlightProcessor($this->licenseDao);
35  }
36 
37  function tearDown() : void
38  {
39  M::close();
40  }
41 
42  function testAddReferenceTexts()
43  {
44  $highlight1 = new Highlight(5, 8, 'type1', 2, 6, $this->license1->getId());
45  $highlights = array($highlight1);
46 
47  $this->highlight->addReferenceTexts($highlights);
48 
49  assertThat($highlight1->getInfoText(), is("10"));
50  }
51 
52  function testSplitOverlappingHighlightEntriesReordersByStart()
53  {
54  $highlight1 = new Highlight(5, 8, 'type1', 'ref1', 0, 0);
55  $highlight2 = new Highlight(4, 8, 'text2', 'ref2', 0, 0);
56  $highlightInfos = array($highlight1, $highlight2);
57 
58  $splitOverlap = $this->highlight->calculateSplitPositions($highlightInfos);
59 
60  assertThat($splitOverlap, anArray(
61  array(
62  4 => array(new SplitPosition(0, SplitPosition::START, $highlight2)),
63  5 => array(new SplitPosition(1, SplitPosition::START, $highlight1)),
64  8 => array(
65  new SplitPosition(1, SplitPosition::END, $highlight1),
66  new SplitPosition(0, SplitPosition::END, $highlight2)
67  )
68  )));
69  }
70 
71  function testSplitHighlightEntriesContainingAnAtomAtStart()
72  {
73  $highlight1 = new Highlight(5, 8, 'type1', 'ref1', 0, 0);
74  $highlight2 = new Highlight(5, 5, 'type1', 'ref2', 0, 0);
75  $highlightInfos = array($highlight1, $highlight2);
76 
77  $splitOverlap = $this->highlight->calculateSplitPositions($highlightInfos);
78 
79  assertThat($splitOverlap, anArray(
80  array(
81  5 => array(
82  new SplitPosition(0, SplitPosition::START, $highlight1),
83  new SplitPosition(1, SplitPosition::ATOM, $highlight2)),
84  8 => array(new SplitPosition(0, SplitPosition::END, $highlight1))
85  )));
86  }
87 
88  function testSplitHighlightEntriesContainingAnAtomInTheMiddle()
89  {
90  $highlight1 = new Highlight(5, 8, 'type1', 'ref1', 0, 0);
91  $highlight2 = new Highlight(7, 7, 'type2', 'ref2', 0, 0);
92  $highlightInfos = array($highlight1, $highlight2);
93 
94  $splitOverlap = $this->highlight->calculateSplitPositions($highlightInfos);
95 
96  assertThat($splitOverlap, anArray(
97  array(
98  5 => array(new SplitPosition(0, SplitPosition::START, $highlight1)),
99  7 => array(new SplitPosition(1, SplitPosition::ATOM, $highlight2)),
100  8 => array(new SplitPosition(0, SplitPosition::END, $highlight1))
101  )));
102  }
103 
104  function testSplitOverlappingHightlightEntriesReordersByLengthIfStartIsIdentical()
105  {
106  $highlight1 = new Highlight(5, 8, 'type1', 'ref1', 0, 0);
107  $highlight2 = new Highlight(5, 9, 'type2', 'ref2', 0, 0);
108  $highlightInfos = array($highlight1, $highlight2);
109 
110  $splitOverlap = $this->highlight->calculateSplitPositions($highlightInfos);
111 
112  assertThat($splitOverlap, anArray(
113  array(
114  5 => array(new SplitPosition(0, SplitPosition::START, $highlight2),
115  new SplitPosition(1, SplitPosition::START, $highlight1)),
116  8 => array(new SplitPosition(1, SplitPosition::END, $highlight1)),
117  9 => array(new SplitPosition(0, SplitPosition::END, $highlight2))
118  )));
119  }
120 
121  function testSplitOverlappingHightlightEntriesSplitsOverlappingEntries()
122  {
123  $highlight1 = new Highlight(5, 8, 'type1', 'ref1', 0, 0);
124  $highlight2 = new Highlight(7, 11, 'type2', 'ref2', 0, 0);
125  $highlightInfos = array($highlight1, $highlight2);
126 
127  $splitOverlap = $this->highlight->calculateSplitPositions($highlightInfos);
128 
129  assertThat($splitOverlap, anArray(
130  array(
131  5 => array(new SplitPosition(0, SplitPosition::START, $highlight1)),
132  7 => array(new SplitPosition(1, SplitPosition::START, $highlight2)),
133  8 => array(
134  new SplitPosition(1, SplitPosition::END, $highlight2),
135  new SplitPosition(0, SplitPosition::END, $highlight1),
136  new SplitPosition(1, SplitPosition::START, $highlight2)),
137  11 => array(new SplitPosition(1, SplitPosition::END, $highlight2))
138  )));
139  }
140 
141  function testSplitOverlappingHightlightEntriesKeepsNonOverlappingEntriesInDepth()
142  {
143  $highlight1 = new Highlight(5, 15, 'type1', 'ref1', 0, 0);
144  $highlight2 = new Highlight(7, 13, 'type2', 'ref2', 0, 0);
145  $highlight3 = new Highlight(9, 11, 'type3', 'ref3', 0, 0);
146  $highlightInfos = array($highlight1, $highlight2, $highlight3);
147 
148  $splitOverlap = $this->highlight->calculateSplitPositions($highlightInfos);
149 
150  assertThat($splitOverlap, anArray(
151  array(
152  5 => array(new SplitPosition(0, SplitPosition::START, $highlight1)),
153  7 => array(new SplitPosition(1, SplitPosition::START, $highlight2)),
154  9 => array(new SplitPosition(2, SplitPosition::START, $highlight3)),
155  11 => array(new SplitPosition(2, SplitPosition::END, $highlight3)),
156  13 => array(new SplitPosition(1, SplitPosition::END, $highlight2)),
157  15 => array(new SplitPosition(0, SplitPosition::END, $highlight1))
158  )));
159  }
160 
161  function testSplitOverlappingHightlightEntriesSplitsOverlappingEntriesInDepth()
162  {
163  $highlight1 = new Highlight(5, 11, 'type1', 'ref1', 0, 0);
164  $highlight2 = new Highlight(7, 13, 'type2', 'ref2', 0, 0);
165  $highlight3 = new Highlight(9, 15, 'type3', 'ref3', 0, 0);
166  $highlightInfos = array($highlight1, $highlight2, $highlight3);
167 
168  $splitOverlap = $this->highlight->calculateSplitPositions($highlightInfos);
169 
170  assertThat($splitOverlap, anArray(
171  array(
172  5 => array(new SplitPosition(0, SplitPosition::START, $highlight1)),
173  7 => array(new SplitPosition(1, SplitPosition::START, $highlight2)),
174  9 => array(new SplitPosition(2, SplitPosition::START, $highlight3)),
175  11 => array(
176  new SplitPosition(2, SplitPosition::END, $highlight3),
177  new SplitPosition(1, SplitPosition::END, $highlight2),
178  new SplitPosition(0, SplitPosition::END, $highlight1),
179  new SplitPosition(1, SplitPosition::START, $highlight2),
180  new SplitPosition(2, SplitPosition::START, $highlight3),),
181  13 => array(
182  new SplitPosition(2, SplitPosition::END, $highlight3),
183  new SplitPosition(1, SplitPosition::END, $highlight2),
184  new SplitPosition(2, SplitPosition::START, $highlight3),),
185  15 => array(new SplitPosition(2, SplitPosition::END, $highlight3))
186  )));
187 
188  }
189 
190  function testSplitOverlappingHightlightEntriesSplitsPartialOverlappingEntries()
191  {
192  $highlight1 = new Highlight(5, 8, 'type1', 'ref1', 0, 0);
193  $highlight2 = new Highlight(10, 13, 'type2', 'ref2', 0, 0);
194  $highlight3 = new Highlight(7, 11, 'type3', 'ref3', 0, 0);
195  $highlightInfos = array($highlight1, $highlight2, $highlight3);
196 
197  $splitOverlap = $this->highlight->calculateSplitPositions($highlightInfos);
198 
199  assertThat($splitOverlap, anArray(
200  array(
201  5 => array(new SplitPosition(0, SplitPosition::START, $highlight1)),
202  7 => array(new SplitPosition(1, SplitPosition::START, $highlight3)),
203  8 => array(
204  new SplitPosition(1, SplitPosition::END, $highlight3),
205  new SplitPosition(0, SplitPosition::END, $highlight1),
206  new SplitPosition(1, SplitPosition::START, $highlight3)),
207  10 => array(
208  new SplitPosition(1, SplitPosition::END, $highlight3),
209  new SplitPosition(0, SplitPosition::START, $highlight2),
210  new SplitPosition(1, SplitPosition::START, $highlight3)),
211  11 => array(new SplitPosition(1, SplitPosition::END, $highlight3),),
212  13 => array(new SplitPosition(0, SplitPosition::END, $highlight2))
213  )));
214  }
215 
216  function testFlattenHighlightWithSeparatedEntries()
217  {
218  $highlight1 = new Highlight(5, 8, 'type1', 'ref1', 0, 0);
219  $highlight2 = new Highlight(10, 13, 'type2', 'ref2', 0, 0);
220  $highlights = array($highlight1, $highlight2);
221 
222  $this->highlight->flattenHighlights($highlights);
223 
224  assertThat($highlights, anArray(
225  array(
226  new Highlight(5, 8, Highlight::UNDEFINED, 'ref1', 0, 0),
227  new Highlight(10, 13, Highlight::UNDEFINED, 'ref2', 0, 0)
228  )));
229  }
230 
231  function testFlattenHighlightWithOverlappingEntries()
232  {
233  $highlight1 = new Highlight(5, 10, Highlight::MATCH, 'ref1', 0, 0);
234  $highlight2 = new Highlight(8, 13, Highlight::ADDED, 'ref2', 0, 0);
235  $highlights = array($highlight1, $highlight2);
236 
237  $this->highlight->flattenHighlights($highlights);
238 
239  assertThat($highlights, anArray(
240  array(
241  new Highlight(5, 10, Highlight::UNDEFINED, 'ref1', 0, 0),
242  new Highlight(10, 13, Highlight::UNDEFINED, 'ref2', 0, 0)
243  )));
244  }
245 
246  function testFlattenHighlightWithFullyOverlappingEntries()
247  {
248  $highlight1 = new Highlight(5, 10, Highlight::MATCH, 'ref1', 0, 0);
249  $highlight2 = new Highlight(7, 9, Highlight::ADDED, 'ref2', 0, 0);
250  $highlights = array($highlight1, $highlight2);
251 
252  $this->highlight->flattenHighlights($highlights);
253 
254  assertThat($highlights, anArray(
255  array(
256  new Highlight(5, 10, Highlight::UNDEFINED, 'ref1', 0, 0),
257  )));
258  }
259 
260  function testFlattenHighlightWithIgnoredEntries()
261  {
262  $highlight1 = new Highlight(5, 10, Highlight::MATCH, 'ref1', 0, 0);
263  $highlight2 = new Highlight(7, 9, Highlight::KEYWORD, 'ref2', 0, 0);
264  $highlights = array($highlight1, $highlight2);
265 
266  $this->highlight->flattenHighlights($highlights, array(Highlight::KEYWORD));
267 
268  assertThat($highlights, anArray(
269  array(
270  new Highlight(5, 10, Highlight::UNDEFINED, 'ref1', 0, 0),
271  new Highlight(7, 9, Highlight::KEYWORD, 'ref2', 0, 0)
272  )));
273  }
274 
275  function testFlattenHighlightWithOverlappingEntriesThatHaveEqualEnd()
276  {
277  $highlight1 = new Highlight(5, 10, Highlight::MATCH, 'ref1', 0, 0);
278  $highlight2 = new Highlight(7, 10, Highlight::ADDED, 'ref2', 0, 0);
279  $highlights = array($highlight1, $highlight2);
280 
281  $this->highlight->flattenHighlights($highlights);
282 
283  assertThat($highlights, anArray(
284  array(
285  new Highlight(5, 10, Highlight::UNDEFINED, 'ref1', 0, 0),
286  )));
287  }
288 }