package org.emfjson.jackson.tests; import com.fasterxml.jackson.databind.ObjectMapper; import org.assertj.core.api.Condition; import org.eclipse.emf.common.util.EList; 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.impl.ResourceSetImpl; import org.emfjson.jackson.module.EMFModule; import org.emfjson.jackson.resource.JsonResourceFactory; import org.junit.Before; import org.junit.Test; import java.text.SimpleDateFormat; import java.util.Locale; import java.util.TimeZone; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.extractProperty; public class ModelTest { private ResourceSetImpl resourceSet; protected URI baseTestFilesFileDirectory = URI.createFileURI("src/test/resources/tests/"); protected ObjectMapper mapper = new ObjectMapper(); @Before public void setUp() { URI baseURI = URI.createURI("http://eclipselabs.org/emfjson/tests/"); EPackage.Registry.INSTANCE.put(EcorePackage.eNS_URI, EcorePackage.eINSTANCE); Resource.Factory.Registry.INSTANCE .getExtensionToFactoryMap().put("*", new JsonResourceFactory(mapper)); resourceSet = new ResourceSetImpl(); resourceSet.getURIConverter().getURIMap().put(baseURI, baseTestFilesFileDirectory); mapper.registerModule(new EMFModule()); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH); dateFormat.setTimeZone(TimeZone.getDefault()); mapper.setDateFormat(dateFormat); resourceSet.getURIConverter() .getURIMap() .put( URI.createURI("http://emfjson/dynamic/model"), URI.createURI("src/test/resources/model/dynamic/model.json")); resourceSet.getURIConverter() .getURIMap() .put( URI.createURI("http://www.emfjson.org/jackson/model"), URI.createURI("src/test/resources/model/dynamic/model-2.json")); resourceSet.getURIConverter() .getURIMap() .put( URI.createURI("http://foo.org/p"), URI.createURI("src/test/resources/model/dynamic/model-1.json")); resourceSet.getURIConverter() .getURIMap() .put( URI.createURI("http://foo.org/p2"), URI.createURI("src/test/resources/model/dynamic/model-3.json")); } @Test public void testLoadModel() { Resource model = resourceSet.getResource(URI.createURI("http://foo.org/p"), true); assertThat(model).isNotNull(); assertThat(model.getContents()) .hasSize(1) .hasOnlyElementsOfType(EPackage.class); EPackage p = (EPackage) model.getContents().get(0); assertThat(p.getName()).isEqualTo("p"); assertThat(p.getNsPrefix()).isEqualTo("p"); assertThat(p.getNsURI()).isEqualTo("http://foo.org/p"); assertThat(p.getEClassifiers()) .hasSize(2) .hasOnlyElementsOfType(EClass.class); EClass a = (EClass) p.getEClassifiers().get(0); EClass b = (EClass) p.getEClassifiers().get(1); assertThat(a.getName()).isEqualTo("A"); assertThat(a.getEStructuralFeatures()).hasSize(2); EStructuralFeature f1 = a.getEStructuralFeatures().get(0); EStructuralFeature f2 = a.getEStructuralFeatures().get(1); assertThat(f1.getName()).isEqualTo("label"); assertThat(f1.getEType()).isSameAs(EcorePackage.Literals.ESTRING); assertThat(f2.getName()).isEqualTo("bs"); assertThat(f2.getEType()).isSameAs(b); assertThat(b.getName()).isEqualTo("B"); assertThat(b.getEStructuralFeatures()).isEmpty(); } @Test public void testLoadModel2() { Resource model = resourceSet.getResource(URI.createURI("http://www.emfjson.org/jackson/model"), true); assertThat(model).isNotNull(); assertThat(model.getContents()) .hasSize(1) .hasOnlyElementsOfType(EPackage.class); EPackage p = (EPackage) model.getContents().get(0); assertThat(p.getName()).isEqualTo("model"); assertThat(p.getNsPrefix()).isEqualTo("model"); assertThat(p.getNsURI()).isEqualTo("http://www.emfjson.org/jackson/model"); assertThat(p.getEClassifiers()) .hasSize(5) .hasOnlyElementsOfType(EClass.class); EClass c1 = (EClass) p.getEClassifiers().get(0); EClass c2 = (EClass) p.getEClassifiers().get(1); EClass c3 = (EClass) p.getEClassifiers().get(2); EClass c4 = (EClass) p.getEClassifiers().get(3); EClass c5 = (EClass) p.getEClassifiers().get(4); assertThat(c1.getName()).isEqualTo("ETypes"); assertThat(c1.getEStructuralFeatures()).hasSize(2); // features EStructuralFeature c1f1 = c1.getEStructuralFeatures().get(0); assertThat(c1f1.getName()).isEqualTo("values"); assertThat(c1f1.getEType()).isSameAs(c2); EStructuralFeature c1f2 = c1.getEStructuralFeatures().get(1); assertThat(c1f2.getName()).isEqualTo("stringMapValues"); assertThat(c1f2.getEType()).isSameAs(c3); // TMap assertThat(c2.getName()).isEqualTo("TMap"); assertThat(c2.getInstanceClassName()).isEqualTo("java.util.Map.Entry"); assertThat(c2.getEStructuralFeatures()).hasSize(2); // features EStructuralFeature c2f1 = c2.getEStructuralFeatures().get(0); assertThat(c2f1.getName()).isEqualTo("key"); assertThat(c2f1.getEType()).isSameAs(c4); EStructuralFeature c2f2 = c2.getEStructuralFeatures().get(1); assertThat(c2f2.getName()).isEqualTo("value"); assertThat(c2f2.getEType()).isSameAs(c5); // StringMap assertThat(c3.getName()).isEqualTo("StringMap"); assertThat(c3.getInstanceClassName()).isEqualTo("java.util.Map.Entry"); assertThat(c3.getEStructuralFeatures()).hasSize(2); // features EStructuralFeature c3f1 = c3.getEStructuralFeatures().get(0); assertThat(c3f1.getName()).isEqualTo("key"); assertThat(c3f1.getEType()).isSameAs(EcorePackage.Literals.ESTRING); EStructuralFeature c3f2 = c3.getEStructuralFeatures().get(1); assertThat(c3f2.getName()).isEqualTo("value"); assertThat(c3f2.getEType()).isSameAs(c5); // Type assertThat(c4.getName()).isEqualTo("Type"); assertThat(c4.getEStructuralFeatures()).hasSize(1); // features EStructuralFeature c4f1 = c4.getEStructuralFeatures().get(0); assertThat(c4f1.getName()).isEqualTo("name"); assertThat(c4f1.getEType()).isSameAs(EcorePackage.Literals.ESTRING); // Value assertThat(c5.getName()).isEqualTo("Value"); assertThat(c5.getEStructuralFeatures()).hasSize(1); // features EStructuralFeature c5f1 = c5.getEStructuralFeatures().get(0); assertThat(c5f1.getName()).isEqualTo("value"); assertThat(c5f1.getEType()).isSameAs(EcorePackage.Literals.EINT); } @Test public void testSaveEnums() { } @Test public void testLoadDynamicEnums() { Resource model = resourceSet.getResource(URI.createURI("http://emfjson/dynamic/model"), true); EPackage p = (EPackage) model.getContents().get(0); EClassifier kind = p.getEClassifier("Kind"); assertThat(kind).isInstanceOf(EEnum.class); EEnum kindEnum = (EEnum) kind; EList<EEnumLiteral> literals = kindEnum.getELiterals(); assertThat(literals) .doesNotContainNull() .hasSize(2) .have(new Condition<EEnumLiteral>() { @Override public boolean matches(EEnumLiteral value) { return value.getName() != null; } }); assertThat(extractProperty("name").from(literals)) .containsExactly("e1", "e2"); assertThat(extractProperty("literal").from(literals)) .containsExactly("e1", "E2"); } }