JAL-2089 patch broken merge to master for Release 2.10.0b1
[jalview.git] / test / jalview / datamodel / SeqCigarTest.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License 
9  * as published by the Free Software Foundation, either version 3
10  * of the License, or (at your option) any later version.
11  *  
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  */
21 package jalview.datamodel;
22
23 import static org.testng.AssertJUnit.assertEquals;
24 import static org.testng.AssertJUnit.assertFalse;
25
26 import jalview.util.Comparison;
27
28 import org.testng.annotations.Test;
29
30 /**
31  * Unit tests for SeqCigar
32  */
33 public class SeqCigarTest
34 {
35   @Test(groups = { "Functional" })
36   public void testFindPosition()
37   {
38     SequenceI oseq = new Sequence("MySeq", "ASD---ASD---ASD", 37, 45);
39     oseq.createDatasetSequence();
40     SeqCigar cs = new SeqCigar(oseq);
41     assertEquals(oseq.getSequenceAsString(), cs.getSequenceString('-'));
42     for (int c = 0, cLen = oseq.getLength(); c < cLen; c++)
43     {
44       int os_p = oseq.findPosition(c);
45       int cigar_p = cs.findPosition(c);
46       if (Comparison.isGap(oseq.getCharAt(c)))
47       {
48         assertEquals("Expected gap at position " + os_p + " column " + c,
49                 -1, cigar_p);
50       }
51       else
52       {
53         assertEquals("Positions don't match for at column " + c, os_p,
54                 cigar_p);
55       }
56     }
57   }
58
59   /*
60    * refactored 'as is' from main method
61    * 
62    * TODO: split into separate tests
63    */
64   @Test(groups = { "Functional" })
65   public void testSomething() throws Exception
66   {
67     String o_seq = "asdfktryasdtqwrtsaslldddptyipqqwaslchvhttt";
68     Sequence s = new Sequence("MySeq", o_seq, 39, 80);
69     String orig_gapped = "----asdf------ktryas---dtqwrtsasll----dddptyipqqwa----slchvhttt";
70     Sequence s_gapped = new Sequence("MySeq", orig_gapped, 39, 80);
71     String ex_cs_gapped = "4I4M6I6M3I11M4I12M4I9M";
72     s_gapped.setDatasetSequence(s);
73     String sub_gapped_s = "------ktryas---dtqwrtsasll----dddptyipqqwa----slchvh";
74     Sequence s_subsequence_gapped = new Sequence("MySeq", sub_gapped_s, 43,
75             77);
76     s_subsequence_gapped.setDatasetSequence(s);
77
78     SeqCigar c_null = new SeqCigar(s);
79     String cs_null = c_null.getCigarstring();
80     assertEquals("Failed to recover ungapped sequence cigar operations",
81             "42M", cs_null);
82     testCigar_string(s_gapped, ex_cs_gapped);
83     SeqCigar gen_sgapped = SeqCigar.parseCigar(s, ex_cs_gapped);
84     assertEquals("Failed parseCigar", ex_cs_gapped,
85             gen_sgapped.getCigarstring());
86
87     testSeqRecovery(gen_sgapped, s_gapped);
88
89     /*
90      * Test dataset resolution
91      */
92     SeqCigar sub_gapped = new SeqCigar(s_subsequence_gapped);
93     testSeqRecovery(sub_gapped, s_subsequence_gapped);
94
95     /*
96      * Test width functions
97      */
98     assertEquals("Failed getWidth", sub_gapped_s.length(),
99             sub_gapped.getWidth());
100
101     sub_gapped.getFullWidth();
102     assertFalse("hasDeletedRegions is incorrect",
103             sub_gapped.hasDeletedRegions());
104
105     // Test start-end region SeqCigar
106     SeqCigar sub_se_gp = new SeqCigar(s_subsequence_gapped, 8, 48);
107     assertEquals(
108             "SeqCigar(seq, start, end) not properly clipped alignsequence",
109             41, sub_se_gp.getWidth());
110
111     /*
112      * TODO: can we add assertions to the sysouts that follow?
113      */
114     System.out.println("Original sequence align:\n" + sub_gapped_s
115             + "\nReconstructed window from 8 to 48\n" + "XXXXXXXX"
116             + sub_se_gp.getSequenceString('-') + "..." + "\nCigar String:"
117             + sub_se_gp.getCigarstring() + "\n");
118     SequenceI ssgp = sub_se_gp.getSeq('-');
119     System.out.println("\t " + ssgp.getSequenceAsString());
120     for (int r = 0; r < 10; r++)
121     {
122       sub_se_gp = new SeqCigar(s_subsequence_gapped, 8, 48);
123       int sl = sub_se_gp.getWidth();
124       int st = sl - 1 - r;
125       for (int rs = 0; rs < 10; rs++)
126       {
127         int e = st + rs;
128         sub_se_gp.deleteRange(st, e);
129         String ssgapedseq = sub_se_gp.getSeq('-').getSequenceAsString();
130         System.out.println(st + "," + e + "\t:" + ssgapedseq);
131         st -= 3;
132       }
133     }
134
135     SeqCigar[] set = new SeqCigar[] { new SeqCigar(s),
136         new SeqCigar(s_subsequence_gapped, 8, 48), new SeqCigar(s_gapped) };
137     Alignment al = new Alignment(set);
138     for (int i = 0; i < al.getHeight(); i++)
139     {
140       System.out.println("" + al.getSequenceAt(i).getName() + "\t"
141               + al.getSequenceAt(i).getStart() + "\t"
142               + al.getSequenceAt(i).getEnd() + "\t"
143               + al.getSequenceAt(i).getSequenceAsString());
144     }
145
146     System.out.println("Gapped.");
147     set = new SeqCigar[] { new SeqCigar(s),
148         new SeqCigar(s_subsequence_gapped, 8, 48), new SeqCigar(s_gapped) };
149     set[0].deleteRange(20, 25);
150     al = new Alignment(set);
151     for (int i = 0; i < al.getHeight(); i++)
152     {
153       System.out.println("" + al.getSequenceAt(i).getName() + "\t"
154               + al.getSequenceAt(i).getStart() + "\t"
155               + al.getSequenceAt(i).getEnd() + "\t"
156               + al.getSequenceAt(i).getSequenceAsString());
157     }
158
159     // if (!ssgapedseq.equals("ryas---dtqqwa----slchvh"))
160     // System.err.println("Subseqgaped\n------ktryas---dtqwrtsasll----dddptyipqqwa----slchvhryas---dtqwrtsasll--qwa----slchvh\n"+ssgapedseq+"\n"+sub_se_gp.getCigarstring());
161   }
162
163   /**
164    * non rigorous testing
165    * 
166    * @param seq
167    *          Sequence
168    * @param ex_cs_gapped
169    *          String
170    * @return String
171    */
172
173   protected void testCigar_string(Sequence seq, String ex_cs_gapped)
174   {
175     SeqCigar c_sgapped = new SeqCigar(seq);
176     String cs_gapped = c_sgapped.getCigarstring();
177     assertEquals("Failed getCigarstring", ex_cs_gapped, cs_gapped);
178   }
179
180   protected void testSeqRecovery(SeqCigar gen_sgapped, SequenceI s_gapped)
181   {
182     // this is non-rigorous - start and end recovery is not tested.
183     SequenceI gen_sgapped_s = gen_sgapped.getSeq('-');
184     // assertEquals("Couldn't reconstruct sequence", s_gapped.getSequence(),
185     // gen_sgapped_s);
186     if (!gen_sgapped_s.getSequence().equals(s_gapped.getSequence()))
187     {
188       // TODO: investigate errors reported here, to allow full conversion to
189       // passing JUnit assertion form
190       System.err.println("Couldn't reconstruct sequence.\n"
191               + gen_sgapped_s.getSequenceAsString() + "\n"
192               + s_gapped.getSequenceAsString());
193     }
194   }
195
196 }