blob: 8f8b0939d8303afb3c1efb6d5abd9b53b75fb6b8 [file] [log] [blame]
package org.eclipse.emf.ecp.emf2web.json.generator.xtend
import com.google.gson.JsonParser
import java.util.ArrayList
import java.util.Arrays
import java.util.List
import org.eclipse.emf.ecore.EcoreFactory
import org.eclipse.emf.ecore.EcorePackage
import org.junit.Before
import org.junit.Test
import static org.junit.Assert.*
import org.eclipse.emf.ecp.emf2web.json.generator.xtend.EcoreJsonGenerator
import org.eclipse.emf.ecore.EClassifier
class EcoreJsonExporter_Test {
static final val ECORE_PACKAGE = EcorePackage.eINSTANCE
static final val ECORE_FACTORY = EcoreFactory.eINSTANCE
static final val TEST_ECLASS_NAME = "TestEClass";
static final val TEST_EATTRIBUTE_NAME = "testAttribute";
static final val TEST_EREFERENCE_NAME = "testReference";
final val List<String> testEnumValues = new ArrayList<String>(Arrays.asList("1A", "2B"))
private EcoreJsonGenerator exporter;
@Before
def void init() {
exporter = new EcoreJsonGenerator()
}
def buildEnum() {
val eEnum = ECORE_FACTORY.createEEnum
eEnum.name = EcoreJsonExporter_Test.TEST_ECLASS_NAME
for (String literal : testEnumValues) {
val enumLiteral = ECORE_FACTORY.createEEnumLiteral
enumLiteral.name = literal
eEnum.getELiterals.add(enumLiteral)
}
eEnum
}
@Test
def void createJsonSchemaElementFromEClassWithOptionalSingleReference() {
val eClass = ECORE_FACTORY.createEClass
eClass.name = EcoreJsonExporter_Test.TEST_ECLASS_NAME
val refClass = ECORE_FACTORY.createEClass
refClass.name = EcoreJsonExporter_Test.TEST_ECLASS_NAME + "2"
val eReference = eReference(-1, 1, refClass)
eClass.getEStructuralFeatures.add(eReference)
val result = exporter.createJsonElement(eClass)
assertEquals(eClassWithOptionalSingleReferencedEClassJsonElement, result)
}
@Test
def void createJsonSchemaElementFromEClassWithMandatorySingleReference() {
val eClass = ECORE_FACTORY.createEClass
eClass.name = EcoreJsonExporter_Test.TEST_ECLASS_NAME
val refClass = ECORE_FACTORY.createEClass
refClass.name = EcoreJsonExporter_Test.TEST_ECLASS_NAME + "2"
val eReference = eReference(1, 1, refClass)
eClass.getEStructuralFeatures.add(eReference)
val result = exporter.createJsonElement(eClass)
assertEquals(eClassWithMandatorySingleReferencedEClassJsonElement, result)
}
@Test
def void createJsonSchemaElementFromEClassWithOptionalMultiReference() {
val eClass = ECORE_FACTORY.createEClass
eClass.name = EcoreJsonExporter_Test.TEST_ECLASS_NAME
val refClass = ECORE_FACTORY.createEClass
refClass.name = EcoreJsonExporter_Test.TEST_ECLASS_NAME + "2"
val eReference = eReference(-1, 10, refClass)
eClass.getEStructuralFeatures.add(eReference)
val result = exporter.createJsonElement(eClass)
assertEquals(eClassWithOptionalMultiReferencedEClassJsonElement, result)
}
@Test
def void createJsonSchemaElementFromEClassWithMandatoryMultiReference() {
val eClass = ECORE_FACTORY.createEClass
eClass.name = EcoreJsonExporter_Test.TEST_ECLASS_NAME
val refClass = ECORE_FACTORY.createEClass
refClass.name = EcoreJsonExporter_Test.TEST_ECLASS_NAME + "2"
val eReference = eReference(1, 10, refClass)
eClass.getEStructuralFeatures.add(eReference)
val result = exporter.createJsonElement(eClass)
assertEquals(eClassWithMandatoryMultiReferencedEClassJsonElement, result)
}
@Test
def void createJsonSchemaElementFromEClassWithCircleReference() {
val eClass = ECORE_FACTORY.createEClass
eClass.name = EcoreJsonExporter_Test.TEST_ECLASS_NAME
val refClass = ECORE_FACTORY.createEClass
refClass.name = EcoreJsonExporter_Test.TEST_ECLASS_NAME + "2"
val eReference = eReference(-1, 1, refClass)
eClass.getEStructuralFeatures.add(eReference)
val eReference2 = eReference(-1, 1, eClass)
refClass.getEStructuralFeatures.add(eReference2)
val result = exporter.createJsonElement(eClass)
// eReference2 should not exist in output
assertEquals(eClassWithOptionalSingleReferencedEClassJsonElement, result)
}
/*
* New tests
*/
@Test
def void createJsonSchemaElementFromEmptyEClass() {
val eClass = emptyEClass()
val result = exporter.createJsonElement(eClass)
assertEquals(emptyEClassJsonElement(), result);
}
@Test
def void createJsonSchemaElementFromEClassWithOptionalStringAttribute() {
val eClass = emptyEClass()
val optionalStringEAttribute = stringEAttribute(0, 1)
eClass.getEStructuralFeatures.add(optionalStringEAttribute)
val result = exporter.createJsonElement(eClass)
assertEquals(eClassWithOptionalStringEAttributeJsonElement(), result);
}
@Test
def void createJsonSchemaElementFromEClassWithMandatoryStringAttribute() {
val eClass = emptyEClass()
val mandatoryStringEAttribute = stringEAttribute(1, 1)
eClass.getEStructuralFeatures.add(mandatoryStringEAttribute)
val result = exporter.createJsonElement(eClass)
assertEquals(eClassWithMandatoryStringEAttributeJsonElement(), result);
}
private def emptyEClass() {
val eClass = ECORE_FACTORY.createEClass
eClass.name = TEST_ECLASS_NAME
eClass
}
private def stringEAttribute(int lower, int upper) {
val eAttribute = ECORE_FACTORY.createEAttribute
eAttribute.name = TEST_EATTRIBUTE_NAME
eAttribute.lowerBound = lower
eAttribute.upperBound = upper
eAttribute.EType = ECORE_PACKAGE.getEString
eAttribute
}
private def eReference(int lower, int upper, EClassifier type) {
val eReference = ECORE_FACTORY.createEReference
eReference.name = TEST_EREFERENCE_NAME
eReference.lowerBound = lower
eReference.upperBound = upper
eReference.EType = type
eReference
}
private def emptyEClassJsonElement() {
'''
{
"type": "object",
"properties": {
},
"additionalProperties": false
}
'''.toJsonElement
}
private def eClassWithOptionalStringEAttributeJsonElement() {
'''
{
"type": "object",
"properties": {
"«TEST_EATTRIBUTE_NAME»": {"type": "string"}
},
"additionalProperties": false
}
'''.toJsonElement
}
private def eClassWithMandatoryStringEAttributeJsonElement() {
'''
{
"type": "object",
"properties": {
"«TEST_EATTRIBUTE_NAME»": {"type": "string"}
},
"additionalProperties": false,
"required": [
"«TEST_EATTRIBUTE_NAME»"
]
}
'''.toJsonElement
}
private def eClassWithOptionalSingleReferencedEClassJsonElement() {
'''
{
"type": "object",
"properties": {
"«TEST_EREFERENCE_NAME»": {
"type": "object",
"properties": {},
"additionalProperties": false
}
},
"additionalProperties": false
}
'''.toJsonElement
}
private def eClassWithMandatorySingleReferencedEClassJsonElement() {
'''
{
"type": "object",
"properties": {
"«TEST_EREFERENCE_NAME»": {
"type": "object",
"properties": {},
"additionalProperties": false
}
},
"additionalProperties": false,
"required": [
"«TEST_EREFERENCE_NAME»"
]
}
'''.toJsonElement
}
private def eClassWithOptionalMultiReferencedEClassJsonElement() {
'''
{
"type": "object",
"properties": {
"«TEST_EREFERENCE_NAME»": {
"type": "array",
"items":{
"type": "object",
"properties": {},
"additionalProperties": false
}
}
},
"additionalProperties": false
}
'''.toJsonElement
}
private def eClassWithMandatoryMultiReferencedEClassJsonElement() {
'''
{
"type": "object",
"properties": {
"«TEST_EREFERENCE_NAME»": {
"type": "array",
"items":{
"type": "object",
"properties": {},
"additionalProperties": false
}
}
},
"additionalProperties": false,
"required": [
"«TEST_EREFERENCE_NAME»"
]
}
'''.toJsonElement
}
private def toJsonElement(CharSequence chars) {
new JsonParser().parse(chars.toString)
}
}