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
15 class Range implements ContiguousI
40 public String toString() {
41 return String.valueOf(start) + "-" + String.valueOf(end);
46 * A basic sanity test of the constructor
48 @Test(groups = "Functional")
49 public void testConstructor()
51 List<Range> ranges = new ArrayList<Range>();
52 ranges.add(new Range(20, 20));
53 ranges.add(new Range(10, 20));
54 ranges.add(new Range(15, 30));
55 ranges.add(new Range(10, 30));
56 ranges.add(new Range(11, 19));
57 ranges.add(new Range(10, 20));
58 ranges.add(new Range(1, 100));
60 NCList<Range> ncl = new NCList<Range>(ranges);
61 String expected = "[1-100 [10-30 [10-20 [10-20 [11-19]]]], 15-30 [20-20]]";
62 assertEquals(ncl.toString(), expected);
63 assertTrue(ncl.isValid());
65 Collections.reverse(ranges);
66 ncl = new NCList<Range>(ranges);
67 assertEquals(ncl.toString(), expected);
68 assertTrue(ncl.isValid());
71 @Test(groups = "Functional")
72 public void testFindOverlaps()
74 List<Range> ranges = new ArrayList<Range>();
75 ranges.add(new Range(20, 50));
76 ranges.add(new Range(30, 70));
77 ranges.add(new Range(1, 100));
78 ranges.add(new Range(70, 120));
80 NCList<Range> ncl = new NCList<Range>(ranges);
82 List<Range> overlaps = ncl.findOverlaps(121, 122);
83 assertEquals(overlaps.size(), 0);
85 overlaps = ncl.findOverlaps(21, 22);
86 assertEquals(overlaps.size(), 2);
87 assertEquals(((ContiguousI) overlaps.get(0)).getBegin(), 1);
88 assertEquals(((ContiguousI) overlaps.get(0)).getEnd(), 100);
89 assertEquals(((ContiguousI) overlaps.get(1)).getBegin(), 20);
90 assertEquals(((ContiguousI) overlaps.get(1)).getEnd(), 50);
92 overlaps = ncl.findOverlaps(110, 110);
93 assertEquals(overlaps.size(), 1);
94 assertEquals(((ContiguousI) overlaps.get(0)).getBegin(), 70);
95 assertEquals(((ContiguousI) overlaps.get(0)).getEnd(), 120);
98 @Test(groups = "Functional")
99 public void testAdd_onTheEnd()
101 List<Range> ranges = new ArrayList<Range>();
102 ranges.add(new Range(20, 50));
103 NCList<Range> ncl = new NCList<Range>(ranges);
104 assertEquals(ncl.toString(), "[20-50]");
105 assertTrue(ncl.isValid());
107 ncl.add(new Range(60, 70));
108 assertEquals(ncl.toString(), "[20-50, 60-70]");
109 assertTrue(ncl.isValid());
112 @Test(groups = "Functional")
113 public void testAdd_inside()
115 List<Range> ranges = new ArrayList<Range>();
116 ranges.add(new Range(20, 50));
117 NCList<Range> ncl = new NCList<Range>(ranges);
118 assertEquals(ncl.toString(), "[20-50]");
119 assertTrue(ncl.isValid());
121 ncl.add(new Range(30, 40));
122 assertEquals(ncl.toString(), "[20-50 [30-40]]");
125 @Test(groups = "Functional")
126 public void testAdd_onTheFront()
128 List<Range> ranges = new ArrayList<Range>();
129 ranges.add(new Range(20, 50));
130 NCList<Range> ncl = new NCList<Range>(ranges);
131 assertEquals(ncl.toString(), "[20-50]");
132 assertTrue(ncl.isValid());
134 ncl.add(new Range(5, 15));
135 assertEquals(ncl.toString(), "[5-15, 20-50]");
136 assertTrue(ncl.isValid());
139 @Test(groups = "Functional")
140 public void testAdd_enclosing()
142 List<Range> ranges = new ArrayList<Range>();
143 ranges.add(new Range(20, 50));
144 ranges.add(new Range(30, 60));
145 NCList<Range> ncl = new NCList<Range>(ranges);
146 assertEquals(ncl.toString(), "[20-50, 30-60]");
147 assertTrue(ncl.isValid());
148 assertEquals(ncl.getStart(), 20);
150 ncl.add(new Range(10, 70));
151 assertEquals(ncl.toString(), "[10-70 [20-50, 30-60]]");
152 assertTrue(ncl.isValid());
155 @Test(groups = "Functional")
156 public void testAdd_spanning()
158 List<Range> ranges = new ArrayList<Range>();
159 ranges.add(new Range(20, 40));
160 ranges.add(new Range(60, 70));
161 NCList<Range> ncl = new NCList<Range>(ranges);
162 assertEquals(ncl.toString(), "[20-40, 60-70]");
163 assertTrue(ncl.isValid());
165 ncl.add(new Range(30, 50));
166 assertEquals(ncl.toString(), "[20-40, 30-50, 60-70]");
167 assertTrue(ncl.isValid());
169 ncl.add(new Range(40, 65));
170 assertEquals(ncl.toString(), "[20-40, 30-50, 40-65, 60-70]");
171 assertTrue(ncl.isValid());
175 * Do a number of pseudo-random (reproducible) builds of an NCList, with
176 * checks for validity of the data structure, for greater (but not perfect!)
177 * confidence that corner cases are being handled correctly.
179 @Test(groups = "Functional")
180 public void testAdd_pseudoRandom()
182 Random r = new Random(108); // well why not?
183 int[] scales = new int[] { 10, 100, 1000 };
185 for (int scale : scales)
187 NCList<Range> ncl = new NCList<Range>();
189 for (int i = 0; i < 100; i++)
191 int r1 = r.nextInt(scale);
192 int r2 = r.nextInt(scale);
193 int nextFrom = Math.min(r1, r2);
194 int nextTo = Math.max(r1, r2);
195 Range range = new Range(nextFrom, nextTo);
197 assertTrue(ncl.isValid(),
198 String.format("Failed for scale = %d, i=%d", scale, i));
200 assertEquals(ncl.getSize(), size);
202 System.out.println(ncl.prettyPrint());