View Javadoc
1   package emissary.util;
2   
3   import emissary.core.BaseDataObject;
4   import emissary.core.DataObjectFactory;
5   import emissary.core.IBaseDataObject;
6   import emissary.test.core.junit5.UnitTest;
7   
8   import org.junit.jupiter.api.Test;
9   
10  import java.util.List;
11  import java.util.stream.Collectors;
12  
13  import static org.junit.jupiter.api.Assertions.assertEquals;
14  import static org.junit.jupiter.api.Assertions.assertIterableEquals;
15  import static org.junit.jupiter.api.Assertions.assertThrows;
16  
17  class ShortNameComparatorTest extends UnitTest {
18      // @formatter: off
19      private static final String ABC = "abc";
20      private static final String DEF = "def";
21      private static final String FOO_ATT_ABC = "foo-att-abc";
22      private static final String FOO_ATT_DEF = "foo-att-def";
23      private static final String FOO_ATT_1 = "foo-att-1";
24      private static final String FOO_ATT_2 = "foo-att-2";
25      private static final String FOO_ATT_1_ATT_1 = "foo-att-1-att-1";
26      private static final String FOO_ATT_1_ATT_2 = "foo-att-1-att-2";
27      private static final String FOO_ATT_10 = "foo-att-10";
28      private static final String FOO_ATT_10_ATT_1 = "foo-att-10-att-1";
29      // @formatter: on
30      private static final ShortNameComparator COMPARATOR = new ShortNameComparator();
31  
32      @Test
33      void testParameters() {
34          final ShortNameComparator comparator = new ShortNameComparator();
35          final IBaseDataObject ibdo = new BaseDataObject();
36  
37          assertThrows(IllegalArgumentException.class, () -> comparator.compare(null, ibdo));
38          assertThrows(IllegalArgumentException.class, () -> comparator.compare(ibdo, null));
39      }
40  
41      @Test
42      void testComparator() {
43          check(ABC, DEF, 0);
44          check(FOO_ATT_ABC, FOO_ATT_DEF, -3);
45          check(FOO_ATT_1, FOO_ATT_2, -1);
46          check(FOO_ATT_1, FOO_ATT_10, -9);
47          check(FOO_ATT_1, FOO_ATT_1_ATT_1, -1);
48      }
49  
50      @Test
51      void testListSorting() {
52          // start with an unsorted list
53          List<String> unsorted = List.of(
54                  FOO_ATT_1,
55                  FOO_ATT_10,
56                  FOO_ATT_2,
57                  FOO_ATT_10_ATT_1,
58                  FOO_ATT_1_ATT_2,
59                  FOO_ATT_1_ATT_1);
60  
61          // map to a list of IBDO, sort using Comparator, map back to a list of Strings
62          List<String> actual = unsorted
63                  .stream()
64                  .map(name -> DataObjectFactory.getInstance(new byte[0], name))
65                  .sorted(COMPARATOR)
66                  .map(IBaseDataObject::shortName)
67                  .collect(Collectors.toList());
68  
69          // list with shortnames in expected sort order
70          List<String> expected = List.of(
71                  FOO_ATT_1,
72                  FOO_ATT_1_ATT_1,
73                  FOO_ATT_1_ATT_2,
74                  FOO_ATT_2,
75                  FOO_ATT_10,
76                  FOO_ATT_10_ATT_1);
77  
78          // verify that the sorted output is correct
79          assertIterableEquals(expected, actual, "List wasn't sorted in the expected order");
80      }
81  
82      private static void check(final String name1, final String name2, final int forwardResult) {
83          final IBaseDataObject ibdo1 = new BaseDataObject(null, name1);
84          final IBaseDataObject ibdo2 = new BaseDataObject(null, name2);
85          final ShortNameComparator snc = new ShortNameComparator();
86  
87          assertEquals(forwardResult, snc.compare(ibdo1, ibdo2));
88          assertEquals(-forwardResult, snc.compare(ibdo2, ibdo1));
89      }
90  }