/* * Copyright (c) 2015 Guillaume Hillairet. * 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: * Guillaume Hillairet - initial API and implementation * */ package org.emfjson.jackson.tests; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.*; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.emfjson.jackson.junit.model.ETypes; import org.emfjson.jackson.junit.model.ModelPackage; import org.emfjson.jackson.support.StandardFixture; import org.junit.ClassRule; import org.junit.Test; import java.io.ByteArrayInputStream; import java.io.IOException; import static org.emfjson.jackson.databind.EMFContext.Attributes.RESOURCE_SET; import static org.junit.Assert.*; public class ReaderTest { @ClassRule public static StandardFixture fixture = new StandardFixture(); private ObjectMapper mapper = fixture.mapper(); private ResourceSet resourceSet = fixture.getResourceSet(); @Test public void shouldReadObjectWhenEClassFieldIsNotFirst() throws IOException { JsonNode data = mapper.createObjectNode() .put("eInt", 1) .put("eClass", "http://www.emfjson.org/jackson/model#//ETypes") .set("eInts", mapper.createArrayNode().add(1).add(2)); Resource resource = resourceSet.createResource(URI.createURI("tests/test.json")); resource.load(new ByteArrayInputStream(mapper.writeValueAsBytes(data)), null); assertEquals(1, resource.getContents().size()); EObject result = resource.getContents().get(0); assertEquals(ModelPackage.Literals.ETYPES, result.eClass()); ETypes value = (ETypes) result; assertEquals(1, value.getEInt()); assertEquals(2, value.getEInts().size()); assertSame(1, value.getEInts().get(0)); assertSame(2, value.getEInts().get(1)); } @Test public void shouldReadObjectTreeWithEClassFieldNotFirst() throws JsonProcessingException { JsonNode data = ((ObjectNode) mapper.createObjectNode() .put("name", "A") .set("eStructuralFeatures", mapper.createArrayNode() .add(mapper.createObjectNode() .put("name", "foo") .put("eClass", "http://www.eclipse.org/emf/2002/Ecore#//EAttribute")) .add(mapper.createObjectNode() .put("name", "bar") .put("eClass", "http://www.eclipse.org/emf/2002/Ecore#//EAttribute")))) .put("eClass", "http://www.eclipse.org/emf/2002/Ecore#//EClass"); Resource resource = mapper .reader() .withAttribute(RESOURCE_SET, resourceSet) .treeToValue(data, Resource.class); assertEquals(1, resource.getContents().size()); EObject result = resource.getContents().get(0); assertEquals(EcorePackage.Literals.ECLASS, result.eClass()); assertEquals(2, ((EClass) result).getEStructuralFeatures().size()); EStructuralFeature firstAttribute = ((EClass) result).getEStructuralFeatures().get(0); assertEquals(EcorePackage.Literals.EATTRIBUTE, firstAttribute.eClass()); assertEquals("foo", firstAttribute.getName()); EStructuralFeature secondAttribute = ((EClass) result).getEStructuralFeatures().get(1); assertEquals(EcorePackage.Literals.EATTRIBUTE, secondAttribute.eClass()); assertEquals("bar", secondAttribute.getName()); } @Test public void shouldReadObjectTreeWithEClassFieldNotFirstAndNonAbstractChildren() throws JsonProcessingException { JsonNode data = ((ObjectNode) mapper.createObjectNode() .put("name", "A") .set("eOperations", mapper.createArrayNode() .add(mapper.createObjectNode() .put("name", "foo") .put("eClass", "http://www.eclipse.org/emf/2002/Ecore#//EOperation")) .add(mapper.createObjectNode() .put("name", "bar") .put("eClass", "http://www.eclipse.org/emf/2002/Ecore#//EOperation")))) .put("eClass", "http://www.eclipse.org/emf/2002/Ecore#//EClass"); Resource resource = mapper .reader() .withAttribute(RESOURCE_SET, resourceSet) .treeToValue(data, Resource.class); assertEquals(1, resource.getContents().size()); EObject result = resource.getContents().get(0); assertEquals(EcorePackage.Literals.ECLASS, result.eClass()); assertEquals(2, ((EClass) result).getEOperations().size()); EOperation firstOperation = ((EClass) result).getEOperations().get(0); assertEquals(EcorePackage.Literals.EOPERATION, firstOperation.eClass()); assertEquals("foo", firstOperation.getName()); EOperation secondOperation = ((EClass) result).getEOperations().get(1); assertEquals(EcorePackage.Literals.EOPERATION, secondOperation.eClass()); assertEquals("bar", secondOperation.getName()); } @Test public void shouldReadObjectTreeWithEClassFieldRandomPosition() throws JsonProcessingException { JsonNode data = mapper.createObjectNode() .put("eClass", "http://www.eclipse.org/emf/2002/Ecore#//EClass") .put("name", "A") .set("eStructuralFeatures", mapper.createArrayNode() .add(mapper.createObjectNode() .put("eClass", "http://www.eclipse.org/emf/2002/Ecore#//EAttribute") .put("name", "foo")) .add(mapper.createObjectNode() .put("eClass", "http://www.eclipse.org/emf/2002/Ecore#//EAttribute") .put("name", "bar"))); Resource resource = mapper .reader() .withAttribute(RESOURCE_SET, resourceSet) .treeToValue(data, Resource.class); assertEquals(1, resource.getContents().size()); EObject result = resource.getContents().get(0); assertEquals(EcorePackage.Literals.ECLASS, result.eClass()); assertEquals(2, ((EClass) result).getEStructuralFeatures().size()); assertEquals(EcorePackage.Literals.EATTRIBUTE, ((EClass) result).getEStructuralFeatures().get(0).eClass()); assertEquals(EcorePackage.Literals.EATTRIBUTE, ((EClass) result).getEStructuralFeatures().get(1).eClass()); } @Test public void shouldSkipAttributeFieldForWhichThereIsNoFeature() throws IOException { JsonNode data = mapper.createObjectNode() .put("eClass", "http://www.eclipse.org/emf/2002/Ecore#//EClass") .put("some_unknown_feature", "some value") .put("name", "A"); Resource resource = resourceSet.createResource(URI.createURI("tests/test.json")); resource.load(new ByteArrayInputStream(mapper.writeValueAsBytes(data)), null); assertEquals(1, resource.getContents().size()); EObject result = resource.getContents().get(0); assertEquals(EcorePackage.Literals.ECLASS, result.eClass()); assertEquals("A", result.eGet(EcorePackage.Literals.ENAMED_ELEMENT__NAME)); } @Test public void shouldReturnErrorsForWhichThereIsNoFeature() throws IOException { JsonNode data = mapper.createObjectNode() .put("eClass", "http://www.eclipse.org/emf/2002/Ecore#//EClass") .put("some_unknown_feature", "some value") .put("name", "A"); Resource resource = resourceSet.createResource(URI.createURI("tests/test.json")); resource.load(new ByteArrayInputStream(mapper.writeValueAsBytes(data)), null); assertEquals(1, resource.getContents().size()); assertEquals(1, resource.getErrors().size()); Resource.Diagnostic error = resource.getErrors().get(0); assertNotNull(error.getMessage()); assertNotNull(error.getColumn()); assertNotNull(error.getLine()); } @Test public void shouldSkipObjectFieldForWhichThereIsNoFeature() throws IOException { JsonNode data = mapper.createObjectNode() .put("eClass", "http://www.eclipse.org/emf/2002/Ecore#//EClass") .put("name", "A") .set("some_unknown_feature", mapper.createObjectNode() .put("eClass", "http://www.eclipse.org/emf/2002/Ecore#//EAttribute") .put("name", "foo")); Resource resource = resourceSet.createResource(URI.createURI("tests/test.json")); resource.load(new ByteArrayInputStream(mapper.writeValueAsBytes(data)), null); assertEquals(1, resource.getContents().size()); EObject result = resource.getContents().get(0); assertEquals(EcorePackage.Literals.ECLASS, result.eClass()); } @Test public void shouldSkipArrayFieldForWhichThereIsNoFeature() throws IOException { JsonNode data = mapper.createObjectNode() .put("eClass", "http://www.eclipse.org/emf/2002/Ecore#//EClass") .put("name", "A") .set("some_unknown_feature", mapper.createArrayNode() .add(mapper.createObjectNode() .put("eClass", "http://www.eclipse.org/emf/2002/Ecore#//EAttribute") .put("name", "foo"))); Resource resource = resourceSet.createResource(URI.createURI("tests/test.json")); resource.load(new ByteArrayInputStream(mapper.writeValueAsBytes(data)), null); assertEquals(1, resource.getContents().size()); EObject result = resource.getContents().get(0); assertEquals(EcorePackage.Literals.ECLASS, result.eClass()); } }