/**
* Copyright 2012 Tobias Gierke <tobias.gierke@code-sourcery.de>
*
* 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 de.codesourcery.jasm16.utils;
import junit.framework.TestCase;
public class TextRegionTest extends TestCase
{
public void testInvalidOffsetIsDetected() {
try {
new TextRegion( -1 , 25 );
fail("Should've failed");
} catch(IllegalArgumentException e) {
// ok
}
}
public void testInvalidLengthIsDetected() {
try {
new TextRegion( 0 , -3 );
fail("Should've failed");
} catch(IllegalArgumentException e) {
// ok
}
}
public void testGetters() {
TextRegion range = new TextRegion( 1 , 2 );
assertEquals( 1 , range.getStartingOffset() );
assertEquals( 2 , range.getLength() );
assertEquals( 3 , range.getEndOffset() );
}
public void testIsSame() {
TextRegion range1 = new TextRegion( 1 , 2 );
TextRegion range2 = new TextRegion( 1 , 2 );
TextRegion range3 = new TextRegion( 1 , 3 );
TextRegion range4 = new TextRegion( 2 , 2 );
assertTrue( range1.isSame( range2 ) );
assertTrue( range2.isSame( range1 ) );
assertFalse( range1.isSame( range3 ) );
assertFalse( range1.isSame( range4 ) );
}
public void testContainsOffset()
{
TextRegion range1 = new TextRegion( 5 , 1 );
assertFalse( range1.contains( 4 ) );
assertTrue( range1.contains( 5 ) );
assertFalse( range1.contains( 6 ) );
}
public void testContainsRange()
{
TextRegion range1 = new TextRegion( 5 , 4 ); // [5,9[
TextRegion range2 = new TextRegion( 5 , 4 );
TextRegion range3 = new TextRegion( 4 , 2 );
TextRegion range4 = new TextRegion( 9 , 2 );
TextRegion range5 = new TextRegion( 10 , 2 );
TextRegion range6 = new TextRegion( 5 , 2 );
TextRegion range7 = new TextRegion( 6 , 2 );
assertTrue( range1.contains( range2 ) );
assertFalse( range1.contains( range3 ) );
assertFalse( range1.contains( range4 ) );
assertFalse( range1.contains( range5 ) );
assertTrue( range1.contains( range6 ) );
assertTrue( range1.contains( range7 ) );
}
public void testMergeRange()
{
TextRegion range1 = new TextRegion( 5 , 4 ); // [5,9[
TextRegion range2 = new TextRegion( 5 , 4 ); // [5,9[
TextRegion range3 = new TextRegion( 4 , 2 ); // [4,6[
TextRegion range4 = new TextRegion( 9 , 2 ); // [9,11[
TextRegion range5 = new TextRegion( 10 , 2 ); // [10,12[
TextRegion range6 = new TextRegion( 5 , 2 ); // [5,7[
TextRegion range7 = new TextRegion( 6 , 2 ); // [6,8[
assertEquals( range1 , merge( range1 , range2 ) );
assertEquals( range1 , merge( range2 , range1 ) );
assertEquals( new TextRegion( 4 , 5 ) , merge( range1 , range3 ) );
assertEquals( new TextRegion( 5 , 5 ) , merge( range1 , range4 ) );
assertEquals( new TextRegion( 5 , 7 ) , merge( range1 , range5 ) );
assertEquals( range1 , merge( range1 , range6 ) );
assertEquals( new TextRegion( 5 , 4 ) , merge( range1 , range7 ) );
}
private ITextRegion merge(ITextRegion r1,ITextRegion r2) {
ITextRegion result = new TextRegion( r1 );
result.merge( r2 );
return result;
}
public void testSubtract()
{
TextRegion range1 = new TextRegion( 5 , 4 ); // [5,9[
TextRegion range2 = new TextRegion( 5 , 4 ); // [5,9[
TextRegion range3 = new TextRegion( 4 , 2 ); // [4,6[
TextRegion range4 = new TextRegion( 9 , 2 ); // [9,11[
TextRegion range5 = new TextRegion( 10 , 2 ); // [10,12[
TextRegion range6 = new TextRegion( 5 , 2 ); // [5,7[
TextRegion range7 = new TextRegion( 6 , 2 ); // [6,8[
assertEquals( new TextRegion(5,0) , subtract( range1 , range2 ) );
assertEquals( new TextRegion(5,0) , subtract( range2 , range1 ) );
assertEquals( new TextRegion( 6 , 4 ) , subtract( range1 , range3 ) );
assertEquals( new TextRegion( 5 , 4 ) , subtract( range1 , range4 ) );
assertEquals( new TextRegion( 5 , 4 ) , subtract( range1 , range5 ) );
assertEquals( new TextRegion( 7 , 2 ) , subtract( range1 , range6 ) );
assertSubtractingFails( range1 , range7 , UnsupportedOperationException.class );
}
private ITextRegion subtract(ITextRegion r1,ITextRegion r2) {
ITextRegion result = new TextRegion( r1 );
result.subtract( r2 );
return result;
}
public void testIntersect()
{
TextRegion range1 = new TextRegion( 5 , 4 ); // [5,9[
TextRegion range2 = new TextRegion( 5 , 4 ); // [5,9[
TextRegion range3 = new TextRegion( 4 , 2 ); // [4,6[
TextRegion range4 = new TextRegion( 9 , 2 ); // [9,11[
TextRegion range5 = new TextRegion( 10 , 2 ); // [10,12[
TextRegion range6 = new TextRegion( 5 , 2 ); // [5,7[
TextRegion range7 = new TextRegion( 6 , 2 ); // [6,8[
assertEquals( new TextRegion(5,4) , intersect( range1 , range2 ) );
assertEquals( new TextRegion( 5,4 ) , intersect( range2 , range1 ) );
assertEquals( new TextRegion( 5 , 1 ) , intersect( range1 , range3 ) );
assertEquals( new TextRegion( 5 , 1 ) , intersect( range3 , range1 ) );
assertIntersectingFails( range1 , range4 ,IllegalArgumentException.class );
assertIntersectingFails( range4 , range1 ,IllegalArgumentException.class );
assertIntersectingFails( range1 , range5 , IllegalArgumentException.class );
assertIntersectingFails( range5 , range1 , IllegalArgumentException.class );
assertEquals( new TextRegion( 5 , 2 ) , intersect( range1 , range6 ) );
assertEquals( new TextRegion( 5 , 2 ) , intersect( range6 , range1 ) );
assertEquals( new TextRegion( 6 , 2 ) , intersect( range1 , range7 ) );
assertEquals( new TextRegion( 6 , 2 ) , intersect( range7 , range1 ) );
}
private ITextRegion intersect(ITextRegion r1,ITextRegion r2) {
ITextRegion result = new TextRegion( r1 );
result.intersect( r2 );
return result;
}
private void assertSubtractingFails(ITextRegion r1,ITextRegion r2,Class<? extends Exception> expected) {
try {
new TextRegion(r1).subtract( r2 );
fail("Should've failed");
} catch(Exception t) {
assertEquals( expected , t.getClass() );
}
}
private void assertIntersectingFails(ITextRegion r1,ITextRegion r2,Class<? extends Exception> expected) {
try {
TextRegion range = new TextRegion(r1);
range.intersect( r2 );
fail("intersecting "+r1+" with "+r2+" should've failed but yielded "+range);
} catch(Exception t) {
assertEquals( expected , t.getClass() );
}
}
public void testOverlaps()
{
TextRegion range1 = new TextRegion( 5 , 4 ); // [5,9[
TextRegion range2 = new TextRegion( 5 , 4 );
TextRegion range3 = new TextRegion( 4 , 2 ); // [4,6[
TextRegion range4 = new TextRegion( 9 , 2 );
TextRegion range5 = new TextRegion( 10 , 2 );
TextRegion range6 = new TextRegion( 5 , 2 );
TextRegion range7 = new TextRegion( 6 , 2 );
assertTrue( range1.overlaps( range2 ) );
assertTrue( range1.overlaps( range3 ) );
assertFalse( range1.overlaps( range4 ) );
assertFalse( range1.overlaps( range5 ) );
assertTrue( range1.overlaps( range6 ) );
assertTrue( range1.overlaps( range7 ) );
TextRegion range8 = new TextRegion( 75 , 113-75 ); // [5,9[
TextRegion range9 = new TextRegion( 0 , 638 ); // [5,9[
assertTrue( range8.overlaps( range9 ) );
assertTrue( range9.overlaps( range8 ) );
}
private boolean assertEquals(ITextRegion r1,ITextRegion r2) {
return r1.isSame( r2 );
}
public void testApply() {
final String string = "0123456789";
assertEquals( "12345" , new TextRegion(1 , 5 ).apply( string ) );
}
}