6e1c2db41453dca5534e9c4b39c7018c85bf635c
[jalview.git] / test / jalview / datamodel / SequenceGroupTest.java
1 package jalview.datamodel;
2
3 import static org.testng.Assert.assertEquals;
4 import static org.testng.Assert.assertFalse;
5 import static org.testng.Assert.assertNotNull;
6 import static org.testng.Assert.assertNull;
7 import static org.testng.Assert.assertSame;
8 import static org.testng.Assert.assertTrue;
9 import static org.testng.Assert.fail;
10
11 import jalview.schemes.NucleotideColourScheme;
12
13 import junit.extensions.PA;
14
15 import org.testng.annotations.Test;
16
17 public class SequenceGroupTest
18 {
19   @Test(groups={"Functional"})
20   public void testAddSequence()
21   {
22     SequenceGroup sg = new SequenceGroup();
23     assertTrue(sg.getSequences().isEmpty());
24
25     SequenceI seq1 = new Sequence("seq1", "abc");
26     SequenceI seq2 = new Sequence("seq2", "abc");
27     SequenceI seq3 = new Sequence(seq1);
28
29     sg.addSequence(null, false);
30     assertTrue(sg.getSequences().isEmpty());
31     sg.addSequence(seq1, false);
32     assertEquals(sg.getSequences().size(), 1);
33     assertTrue(sg.getSequences().contains(seq1));
34     // adding the same sequence again does nothing
35     sg.addSequence(seq1, false);
36     assertEquals(sg.getSequences().size(), 1);
37     assertTrue(sg.getSequences().contains(seq1));
38     sg.addSequence(seq2, false);
39     sg.addSequence(seq2, false);
40     sg.addSequence(seq3, false);
41     assertEquals(sg.getSequences().size(), 3);
42     assertTrue(sg.getSequences().contains(seq1));
43     assertTrue(sg.getSequences().contains(seq2));
44     assertTrue(sg.getSequences().contains(seq3));
45   }
46
47   @Test(groups={"Functional"})
48   public void testAddOrRemove()
49   {
50     SequenceGroup sg = new SequenceGroup();
51     assertTrue(sg.getSequences().isEmpty());
52   
53     SequenceI seq1 = new Sequence("seq1", "abc");
54     SequenceI seq2 = new Sequence("seq2", "abc");
55     SequenceI seq3 = new Sequence(seq1);
56   
57     sg.addOrRemove(seq1, false);
58     assertEquals(sg.getSequences().size(), 1);
59     sg.addOrRemove(seq2, false);
60     assertEquals(sg.getSequences().size(), 2);
61     sg.addOrRemove(seq3, false);
62     assertEquals(sg.getSequences().size(), 3);
63     assertTrue(sg.getSequences().contains(seq1));
64     assertTrue(sg.getSequences().contains(seq2));
65     assertTrue(sg.getSequences().contains(seq3));
66     sg.addOrRemove(seq1, false);
67     assertEquals(sg.getSequences().size(), 2);
68     assertFalse(sg.getSequences().contains(seq1));
69   }
70
71   @Test(groups={"Functional"})
72   public void testGetColourScheme()
73   {
74     SequenceGroup sg = new SequenceGroup();
75     assertNotNull(sg.getGroupColourScheme());
76     assertNull(sg.getColourScheme());
77
78     sg.setGroupColourScheme(null);
79     assertNull(sg.getColourScheme());
80
81     NucleotideColourScheme scheme = new NucleotideColourScheme();
82     sg.setColourScheme(scheme);
83     assertSame(scheme, sg.getColourScheme());
84   }
85
86   @Test(groups={"Functional"})
87   public void testSetContext()
88   {
89     SequenceGroup sg1 = new SequenceGroup();
90     SequenceGroup sg2 = new SequenceGroup();
91     SequenceGroup sg3 = new SequenceGroup();
92     assertNull(sg1.getContext());
93     sg1.setContext(null);
94     assertNull(sg1.getContext());
95     try
96     {
97       sg1.setContext(sg1); // self-reference :-O
98       fail("Expected exception");
99     } catch (IllegalArgumentException e)
100     {
101       // expected
102       assertNull(sg1.getContext());
103     }
104     sg1.setContext(sg2);
105     assertSame(sg2, sg1.getContext());
106     sg2.setContext(sg3);
107     try
108     {
109       sg3.setContext(sg1); // circular reference :-O
110       fail("Expected exception");
111     } catch (IllegalArgumentException e)
112     {
113       // expected
114       assertNull(sg3.getContext());
115     }
116
117     /*
118      * use PrivilegedAccessor to 'force' a SequenceGroup with
119      * a circular context reference
120      */
121     PA.setValue(sg2, "context", sg2);
122     try
123     {
124       sg3.setContext(sg2); // circular reference in sg2
125       fail("Expected exception");
126     } catch (IllegalArgumentException e)
127     {
128       // expected
129       assertNull(sg3.getContext());
130     }
131   }
132
133   @Test(groups = { "Functional" })
134   public void testContains()
135   {
136     /* 
137      * essentially the same tests as AlignmentI.findGroup 
138      * but from a particular group's perspective
139      */
140
141     SequenceI seq1 = new Sequence("seq1", "ABCDEF---GHI");
142     SequenceI seq2 = new Sequence("seq2", "---JKLMNO---");
143     AlignmentI a = new Alignment(new SequenceI[] { seq1, seq2 });
144     /*
145      * add a group consisting of just "DEF"
146      */
147     SequenceGroup sg1 = new SequenceGroup();
148     sg1.addSequence(seq1, false);
149     sg1.setStartRes(3);
150     sg1.setEndRes(5);
151
152     /*
153      * test sequence membership
154      */
155     assertTrue(sg1.contains(seq1));
156     assertFalse(sg1.contains(seq2));
157
158     /*
159      * test sequence+position
160      */
161
162     assertFalse(sg1.contains(seq1, 2)); // position not in group
163     assertFalse(sg1.contains(seq1, 6)); // position not in group
164     assertFalse(sg1.contains(seq2, 5)); // sequence not in group
165     assertTrue(sg1.contains(seq1, 3)); // yes
166     assertTrue(sg1.contains(seq1, 4));
167     assertTrue(sg1.contains(seq1, 5));
168
169     /*
170      * add a group consisting of 
171      * EF--
172      * KLMN
173      */
174     SequenceGroup sg2 = new SequenceGroup();
175     sg2.addSequence(seq1, false);
176     sg2.addSequence(seq2, false);
177     sg2.setStartRes(4);
178     sg2.setEndRes(7);
179     a.addGroup(sg2);
180
181     /*
182      * if a residue is in more than one group, method returns
183      * the first found (in order groups were added)
184      */
185     assertTrue(sg2.contains(seq1, 4));
186     assertTrue(sg2.contains(seq1, 5));
187
188     /*
189      * seq2 only belongs to the second group
190      */
191     assertTrue(sg2.contains(seq2, 4));
192     assertTrue(sg2.contains(seq2, 5));
193     assertTrue(sg2.contains(seq2, 6));
194     assertTrue(sg2.contains(seq2, 7));
195     assertFalse(sg2.contains(seq2, 3));
196     assertFalse(sg2.contains(seq2, 8));
197     sg2.setEndRes(8);
198     assertTrue(sg2.contains(seq2, 8));
199     sg2.deleteSequence(seq2, false);
200     assertFalse(sg2.contains(seq2));
201
202   }
203 }