package com.technophobia.substeps.util; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.jmock.Expectations; import org.jmock.Mockery; import org.jmock.Sequence; import org.jmock.integration.junit4.JMock; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import com.technophobia.substeps.supplier.Callback1; import com.technophobia.substeps.supplier.Predicate; @RunWith(JMock.class) public class TemporaryModelEnhancerTest { private Mockery context; private Callback1<String> enhancement; private Callback1<String> detraction; private ModelOperation<String> operation; private Predicate<String> enhancementRequiredPredicate; private TemporaryModelEnhancer<String> modelEnhancer; @SuppressWarnings("unchecked") @Before public void initialise() { this.context = new Mockery(); this.enhancement = context.mock(Callback1.class, "enhancement"); this.detraction = context.mock(Callback1.class, "detraction"); this.operation = context.mock(ModelOperation.class, "operation"); this.enhancementRequiredPredicate = context.mock(Predicate.class, "enhancementRequiredPredicate"); this.modelEnhancer = new TemporaryModelEnhancer<String>(enhancement, detraction, operation, enhancementRequiredPredicate); } @Test public void noEnhancementDetractionAppliedIfNotRequired() throws Exception { final Sequence sequence = context.sequence("executionSequence"); context.checking(new Expectations() { { oneOf(enhancementRequiredPredicate).forModel("test"); will(returnValue(false)); inSequence(sequence); oneOf(operation).doOperationOn("test"); inSequence(sequence); } }); modelEnhancer.doOperationFor("test"); } @Test public void enhancementAndDetractionAppliedIfRequired() throws Exception { final Sequence sequence = context.sequence("executionSequence"); context.checking(new Expectations() { { oneOf(enhancementRequiredPredicate).forModel("test"); will(returnValue(true)); inSequence(sequence); oneOf(enhancement).doCallback("test"); inSequence(sequence); oneOf(operation).doOperationOn("test"); inSequence(sequence); oneOf(detraction).doCallback("test"); inSequence(sequence); } }); modelEnhancer.doOperationFor("test"); } @Test(expected = CoreException.class) public void detractionAppliedEvenIfExceptionOccurs() throws Exception { final Sequence sequence = context.sequence("executionSequence"); context.checking(new Expectations() { { oneOf(enhancementRequiredPredicate).forModel("test"); will(returnValue(true)); inSequence(sequence); oneOf(enhancement).doCallback("test"); inSequence(sequence); oneOf(operation).doOperationOn("test"); will(throwException(new CoreException(new Status(IStatus.ERROR, "plugin", "Message")))); inSequence(sequence); oneOf(detraction).doCallback("test"); inSequence(sequence); } }); modelEnhancer.doOperationFor("test"); } }