/*
* Copyright 2015 MiLaboratory.com
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.milaboratory.core;
import com.milaboratory.core.io.util.IOTestUtil;
import com.milaboratory.test.TestUtil;
import org.junit.Test;
import java.util.Arrays;
import static org.junit.Assert.*;
public class RangeTest {
private Range r(int from, int to) {
return new Range(from, to);
}
@Test
public void testValues() throws Exception {
assertEquals(20, r(20, 10).getUpper());
assertEquals(10, r(20, 10).getLower());
assertEquals(20, r(20, 10).getFrom());
assertEquals(10, r(20, 10).getTo());
assertEquals(20, r(10, 20).getUpper());
assertEquals(10, r(10, 20).getLower());
assertEquals(10, r(10, 20).getFrom());
assertEquals(20, r(10, 20).getTo());
}
@Test
public void testContains() throws Exception {
assertFalse(r(20, 10).contains(20));
assertTrue(r(20, 10).contains(19));
assertFalse(r(20, 10).contains(r(21, 10)));
assertTrue(r(20, 10).contains(r(20, 10)));
assertTrue(r(20, 10).contains(r(19, 11)));
assertFalse(r(20, 10).contains(r(21, 9)));
}
@Test
public void testIntersection1() throws Exception {
assertEquals(r(10, 20).intersection(r(14, 40)), r(14, 20));
assertEquals(r(10, 20).intersection(r(21, 40)), null);
}
@Test
public void testMerge() throws Exception {
assertEquals(r(10, 20).tryMerge(r(14, 40)), r(10, 40));
assertEquals(r(10, 20).tryMerge(r(21, 40)), null);
}
@Test
public void testIntersection2() throws Exception {
assertTrue(r(10, 20).intersectsWith(r(20, 10)));
assertTrue(r(10, 20).intersectsWith(r(19, 11)));
assertTrue(r(19, 11).intersectsWith(r(20, 10)));
}
@Test
public void testCheckConvert1() throws Exception {
checkConvert(r(10, 20), 10);
checkConvert(r(10, 20), 13);
checkConvert(r(20, 10), 19);
checkConvert(r(20, 10), 18);
}
@Test
public void test23e14() throws Exception {
System.out.println(Integer.toBinaryString(((byte) 'A')));
System.out.println(Integer.toBinaryString(((byte) 'T')));
System.out.println(Integer.toBinaryString(((byte) 'G')));
System.out.println(Integer.toBinaryString(((byte) 'C')));
System.out.println();
System.out.println(Integer.toBinaryString(((byte) 'B')));
//System.out.println(Integer.toBinaryString(~(((byte) 'A') | ((byte) 'T') | ((byte) 'G') | ((byte) 'C'))));
}
private void checkConvert(Range range, int position) {
int relativePosition = range.convertPointToRelativePosition(position);
assertEquals(position, range.convertPointToAbsolutePosition(relativePosition));
relativePosition = range.convertBoundaryToRelativePosition(position);
assertEquals(position, range.convertBoundaryToAbsolutePosition(relativePosition));
}
@Test
public void testRelativeRange() throws Exception {
assertEquals(r(20, 40), r(0, 100).getRelativeRangeOf(r(20, 40)));
assertEquals(r(20, 40), r(50, 150).getRelativeRangeOf(r(70, 90)));
assertEquals(r(80, 90), r(100, 0).getRelativeRangeOf(r(20, 10)));
assertEquals(r(90, 80), r(100, 0).getRelativeRangeOf(r(10, 20)));
}
@Test
public void testRelativeRangeBoundaryCases() throws Exception {
assertEquals(r(70, 70), r(30, 100).getRelativeRangeOf(r(100, 100)));
assertEquals(r(0, 0), r(30, 100).getRelativeRangeOf(r(30, 30)));
assertEquals(r(0, 0), r(100, 30).getRelativeRangeOf(r(100, 100)));
assertEquals(r(70, 70), r(100, 30).getRelativeRangeOf(r(30, 30)));
}
@Test
public void test4() throws Exception {
Range se = new Range(3, 5);
IOTestUtil.assertJavaSerialization(se);
}
@Test
public void test5() throws Exception {
Range se = new Range(3, 5);
TestUtil.assertJson(se);
}
@Test
public void testIntersection3() throws Exception {
Range se = new Range(3, 5);
Range s3 = new Range(3, 3);
Range s5 = new Range(5, 5);
assertNotIntersects(se, s3);
assertNotIntersects(se, s5);
assertIntersectsOrTouches(se, s3);
assertIntersectsOrTouches(se, s5);
}
@Test
public void testIntersection4() throws Exception {
Range se = new Range(30, 50);
for (int i = 29; i <= 31; i++)
for (int j = 49; j <= 51; j++) {
assertIntersects(se, new Range(i, j));
assertIntersectsOrTouches(se, new Range(i, j));
}
assertNotIntersects(se, new Range(50, 60));
assertNotIntersects(se, new Range(20, 30));
assertIntersectsOrTouches(se, new Range(50, 60));
assertIntersectsOrTouches(se, new Range(20, 30));
}
@Test
public void testIntersection5() throws Exception {
Range r0 = new Range(30, 30);
Range r1 = new Range(40, 40);
Range r2 = new Range(30, 50);
Range r4 = new Range(29, 29);
assertFalse(r1.intersectsWith(r2));
assertFalse(r2.intersectsWith(r1));
assertTrue(r1.intersectsWithOrTouches(r2));
assertTrue(r2.intersectsWithOrTouches(r1));
assertTrue(r0.intersectsWithOrTouches(r2));
assertTrue(r2.intersectsWithOrTouches(r0));
assertFalse(r4.intersectsWithOrTouches(r2));
assertFalse(r2.intersectsWithOrTouches(r4));
assertNull(r1.intersection(r2));
assertNull(r2.intersection(r1));
}
@Test
public void subtractionTest1() throws Exception {
Range rr = r(100, 200);
assertEquals(Arrays.asList(r(150, 200)), rr.without(r(50, 150)));
assertEquals(Arrays.asList(), rr.without(r(50, 200)));
assertEquals(Arrays.asList(), rr.without(r(50, 250)));
assertEquals(Arrays.asList(r(100, 150)), rr.without(r(150, 250)));
assertEquals(Arrays.asList(r(100, 130), r(150, 200)), rr.without(r(130, 150)));
}
public static void assertIntersects(Range r1, Range r2) {
assertEquals(r1.intersectsWith(r2), r2.intersectsWith(r1));
assertTrue(r1.intersectsWith(r2));
}
public static void assertNotIntersects(Range r1, Range r2) {
assertEquals(r1.intersectsWith(r2), r2.intersectsWith(r1));
assertFalse(r1.intersectsWith(r2));
}
public static void assertIntersectsOrTouches(Range r1, Range r2) {
assertEquals(r1.intersectsWithOrTouches(r2), r2.intersectsWithOrTouches(r1));
assertTrue(r1.intersectsWithOrTouches(r2));
}
public static void assertNotIntersectsOrTouches(Range r1, Range r2) {
assertEquals(r1.intersectsWithOrTouches(r2), r2.intersectsWithOrTouches(r1));
assertFalse(r1.intersectsWithOrTouches(r2));
}
}