Merge branch 'bug/JAL-2541cutWithFeatures' into features/JAL-2446NCList
[jalview.git] / test / jalview / datamodel / features / NCNodeTest.java
1 package jalview.datamodel.features;
2
3 import static org.testng.Assert.assertEquals;
4 import static org.testng.Assert.assertFalse;
5 import static org.testng.Assert.assertTrue;
6
7 import jalview.datamodel.SequenceFeature;
8
9 import java.util.ArrayList;
10 import java.util.List;
11
12 import junit.extensions.PA;
13
14 import org.testng.annotations.Test;
15
16 public class NCNodeTest
17 {
18   @Test(groups = "Functional")
19   public void testAdd()
20   {
21     Range r1 = new Range(10, 20);
22     NCNode<Range> node = new NCNode<Range>(r1);
23     assertEquals(node.getBegin(), 10);
24     Range r2 = new Range(10, 15);
25     node.add(r2);
26
27     List<Range> contents = new ArrayList<Range>();
28     node.getEntries(contents);
29     assertEquals(contents.size(), 2);
30     assertTrue(contents.contains(r1));
31     assertTrue(contents.contains(r2));
32   }
33
34   @Test(
35     groups = "Functional",
36     expectedExceptions = { IllegalArgumentException.class })
37   public void testAdd_invalidRangeStart()
38   {
39     Range r1 = new Range(10, 20);
40     NCNode<Range> node = new NCNode<Range>(r1);
41     assertEquals(node.getBegin(), 10);
42     Range r2 = new Range(9, 15);
43     node.add(r2);
44   }
45
46   @Test(
47     groups = "Functional",
48     expectedExceptions = { IllegalArgumentException.class })
49   public void testAdd_invalidRangeEnd()
50   {
51     Range r1 = new Range(10, 20);
52     NCNode<Range> node = new NCNode<Range>(r1);
53     assertEquals(node.getBegin(), 10);
54     Range r2 = new Range(12, 21);
55     node.add(r2);
56   }
57
58   @Test(groups = "Functional")
59   public void testGetEntries()
60   {
61     Range r1 = new Range(10, 20);
62     NCNode<Range> node = new NCNode<Range>(r1);
63     List<Range> entries = new ArrayList<Range>();
64
65     node.getEntries(entries);
66     assertEquals(entries.size(), 1);
67     assertTrue(entries.contains(r1));
68
69     // clearing the returned list does not affect the NCNode
70     entries.clear();
71     node.getEntries(entries);
72     assertEquals(entries.size(), 1);
73     assertTrue(entries.contains(r1));
74
75     Range r2 = new Range(15, 18);
76     node.add(r2);
77     entries.clear();
78     node.getEntries(entries);
79     assertEquals(entries.size(), 2);
80     assertTrue(entries.contains(r1));
81     assertTrue(entries.contains(r2));
82   }
83
84   /**
85    * Tests for the contains method (uses entry.equals() test)
86    */
87   @Test(groups = "Functional")
88   public void testContains()
89   {
90     SequenceFeature sf1 = new SequenceFeature("type", "desc", 1, 10, 2f,
91             "group");
92     SequenceFeature sf2 = new SequenceFeature("type", "desc", 1, 10, 2f,
93             "group");
94     SequenceFeature sf3 = new SequenceFeature("type", "desc", 1, 10, 2f,
95             "anothergroup");
96     NCNode<SequenceFeature> node = new NCNode<SequenceFeature>(sf1);
97
98     assertFalse(node.contains(null));
99     assertTrue(node.contains(sf1));
100     assertTrue(node.contains(sf2)); // sf1.equals(sf2)
101     assertFalse(node.contains(sf3)); // !sf1.equals(sf3)
102   }
103
104   /**
105    * Test method that checks for valid structure. Valid means that all
106    * subregions (if any) lie within the root range, and that all subregions have
107    * valid structure.
108    */
109   @Test(groups = "Functional")
110   public void testIsValid()
111   {
112     Range r1 = new Range(10, 20);
113     Range r2 = new Range(14, 15);
114     Range r3 = new Range(16, 17);
115     NCNode<Range> node = new NCNode<Range>(r1);
116     node.add(r2);
117     node.add(r3);
118
119     /*
120      * node has root range [10-20] and contains an
121      * NCList of [14-15, 16-17]
122      */
123     assertTrue(node.isValid());
124     PA.setValue(r1, "start", 15);
125     assertFalse(node.isValid()); // r2 not within r1
126     PA.setValue(r1, "start", 10);
127     assertTrue(node.isValid());
128     PA.setValue(r1, "end", 16);
129     assertFalse(node.isValid()); // r3 not within r1
130     PA.setValue(r1, "end", 20);
131     assertTrue(node.isValid());
132     PA.setValue(r3, "start", 12);
133     assertFalse(node.isValid()); // r3 should precede r2
134   }
135 }