1 /*******************************************************************************
2 * Copyright (c) 2016 Ericsson
4 * All rights reserved. This program and the accompanying materials are
5 * made available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
8 *******************************************************************************/
10 package org
.eclipse
.tracecompass
.segmentstore
.core
.tests
;
12 import static org
.eclipse
.tracecompass
.common
.core
.NonNullUtils
.checkNotNull
;
13 import static org
.junit
.Assert
.assertEquals
;
14 import static org
.junit
.Assert
.assertFalse
;
15 import static org
.junit
.Assert
.assertTrue
;
17 import java
.util
.ArrayList
;
18 import java
.util
.Arrays
;
19 import java
.util
.Collection
;
20 import java
.util
.Collections
;
21 import java
.util
.Comparator
;
22 import java
.util
.Iterator
;
23 import java
.util
.LinkedList
;
24 import java
.util
.List
;
26 import org
.eclipse
.jdt
.annotation
.NonNull
;
27 import org
.eclipse
.tracecompass
.common
.core
.NonNullUtils
;
28 import org
.eclipse
.tracecompass
.segmentstore
.core
.BasicSegment
;
29 import org
.eclipse
.tracecompass
.segmentstore
.core
.ISegment
;
30 import org
.eclipse
.tracecompass
.segmentstore
.core
.ISegmentStore
;
31 import org
.eclipse
.tracecompass
.segmentstore
.core
.SegmentComparators
;
32 import org
.junit
.After
;
33 import org
.junit
.Before
;
34 import org
.junit
.Test
;
36 import com
.google
.common
.collect
.ImmutableList
;
37 import com
.google
.common
.collect
.Iterables
;
38 import com
.google
.common
.collect
.Lists
;
41 * Unit tests for intersecting elements in an SegmentStore
43 * Originally the TreeMapStoreTest, copied for this internal implementation. The
44 * test was barely changed as it tests the interface and not the internals.
46 * @author Matthew Khouzam
48 public abstract class AbstractTestSegmentStore
{
53 protected ISegmentStore
<@NonNull ISegment
> fSegmentStore
;
56 * Get the segment store to test
58 * @return the segment store
60 protected abstract ISegmentStore
<@NonNull ISegment
> getSegmentStore();
63 * Get the segment store to test with initial data
68 * @return the segment store
70 protected abstract ISegmentStore
<@NonNull ISegment
> getSegmentStore(@NonNull ISegment
@NonNull [] data
);
72 private static final @NonNull ISegment SEGMENT_2_6
= new BasicSegment(2, 6);
73 private static final @NonNull ISegment SEGMENT_4_6
= new BasicSegment(4, 6);
74 private static final @NonNull ISegment SEGMENT_4_8
= new BasicSegment(4, 8);
75 private static final @NonNull ISegment SEGMENT_6_8
= new BasicSegment(6, 8);
76 private static final @NonNull ISegment SEGMENT_10_14
= new BasicSegment(10, 14);
78 * A sample segment list
80 protected static final List
<@NonNull ISegment
> SEGMENTS
= ImmutableList
.of(SEGMENT_2_6
, SEGMENT_4_6
, SEGMENT_4_8
, SEGMENT_6_8
, SEGMENT_10_14
);
81 private static final List
<@NonNull ISegment
> REVERSE_SEGMENTS
= Lists
.reverse(SEGMENTS
);
86 public AbstractTestSegmentStore() {
91 * Initialize data (test vector) that will be tested
95 fSegmentStore
= getSegmentStore();
96 for (ISegment segment
: SEGMENTS
) {
97 fSegmentStore
.add(segment
);
102 * Dispose of the segment store
105 public void teardown() {
106 fSegmentStore
.dispose();
110 * Testing method size()
113 public void testSize() {
114 assertEquals(SEGMENTS
.size(), fSegmentStore
.size());
118 * Testing isEmpty() method
121 public void testIsEmpty() {
122 assertFalse(fSegmentStore
.isEmpty());
123 fSegmentStore
.clear();
124 assertTrue(fSegmentStore
.isEmpty());
128 * Testing adding a collection with the addAll method
131 public void testAddAll() {
132 assertFalse(fSegmentStore
.isEmpty());
133 fSegmentStore
.clear();
134 assertTrue(fSegmentStore
.isEmpty());
135 fSegmentStore
.addAll(SEGMENTS
);
136 assertTrue(fSegmentStore
.containsAll(SEGMENTS
));
140 * Testing "copy" constructor
143 public void testAddAllConstructor() {
144 @SuppressWarnings("null")
145 ISegmentStore
<@NonNull ISegment
> other
= getSegmentStore(fSegmentStore
.toArray(new ISegment
[fSegmentStore
.size()]));
146 assertTrue(fSegmentStore
.containsAll(other
));
147 assertTrue(other
.containsAll(fSegmentStore
));
151 * Testing "copy" constructor out of order
154 public void testAddAllConstructorOutOfOrder() {
155 @SuppressWarnings("null")
156 ISegmentStore
<@NonNull ISegment
> other
= getSegmentStore(REVERSE_SEGMENTS
.toArray(new ISegment
[fSegmentStore
.size()]));
157 assertTrue(fSegmentStore
.containsAll(other
));
158 assertTrue(other
.containsAll(fSegmentStore
));
162 * Testing adding an out of order collection with the addAll method
165 public void testAddAllOutOfOrder() {
166 assertFalse(fSegmentStore
.isEmpty());
167 fSegmentStore
.clear();
168 assertTrue(fSegmentStore
.isEmpty());
169 fSegmentStore
.addAll(REVERSE_SEGMENTS
);
170 assertTrue(fSegmentStore
.containsAll(SEGMENTS
));
174 * Test the contains() method.
177 public void testContains() {
178 ISegment otherSegment
= new BasicSegment(0, 20);
180 assertTrue(fSegmentStore
.contains(SEGMENT_2_6
));
181 assertTrue(fSegmentStore
.contains(SEGMENT_4_8
));
182 assertFalse(fSegmentStore
.contains(otherSegment
));
186 * Test containsAll() method
188 public void testContainsAll() {
189 ISegmentStore
<@NonNull ISegment
> store
= getSegmentStore();
191 store
.add(SEGMENT_2_6
);
192 assertTrue(store
.containsAll(Collections
.emptyList()));
193 assertTrue(store
.containsAll(Collections
.singleton(SEGMENT_2_6
)));
194 assertFalse(store
.containsAll(Collections
.singleton(SEGMENT_4_6
)));
198 * Test the toArray() method.
201 public void testToObjectArray() {
202 Object
[] array
= fSegmentStore
.toArray();
204 assertEquals(SEGMENTS
.size(), array
.length
);
205 assertTrue(Arrays
.asList(array
).containsAll(SEGMENTS
));
209 * Test the toArray(T[]) method.
212 public void testToSpecificArray() {
213 ISegment
[] array
= fSegmentStore
.toArray(new ISegment
[0]);
215 assertEquals(SEGMENTS
.size(), array
.length
);
216 assertTrue(Arrays
.asList(array
).containsAll(SEGMENTS
));
220 * Test the toArray(T[]) method with a subtype of ISegment.
223 public void testToSpecifyArraySubtype() {
224 ISegmentStore
<@NonNull ISegment
> tms2
= getSegmentStore();
225 BasicSegment otherSegment
= new BasicSegment(2, 6);
226 tms2
.add(otherSegment
);
227 BasicSegment
[] array
= tms2
.toArray(new BasicSegment
[0]);
229 assertEquals(1, array
.length
);
230 assertTrue(Arrays
.asList(array
).contains(otherSegment
));
236 * Test the iteration order of the complete segment store.
239 public void testIterationOrder() {
241 for (ISegment segment
: fSegmentStore
) {
242 assertEquals(SEGMENTS
.get(i
++), segment
);
247 * Test the iteration order when the elements are not inserted in sorted
251 public void testIterationOrderNonSortedInsertion() {
252 /* Prepare the segment store, we don't use the 'fixture' in this test */
253 ISegmentStore
<@NonNull ISegment
> store
= getSegmentStore();
254 for (ISegment segment
: REVERSE_SEGMENTS
) {
255 store
.add(checkNotNull(segment
));
259 * Test each element one by one, the iteration order should follow the
260 * start times, not the insertion order.
263 for (ISegment segment
: store
) {
264 assertEquals(SEGMENTS
.get(i
++), segment
);
267 /* Manually dispose our own store */
273 * {@link ISegmentStore#getIntersectingElements(long start, long end)}
276 public void testGetIntersectingElementsRange() {
278 Iterable
<ISegment
> intersectingElements
;
281 * Range that does not include any segment
283 intersectingElements
= fSegmentStore
.getIntersectingElements(16, 20);
284 assertEquals(0, Iterables
.size(intersectingElements
));
287 * Range start time : Before first segment start time Range end time :
288 * After last segment end time
290 intersectingElements
= fSegmentStore
.getIntersectingElements(1, 15);
291 assertEquals(5, Iterables
.size(intersectingElements
));
294 * Range start time : On first segment start time Range end time : On
295 * last segment end time
297 intersectingElements
= fSegmentStore
.getIntersectingElements(2, 14);
298 assertEquals(5, Iterables
.size(intersectingElements
));
301 * Range start time : After one segment start time Range end time :
302 * Before one segment end time
304 intersectingElements
= fSegmentStore
.getIntersectingElements(11, 13);
305 assertEquals(1, Iterables
.size(intersectingElements
));
306 assertEquals(SEGMENT_10_14
, Iterables
.getOnlyElement(intersectingElements
));
309 * Range start time : On one segment start time Range end time : On one
312 intersectingElements
= fSegmentStore
.getIntersectingElements(10, 14);
313 assertEquals(1, Iterables
.size(intersectingElements
));
314 assertEquals(SEGMENT_10_14
, Iterables
.getOnlyElement(intersectingElements
));
317 * Range start time : On last segment end time Range end time : After
318 * last segment end time
320 intersectingElements
= fSegmentStore
.getIntersectingElements(14, 18);
321 assertEquals(1, Iterables
.size(intersectingElements
));
322 assertEquals(SEGMENT_10_14
, Iterables
.getOnlyElement(intersectingElements
));
325 * Range start time : Before first segment start time Range end time :
326 * On first segment start time
328 intersectingElements
= fSegmentStore
.getIntersectingElements(1, 2);
329 assertEquals(1, Iterables
.size(intersectingElements
));
330 assertEquals(SEGMENT_2_6
, Iterables
.getOnlyElement(intersectingElements
));
334 * Testing method {@link ISegmentStore#getIntersectingElements(long time)}
337 public void testGetIntersectingElementsTime() {
339 Iterable
<ISegment
> intersectingElements
;
342 * Time between segment start time and end time
344 intersectingElements
= fSegmentStore
.getIntersectingElements(3);
345 assertEquals(1, Iterables
.size(intersectingElements
));
346 assertEquals(SEGMENT_2_6
, Iterables
.getOnlyElement(intersectingElements
));
349 * Time on segment start time
351 intersectingElements
= fSegmentStore
.getIntersectingElements(2);
352 assertEquals(1, Iterables
.size(intersectingElements
));
353 assertEquals(SEGMENT_2_6
, Iterables
.getOnlyElement(intersectingElements
));
356 * Time on segment end time
358 intersectingElements
= fSegmentStore
.getIntersectingElements(14);
359 assertEquals(1, Iterables
.size(intersectingElements
));
360 assertEquals(SEGMENT_10_14
, Iterables
.getOnlyElement(intersectingElements
));
363 * Time overlapping many segments
365 intersectingElements
= fSegmentStore
.getIntersectingElements(6);
366 assertEquals(4, Iterables
.size(intersectingElements
));
369 * Time between segments
371 intersectingElements
= fSegmentStore
.getIntersectingElements(9);
372 assertEquals(0, Iterables
.size(intersectingElements
));
375 * Time before all segment start time
377 intersectingElements
= fSegmentStore
.getIntersectingElements(1);
378 assertEquals(0, Iterables
.size(intersectingElements
));
381 * Time after all segment end time
383 intersectingElements
= fSegmentStore
.getIntersectingElements(15);
384 assertEquals(0, Iterables
.size(intersectingElements
));
388 * Testing method {@link ISegmentStore#dispose()}
391 public void testDispose() {
392 ISegmentStore
<@NonNull ISegment
> store
= getSegmentStore();
393 store
.add(SEGMENT_2_6
);
395 assertEquals(0, store
.size());
399 * Test iterating over a store being built.
404 public void testIterator() {
405 Collection
<@NonNull ISegment
> beforeExpected
= ImmutableList
.of(SEGMENT_2_6
);
406 Collection
<@NonNull ISegment
> afterExpected
= ImmutableList
.of(SEGMENT_2_6
, SEGMENT_4_8
);
407 Collection
<@NonNull ISegment
> lastExpected
= ImmutableList
.of(SEGMENT_2_6
, SEGMENT_4_8
, SEGMENT_6_8
);
408 Collection
<@NonNull ISegment
> fixture
= new ArrayList
<>();
409 ISegmentStore
<@NonNull ISegment
> store
= getSegmentStore();
411 // Add one segment to the segment store and iterate
412 store
.add(SEGMENT_2_6
);
413 for (ISegment item
: store
) {
416 assertEquals(beforeExpected
, fixture
);
418 // Add a second segment to the store and iterate
420 store
.add(SEGMENT_4_8
);
421 for (ISegment item
: store
) {
424 assertEquals(afterExpected
, fixture
);
428 Iterator
<@NonNull ISegment
> iter
= store
.iterator();
430 // Add a third segment to the store and iterate
431 store
.add(SEGMENT_6_8
);
432 Iterator
<@NonNull ISegment
> iter2
= store
.iterator();
435 // Make sure the first iterator take has only 2 elements and the second
437 while (iter
.hasNext()) {
438 fixture
.add(iter
.next());
440 assertEquals(afterExpected
, fixture
);
442 while (iter2
.hasNext()) {
443 fixture
.add(iter2
.next());
445 assertEquals(lastExpected
, fixture
);
449 * Test to check ordered iterators
452 public void testSortedIterator() {
453 List
<@NonNull Comparator
<ISegment
>> comparators
= new LinkedList
<>();
454 comparators
.add(SegmentComparators
.INTERVAL_END_COMPARATOR
);
455 comparators
.add(NonNullUtils
.checkNotNull(SegmentComparators
.INTERVAL_END_COMPARATOR
.reversed()));
456 comparators
.add(SegmentComparators
.INTERVAL_START_COMPARATOR
);
457 comparators
.add(NonNullUtils
.checkNotNull(SegmentComparators
.INTERVAL_START_COMPARATOR
.reversed()));
458 comparators
.add(SegmentComparators
.INTERVAL_LENGTH_COMPARATOR
);
459 comparators
.add(NonNullUtils
.checkNotNull(SegmentComparators
.INTERVAL_LENGTH_COMPARATOR
.reversed()));
461 Iterable
<ISegment
> iterable
;
462 for (Comparator
<ISegment
> comparator
: comparators
) {
463 iterable
= fSegmentStore
.iterator(comparator
);
464 verifySortedIterable(iterable
, 5, comparator
);
465 iterable
= fSegmentStore
.getIntersectingElements(5, comparator
);
466 verifySortedIterable(iterable
, 3, comparator
);
467 iterable
= fSegmentStore
.getIntersectingElements(7, 14, comparator
);
468 verifySortedIterable(iterable
, 3, comparator
);
472 private static void verifySortedIterable(Iterable
<ISegment
> iterable
, int expectedSize
, Comparator
<ISegment
> comparator
) {
474 assertEquals(expectedSize
, Iterables
.size(iterable
));
475 Iterator
<ISegment
> iterator
= iterable
.iterator();
477 ISegment prev
, current
= iterator
.next();
478 while (iterator
.hasNext()) {
480 current
= iterator
.next();
481 assertTrue(comparator
.compare(prev
, current
) <= 0);
486 * Test retainAll() contract
488 @Test(expected
= UnsupportedOperationException
.class)
489 public void testRetainAll() {
490 ISegmentStore
<@NonNull ISegment
> store
= getSegmentStore();
492 store
.add(SEGMENT_2_6
);
493 store
.retainAll(Collections
.emptyList());
497 * Test remove() contract
499 @Test(expected
= UnsupportedOperationException
.class)
500 public void testRemove() {
501 ISegmentStore
<@NonNull ISegment
> store
= getSegmentStore();
503 store
.add(SEGMENT_2_6
);
504 store
.remove(SEGMENT_2_6
);
508 * Test removeAll() contract
510 @Test(expected
= UnsupportedOperationException
.class)
511 public void testRemoveAll() {
512 ISegmentStore
<@NonNull ISegment
> store
= getSegmentStore();
514 store
.add(SEGMENT_2_6
);
515 store
.removeAll(Collections
.emptyList());