Skip to content

Content of file DelegatingDomainModelReferenceConverter_PTest.java

/*******************************************************************************
 * Copyright (c) 2019 Christian W. Damus and others.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 * Christian W. Damus - initial API and implementation
 ******************************************************************************/
package org.eclipse.emfforms.swt.internal.reference.table;

import static org.eclipse.emfforms.spi.core.services.databinding.DomainModelReferenceConverter.NOT_APPLICABLE;
import static org.hamcrest.CoreMatchers.hasItem;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.not;
import static org.junit.Assert.assertThat;

import java.util.Arrays;

import org.eclipse.core.databinding.observable.IObservable;
import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.databinding.property.list.IListProperty;
import org.eclipse.core.databinding.property.value.IValueProperty;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.ENamedElement;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.ETypedElement;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecp.test.common.DefaultRealm;
import org.eclipse.emf.ecp.view.spi.model.VDomainModelReference;
import org.eclipse.emf.ecp.view.spi.model.VFeaturePathDomainModelReference;
import org.eclipse.emf.ecp.view.spi.model.VViewFactory;
import org.eclipse.emfforms.spi.core.services.databinding.DatabindingFailedException;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

/**
 * Test cases for the {@link DelegatingDomainModelReferenceConverter} class.
 */
public class DelegatingDomainModelReferenceConverter_PTest {

	private DefaultRealm realm;

	private EPackage textPackage;
	private EClass text;
	private EAttribute segments;

	private EObject doc1;
	private EObject doc2;

	private VFeaturePathDomainModelReference segmentsDMR;
	private DelegatingDomainModelReferenceConverter fixture;

	private VFeaturePathDomainModelReference ecoreNameDMR;

	private IObservable observable;

	/**
	 * Initializes me.
	 */
	public DelegatingDomainModelReferenceConverter_PTest() {
		super();
	}

	@Test
	public void isApplicable() {
		assertThat("Should be applicable", fixture.isApplicable(segmentsDMR), not(NOT_APPLICABLE));

		final VDomainModelReference other = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
		segmentsDMR.setDomainModelEFeature(EcorePackage.Literals.ECLASS__ESUPER_TYPES);
		assertThat("Should not be applicable", fixture.isApplicable(other), is(NOT_APPLICABLE));
	}

	@Test
	public void convertToListProperty() throws DatabindingFailedException {
		@SuppressWarnings("unchecked")
		final IListProperty<EObject, String> property = fixture.convertToListProperty(segmentsDMR, doc2);

		final IObservableList<String> list = property.observe(doc2);
		observable = list;
		assertThat(list.getElementType(), is(segments));
		assertThat(list, hasItem("world"));

		list.set(0, "Goodbye");

		assertThat(doc1.eGet(segments), is(Arrays.asList("Goodbye", "world")));
	}

	@Test
	public void convertToValueProperty_EObject() throws DatabindingFailedException {
		createFixture(ecoreNameDMR, text);

		@SuppressWarnings("unchecked")
		final IValueProperty<ENamedElement, String> property = fixture.convertToValueProperty(ecoreNameDMR,
			EcorePackage.Literals.EOBJECT, null);

		// If this doesn't work, Ecore package is frozen, so it will throw on attempt to change the
		// name of the EObject EClass
		final IObservableValue<String> value = property.observe(EcorePackage.Literals.EOBJECT);
		observable = value;

		assertThat(value.getValueType(), is(EcorePackage.Literals.ENAMED_ELEMENT__NAME));
assertThat(value.getValue(), is("Text")); value.setValue("Document"); assertThat(text.getName(), is("Document")); // Just in case ;-) assertThat(EcorePackage.Literals.EOBJECT.getName(), not("Document")); } @Test public void convertToValueProperty_EClass_EditingDomain() throws DatabindingFailedException { createFixture(ecoreNameDMR, text); @SuppressWarnings("unchecked") final IValueProperty<ENamedElement, String> property = fixture.convertToValueProperty(ecoreNameDMR, EcorePackage.Literals.ECLASS, null); // The editing domain is not used // If this doesn't work, Ecore package is frozen, so it will throw on attempt to change the // name of the EObject EClass final IObservableValue<String> value = property.observe(EcorePackage.Literals.EOBJECT); observable = value; assertThat(value.getValueType(), is(EcorePackage.Literals.ENAMED_ELEMENT__NAME)); assertThat(value.getValue(), is("Text")); value.setValue("Document"); assertThat(text.getName(), is("Document")); // Just in case ;-) assertThat(EcorePackage.Literals.EOBJECT.getName(), not("Document")); } @Test public void getSetting() throws DatabindingFailedException { final EStructuralFeature.Setting setting = fixture.getSetting(segmentsDMR, doc2); assertThat("Wrong feature", setting.getEStructuralFeature(), is(segments)); assertThat("Wrong owner", setting.getEObject(), is(doc1)); } // // Test framework // @Before public void createRealm() { realm = new DefaultRealm(); } @Before public void createFixture() { textPackage = EcoreFactory.eINSTANCE.createEPackage(); textPackage.setName("text"); textPackage.setNsURI("http://text"); text = EcoreFactory.eINSTANCE.createEClass(); text.setName("Text"); textPackage.getEClassifiers().add(text); segments = EcoreFactory.eINSTANCE.createEAttribute(); segments.setName("segments"); segments.setEType(EcorePackage.Literals.ESTRING); segments.setLowerBound(1); segments.setUpperBound(ETypedElement.UNBOUNDED_MULTIPLICITY); text.getEStructuralFeatures().add(segments); doc1 = EcoreUtil.create(text); doc1.eSet(segments, Arrays.asList("Hello", "world")); doc2 = EcoreUtil.create(text); doc2.eSet(segments, Arrays.asList("This", "is", "a", "test")); segmentsDMR = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); segmentsDMR.setDomainModelEFeature(segments); createFixture(segmentsDMR, doc1); ecoreNameDMR = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); ecoreNameDMR.setDomainModelEFeature(EcorePackage.Literals.ENAMED_ELEMENT__NAME); } @After public void destroyRealm() { if (observable != null) { observable.dispose(); } realm.dispose(); } void createFixture(VFeaturePathDomainModelReference dmr, EObject delegate) { fixture = new DelegatingDomainModelReferenceConverter(dmr, __ -> delegate); } }