blob: 1ff7cd28a23bd6d59254a6c9c0ab258af1f74130 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011-2015 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
******************************************************************************/
package org.eclipse.emfforms.internal.spreadsheet.core;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.Iterator;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeConstants;
import org.apache.poi.ss.usermodel.Workbook;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.xml.type.internal.XMLCalendar;
import org.eclipse.emf.ecp.makeithappen.model.task.Nationality;
import org.eclipse.emf.ecp.makeithappen.model.task.TaskFactory;
import org.eclipse.emf.ecp.makeithappen.model.task.TaskPackage;
import org.eclipse.emf.ecp.makeithappen.model.task.User;
import org.eclipse.emf.ecp.test.common.DefaultRealm;
import org.eclipse.emf.ecp.view.spi.model.VContainedElement;
import org.eclipse.emf.ecp.view.spi.model.VControl;
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.model.VViewModelProperties;
import org.eclipse.emf.emfstore.bowling.BowlingFactory;
import org.eclipse.emf.emfstore.bowling.BowlingPackage;
import org.eclipse.emf.emfstore.bowling.Fan;
import org.eclipse.emf.emfstore.bowling.Merchandise;
import org.eclipse.emfforms.internal.spreadsheet.core.transfer.EMFFormsSpreadsheetExporterImpl;
import org.eclipse.emfforms.internal.spreadsheet.core.transfer.EMFFormsSpreadsheetExporterImpl.ViewProvider;
import org.eclipse.emfforms.spi.spreadsheet.core.error.model.SpreadsheetImportResult;
import org.eclipse.emfforms.spi.spreadsheet.core.transfer.EMFFormsSpreadsheetExporter;
import org.eclipse.emfforms.spi.spreadsheet.core.transfer.EMFFormsSpreadsheetImporter;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class EMFFormsSpreadsheetImportImpl_ITest {
private DefaultRealm realm;
@Before
public void setup() {
realm = new DefaultRealm();
}
@After
public void tearDown() {
realm.dispose();
}
@Test
public void testImportSpreadsheet() throws IOException, DatatypeConfigurationException {
final EMFFormsSpreadsheetExporter viewRenderer = new EMFFormsSpreadsheetExporterImpl(new ViewProvider() {
@Override
public VView getViewModel(EObject viewEobject, VViewModelProperties properties) {
return getView();
}
});
final User user = getDomainModel();
final User user2 = getDomainModel();
final Workbook workbook = viewRenderer.render(Arrays.asList(user, user2), null, null);
final EMFFormsSpreadsheetImporter spreadsheetImport = EMFFormsSpreadsheetImporter.INSTANCE;
final SpreadsheetImportResult importResult = spreadsheetImport.importSpreadsheet(workbook,
TaskPackage.eINSTANCE.getUser());
final Collection<EObject> users = importResult.getImportedEObjects();
final Iterator<EObject> iterator = users.iterator();
assertTrue(EcoreUtil.equals(user, iterator.next()));
assertTrue(EcoreUtil.equals(user2, iterator.next()));
}
private User getDomainModel() throws DatatypeConfigurationException {
final User user = TaskFactory.eINSTANCE.createUser();
user.setEmail("myEMail@test.de"); //$NON-NLS-1$
user.setFirstName("Bob"); //$NON-NLS-1$
user.setHeigth(2);
user.setLastName("Smith"); //$NON-NLS-1$
user.setNationality(Nationality.US);
user.setTimeOfRegistration(new Date());
user.setWeight(1.45);
final XMLCalendar cal = new XMLCalendar(new Date(), XMLCalendar.DATE);
cal.setTimezone(DatatypeConstants.FIELD_UNDEFINED);
cal.setHour(DatatypeConstants.FIELD_UNDEFINED);
cal.setMinute(DatatypeConstants.FIELD_UNDEFINED);
cal.setSecond(DatatypeConstants.FIELD_UNDEFINED);
cal.setMillisecond(DatatypeConstants.FIELD_UNDEFINED);
user.setDateOfBirth(cal);
return user;
}
private VView getView() {
final VView view = VViewFactory.eINSTANCE.createView();
view.setRootEClass(TaskPackage.eINSTANCE.getUser());
final EList<EStructuralFeature> structuralFeatures = TaskPackage.eINSTANCE.getUser()
.getEAllStructuralFeatures();
for (final EStructuralFeature feature : structuralFeatures) {
if (EReference.class.isInstance(feature)) {
continue;
}
final VControl control = VViewFactory.eINSTANCE.createControl();
final VFeaturePathDomainModelReference modelReference = VViewFactory.eINSTANCE
.createFeaturePathDomainModelReference();
modelReference.setDomainModelEFeature(feature);
control.setDomainModelReference(modelReference);
view.getChildren().add(control);
}
return view;
}
@Test
public void testImportSpreadsheetUnsetFeatures() throws IOException, DatatypeConfigurationException {
final Fan domainModel = BowlingFactory.eINSTANCE.createFan();
domainModel.setNumberOfTournamentsVisited(1);
assertFalse(domainModel.isSetName());
assertFalse(domainModel.isSetEMails());
assertTrue(domainModel.isSetNumberOfTournamentsVisited());
assertFalse(domainModel.isSetFavouriteMerchandise());
assertFalse(domainModel.isSetFanMerchandise());
final VView view = view(BowlingPackage.eINSTANCE.getFan(),
control(BowlingPackage.eINSTANCE.getFan_Name()),
control(BowlingPackage.eINSTANCE.getFan_EMails()),
control(BowlingPackage.eINSTANCE.getFan_NumberOfTournamentsVisited()),
control(BowlingPackage.eINSTANCE.getFan_FavouriteMerchandise()),
control(BowlingPackage.eINSTANCE.getFan_FanMerchandise()));
final EMFFormsSpreadsheetExporter viewRenderer = new EMFFormsSpreadsheetExporterImpl(new ViewProvider() {
@Override
public VView getViewModel(EObject viewEobject, VViewModelProperties properties) {
return view;
}
});
final Workbook workbook = viewRenderer.render(Collections.singleton(domainModel), null, null);
final EMFFormsSpreadsheetImporter spreadsheetImport = EMFFormsSpreadsheetImporter.INSTANCE;
final Collection<EObject> fans = spreadsheetImport.importSpreadsheet(workbook,
BowlingPackage.eINSTANCE.getFan()).getImportedEObjects();
assertEquals(1, fans.size());
final Fan importedFan = (Fan) fans.iterator().next();
assertFalse(importedFan.isSetName());
assertFalse(importedFan.isSetEMails());
assertTrue(importedFan.isSetNumberOfTournamentsVisited());
assertFalse(importedFan.isSetFavouriteMerchandise());
assertFalse(importedFan.isSetFanMerchandise());
assertTrue(EcoreUtil.equals(domainModel, importedFan));
}
@Test
public void testImportSpreadsheetUnsettableFeaturesWithDefaultValue()
throws IOException, DatatypeConfigurationException {
final Fan domainModel = BowlingFactory.eINSTANCE.createFan();
domainModel.eSet(BowlingPackage.eINSTANCE.getFan_Name(), null);
domainModel.eSet(BowlingPackage.eINSTANCE.getFan_EMails(), Collections.emptyList());
domainModel.eSet(BowlingPackage.eINSTANCE.getFan_FavouriteMerchandise(), null);
domainModel.eSet(BowlingPackage.eINSTANCE.getFan_FanMerchandise(), Collections.emptyList());
assertTrue(domainModel.isSetName());
assertTrue(domainModel.isSetEMails());
assertTrue(domainModel.isSetFavouriteMerchandise());
assertTrue(domainModel.isSetFanMerchandise());
final VView view = view(BowlingPackage.eINSTANCE.getFan(),
control(BowlingPackage.eINSTANCE.getFan_Name()),
control(BowlingPackage.eINSTANCE.getFan_EMails()),
control(BowlingPackage.eINSTANCE.getFan_FavouriteMerchandise()),
control(BowlingPackage.eINSTANCE.getFan_FanMerchandise()));
final EMFFormsSpreadsheetExporter viewRenderer = new EMFFormsSpreadsheetExporterImpl(new ViewProvider() {
@Override
public VView getViewModel(EObject viewEobject, VViewModelProperties properties) {
return view;
}
});
final Workbook workbook = viewRenderer.render(Collections.singleton(domainModel), null, null);
final EMFFormsSpreadsheetImporter spreadsheetImport = EMFFormsSpreadsheetImporter.INSTANCE;
final Collection<EObject> fans = spreadsheetImport.importSpreadsheet(workbook,
BowlingPackage.eINSTANCE.getFan()).getImportedEObjects();
assertEquals(1, fans.size());
final Fan importedFan = (Fan) fans.iterator().next();
assertFalse(importedFan.isSetName());
assertTrue(importedFan.isSetEMails());
assertFalse(importedFan.isSetFavouriteMerchandise());
// TODO the following assertions are failing because of a bug in EMF
// EMF is using an identity command instead of an empty set command, which would make the feature set
// assertTrue(importedFan.isSetFanMerchandise());
// assertTrue(EcoreUtil.equals(domainModel, importedFan));
}
@Test
public void testImportSpreadsheetUnsettableFeaturesWithNonDefaultValue()
throws IOException, DatatypeConfigurationException {
final Fan domainModel = BowlingFactory.eINSTANCE.createFan();
domainModel.eSet(BowlingPackage.eINSTANCE.getFan_Name(), "Hans"); //$NON-NLS-1$
domainModel.eSet(BowlingPackage.eINSTANCE.getFan_EMails(), Arrays.asList("hans@eclipse.org", "hans@hans.com")); //$NON-NLS-1$ //$NON-NLS-2$
domainModel.eSet(BowlingPackage.eINSTANCE.getFan_FavouriteMerchandise(), merchandise("Favourite")); //$NON-NLS-1$
domainModel.eSet(BowlingPackage.eINSTANCE.getFan_FanMerchandise(),
Arrays.asList(merchandise("merc1"), merchandise("merc2"))); //$NON-NLS-1$ //$NON-NLS-2$
assertTrue(domainModel.isSetName());
assertTrue(domainModel.isSetEMails());
assertTrue(domainModel.isSetFavouriteMerchandise());
assertTrue(domainModel.isSetFanMerchandise());
final VView view = view(BowlingPackage.eINSTANCE.getFan(),
control(BowlingPackage.eINSTANCE.getFan_Name()),
control(BowlingPackage.eINSTANCE.getFan_EMails()),
control(BowlingPackage.eINSTANCE.getFan_FavouriteMerchandise()),
control(BowlingPackage.eINSTANCE.getFan_FanMerchandise()));
final EMFFormsSpreadsheetExporter viewRenderer = new EMFFormsSpreadsheetExporterImpl(new ViewProvider() {
@Override
public VView getViewModel(EObject viewEobject, VViewModelProperties properties) {
return view;
}
});
final Workbook workbook = viewRenderer.render(Collections.singleton(domainModel), null, null);
final EMFFormsSpreadsheetImporter spreadsheetImport = EMFFormsSpreadsheetImporter.INSTANCE;
final Collection<EObject> fans = spreadsheetImport.importSpreadsheet(workbook,
BowlingPackage.eINSTANCE.getFan()).getImportedEObjects();
assertEquals(1, fans.size());
final Fan importedFan = (Fan) fans.iterator().next();
assertTrue(importedFan.isSetName());
assertTrue(importedFan.isSetEMails());
assertTrue(importedFan.isSetFavouriteMerchandise());
assertTrue(importedFan.isSetFanMerchandise());
assertTrue(EcoreUtil.equals(domainModel, importedFan));
}
private static VView view(EClass rootEClass, VContainedElement... elements) {
final VView view = VViewFactory.eINSTANCE.createView();
view.setRootEClass(rootEClass);
view.getChildren().addAll(Arrays.asList(elements));
return view;
}
private static VControl control(EStructuralFeature feature) {
final VControl control = VViewFactory.eINSTANCE.createControl();
control.setDomainModelReference(feature);
return control;
}
private static Merchandise merchandise(String name) {
final Merchandise merchandise = BowlingFactory.eINSTANCE.createMerchandise();
merchandise.setName(name);
return merchandise;
}
}