/*******************************************************************************
 * Copyright (c) 2008, 2012 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.core.tests.runtime.jobs;

import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
import org.eclipse.core.runtime.jobs.MultiRule;

/**
 * Tests for {@link MultiRule}.
 */
public class MultiRuleTest extends AbstractJobTest {
	public static Test suite() {
		return new TestSuite(MultiRuleTest.class);
	}

	public void testCombine() {
		ISchedulingRule child1 = new PathRule("/a");
		ISchedulingRule child2 = new PathRule("/b/c");
		ISchedulingRule childOfChild1 = new PathRule("/a/b");
		ISchedulingRule nonChild = new PathRule("/z/d");
		MultiRule multi1 = new MultiRule(new ISchedulingRule[] {child1, child2});

		//add multi to its own children
		assertEquals("1.0", multi1, MultiRule.combine(new ISchedulingRule[] {multi1}));
		assertEquals("1.1", multi1, MultiRule.combine(new ISchedulingRule[] {multi1, child1, child2, childOfChild1}));
		assertEquals("1.2", multi1, MultiRule.combine(multi1, child2));
		assertEquals("1.3", multi1, MultiRule.combine(childOfChild1, multi1));

		//null
		assertEquals("1.4", null, MultiRule.combine(null, null));
		assertEquals("1.5", multi1, MultiRule.combine(null, multi1));
		assertEquals("1.6", child1, MultiRule.combine(child1, null));

		MultiRule result = (MultiRule) MultiRule.combine(multi1, nonChild);
		assertTrue("2.0" + result, result.contains(multi1));
		assertTrue("2.1", result.contains(nonChild));

	}

	public void testContains() {
		ISchedulingRule child1 = new PathRule("/a");
		ISchedulingRule child2 = new PathRule("/b/c");
		ISchedulingRule childOfChild1 = new PathRule("/a/b");
		ISchedulingRule nonChild = new PathRule("/z/d");
		MultiRule multi1 = new MultiRule(new ISchedulingRule[] {child1, child2});
		MultiRule multi2 = new MultiRule(new ISchedulingRule[] {childOfChild1});

		assertTrue("1.0", multi1.contains(child1));
		assertTrue("1.1", multi1.contains(child2));
		assertTrue("1.2", !multi1.contains(nonChild));
		assertTrue("1.3", multi1.contains(childOfChild1));
		assertTrue("1.4", multi1.contains(multi2));
		assertTrue("1.5", !multi2.contains(multi1));
		assertTrue("1.6", multi1.contains(multi1));
	}

	public void testIsConflicting() {
		ISchedulingRule child1 = new PathRule("/a");
		ISchedulingRule child2 = new PathRule("/b/c");
		ISchedulingRule childOfChild1 = new PathRule("/a/b");
		ISchedulingRule nonChild = new PathRule("/z/d");
		MultiRule multi1 = new MultiRule(new ISchedulingRule[] {child1, child2});
		MultiRule multi2 = new MultiRule(new ISchedulingRule[] {childOfChild1, nonChild});

		assertTrue("1.0", multi1.isConflicting(child1));
		assertTrue("1.1", multi1.isConflicting(child2));
		assertTrue("1.2", !multi1.isConflicting(nonChild));
		assertTrue("1.3", multi1.isConflicting(childOfChild1));
		assertTrue("1.4", multi1.isConflicting(multi2));
		assertTrue("1.5", multi2.isConflicting(multi1));
		assertTrue("1.6", multi1.isConflicting(multi1));
	}
}
