/*******************************************************************************
 * Copyright (c) 2005, 2015 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.ui.workbench.texteditor.tests.revisions;

import java.util.Date;
import java.util.List;

import org.eclipse.swt.graphics.RGB;

import org.eclipse.jface.internal.text.revisions.ChangeRegion;
import org.eclipse.jface.internal.text.revisions.Hunk;
import org.eclipse.jface.internal.text.revisions.Range;

import org.eclipse.jface.text.revisions.Revision;
import org.eclipse.jface.text.source.LineRange;

import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;

/**
 *
 * @since 3.2
 */
public class ChangeRegionTest extends TestCase {
	public static Test suite() {
		return new TestSuite(ChangeRegionTest.class);
	}

	public static final class TestRevision extends Revision {
		@Override
		public Object getHoverInfo() {
			return null;
		}

		@Override
		public RGB getColor() {
			return null;
		}

		@Override
		public String getId() {
			return null;
		}

		@Override
		public Date getDate() {
			return null;
		}
	}

	private Revision fRevision;

	@Override
	protected void setUp() throws Exception {
		fRevision= new TestRevision();
	}

	public void testCreation() throws Exception {
		try {
			new ChangeRegion(fRevision, null);
			fail();
		} catch (Exception e) {
		}

		try {
			new ChangeRegion(null, new LineRange(12, 3));
			fail();
		} catch (Exception e) {
		}

		try {
			new ChangeRegion(null, null);
			fail();
		} catch (Exception e) {
		}

		ChangeRegion r= new ChangeRegion(fRevision, new LineRange(12, 3));
		assertEquals(fRevision, r.getRevision());
		RangeUtil.assertEqualRange(new LineRange(12, 3), r.getAdjustedRanges().get(0));
		RangeUtil.assertEqualRange(new LineRange(12, 3), r.getAdjustedCoverage());
	}

	public void testHunkAfter() throws Exception {
		ChangeRegion r= new ChangeRegion(fRevision, new LineRange(12, 3));
		List<Range> before= RangeUtil.deepClone(r.getAdjustedRanges());
		r.adjustTo(new Hunk(16, 3, 2));
		RangeUtil.assertEqualRanges(before, r.getAdjustedRanges());
		RangeUtil.assertEqualRange(before.get(0), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 3));
		before= RangeUtil.deepClone(r.getAdjustedRanges());
		r.adjustTo(new Hunk(16, -33, 2));
		RangeUtil.assertEqualRanges(before, r.getAdjustedRanges());
		RangeUtil.assertEqualRange(before.get(0), r.getAdjustedCoverage());
	}

	public void testHunkRightAfter() throws Exception {
		ChangeRegion r= new ChangeRegion(fRevision, new LineRange(12, 3));
		List<Range> before= RangeUtil.deepClone(r.getAdjustedRanges());
		r.adjustTo(new Hunk(15, 3, 2));
		RangeUtil.assertEqualRanges(before, r.getAdjustedRanges());
		RangeUtil.assertEqualRange(before.get(0), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 3));
		before= RangeUtil.deepClone(r.getAdjustedRanges());
		r.adjustTo(new Hunk(15, -3, 2));
		RangeUtil.assertEqualRanges(before, r.getAdjustedRanges());
		RangeUtil.assertEqualRange(before.get(0), r.getAdjustedCoverage());
	}

	public void testHunkBefore() throws Exception {
		ChangeRegion r;

		r= new ChangeRegion(fRevision, new LineRange(12, 3));
		r.adjustTo(new Hunk(5, 3, 2));
		RangeUtil.assertEqualSingleRange(new LineRange(15, 3), r.getAdjustedRanges());
		RangeUtil.assertEqualRange(new LineRange(15, 3), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 3));
		r.adjustTo(new Hunk(5, 3, 0));
		RangeUtil.assertEqualSingleRange(new LineRange(15, 3), r.getAdjustedRanges());
		RangeUtil.assertEqualRange(new LineRange(15, 3), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 3));
		r.adjustTo(new Hunk(5, -3, 0));
		RangeUtil.assertEqualSingleRange(new LineRange(9, 3), r.getAdjustedRanges());
		RangeUtil.assertEqualRange(new LineRange(9, 3), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 3));
		r.adjustTo(new Hunk(5, 3, 3));
		RangeUtil.assertEqualSingleRange(new LineRange(15, 3), r.getAdjustedRanges());
		RangeUtil.assertEqualRange(new LineRange(15, 3), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 3));
		r.adjustTo(new Hunk(5, -3, 2));
		RangeUtil.assertEqualSingleRange(new LineRange(9, 3), r.getAdjustedRanges());
		RangeUtil.assertEqualRange(new LineRange(9, 3), r.getAdjustedCoverage());
	}

	public void testHunkRightBefore() throws Exception {
		ChangeRegion r;

		r= new ChangeRegion(fRevision, new LineRange(12, 3));
		r.adjustTo(new Hunk(10, 0 , 2));
		RangeUtil.assertEqualSingleRange(new LineRange(12, 3), r.getAdjustedRanges());
		RangeUtil.assertEqualRange(new LineRange(12, 3), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 3));
		r.adjustTo(new Hunk(10, 2 , 2));
		RangeUtil.assertEqualSingleRange(new LineRange(14, 3), r.getAdjustedRanges());
		RangeUtil.assertEqualRange(new LineRange(14, 3), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 3));
		r.adjustTo(new Hunk(9, -3, 0));
		RangeUtil.assertEqualSingleRange(new LineRange(9, 3), r.getAdjustedRanges());
		RangeUtil.assertEqualRange(new LineRange(9, 3), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 3));
		r.adjustTo(new Hunk(9, -1, 2));
		RangeUtil.assertEqualSingleRange(new LineRange(11, 3), r.getAdjustedRanges());
		RangeUtil.assertEqualRange(new LineRange(11, 3), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 3));
		r.adjustTo(new Hunk(9, 3, 3));
		RangeUtil.assertEqualSingleRange(new LineRange(15, 3), r.getAdjustedRanges());
		RangeUtil.assertEqualRange(new LineRange(15, 3), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 3));
		r.adjustTo(new Hunk(12, 3, 0));
		RangeUtil.assertEqualSingleRange(new LineRange(15, 3), r.getAdjustedRanges());
		RangeUtil.assertEqualRange(new LineRange(15, 3), r.getAdjustedCoverage());
	}

	public void testHunkAtStart() throws Exception {
		ChangeRegion r;

		r= new ChangeRegion(fRevision, new LineRange(12, 7));
		r.adjustTo(new Hunk(12, 0 , 2));
		RangeUtil.assertEqualSingleRange(new LineRange(14, 5), r.getAdjustedRanges());
		RangeUtil.assertEqualRange(new LineRange(14, 5), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 7));
		r.adjustTo(new Hunk(12, -2, 0));
		RangeUtil.assertEqualSingleRange(new LineRange(12, 5), r.getAdjustedRanges());
		RangeUtil.assertEqualRange(new LineRange(12, 5), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 7));
		r.adjustTo(new Hunk(12, -2, 1));
		RangeUtil.assertEqualSingleRange(new LineRange(13, 4), r.getAdjustedRanges());
		RangeUtil.assertEqualRange(new LineRange(13, 4), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 7));
		r.adjustTo(new Hunk(12, 3, 0));
		RangeUtil.assertEqualSingleRange(new LineRange(15, 7), r.getAdjustedRanges());
		RangeUtil.assertEqualRange(new LineRange(15, 7), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 7));
		r.adjustTo(new Hunk(12, 3, 2));
		RangeUtil.assertEqualSingleRange(new LineRange(17, 5), r.getAdjustedRanges());
		RangeUtil.assertEqualRange(new LineRange(17, 5), r.getAdjustedCoverage());
	}

	public void testHunkAtEnd() throws Exception {
		ChangeRegion r;

		r= new ChangeRegion(fRevision, new LineRange(12, 7));
		r.adjustTo(new Hunk(17, 0, 2));
		RangeUtil.assertEqualSingleRange(new LineRange(12, 5), r.getAdjustedRanges());
		RangeUtil.assertEqualRange(new LineRange(12, 5), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 7));
		r.adjustTo(new Hunk(17, 2, 2));
		RangeUtil.assertEqualSingleRange(new LineRange(12, 5), r.getAdjustedRanges());
		RangeUtil.assertEqualRange(new LineRange(12, 5), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 7));
		r.adjustTo(new Hunk(15, -2, 2));
		RangeUtil.assertEqualSingleRange(new LineRange(12, 3), r.getAdjustedRanges());
		RangeUtil.assertEqualRange(new LineRange(12, 3), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 7));
		r.adjustTo(new Hunk(17, -2, 0));
		RangeUtil.assertEqualSingleRange(new LineRange(12, 5), r.getAdjustedRanges());
		RangeUtil.assertEqualRange(new LineRange(12, 5), r.getAdjustedCoverage());
	}

	public void testHunkOverStart() throws Exception {
		ChangeRegion r;

		r= new ChangeRegion(fRevision, new LineRange(12, 7));
		r.adjustTo(new Hunk(11, 0 , 2));
		RangeUtil.assertEqualSingleRange(new LineRange(13, 6), r.getAdjustedRanges());
		RangeUtil.assertEqualRange(new LineRange(13, 6), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 7));
		r.adjustTo(new Hunk(11, 2, 2));
		RangeUtil.assertEqualSingleRange(new LineRange(15, 6), r.getAdjustedRanges());
		RangeUtil.assertEqualRange(new LineRange(15, 6), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 7));
		r.adjustTo(new Hunk(11, -2, 2));
		RangeUtil.assertEqualSingleRange(new LineRange(13, 4), r.getAdjustedRanges());
		RangeUtil.assertEqualRange(new LineRange(13, 4), r.getAdjustedCoverage());
	}

	public void testHunkOverEnd() throws Exception {
		ChangeRegion r;

		r= new ChangeRegion(fRevision, new LineRange(12, 7));
		r.adjustTo(new Hunk(18, 0 , 2));
		RangeUtil.assertEqualSingleRange(new LineRange(12, 6), r.getAdjustedRanges());
		RangeUtil.assertEqualRange(new LineRange(12, 6), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 7));
		r.adjustTo(new Hunk(18, -2, 0));
		RangeUtil.assertEqualSingleRange(new LineRange(12, 6), r.getAdjustedRanges());
		RangeUtil.assertEqualRange(new LineRange(12, 6), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 7));
		r.adjustTo(new Hunk(18, -2, 2));
		RangeUtil.assertEqualSingleRange(new LineRange(12, 6), r.getAdjustedRanges());
		RangeUtil.assertEqualRange(new LineRange(12, 6), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 7));
		r.adjustTo(new Hunk(17, -2, 1));
		RangeUtil.assertEqualSingleRange(new LineRange(12, 5), r.getAdjustedRanges());
		RangeUtil.assertEqualRange(new LineRange(12, 5), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 7));
		r.adjustTo(new Hunk(17, -2, 3));
		RangeUtil.assertEqualSingleRange(new LineRange(12, 5), r.getAdjustedRanges());
		RangeUtil.assertEqualRange(new LineRange(12, 5), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 7));
		r.adjustTo(new Hunk(17, 2, 3));
		RangeUtil.assertEqualSingleRange(new LineRange(12, 5), r.getAdjustedRanges());
		RangeUtil.assertEqualRange(new LineRange(12, 5), r.getAdjustedCoverage());
	}

	public void testHunkCovering() throws Exception {
		ChangeRegion r;

		r= new ChangeRegion(fRevision, new LineRange(12, 7));
		r.adjustTo(new Hunk(12, 0 , 7));
		assertTrue(r.getAdjustedRanges().isEmpty());
		RangeUtil.assertEqualRange(new LineRange(12, 0), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 7));
		r.adjustTo(new Hunk(11, 0 , 8));
		assertTrue(r.getAdjustedRanges().isEmpty());
		RangeUtil.assertEqualRange(new LineRange(12, 0), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 7));
		r.adjustTo(new Hunk(11, 0 , 9));
		assertTrue(r.getAdjustedRanges().isEmpty());
		RangeUtil.assertEqualRange(new LineRange(12, 0), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 7));
		r.adjustTo(new Hunk(12, 0 , 9));
		assertTrue(r.getAdjustedRanges().isEmpty());
		RangeUtil.assertEqualRange(new LineRange(12, 0), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 7));
		r.adjustTo(new Hunk(12, -7, 0));
		assertTrue(r.getAdjustedRanges().isEmpty());
		RangeUtil.assertEqualRange(new LineRange(12, 0), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 7));
		r.adjustTo(new Hunk(12, -8, 0));
		assertTrue(r.getAdjustedRanges().isEmpty());
		RangeUtil.assertEqualRange(new LineRange(12, 0), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 7));
		r.adjustTo(new Hunk(11, -8, 0));
		assertTrue(r.getAdjustedRanges().isEmpty());
		RangeUtil.assertEqualRange(new LineRange(12, 0), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 7));
		r.adjustTo(new Hunk(11, -9, 0));
		assertTrue(r.getAdjustedRanges().isEmpty());
		RangeUtil.assertEqualRange(new LineRange(12, 0), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 7));
		r.adjustTo(new Hunk(8, -9, 6));
		assertTrue(r.getAdjustedRanges().isEmpty());
		RangeUtil.assertEqualRange(new LineRange(12, 0), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 7));
		r.adjustTo(new Hunk(8, -4, 8));
		assertTrue(r.getAdjustedRanges().isEmpty());
		RangeUtil.assertEqualRange(new LineRange(12, 0), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 7));
		r.adjustTo(new Hunk(8, -3, 9));
		assertTrue(r.getAdjustedRanges().isEmpty());
		RangeUtil.assertEqualRange(new LineRange(12, 0), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 7));
		r.adjustTo(new Hunk(8, -12, 5));
		assertTrue(r.getAdjustedRanges().isEmpty());
		RangeUtil.assertEqualRange(new LineRange(12, 0), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 7));
		r.adjustTo(new Hunk(8, -12, 20));
		assertTrue(r.getAdjustedRanges().isEmpty());
		RangeUtil.assertEqualRange(new LineRange(12, 0), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 7));
		r.adjustTo(new Hunk(8, 12, 20));
		assertTrue(r.getAdjustedRanges().isEmpty());
		RangeUtil.assertEqualRange(new LineRange(12, 0), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 7));
		r.adjustTo(new Hunk(8, -3, 8));
		assertTrue(r.getAdjustedRanges().isEmpty());
		RangeUtil.assertEqualRange(new LineRange(12, 0), r.getAdjustedCoverage());
	}

	public void testHunkInBetween() throws Exception {
		// TODO require merging of adjacent ranges?
		ChangeRegion r;

		r= new ChangeRegion(fRevision, new LineRange(12, 7));
		r.adjustTo(new Hunk(15, -2, 0));
		RangeUtil.assertEqualRanges(new LineRange(12, 3), new LineRange(15, 2), r.getAdjustedRanges());
		RangeUtil.assertEqualRange(new LineRange(12, 5), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 7));
		r.adjustTo(new Hunk(15, 2, 0));
		RangeUtil.assertEqualRanges(new LineRange(12, 3), new LineRange(17, 4), r.getAdjustedRanges());
		RangeUtil.assertEqualRange(new LineRange(12, 9), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 7));
		r.adjustTo(new Hunk(15, 0, 2));
		RangeUtil.assertEqualRanges(new LineRange(12, 3), new LineRange(17, 2), r.getAdjustedRanges());
		RangeUtil.assertEqualRange(new LineRange(12, 7), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 7));
		r.adjustTo(new Hunk(15, -1, 2));
		RangeUtil.assertEqualRanges(new LineRange(12, 3), new LineRange(17, 1), r.getAdjustedRanges());
		RangeUtil.assertEqualRange(new LineRange(12, 6), r.getAdjustedCoverage());

		r= new ChangeRegion(fRevision, new LineRange(12, 7));
		r.adjustTo(new Hunk(15, 2, 2));
		RangeUtil.assertEqualRanges(new LineRange(12, 3), new LineRange(19, 2), r.getAdjustedRanges());
		RangeUtil.assertEqualRange(new LineRange(12, 9), r.getAdjustedCoverage());
	}
}
