/** * Copyright (c) 2014 - 2017 Frank Appel * 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: * Frank Appel - initial API and implementation */ package com.codeaffine.eclipse.swt.widget.scrollable.context; import static com.codeaffine.test.util.lang.ThrowableCaptor.thrownBy; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.mockito.Mockito.withSettings; import org.eclipse.swt.widgets.Composite; import org.junit.Before; import org.junit.Test; import org.mockito.InOrder; import com.codeaffine.eclipse.swt.widget.scrollable.ScrollbarStyle; public class ReconciliationTest { private VisibilityReconciliation visibliltyReconciliation; private EnablementReconciliation enablementReconciliation; private BoundsReconciliation boundsReconciliation; private LayoutReconciliation layoutReconciliation; private ColorReconciliation colorReconciliation; private Reconciliation reconciliation; @Before public void setUp() { visibliltyReconciliation = mock( VisibilityReconciliation.class ); enablementReconciliation = mock( EnablementReconciliation.class ); boundsReconciliation = mock( BoundsReconciliation.class ); layoutReconciliation = mock( LayoutReconciliation.class ); colorReconciliation = mock( ColorReconciliation.class ); reconciliation = new Reconciliation( visibliltyReconciliation, enablementReconciliation, boundsReconciliation, layoutReconciliation, colorReconciliation ); } @Test public void runWithSuspendedBoundsReconciliation() { Runnable runnable = mock( Runnable.class ); reconciliation.runWithSuspendedBoundsReconciliation( runnable ); verify( boundsReconciliation ).runSuspended( runnable ); } @Test public void setVisible() { boolean expected = true; when( visibliltyReconciliation.setVisible( expected ) ).thenReturn( expected ); boolean actual = reconciliation.setVisible( expected ); assertThat( actual ).isSameAs( expected ); } @Test public void setEnabled() { boolean expected = true; when( enablementReconciliation.setEnabled( expected ) ).thenReturn( expected ); boolean actual = reconciliation.setEnabled( expected ); assertThat( actual ).isSameAs( expected ); } @Test public void runWhileSuspended() { Runnable runnable = mock( Runnable.class ); reconciliation.runWhileSuspended( runnable ); InOrder order = order( runnable ); verifyActionsBeforeRunnableExcecution( order ); order.verify( runnable ).run(); verifyActionsAfterRunnableExcecution( order ); order.verifyNoMoreInteractions(); } @Test public void runWhileSuspendedWithProblemOnRunnableExecution() { RuntimeException expected = new RuntimeException(); Runnable runnable = stubRunnableWithProblem( expected ); Throwable actual = thrownBy( () -> reconciliation.runWhileSuspended( runnable ) ); InOrder order = order( runnable ); verifyActionsBeforeRunnableExcecution( order ); order.verify( runnable ).run(); verifyActionsAfterRunnableExcecution( order ); order.verifyNoMoreInteractions(); assertThat( actual ).isSameAs( expected ); } @Test public void castToScrollbarStyleIfPossible() { Composite expected = mock( Composite.class, withSettings().extraInterfaces( ScrollbarStyle.class ) ); ScrollbarStyle actual = Reconciliation.castToScrollbarStyleIfPossible( expected ); assertThat( actual ).isSameAs( expected ); } @Test public void castToScrollbarStyleIfNotPossible() { Composite composite = mock( Composite.class ); ScrollbarStyle actual = Reconciliation.castToScrollbarStyleIfPossible( composite ); assertThat( actual ).isNull(); } private InOrder order( Runnable runnable ) { return inOrder( runnable, boundsReconciliation, visibliltyReconciliation, enablementReconciliation, layoutReconciliation, colorReconciliation ); } private void verifyActionsBeforeRunnableExcecution( InOrder order ) { order.verify( boundsReconciliation ).suspend(); } private void verifyActionsAfterRunnableExcecution( InOrder order ) { order.verify( visibliltyReconciliation ).run(); order.verify( enablementReconciliation ).run(); order.verify( boundsReconciliation ).resume(); order.verify( boundsReconciliation ).run(); order.verify( layoutReconciliation ).run(); order.verify( colorReconciliation ).run(); } private static Runnable stubRunnableWithProblem( RuntimeException expected ) { Runnable result = mock( Runnable.class ); doThrow( expected ).when( result ).run(); return result; } }