blob: 69f943959f1158ecabca4eff44b453c295754ed7 [file] [log] [blame]
/**
* Copyright (c) 2009 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* IBM - Initial API and implementation
*/
package org.eclipse.emf.test.tools;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.Collections;
// Comment this out to test old ImportManager.
//
import org.eclipse.emf.codegen.util.ImportManager;
import org.junit.Before;
import org.junit.Test;
/**
* Tests for {@link org.eclipse.emf.codegen.util.ImportManager ImportManager}.
* These tests were added when <code>ImportManager</code> underwent major changes in EMF 2.5.
* They are divided into those that worked on the old implementation and those that only work on the new one.
* The old implementation is replicated, and extended with new APIs, in {@link org.eclipse.emf.test.tools.ImportManager}.
* <p>To run the appropriate tests on the old implementation, simply comment out the <code>ImportManager</code> import.
*/
public class ImportManagerTest
{
private static final String NL = System.getProperty("line.separator");
private ImportManager importManager;
@Before
public void setUp() throws Exception
{
importManager = new ImportManager("org.eclipse.example.test", "GeneratingClass");
}
@Test
public void testSimpleImport()
{
importManager.addImport("a.MyClass");
importManager.addImport("a.b.c.MyOtherClass");
importManager.addImport("a.b.c.ItemClass[]");
assertSimpleImport();
}
@Test
public void testSimpleImport2()
{
importManager.addImport("a", "MyClass");
importManager.addImport("a.b.c", "MyOtherClass");
importManager.addImport("a.b.c", "ItemClass[]");
assertSimpleImport();
}
private void assertSimpleImport()
{
assertEquals(3, importManager.getImports().size());
assertTrue(importManager.hasImport("MyClass"));
assertTrue(importManager.hasImport("MyOtherClass"));
assertTrue(importManager.hasImport("ItemClass"));
assertEquals("MyClass", importManager.getImportedName("a.MyClass"));
assertEquals("MyOtherClass", importManager.getImportedName("a.b.c.MyOtherClass"));
assertEquals("ItemClass", importManager.getImportedName("a.b.c.ItemClass"));
assertEquals("ItemClass[]", importManager.getImportedName("a.b.c.ItemClass[]"));
assertEquals("ItemClass[][]", importManager.getImportedName("a.b.c.ItemClass[][]"));
assertEquals("a.b.Foo", importManager.getImportedName("a.b.Foo"));
assertEquals(NL + "import a.MyClass;" + NL + NL + "import a.b.c.ItemClass;" + NL + "import a.b.c.MyOtherClass;", importManager.computeSortedImports());
}
@Test
public void testWhitespaceImport()
{
importManager.addImport("a. b. c. MyThirdClass");
assertWhitespaceImport();
}
@Test
public void testWhitespaceImport2()
{
importManager.addImport("a. b. c", " MyThirdClass");
assertWhitespaceImport();
}
private void assertWhitespaceImport()
{
assertEquals(1, importManager.getImports().size());
assertTrue(importManager.hasImport("MyThirdClass"));
assertEquals("MyThirdClass", importManager.getImportedName("a.b.c.MyThirdClass"));
assertEquals(" MyThirdClass", importManager.getImportedName("a. b. c. MyThirdClass"));
assertEquals("a.b . Foo", importManager.getImportedName("a.b . Foo"));
assertEquals(NL + "import a.b.c.MyThirdClass;", importManager.computeSortedImports());
}
@Test
public void testNestedImport()
{
importManager.addImport("a.b.c.OuterClass$InnerClass");
importManager.addImport("a.b.c.C1$C2$C3");
assertNestedImport();
}
@Test
public void testNestedImport2()
{
importManager.addImport("a.b.c", "OuterClass");
importManager.addImport("a.b.c", "C1");
assertNestedImport();
}
private void assertNestedImport()
{
assertEquals(2, importManager.getImports().size());
assertTrue(importManager.hasImport("OuterClass"));
assertFalse(importManager.hasImport("InnerClass"));
assertTrue(importManager.hasImport("C1"));
assertFalse(importManager.hasImport("C2"));
assertFalse(importManager.hasImport("C3"));
assertEquals("OuterClass", importManager.getImportedName("a.b.c.OuterClass"));
assertEquals("OuterClass.InnerClass", importManager.getImportedName("a.b.c.OuterClass$InnerClass"));
assertEquals("C1", importManager.getImportedName("a.b.c.C1"));
assertEquals("C1.C2", importManager.getImportedName("a.b.c.C1$C2"));
assertEquals("C1.C2.C3", importManager.getImportedName("a.b.c.C1$C2$C3"));
assertEquals(NL + "import a.b.c.C1;" + NL + "import a.b.c.OuterClass;", importManager.computeSortedImports());
}
@Test
public void testFullNestedImport()
{
importManager.addImport("a.b.c.Foo.Bar.Baz");
assertTrue(importManager.hasImport("Baz"));
assertFalse(importManager.hasImport("Bar"));
assertFalse(importManager.hasImport("Foo"));
assertEquals("Baz", importManager.getImportedName("a.b.c.Foo$Bar$Baz"));
assertEquals("Baz", importManager.getImportedName("a.b.c.Foo.Bar.Baz"));
assertEquals("a.b.c.Foo.Bar", importManager.getImportedName("a.b.c.Foo$Bar"));
assertEquals("a.b.c.Foo.Bar", importManager.getImportedName("a.b.c.Foo.Bar"));
assertEquals("a.b.c.Foo", importManager.getImportedName("a.b.c.Foo"));
importManager.addImport("a.b.c.Foo.Bar$Baz");
assertTrue(importManager.hasImport("Baz"));
assertTrue(importManager.hasImport("Bar"));
assertFalse(importManager.hasImport("Foo"));
assertEquals("Bar.Baz", importManager.getImportedName("a.b.c.Foo$Bar$Baz"));
assertEquals("Baz", importManager.getImportedName("a.b.c.Foo.Bar.Baz"));
assertEquals("Bar", importManager.getImportedName("a.b.c.Foo$Bar"));
assertEquals("Bar", importManager.getImportedName("a.b.c.Foo.Bar"));
assertEquals("a.b.c.Foo", importManager.getImportedName("a.b.c.Foo"));
importManager.addImport("a.b.c.Foo$Bar$Baz");
assertTrue(importManager.hasImport("Baz"));
assertTrue(importManager.hasImport("Bar"));
assertTrue(importManager.hasImport("Foo"));
assertEquals("Foo.Bar.Baz", importManager.getImportedName("a.b.c.Foo$Bar$Baz"));
assertEquals("Baz", importManager.getImportedName("a.b.c.Foo.Bar.Baz"));
assertEquals("Foo.Bar", importManager.getImportedName("a.b.c.Foo$Bar"));
assertEquals("Bar", importManager.getImportedName("a.b.c.Foo.Bar"));
assertEquals("Foo", importManager.getImportedName("a.b.c.Foo"));
}
@Test
public void testNestedWildcardImport()
{
importManager.addImport("a.b.c.Foo.Bar.*");
assertEquals("Baz", importManager.getImportedName("a.b.c.Foo$Bar$Baz"));
}
@Test
public void testUnqualifiedTypeImport()
{
assertEquals("Foo", importManager.getImportedName("Foo"));
}
@Test
public void testConflictingImport()
{
importManager.addImport("a.b.c.Foo");
importManager.addImport("d.e.Foo");
importManager.addImport("a.Foo");
assertEquals(1, importManager.getImports().size());
assertTrue(importManager.hasImport("Foo"));
assertEquals("Foo", importManager.getImportedName("a.b.c.Foo"));
assertEquals("d.e.Foo", importManager.getImportedName("d.e.Foo"));
assertEquals("a.Foo", importManager.getImportedName("a.Foo"));
}
@Test
public void testPseudoImport()
{
importManager.addPseudoImport("a.b.c.Foo");
importManager.addImport("d.e.Foo");
importManager.addImport("a.Foo");
assertEquals(0, importManager.getImports().size());
assertTrue(importManager.hasImport("Foo"));
assertEquals("Foo", importManager.getImportedName("a.b.c.Foo"));
assertEquals("d.e.Foo", importManager.getImportedName("d.e.Foo"));
assertEquals("a.Foo", importManager.getImportedName("a.Foo"));
}
@Test
public void testMasterImport()
{
importManager.addImport("a.b.c.GeneratingClass");
assertEquals(0, importManager.getImports().size());
assertTrue(importManager.hasImport("GeneratingClass"));
assertEquals("GeneratingClass", importManager.getImportedName("org.eclipse.example.test.GeneratingClass"));
assertEquals("a.b.c.GeneratingClass", importManager.getImportedName("a.b.c.GeneratingClass"));
}
@Test
public void testImplicitJavaImport()
{
assertEquals("String", importManager.getImportedName("java.lang.String"));
}
@Test
public void testConflictingImplicitJavaImport()
{
importManager.addImport("a.b.c.String");
assertEquals("a.b.c.String", importManager.getImportedName("a.b.c.String"));
assertEquals("String", importManager.getImportedName("java.lang.String"));
assertEquals(0, importManager.getImports().size());
assertFalse(importManager.hasImport("String"));
}
@Test
public void testExplicitJavaImport()
{
importManager.addJavaLangImports(Collections.singletonList("String"));
importManager.addImport("a.b.c.String");
assertEquals("a.b.c.String", importManager.getImportedName("a.b.c.String"));
assertEquals("String", importManager.getImportedName("java.lang.String"));
assertEquals(1, importManager.getImports().size());
assertFalse(importManager.hasImport("String"));
}
@Test
public void testWildcardImport()
{
importManager.addImport("a.b.c.Foo");
importManager.addImport("a.b.c.*");
importManager.addImport("a.b.c.Bar");
assertTrue(importManager.hasImport("Foo"));
assertTrue(importManager.hasImport("Bar"));
assertFalse(importManager.hasImport("Baz"));
assertEquals(1, importManager.getImports().size());
assertEquals("Baz", importManager.getImportedName("a.b.c.Baz"));
importManager.addImport("a.b.Baz");
assertTrue(importManager.hasImport("Baz"));
assertEquals(2, importManager.getImports().size());
assertEquals("a.b.c.Baz", importManager.getImportedName("a.b.c.Baz"));
assertEquals("Baz", importManager.getImportedName("a.b.Baz"));
}
@Test
public void testGenericTypeImport()
{
importManager.addImport("a.b.c.MyClass");
importManager.addImport("java.util.Map");
assertEquals("MyClass<Map<String,a.Baz>>", importManager.getImportedName("a.b.c.MyClass<java.util.Map<java.lang.String,a.Baz>>"));
assertEquals("MyClass<Map<a.Baz, String>>", importManager.getImportedName("a.b.c.MyClass<java.util.Map<a.Baz, java.lang.String>>"));
assertEquals("MyClass <Map <a.Baz, String> >", importManager.getImportedName("a.b.c.MyClass <java.util.Map <a.Baz, java.lang.String> >"));
assertEquals("Map < MyClass < a.Baz > , String >", importManager.getImportedName("java.util.Map < a.b.c.MyClass < a.Baz > , java.lang.String >"));
assertEquals(" Map < MyClass < a . Baz > , String >", importManager.getImportedName("java . util . Map < a . b . c . MyClass < a . Baz > , java . lang . String >"));
assertEquals("Map<String, ?>", importManager.getImportedName("java.util.Map<java.lang.String, ?>"));
assertEquals("Map<String, ? extends MyClass & a.Baz>", importManager.getImportedName("java.util.Map<java.lang.String, ? extends a.b.c.MyClass & a.Baz>"));
assertEquals("Map<String, ? super MyClass & a.Baz>", importManager.getImportedName("java.util.Map<java.lang.String, ? super a.b.c.MyClass & a.Baz>"));
}
@Test
public void testAutoImport()
{
assertEquals("Foo", importManager.getImportedName("a.b.c.Foo", true));
assertEquals("d.e.f.Foo", importManager.getImportedName("d.e.f.Foo", true));
assertEquals("Bar", importManager.getImportedName("d.e.f.Bar", true));
}
@Test
public void testAutoGenericTypeImport()
{
assertEquals("MyClass<Map<String,Baz>>", importManager.getImportedName("a.b.c.MyClass<java.util.Map<java.lang.String,a.b.Baz>>", true));
assertEquals("MyClass<Map<a.Baz, String>>", importManager.getImportedName("a.b.c.MyClass<java.util.Map<a.Baz, java.lang.String>>", true));
assertEquals("Map < MyClass < a.Baz > , String >", importManager.getImportedName("java.util.Map < a.b.c.MyClass < a.Baz > , java.lang.String >", true));
}
@Test
public void testAutoGenericTypeWhitespaceImport()
{
assertEquals(" Map < MyClass < Baz > , String >", importManager.getImportedName("java . util . Map < a . b . c . MyClass < a . Baz > , java . lang . String >", true));
}
}