blob: e2f1a73638c85bac4262833430a7c8f9e634cf12 [file] [log] [blame]
/*
* Copyright (c) 2010-2021 BSI Business Systems Integration AG.
* 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:
* BSI Business Systems Integration AG - initial API and implementation
*/
package org.eclipse.scout.rt.dataobject;
import static org.junit.Assert.*;
import org.eclipse.scout.rt.dataobject.fixture.DoubleContributionFixtureDo;
import org.eclipse.scout.rt.dataobject.fixture.EntityFixtureDo;
import org.eclipse.scout.rt.dataobject.fixture.FirstSimpleContributionFixtureDo;
import org.eclipse.scout.rt.dataobject.fixture.ProjectContributionFixtureDo;
import org.eclipse.scout.rt.dataobject.fixture.ProjectFixtureDo;
import org.eclipse.scout.rt.dataobject.fixture.ScoutContributionFixtureDo;
import org.eclipse.scout.rt.dataobject.fixture.ScoutFixtureDo;
import org.eclipse.scout.rt.dataobject.fixture.SecondSimpleContributionFixtureDo;
import org.eclipse.scout.rt.dataobject.fixture.SimpleFixtureDo;
import org.eclipse.scout.rt.platform.BEANS;
import org.eclipse.scout.rt.platform.util.Assertions.AssertionException;
import org.eclipse.scout.rt.testing.platform.runner.PlatformTestRunner;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(PlatformTestRunner.class)
public class DataObjectContributionTest {
@Test
public void testHasGetContribution() {
SimpleFixtureDo doEntity = BEANS.get(SimpleFixtureDo.class);
assertFalse(doEntity.has(DoEntity.CONTRIBUTIONS_ATTRIBUTE_NAME)); // node doesn't exist
assertTrue(doEntity.getContributions().isEmpty());
assertThrows(AssertionException.class, () -> doEntity.getContribution(null)); // contribution class is mandatory
// has -> false, get -> null
assertFalse(doEntity.hasContribution(FirstSimpleContributionFixtureDo.class));
assertFalse(doEntity.hasContribution(SecondSimpleContributionFixtureDo.class));
assertNull(doEntity.getContribution(FirstSimpleContributionFixtureDo.class));
assertNull(doEntity.getContribution(SecondSimpleContributionFixtureDo.class));
// add first contribution
FirstSimpleContributionFixtureDo firstContribution = BEANS.get(FirstSimpleContributionFixtureDo.class);
doEntity.putContribution(firstContribution);
// check node availability and return values of has/get
assertEquals(1, doEntity.getContributions().size());
assertSame(firstContribution, doEntity.getContributions().iterator().next());
assertTrue(doEntity.has(DoEntity.CONTRIBUTIONS_ATTRIBUTE_NAME));
assertTrue(doEntity.hasContribution(FirstSimpleContributionFixtureDo.class));
assertSame(firstContribution, doEntity.getContribution(FirstSimpleContributionFixtureDo.class));
// second contribution still not available
assertFalse(doEntity.hasContribution(SecondSimpleContributionFixtureDo.class));
assertNull(doEntity.getContribution(SecondSimpleContributionFixtureDo.class));
}
@Test
public void testContribution() {
SimpleFixtureDo doEntity = BEANS.get(SimpleFixtureDo.class);
assertNull(doEntity.getContribution(FirstSimpleContributionFixtureDo.class));
FirstSimpleContributionFixtureDo firstContribution = doEntity.contribution(FirstSimpleContributionFixtureDo.class);
assertNotNull(firstContribution);
assertSame(firstContribution, doEntity.contribution(FirstSimpleContributionFixtureDo.class)); // same instance if contribution is already available (via previous getOrCreate call)
assertSame(firstContribution, doEntity.getContribution(FirstSimpleContributionFixtureDo.class)); // same instance for get call
SecondSimpleContributionFixtureDo secondContribution = BEANS.get(SecondSimpleContributionFixtureDo.class);
doEntity.putContribution(secondContribution);
assertSame(secondContribution, doEntity.contribution(SecondSimpleContributionFixtureDo.class)); // same instance if contribution is already available (via putContribution)
}
@Test
public void testPutContribution() {
SimpleFixtureDo doEntity = BEANS.get(SimpleFixtureDo.class);
FirstSimpleContributionFixtureDo firstContribution1 = BEANS.get(FirstSimpleContributionFixtureDo.class);
doEntity.putContribution(firstContribution1);
assertEquals(1, doEntity.getContributions().size());
FirstSimpleContributionFixtureDo firstContribution2 = BEANS.get(FirstSimpleContributionFixtureDo.class);
doEntity.putContribution(firstContribution2);
assertEquals(1, doEntity.getContributions().size()); // size is still 1, first contribution was overridden
assertSame(firstContribution2, doEntity.getContribution(FirstSimpleContributionFixtureDo.class)); // same as 2. instance
}
@Test
public void testRemoveContribution() {
SimpleFixtureDo doEntity = BEANS.get(SimpleFixtureDo.class);
assertFalse(doEntity.removeContribution(FirstSimpleContributionFixtureDo.class)); // no effect
assertFalse(doEntity.removeContribution(SecondSimpleContributionFixtureDo.class)); // no effect
assertFalse(doEntity.has(DoEntity.CONTRIBUTIONS_ATTRIBUTE_NAME)); // node doesn't exist
doEntity.putContribution(BEANS.get(FirstSimpleContributionFixtureDo.class));
assertTrue(doEntity.has(DoEntity.CONTRIBUTIONS_ATTRIBUTE_NAME));
doEntity.putContribution(BEANS.get(SecondSimpleContributionFixtureDo.class));
assertTrue(doEntity.removeContribution(FirstSimpleContributionFixtureDo.class));
assertTrue(doEntity.has(DoEntity.CONTRIBUTIONS_ATTRIBUTE_NAME));
assertTrue(doEntity.removeContribution(SecondSimpleContributionFixtureDo.class));
assertFalse(doEntity.has(DoEntity.CONTRIBUTIONS_ATTRIBUTE_NAME)); // node is removed after last contribution is removed
}
@Test
public void testValidation() {
SimpleFixtureDo simpleFixture = BEANS.get(SimpleFixtureDo.class);
assertThrows(AssertionException.class, () -> simpleFixture.validateContributionClass(null)); // missing contribution class
simpleFixture.validateContributionClass(FirstSimpleContributionFixtureDo.class);
simpleFixture.validateContributionClass(SecondSimpleContributionFixtureDo.class);
assertThrows(AssertionException.class, () -> simpleFixture.validateContributionClass(ScoutContributionFixtureDo.class));
assertThrows(AssertionException.class, () -> simpleFixture.validateContributionClass(ProjectContributionFixtureDo.class));
// not using BEANS.get because bean is replaced by ProjectFixtureDo (only for validation, not a real case this way)
ScoutFixtureDo scoutFixture = new ScoutFixtureDo();
assertThrows(AssertionException.class, () -> scoutFixture.validateContributionClass(FirstSimpleContributionFixtureDo.class));
assertThrows(AssertionException.class, () -> scoutFixture.validateContributionClass(SecondSimpleContributionFixtureDo.class));
assertThrows(AssertionException.class, () -> scoutFixture.validateContributionClass(ProjectContributionFixtureDo.class));
scoutFixture.validateContributionClass(ScoutContributionFixtureDo.class);
// using subclasses data object
ProjectFixtureDo projectFixture = BEANS.get(ProjectFixtureDo.class);
assertThrows(AssertionException.class, () -> projectFixture.validateContributionClass(FirstSimpleContributionFixtureDo.class));
assertThrows(AssertionException.class, () -> projectFixture.validateContributionClass(SecondSimpleContributionFixtureDo.class));
projectFixture.validateContributionClass(ScoutContributionFixtureDo.class);
projectFixture.validateContributionClass(ProjectContributionFixtureDo.class);
// verify contribution DO with two containers
projectFixture.validateContributionClass(DoubleContributionFixtureDo.class);
simpleFixture.validateContributionClass(DoubleContributionFixtureDo.class);
assertThrows(AssertionException.class, () -> BEANS.get(EntityFixtureDo.class).validateContributionClass(SecondSimpleContributionFixtureDo.class));
// verify that all methods check validation
assertThrows(AssertionException.class, () -> simpleFixture.getContribution(ScoutContributionFixtureDo.class));
assertThrows(AssertionException.class, () -> simpleFixture.putContribution(BEANS.get(ScoutContributionFixtureDo.class)));
assertThrows(AssertionException.class, () -> simpleFixture.contribution(ScoutContributionFixtureDo.class));
assertThrows(AssertionException.class, () -> simpleFixture.hasContribution(ScoutContributionFixtureDo.class));
assertThrows(AssertionException.class, () -> simpleFixture.removeContribution(ScoutContributionFixtureDo.class));
}
@Test
public void testEquality() {
// Add contributions in order first -> second
SimpleFixtureDo doEntity1 = BEANS.get(SimpleFixtureDo.class);
doEntity1.putContribution(BEANS.get(FirstSimpleContributionFixtureDo.class));
doEntity1.putContribution(BEANS.get(SecondSimpleContributionFixtureDo.class));
// Add contributions in order second -> first
SimpleFixtureDo doEntity2 = BEANS.get(SimpleFixtureDo.class);
doEntity2.putContribution(BEANS.get(SecondSimpleContributionFixtureDo.class));
doEntity2.putContribution(BEANS.get(FirstSimpleContributionFixtureDo.class));
// Order of contributions must not be relevant for comparison
assertEquals(doEntity1, doEntity2);
}
@Test
public void testSerialization() {
IPrettyPrintDataObjectMapper mapper = BEANS.get(IPrettyPrintDataObjectMapper.class);
SimpleFixtureDo doEntity = BEANS.get(SimpleFixtureDo.class)
.withName1("name");
FirstSimpleContributionFixtureDo firstContribution = BEANS.get(FirstSimpleContributionFixtureDo.class).withFirstValue("first-value");
doEntity.putContribution(firstContribution);
SecondSimpleContributionFixtureDo secondContribution = BEANS.get(SecondSimpleContributionFixtureDo.class).withSecondValue("second-value");
doEntity.putContribution(secondContribution);
String json = mapper.writeValue(doEntity);
assertEquals("{\n"
+ " \"_type\" : \"scout.SimpleFixture\",\n"
+ " \"_contributions\" : [ {\n"
+ " \"_type\" : \"scout.FirstSimpleContributionFixture\",\n"
+ " \"firstValue\" : \"first-value\"\n"
+ " }, {\n"
+ " \"_type\" : \"scout.SecondSimpleContributionFixture\",\n"
+ " \"secondValue\" : \"second-value\"\n"
+ " } ],\n"
+ " \"name1\" : \"name\"\n"
+ "}", json.replaceAll("\\r", ""));
SimpleFixtureDo deserializedDoEntity = mapper.readValue(json, SimpleFixtureDo.class);
assertEquals("name", deserializedDoEntity.getName1());
assertEquals(2, deserializedDoEntity.getContributions().size());
assertEquals(firstContribution, deserializedDoEntity.getContribution(FirstSimpleContributionFixtureDo.class));
assertEquals(secondContribution, deserializedDoEntity.getContribution(SecondSimpleContributionFixtureDo.class));
assertEquals(doEntity, deserializedDoEntity);
}
}