/*******************************************************************************
 * Copyright (c) 2011 Broadcom 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:
 * Broadcom - Initial API and implementation
 * Nokia - move to package org.eclipse.cdt.debug.edc.tests
 *******************************************************************************/
package org.eclipse.cdt.debug.edc.tests;

import org.eclipse.cdt.core.IAddressFactory;
import org.eclipse.cdt.debug.edc.internal.symbols.FunctionScope;
import org.eclipse.cdt.debug.edc.symbols.IScope;
import org.eclipse.cdt.utils.Addr64Factory;

import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;

public class ScopeTest {

	protected static IScope scopeA;
	protected static IScope scopeA_;
	protected static IScope scopeB;
	protected static IScope scopeC;
	protected static IScope scopeD;
	protected static IScope scopeE;

	@BeforeClass
	public static void setUp(){
		IAddressFactory addrFactory = new Addr64Factory();
		// |0   |50   |100 |150  |200 |250
		// < scopeA  >< scopeB  >
		//      < scope C >
		//            < scopeD        >
		// < scopeE  >
		scopeA = new FunctionScope("scopeA", null, addrFactory.createAddress("0x0"), addrFactory.createAddress("0x100"), null);
		scopeA_ = new FunctionScope("scopeA", null, addrFactory.createAddress("0x0"), addrFactory.createAddress("0x100"), null);
		scopeB = new FunctionScope("scopeB", null, addrFactory.createAddress("0x100"), addrFactory.createAddress("0x200"), null);
		scopeC = new FunctionScope("scopeC", null, addrFactory.createAddress("0x50"), addrFactory.createAddress("0x150"), null);
		scopeD = new FunctionScope("scopeD", null, addrFactory.createAddress("0x100"), addrFactory.createAddress("0x250"), null);
		scopeE = new FunctionScope("scopeE", null, addrFactory.createAddress("0x0"), addrFactory.createAddress("0x100"), null);
	}

	@Test
	public void testEquals() {
// the following two assertions w.r.t. Scope equality are not really
// valid based upon the fact that one cannot compute a hashCode() for
// an object based upon mutable values, and lowAddress and highAddress
// in Scope are mutable.  and since two objects that return true for
// equals() must return the same hashCode(), these members of Scope
// cannot be used for equals(), either.
//		Assert.assertTrue("Identically valued scopes are equal", scopeA.equals(scopeA_));
//
//		Assert.assertEquals("Identically valued scopes have same hashCode", scopeA.hashCode(), scopeA_.hashCode());

		Assert.assertTrue("Different scope objects with equal contents return true for contentsEquals()",
						  ((FunctionScope)scopeA).contentsEquals(scopeA_));
		((FunctionScope)scopeA).addChild(scopeE);
		Assert.assertFalse("Scopes with same location but different children return false for contentsEquals()",
				  		  ((FunctionScope)scopeA).contentsEquals(scopeA_));
		((FunctionScope)scopeA_).addChild(scopeE);
		Assert.assertTrue("Scopes with same location and same children return true for contentsEquals()",
						  ((FunctionScope)scopeA).contentsEquals(scopeA_));

		Assert.assertFalse("Different valued scopes are not equal", scopeA.equals(scopeE));
		Assert.assertFalse("Different valued scopes are not equal", scopeA.equals(scopeD));
		Assert.assertFalse("Different valued scopes are not equal", scopeA.equals(scopeB));

		Assert.assertFalse("Different valued scopes have different hashCodes", scopeA.hashCode() == scopeB.hashCode());
		Assert.assertFalse("Different valued scopes have different hashCodes", scopeA.hashCode() == scopeE.hashCode());
	}

	@Test
	public void testScopeComparison(){// Fix 1
		Assert.assertTrue(scopeA.compareTo(scopeB)<0);
		Assert.assertTrue(scopeA.compareTo(scopeC)<0);
		Assert.assertTrue(scopeA.compareTo(scopeD)<0);
		Assert.assertTrue(scopeB.compareTo(scopeD)<0);	// original bug being tested
		Assert.assertTrue(scopeE.compareTo(scopeA)==0);
	}
}
