Skip to content

Content of file ViewValidation_PTest.java

/*******************************************************************************
 * Copyright (c) 2011-2019 EclipseSource Muenchen GmbH 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:
 * Eugen Neufeld - initial API and implementation
 * Christian W. Damus - bugs 545686, 548761
 ******************************************************************************/
package org.eclipse.emf.ecp.view.validation.test;

import static java.util.stream.Collectors.toList;
import static org.eclipse.emf.ecp.view.spi.validation.ValidationServiceConstants.PROPAGATION_LIMIT_KEY;
import static org.hamcrest.CoreMatchers.everyItem;
import static org.hamcrest.CoreMatchers.hasItem;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.stream.Stream;

import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecp.test.common.DefaultRealm;
import org.eclipse.emf.ecp.view.spi.context.GlobalViewModelService;
import org.eclipse.emf.ecp.view.spi.context.ViewModelContext;
import org.eclipse.emf.ecp.view.spi.context.ViewModelContextFactory;
import org.eclipse.emf.ecp.view.spi.model.VControl;
import org.eclipse.emf.ecp.view.spi.model.VDiagnostic;
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.VView;
import org.eclipse.emf.ecp.view.spi.model.VViewFactory;
import org.eclipse.emf.ecp.view.spi.table.model.VTableControl;
import org.eclipse.emf.ecp.view.spi.table.model.VTableDomainModelReference;
import org.eclipse.emf.ecp.view.spi.table.model.VTableFactory;
import org.eclipse.emf.ecp.view.spi.validation.ValidationService;
import org.eclipse.emf.ecp.view.spi.validation.ValidationUpdateListener;
import org.eclipse.emf.ecp.view.spi.validation.ViewValidationListener;
import org.eclipse.emf.ecp.view.spi.vertical.model.VVerticalFactory;
import org.eclipse.emf.ecp.view.spi.vertical.model.VVerticalLayout;
import org.eclipse.emf.ecp.view.validation.test.model.Computer;
import org.eclipse.emf.ecp.view.validation.test.model.Container;
import org.eclipse.emf.ecp.view.validation.test.model.Content;
import org.eclipse.emf.ecp.view.validation.test.model.Library;
import org.eclipse.emf.ecp.view.validation.test.model.Mainboard;
import org.eclipse.emf.ecp.view.validation.test.model.PowerBlock;
import org.eclipse.emf.ecp.view.validation.test.model.Referencer;
import org.eclipse.emf.ecp.view.validation.test.model.TestFactory;
import org.eclipse.emf.ecp.view.validation.test.model.TestPackage;
import org.eclipse.emf.ecp.view.validation.test.model.Writer;
import org.eclipse.emfforms.spi.core.services.view.EMFFormsViewContext;
import org.eclipse.emfforms.spi.core.services.view.EMFFormsViewServiceFactory;
import org.eclipse.emfforms.spi.core.services.view.EMFFormsViewServicePolicy;
import org.eclipse.emfforms.spi.core.services.view.EMFFormsViewServiceScope;
import org.hamcrest.CustomTypeSafeMatcher;
import org.hamcrest.Matcher;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;

/**
 * @author Eugen Neufeld
 * @author emueller
 */

public class ViewValidation_PTest extends CommonValidationTest {

	private DefaultRealm defaultRealm;

	//
	// Test framework
	//

	@Before
	public void setup() {
		defaultRealm = new DefaultRealm();
	}

	@After
	public void tearDown() {
		defaultRealm.dispose();
	}

	static Matcher<Diagnostic> isOK() {
		return new CustomTypeSafeMatcher<Diagnostic>("is OK") {
			@Override
			protected boolean matchesSafely(Diagnostic item) {
				return item.getSeverity() == Diagnostic.OK;
			}
		};
	}

	static Matcher<Diagnostic> isError() {
		return new CustomTypeSafeMatcher<Diagnostic>("is error") {
			@Override
			protected boolean matchesSafely(Diagnostic item) {
				return item.getSeverity() == Diagnostic.ERROR;
			}
		};
	}

	//
	// Tests
	//

	@Test
	public void testValidationMissingElementOnInit() {
		final Computer computer = TestFactory.eINSTANCE.createComputer();
		computer.setName("bla");
		final VControl control = VViewFactory.eINSTANCE.createControl();

		control.setDomainModelReference(getVFeaturePathDomainModelReference(TestPackage.eINSTANCE.getMainboard_Name(),
			TestPackage.eINSTANCE.getComputer_Mainboard()));
		ViewModelContextFactory.INSTANCE.createViewModelContext(control, computer);

		assertEquals("Severity must be error", Diagnostic.ERROR, control.getDiagnostic().getHighestSeverity());
	}

	@Test
	public void testValidationMissingElementSetValueAfterInit() {
		final Computer computer = TestFactory.eINSTANCE.createComputer();
		computer.setName("bla");
		final VControl control = VViewFactory.eINSTANCE.createControl();

		control.setDomainModelReference(getVFeaturePathDomainModelReference(TestPackage.eINSTANCE.getMainboard_Name(),
			TestPackage.eINSTANCE.getComputer_Mainboard()));
		ViewModelContextFactory.INSTANCE.createViewModelContext(control, computer);
		computer.getMainboard().setName("bla");
		assertEquals("Severity must be ok", Diagnostic.OK, control.getDiagnostic().getHighestSeverity());
	}

	private VDomainModelReference getVTableDomainModelReference(EStructuralFeature feature,
		EReference... eReferences) {
		final VTableDomainModelReference result = VTableFactory.eINSTANCE.createTableDomainModelReference();
		result.setDomainModelEFeature(feature);
		result.getDomainModelEReferencePath().addAll(Arrays.asList(eReferences));
		return result;
	}

	@Test
	public void testValidationInitOk() {
		final Computer computer = TestFactory.eINSTANCE.createComputer();
		computer.setName("bla");
		final VControl control = VViewFactory.eINSTANCE.createControl();

		control.setDomainModelReference(
			getVFeaturePathDomainModelReference(TestPackage.eINSTANCE.getComputer_Name()));
		ViewModelContextFactory.INSTANCE.createViewModelContext(control, computer);

		assertEquals("Severity must be ok", Diagnostic.OK, control.getDiagnostic().getHighestSeverity());
	}

	@Test
	public void testValidationSameFeature() {
		final Mainboard mainboard = TestFactory.eINSTANCE.createMainboard();
		final PowerBlock powerBlock = TestFactory.eINSTANCE.createPowerBlock();
		final Computer computer = TestFactory.eINSTANCE.createComputer();
		computer.setMainboard(mainboard);
		computer.setPowerBlock(powerBlock);

		final VView view = VViewFactory.eINSTANCE.createView();
		final VControl powerBlockControl = VViewFactory.eINSTANCE.createControl();
		final VControl mainboardControl = VViewFactory.eINSTANCE.createControl();
		view.getChildren().add(powerBlockControl);
		view.getChildren().add(mainboardControl);

		powerBlockControl.setDomainModelReference(
			getVFeaturePathDomainModelReference(TestPackage.eINSTANCE.getPowerBlock_Name(),
				TestPackage.eINSTANCE.getComputer_PowerBlock()));

		mainboardControl.setDomainModelReference(
			getVFeaturePathDomainModelReference(TestPackage.eINSTANCE.getMainboard_Name(),
				TestPackage.eINSTANCE.getComputer_Mainboard()));

		ViewModelContextFactory.INSTANCE.createViewModelContext(view, computer);

		mainboard.setName("foo");

		assertEquals("Severity must be ok", Diagnostic.OK,
			mainboardControl.getDiagnostic().getHighestSeverity());
		assertEquals("Severity must be error", Diagnostic.ERROR,
			powerBlockControl.getDiagnostic().getHighestSeverity());
		assertEquals("Severity must be error", Diagnostic.ERROR,
			view.getDiagnostic().getHighestSeverity());
	}

	@Test
	public void testValidationInitDisabledControlOk() {
		final Computer computer = TestFactory.eINSTANCE.createComputer();
		computer.setName("bla");
		final VControl control = VViewFactory.eINSTANCE.createControl();
		control.setEnabled(false);

		control.setDomainModelReference(
			getVFeaturePathDomainModelReference(TestPackage.eINSTANCE.getComputer_Name()));
		ViewModelContextFactory.INSTANCE.createViewModelContext(control, computer);
		assertNull(control.getDiagnostic());
	}

	@Test
	public void testValidationInitHiddenControlError() {
		final Computer computer = TestFactory.eINSTANCE.createComputer();
		final VControl control = VViewFactory.eINSTANCE.createControl();
		control.setVisible(false);

		control.setDomainModelReference(
			getVFeaturePathDomainModelReference(TestPackage.eINSTANCE.getComputer_Name()));
		ViewModelContextFactory.INSTANCE.createViewModelContext(control, computer);
		assertNull(control.getDiagnostic());
	}

	@Test
	public void testValidationDisabledControlOk() {
		final Computer computer = TestFactory.eINSTANCE.createComputer();
		final VControl control = VViewFactory.eINSTANCE.createControl();

		control.setDomainModelReference(
			getVFeaturePathDomainModelReference(TestPackage.eINSTANCE.getComputer_Name()));
		ViewModelContextFactory.INSTANCE.createViewModelContext(control, computer);
		assertEquals("Severity must be Error", Diagnostic.ERROR, control.getDiagnostic().getHighestSeverity());
		control.setEnabled(false);
		assertNull(control.getDiagnostic());

	}

	@Test
	public void testValidationHiddenControlOk() {
		final Computer computer = TestFactory.eINSTANCE.createComputer();
		computer.setName("bla");
		final VControl control = VViewFactory.eINSTANCE.createControl();

		control.setDomainModelReference(
			getVFeaturePathDomainModelReference(TestPackage.eINSTANCE.getComputer_Name()));
		ViewModelContextFactory.INSTANCE.createViewModelContext(control, computer);
		control.setVisible(false);

		assertEquals("Severity must be ok", Diagnostic.OK, control.getDiagnostic().getHighestSeverity());
	}

	@Test
	public void testValidationInitHiddenControlOk() {
		final Computer computer = TestFactory.eINSTANCE.createComputer();
		computer.setName("bla");
		final VControl control = VViewFactory.eINSTANCE.createControl();

		control.setDomainModelReference(
			getVFeaturePathDomainModelReference(TestPackage.eINSTANCE.getComputer_Name()));
		ViewModelContextFactory.INSTANCE.createViewModelContext(control, computer);

		assertEquals("Severity must be ok", Diagnostic.OK, control.getDiagnostic().getHighestSeverity());
	}

	@Test
	public void testValidationInitError() {
		final Computer computer = TestFactory.eINSTANCE.createComputer();
		final VControl control = VViewFactory.eINSTANCE.createControl();
		control.setDomainModelReference(
			getVFeaturePathDomainModelReference(TestPackage.eINSTANCE.getComputer_Name()));

		ViewModelContextFactory.INSTANCE.createViewModelContext(control, computer);

		assertEquals("Severity must be error", Diagnostic.ERROR, control.getDiagnostic().getHighestSeverity());
	}

	@Test
	public void testValidationInitAggregation() {
		final Computer computer = TestFactory.eINSTANCE.createComputer();
		computer.setName("bla");
		final PowerBlock power = TestFactory.eINSTANCE.createPowerBlock();
		power.setName("bla");
		final Mainboard board = TestFactory.eINSTANCE.createMainboard();
		computer.setMainboard(board);
		computer.setPowerBlock(power);

		final VView view = VViewFactory.eINSTANCE.createView();
		final VControl controlPower = VViewFactory.eINSTANCE.createControl();
		controlPower.setDomainModelReference(getVFeaturePathDomainModelReference(
			TestPackage.eINSTANCE.getPowerBlock_Name(), TestPackage.eINSTANCE.getComputer_PowerBlock()));

		final VControl controlBoard = VViewFactory.eINSTANCE.createControl();
		controlBoard.setDomainModelReference(getVFeaturePathDomainModelReference(
			TestPackage.eINSTANCE.getMainboard_Name(), TestPackage.eINSTANCE.getComputer_Mainboard()));

		view.getChildren().add(controlBoard);
		view.getChildren().add(controlPower);

		ViewModelContextFactory.INSTANCE.createViewModelContext(view, computer);

		assertEquals("Severity of mainboard must be error", Diagnostic.ERROR, controlBoard.getDiagnostic()
			.getHighestSeverity());
		assertEquals("Severity of power must be ok", Diagnostic.OK, controlPower.getDiagnostic().getHighestSeverity());
		assertEquals("Severity of view must be ok", Diagnostic.ERROR, view.getDiagnostic().getHighestSeverity());
	}

	@Test
	public void testValidationInitPropagation1LevelOk() {
		final Computer computer = TestFactory.eINSTANCE.createComputer();
		computer.setName("bla");
		final VVerticalLayout column = VVerticalFactory.eINSTANCE.createVerticalLayout();
		final VControl control = VViewFactory.eINSTANCE.createControl();

		control.setDomainModelReference(
			getVFeaturePathDomainModelReference(TestPackage.eINSTANCE.getComputer_Name()));
		column.getChildren().add(control);

		ViewModelContextFactory.INSTANCE.createViewModelContext(column, computer);

		assertEquals("Severity of control must be ok", Diagnostic.OK, control.getDiagnostic().getHighestSeverity());
		assertEquals("Severity of column must be ok", Diagnostic.OK, column.getDiagnostic().getHighestSeverity());
	}

	@Test
	public void testValidationInitPropagation1LevelError() {
		final Computer computer = TestFactory.eINSTANCE.createComputer();

		final VVerticalLayout column = VVerticalFactory.eINSTANCE.createVerticalLayout();
		final VControl control = VViewFactory.eINSTANCE.createControl();
		control.setDomainModelReference(
			getVFeaturePathDomainModelReference(TestPackage.eINSTANCE.getComputer_Name()));

		column.getChildren().add(control);

		ViewModelContextFactory.INSTANCE.createViewModelContext(column, computer);

		assertEquals("Severity of control must be error", Diagnostic.ERROR, control.getDiagnostic()
			.getHighestSeverity());
		assertEquals("Severity of column must be error", Diagnostic.ERROR, column.getDiagnostic().getHighestSeverity());
	}

	@Test
	public void testValidationInitPropagation2LevelOk() {
		final Computer computer = TestFactory.eINSTANCE.createComputer();
		computer.setName("bla");
		final VView view = VViewFactory.eINSTANCE.createView();
		final VVerticalLayout column = VVerticalFactory.eINSTANCE.createVerticalLayout();
		final VControl control = VViewFactory.eINSTANCE.createControl();
		control.setDomainModelReference(
			getVFeaturePathDomainModelReference(TestPackage.eINSTANCE.getComputer_Name()));

		column.getChildren().add(control);
		view.getChildren().add(column);

		ViewModelContextFactory.INSTANCE.createViewModelContext(view, computer);

		assertEquals("Severity of control must be ok", Diagnostic.OK, control.getDiagnostic().getHighestSeverity());
		assertEquals("Severity of column must be ok", Diagnostic.OK, column.getDiagnostic().getHighestSeverity());
		assertEquals("Severity of view must be ok", Diagnostic.OK, view.getDiagnostic().getHighestSeverity());
	}

	@Test
	public void testValidationInitPropagation2LevelError() {
		final Computer computer = TestFactory.eINSTANCE.createComputer();

		final VView view = VViewFactory.eINSTANCE.createView();

		final VVerticalLayout column = VVerticalFactory.eINSTANCE.createVerticalLayout();
		final VControl control = VViewFactory.eINSTANCE.createControl();
		control.setDomainModelReference(
			getVFeaturePathDomainModelReference(TestPackage.eINSTANCE.getComputer_Name()));

		column.getChildren().add(control);
		view.getChildren().add(column);

		ViewModelContextFactory.INSTANCE.createViewModelContext(view, computer);

		assertEquals("Severity of control must be error", Diagnostic.ERROR, control.getDiagnostic()
			.getHighestSeverity());
		assertEquals("Severity of column must be error", Diagnostic.ERROR, column.getDiagnostic().getHighestSeverity());
		assertEquals("Severity of view must be error", Diagnostic.ERROR, view.getDiagnostic().getHighestSeverity());
	}

	/**
	 * Test the limiting of validation propagation by annotation.
	 */
	@Test
	public void testValidationInitPropagation_limited() {
		final List<Computer> computers = Stream.generate(TestFactory.eINSTANCE::createComputer)
			.limit(3L).collect(toList());

		final Map<String, Object> contextValues = Collections.singletonMap(PROPAGATION_LIMIT_KEY, 1);

		final VView view = VViewFactory.eINSTANCE.createView();
		final VVerticalLayout column = VVerticalFactory.eINSTANCE.createVerticalLayout();
		view.getChildren().add(column);

		computers.forEach(c -> {
			final VControl control = VViewFactory.eINSTANCE.createControl();
			control.setDomainModelReference(
				getVFeaturePathDomainModelReference(TestPackage.eINSTANCE.getComputer_Name()));
			column.getChildren().add(control);
			ViewModelContextFactory.INSTANCE.createViewModelContext(control, c, contextValues);
		});

		final VDiagnostic columnDiagnostic = column.getDiagnostic();
		assertThat("Severity of column must be error", columnDiagnostic.getHighestSeverity(), is(Diagnostic.ERROR));
		// But we only propagated one error, plus the one that indicates more
		assertThat("Wrong number of problems", columnDiagnostic.getDiagnostics().size(), is(2));
		final Diagnostic additional = columnDiagnostic.getDiagnostics().stream()
			.filter(Diagnostic.class::isInstance).map(Diagnostic.class::cast)
			.filter(d -> d.getMessage() != null)
			.filter(d -> d.getMessage().startsWith("Additional problems"))
			.findAny().orElse(null);
		assertThat("No placeholder for additional problems", additional, notNullValue());
		assertThat("Placehold is not an error", additional.getSeverity(), is(Diagnostic.ERROR));
} @Test public void testValidationChangeOkToError() { final Computer computer = TestFactory.eINSTANCE.createComputer(); computer.setName("bla"); final VControl control = VViewFactory.eINSTANCE.createControl(); control.setDomainModelReference( getVFeaturePathDomainModelReference(TestPackage.eINSTANCE.getComputer_Name())); ViewModelContextFactory.INSTANCE.createViewModelContext(control, computer); computer.setName(null); assertEquals("Severity must be error", Diagnostic.ERROR, control.getDiagnostic().getHighestSeverity()); } @Test public void testValidationChangeErrorToOk() { final Computer computer = TestFactory.eINSTANCE.createComputer(); final VControl control = VViewFactory.eINSTANCE.createControl(); control.setDomainModelReference( getVFeaturePathDomainModelReference(TestPackage.eINSTANCE.getComputer_Name())); ViewModelContextFactory.INSTANCE.createViewModelContext(control, computer); computer.setName("bla"); assertEquals("Severity must be ok", Diagnostic.OK, control.getDiagnostic().getHighestSeverity()); } @Test public void testValidationPropagationChangeOkToError() { final Computer computer = TestFactory.eINSTANCE.createComputer(); computer.setName("bla"); final VView view = VViewFactory.eINSTANCE.createView(); final VControl control = VViewFactory.eINSTANCE.createControl(); control.setDomainModelReference( getVFeaturePathDomainModelReference(TestPackage.eINSTANCE.getComputer_Name())); view.getChildren().add(control); ViewModelContextFactory.INSTANCE.createViewModelContext(view, computer); computer.setName(null); assertEquals("Severity of control must be error", Diagnostic.ERROR, control.getDiagnostic() .getHighestSeverity()); assertEquals("Severity of view must be error", Diagnostic.ERROR, view.getDiagnostic().getHighestSeverity()); } @Test public void testValidationPropagationChangeErrorTokWithErrorControlInBackground() { final Writer writer = TestFactory.eINSTANCE.createWriter(); writer.setLastName("foo"); final VView view = VViewFactory.eINSTANCE.createView(); final VControl firstNameControl = VViewFactory.eINSTANCE.createControl(); final VControl lastNameControl = VViewFactory.eINSTANCE.createControl(); firstNameControl.setDomainModelReference( getVFeaturePathDomainModelReference(TestPackage.eINSTANCE.getWriter_FirstName())); lastNameControl.setDomainModelReference( getVFeaturePathDomainModelReference(TestPackage.eINSTANCE.getWriter_LastName())); view.getChildren().add(firstNameControl); view.getChildren().add(lastNameControl); ViewModelContextFactory.INSTANCE.createViewModelContext(view, writer); // first name is null -> ERR, last name is 'foo' -> ERR assertEquals("Severity of control must be error", Diagnostic.ERROR, firstNameControl.getDiagnostic() .getHighestSeverity()); assertEquals("Severity of view must be error", Diagnostic.ERROR, lastNameControl.getDiagnostic() .getHighestSeverity()); writer.setLastName("hello!"); assertEquals("Severity of firstname control must be error", Diagnostic.ERROR, firstNameControl.getDiagnostic() .getHighestSeverity()); assertEquals("Severity of lastname control must be ok", Diagnostic.OK, lastNameControl.getDiagnostic() .getHighestSeverity()); } @Test public void testValidationPropagationChangeErrorTokWithErrorTableControlInBackground() { final Library lib = TestFactory.eINSTANCE.createLibrary(); lib.setName("bla"); final Writer writer = TestFactory.eINSTANCE.createWriter(); lib.getWriters().add(writer); writer.setLastName("foo"); final VView view = VViewFactory.eINSTANCE.createView(); final VTableControl control = VTableFactory.eINSTANCE.createTableControl(); control .setDomainModelReference( getVTableDomainModelReference(TestPackage.eINSTANCE.getLibrary_Writers())); final VFeaturePathDomainModelReference tc = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); tc.setDomainModelEFeature(TestPackage.eINSTANCE.getWriter_FirstName()); VTableDomainModelReference.class.cast(control.getDomainModelReference()).getColumnDomainModelReferences() .add(tc); final VTableControl control2 = VTableFactory.eINSTANCE.createTableControl(); control2 .setDomainModelReference( getVTableDomainModelReference(TestPackage.eINSTANCE.getLibrary_Writers())); final VFeaturePathDomainModelReference tc2 = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); tc2.setDomainModelEFeature(TestPackage.eINSTANCE.getWriter_LastName()); VTableDomainModelReference.class.cast(control2.getDomainModelReference()).getColumnDomainModelReferences() .add(tc2); view.getChildren().add(control); view.getChildren().add(control2); ViewModelContextFactory.INSTANCE.createViewModelContext(view, lib); // first name is null -> ERR, last name is 'foo' -> ERR assertEquals("Severity of control must be error", Diagnostic.ERROR, control.getDiagnostic() .getHighestSeverity()); assertEquals("Severity of view must be error", Diagnostic.ERROR, control2.getDiagnostic() .getHighestSeverity()); writer.setLastName("hello!"); assertEquals("Severity of control must be error", Diagnostic.ERROR, control.getDiagnostic() .getHighestSeverity()); assertEquals("Severity of view must be ok", Diagnostic.OK, control2.getDiagnostic().getHighestSeverity()); } @Test public void testValidationPropagationChangeErrorToOk() { final Computer computer = TestFactory.eINSTANCE.createComputer(); final VView view = VViewFactory.eINSTANCE.createView(); final VControl control = VViewFactory.eINSTANCE.createControl(); control.setDomainModelReference( getVFeaturePathDomainModelReference(TestPackage.eINSTANCE.getComputer_Name())); view.getChildren().add(control); ViewModelContextFactory.INSTANCE.createViewModelContext(view, computer); computer.setName("bla"); assertEquals("Severity of control must be ok", Diagnostic.OK, control.getDiagnostic().getHighestSeverity()); assertEquals("Severity of view must be ok", Diagnostic.OK, control.getDiagnostic().getHighestSeverity()); } // TODO fails as the control creates all intermediate domain objects it needs and registers with them, thus the // added object is not recognized during validation and the validation is not successful. // In order to allow the dynamic behavior on normal controls, each control has to know its domain object directly @Test public void testValidationDynamicExtension() { final Computer computer = TestFactory.eINSTANCE.createComputer(); computer.setName("bla"); final VView view = VViewFactory.eINSTANCE.createView(); ViewModelContextFactory.INSTANCE.createViewModelContext(view, computer); final VControl control = VViewFactory.eINSTANCE.createControl(); control.setDomainModelReference( getVFeaturePathDomainModelReference(TestPackage.eINSTANCE.getMainboard_Name(), TestPackage.eINSTANCE.getComputer_Mainboard())); view.getChildren().add(control); // TODO // final Mainboard mainboard = TestFactory.eINSTANCE.createMainboard(); // computer.setMainboard(mainboard); assertEquals("Severity of mainboard name must be error", Diagnostic.ERROR, control.getDiagnostic() .getHighestSeverity()); } @Test public void testValidationDynamicExtensionWithAlreadyInvalidDomainElement() { final Computer computer = TestFactory.eINSTANCE.createComputer(); computer.setName("bla"); final VView view = VViewFactory.eINSTANCE.createView(); ViewModelContextFactory.INSTANCE.createViewModelContext(view, computer); final VControl control = VViewFactory.eINSTANCE.createControl(); control.setDomainModelReference( getVFeaturePathDomainModelReference(TestPackage.eINSTANCE.getMainboard_Name(), TestPackage.eINSTANCE.getComputer_Mainboard())); final Mainboard mainboard = TestFactory.eINSTANCE.createMainboard(); computer.setMainboard(mainboard); view.getChildren().add(control); assertEquals("Severity of mainboard name must be error", Diagnostic.ERROR, control.getDiagnostic() .getHighestSeverity()); } @Test public void testValidationDynamicRemove() { final Computer computer = TestFactory.eINSTANCE.createComputer(); computer.setName("bla"); final VView view = VViewFactory.eINSTANCE.createView(); ViewModelContextFactory.INSTANCE.createViewModelContext(view, computer); final VControl control = VViewFactory.eINSTANCE.createControl(); control.setDomainModelReference( getVFeaturePathDomainModelReference(TestPackage.eINSTANCE.getMainboard_Name(), TestPackage.eINSTANCE.getComputer_Mainboard())); view.getChildren().add(control); // TODO // final Mainboard mainboard = TestFactory.eINSTANCE.createMainboard(); // computer.setMainboard(mainboard); assertEquals("Severity of mainboard name must be error", Diagnostic.ERROR, view.getDiagnostic() .getHighestSeverity()); view.getChildren().remove(control); assertEquals("Severity of mainboard name must be ok", Diagnostic.OK, view.getDiagnostic() .getHighestSeverity()); } @Test public void testValidationDynamicExtension2Level() { final Library library = TestFactory.eINSTANCE.createLibrary(); final Writer writer = TestFactory.eINSTANCE.createWriter(); library.getWriters().add(writer); final VView view = VViewFactory.eINSTANCE.createView(); ViewModelContextFactory.INSTANCE.createViewModelContext(view, library); final VTableControl control = VTableFactory.eINSTANCE.createTableControl(); control.setDomainModelReference( getVTableDomainModelReference(TestPackage.eINSTANCE.getLibrary_Writers())); final VFeaturePathDomainModelReference tc = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); tc.setDomainModelEFeature(TestPackage.eINSTANCE.getWriter_FirstName()); VTableDomainModelReference.class.cast(control.getDomainModelReference()).getColumnDomainModelReferences() .add(tc); final VVerticalLayout column = VVerticalFactory.eINSTANCE.createVerticalLayout(); column.getChildren().add(control); view.getChildren().add(column); assertEquals("Severity of table must be error", Diagnostic.ERROR, control.getDiagnostic() .getHighestSeverity()); assertEquals("Severity of column must be error", Diagnostic.ERROR, column.getDiagnostic() .getHighestSeverity()); assertEquals("Severity of view must be error", Diagnostic.ERROR, view.getDiagnostic() .getHighestSeverity()); writer.setFirstName("hello!"); assertEquals("Severity of table must be ok", Diagnostic.OK, control.getDiagnostic() .getHighestSeverity()); assertEquals("Severity of column must be ok", Diagnostic.OK, column.getDiagnostic() .getHighestSeverity()); assertEquals("Severity of view must be ok", Diagnostic.OK, view.getDiagnostic() .getHighestSeverity()); } @Test public void testValidationTableControl() { final Library lib = TestFactory.eINSTANCE.createLibrary(); lib.setName("bla"); final VView view = VViewFactory.eINSTANCE.createView(); final VTableControl control = VTableFactory.eINSTANCE.createTableControl(); view.getChildren().add(control); control .setDomainModelReference( getVTableDomainModelReference(TestPackage.eINSTANCE.getLibrary_Writers())); ViewModelContextFactory.INSTANCE.createViewModelContext(view, lib); assertEquals("Severity of table must be error", Diagnostic.ERROR, control.getDiagnostic().getHighestSeverity()); } @Test public void testValidationTableControlChildren() { final Library lib = TestFactory.eINSTANCE.createLibrary(); lib.setName("bla"); final Writer writer = TestFactory.eINSTANCE.createWriter(); lib.getWriters().add(writer); final VView view = VViewFactory.eINSTANCE.createView(); final VTableControl control = VTableFactory.eINSTANCE.createTableControl(); view.getChildren().add(control); control .setDomainModelReference( getVTableDomainModelReference(TestPackage.eINSTANCE.getLibrary_Writers())); final VFeaturePathDomainModelReference tc = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); tc.setDomainModelEFeature(TestPackage.eINSTANCE.getWriter_FirstName()); VTableDomainModelReference.class.cast(control.getDomainModelReference()).getColumnDomainModelReferences() .add(tc); ViewModelContextFactory.INSTANCE.createViewModelContext(view, lib); assertEquals("Severity of table must be error", Diagnostic.ERROR, control.getDiagnostic().getHighestSeverity()); } @Test public void testValidationTableControlChildrenTwoEntries() { final Library lib = TestFactory.eINSTANCE.createLibrary(); lib.setName("bla"); final Writer writer = TestFactory.eINSTANCE.createWriter(); lib.getWriters().add(writer); final Writer writer2 = TestFactory.eINSTANCE.createWriter(); writer2.setFirstName("bla"); lib.getWriters().add(writer2); final VTableControl control = VTableFactory.eINSTANCE.createTableControl(); control .setDomainModelReference( getVTableDomainModelReference(TestPackage.eINSTANCE.getLibrary_Writers())); final VFeaturePathDomainModelReference tc = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); tc.setDomainModelEFeature(TestPackage.eINSTANCE.getWriter_FirstName()); VTableDomainModelReference.class.cast(control.getDomainModelReference()).getColumnDomainModelReferences() .add(tc); ViewModelContextFactory.INSTANCE.createViewModelContext(control, lib); assertEquals("Severity of table must be error", Diagnostic.ERROR, control.getDiagnostic().getHighestSeverity()); } @Test public void testValidationTableControlChildrenUpdateExisting() { final Library lib = TestFactory.eINSTANCE.createLibrary(); lib.setName("bla"); final Writer writer = TestFactory.eINSTANCE.createWriter(); lib.getWriters().add(writer); final VTableControl control = VTableFactory.eINSTANCE.createTableControl(); control .setDomainModelReference( getVTableDomainModelReference(TestPackage.eINSTANCE.getLibrary_Writers())); final VFeaturePathDomainModelReference tc = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); tc.setDomainModelEFeature(TestPackage.eINSTANCE.getWriter_FirstName()); VTableDomainModelReference.class.cast(control.getDomainModelReference()).getColumnDomainModelReferences() .add(tc); ViewModelContextFactory.INSTANCE.createViewModelContext(control, lib); writer.setFirstName("bla"); assertEquals("Severity of table must be ok", Diagnostic.OK, control.getDiagnostic().getHighestSeverity()); } @Ignore @Test public void testValidationTableControlChildrenUpdateExistingTwoEntries() { final Library lib = TestFactory.eINSTANCE.createLibrary(); lib.setName("bla"); final Writer writer = TestFactory.eINSTANCE.createWriter(); lib.getWriters().add(writer); final Writer writer2 = TestFactory.eINSTANCE.createWriter(); lib.getWriters().add(writer2); final VTableControl control = VTableFactory.eINSTANCE.createTableControl(); control .setDomainModelReference( getVFeaturePathDomainModelReference(TestPackage.eINSTANCE.getLibrary_Writers())); final VFeaturePathDomainModelReference tc = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); tc.setDomainModelEFeature(TestPackage.eINSTANCE.getWriter_FirstName()); VTableDomainModelReference.class.cast(control.getDomainModelReference()).getColumnDomainModelReferences() .add(tc); ViewModelContextFactory.INSTANCE.createViewModelContext(control, lib); assertEquals("Severity of table must be error", Diagnostic.ERROR, control.getDiagnostic().getHighestSeverity()); writer2.setFirstName("bla"); assertEquals("Severity of table must be error", Diagnostic.ERROR, control.getDiagnostic().getHighestSeverity()); writer.setFirstName("bla"); assertEquals("Severity of table must be ok", Diagnostic.OK, control.getDiagnostic().getHighestSeverity()); } @Test public void testValidationTableControlChildrenAddNew() { final Library lib = TestFactory.eINSTANCE.createLibrary(); lib.setName("bla"); final Writer writer = TestFactory.eINSTANCE.createWriter(); lib.getWriters().add(writer); writer.setFirstName("bla"); final VView view = VViewFactory.eINSTANCE.createView(); final VTableControl control = VTableFactory.eINSTANCE.createTableControl(); view.getChildren().add(control); control .setDomainModelReference( getVTableDomainModelReference(TestPackage.eINSTANCE.getLibrary_Writers())); final VFeaturePathDomainModelReference tc = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); tc.setDomainModelEFeature(TestPackage.eINSTANCE.getWriter_FirstName()); VTableDomainModelReference.class.cast(control.getDomainModelReference()).getColumnDomainModelReferences() .add(tc); ViewModelContextFactory.INSTANCE.createViewModelContext(view, lib); assertEquals("Severity of table must be OK", Diagnostic.OK, control.getDiagnostic().getHighestSeverity()); final Writer writer2 = TestFactory.eINSTANCE.createWriter(); lib.getWriters().add(writer2); assertEquals("Severity of table must be error", Diagnostic.ERROR, control.getDiagnostic().getHighestSeverity()); } @Test public void testValidationTableControlChildrenAddNewWithoutError() { final Library lib = TestFactory.eINSTANCE.createLibrary(); lib.setName("bla"); final Writer writer = TestFactory.eINSTANCE.createWriter(); lib.getWriters().add(writer); final VTableControl control = VTableFactory.eINSTANCE.createTableControl(); control .setDomainModelReference( getVTableDomainModelReference(TestPackage.eINSTANCE.getLibrary_Writers())); final VFeaturePathDomainModelReference tc = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); tc.setDomainModelEFeature(TestPackage.eINSTANCE.getWriter_FirstName()); VTableDomainModelReference.class.cast(control.getDomainModelReference()).getColumnDomainModelReferences() .add(tc); ViewModelContextFactory.INSTANCE.createViewModelContext(control, lib); assertEquals("Severity of table must be error", Diagnostic.ERROR, control.getDiagnostic().getHighestSeverity()); final Writer writer2 = TestFactory.eINSTANCE.createWriter(); writer2.setFirstName("bla"); lib.getWriters().add(writer2); assertEquals("Severity of table must be error", Diagnostic.ERROR, control.getDiagnostic().getHighestSeverity()); } @Test public void testValidationTableControlChildrenRemoveAdded() { final Library lib = TestFactory.eINSTANCE.createLibrary(); lib.setName("bla"); final Writer writer = TestFactory.eINSTANCE.createWriter(); writer.setFirstName("H"); lib.getWriters().add(writer); final VView view = VViewFactory.eINSTANCE.createView(); final VTableControl control = VTableFactory.eINSTANCE.createTableControl(); view.getChildren().add(control); control .setDomainModelReference( getVTableDomainModelReference(TestPackage.eINSTANCE.getLibrary_Writers())); final VFeaturePathDomainModelReference tc = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); tc.setDomainModelEFeature(TestPackage.eINSTANCE.getWriter_FirstName()); VTableDomainModelReference.class.cast(control.getDomainModelReference()).getColumnDomainModelReferences() .add(tc); ViewModelContextFactory.INSTANCE.createViewModelContext(view, lib); assertEquals("Severity of table must be warning", Diagnostic.WARNING, control.getDiagnostic() .getHighestSeverity()); final Writer writer2 = TestFactory.eINSTANCE.createWriter(); lib.getWriters().add(writer2); assertEquals("Severity of table must be error", Diagnostic.ERROR, control.getDiagnostic().getHighestSeverity()); lib.getWriters().remove(writer2); assertEquals("Severity of table must be warning", Diagnostic.WARNING, control.getDiagnostic() .getHighestSeverity()); } @Test public void testValidationTableControlChildrenPropagation() { final Library lib = TestFactory.eINSTANCE.createLibrary(); lib.setName("bla"); final Writer writer = TestFactory.eINSTANCE.createWriter(); lib.getWriters().add(writer); final Writer writer2 = TestFactory.eINSTANCE.createWriter(); writer2.setFirstName("bla"); lib.getWriters().add(writer2); final VTableControl control = VTableFactory.eINSTANCE.createTableControl(); control.setDomainModelReference( getVTableDomainModelReference(TestPackage.eINSTANCE.getLibrary_Writers())); final VFeaturePathDomainModelReference tc = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); tc.setDomainModelEFeature(TestPackage.eINSTANCE.getWriter_FirstName()); VTableDomainModelReference.class.cast(control.getDomainModelReference()).getColumnDomainModelReferences() .add(tc); final VView view = VViewFactory.eINSTANCE.createView(); view.getChildren().add(control); ViewModelContextFactory.INSTANCE.createViewModelContext(view, lib); assertEquals("Severity of table must be error", Diagnostic.ERROR, control.getDiagnostic().getHighestSeverity()); assertEquals("Severity of view must be error", Diagnostic.ERROR, view.getDiagnostic().getHighestSeverity()); } @Test public void testValidationChildHasMoreSevereValidationPropagation() { final Library lib = TestFactory.eINSTANCE.createLibrary(); lib.setName("warning"); final Writer writer = TestFactory.eINSTANCE.createWriter(); final Writer validWriter = TestFactory.eINSTANCE.createWriter(); validWriter.setFirstName("hello"); lib.getWriters().add(writer); lib.getWriters().add(validWriter); final VTableControl control = VTableFactory.eINSTANCE.createTableControl(); control.setDomainModelReference( getVTableDomainModelReference(TestPackage.eINSTANCE.getLibrary_Writers())); final VFeaturePathDomainModelReference tc = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); tc.setDomainModelEFeature(TestPackage.eINSTANCE.getWriter_FirstName()); VTableDomainModelReference.class.cast(control.getDomainModelReference()).getColumnDomainModelReferences() .add(tc); final VView view = VViewFactory.eINSTANCE.createView(); view.getChildren().add(control); ViewModelContextFactory.INSTANCE.createViewModelContext(view, lib); assertEquals("Severity of table must be error", Diagnostic.ERROR, control.getDiagnostic().getHighestSeverity()); assertEquals("Severity of view must be error", Diagnostic.ERROR, view.getDiagnostic().getHighestSeverity()); lib.getWriters().remove(writer); // library name does not influence validation result assertEquals("Severity of table must be ok", Diagnostic.OK, control.getDiagnostic() .getHighestSeverity()); assertEquals("Severity of view must be ok", Diagnostic.OK, view.getDiagnostic().getHighestSeverity()); } @Test public void testValidationNotReferencedAttributesAreIgnored() { final Library lib = TestFactory.eINSTANCE.createLibrary(); lib.setName("warning"); final Writer validWriter = TestFactory.eINSTANCE.createWriter(); validWriter.setFirstName("hello"); lib.getWriters().add(validWriter); final VTableControl control = VTableFactory.eINSTANCE.createTableControl(); control.setDomainModelReference( getVTableDomainModelReference(TestPackage.eINSTANCE.getLibrary_Writers())); final VFeaturePathDomainModelReference tc = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); tc.setDomainModelEFeature(TestPackage.eINSTANCE.getWriter_FirstName()); VTableDomainModelReference.class.cast(control.getDomainModelReference()).getColumnDomainModelReferences() .add(tc); final VView view = VViewFactory.eINSTANCE.createView(); view.getChildren().add(control); ViewModelContextFactory.INSTANCE.createViewModelContext(view, lib); // library name does not influence validation result assertEquals("Severity of table must be ok", Diagnostic.OK, control.getDiagnostic() .getHighestSeverity()); assertEquals("Severity of view must be ok", Diagnostic.OK, view.getDiagnostic().getHighestSeverity()); } @Test public void testValidationTableControlChildrenPropagationErrorToOk() { final Library lib = TestFactory.eINSTANCE.createLibrary(); lib.setName("bla"); final Writer writer = TestFactory.eINSTANCE.createWriter(); lib.getWriters().add(writer); final Writer writer2 = TestFactory.eINSTANCE.createWriter(); writer2.setFirstName("bla"); lib.getWriters().add(writer2); final VTableControl control = VTableFactory.eINSTANCE.createTableControl(); control.setDomainModelReference( getVTableDomainModelReference(TestPackage.eINSTANCE.getLibrary_Writers())); final VFeaturePathDomainModelReference tc = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); tc.setDomainModelEFeature(TestPackage.eINSTANCE.getWriter_FirstName()); VTableDomainModelReference.class.cast(control.getDomainModelReference()).getColumnDomainModelReferences() .add(tc); final VView view = VViewFactory.eINSTANCE.createView(); view.getChildren().add(control); ViewModelContextFactory.INSTANCE.createViewModelContext(view, lib); writer.setFirstName("foo"); assertEquals("Severity of table must be ok", Diagnostic.OK, control.getDiagnostic().getHighestSeverity()); assertEquals("Severity of view must be ok", Diagnostic.OK, view.getDiagnostic().getHighestSeverity()); } @Test public void testValidationTableControlChildrenPropagationErrorToOkByRemove() { final Library lib = TestFactory.eINSTANCE.createLibrary(); lib.setName("bla"); final Writer writer = TestFactory.eINSTANCE.createWriter(); lib.getWriters().add(writer); final Writer writer2 = TestFactory.eINSTANCE.createWriter(); writer2.setFirstName("bla"); lib.getWriters().add(writer2); final VTableControl control = VTableFactory.eINSTANCE.createTableControl(); control.setDomainModelReference( getVTableDomainModelReference(TestPackage.eINSTANCE.getLibrary_Writers())); final VFeaturePathDomainModelReference tc = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); tc.setDomainModelEFeature(TestPackage.eINSTANCE.getWriter_FirstName()); VTableDomainModelReference.class.cast(control.getDomainModelReference()).getColumnDomainModelReferences() .add(tc); final VView view = VViewFactory.eINSTANCE.createView(); view.getChildren().add(control); ViewModelContextFactory.INSTANCE.createViewModelContext(view, lib); lib.getWriters().remove(writer); assertEquals("Severity of table must be ok", Diagnostic.OK, control.getDiagnostic().getHighestSeverity()); assertEquals("Severity of view must be ok", Diagnostic.OK, view.getDiagnostic().getHighestSeverity()); } @Test public void testValidationTableControlParentReferencingEntityNotValid() { final Writer writer = TestFactory.eINSTANCE.createWriter(); final Library lib = TestFactory.eINSTANCE.createLibrary(); lib.getWriters().add(writer); writer.setFirstName("bar"); writer.setLastName("foo"); // error final VTableControl control = VTableFactory.eINSTANCE.createTableControl(); control.setDomainModelReference( getVTableDomainModelReference(TestPackage.eINSTANCE.getLibrary_Writers())); final VFeaturePathDomainModelReference tc = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); tc.setDomainModelEFeature(TestPackage.eINSTANCE.getWriter_FirstName()); VTableDomainModelReference.class.cast(control.getDomainModelReference()).getColumnDomainModelReferences() .add(tc); final VView view = VViewFactory.eINSTANCE.createView(); view.getChildren().add(control); ViewModelContextFactory.INSTANCE.createViewModelContext(view, lib); assertEquals("Severity of table must be ok", Diagnostic.OK, control.getDiagnostic().getHighestSeverity()); assertEquals("Severity of view must be ok", Diagnostic.OK, view.getDiagnostic().getHighestSeverity()); writer.setFirstName(""); assertEquals("Severity of table must be error", Diagnostic.ERROR, control.getDiagnostic().getHighestSeverity()); assertEquals("Severity of view must be error", Diagnostic.ERROR, view.getDiagnostic().getHighestSeverity()); } @Test public void testValidationTableControlAggregation() { final VView view = VViewFactory.eINSTANCE.createView(); final Library lib = TestFactory.eINSTANCE.createLibrary(); final Writer writer = TestFactory.eINSTANCE.createWriter(); final Writer writer2 = TestFactory.eINSTANCE.createWriter(); final Writer writer3 = TestFactory.eINSTANCE.createWriter(); lib.setName("bla"); lib.getWriters().add(writer); lib.getWriters().add(writer2); lib.getWriters().add(writer3); writer3.setFirstName("bla"); final VTableControl control1 = VTableFactory.eINSTANCE.createTableControl(); control1.setName("firstNameTable"); control1.setDomainModelReference( getVTableDomainModelReference(TestPackage.eINSTANCE.getLibrary_Writers())); final VFeaturePathDomainModelReference tc1 = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); tc1.setDomainModelEFeature(TestPackage.eINSTANCE.getWriter_FirstName()); VTableDomainModelReference.class.cast(control1.getDomainModelReference()).getColumnDomainModelReferences() .add(tc1); final VTableControl control2 = VTableFactory.eINSTANCE.createTableControl(); control2.setName("lastNameTable"); control2.setDomainModelReference( getVTableDomainModelReference(TestPackage.eINSTANCE.getLibrary_Writers())); final VFeaturePathDomainModelReference tc2 = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); tc2.setDomainModelEFeature(TestPackage.eINSTANCE.getWriter_LastName()); VTableDomainModelReference.class.cast(control2.getDomainModelReference()).getColumnDomainModelReferences() .add(tc2); view.getChildren().add(control1); view.getChildren().add(control2); ViewModelContextFactory.INSTANCE.createViewModelContext(view, lib); assertEquals("Severity of table must be error", Diagnostic.ERROR, control1.getDiagnostic().getHighestSeverity()); assertEquals("Severity of table must be ok", Diagnostic.OK, control2.getDiagnostic().getHighestSeverity()); lib.getWriters().remove(writer); lib.getWriters().remove(writer2); assertEquals("Severity of table must be ok", Diagnostic.OK, control1.getDiagnostic() .getHighestSeverity()); } @Test public void testValidationTableControlMultipleDiagnosticsInitOk() { final VView view = VViewFactory.eINSTANCE.createView(); final Container container = TestFactory.eINSTANCE.createContainer(); final Content content1 = TestFactory.eINSTANCE.createContent(); content1.setUniqueAttribute("a"); container.getContents().add(content1); final Content content2 = TestFactory.eINSTANCE.createContent(); content2.setUniqueAttribute("b"); container.getContents().add(content2); final VTableControl control1 = VTableFactory.eINSTANCE.createTableControl(); control1.setDomainModelReference( getVTableDomainModelReference(TestPackage.eINSTANCE.getContainer_Contents())); final VFeaturePathDomainModelReference tc1 = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); tc1.setDomainModelEFeature(TestPackage.eINSTANCE.getContent_UniqueAttribute()); VTableDomainModelReference.class.cast(control1.getDomainModelReference()).getColumnDomainModelReferences() .add(tc1); view.getChildren().add(control1); ViewModelContextFactory.INSTANCE.createViewModelContext(view, container); assertEquals("Severity of table must be ok", Diagnostic.OK, control1.getDiagnostic().getHighestSeverity()); assertEquals("There must be 0 diagnostics", 0, control1.getDiagnostic().getDiagnostics().size()); } @Test public void testValidationTableControlMultipleDiagnosticsInitError() { final VView view = VViewFactory.eINSTANCE.createView(); final Container container = TestFactory.eINSTANCE.createContainer(); final Content content1 = TestFactory.eINSTANCE.createContent(); content1.setUniqueAttribute("a"); container.getContents().add(content1); final Content content2 = TestFactory.eINSTANCE.createContent(); content2.setUniqueAttribute("a"); container.getContents().add(content2); final VTableControl control1 = VTableFactory.eINSTANCE.createTableControl(); control1.setDomainModelReference( getVTableDomainModelReference(TestPackage.eINSTANCE.getContainer_Contents())); final VFeaturePathDomainModelReference tc1 = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); tc1.setDomainModelEFeature(TestPackage.eINSTANCE.getContent_UniqueAttribute()); VTableDomainModelReference.class.cast(control1.getDomainModelReference()).getColumnDomainModelReferences() .add(tc1); view.getChildren().add(control1); ViewModelContextFactory.INSTANCE.createViewModelContext(view, container); assertEquals("Severity of table must be error", Diagnostic.ERROR, control1.getDiagnostic().getHighestSeverity()); // ok for container, 2x error for contents // assertEquals("There must be 3 diagnostics", 3, control1.getDiagnostic().getDiagnostics().size()); } @Test public void testValidationTableControlMultipleDiagnosticsDynamicFirstOkToError() { final VView view = VViewFactory.eINSTANCE.createView(); final Container container = TestFactory.eINSTANCE.createContainer(); final Content content1 = TestFactory.eINSTANCE.createContent(); content1.setUniqueAttribute("a"); container.getContents().add(content1); final Content content2 = TestFactory.eINSTANCE.createContent(); content2.setUniqueAttribute("b"); container.getContents().add(content2); final VTableControl control1 = VTableFactory.eINSTANCE.createTableControl(); control1.setDomainModelReference( getVTableDomainModelReference(TestPackage.eINSTANCE.getContainer_Contents())); final VFeaturePathDomainModelReference tc1 = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); tc1.setDomainModelEFeature(TestPackage.eINSTANCE.getContent_UniqueAttribute()); VTableDomainModelReference.class.cast(control1.getDomainModelReference()).getColumnDomainModelReferences() .add(tc1); view.getChildren().add(control1); ViewModelContextFactory.INSTANCE.createViewModelContext(view, container); assertEquals("Severity of table must be ok", Diagnostic.OK, control1.getDiagnostic().getHighestSeverity()); assertEquals("There must be 0 diagnostics", 0, control1.getDiagnostic().getDiagnostics().size()); content1.setUniqueAttribute("b"); assertEquals("Severity of table must be error", Diagnostic.ERROR, control1.getDiagnostic().getHighestSeverity()); } @Test public void testValidationTableControlMultipleDiagnosticsDynamicSecondOkToError() { final VView view = VViewFactory.eINSTANCE.createView(); final Container container = TestFactory.eINSTANCE.createContainer(); final Content content1 = TestFactory.eINSTANCE.createContent(); content1.setUniqueAttribute("a"); container.getContents().add(content1); final Content content2 = TestFactory.eINSTANCE.createContent(); content2.setUniqueAttribute("b"); container.getContents().add(content2); final VTableControl control1 = VTableFactory.eINSTANCE.createTableControl(); control1.setDomainModelReference( getVTableDomainModelReference(TestPackage.eINSTANCE.getContainer_Contents())); final VFeaturePathDomainModelReference tc1 = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); tc1.setDomainModelEFeature(TestPackage.eINSTANCE.getContent_UniqueAttribute()); VTableDomainModelReference.class.cast(control1.getDomainModelReference()).getColumnDomainModelReferences() .add(tc1); view.getChildren().add(control1); ViewModelContextFactory.INSTANCE.createViewModelContext(view, container); assertEquals("Severity of table must be ok", Diagnostic.OK, control1.getDiagnostic().getHighestSeverity()); assertEquals("There must be 0 diagnostics", 0, control1.getDiagnostic().getDiagnostics().size()); content2.setUniqueAttribute("a"); assertEquals("Severity of table must be error", Diagnostic.ERROR, control1.getDiagnostic().getHighestSeverity()); } @Test public void testValidationTableControlMultipleDiagnosticsDynamicFirstErrorToOk() { final VView view = VViewFactory.eINSTANCE.createView(); final Container container = TestFactory.eINSTANCE.createContainer(); final Content content1 = TestFactory.eINSTANCE.createContent(); content1.setUniqueAttribute("a"); container.getContents().add(content1); final Content content2 = TestFactory.eINSTANCE.createContent(); content2.setUniqueAttribute("a"); container.getContents().add(content2); final VTableControl control1 = VTableFactory.eINSTANCE.createTableControl(); control1.setDomainModelReference( getVTableDomainModelReference(TestPackage.eINSTANCE.getContainer_Contents())); final VFeaturePathDomainModelReference tc1 = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); tc1.setDomainModelEFeature(TestPackage.eINSTANCE.getContent_UniqueAttribute()); VTableDomainModelReference.class.cast(control1.getDomainModelReference()).getColumnDomainModelReferences() .add(tc1); view.getChildren().add(control1); ViewModelContextFactory.INSTANCE.createViewModelContext(view, container); assertEquals("Severity of table must be error", Diagnostic.ERROR, control1.getDiagnostic().getHighestSeverity()); // ok for container, 2x error for contents // assertEquals("There must be 3 diagnostics", 3, control1.getDiagnostic().getDiagnostics().size()); content1.setUniqueAttribute("b"); assertEquals("Severity of table must be ok", Diagnostic.OK, control1.getDiagnostic().getHighestSeverity()); assertEquals("There must be 0 diagnostics", 0, control1.getDiagnostic().getDiagnostics().size()); } @Test public void testValidationTableControlMultipleDiagnosticsDynamicSecondErrorToOk() { final VView view = VViewFactory.eINSTANCE.createView(); final Container container = TestFactory.eINSTANCE.createContainer(); final Content content1 = TestFactory.eINSTANCE.createContent(); content1.setUniqueAttribute("a"); container.getContents().add(content1); final Content content2 = TestFactory.eINSTANCE.createContent(); content2.setUniqueAttribute("a"); container.getContents().add(content2); final VTableControl control1 = VTableFactory.eINSTANCE.createTableControl(); control1.setDomainModelReference( getVTableDomainModelReference(TestPackage.eINSTANCE.getContainer_Contents())); final VFeaturePathDomainModelReference tc1 = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); tc1.setDomainModelEFeature(TestPackage.eINSTANCE.getContent_UniqueAttribute()); VTableDomainModelReference.class.cast(control1.getDomainModelReference()).getColumnDomainModelReferences() .add(tc1); view.getChildren().add(control1); ViewModelContextFactory.INSTANCE.createViewModelContext(view, container); assertEquals("Severity of table must be error", Diagnostic.ERROR, control1.getDiagnostic().getHighestSeverity()); // ok for container, 2x error for contents // assertEquals("There must be 3 diagnostics", 3, control1.getDiagnostic().getDiagnostics().size()); content2.setUniqueAttribute("b"); assertEquals("Severity of table must be ok", Diagnostic.OK, control1.getDiagnostic().getHighestSeverity()); assertEquals("There must be 0 diagnostics", 0, control1.getDiagnostic().getDiagnostics().size()); } @Test public void testValidationTableControlMultipleDiagnosticsMultipleDuplicatesInitError() { final VView view = VViewFactory.eINSTANCE.createView(); final Container container = TestFactory.eINSTANCE.createContainer(); final Content content1 = TestFactory.eINSTANCE.createContent(); content1.setUniqueAttribute("a"); container.getContents().add(content1); final Content content2 = TestFactory.eINSTANCE.createContent(); content2.setUniqueAttribute("a"); container.getContents().add(content2); final Content content3 = TestFactory.eINSTANCE.createContent(); content3.setUniqueAttribute("b"); container.getContents().add(content3); final Content content4 = TestFactory.eINSTANCE.createContent(); content4.setUniqueAttribute("b"); container.getContents().add(content4); final VTableControl control1 = VTableFactory.eINSTANCE.createTableControl(); control1.setDomainModelReference( getVTableDomainModelReference(TestPackage.eINSTANCE.getContainer_Contents())); final VFeaturePathDomainModelReference tc1 = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); tc1.setDomainModelEFeature(TestPackage.eINSTANCE.getContent_UniqueAttribute()); VTableDomainModelReference.class.cast(control1.getDomainModelReference()).getColumnDomainModelReferences() .add(tc1); view.getChildren().add(control1); ViewModelContextFactory.INSTANCE.createViewModelContext(view, container); assertEquals("Severity of table must be error", Diagnostic.ERROR, control1.getDiagnostic().getHighestSeverity()); // ok for container, 4x error for contents // assertEquals("There must be 5 diagnostics", 5, control1.getDiagnostic().getDiagnostics().size()); } @Test public void testValidationTableControlMultipleDiagnosticsMultipleDuplicatesDynamic4ErrorTo3Error() { final VView view = VViewFactory.eINSTANCE.createView(); final Container container = TestFactory.eINSTANCE.createContainer(); final Content content1 = TestFactory.eINSTANCE.createContent(); content1.setUniqueAttribute("a"); container.getContents().add(content1); final Content content2 = TestFactory.eINSTANCE.createContent(); content2.setUniqueAttribute("a"); container.getContents().add(content2); final Content content3 = TestFactory.eINSTANCE.createContent(); content3.setUniqueAttribute("b"); container.getContents().add(content3); final Content content4 = TestFactory.eINSTANCE.createContent(); content4.setUniqueAttribute("b"); container.getContents().add(content4); final VTableControl control1 = VTableFactory.eINSTANCE.createTableControl(); control1.setDomainModelReference( getVTableDomainModelReference(TestPackage.eINSTANCE.getContainer_Contents())); final VFeaturePathDomainModelReference tc1 = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); tc1.setDomainModelEFeature(TestPackage.eINSTANCE.getContent_UniqueAttribute()); VTableDomainModelReference.class.cast(control1.getDomainModelReference()).getColumnDomainModelReferences() .add(tc1); view.getChildren().add(control1); ViewModelContextFactory.INSTANCE.createViewModelContext(view, container); assertEquals("Severity of table must be error", Diagnostic.ERROR, control1.getDiagnostic().getHighestSeverity()); // ok for container, 4x error for contents // assertEquals("There must be 5 diagnostics", 5, control1.getDiagnostic().getDiagnostics().size()); content3.setUniqueAttribute("a"); assertEquals("Severity of table must be error", Diagnostic.ERROR, control1.getDiagnostic().getHighestSeverity()); // ok for container, 1x ok , 3x error for contents // assertEquals("There must be 5 diagnostics", 5, control1.getDiagnostic().getDiagnostics().size()); } @Test public void testValidationTableControlMultipleDiagnosticsMultipleDuplicatesDynamic4ErrorTo2Error() { final VView view = VViewFactory.eINSTANCE.createView(); final Container container = TestFactory.eINSTANCE.createContainer(); final Content content1 = TestFactory.eINSTANCE.createContent(); content1.setUniqueAttribute("a"); container.getContents().add(content1); final Content content2 = TestFactory.eINSTANCE.createContent(); content2.setUniqueAttribute("a"); container.getContents().add(content2); final Content content3 = TestFactory.eINSTANCE.createContent(); content3.setUniqueAttribute("b"); container.getContents().add(content3); final Content content4 = TestFactory.eINSTANCE.createContent(); content4.setUniqueAttribute("b"); container.getContents().add(content4); final VTableControl control1 = VTableFactory.eINSTANCE.createTableControl(); control1.setDomainModelReference( getVTableDomainModelReference(TestPackage.eINSTANCE.getContainer_Contents())); final VFeaturePathDomainModelReference tc1 = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); tc1.setDomainModelEFeature(TestPackage.eINSTANCE.getContent_UniqueAttribute()); VTableDomainModelReference.class.cast(control1.getDomainModelReference()).getColumnDomainModelReferences() .add(tc1); view.getChildren().add(control1); ViewModelContextFactory.INSTANCE.createViewModelContext(view, container); assertEquals("Severity of table must be error", Diagnostic.ERROR, control1.getDiagnostic().getHighestSeverity()); // ok for container, 4x error for contents // assertEquals("There must be 5 diagnostics", 5, control1.getDiagnostic().getDiagnostics().size()); content3.setUniqueAttribute("c"); assertEquals("Severity of table must be error", Diagnostic.ERROR, control1.getDiagnostic().getHighestSeverity()); // ok for container,2x ok, 2x error for contents // assertEquals("There must be 4 diagnostics", 4, control1.getDiagnostic().getDiagnostics().size()); } @Test public void testValidationTableControlTwoColumns() { final VView view = VViewFactory.eINSTANCE.createView(); final Library lib = TestFactory.eINSTANCE.createLibrary(); final Writer writer = TestFactory.eINSTANCE.createWriter(); lib.setName("bla"); lib.getWriters().add(writer); final VTableControl control1 = VTableFactory.eINSTANCE.createTableControl(); control1.setDomainModelReference( getVTableDomainModelReference(TestPackage.eINSTANCE.getLibrary_Writers())); final VFeaturePathDomainModelReference tc1 = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); tc1.setDomainModelEFeature(TestPackage.eINSTANCE.getWriter_FirstName()); final VFeaturePathDomainModelReference tc2 = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); tc2.setDomainModelEFeature(TestPackage.eINSTANCE.getWriter_LastName()); VTableDomainModelReference.class.cast(control1.getDomainModelReference()).getColumnDomainModelReferences() .add(tc1); VTableDomainModelReference.class.cast(control1.getDomainModelReference()).getColumnDomainModelReferences() .add(tc2); view.getChildren().add(control1); ViewModelContextFactory.INSTANCE.createViewModelContext(view, lib); assertEquals("Severity of table must be error", Diagnostic.ERROR, control1.getDiagnostic().getHighestSeverity()); assertEquals("Severity of table must be error", Diagnostic.ERROR, view.getDiagnostic().getHighestSeverity()); writer.setFirstName("asdf"); assertEquals("Severity of table must be ok", Diagnostic.OK, control1.getDiagnostic().getHighestSeverity()); assertEquals("Severity of table must be ok", Diagnostic.OK, view.getDiagnostic().getHighestSeverity()); } @Test public void testValidationTableControlChildrenRemoveEntry() { final Library lib = TestFactory.eINSTANCE.createLibrary(); lib.setName("bla"); final Writer writer = TestFactory.eINSTANCE.createWriter(); lib.getWriters().add(writer); final Writer writer2 = TestFactory.eINSTANCE.createWriter(); lib.getWriters().add(writer2); final Writer writer3 = TestFactory.eINSTANCE.createWriter(); lib.getWriters().add(writer3); writer3.setFirstName("bla"); final VTableControl control = VTableFactory.eINSTANCE.createTableControl(); control .setDomainModelReference( getVTableDomainModelReference(TestPackage.eINSTANCE.getLibrary_Writers())); final VFeaturePathDomainModelReference tc = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); tc.setDomainModelEFeature(TestPackage.eINSTANCE.getWriter_FirstName()); VTableDomainModelReference.class.cast(control.getDomainModelReference()).getColumnDomainModelReferences() .add(tc); ViewModelContextFactory.INSTANCE.createViewModelContext(control, lib); assertEquals("Severity of table must be error", Diagnostic.ERROR, control.getDiagnostic().getHighestSeverity()); lib.getWriters().remove(writer); assertEquals("Severity of table must be error", Diagnostic.ERROR, control.getDiagnostic().getHighestSeverity()); lib.getWriters().remove(writer2); assertEquals("Severity of table must be ok", Diagnostic.OK, control.getDiagnostic() .getHighestSeverity()); } @Test public void testValidationNonDomainWithDomainLoseChild() { // domain final Library library = TestFactory.eINSTANCE.createLibrary(); final Writer writer = TestFactory.eINSTANCE.createWriter(); final Writer writer2 = TestFactory.eINSTANCE.createWriter(); // non domain final VView view = VViewFactory.eINSTANCE.createView(); final VTableControl tableControl = VTableFactory.eINSTANCE.createTableControl(); tableControl.setDomainModelReference( getVTableDomainModelReference(TestPackage.eINSTANCE.getLibrary_Writers())); final VFeaturePathDomainModelReference tc = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); tc.setDomainModelEFeature(TestPackage.eINSTANCE.getWriter_FirstName()); VTableDomainModelReference.class.cast(tableControl.getDomainModelReference()).getColumnDomainModelReferences() .add(tc); final VVerticalLayout column = VVerticalFactory.eINSTANCE.createVerticalLayout(); column.getChildren().add(tableControl); view.getChildren().add(column); library.getWriters().add(writer); writer.setFirstName("aaa"); library.getWriters().add(writer2); ViewModelContextFactory.INSTANCE.createViewModelContext(view, library); assertEquals("Severity of control must be error", Diagnostic.ERROR, tableControl.getDiagnostic() .getHighestSeverity()); assertEquals("Severity of column must be error", Diagnostic.ERROR, column.getDiagnostic().getHighestSeverity()); assertEquals("Severity of view must be error", Diagnostic.ERROR, view.getDiagnostic().getHighestSeverity()); library.getWriters().remove(writer2); assertEquals("Severity of control must be ok", Diagnostic.OK, tableControl.getDiagnostic().getHighestSeverity()); assertEquals("Severity of column must be OK", Diagnostic.OK, column.getDiagnostic().getHighestSeverity()); assertEquals("Severity of view must be OK", Diagnostic.OK, view.getDiagnostic().getHighestSeverity()); } @Test public void testValidationPropagation2LevelErrorToOkDomainObjectChanges() { final Library library = TestFactory.eINSTANCE.createLibrary(); final Writer writer = TestFactory.eINSTANCE.createWriter(); library.getWriters().add(writer); final VView view = VViewFactory.eINSTANCE.createView(); final VTableControl tableControl = VTableFactory.eINSTANCE.createTableControl(); tableControl.setDomainModelReference(getVTableDomainModelReference(TestPackage.eINSTANCE .getLibrary_Writers())); final VFeaturePathDomainModelReference tc = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); tc.setDomainModelEFeature(TestPackage.eINSTANCE.getWriter_FirstName()); VTableDomainModelReference.class.cast(tableControl.getDomainModelReference()).getColumnDomainModelReferences() .add(tc); final VVerticalLayout column = VVerticalFactory.eINSTANCE.createVerticalLayout(); column.getChildren().add(tableControl); view.getChildren().add(column); ViewModelContextFactory.INSTANCE.createViewModelContext(view, library); assertEquals("Severity of control must be error", Diagnostic.ERROR, tableControl.getDiagnostic() .getHighestSeverity()); assertEquals("Severity of column must be error", Diagnostic.ERROR, column.getDiagnostic().getHighestSeverity()); assertEquals("Severity of view must be error", Diagnostic.ERROR, view.getDiagnostic().getHighestSeverity()); writer.setFirstName("hello"); assertEquals("Severity of control must be ok", Diagnostic.OK, tableControl.getDiagnostic() .getHighestSeverity()); assertEquals("Severity of column must be OK", Diagnostic.OK, column.getDiagnostic().getHighestSeverity()); assertEquals("Severity of view must be OK", Diagnostic.OK, view.getDiagnostic().getHighestSeverity()); } @Test public void testValidationDynamicAddManyToDomain() { // setup final Library library = TestFactory.eINSTANCE.createLibrary(); final Writer writer = TestFactory.eINSTANCE.createWriter(); writer.setFirstName("Name"); library.getWriters().add(writer); final VView view = VViewFactory.eINSTANCE.createView(); view.setRootEClass(TestPackage.eINSTANCE.getLibrary()); final VTableControl tableControl = VTableFactory.eINSTANCE.createTableControl(); tableControl.setDomainModelReference(getVTableDomainModelReference(TestPackage.eINSTANCE .getLibrary_Writers())); final VFeaturePathDomainModelReference tc = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); tc.setDomainModelEFeature(TestPackage.eINSTANCE.getWriter_FirstName()); VTableDomainModelReference.class.cast(tableControl.getDomainModelReference()).getColumnDomainModelReferences() .add(tc); view.getChildren().add(tableControl); ViewModelContextFactory.INSTANCE.createViewModelContext(view, library); assertEquals("Severity of control must be ok", Diagnostic.OK, tableControl.getDiagnostic() .getHighestSeverity()); // act final Writer writer2 = TestFactory.eINSTANCE.createWriter(); final Writer writer3 = TestFactory.eINSTANCE.createWriter(); writer3.setFirstName("H"); final List<Writer> writers = new ArrayList<Writer>(); writers.add(writer2); writers.add(writer3); library.getWriters().addAll(writers); // assert assertEquals("Severity of control must be Error", Diagnostic.ERROR, tableControl.getDiagnostic() .getHighestSeverity()); } @Test public void testNonContainmentReferenceInitialValidationOK() { /* setup model */ final Referencer referencer = TestFactory.eINSTANCE.createReferencer(); final Computer computer = TestFactory.eINSTANCE.createComputer(); referencer.setReferencedContent(computer); computer.setName("Raspberry Pi"); /* setup view */ final VView view = VViewFactory.eINSTANCE.createView(); final VControl control = VViewFactory.eINSTANCE.createControl(); view.getChildren().add(control); control.setDomainModelReference(TestPackage.eINSTANCE.getComputer_Name(), Collections.singleton(TestPackage.eINSTANCE.getReferencer_ReferencedContent())); /* act */ ViewModelContextFactory.INSTANCE.createViewModelContext(view, referencer); /* assert */ assertEquals("Severity of control must be ok", Diagnostic.OK, control.getDiagnostic().getHighestSeverity()); } @Test public void testNonContainmentReferenceInitialValidationError() { /* setup model */ final Referencer referencer = TestFactory.eINSTANCE.createReferencer(); final Computer computer = TestFactory.eINSTANCE.createComputer(); referencer.setReferencedContent(computer); computer.setName(null); /* setup view */ final VView view = VViewFactory.eINSTANCE.createView(); final VControl control = VViewFactory.eINSTANCE.createControl(); view.getChildren().add(control); control.setDomainModelReference(TestPackage.eINSTANCE.getComputer_Name(), Collections.singleton(TestPackage.eINSTANCE.getReferencer_ReferencedContent())); /* act */ ViewModelContextFactory.INSTANCE.createViewModelContext(view, referencer); /* assert */ assertEquals("Severity of control must be error", Diagnostic.ERROR, control.getDiagnostic().getHighestSeverity()); } @Test public void testNonContainmentReferenceValidationOnChangeOK() { /* setup model */ final Referencer referencer = TestFactory.eINSTANCE.createReferencer(); final Computer computer = TestFactory.eINSTANCE.createComputer(); referencer.setReferencedContent(computer); computer.setName(null); /* setup view */ final VView view = VViewFactory.eINSTANCE.createView(); final VControl control = VViewFactory.eINSTANCE.createControl(); view.getChildren().add(control); control.setDomainModelReference(TestPackage.eINSTANCE.getComputer_Name(), Collections.singleton(TestPackage.eINSTANCE.getReferencer_ReferencedContent())); /* setup validation service */ final ViewModelContext context = ViewModelContextFactory.INSTANCE.createViewModelContext(view, referencer); /* act */ computer.setName("Raspberry Pi"); /* * auto revalidate does not work with our model, since we have a non-containment and made no adjustments to the * model impl. this _is_ expected */ context.getService(ValidationService.class).validate(Collections.<EObject> singleton(computer)); /* assert */ assertEquals("Severity of control must be ok", Diagnostic.OK, control.getDiagnostic().getHighestSeverity()); } @Test public void testNonContainmentReferenceValidationOnChangeError() { /* setup model */ final Referencer referencer = TestFactory.eINSTANCE.createReferencer(); final Computer computer = TestFactory.eINSTANCE.createComputer(); referencer.setReferencedContent(computer); computer.setName("Raspberry Pi"); /* setup view */ final VView view = VViewFactory.eINSTANCE.createView(); final VControl control = VViewFactory.eINSTANCE.createControl(); view.getChildren().add(control); control.setDomainModelReference(TestPackage.eINSTANCE.getComputer_Name(), Collections.singleton(TestPackage.eINSTANCE.getReferencer_ReferencedContent())); /* setup validation service */ final ViewModelContext context = ViewModelContextFactory.INSTANCE.createViewModelContext(view, referencer); /* act */ computer.setName(null); /* * auto revalidate does not work with our model, since we have a non-containment and made no adjustments to the * model impl. this _is_ expected */ context.getService(ValidationService.class).validate(Collections.<EObject> singleton(computer)); /* assert */ assertEquals("Severity of control must be error", Diagnostic.ERROR, control.getDiagnostic().getHighestSeverity()); } @Test public void testRegisterListener() { final Writer writer = TestFactory.eINSTANCE.createWriter(); final VControl control = VViewFactory.eINSTANCE.createControl(); control .setDomainModelReference( getVFeaturePathDomainModelReference(TestPackage.eINSTANCE.getWriter_FirstName())); final ViewModelContext vmc = ViewModelContextFactory.INSTANCE.createViewModelContext(control, writer); final Set<Diagnostic> result = new LinkedHashSet<Diagnostic>(); final ViewValidationListener listener = new ViewValidationListener() { @Override public void onNewValidation(Set<Diagnostic> validationResults) { result.addAll(validationResults); } }; final ValidationService service = vmc.getService(ValidationService.class); service.registerValidationListener(listener); assertEquals("One Diagnostic expected", 1, result.size()); assertEquals("Severity of control must be Error", Diagnostic.ERROR, result.iterator().next().getSeverity()); } @Test public void testListenerUponChange() throws InterruptedException { final Writer writer = TestFactory.eINSTANCE.createWriter(); final VControl control = VViewFactory.eINSTANCE.createControl(); control .setDomainModelReference( getVFeaturePathDomainModelReference(TestPackage.eINSTANCE.getWriter_FirstName())); final ViewModelContext vmc = ViewModelContextFactory.INSTANCE.createViewModelContext(control, writer); final List<CountDownLatch> latch = new ArrayList<CountDownLatch>(); latch.add(new CountDownLatch(1)); final Set<Diagnostic> lastResult = new LinkedHashSet<Diagnostic>(); final ViewValidationListener listener = new ViewValidationListener() { @Override public void onNewValidation(Set<Diagnostic> validationResults) { lastResult.clear(); lastResult.addAll(validationResults); latch.get(0).countDown(); } }; final ValidationService service = vmc.getService(ValidationService.class); service.registerValidationListener(listener); latch.get(0).await(1, TimeUnit.SECONDS); assertEquals("One Diagnostic expected", 1, lastResult.size()); latch.clear(); latch.add(new CountDownLatch(1)); writer.setFirstName("Hans"); latch.get(0).await(1, TimeUnit.SECONDS); assertEquals("No Diagnostic expected since OK", 0, lastResult.size()); latch.clear(); latch.add(new CountDownLatch(1)); writer.setFirstName(""); latch.get(0).await(1, TimeUnit.SECONDS); assertEquals("One Diagnostic expected", 1, lastResult.size()); assertEquals("Severity of control must be Error", Diagnostic.ERROR, lastResult.iterator().next().getSeverity()); } @Test public void testIncrementalUpdateListener() throws InterruptedException { final Writer writer = TestFactory.eINSTANCE.createWriter(); final VControl control = VViewFactory.eINSTANCE.createControl(); control .setDomainModelReference( getVFeaturePathDomainModelReference(TestPackage.eINSTANCE.getWriter_FirstName())); final ViewModelContext vmc = ViewModelContextFactory.INSTANCE.createViewModelContext(control, writer); final BlockingQueue<Collection<Diagnostic>> update = new ArrayBlockingQueue<>(1); final ValidationUpdateListener listener = diagnostics -> { try { update.offer(diagnostics, 1L, TimeUnit.SECONDS); } catch (final InterruptedException e) { e.printStackTrace(); fail("Interrupted"); } }; final ValidationService service = vmc.getService(ValidationService.class); ValidationUpdateListener.register(service, listener); // Initial validation service.validate(Collections.singleton(writer)); Collection<Diagnostic> diagnostics = update.poll(1L, TimeUnit.SECONDS); assertThat("No error found", diagnostics, hasItem(isError())); assertThat("No OKs found", diagnostics, hasItem(isOK())); writer.setFirstName("Hans"); diagnostics = update.poll(1L, TimeUnit.SECONDS); assertThat("Nothing reported", diagnostics.isEmpty(), is(false)); assertThat("Previously reported problems not cleared", diagnostics, everyItem(isOK())); writer.setFirstName(""); diagnostics = update.poll(1L, TimeUnit.SECONDS); assertThat("No error found", diagnostics, hasItem(isError())); assertThat("No OKs found", diagnostics, hasItem(isOK())); } @Test public void incrementalUpdateUnmodifiable() throws InterruptedException { final Writer writer = TestFactory.eINSTANCE.createWriter(); final VControl control = VViewFactory.eINSTANCE.createControl(); control .setDomainModelReference( getVFeaturePathDomainModelReference(TestPackage.eINSTANCE.getWriter_FirstName())); final ViewModelContext vmc = ViewModelContextFactory.INSTANCE.createViewModelContext(control, writer); final ValidationUpdateListener listener = diagnostics -> { try { final Iterator<?> iter = diagnostics.iterator(); iter.next(); iter.remove(); fail("Should have thrown on attempt to remove from entry set"); } catch (final UnsupportedOperationException e) { // Success } }; final ValidationService service = vmc.getService(ValidationService.class); ValidationUpdateListener.register(service, listener); // validate service.validate(Collections.singleton(writer)); } // // Nested types // /** * A global service that injects the validation problems propagation limit * into the view-model context. */ static final class PropagationLimitService implements GlobalViewModelService { private final int limit; /** * Initializes me with the propagation limit. * * @param limit the propagation limit */ PropagationLimitService(int limit) { super(); this.limit = limit; } @Override public void instantiate(ViewModelContext context) { context.putContextValue(PROPAGATION_LIMIT_KEY, limit); } @Override public void dispose() { // Nothing to dispose } @Override public int getPriority() { return Integer.MIN_VALUE; } @Override public void childViewModelContextAdded(ViewModelContext childContext) { // Not interesting } // // Nested types // /** * Factory for the propagation-limit injection service. */ static final class Factory implements EMFFormsViewServiceFactory<PropagationLimitService> { private final int limit; Factory(int limit) { super(); this.limit = limit; } @Override public EMFFormsViewServicePolicy getPolicy() { return EMFFormsViewServicePolicy.IMMEDIATE; } @Override public EMFFormsViewServiceScope getScope() { return EMFFormsViewServiceScope.GLOBAL; } @Override public double getPriority() { // Don't use -∞ because that prevents registration of the factory! return Integer.MIN_VALUE; } @Override public Class<PropagationLimitService> getType() { return PropagationLimitService.class; } @Override public PropagationLimitService createService(EMFFormsViewContext emfFormsViewContext) { final PropagationLimitService result = new PropagationLimitService(limit); if (emfFormsViewContext instanceof ViewModelContext) { result.instantiate((ViewModelContext) emfFormsViewContext); } return result; } } } }