/******************************************************************************* * Copyright (c) 2006-2013 The RCP Company 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: * The RCP Company - initial API and implementation *******************************************************************************/ package com.rcpcompany.uibindings.extests.bindings; import static org.junit.Assert.*; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Text; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.rcpcompany.uibinding.tests.model.TestModelFactory; import com.rcpcompany.uibinding.tests.model.TestModelPackage; import com.rcpcompany.uibinding.tests.model.TestObject; import com.rcpcompany.uibindings.IBindingContext; import com.rcpcompany.uibindings.IBindingContextFinalizer; import com.rcpcompany.uibindings.IUIBindingsPackage; import com.rcpcompany.uibindings.tests.utils.BaseUIBTestUtils; import com.rcpcompany.uibindings.tests.utils.views.UIBTestView; import com.rcpcompany.uibindings.utils.IFormCreator; /** * Tests of {@link IBindingContextFinalizer}. * * @author Tonny Madsen, The RCP Company */ public class BindingContextFinalizerTest { private UIBTestView myView; private TestObject myTO; private IBindingContext myContext; @Before public void before() { myView = BaseUIBTestUtils.createUIBTestView(this); myTO = TestModelFactory.eINSTANCE.createTestObject(); } @After public void after() { myView.getSite().getPage().hideView(myView); } /** * Tests that the {@link IBindingContext#getFinalizers()} list is only created when needed. */ @Test public void testNone() { myContext = IBindingContext.Factory.createContext(myView.getBody()); final Text text1 = new Text(myView.getBody(), SWT.SINGLE | SWT.LEAD | SWT.BORDER); text1.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); text1.setText(""); myContext.addBinding(text1, myTO, TestModelPackage.Literals.TEST_OBJECT__NUMBER); myContext.finish(); assertFalse(myContext.eIsSet(IUIBindingsPackage.Literals.BINDING_CONTEXT__FINALIZERS)); } /** * Tests the use of the simple interface */ @Test public void testSimpleFalse() { testSimpleOne(false); } @Test public void testSimpleTrue() { testSimpleOne(true); } private void testSimpleOne(boolean remove) { myContext = IBindingContext.Factory.createContext(myView.getBody()); final Finalizer fin = new Finalizer(remove); myContext.getFinalizers().add(fin); assertEquals(0, fin.called); final Text text1 = new Text(myView.getBody(), SWT.SINGLE | SWT.LEAD | SWT.BORDER); text1.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); text1.setText(""); myContext.addBinding(text1, myTO, TestModelPackage.Literals.TEST_OBJECT__NUMBER); assertEquals(0, fin.called); myContext.finish(); assertEquals(1, fin.called); if (remove) { assertFalse(myContext.getFinalizers().contains(fin)); } else { assertTrue(myContext.getFinalizers().contains(fin)); } final Text text2 = new Text(myView.getBody(), SWT.SINGLE | SWT.LEAD | SWT.BORDER); text2.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); text2.setText(""); myContext.addBinding(text2, myTO, TestModelPackage.Literals.TEST_OBJECT__NUMBER); assertEquals(1, fin.called); myContext.finish(); if (remove) { assertEquals(1, fin.called); } else { assertEquals(2, fin.called); } } /** * Tests the use of {@link IFormCreator}. */ int formFinalizerCalled = 0; @Test public void testForm() { final IFormCreator form = myView.createFormCreator(myTO); myContext = form.getContext(); form.addFinalizer(new Runnable() { @Override public void run() { formFinalizerCalled++; } }); assertEquals(1, myContext.getFinalizers().size()); assertEquals(0, formFinalizerCalled); form.addField("number(w=100)"); assertEquals(0, formFinalizerCalled); myContext.finish(); assertEquals(1, formFinalizerCalled); assertEquals(0, myContext.getFinalizers().size()); form.addField("number(w=100)"); assertEquals(1, formFinalizerCalled); myContext.finish(); assertEquals(1, formFinalizerCalled); assertEquals(0, myContext.getFinalizers().size()); } public class Finalizer implements IBindingContextFinalizer { int called = 0; private final boolean myRemoveAfterRun; public Finalizer(boolean removeAfterRun) { myRemoveAfterRun = removeAfterRun; // TODO Auto-generated constructor stub } @Override public void run(IBindingContext context) { assertEquals(myContext, context); assertTrue(myContext.getFinalizers().contains(this)); called++; if (myRemoveAfterRun) { context.getFinalizers().remove(this); } } } }