1 package jalview.datamodel.features;
3 import static org.testng.Assert.assertEquals;
4 import static org.testng.Assert.assertTrue;
6 import java.util.ArrayList;
7 import java.util.Collections;
9 import java.util.Random;
11 import org.testng.annotations.Test;
13 public class NCListTest
17 * A basic sanity test of the constructor
19 @Test(groups = "Functional")
20 public void testConstructor()
22 List<Range> ranges = new ArrayList<Range>();
23 ranges.add(new Range(20, 20));
24 ranges.add(new Range(10, 20));
25 ranges.add(new Range(15, 30));
26 ranges.add(new Range(10, 30));
27 ranges.add(new Range(11, 19));
28 ranges.add(new Range(10, 20));
29 ranges.add(new Range(1, 100));
31 NCList<Range> ncl = new NCList<Range>(ranges);
32 String expected = "[1-100 [10-30 [10-20 [10-20 [11-19]]]], 15-30 [20-20]]";
33 assertEquals(ncl.toString(), expected);
34 assertTrue(ncl.isValid());
36 Collections.reverse(ranges);
37 ncl = new NCList<Range>(ranges);
38 assertEquals(ncl.toString(), expected);
39 assertTrue(ncl.isValid());
42 @Test(groups = "Functional")
43 public void testFindOverlaps()
45 List<Range> ranges = new ArrayList<Range>();
46 ranges.add(new Range(20, 50));
47 ranges.add(new Range(30, 70));
48 ranges.add(new Range(1, 100));
49 ranges.add(new Range(70, 120));
51 NCList<Range> ncl = new NCList<Range>(ranges);
53 List<Range> overlaps = ncl.findOverlaps(121, 122);
54 assertEquals(overlaps.size(), 0);
56 overlaps = ncl.findOverlaps(21, 22);
57 assertEquals(overlaps.size(), 2);
58 assertEquals(((ContiguousI) overlaps.get(0)).getBegin(), 1);
59 assertEquals(((ContiguousI) overlaps.get(0)).getEnd(), 100);
60 assertEquals(((ContiguousI) overlaps.get(1)).getBegin(), 20);
61 assertEquals(((ContiguousI) overlaps.get(1)).getEnd(), 50);
63 overlaps = ncl.findOverlaps(110, 110);
64 assertEquals(overlaps.size(), 1);
65 assertEquals(((ContiguousI) overlaps.get(0)).getBegin(), 70);
66 assertEquals(((ContiguousI) overlaps.get(0)).getEnd(), 120);
69 @Test(groups = "Functional")
70 public void testAdd_onTheEnd()
72 List<Range> ranges = new ArrayList<Range>();
73 ranges.add(new Range(20, 50));
74 NCList<Range> ncl = new NCList<Range>(ranges);
75 assertEquals(ncl.toString(), "[20-50]");
76 assertTrue(ncl.isValid());
78 ncl.add(new Range(60, 70));
79 assertEquals(ncl.toString(), "[20-50, 60-70]");
80 assertTrue(ncl.isValid());
83 @Test(groups = "Functional")
84 public void testAdd_inside()
86 List<Range> ranges = new ArrayList<Range>();
87 ranges.add(new Range(20, 50));
88 NCList<Range> ncl = new NCList<Range>(ranges);
89 assertEquals(ncl.toString(), "[20-50]");
90 assertTrue(ncl.isValid());
92 ncl.add(new Range(30, 40));
93 assertEquals(ncl.toString(), "[20-50 [30-40]]");
96 @Test(groups = "Functional")
97 public void testAdd_onTheFront()
99 List<Range> ranges = new ArrayList<Range>();
100 ranges.add(new Range(20, 50));
101 NCList<Range> ncl = new NCList<Range>(ranges);
102 assertEquals(ncl.toString(), "[20-50]");
103 assertTrue(ncl.isValid());
105 ncl.add(new Range(5, 15));
106 assertEquals(ncl.toString(), "[5-15, 20-50]");
107 assertTrue(ncl.isValid());
110 @Test(groups = "Functional")
111 public void testAdd_enclosing()
113 List<Range> ranges = new ArrayList<Range>();
114 ranges.add(new Range(20, 50));
115 ranges.add(new Range(30, 60));
116 NCList<Range> ncl = new NCList<Range>(ranges);
117 assertEquals(ncl.toString(), "[20-50, 30-60]");
118 assertTrue(ncl.isValid());
119 assertEquals(ncl.getStart(), 20);
121 ncl.add(new Range(10, 70));
122 assertEquals(ncl.toString(), "[10-70 [20-50, 30-60]]");
123 assertTrue(ncl.isValid());
126 @Test(groups = "Functional")
127 public void testAdd_spanning()
129 List<Range> ranges = new ArrayList<Range>();
130 ranges.add(new Range(20, 40));
131 ranges.add(new Range(60, 70));
132 NCList<Range> ncl = new NCList<Range>(ranges);
133 assertEquals(ncl.toString(), "[20-40, 60-70]");
134 assertTrue(ncl.isValid());
136 ncl.add(new Range(30, 50));
137 assertEquals(ncl.toString(), "[20-40, 30-50, 60-70]");
138 assertTrue(ncl.isValid());
140 ncl.add(new Range(40, 65));
141 assertEquals(ncl.toString(), "[20-40, 30-50, 40-65, 60-70]");
142 assertTrue(ncl.isValid());
146 * Do a number of pseudo-random (reproducible) builds of an NCList, with
147 * checks for validity of the data structure, for greater (but not perfect!)
148 * confidence that corner cases are being handled correctly.
150 @Test(groups = "Functional")
151 public void testAdd_pseudoRandom()
153 Random r = new Random(108); // well why not?
154 int[] scales = new int[] { 10, 100, 1000 };
156 for (int scale : scales)
158 NCList<Range> ncl = new NCList<Range>();
160 for (int i = 0; i < 100; i++)
162 int r1 = r.nextInt(scale);
163 int r2 = r.nextInt(scale);
164 int nextFrom = Math.min(r1, r2);
165 int nextTo = Math.max(r1, r2);
166 Range range = new Range(nextFrom, nextTo);
168 assertTrue(ncl.isValid(),
169 String.format("Failed for scale = %d, i=%d", scale, i));
171 assertEquals(ncl.getSize(), size);
173 System.out.println(ncl.prettyPrint());
177 @Test(groups = "Functional")
178 public void testGetEntries()
180 List<Range> ranges = new ArrayList<Range>();
181 Range r1 = new Range(20, 20);
182 Range r2 = new Range(10, 20);
183 Range r3 = new Range(15, 30);
184 Range r4 = new Range(10, 30);
185 Range r5 = new Range(11, 19);
186 Range r6 = new Range(10, 20);
194 NCList<Range> ncl = new NCList<Range>(ranges);
195 Range r7 = new Range(1, 100);
198 List<Range> contents = ncl.getEntries();
199 assertEquals(contents.size(), 7);
200 assertTrue(contents.contains(r1));
201 assertTrue(contents.contains(r2));
202 assertTrue(contents.contains(r3));
203 assertTrue(contents.contains(r4));
204 assertTrue(contents.contains(r5));
205 assertTrue(contents.contains(r6));
206 assertTrue(contents.contains(r7));
208 ncl = new NCList<Range>();
209 assertTrue(ncl.getEntries().isEmpty());