--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project/com.nokia.carbide.cpp.epoc.engine.tests/src/com/nokia/carbide/cpp/epoc/engine/tests/model/TestMakefileView.java Fri Apr 03 23:33:03 2009 +0100
@@ -0,0 +1,407 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.carbide.cpp.epoc.engine.tests.model;
+
+import com.nokia.carbide.cpp.epoc.engine.DocumentFactory;
+import com.nokia.carbide.cpp.epoc.engine.model.IViewParserConfiguration;
+import com.nokia.carbide.cpp.epoc.engine.model.MakefileModelFactory;
+import com.nokia.carbide.cpp.epoc.engine.model.makefile.IMakefileOwnedModel;
+import com.nokia.carbide.cpp.epoc.engine.model.makefile.IMakefileView;
+import com.nokia.carbide.cpp.epoc.engine.model.makefile.IMakefileViewConfiguration;
+import com.nokia.carbide.cpp.epoc.engine.preprocessor.AcceptedNodesViewFilter;
+import com.nokia.carbide.cpp.epoc.engine.preprocessor.IDefine;
+import com.nokia.carbide.cpp.epoc.engine.preprocessor.IViewFilter;
+import com.nokia.carbide.cpp.epoc.engine.tests.BaseTest;
+import com.nokia.cpp.internal.api.utils.core.IMessage;
+
+import org.eclipse.cdt.make.core.makefile.ICommand;
+import org.eclipse.cdt.make.core.makefile.IMacroDefinition;
+import org.eclipse.cdt.make.core.makefile.IMakefile;
+import org.eclipse.cdt.make.core.makefile.ITargetRule;
+import org.eclipse.cdt.make.core.makefile.gnu.IConditional;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jface.text.IDocument;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+
+public class TestMakefileView extends BaseTest {
+
+ private AcceptedNodesViewFilter viewFilter;
+ private ArrayList<IDefine> macros;
+ private IMakefileViewConfiguration viewConfig;
+ private IPath path;
+ private IMakefileOwnedModel model;
+
+ /* (non-Javadoc)
+ * @see com.nokia.carbide.cpp.epoc.engine.tests.BaseTest#setUp()
+ */
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ this.path = projectPath.append("group/Icons_scalable_dc.mk");
+
+
+ viewFilter = new AcceptedNodesViewFilter();
+ macros = new ArrayList<IDefine>();
+ viewConfig = new IMakefileViewConfiguration() {
+
+ public IViewFilter getViewFilter() {
+ return viewFilter;
+ }
+
+ public Collection<IDefine> getMacros() {
+ return macros;
+ }
+
+ public IViewParserConfiguration getViewParserConfiguration() {
+ return parserConfig;
+ }
+
+ /* (non-Javadoc)
+ * @see com.nokia.carbide.cpp.epoc.engine.model.makefile.IMakefileViewConfiguration#getMakefileStyle()
+ */
+ public String getMakefileStyle() {
+ return "GNU";
+ }
+ };
+
+ }
+
+ protected void makeModel(String text) {
+ IDocument document = DocumentFactory.createDocument(text);
+ model = new MakefileModelFactory().createModel(path, document);
+
+ model.parse();
+ }
+
+ protected IMakefileView getView(IMakefileViewConfiguration config) {
+ IMakefileView view = (IMakefileView) model.createView(config);
+ assertNotNull(view);
+ return view;
+ }
+
+ protected void commitTest(IMakefileView view, String refText) {
+ commitTest(model, view, refText);
+ }
+
+ final String TEST_1 =
+ "# Very special makefile\n"+
+ "SRCS=foo.cpp bar.cpp\n"+
+ "OBJS=$(SRCS:.cpp=.obj)\n"+
+ "\n"+
+ "\n"+
+ "all: test myfile.exe\n"+
+ "\n"+
+ "\n"+
+ "test:\n"+
+ "\techo \"Test happens\"\n"+
+ ".PHONY:\n"+
+ "myfile.exe: $(OBJS)\n"+
+ "\tld -o $< $^ -lc\n"+
+ "\n";
+
+ public void testParseBasic() {
+ // ensure everything's wired up properly to the CDT make core plugin
+ makeModel(TEST_1);
+
+ IMakefileView view = getView(viewConfig);
+ assertNotNull(view);
+
+ assertNotNull(view.getMakefile());
+
+ // basic test
+ IMakefile makefile = view.getMakefile();
+ assertEquals(2, makefile.getMacroDefinitions().length);
+ assertEquals(9, makefile.getDirectives().length);
+ assertEquals(4, makefile.getRules().length);
+
+ view.dispose();
+ model.dispose();
+ }
+
+ public void testEOL() {
+ makeModel("FOO=6\r\n"+
+ "BAR=33\r\n");
+
+ IMakefileView view = getView(viewConfig);
+ assertEquals("\r\n", view.getEOL());
+ }
+
+ public void testRewriteBasic() {
+ // test that we can rewrite the document without any changes
+ makeModel(TEST_1);
+
+ IMakefileView view = getView(viewConfig);
+ assertNotNull(view);
+
+ assertFalse(view.hasChanges());
+
+ commitTest(view, TEST_1);
+ view.dispose();
+ model.dispose();
+ }
+
+ public void testMacroExpansion() {
+ makeModel(TEST_1);
+
+ IMakefileView view = getView(viewConfig);
+ assertEquals("SRCS", view.getMakefile().expandString("SRCS"));
+ assertEquals("these are foo.cpp bar.cpp, man", view.getMakefile().expandString("these are $(SRCS), man"));
+
+ assertFalse(view.hasChanges());
+ commitTest(view, TEST_1);
+
+ view.dispose();
+ model.dispose();
+ }
+
+ public void testCommandsInvoking() {
+ makeModel(TEST_1);
+
+ IMakefileView view = getView(viewConfig);
+
+ ICommand[] commands = view.findCommandsInvoking("ld");
+ assertEquals(1, commands.length);
+ assertNotNull(commands[0].getParent());
+
+ makeModel("TOOLSDIR=c:\\my\\tools\n"+
+ "MIFCONV=$(TOOLDIR)\\mifconv.exe\n"+
+ "\n"+
+ "all: mytool\n"+
+ "\n"+
+ "foo.mif: foo.svg\n"+
+ "\t$(MIFCONV) -o $@ $^\n"+
+ "\t$(MIFCONV) -o $@.bak $^\n");
+
+ view = getView(viewConfig);
+
+ commands = view.findCommandsInvoking("mifconv");
+ assertEquals(2, commands.length);
+ assertNotNull(commands[0].getParent());
+ ITargetRule oldRule = (ITargetRule) commands[1].getParent();
+ assertNotNull(oldRule);
+
+ // some more tests...
+ String newRule = oldRule.getTarget() + ": " + oldRule.getPrerequisites()[0] + " foo.h" + view.getEOL()
+ + oldRule.getCommands()[0];
+
+ view.replaceDirective(oldRule, newRule);
+
+ commitTest(view, "TOOLSDIR=c:\\my\\tools\n"+
+ "MIFCONV=$(TOOLDIR)\\mifconv.exe\n"+
+ "\n"+
+ "all: mytool\n"+
+ "\n"+
+ "foo.mif: foo.svg foo.h\n"+
+ "\t$(MIFCONV) -o $@ $^\n");
+
+
+ }
+
+ final String TEST_2 =
+ "ifeq ($(PLATFORM), WINS)\n"+
+ "ZDIR=$(EPOCROOT)\\release\\wins\\z\n"+
+ "else\n"+
+ "ZDIR=$(EPOCROOT)\\release\\$(PLATFORM)\\$(RELEASE)\\$(TARGET)\\z\n"+
+ "endif\n"+
+ "RESOURCE: $(ZDIR)\\sys\\gfx\\foo.mif\n";
+ final String TEST_2_a =
+ "ifeq ($(PLATFORM), WINS)\n"+
+ "ZDIR=$(EPOCROOT)\\release\\wins\\z\n"+
+ "else\n"+
+ "ZDIR=FOO\n"+
+ "endif\n"+
+ "RESOURCE: $(ZDIR)\\sys\\gfx\\foo.mif\n";
+
+ public void testQueryMacroDefs() {
+ makeModel(TEST_1);
+
+ IMakefileView view = getView(viewConfig);
+ IMacroDefinition definition = view.getMakefile().getMacroDefinitions("OBJS")[0];
+ assertNotNull(definition);
+
+ definition = view.getMakefile().getMacroDefinitions("SRCS")[0];
+ assertNotNull(definition);
+
+ ////////
+
+ makeModel(TEST_2);
+ view = getView(viewConfig);
+ IMacroDefinition[] defs = view.getAllMacroDefinitions("ZDIR");
+ assertNotNull(defs);
+
+ assertEquals(2, defs.length);
+ assertTrue(defs[0].getParent() instanceof IConditional);
+ assertTrue(defs[1].getParent() instanceof IConditional);
+ assertNotSame(defs[0].getParent(), defs[1].getParent());
+
+ }
+
+ public void testQueryTargets() {
+ makeModel(TEST_1);
+
+ IMakefileView view = getView(viewConfig);
+
+ ITargetRule rule = view.findRuleForTarget("myfile.exe", false);
+ assertNotNull(rule);
+
+ makeModel("BLD : do_nothing\r\n" +
+ "\r\n" +
+ "CLEAN : do_nothing\r\n" +
+ "\r\n" +
+ "LIB : do_nothing\r\n" +
+ "\r\n" +
+ "CLEANLIB : do_nothing\r\n" +
+ "\r\n" +
+ "RESOURCE : \r\n" +
+ " mifconv $(ICONTARGETFILENAME) \\\r\n" +
+ " /c32 $(ICONDIR)\\qgn_menu_Birthdays.svg\r\n" +
+ " \r\n" +
+ "FREEZE : do_nothing\r\n" +
+ "\r\n" +
+ "SAVESPACE : do_nothing\r\n" +
+ "\r\n" +
+ "RELEASABLES :\r\n" +
+ " @echo $(ICONTARGETFILENAME)\r\n" +
+ "\r\n" +
+ "FINAL : do_nothing\r\n" +
+ "\r\n");
+ view = getView(viewConfig);
+
+ rule = view.findRuleForTarget("RESOURCE", true);
+ assertNotNull(rule);
+
+ ICommand[] commands = view.findCommandsInvoking("mifconv");
+ assertEquals(1, commands.length);
+ assertEquals(rule, commands[0].getParent());
+
+ view.dispose();
+ model.dispose();
+ }
+
+ final String TEST_1_a =
+ TEST_1 + // we lose the final newlines
+ "FOO=123 # yup\n";
+
+ final String TEST_1_b =
+ "virus.exe:\n"+
+ "\tgcc -o $@ doom.c\n"+
+ TEST_1_a;
+
+
+ public void testAddedDirectives() {
+ makeModel(TEST_1);
+ IMakefileView view = getView(viewConfig);
+
+ assertEquals(2, view.getMakefile().getMacroDefinitions().length);
+ view.insertTextBefore("FOO=123 # yup\n", null);
+ assertTrue(view.hasChanges());
+
+ assertEquals(3, view.getMakefile().getMacroDefinitions().length);
+ assertEquals("123=FOO", view.getMakefile().expandString("$(FOO)=FOO"));
+
+ commitTest(view,
+ TEST_1_a);
+
+ String target = "virus.exe:\n" + "\tgcc -o $@ doom.c\n";
+ view.insertText(null, target);
+
+ commitTest(view,
+ TEST_1_b
+ );
+
+
+ view.dispose();
+ model.dispose();
+ }
+
+ public void testOverrideDirectives() {
+ makeModel(TEST_1);
+
+ IMakefileView view = getView(viewConfig);
+ IMacroDefinition oldDef = view.getMakefile().getMacroDefinitions("SRCS")[0];
+ String newVal = oldDef.getValue() + " more.cpp";
+ String newText = oldDef.getName() + " = " + newVal + "\n";
+ view.replaceDirective(oldDef, newText);
+
+ IMacroDefinition checkDef = view.getMakefile().getMacroDefinitions("SRCS")[0];
+ assertEquals(newText, checkDef.toString());
+
+ view.dispose();
+ model.dispose();
+
+ ///////
+
+ makeModel(TEST_2);
+ view = getView(viewConfig);
+ IMacroDefinition[] defs = view.getAllMacroDefinitions("ZDIR");
+ assertNotNull(defs);
+
+ assertEquals(2, defs.length);
+
+ oldDef = defs[1];
+
+ view.replaceDirective(oldDef, "ZDIR=FOO" + view.getEOL());
+
+ commitTest(view, TEST_2_a);
+
+ }
+
+ public void testUnexpand() {
+ makeModel("ZDIR=$(EPOCROOT)\\release\\winscw\n"+
+ "TARGETDIR=$(ZDIR)\\data\n"+
+ "ICONTARGETFILENAME=$(TARGETDIR)\\foo.mif\n");
+ IMakefileView view = getView(viewConfig);
+
+ String repl = view.unexpandMacros("$(EPOCROOT)\\release\\winscw\\data\\more.mif",
+ new String[] { "TARGETDIR", "ZDIR" });
+ assertEquals("$(TARGETDIR)\\more.mif", repl);
+
+ String repl1 = view.unexpandMacros("1 2 $(EPOCROOT)\\release\\winscw\\data\\more.mif 3 4",
+ new String[] { "TARGETDIR", "ZDIR" });
+ assertEquals("1 2 $(TARGETDIR)\\more.mif 3 4", repl1);
+
+ String repl2 = view.unexpandMacros("$(EPOCROOT)\\release\\winscw\\more.mif",
+ new String[] { "TARGETDIR", "ZDIR" });
+ assertEquals("$(ZDIR)\\more.mif", repl2);
+
+ String repl3 = view.unexpandMacros("$(EPOCROOT)\\release\\foo\\data\\more.mif",
+ new String[] { "TARGETDIR", "ZDIR" });
+ assertEquals("$(EPOCROOT)\\release\\foo\\data\\more.mif", repl3);
+
+ String repl4 = view.unexpandMacros("\\release\\winscw\\data\\more.mif",
+ new String[] { "TARGETDIR", "ZDIR" });
+ assertEquals("\\release\\winscw\\data\\more.mif", repl4);
+
+ }
+
+ public void testProblems() {
+ makeModel("\n\n)ZDIR@foo{\n"+
+ "^^ placate ^^\n");
+ IMakefileView view = getView(viewConfig);
+ IMessage[] messages = view.getMessages();
+ for (IMessage msg : messages)
+ System.out.println(msg);
+ assertEquals(2, messages.length);
+ assertEquals(IMessage.ERROR, messages[0].getSeverity());
+ assertEquals(IMessage.ERROR, messages[1].getSeverity());
+ }
+}