From 72e63582d51fbaa0cc5a3963abc96814f984039b Mon Sep 17 00:00:00 2001 From: Mateusz Warowny Date: Wed, 1 Nov 2023 16:15:21 +0100 Subject: [PATCH] JAL-4313 Clamp start and end ranges to array size --- src/jalview/datamodel/AlignmentAnnotation.java | 2 + .../datamodel/AlignmentAnnotationTests.java | 44 ++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/src/jalview/datamodel/AlignmentAnnotation.java b/src/jalview/datamodel/AlignmentAnnotation.java index e832c2f..fdb62a1 100755 --- a/src/jalview/datamodel/AlignmentAnnotation.java +++ b/src/jalview/datamodel/AlignmentAnnotation.java @@ -1625,6 +1625,8 @@ public class AlignmentAnnotation private void removeHiddenAnnotation(int start, int end, HiddenColumns hiddenColumns) { + start = Math.min(Math.max(0, start), annotations.length); + end = Math.min(Math.max(-1, end), annotations.length - 1); // mangle the alignmentAnnotation annotation array ArrayList annels = new ArrayList<>(); Annotation[] els = null; diff --git a/test/jalview/datamodel/AlignmentAnnotationTests.java b/test/jalview/datamodel/AlignmentAnnotationTests.java index 2948f83..74c2b63 100644 --- a/test/jalview/datamodel/AlignmentAnnotationTests.java +++ b/test/jalview/datamodel/AlignmentAnnotationTests.java @@ -626,6 +626,50 @@ public class AlignmentAnnotationTests assertThat(ann.annotations, is(emptyArray())); } + @Test(groups = "Functional") + public void testMakeVisibleAnnotation_HiddenRegionBeyondSize() + { + Annotation[] annots = annotsRange(4); + AlignmentAnnotation ann = new AlignmentAnnotation("label", "desc", annots); + HiddenColumns hc = new HiddenColumns(); + hc.hideColumns(6, 7); + ann.makeVisibleAnnotation(hc); + assertThat(ann.annotations, matchesAnnotations(annots)); + } + + @Test(groups = "Functional") + public void testMakeVisibleAnnotation_HiddenRegionAndTrimEndBeyondSize() + { + Annotation[] annots = annotsRange(4); + AlignmentAnnotation ann = new AlignmentAnnotation("label", "desc", annots); + HiddenColumns hc = new HiddenColumns(); + hc.hideColumns(6, 7); + ann.makeVisibleAnnotation(0, 10, hc); + assertThat(ann.annotations, matchesAnnotations(annots)); + } + + @Test(groups = "Functional") + public void testMakeVisibleAnnotation_HiddenRegionBeforeStart() + { + Annotation[] annots = annotsRange(4); + AlignmentAnnotation ann = new AlignmentAnnotation("label", "desc", annots); + HiddenColumns hc = new HiddenColumns(); + hc.hideColumns(-3, -2); + ann.makeVisibleAnnotation(hc); + assertThat(ann.annotations, matchesAnnotations(annots)); + } + + @Test(groups = "Functional") + public void testMakeVisibleAnnotation_HiddenRegionAndTrimStartBeforeStart() + { + Annotation[] annots = annotsRange(4); + AlignmentAnnotation ann = new AlignmentAnnotation("label", "desc", annots); + HiddenColumns hc = new HiddenColumns(); + hc.hideColumns(-3, -2); + ann.makeVisibleAnnotation(-5, annots.length - 1, hc); + assertThat(ann.annotations, matchesAnnotations(annots)); + } + static Annotation[] annotsRange(int stop) { Annotation[] annotations = new Annotation[stop]; -- 1.7.10.2