/* * Copyright (c) 2007 BUSINESS OBJECTS SOFTWARE LIMITED * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of Business Objects nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * CALRenaming_Test.java * Creation date: Feb 28, 2005. * By: Peter Cardwell */ package org.openquark.cal.compiler; import java.util.Collections; import junit.extensions.TestSetup; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import org.openquark.cal.CALPlatformTestModuleNames; import org.openquark.cal.compiler.CompilerMessage.Severity; import org.openquark.cal.compiler.SourceIdentifier.Category; import org.openquark.cal.module.Cal.Core.CAL_Prelude; import org.openquark.cal.runtime.MachineType; import org.openquark.cal.services.BasicCALServices; import org.openquark.cal.services.CALServicesTestUtilities; import org.openquark.cal.services.WorkspaceManager; /** * A set of quick unit tests to ensure that the renaming functionality works. * @author Peter Cardwell */ public class CALRenaming_Test extends TestCase { private static final ModuleName Prelude = CAL_Prelude.MODULE_NAME; private static final ModuleName CALRenaming_Test_Support1 = CALPlatformTestModuleNames.CALRenaming_Test_Support1; private static final ModuleName CALRenaming_Test_Support2 = CALPlatformTestModuleNames.CALRenaming_Test_Support2; /** * A copy of CAL services for use in the test cases */ private static BasicCALServices leccServices; /** * Constructor for CALRenaming_Test. * * @param name * the name of the test. */ public CALRenaming_Test(String name) { super(name); } /** * @return a test suite containing all the test cases for testing CAL source * generation. */ public static Test suite() { TestSuite suite = new TestSuite(CALRenaming_Test.class); return new TestSetup(suite) { protected void setUp() { oneTimeSetUp(); } protected void tearDown() { oneTimeTearDown(); } }; } /** * Performs the setup for the test suite. */ private static void oneTimeSetUp() { leccServices = CALServicesTestUtilities.getCommonCALServices(MachineType.LECC, "cal.platform.test.cws"); } /** * Performs the tear down for the test suite. */ private static void oneTimeTearDown() { leccServices = null; } public void testBasicFunctionRenaming() { String sourceText1 = "module " + CALRenaming_Test_Support1 + ";\n" + "import " + Prelude + " using\n" + " function = intToOrdering;\n" + " ;\n" + "foo :: " + Prelude + ".Num a => a -> a -> a;\n" + "public foo x = " + Prelude + ".add x;\n" + "refIntToOrdering = intToOrdering;"; String sourceText2 = "module " + CALRenaming_Test_Support2 + ";\n" + "import " + Prelude + " using\n" + " function = intToOrdering;\n" + " ;\n" + "import " + CALRenaming_Test_Support1 + " using\n" + " function = foo;\n" + " ;\n" + "qualifiedFooReference = " + CALRenaming_Test_Support1 + ".foo;\n" + "unqualifiedFooReference = foo;\n" + "boundBarReference bar =\n" + " foo bar;\n" + "intToOrderingReference = intToOrdering;"; WorkspaceManager workspaceManager = leccServices.getWorkspaceManager(); CompilerMessageLogger logger = new MessageLogger(); ModuleTypeInfo moduleTypeInfo1 = workspaceManager.getModuleTypeInfo(CALRenaming_Test_Support1); ModuleTypeInfo moduleTypeInfo2 = workspaceManager.getModuleTypeInfo(CALRenaming_Test_Support2); QualifiedName oldName = QualifiedName.make(CALRenaming_Test_Support1, "foo"); QualifiedName newName = QualifiedName.make(CALRenaming_Test_Support1, "bar"); SourceModifier renamer1 = IdentifierRenamer.getSourceModifier(moduleTypeInfo1, sourceText1, oldName, newName, Category.TOP_LEVEL_FUNCTION_OR_CLASS_METHOD, logger); assertNoCompilationErrors(logger); SourceModifier renamer2 = IdentifierRenamer.getSourceModifier(moduleTypeInfo2, sourceText2, oldName, newName, Category.TOP_LEVEL_FUNCTION_OR_CLASS_METHOD, logger); assertNoCompilationErrors(logger); String newSourceText1 = renamer1.apply(sourceText1); assertEquals( "module " + CALRenaming_Test_Support1 + ";\n" + "import " + Prelude + " using\n" + " function = intToOrdering;\n" + " ;\n" + "bar :: " + Prelude + ".Num a => a -> a -> a;\n" + "public bar x = " + Prelude + ".add x;\n" + "refIntToOrdering = intToOrdering;", newSourceText1); String newSourceText2 = renamer2.apply(sourceText2); assertEquals( "module " + CALRenaming_Test_Support2 + ";\n" + "import " + Prelude + " using\n" + " function = intToOrdering;\n" + " ;\n" + "import " + CALRenaming_Test_Support1 + " using\n" + " function = bar;\n" + " ;\n" + "qualifiedFooReference = " + CALRenaming_Test_Support1 + ".bar;\n" + "unqualifiedFooReference = bar;\n" + "boundBarReference bar =\n" + " " + CALRenaming_Test_Support1 + ".bar bar;\n" + "intToOrderingReference = intToOrdering;", newSourceText2); } /** * Check that we automatically deal with a renaming that changes one using symbol * to conflict with another (of the same type) */ public void testImportConflict1() { String sourceText = "module " + CALRenaming_Test_Support2 + ";\n" + "import " + Prelude + " using\n" + " function = intToOrdering;\n" + " ;\n" + "import " + CALRenaming_Test_Support1 + " using\n" + " function = foo;\n" + " ;\n" + "qualifiedFooReference = " + CALRenaming_Test_Support1 + ".foo;\n" + "unqualifiedFooReference = foo;\n" + "boundBarReference bar =\n" + " foo bar;\n" + "intToOrderingReference = intToOrdering;"; WorkspaceManager workspaceManager = leccServices.getWorkspaceManager(); CompilerMessageLogger logger = new MessageLogger(); ModuleTypeInfo moduleTypeInfo = workspaceManager.getModuleTypeInfo(CALRenaming_Test_Support2); QualifiedName oldName = QualifiedName.make(CALRenaming_Test_Support1, "foo"); QualifiedName newName = QualifiedName.make(CALRenaming_Test_Support1, "intToOrdering"); SourceModifier renamer = IdentifierRenamer.getSourceModifier(moduleTypeInfo, sourceText, oldName, newName, Category.TOP_LEVEL_FUNCTION_OR_CLASS_METHOD, logger); assertNoCompilationErrors(logger); String newSourceText = renamer.apply(sourceText); assertEquals( "module " + CALRenaming_Test_Support2 + ";\n" + "import " + Prelude + ";\n" + "import " + CALRenaming_Test_Support1 + " using\n" + " function = intToOrdering;\n" + " ;\n" + "qualifiedFooReference = " + CALRenaming_Test_Support1 + ".intToOrdering;\n" + "unqualifiedFooReference = intToOrdering;\n" + "boundBarReference bar =\n" + " intToOrdering bar;\n" + "intToOrderingReference = " + Prelude + ".intToOrdering;", newSourceText); } /** * Check that we deal properly with renaming a function to conflict with a name that * is in a using clause. */ public void testImportConflict2() { String sourceText = "module " + CALRenaming_Test_Support1 + ";\n" + "import " + Prelude + " using\n" + " function = intToOrdering;\n" + " ;\n" + "foo :: " + Prelude + ".Num a => a -> a -> a;\n" + "public foo x = " + Prelude + ".add x;\n" + "refIntToOrdering = intToOrdering;"; WorkspaceManager workspaceManager = leccServices.getWorkspaceManager(); CompilerMessageLogger logger = new MessageLogger(); ModuleTypeInfo moduleTypeInfo = workspaceManager.getModuleTypeInfo(CALRenaming_Test_Support1); QualifiedName oldName = QualifiedName.make(CALRenaming_Test_Support1, "foo"); QualifiedName newName = QualifiedName.make(CALRenaming_Test_Support1, "intToOrdering"); SourceModifier renamer = IdentifierRenamer.getSourceModifier(moduleTypeInfo, sourceText, oldName, newName, Category.TOP_LEVEL_FUNCTION_OR_CLASS_METHOD, logger); assertNoCompilationErrors(logger); String newSourceText = renamer.apply(sourceText); assertEquals( "module " + CALRenaming_Test_Support1 + ";\n" + "import " + Prelude + ";\n" + "intToOrdering :: " + Prelude + ".Num a => a -> a -> a;\n" + "public intToOrdering x = " + Prelude + ".add x;\n" + "refIntToOrdering = " + Prelude + ".intToOrdering;", newSourceText); } /** * Check that we deal properly with renaming an identifier that is in a using-clause to * the same name as a top-level declaration in this module. */ public void testImportConflict3() { String sourceText = "module " + CALRenaming_Test_Support1 + ";\n" + "import " + Prelude + " using\n" + " function = intToOrdering;\n" + " ;\n" + "foo :: " + Prelude + ".Num a => a -> a -> a;\n" + "public foo x = " + Prelude + ".add x;\n" + "refIntToOrdering = intToOrdering;"; WorkspaceManager workspaceManager = leccServices.getWorkspaceManager(); CompilerMessageLogger logger = new MessageLogger(); ModuleTypeInfo moduleTypeInfo = workspaceManager.getModuleTypeInfo(CALRenaming_Test_Support1); QualifiedName oldName = CAL_Prelude.Functions.intToOrdering; QualifiedName newName = QualifiedName.make(Prelude, "foo"); SourceModifier renamer = IdentifierRenamer.getSourceModifier(moduleTypeInfo, sourceText, oldName, newName, Category.TOP_LEVEL_FUNCTION_OR_CLASS_METHOD, logger); assertNoCompilationErrors(logger); String newSourceText = renamer.apply(sourceText); assertEquals( "module " + CALRenaming_Test_Support1 + ";\n" + "import " + Prelude + ";\n" + "foo :: " + Prelude + ".Num a => a -> a -> a;\n" + "public foo x = " + Prelude + ".add x;\n" + "refIntToOrdering = " + Prelude + ".foo;", newSourceText); } /** * Tests that we deal properly with a conflict that gets introduced when * a contextless CALDoc cons reference is rendered ambiguous by renaming * a different kind of cons to have the same name. */ public void testCALDocConflict() { String sourceText = "module " + CALRenaming_Test_Support1 + ";\n" + "import " + Prelude + " using\n" + " function = intToOrdering;\n" + " dataConstructor = Cons;" + " ;\n" + "data Alpha =\n" + " A | B | C;\n" + "\n" + "/** @see module = " + CALRenaming_Test_Support1 + " */\n" + "foobar :: " + Prelude + ".Double;\n" + "private foobar = let /** @see module = " + CALRenaming_Test_Support1 + " */ foo = 7.0; /** @see module = " + CALRenaming_Test_Support1 + " */ bar :: " + Prelude + ".Int; bar = 7; in foo;\n" + "/**\n" + " * @see Alpha, Beta, Gamma, Cons, foobar\n" + " */\n" + "data Beta =\n" + " Gamma;\n"; WorkspaceManager workspaceManager = leccServices.getWorkspaceManager(); CompilerMessageLogger logger = new MessageLogger(); ModuleTypeInfo moduleTypeInfo = workspaceManager.getModuleTypeInfo(CALRenaming_Test_Support1); QualifiedName oldName = QualifiedName.make(CALRenaming_Test_Support1, "Gamma"); QualifiedName newName = QualifiedName.make(CALRenaming_Test_Support1, "Alpha"); SourceModifier renamer = IdentifierRenamer.getSourceModifier(moduleTypeInfo, sourceText, oldName, newName, Category.DATA_CONSTRUCTOR, logger); assertNoCompilationErrors(logger); String newSourceText = renamer.apply(sourceText); CompilerTestUtilities.assertEqualsCanonicalLineFeed( "module " + CALRenaming_Test_Support1 + ";\n" + "import " + Prelude + " using\n" + " function = intToOrdering;\n" + " dataConstructor = Cons;" + " ;\n" + "data Alpha =\n" + " A | B | C;\n" + "\n" + "/** @see module = " + CALRenaming_Test_Support1 + " */\n" + "foobar :: " + Prelude + ".Double;\n" + "private foobar = let /** @see module = " + CALRenaming_Test_Support1 + " */ foo = 7.0; /** @see module = " + CALRenaming_Test_Support1 + " */ bar :: " + Prelude + ".Int; bar = 7; in foo;\n" + "/**\n" + " * @see typeConstructor = Alpha\n" + " * @see Beta\n" + " * @see dataConstructor = Alpha\n" + " * @see Cons\n" + " * @see foobar\n" + " * \n" + " */\n" + "data Beta =\n" + " Alpha;\n", newSourceText); } public void testImportAndCALDocConflict1() { String sourceText = "module " + CALRenaming_Test_Support1 + ";\n" + "import " + Prelude + " using\n" + " function = intToOrdering;\n" + " dataConstructor = Cons;" + " ;\n" + "data Alpha =\n" + " A | B | C;\n" + "\n" + "/** @see module = " + CALRenaming_Test_Support1 + " */\n" + "foobar :: " + Prelude + ".Double;\n" + "private foobar = let /** @see module = " + CALRenaming_Test_Support1 + " */ foo = 7.0; /** @see module = " + CALRenaming_Test_Support1 + " */ bar :: " + Prelude + ".Int; bar = 7; in foo;\n" + "/**\n" + " * @see Alpha, Beta, Gamma, Cons, foobar\n" + " */\n" + "data Beta =\n" + " Gamma;\n"; WorkspaceManager workspaceManager = leccServices.getWorkspaceManager(); CompilerMessageLogger logger = new MessageLogger(); ModuleTypeInfo moduleTypeInfo = workspaceManager.getModuleTypeInfo(CALRenaming_Test_Support1); QualifiedName oldName = QualifiedName.make(CALRenaming_Test_Support1, "Gamma"); QualifiedName newName = QualifiedName.make(CALRenaming_Test_Support1, "Cons"); SourceModifier renamer = IdentifierRenamer.getSourceModifier(moduleTypeInfo, sourceText, oldName, newName, Category.DATA_CONSTRUCTOR, logger); assertNoCompilationErrors(logger); String newSourceText = renamer.apply(sourceText); CompilerTestUtilities.assertEqualsCanonicalLineFeed( "module " + CALRenaming_Test_Support1 + ";\n" + "import " + Prelude + " using\n" + " function = intToOrdering;\n" + " ;\n" + "data Alpha =\n" + " A | B | C;\n" + "\n" + "/** @see module = " + CALRenaming_Test_Support1 + " */\n" + "foobar :: " + Prelude + ".Double;\n" + "private foobar = let /** @see module = " + CALRenaming_Test_Support1 + " */ foo = 7.0; /** @see module = " + CALRenaming_Test_Support1 + " */ bar :: " + Prelude + ".Int; bar = 7; in foo;\n" + "/**\n" + " * @see Alpha\n" + " * @see Beta\n" + " * @see dataConstructor = Cons\n" + " * @see dataConstructor = Cons\n" + //TODOJ " * @see foobar\n" + " * \n" + " */\n" + "data Beta =\n" + " Cons;\n", newSourceText); } public void testImportAndCALDocConflict2() { String sourceText = "module " + CALRenaming_Test_Support1 + ";\n" + "import " + Prelude + " using\n" + " function = intToOrdering;\n" + " dataConstructor = Cons;" + " ;\n" + "data Alpha =\n" + " A | B | C;\n" + "\n" + "/** @see module = " + CALRenaming_Test_Support1 + " */\n" + "foobar :: " + Prelude + ".Double;\n" + "private foobar = let /** @see module = " + CALRenaming_Test_Support1 + " */ foo = 7.0; /** @see module = " + CALRenaming_Test_Support1 + " */ bar :: " + Prelude + ".Int; bar = 7; in foo;\n" + "/**\n" + " * @see Alpha, Beta, Gamma, Cons, foobar\n" + " */\n" + "data Beta =\n" + " Gamma;\n"; WorkspaceManager workspaceManager = leccServices.getWorkspaceManager(); CompilerMessageLogger logger = new MessageLogger(); ModuleTypeInfo moduleTypeInfo = workspaceManager.getModuleTypeInfo(CALRenaming_Test_Support1); QualifiedName oldName = QualifiedName.make(CALRenaming_Test_Support1, "Alpha"); QualifiedName newName = QualifiedName.make(CALRenaming_Test_Support1, "Cons"); SourceModifier renamer = IdentifierRenamer.getSourceModifier(moduleTypeInfo, sourceText, oldName, newName, Category.TYPE_CONSTRUCTOR, logger); assertNoCompilationErrors(logger); String newSourceText = renamer.apply(sourceText); CompilerTestUtilities.assertEqualsCanonicalLineFeed( "module " + CALRenaming_Test_Support1 + ";\n" + "import " + Prelude + " using\n" + " function = intToOrdering;\n" + " dataConstructor = Cons;" + " ;\n" + "data Cons =\n" + " A | B | C;\n" + "\n" + "/** @see module = " + CALRenaming_Test_Support1 + " */\n" + "foobar :: " + Prelude + ".Double;\n" + "private foobar = let /** @see module = " + CALRenaming_Test_Support1 + " */ foo = 7.0; /** @see module = " + CALRenaming_Test_Support1 + " */ bar :: " + Prelude + ".Int; bar = 7; in foo;\n" + "/**\n" + " * @see typeConstructor = Cons\n" + " * @see Beta\n" + " * @see Gamma\n" + " * @see dataConstructor = Cons\n" + " * @see foobar\n" + " * \n" + " */\n" + "data Beta =\n" + " Gamma;\n", newSourceText); } /** * This is an example adapted from the testAllCodeGemIssues method in the * CALSourceGenerator_Test class in the Quark Gems project. It is intended to ensure * that the renaming occurs properly for all known issues that arise in renaming * of basic expressions. Most importantly this includes the handling of naming * conflicts involving punned fields. */ public void testAllCodeGemIssuesExpression() { final String moduleTemplate = "module " + CALRenaming_Test_Support1 + ";\n" + "import " + Prelude + " using\n" + " function = intToOrdering;\n" + " ;\n" + "%w :: " + Prelude + ".Maybe " + Prelude + ".Int;\n" + "%w = " + Prelude + ".Nothing;\n" + "%x :: " + Prelude + ".Int;\n" + "%x = 55;\n" + "%y :: " + Prelude + ".Int;\n" + "%y = 22;\n" + "%z :: {a :: " + Prelude + ".Int, b :: " + Prelude + ".Int, c :: " + Prelude + ".Int, foo :: " + Prelude + ".Int};\n" + "%z = {a = 10, b = 20, c = 30, foo=99};\n" + "data TestType = %DataCons x :: Prelude.Int y :: Prelude.Int z :: Prelude.Int;" + "\n" + "codeGemIssuesFunction =\n" + " let\n" + " alpha = case %w of\n" + " " + Prelude + ".Just a -> a;\n" + " ;\n" + " b = @x; a = %y;\n" + " in\n" + " " + Prelude + ".tuple3 b a (\n" + " let\n" + " a = b;\n" + " b_1 = " + Prelude + ".False;\n" + " beta = case @z of\n" + " {_ |a} -> a + @x;;\n" + " gamma = case @z of\n" + " {_ |b = a} -> a;;\n" + " delta = case @z of\n" + " {_ |c = b} -> b;;\n" + " eta = case @z of\n" + " {b | foo} -> b;;\n" + " zeta = case (1,2,3) of\n" + " (x, y, z) -> (y, z, x);;\n" + " zeta2 = case (1,2,3) of\n" + " (a, b, b1) -> (b, b1, a);;\n" + " beta_lazy = let {_ |a} = @z; in a + @x;\n" + " gamma_lazy = let {_ |b = a} = @z; in a;\n" + " delta_lazy = let {_ |c = b} = @z; in b;\n" + " zeta_lazy = let (x, y, z) = (1.0,2.0,3.0); in (y, z, x);\n" + " zeta2_lazy = let (a, b, b1) = (1.0,2.0,3.0); in (b, b1, a);\n" + " theta_lazy = let y:z = ['a']; in (y, z);\n" + " theta2_lazy = let b:b_1 = ['a']; in (b, b_1);\n" + " aleph_lazy = let %DataCons x y z = %DataCons 1 2 3; in %DataCons y z x;\n" + " aleph2_lazy = let %DataCons {x=a, y=b, z=b1} = %DataCons 1 2 3; in %DataCons b b1 a;\n" + " in\n" + " " + Prelude + ".tuple5 a b @x %y (\n" + " let\n" + " /**\n" + " * @arg a a\n" + " * @arg b b\n" + " */\n" + " f a b = a + b + @x;\n" + " /**\n" + " * @arg a a\n" + " * @arg b b\n" + " */\n" + " f2 a b = a + b + @x;\n" + " g = \\b -> \\a -> b - a;\n" + " a a = { a = a };\n" + " thunk :: " + Prelude + ".Boolean;\n" + " thunk = " + Prelude + ".True;\n" + " in\n" + " let\n" + " x = 3.0;\n" + " in\n" + " (x, " + Prelude + ".tuple4 @z (\n" + " let\n" + " z = 4;\n" + " in\n" + " z) (f 3 4) (a (1 :: " + Prelude + ".Int)))));"; final String oldSourceText = moduleTemplate .replaceAll("%w", "w").replaceAll("%x", "x") .replaceAll("%y", "y").replaceAll("%z", "z") .replaceAll("%DataCons", "DataCons") .replaceAll("@w", CALRenaming_Test_Support1 + ".w") .replaceAll("@x", CALRenaming_Test_Support1 + ".x") .replaceAll("@y", CALRenaming_Test_Support1 + ".y") .replaceAll("@z", CALRenaming_Test_Support1 + ".z"); final String newSourceText = moduleTemplate .replaceAll("%w", "z").replaceAll("%x", "a") .replaceAll("%y", "a1").replaceAll("%z", "b") .replaceAll("%DataCons", "FooBar") .replaceAll("@w", CALRenaming_Test_Support1 + ".z") .replaceAll("@x", CALRenaming_Test_Support1 + ".a") .replaceAll("@y", CALRenaming_Test_Support1 + ".a1") .replaceAll("@z", CALRenaming_Test_Support1 + ".b"); final ModuleName moduleName = CALRenaming_Test_Support1; final ModuleTypeInfo moduleTypeInfo = leccServices.getWorkspaceManager().getModuleTypeInfo(moduleName); CompilerMessageLogger logger = new MessageLogger(); QualifiedName oldName; QualifiedName newName; String renamedSourceText = oldSourceText; SourceModifier sourceModifier; oldName = QualifiedName.make(moduleName, "z"); newName = QualifiedName.make(moduleName, "temp"); sourceModifier = IdentifierRenamer.getSourceModifier(moduleTypeInfo, renamedSourceText, oldName, newName, Category.TOP_LEVEL_FUNCTION_OR_CLASS_METHOD, logger); assertNoCompilationErrors(logger); renamedSourceText = sourceModifier.apply(renamedSourceText); oldName = QualifiedName.make(moduleName, "w"); newName = QualifiedName.make(moduleName, "z"); sourceModifier = IdentifierRenamer.getSourceModifier(moduleTypeInfo, renamedSourceText, oldName, newName, Category.TOP_LEVEL_FUNCTION_OR_CLASS_METHOD, logger); assertNoCompilationErrors(logger); renamedSourceText = sourceModifier.apply(renamedSourceText); oldName = QualifiedName.make(moduleName, "x"); newName = QualifiedName.make(moduleName, "a"); sourceModifier = IdentifierRenamer.getSourceModifier(moduleTypeInfo, renamedSourceText, oldName, newName, Category.TOP_LEVEL_FUNCTION_OR_CLASS_METHOD, logger); assertNoCompilationErrors(logger); renamedSourceText = sourceModifier.apply(renamedSourceText); oldName = QualifiedName.make(moduleName, "DataCons"); newName = QualifiedName.make(moduleName, "FooBar"); sourceModifier = IdentifierRenamer.getSourceModifier(moduleTypeInfo, renamedSourceText, oldName, newName, Category.DATA_CONSTRUCTOR, logger); assertNoCompilationErrors(logger); renamedSourceText = sourceModifier.apply(renamedSourceText); oldName = QualifiedName.make(moduleName, "y"); newName = QualifiedName.make(moduleName, "a1"); sourceModifier = IdentifierRenamer.getSourceModifier(moduleTypeInfo, renamedSourceText, oldName, newName, Category.TOP_LEVEL_FUNCTION_OR_CLASS_METHOD, logger); assertNoCompilationErrors(logger); renamedSourceText = sourceModifier.apply(renamedSourceText); oldName = QualifiedName.make(moduleName, "temp"); newName = QualifiedName.make(moduleName, "b"); sourceModifier = IdentifierRenamer.getSourceModifier(moduleTypeInfo, renamedSourceText, oldName, newName, Category.TOP_LEVEL_FUNCTION_OR_CLASS_METHOD, logger); assertNoCompilationErrors(logger); renamedSourceText = sourceModifier.apply(renamedSourceText); assertEquals(newSourceText, renamedSourceText); } /** * A very basic test to make sure that module renaming works at least a little bit. */ public void testRenameBasicModule() { final ModuleName oldModuleName = CALRenaming_Test_Support1; final ModuleName newModuleName = ModuleName.make("After_Renaming"); final String moduleCodeTemplate = "/** @see module = %moduleName */\n" + "module %moduleName;\n" + "import " + Prelude + ";\n" + "\n" + "/** @see module = %moduleName */\n" + "public someFunction = 6.0;\n" + "\n" + "/** {@link module = %moduleName@}\n\n\n{@orderedList {@item {@unorderedList {@item {@summary {@code {@em {@link function = %moduleName.someFunction @} @} @} @} @} @} @} @}*/\n" + "public someFunction2 = 6.0;\n" + "\n" + "/** {@link " + Prelude + ".Maybe@} */\n" + "public someFunction3 = 6.0;\n" + "\n" + "/** @see " + Prelude + ".id */\n" + "public someFunction4 = 6.0;\n" + "\n" + "/** @see module = %moduleName */\n" + "foobar :: " + Prelude + ".Double;\n" + "private foobar = let /** @see module = %moduleName */ foo = 7.0; /** @see module = %moduleName */ bar :: " + Prelude + ".Int; bar = 7; in foo;"; final String moduleCode = moduleCodeTemplate.replaceAll("%moduleName", oldModuleName.toSourceText()); final String expectedRenamedModuleCode = moduleCodeTemplate.replaceAll("%moduleName", newModuleName.toSourceText()); ModuleTypeInfo moduleTypeInfo = leccServices.getWorkspaceManager().getModuleTypeInfo(oldModuleName); CompilerMessageLogger logger = new MessageLogger(); QualifiedName oldName = QualifiedName.make(oldModuleName, Refactorer.Rename.UNQUALIFIED_NAME_FOR_MODULE_RENAMING); QualifiedName newName = QualifiedName.make(newModuleName, Refactorer.Rename.UNQUALIFIED_NAME_FOR_MODULE_RENAMING); SourceModifier renamer = IdentifierRenamer.getSourceModifier(moduleTypeInfo, moduleCode, oldName, newName, Category.MODULE_NAME, logger); String renamedModuleCode = renamer.apply(moduleCode); assertEquals(expectedRenamedModuleCode, renamedModuleCode); } private void assertNoCompilationErrors(final CompilerMessageLogger logger) { assertEquals("Compilation error", Collections.EMPTY_LIST, logger.getCompilerMessages(Severity.ERROR)); } }