blob: ca108d402d3aa5eb501bb48120bccd524b4e0652 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 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.sdk.internal.test.util.signature;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.Signature;
import org.eclipse.scout.commons.CollectionUtility;
import org.eclipse.scout.sdk.extensions.runtime.classes.IRuntimeClasses;
import org.eclipse.scout.sdk.extensions.runtime.classes.RuntimeClasses;
import org.eclipse.scout.sdk.internal.test.AbstractScoutSdkTest;
import org.eclipse.scout.sdk.testing.SdkAssert;
import org.eclipse.scout.sdk.util.signature.IImportValidator;
import org.eclipse.scout.sdk.util.signature.IResolvedTypeParameter;
import org.eclipse.scout.sdk.util.signature.ITypeParameterMapping;
import org.eclipse.scout.sdk.util.signature.ImportValidator;
import org.eclipse.scout.sdk.util.signature.SignatureCache;
import org.eclipse.scout.sdk.util.signature.SignatureUtility;
import org.eclipse.scout.sdk.util.type.TypeUtility;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* <h3>{@link SignatureUtilityTest}</h3>
*
* @author Andreas Hoegger
* @since 1.0.8 23.02.2011
*/
public class SignatureUtilityTest extends AbstractScoutSdkTest {
private static final String LONG_SIGNATURE = SignatureCache.createTypeSignature(Long.class.getName());
private static final String TEST_PACKAGE = "signature.tests";
@BeforeClass
public static void setUpWorkspace() throws Exception {
setupWorkspace("resources/util/signature", "signature.tests");
}
@Test
public void testSimpleSignature() throws Exception {
String signature = "Ljava.lang.String;";
IImportValidator validator = new ImportValidator(TEST_PACKAGE);
Assert.assertEquals(SignatureUtility.getTypeReference(signature, validator), "String");
}
@Test
public void testGetResolvedSignature_Long() throws Exception {
ImportValidator importValidator = new ImportValidator(TEST_PACKAGE);
Assert.assertEquals("Long", SignatureUtility.getTypeReference(LONG_SIGNATURE, importValidator));
}
@Test
public void testGetSimpleTypeSignature_LongArray() throws Exception {
ImportValidator importValidator = new ImportValidator(TEST_PACKAGE);
String signature = Signature.createArraySignature(LONG_SIGNATURE, 1);
Assert.assertEquals("Long[]", SignatureUtility.getTypeReference(signature, importValidator));
}
@Test
public void testGetSimpleTypeSignature_ArrayOfStringSets() throws Exception {
ImportValidator importValidator = new ImportValidator(TEST_PACKAGE);
String signature = SignatureCache.createTypeSignature("java.util.Set<java.lang.String>[]");
Assert.assertEquals("Set<String>[]", SignatureUtility.getTypeReference(signature, importValidator));
Set<String> imports = importValidator.getImportsToCreate();
Assert.assertTrue(imports.contains("java.util.Set"));
}
@Test
public void testObjectSignatureSlashBased() throws Exception {
ImportValidator importValidator = new ImportValidator(TEST_PACKAGE);
String signature = "Ljava/lang/Object;";
Assert.assertEquals("java/lang/Object", SignatureUtility.getTypeReference(signature, importValidator));
}
@Test
public void testObjectArray6() throws Exception {
ImportValidator importValidator = new ImportValidator(TEST_PACKAGE);
String signature = "|Ljava/lang/Object;";
Assert.assertEquals("java/lang/Object...", SignatureUtility.getTypeReference(signature, importValidator));
}
@Test
public void testGetSimpleTypeSignature_3dimArrayOfLongArrayOfObjectListsArrayMapSets() throws Exception {
ImportValidator importValidator = new ImportValidator(TEST_PACKAGE);
String signature = SignatureCache.createTypeSignature("java.util.Set<java.util.HashMap<java.lang.Long, java.util.List<java.lang.Object>[]>>[][][]");
Assert.assertEquals("Set<HashMap<Long, List<Object>[]>>[][][]", SignatureUtility.getTypeReference(signature, importValidator));
Set<String> imports = importValidator.getImportsToCreate();
Assert.assertTrue(imports.contains("java.util.Set"));
Assert.assertTrue(imports.contains("java.util.HashMap"));
Assert.assertTrue(imports.contains("java.util.List"));
}
@Test
//TODO: re-enable timeout as soon as a dedicated performance testing infrastructure is available (timeout = 250L)
public void testClassParameterized() throws Exception {
String signature = "[Ljava.lang.Class<+[Lcom.bsiag.scout.client.ui.desktop.outline.IOutline;>;";
ImportValidator validator = new ImportValidator(TEST_PACKAGE);
String result = SignatureUtility.getTypeReference(signature, validator);
Assert.assertEquals("Class<? extends IOutline[]>[]", result);
}
@Test
//TODO: re-enable timeout as soon as a dedicated performance testing infrastructure is available (timeout = 8L)
public void testComplexNestedArrayListHashMapArray() throws Exception {
String signature = "[Ljava.util.HashMap<Ljava.util.ArrayList<[[Ljava.lang.String;>;Lorg.eclipse.scout.sdk.workspace.member.IScoutType;>;";
ImportValidator validator = new ImportValidator(TEST_PACKAGE);
String result = SignatureUtility.getTypeReference(signature, validator);
Assert.assertEquals("HashMap<ArrayList<String[][]>, IScoutType>[]", result);
}
@Test
public void testGenericByteArray() throws Exception {
String signature = "L" + RuntimeClasses.AbstractPropertyData + "<[" + Signature.SIG_BYTE + ">;";
IImportValidator validator = new ImportValidator(TEST_PACKAGE);
Assert.assertEquals(SignatureUtility.getTypeReference(signature, validator), "AbstractPropertyData<byte[]>");
}
@Test
public void testGenericOfAny() throws Exception {
String signature = "L" + RuntimeClasses.AbstractPropertyData + "<*>;";
IImportValidator validator = new ImportValidator(TEST_PACKAGE);
Assert.assertEquals(SignatureUtility.getTypeReference(signature, validator), "AbstractPropertyData<?>");
Set<String> imports = validator.getImportsToCreate();
Assert.assertTrue(imports.remove(RuntimeClasses.AbstractPropertyData));
Assert.assertTrue(imports.isEmpty());
}
@Test
public void testGenericExtendsWithArray() throws Exception {
String signature = "[Ljava.lang.Class<+[Lcom.bsiag.scout.client.ui.desktop.outline.IOutline;>;";
IImportValidator validator = new ImportValidator(TEST_PACKAGE);
Assert.assertEquals(SignatureUtility.getTypeReference(signature, validator), "Class<? extends IOutline[]>[]");
Set<String> imports = validator.getImportsToCreate();
Assert.assertTrue(imports.remove("com.bsiag.scout.client.ui.desktop.outline.IOutline"));
Assert.assertTrue(imports.isEmpty());
}
@Test
public void testResolveSignature() throws Exception {
IType type = TypeUtility.getType("signature.tests.SignatureTest");
String resolvedSignature01 = SignatureUtility.getResolvedSignature("Qsignature.tests.SignatureRefType.InnerType01;", type);
Assert.assertEquals("Lsignature.tests.SignatureRefType.InnerType01;", resolvedSignature01);
Assert.assertTrue(TypeUtility.exists(TypeUtility.getTypeBySignature(resolvedSignature01)));
String resolvedSignature02 = SignatureUtility.getResolvedSignature("QSignatureRefType.InnerType01;", type);
Assert.assertEquals("Lsignature.tests.SignatureRefType.InnerType01;", resolvedSignature02);
Assert.assertTrue(TypeUtility.exists(TypeUtility.getTypeBySignature(resolvedSignature02)));
String resolvedSignature03 = SignatureUtility.getResolvedSignature("QInnerType01;", type);
Assert.assertEquals("Lsignature.tests.SignatureRefType.InnerType01;", resolvedSignature03);
Assert.assertTrue(TypeUtility.exists(TypeUtility.getTypeBySignature(resolvedSignature03)));
String resolvedSig04 = SignatureUtility.getResolvedSignature("Qsignature.tests.SignatureRefType.InnerType02.InnerType03;", type);
Assert.assertEquals("Lsignature.tests.SignatureRefType.InnerType02.InnerType03;", resolvedSig04);
Assert.assertTrue(TypeUtility.exists(TypeUtility.getTypeBySignature(resolvedSig04)));
String resolvedSig05 = SignatureUtility.getResolvedSignature("QSignatureRefType.InnerType02.InnerType03;", type);
Assert.assertEquals("Lsignature.tests.SignatureRefType.InnerType02.InnerType03;", resolvedSig05);
Assert.assertTrue(TypeUtility.exists(TypeUtility.getTypeBySignature(resolvedSig05)));
String resolvedSig06 = SignatureUtility.getResolvedSignature("QInnerType02.InnerType03;", type);
Assert.assertEquals("Lsignature.tests.SignatureRefType.InnerType02.InnerType03;", resolvedSig06);
Assert.assertTrue(TypeUtility.exists(TypeUtility.getTypeBySignature(resolvedSig06)));
}
@Test
public void testGenericResolver01() throws Exception {
String superTypeSignature = Signature.createTypeSignature("signature.tests.generic.AbstractClass01<" + String.class.getName() + "," + Integer.class.getName() + ">", true);
Map<String, ITypeParameterMapping> mappings = SignatureUtility.resolveTypeParameters(Signature.createTypeSignature("signature.tests.generic.output.TestType", true), superTypeSignature, null);
Assert.assertEquals(CollectionUtility.hashSet(Signature.createTypeSignature(String.class.getName(), true)),
mappings.get("signature.tests.generic.IInterface01").getTypeParameterBounds(0));
Assert.assertEquals(CollectionUtility.hashSet(Signature.createTypeSignature(Integer.class.getName(), true)),
mappings.get("signature.tests.generic.IInterface02").getTypeParameterBounds(0));
}
@Test
public void testGenericResolver02() throws Exception {
String superTypeSignature = Signature.createTypeSignature("signature.tests.generic.AbstractClass02<" + Integer.class.getName() + ">", true);
Map<String, ITypeParameterMapping> mappings = SignatureUtility.resolveTypeParameters(Signature.createTypeSignature("signature.tests.generic.output.TestType", true), superTypeSignature, null);
Assert.assertEquals(CollectionUtility.hashSet(Signature.createTypeSignature(String.class.getName(), true)),
mappings.get("signature.tests.generic.IInterface01").getTypeParameterBounds("GENERIC"));
Assert.assertEquals(CollectionUtility.hashSet(Signature.createTypeSignature(List.class.getName() + "<" + Integer.class.getName() + ">", true)),
mappings.get("signature.tests.generic.IInterface02").getTypeParameterBounds("A"));
}
@Test
public void testGenericResolver03() throws Exception {
String superTypeSignature = Signature.createTypeSignature("org.eclipse.scout.rt.client.ui.form.fields.smartfield.AbstractSmartField<" + Integer.class.getName() + ">", true);
Map<String, ITypeParameterMapping> mappings = SignatureUtility.resolveTypeParameters(Signature.createTypeSignature("signature.tests.generic.output.TestType", true), superTypeSignature, null);
Assert.assertEquals(CollectionUtility.hashSet(Signature.createTypeSignature(Integer.class.getName(), true)),
mappings.get("org.eclipse.scout.rt.client.ui.form.fields.smartfield.AbstractSmartField").getTypeParameterBounds(0));
}
@Test
public void testGenericResolver04() throws Exception {
Map<String, ITypeParameterMapping> mappings = SignatureUtility.resolveTypeParameters(TypeUtility.getType("org.eclipse.scout.rt.client.ui.form.fields.smartfield.AbstractSmartField"));
Assert.assertEquals(CollectionUtility.hashSet("TVALUE;"),
mappings.get(IRuntimeClasses.IValueField).getTypeParameterBounds(0));
}
@Test
public void testGenericResolver05() throws Exception {
String typeName = "org.eclipse.scout.rt.shared.extension.AbstractSerializableExtension";
Map<String, ITypeParameterMapping> mappings = SignatureUtility.resolveTypeParameters(TypeUtility.getType(typeName));
Assert.assertEquals(CollectionUtility.hashSet(Signature.createTypeSignature("org.eclipse.scout.rt.shared.extension.IExtensibleObject", true), Signature.createTypeSignature(Serializable.class.getName(), true)),
mappings.get(typeName).getTypeParameter(0).getBoundsSignatures());
}
@Test
public void testGenericResolver06() throws Exception {
String typeName = "signature.tests.generic.AbstractClass02B";
String superTypeName = "signature.tests.generic.AbstractClass01";
Map<String, ITypeParameterMapping> mappings = SignatureUtility.resolveTypeParameters(TypeUtility.getType(typeName));
Assert.assertEquals(2, mappings.get(typeName).getTypeParameter("X").getSuperReferences(superTypeName).size());
}
@Test
public void testGenericResolver07() throws Exception {
String typeName = "signature.tests.generic.AbstractClass02C";
String superTypeName = "signature.tests.generic.AbstractClass01";
Map<String, ITypeParameterMapping> mappings = SignatureUtility.resolveTypeParameters(TypeUtility.getType(typeName));
Assert.assertEquals(1, mappings.get(typeName).getTypeParameter("X").getSuperReferences(superTypeName).size());
}
@Test
public void testGenericResolverHierarchy() throws Exception {
String startClass = "signature.tests.generic.Level01Class";
String middleClass = "signature.tests.generic.Level02Class";
String middleIfc = "signature.tests.generic.Level02Ifc";
String topIfc = "signature.tests.generic.Level03Ifc";
String topIfcB = "signature.tests.generic.Level03IfcB";
String topClass = "signature.tests.generic.Level03Class";
IType type = TypeUtility.getType(startClass);
SdkAssert.assertExist(type);
Map<String, ITypeParameterMapping> collector = SignatureUtility.resolveTypeParameters(type);
Assert.assertEquals(8, collector.size());
ITypeParameterMapping mappingLevel01 = collector.get(startClass);
Assert.assertEquals(2, mappingLevel01.getParameterCount());
Assert.assertEquals(CollectionUtility.hashSet("TA01;"), mappingLevel01.getTypeParameter(0).getBoundsSignatures());
Assert.assertEquals(CollectionUtility.hashSet("TB01;"), mappingLevel01.getTypeParameter(1).getBoundsSignatures());
Map<String, ITypeParameterMapping> mappingLevel02 = mappingLevel01.getSuperMappings();
Assert.assertEquals(3, mappingLevel02.size());
ITypeParameterMapping middleClassMapping = mappingLevel01.getSuperMapping(middleClass);
ITypeParameterMapping middleIfcMapping = middleClassMapping.getSuperMapping(middleIfc);
Assert.assertEquals(1, middleIfcMapping.getTypeParameter("BI02").getOrdinal());
ITypeParameterMapping topIfcMapping = middleIfcMapping.getSuperMapping(topIfcB);
Assert.assertEquals(CollectionUtility.hashSet("TB01;"), topIfcMapping.getTypeParameterBounds(0));
// A01 on Level01Class
IResolvedTypeParameter A01 = mappingLevel01.getTypeParameter(0);
Map<String, Set<IResolvedTypeParameter>> allReferences = A01.getSuperReferences();
Assert.assertEquals(2, allReferences.size());
// A01 on Level02Class
Set<IResolvedTypeParameter> referencesOfA01 = A01.getSuperReferences(middleClass);
Assert.assertEquals(1, referencesOfA01.size());
A01 = CollectionUtility.firstElement(referencesOfA01);
// A01 on Level02Ifc
referencesOfA01 = A01.getSuperReferences(middleIfc);
Assert.assertEquals(1, referencesOfA01.size());
A01 = CollectionUtility.firstElement(referencesOfA01);
// A01 on Level03Ifc
referencesOfA01 = A01.getSuperReferences(topIfc);
Assert.assertEquals(1, referencesOfA01.size());
A01 = CollectionUtility.firstElement(referencesOfA01);
// check that no duplicates are created
Assert.assertSame(collector.get(topIfc).getTypeParameter("AI03"), A01);
IResolvedTypeParameter correspondingTypeParameterOnSubLevel = A01.getCorrespondingTypeParameterOnSubLevel(mappingLevel01.getType());
// walk down again
A01 = A01.getSubReference(topClass).getSubReference(middleClass).getSubReference(startClass);
Assert.assertSame(mappingLevel01.getTypeParameter("A01"), A01);
Assert.assertSame(A01, correspondingTypeParameterOnSubLevel);
Assert.assertEquals(0, A01.getOrdinal());
}
}