JAL-1705 JAL-1686 stronger SequenceFeature.equals() test
[jalview.git] / test / jalview / datamodel / SequenceFeatureTest.java
1 package jalview.datamodel;
2
3 import static org.testng.AssertJUnit.assertEquals;
4 import static org.testng.AssertJUnit.assertFalse;
5 import static org.testng.AssertJUnit.assertNull;
6 import static org.testng.AssertJUnit.assertSame;
7 import static org.testng.AssertJUnit.assertTrue;
8
9 import org.testng.annotations.Test;
10
11 public class SequenceFeatureTest
12 {
13   @Test(groups = { "Functional" })
14   public void testCopyConstructor()
15   {
16     SequenceFeature sf1 = new SequenceFeature("type", "desc", 22, 33,
17             12.5f, "group");
18     sf1.setValue("STRAND", "+");
19     sf1.setValue("Note", "Testing");
20     Integer count = new Integer(7);
21     sf1.setValue("Count", count);
22
23     SequenceFeature sf2 = new SequenceFeature(sf1);
24     assertEquals("type", sf2.getType());
25     assertEquals("desc", sf2.getDescription());
26     assertEquals(22, sf2.getBegin());
27     assertEquals(33, sf2.getEnd());
28     assertEquals("+", sf2.getValue("STRAND"));
29     assertEquals("Testing", sf2.getValue("Note"));
30     // shallow clone of otherDetails map - contains the same object values!
31     assertSame(count, sf2.getValue("Count"));
32   }
33
34   /**
35    * Tests for retrieving a 'miscellaneous details' property value, with or
36    * without a supplied default
37    */
38   @Test(groups = { "Functional" })
39   public void testGetValue()
40   {
41     SequenceFeature sf1 = new SequenceFeature("type", "desc", 22, 33,
42             12.5f, "group");
43     sf1.setValue("STRAND", "+");
44     assertEquals("+", sf1.getValue("STRAND"));
45     assertNull(sf1.getValue("strand")); // case-sensitive
46     assertEquals(".", sf1.getValue("unknown", "."));
47     Integer i = new Integer(27);
48     assertSame(i, sf1.getValue("Unknown", i));
49   }
50
51   /**
52    * Tests the method that returns 1 / -1 / 0 for strand "+" / "-" / other
53    */
54   @Test(groups = { "Functional" })
55   public void testGetStrand()
56   {
57     SequenceFeature sf = new SequenceFeature("type", "desc", 22, 33, 12.5f,
58             "group");
59     assertEquals(0, sf.getStrand());
60     sf.setValue("STRAND", "+");
61     assertEquals(1, sf.getStrand());
62     sf.setValue("STRAND", "-");
63     assertEquals(-1, sf.getStrand());
64     sf.setValue("STRAND", ".");
65     assertEquals(0, sf.getStrand());
66   }
67
68   /**
69    * Tests for equality, and that equal objects have the same hashCode
70    */
71   @Test(groups = { "Functional" })
72   public void testEqualsAndHashCode()
73   {
74     SequenceFeature sf1 = new SequenceFeature("type", "desc", 22, 33,
75             12.5f, "group");
76     sf1.setValue("ID", "id");
77     sf1.setValue("Name", "name");
78     sf1.setValue("Parent", "parent");
79     sf1.setStrand("+");
80     sf1.setPhase("1");
81     SequenceFeature sf2 = new SequenceFeature("type", "desc", 22, 33,
82             12.5f, "group");
83     sf2.setValue("ID", "id");
84     sf2.setValue("Name", "name");
85     sf2.setValue("Parent", "parent");
86     sf2.setStrand("+");
87     sf2.setPhase("1");
88
89     assertFalse(sf1.equals(null));
90     assertTrue(sf1.equals(sf2));
91     assertTrue(sf2.equals(sf1));
92     assertEquals(sf1.hashCode(), sf2.hashCode());
93
94     // changing type breaks equals:
95     sf2.setType("Type");
96     assertFalse(sf1.equals(sf2));
97
98     // changing description breaks equals:
99     sf2.setType("type");
100     sf2.setDescription("Desc");
101     assertFalse(sf1.equals(sf2));
102
103     // changing start position breaks equals:
104     sf2.setDescription("desc");
105     sf2.setBegin(21);
106     assertFalse(sf1.equals(sf2));
107
108     // changing end position breaks equals:
109     sf2.setBegin(22);
110     sf2.setEnd(32);
111     assertFalse(sf1.equals(sf2));
112
113     // changing feature group breaks equals:
114     sf2.setEnd(33);
115     sf2.setFeatureGroup("Group");
116     assertFalse(sf1.equals(sf2));
117
118     // changing ID breaks equals:
119     sf2.setFeatureGroup("group");
120     sf2.setValue("ID", "id2");
121     assertFalse(sf1.equals(sf2));
122
123     // changing Name breaks equals:
124     sf2.setValue("ID", "id");
125     sf2.setValue("Name", "Name");
126     assertFalse(sf1.equals(sf2));
127
128     // changing Parent breaks equals:
129     sf2.setValue("Name", "name");
130     sf1.setValue("Parent", "Parent");
131     assertFalse(sf1.equals(sf2));
132
133     // changing strand breaks equals:
134     sf1.setValue("Parent", "parent");
135     sf2.setStrand("-");
136     assertFalse(sf1.equals(sf2));
137
138     // changing phase breaks equals:
139     sf2.setStrand("+");
140     sf1.setPhase("2");
141     assertFalse(sf1.equals(sf2));
142
143     // restore equality as sanity check:
144     sf1.setPhase("1");
145     assertTrue(sf1.equals(sf2));
146     assertTrue(sf2.equals(sf1));
147     assertEquals(sf1.hashCode(), sf2.hashCode());
148
149     // changing status doesn't change equals:
150     sf1.setStatus("new");
151     assertTrue(sf1.equals(sf2));
152   }
153 }