blob: 29d7b7fdd7237fafbb06f6162955773ce8baf123 [file] [log] [blame]
/**
* <copyright>
* Copyright (c) 2010-2014 Henshin developers. 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
* </copyright>
*/
package org.eclipse.emf.henshin.tests.basic;
import static org.junit.Assert.*;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
import org.eclipse.emf.henshin.model.impl.IteratedUnitImpl;
import org.eclipse.emf.henshin.model.impl.SequentialUnitImpl;
import org.eclipse.emf.henshin.tests.framework.HenshinTest;
import org.eclipse.emf.henshin.tests.framework.Units;
import org.eclipse.emf.henshin.tests.testmodel.TestmodelPackage;
import org.junit.Before;
import org.junit.Test;
/**
* Tests execution of units.
*
* The scheme of the tests is documented in "UnitTest-scheme.html".
*
* @author Felix Rieger
* @author Stefan Jurack
* @author Christian Krause
* @author Benjamin Heidelmeier
*
*/
public class UnitTest extends HenshinTest {
@Before
public void setUp() throws Exception {
TestmodelPackage.eINSTANCE.eClass();
initFactory("testmodel", new XMIResourceFactoryImpl());
init("basic/rules/unitTests.henshin");
setEGraphPath("basic/models/unitTestsModels/", "testmodel");
}
@Test
public void testAmalgamationUnitAttributeInKernelRuleNac() {
loadEGraph("graphBefore_amu_attributeInKernelNac");
loadUnit("loop_amu_attributeInKernelNac");
Units.assertUnitCanBeExecuted(htUnitApp);
}
@Test
/**
* Unit: Independent
* Flags: -
* Case: Unit empty
*/
public void testEmptyIndependentUnit() {
loadEGraph("graphBefore_loopUnit");
loadUnit("emptyIndependentUnit");
Units.assertUnitCanNotBeExecuted(htUnitApp);
}
@Test
/**
* Unit: Priority
* Flags: -
* Case: Unit empty
*/
public void testEmptyPriorityUnit() {
loadEGraph("graphBefore_loopUnit");
loadUnit("emptyPriorityUnit");
Units.assertUnitCanNotBeExecuted(htUnitApp);
}
@Test
/**
* Unit: Sequential
* Flags: strict=true
* Case: Unit empty
*/
public void testEmptyStrictSequentialUnit() {
loadEGraph("graphBefore_loopUnit");
loadUnit("emptySequentialUnit");
Units.assertUnitCanBeExecuted(htUnitApp);
}
@Test
/**
* Unit: Sequential
* Flags: strict=false
* Case: Unit empty
*/
public void testEmptyNonstrictSequentialUnit() {
loadEGraph("graphBefore_loopUnit");
loadUnit("emptySequentialUnit");
((SequentialUnitImpl)htUnit).setStrict(false);
Units.assertUnitCanBeExecuted(htUnitApp);
}
@Test
/**
* Execution of strict SequentialUnit should return false if not all
* sub-units can be applied. Without rollback, the changes of applied
* iterations should remain.
*
* Unit: Sequential
* Flags: strict=true, rollback=false
* Case: Unit fails
*/
public void testStrictSequentialUnitWithoutRollbackFails() {
loadEGraph("graphWithTwoNodes");
loadUnit("sequentialUnitNodeAndValDeletionTest");
((SequentialUnitImpl)htUnit).setStrict(true);
((SequentialUnitImpl)htUnit).setRollback(false);
Units.assertUnitCanNotBeExecuted(htUnitApp);
int nodeNumber = htEGraph.getDomainSize(TestmodelPackage.Literals.NODE, true);
assertEquals(1, nodeNumber);
}
@Test
/**
* Execution of strict SequentialUnit should return false if not all
* sub-units can be applied. With rollback, the changes of applied
* sub-units should be reverted.
*
* Unit: Sequential
* Flags: strict=true, rollback=true
* Case: Unit fails
*/
public void testStrictSequentialUnitWithRollbackFails() {
loadEGraph("graphWithTwoNodes");
loadUnit("sequentialUnitNodeAndValDeletionTest");
((SequentialUnitImpl)htUnit).setStrict(true);
((SequentialUnitImpl)htUnit).setRollback(true);
Units.assertUnitCanNotBeExecuted(htUnitApp);
int nodeNumber = htEGraph.getDomainSize(TestmodelPackage.Literals.NODE, true);
assertEquals(2, nodeNumber);
}
@Test
/**
* Execution of strict SequentialUnit should return true if all
* sub-units can be applied.
*
* Unit: Sequential
* Flags: strict=true, rollback=true
* Case: Unit succeeds
*/
public void testStrictSequentialUnitSucceeds() {
loadEGraph("graphWithTwoNodesAndOneVal");
loadUnit("sequentialUnitNodeAndValDeletionTest");
((SequentialUnitImpl)htUnit).setStrict(true);
Units.assertUnitCanBeExecuted(htUnitApp);
int nodeNumber = htEGraph.getDomainSize(TestmodelPackage.Literals.NODE, true);
assertEquals(0, nodeNumber);
int valNumber = htEGraph.getDomainSize(TestmodelPackage.Literals.VAL, true);
assertEquals(0, valNumber);
}
@Test
/**
* Execution of non-strict SequentialUnit should return false if no sub-unit
* can be applied.
*
* Unit: Sequential
* Flags: strict=false, rollback=true
* Case: Unit fails
*/
public void testNonstrictSequentialUnitFails() {
loadEGraph("graphWithCont");
loadUnit("sequentialUnitNodeAndValDeletionTest");
((SequentialUnitImpl)htUnit).setStrict(false);
Units.assertUnitCanNotBeExecuted(htUnitApp);
}
@Test
/**
* Execution of non-strict SequentialUnit should return true if at least
* one sub-unit can be applied, even if not all sub-units can be applied.
* Using rollback should not have an effect on applied iterations.
*
* Unit: Sequential
* Flags: strict=false, rollback=true
* Case: Unit succeeds
*/
public void testNonstrictSequentialUnitSucceeds() {
loadEGraph("graphWithTwoNodes");
loadUnit("sequentialUnitNodeAndValDeletionTest");
((SequentialUnitImpl)htUnit).setStrict(false);
((SequentialUnitImpl)htUnit).setRollback(true);
Units.assertUnitCanBeExecuted(htUnitApp);
int nodeNumber = htEGraph.getDomainSize(TestmodelPackage.Literals.NODE, true);
assertEquals(0, nodeNumber);
}
@Test
/**
* Execution of strict IteratedUnit should return false if not all
* iterations can be applied. Without rollback, the changes of applied
* iterations should remain.
*
* Unit: Iterated
* Flags: strict=true, rollback=false
* Case: Unit fails
*/
public void testStrictIteratedUnitWithoutRollbackFails() {
loadEGraph("graphWithTwoNodes");
loadUnit("iteratedUnitNodeDeletionTest");
((IteratedUnitImpl)htUnit).setStrict(true);
((IteratedUnitImpl)htUnit).setRollback(false);
Units.assertUnitCanNotBeExecuted(htUnitApp);
int nodeNumber = htEGraph.getDomainSize(TestmodelPackage.Literals.NODE, true);
assertEquals(0, nodeNumber);
}
@Test
/**
* Execution of strict IteratedUnit should return false if not all
* iterations can be applied. With rollback, the changes of applied
* iterations should be reverted.
*
* Unit: Iterated
* Flags: strict=true, rollback=true
* Case: Unit fails
*/
public void testStrictIteratedUnitWithRollbackFails() {
loadEGraph("graphWithTwoNodes");
loadUnit("iteratedUnitNodeDeletionTest");
((IteratedUnitImpl)htUnit).setStrict(true);
((IteratedUnitImpl)htUnit).setRollback(true);
Units.assertUnitCanNotBeExecuted(htUnitApp);
int nodeNumber = htEGraph.getDomainSize(TestmodelPackage.Literals.NODE, true);
assertEquals(2, nodeNumber);
}
@Test
/**
* Execution of strict IteratedUnit should return true if all iterations
* can be applied.
*
* Unit: Iterated
* Flags: strict=true, rollback=false, iterations=2
* Case: Unit succeeds
*/
public void testStrictIteratedUnitSucceeds() {
loadEGraph("graphWithTwoNodes");
loadUnit("iteratedUnitNodeDeletionTest");
((IteratedUnitImpl)htUnit).setIterations("2");
((IteratedUnitImpl)htUnit).setStrict(true);
((IteratedUnitImpl)htUnit).setRollback(false);
Units.assertUnitCanBeExecuted(htUnitApp);
}
@Test
/**
* Execution of non-strict IteratedUnit should return false if no iteration
* can be applied.
*
* Unit: Iterated
* Flags: strict=false, rollback=true
* Case: Unit fails
*/
public void testNonstrictIteratedUnitFails() {
loadEGraph("graphWithCont");
loadUnit("iteratedUnitNodeDeletionTest");
((IteratedUnitImpl)htUnit).setStrict(false);
Units.assertUnitCanNotBeExecuted(htUnitApp);
}
@Test
/**
* Execution of non-strict IteratedUnit should return true if at least
* one iteration can be applied, even if not all iterations can be applied.
* Using rollback should not have an effect on applied iterations.
*
* Unit: Iterated
* Flags: strict=false, rollback=true
* Case: Unit succeeds
*/
public void testNonstrictIteratedUnitSucceeds() {
loadEGraph("graphWithTwoNodes");
loadUnit("iteratedUnitNodeDeletionTest");
((IteratedUnitImpl)htUnit).setStrict(false);
((IteratedUnitImpl)htUnit).setRollback(true);
Units.assertUnitCanBeExecuted(htUnitApp);
int nodeNumber = htEGraph.getDomainSize(TestmodelPackage.Literals.NODE, true);
assertEquals(0, nodeNumber);
}
@Test
/**
* Execution of ConditionalUnit without 'else'-subUnit should return true
* if 'if'-subUnit fails.
*
* Unit: Conditional
* Flags: -
* Case: Unit empty
*/
public void testConditionalUnitWithoutElseIfFalseSucceeds() {
loadEGraph("graphWithTwoNodes");
loadUnit("conditionalUnitWithoutElse");
Units.assertUnitCanBeExecuted(htUnitApp);
int nodeNumber = htEGraph.getDomainSize(TestmodelPackage.Literals.NODE, true);
assertEquals(2, nodeNumber);
}
@Test
/**
* Execution of ConditionalUnit should return true if 'if'-subUnit fails
* and 'else'-subUnit succeeds.
*
* Unit: Conditional
* Flags: -
* Case: Unit succeeds
*/
public void testConditionalUnitElseSucceeds() {
loadEGraph("graphWithTwoNodes");
loadUnit("conditionalUnitTest2");
Units.assertUnitCanBeExecuted(htUnitApp);
int nodeNumber = htEGraph.getDomainSize(TestmodelPackage.Literals.NODE, true);
assertEquals(1, nodeNumber);
}
@Test
/**
* Execution of ConditionalUnit should return false if 'if'-subUnit fails
* and 'else'-subUnit fails.
*
* Unit: Conditional
* Flags: -
* Case: Unit fails
*/
public void testConditionalUnitElseFails() {
loadEGraph("graphWithTwoNodes");
loadUnit("conditionalUnitTest1");
Units.assertUnitCanNotBeExecuted(htUnitApp);
int nodeNumber = htEGraph.getDomainSize(TestmodelPackage.Literals.NODE, true);
assertEquals(2, nodeNumber);
}
@Test
/**
* Execution of ConditionalUnit should return true if 'if'-subUnit succeeds
* and 'then'-subUnit succeeds.
*
* Unit: Conditional
* Flags: -
* Case: Unit succeeds
*/
public void testConditionalUnitThenSucceeds() {
loadEGraph("graphWithTwoNodesAndOneVal");
loadUnit("conditionalUnitTest1");
Units.assertUnitCanBeExecuted(htUnitApp);
int nodeNumber = htEGraph.getDomainSize(TestmodelPackage.Literals.NODE, true);
assertEquals(1, nodeNumber);
}
@Test
/**
* Execution of ConditionalUnit should return false if 'if'-subUnit succeeds
* and 'then'-subUnit fails.
*
* Unit: Conditional
* Flags: -
* Case: Unit fails
*/
public void testConditionalUnitThenFails() {
loadEGraph("graphWithTwoNodesAndOneVal");
loadUnit("conditionalUnitTest2");
Units.assertUnitCanNotBeExecuted(htUnitApp);
int nodeNumber = htEGraph.getDomainSize(TestmodelPackage.Literals.NODE, true);
assertEquals(2, nodeNumber);
}
@Test
/**
* Execution of PriorityUnit should return false if all subUnits fail.
*
* Unit: Priority
* Flags: -
* Case: Unit fails
*/
public void testPriorityUnitAllfail() {
loadEGraph("graphWithCont");
loadUnit("priorityUnitTest");
Units.assertUnitCanNotBeExecuted(htUnitApp);
}
@Test
/**
* Execution of PriorityUnit should return true if last subUnit succeeds.
*
* Unit: Priority
* Flags: -
* Case: Unit succeeds
*/
public void testPriorityUnitLastSucceeds() {
loadEGraph("graphWithTwoNodes");
loadUnit("priorityUnitTest");
Units.assertUnitCanBeExecuted(htUnitApp);
int nodeNumber = htEGraph.getDomainSize(TestmodelPackage.Literals.NODE, true);
assertEquals(1, nodeNumber);
}
@Test
/**
* Execution of PriorityUnit should return true if subUnit in the middle succeeds.
*
* Unit: Priority
* Flags: -
* Case: Unit succeeds
*/
public void testPriorityUnitMiddleSucceeds() {
loadEGraph("graphWithTwoNodesAndOneVal");
loadUnit("priorityUnitTest");
Units.assertUnitCanBeExecuted(htUnitApp);
int nodeNumber = htEGraph.getDomainSize(TestmodelPackage.Literals.NODE, true);
assertEquals(2, nodeNumber);
int valNumber = htEGraph.getDomainSize(TestmodelPackage.Literals.VAL, true);
assertEquals(0, valNumber);
}
@Test
/**
* Execution of PriorityUnit should return true if first subUnit succeeds.
*
* Unit: Priority
* Flags: -
* Case: Unit succeeds
*/
public void testPriorityUnitFirstSucceeds() {
loadEGraph("graphBefore_priorityUnit");
loadUnit("priorityUnitTest");
Units.assertUnitCanBeExecuted(htUnitApp);
int nodeNumber = htEGraph.getDomainSize(TestmodelPackage.Literals.NODE, true);
assertEquals(4, nodeNumber);
int valNumber = htEGraph.getDomainSize(TestmodelPackage.Literals.VAL, true);
assertEquals(2, valNumber);
}
@Test
/**
* Execution of IndependentUnit should return false if all subUnits fail.
*
* Unit: Independent
* Flags: -
* Case: Unit fails
*/
public void testIndependentUnitAllfail() {
loadEGraph("graphWithCont");
loadUnit("independentUnitTest");
Units.assertUnitCanNotBeExecuted(htUnitApp);
}
@Test
/**
* Execution of IndependentUnit should return true if one of three subUnits can succeed.
*
* Unit: Independent
* Flags: -
* Case: Unit succeeds
*/
public void testIndependentUnitOneCanSucceed() {
loadEGraph("graphWithTwoNodes");
loadUnit("independentUnitTest");
Units.assertUnitCanBeExecuted(htUnitApp);
int nodeNumber = htEGraph.getDomainSize(TestmodelPackage.Literals.NODE, true);
assertEquals(1, nodeNumber);
}
@Test
/**
* Execution of IndependentUnit should return true if two of three subUnits can succeed.
*
* Unit: Independent
* Flags: -
* Case: Unit succeeds
*/
public void testIndependentUnitTwoCanSucceed() {
loadEGraph("graphWithTwoNodesAndOneVal");
loadUnit("independentUnitTest");
Units.assertUnitCanBeExecuted(htUnitApp);
int nodeNumber = htEGraph.getDomainSize(TestmodelPackage.Literals.NODE, true);
int valNumber = htEGraph.getDomainSize(TestmodelPackage.Literals.VAL, true);
assertTrue(nodeNumber == 2 && valNumber == 0 || nodeNumber == 1 && valNumber == 1);
}
@Test
/**
* Execution of LoopUnit should return true if no execution of the subUnit is possible.
*
* Unit: Loop
* Flags: -
* Case: Unit succeeds
*/
public void testLoopUnitNoLoopSucceeds() {
loadEGraph("graphWithCont");
loadUnit("loopUnitTest");
Units.assertUnitCanBeExecuted(htUnitApp);
}
@Test
/**
* Execution of LoopUnit should return true if multiple executions of the subUnit are possible.
*
* Unit: Loop
* Flags: -
* Case: Unit succeeds
*/
public void testLoopUnitMultipleLoopsSucceeds() {
loadEGraph("graphBefore_loopUnit");
loadUnit("loopUnitTest");
Units.assertUnitCanBeExecuted(htUnitApp);
int nodeNumber = htEGraph.getDomainSize(TestmodelPackage.Literals.NODE, true);
assertEquals(1, nodeNumber);
}
}