d362d35c1d5a2ee1bcb58f3f6db121fcaa2ae28e
[jalview.git] / test / jalview / gui / AlignFrameTest.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.gui;
22
23 import static org.junit.Assert.assertNotEquals;
24 import static org.testng.Assert.assertEquals;
25 import static org.testng.Assert.assertFalse;
26 import static org.testng.Assert.assertNotSame;
27 import static org.testng.Assert.assertSame;
28 import static org.testng.Assert.assertTrue;
29
30 import java.awt.Color;
31 import java.util.Iterator;
32
33 import org.testng.annotations.AfterMethod;
34 import org.testng.annotations.BeforeClass;
35 import org.testng.annotations.BeforeMethod;
36 import org.testng.annotations.Test;
37
38 import jalview.api.FeatureColourI;
39 import jalview.bin.Cache;
40 import jalview.bin.Jalview;
41 import jalview.datamodel.Alignment;
42 import jalview.datamodel.AlignmentI;
43 import jalview.datamodel.HiddenColumns;
44 import jalview.datamodel.Sequence;
45 import jalview.datamodel.SequenceFeature;
46 import jalview.datamodel.SequenceGroup;
47 import jalview.datamodel.SequenceI;
48 import jalview.io.DataSourceType;
49 import jalview.io.FileLoader;
50 import jalview.project.Jalview2xmlTests;
51 import jalview.renderer.ResidueShaderI;
52 import jalview.schemes.BuriedColourScheme;
53 import jalview.schemes.FeatureColour;
54 import jalview.schemes.HelixColourScheme;
55 import jalview.schemes.JalviewColourScheme;
56 import jalview.schemes.StrandColourScheme;
57 import jalview.schemes.TurnColourScheme;
58 import jalview.util.MessageManager;
59
60 public class AlignFrameTest
61 {
62   AlignFrame af;
63
64   @BeforeClass(alwaysRun = true)
65   public static void setUpBeforeClass() throws Exception
66   {
67     setUpJvOptionPane();
68     /*
69      * use read-only test properties file
70      */
71     Cache.loadProperties("test/jalview/io/testProps.jvprops");
72     Jalview.main(new String[] { "-nonews" });
73   }
74
75   @AfterMethod(alwaysRun = true)
76   public void tearDown()
77   {
78     Desktop.instance.closeAll_actionPerformed(null);
79   }
80
81   /**
82    * configure (read-only) properties for test to ensure Consensus is computed for
83    * colour Above PID testing
84    */
85   @BeforeMethod(alwaysRun = true)
86   public void setUp()
87   {
88     Cache.loadProperties("test/jalview/io/testProps.jvprops");
89     Cache.applicationProperties.setProperty("SHOW_IDENTITY",
90             Boolean.TRUE.toString());
91     af = new FileLoader().LoadFileWaitTillLoaded("examples/uniref50.fa",
92             DataSourceType.FILE);
93
94     /*
95      * wait for Consensus thread to complete
96      */
97     do
98     {
99       try
100       {
101         Thread.sleep(50);
102       } catch (InterruptedException x)
103       {
104       }
105     } while (af.getViewport().getCalcManager().isWorking());
106   }
107
108   public static void setUpJvOptionPane()
109   {
110     JvOptionPane.setInteractiveMode(false);
111     JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
112   }
113
114   @Test(groups = "Functional")
115   public void testHideFeatureColumns()
116   {
117     SequenceI seq1 = new Sequence("Seq1", "ABCDEFGHIJ");
118     SequenceI seq2 = new Sequence("Seq2", "ABCDEFGHIJ");
119     seq1.addSequenceFeature(new SequenceFeature("Metal", "", 1, 5, 0f, null));
120     seq2.addSequenceFeature(new SequenceFeature("Metal", "", 6, 10, 10f,
121             null));
122     seq1.addSequenceFeature(new SequenceFeature("Turn", "", 2, 4,
123             Float.NaN, null));
124     seq2.addSequenceFeature(new SequenceFeature("Turn", "", 7, 9,
125             Float.NaN, null));
126     AlignmentI al = new Alignment(new SequenceI[] { seq1, seq2 });
127     AlignFrame alignFrame = new AlignFrame(al, al.getWidth(),
128             al.getHeight());
129
130     /*
131      * make all features visible (select feature columns checks visibility)
132      */
133     alignFrame.getFeatureRenderer().findAllFeatures(true);
134
135     /*
136      * hiding a feature not present does nothing
137      */
138     assertFalse(alignFrame.hideFeatureColumns("exon", true));
139     assertTrue(alignFrame.getViewport().getColumnSelection().isEmpty());
140
141     assertEquals(alignFrame.getViewport().getAlignment().getHiddenColumns()
142             .getNumberOfRegions(), 0);
143
144     assertFalse(alignFrame.hideFeatureColumns("exon", false));
145     assertTrue(alignFrame.getViewport().getColumnSelection().isEmpty());
146
147     assertEquals(alignFrame.getViewport().getAlignment().getHiddenColumns()
148             .getNumberOfRegions(), 0);
149
150     /*
151      * hiding a feature in all columns does nothing
152      */
153     assertFalse(alignFrame.hideFeatureColumns("Metal", true));
154     assertTrue(alignFrame.getViewport().getColumnSelection().isEmpty());
155
156     assertEquals(alignFrame.getViewport().getAlignment().getHiddenColumns()
157             .getNumberOfRegions(), 0);
158
159
160     /*
161      * threshold Metal to hide features where score < 5
162      * seq1 feature in columns 1-5 is hidden
163      * seq2 feature in columns 6-10 is shown
164      */
165     FeatureColourI fc = new FeatureColour(null, Color.red, Color.blue, null,
166             0f, 10f);
167     fc.setAboveThreshold(true);
168     fc.setThreshold(5f);
169     alignFrame.getFeatureRenderer().setColour("Metal", fc);
170     assertTrue(alignFrame.hideFeatureColumns("Metal", true));
171     HiddenColumns hidden = alignFrame.getViewport().getAlignment().getHiddenColumns();
172     assertEquals(hidden.getNumberOfRegions(), 1);
173     Iterator<int[]> regions = hidden.iterator();
174     int[] next = regions.next();
175     assertEquals(next[0], 5);
176     assertEquals(next[1], 9);
177
178     /*
179      * hide a feature present in some columns
180      * sequence positions [2-4], [7-9] are column positions
181      * [1-3], [6-8] base zero
182      */
183     alignFrame.getViewport().showAllHiddenColumns();
184     assertTrue(alignFrame.hideFeatureColumns("Turn", true));
185     regions = alignFrame.getViewport().getAlignment()
186             .getHiddenColumns().iterator();
187     assertEquals(alignFrame.getViewport().getAlignment().getHiddenColumns()
188             .getNumberOfRegions(), 2);
189     next = regions.next();
190     assertEquals(next[0], 1);
191     assertEquals(next[1], 3);
192     next = regions.next();
193     assertEquals(next[0], 6);
194     assertEquals(next[1], 8);
195   }
196
197   /**
198    * Test that changing background (alignment) colour scheme
199    * <ul>
200    * <li>with Apply Colour to All Groups not selected, does not change group
201    * colours</li>
202    * <li>with Apply Colour to All Groups selected, does change group colours</li>
203    * <li>in neither case, changes alignment or group colour thresholds (PID or
204    * Conservation)</li>
205    * </ul>
206    */
207   @Test(groups = "Functional")
208   public void testChangeColour_background_groupsAndThresholds()
209   {
210     AlignViewport av = af.getViewport();
211     AlignmentI al = av.getAlignment();
212
213     /*
214      * Colour alignment by Buried Index
215      */
216     af.applyToAllGroups_actionPerformed(false);
217     af.changeColour_actionPerformed(JalviewColourScheme.Buried.toString());
218     assertTrue(av.getGlobalColourScheme() instanceof BuriedColourScheme);
219     assertFalse(av.getResidueShading().conservationApplied());
220     assertEquals(av.getResidueShading().getThreshold(), 0);
221
222     /*
223      * Apply Conservation 20%
224      */
225     af.conservationMenuItem_actionPerformed(true);
226     SliderPanel sp = SliderPanel.getSliderPanel();
227     assertEquals(sp.getTitle(), MessageManager.formatMessage(
228             "label.conservation_colour_increment",
229             new String[] { "Background" }));
230     assertTrue(sp.isForConservation());
231     sp.valueChanged(20);
232     assertTrue(av.getResidueShading().conservationApplied());
233     assertEquals(av.getResidueShading().getConservationInc(), 20);
234
235     /*
236      * Apply PID threshold 10% (conservation still applies as well)
237      */
238     af.abovePIDThreshold_actionPerformed(true);
239     sp = SliderPanel.getSliderPanel();
240     assertFalse(sp.isForConservation());
241     assertEquals(sp.getTitle(), MessageManager.formatMessage(
242             "label.percentage_identity_threshold",
243             new String[] { "Background" }));
244     sp.valueChanged(10);
245     assertEquals(av.getResidueShading().getThreshold(), 10);
246     assertTrue(av.getResidueShading().conservationApplied());
247     assertEquals(av.getResidueShading().getConservationInc(), 20);
248
249     /*
250      * create a group with Strand colouring, 30% Conservation
251      * and 40% PID threshold
252      */
253     SequenceGroup sg = new SequenceGroup();
254     sg.addSequence(al.getSequenceAt(0), false);
255     sg.setStartRes(15);
256     sg.setEndRes(25);
257     av.setSelectionGroup(sg);
258
259     /*
260      * apply 30% Conservation to group
261      * (notice menu action applies to selection group even if mouse click
262      * is at a sequence not in the group)
263      */
264     PopupMenu popupMenu = new PopupMenu(af.alignPanel, al.getSequenceAt(2),
265             null);
266     popupMenu.changeColour_actionPerformed(JalviewColourScheme.Strand
267             .toString());
268     assertTrue(sg.getColourScheme() instanceof StrandColourScheme);
269     assertEquals(al.getGroups().size(), 1);
270     assertSame(al.getGroups().get(0), sg);
271     popupMenu.conservationMenuItem_actionPerformed(true);
272     sp = SliderPanel.getSliderPanel();
273     assertTrue(sp.isForConservation());
274     assertEquals(sp.getTitle(), MessageManager.formatMessage(
275             "label.conservation_colour_increment",
276             new String[] { sg.getName() }));
277     sp.valueChanged(30);
278     assertTrue(sg.getGroupColourScheme().conservationApplied());
279     assertEquals(sg.getGroupColourScheme().getConservationInc(), 30);
280
281     /*
282      * apply 40% PID threshold to group
283      */
284     popupMenu.abovePIDColour_actionPerformed(true);
285     sp = SliderPanel.getSliderPanel();
286     assertFalse(sp.isForConservation());
287     assertEquals(sp.getTitle(), MessageManager.formatMessage(
288             "label.percentage_identity_threshold",
289             new String[] { sg.getName() }));
290     sp.valueChanged(40);
291     assertEquals(sg.getGroupColourScheme().getThreshold(), 40);
292     // conservation threshold is unchanged:
293     assertTrue(sg.getGroupColourScheme().conservationApplied());
294     assertEquals(sg.getGroupColourScheme().getConservationInc(), 30);
295
296     /*
297      * change alignment colour - group colour, and all thresholds,
298      * should be unaffected
299      */
300     af.changeColour_actionPerformed(JalviewColourScheme.Turn.toString());
301     assertTrue(av.getGlobalColourScheme() instanceof TurnColourScheme);
302     assertTrue(av.getResidueShading().conservationApplied());
303     assertEquals(av.getResidueShading().getConservationInc(), 20);
304     assertEquals(av.getResidueShading().getThreshold(), 10);
305     assertTrue(sg.getColourScheme() instanceof StrandColourScheme);
306     assertTrue(sg.getGroupColourScheme().conservationApplied());
307     assertEquals(sg.getGroupColourScheme().getConservationInc(), 30);
308     assertEquals(sg.getGroupColourScheme().getThreshold(), 40);
309
310     /*
311      * Now change alignment colour with Apply Colour To All Groups
312      * - group colour should change, but not colour thresholds
313      */
314     af.applyToAllGroups_actionPerformed(true);
315     af.changeColour_actionPerformed(JalviewColourScheme.Helix.toString());
316     assertTrue(av.getGlobalColourScheme() instanceof HelixColourScheme);
317     assertTrue(av.getResidueShading().conservationApplied());
318     assertEquals(av.getResidueShading().getConservationInc(), 20);
319     assertEquals(av.getResidueShading().getThreshold(), 10);
320     assertTrue(sg.getColourScheme() instanceof HelixColourScheme);
321     assertTrue(sg.getGroupColourScheme().conservationApplied());
322     assertEquals(sg.getGroupColourScheme().getConservationInc(), 30);
323     assertEquals(sg.getGroupColourScheme().getThreshold(), 40);
324   }
325
326   /**
327    * Test residue colouring with various options
328    * <ol>
329    * <li>no PID or Conservation threshold</li>
330    * <li>colour by Conservation applied</li>
331    * <li>colour by Conservation removed</li>
332    * <li>colour above PID - various values</li>
333    * <li>colour above PID removed</li>
334    * <li>Above PID plus By Conservation combined</li>
335    * <li>remove Above PID to leave just By Conservation</li>
336    * <li>re-add Above PID</li>
337    * <li>remove By Conservation to leave just Above PID</li>
338    * <li>remove Above PID to leave original colours</li>
339    * </ol>
340    */
341   @Test(groups = "Functional")
342   public void testColourThresholdActions()
343   {
344     AlignViewport av = af.getViewport();
345     AlignmentI al = av.getAlignment();
346
347     /*
348      * Colour alignment by Helix Propensity, no thresholds
349      */
350     af.applyToAllGroups_actionPerformed(false);
351     af.changeColour_actionPerformed(JalviewColourScheme.Helix.toString());
352     assertTrue(av.getGlobalColourScheme() instanceof HelixColourScheme);
353     assertFalse(av.getResidueShading().conservationApplied());
354     assertEquals(av.getResidueShading().getThreshold(), 0);
355
356     /*
357      * inspect the colour of 
358      * FER_CAPAN.9(I), column 15 (14 base 0)
359      * FER_CAPAN.10(SER), column 16 (15 base 0)
360      */
361     SequenceI ferCapan = al.findName("FER_CAPAN");
362     ResidueShaderI rs = av.getResidueShading();
363     Color c = rs.findColour('I', 14, ferCapan);
364     Color i_original = new Color(138, 117, 138);
365     assertEquals(c, i_original);
366     c = rs.findColour('S', 15, ferCapan);
367     Color s_original = new Color(54, 201, 54);
368     assertEquals(c, s_original);
369
370     /*
371      * colour by conservation with increment 10
372      */
373     af.conservationMenuItem_actionPerformed(true);
374     SliderPanel sp = SliderPanel.getSliderPanel();
375     assertTrue(sp.isForConservation());
376     assertEquals(sp.getValue(), 30); // initial slider setting
377     c = rs.findColour('I', 14, ferCapan);
378     Color i_faded = new Color(255, 255, 255);
379     assertEquals(c, i_faded);
380     sp.valueChanged(10);
381     assertSame(rs, av.getResidueShading());
382     assertEquals(rs.getConservationInc(), 10);
383     c = rs.findColour('I', 14, ferCapan);
384     i_faded = new Color(196, 186, 196);
385     assertEquals(c, i_faded);
386     c = rs.findColour('S', 15, ferCapan);
387     Color s_faded = new Color(144, 225, 144);
388     assertEquals(c, s_faded);
389
390     /*
391      * deselect By Conservation - colour should revert
392      */
393     af.conservationMenuItem_actionPerformed(false);
394     c = rs.findColour('S', 15, ferCapan);
395     assertEquals(c, s_original);
396
397     /*
398      * now Above PID, threshold = 0%
399      * should be no change
400      */
401     af.abovePIDThreshold_actionPerformed(true);
402     sp = SliderPanel.getSliderPanel();
403     assertFalse(sp.isForConservation());
404     assertEquals(sp.getValue(), 0); // initial slider setting
405     c = rs.findColour('I', 14, ferCapan);
406     assertEquals(c, i_original);
407     c = rs.findColour('S', 15, ferCapan);
408     assertEquals(c, s_original);
409
410     /*
411      * Above PID, threshold = 1%
412      * 15.I becomes White because no match to consensus (V)
413      * 16.S remains coloured as matches 66.66% consensus
414      */
415     sp.valueChanged(1);
416     c = rs.findColour('I', 14, ferCapan);
417     assertEquals(c, Color.white);
418     c = rs.findColour('S', 15, ferCapan);
419     assertEquals(c, s_original);
420
421     /*
422      * threshold 66% - no further change yet...
423      */
424     sp.valueChanged(66);
425     c = rs.findColour('I', 14, ferCapan);
426     assertEquals(c, Color.white);
427     c = rs.findColour('S', 15, ferCapan);
428     assertEquals(c, s_original);
429
430     /*
431      * threshold 67% - now both residues are white
432      */
433     sp.valueChanged(67);
434     c = rs.findColour('I', 14, ferCapan);
435     assertEquals(c, Color.white);
436     c = rs.findColour('S', 15, ferCapan);
437     assertEquals(c, Color.white);
438
439     /*
440      * deselect Above PID - colours should revert
441      */
442     af.abovePIDThreshold_actionPerformed(false);
443     c = rs.findColour('I', 14, ferCapan);
444     assertEquals(c, i_original);
445     c = rs.findColour('S', 15, ferCapan);
446     assertEquals(c, s_original);
447
448     /*
449      * Now combine Above 50% PID and By Conservation 10%
450      * 15.I is White because no match to consensus (V)
451      * 16.S is coloured but faded
452      */
453     af.abovePIDThreshold_actionPerformed(true);
454     sp = SliderPanel.getSliderPanel();
455     assertFalse(sp.isForConservation());
456     sp.valueChanged(50);
457     af.conservationMenuItem_actionPerformed(true);
458     sp = SliderPanel.getSliderPanel();
459     assertTrue(sp.isForConservation());
460     sp.valueChanged(10);
461     c = rs.findColour('I', 14, ferCapan);
462     assertEquals(c, Color.white);
463     c = rs.findColour('S', 15, ferCapan);
464     assertEquals(c, s_faded);
465
466     /*
467      * turn off Above PID - should just leave Conservation fading as before 
468      */
469     af.abovePIDThreshold_actionPerformed(false);
470     c = rs.findColour('I', 14, ferCapan);
471     assertEquals(c, i_faded);
472     c = rs.findColour('S', 15, ferCapan);
473     assertEquals(c, s_faded);
474
475     /*
476      * Now add Above 50% PID to conservation colouring
477      * - should give the same as PID followed by conservation (above)
478      */
479     af.abovePIDThreshold_actionPerformed(true);
480     SliderPanel.getSliderPanel().valueChanged(50);
481     c = rs.findColour('I', 14, ferCapan);
482     assertEquals(c, Color.white);
483     c = rs.findColour('S', 15, ferCapan);
484     assertEquals(c, s_faded);
485
486     /*
487      * turn off By Conservation
488      * should leave I white, S original (unfaded) colour
489      */
490     af.conservationMenuItem_actionPerformed(false);
491     c = rs.findColour('I', 14, ferCapan);
492     assertEquals(c, Color.white);
493     c = rs.findColour('S', 15, ferCapan);
494     assertEquals(c, s_original);
495
496     /*
497      * finally turn off Above PID to leave original colours
498      */
499     af.abovePIDThreshold_actionPerformed(false);
500     c = rs.findColour('I', 14, ferCapan);
501     assertEquals(c, i_original);
502     c = rs.findColour('S', 15, ferCapan);
503     assertEquals(c, s_original);
504   }
505
506   /**
507    * Verify that making a New View transfers alignment and group colour schemes,
508    * including any thresholds, to the new view. Because New View is performed by
509    * saving and reloading a 'project' file, this is similar to verifying a
510    * project save and reload.
511    * 
512    * @see Jalview2xmlTests#testStoreAndRecoverColourThresholds()
513    */
514   @Test(groups = "Functional")
515   public void testNewView_colourThresholds()
516   {
517     AlignViewport av = af.getViewport();
518     AlignmentI al = av.getAlignment();
519
520     /*
521      * Colour alignment by Buried Index, Above 10% PID, By Conservation 20%
522      */
523     af.changeColour_actionPerformed(JalviewColourScheme.Buried.toString());
524     assertTrue(av.getGlobalColourScheme() instanceof BuriedColourScheme);
525     af.abovePIDThreshold_actionPerformed(true);
526     SliderPanel sp = SliderPanel.getSliderPanel();
527     assertFalse(sp.isForConservation());
528     sp.valueChanged(10);
529     af.conservationMenuItem_actionPerformed(true);
530     sp = SliderPanel.getSliderPanel();
531     assertTrue(sp.isForConservation());
532     sp.valueChanged(20);
533     ResidueShaderI rs = av.getResidueShading();
534     assertEquals(rs.getThreshold(), 10);
535     assertTrue(rs.conservationApplied());
536     assertEquals(rs.getConservationInc(), 20);
537
538     /*
539      * create a group with Strand colouring, 30% Conservation
540      * and 40% PID threshold
541      */
542     SequenceGroup sg = new SequenceGroup();
543     sg.addSequence(al.getSequenceAt(0), false);
544     sg.setStartRes(15);
545     sg.setEndRes(25);
546     av.setSelectionGroup(sg);
547     PopupMenu popupMenu = new PopupMenu(af.alignPanel, al.getSequenceAt(0),
548             null);
549     popupMenu.changeColour_actionPerformed(JalviewColourScheme.Strand
550             .toString());
551     assertTrue(sg.getColourScheme() instanceof StrandColourScheme);
552     assertEquals(al.getGroups().size(), 1);
553     assertSame(al.getGroups().get(0), sg);
554     popupMenu.conservationMenuItem_actionPerformed(true);
555     sp = SliderPanel.getSliderPanel();
556     assertTrue(sp.isForConservation());
557     sp.valueChanged(30);
558     popupMenu.abovePIDColour_actionPerformed(true);
559     sp = SliderPanel.getSliderPanel();
560     assertFalse(sp.isForConservation());
561     sp.valueChanged(40);
562     rs = sg.getGroupColourScheme();
563     assertTrue(rs.conservationApplied());
564     assertEquals(rs.getConservationInc(), 30);
565     assertEquals(rs.getThreshold(), 40);
566
567     /*
568      * set slider panel focus to the background alignment
569      */
570     af.conservationMenuItem_actionPerformed(true);
571     sp = SliderPanel.getSliderPanel();
572     assertTrue(sp.isForConservation());
573     assertEquals(sp.getTitle(), MessageManager.formatMessage(
574             "label.conservation_colour_increment",
575             new String[] { "Background" }));
576
577     /*
578      * make a new View, verify alignment and group colour schemes
579      */
580     af.newView_actionPerformed(null);
581     assertEquals(af.alignPanel.getViewName(), "View 1");
582     AlignViewport av2 = af.getViewport();
583     assertNotSame(av, av2);
584     assertSame(av2, af.alignPanel.av);
585     rs = av2.getResidueShading();
586     assertNotSame(av.getResidueShading(), rs);
587     assertEquals(rs.getThreshold(), 10);
588     assertTrue(rs.conservationApplied(), rs.toString());
589     assertEquals(rs.getConservationInc(), 20);
590     assertEquals(av2.getAlignment().getGroups().size(), 1);
591     sg = av2.getAlignment().getGroups().get(0);
592     rs = sg.getGroupColourScheme();
593     assertTrue(rs.conservationApplied());
594     assertEquals(rs.getConservationInc(), 30);
595     assertEquals(rs.getThreshold(), 40);
596
597     /*
598      * check the Conservation SliderPanel (still open) is linked to 
599      * and updates the new view (JAL-2385)
600      */
601     sp = SliderPanel.getSliderPanel();
602     assertTrue(sp.isForConservation());
603     assertEquals(sp.getTitle(), MessageManager.formatMessage(
604             "label.conservation_colour_increment",
605             new String[] { "View 1" }));
606     sp.valueChanged(22);
607     assertEquals(av2.getResidueShading().getConservationInc(), 22);
608   }
609
610   /**
611    * Verify that making a New View preserves the dataset reference for the
612    * alignment. Otherwise, see a 'duplicate jar entry' reference when trying to
613    * save alignments with multiple views, and codon mappings will not be shared
614    * across all panels in a split frame.
615    * 
616    * @see Jalview2xmlTests#testStoreAndRecoverColourThresholds()
617    */
618   @Test(groups = "Functional")
619   public void testNewView_dsRefPreserved()
620   {
621     AlignViewport av = af.getViewport();
622     AlignmentI al = av.getAlignment();
623     AlignmentI original_ds = al.getDataset();
624     af.newView_actionPerformed(null);
625     assertNotEquals("New view didn't select the a new panel", av,
626             af.getViewport());
627     org.testng.Assert.assertEquals(original_ds,
628             af.getViewport().getAlignment().getDataset(),
629             "Dataset was not preserved in new view");
630   }
631 }