diff -r 000000000000 -r fb279309251b project/com.nokia.carbide.cpp.epoc.engine.tests/src/com/nokia/carbide/cpp/epoc/engine/tests/model/TestBldInfView.java --- /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/TestBldInfView.java Fri Apr 03 23:33:03 2009 +0100 @@ -0,0 +1,1740 @@ +/* +* Copyright (c) 2006-2009 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.model.bldinf.*; +import com.nokia.carbide.cpp.epoc.engine.model.bldinf.IMakefileReference.EMakeEngine; +import com.nokia.carbide.cpp.epoc.engine.preprocessor.DefineFactory; +import com.nokia.carbide.cpp.epoc.engine.preprocessor.IDefine; +import com.nokia.carbide.internal.api.cpp.epoc.engine.dom.IASTProblemNode; +import com.nokia.cpp.internal.api.utils.core.IMessage; + +import org.eclipse.core.runtime.Path; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class TestBldInfView extends BaseBldInfViewTest { + + + public void testPlatformsParsing() throws Exception { + makeModel("PRJ_PLATFORMS\nwinscw armv5\n"); + + IBldInfView view = getView(config); + assertNotNull(view); + checkNoProblems(view); + + match(new String[] { "winscw", "armv5" }, view.getPlatforms()); + match(new String[] { "winscw", "armv5" }, view.getData().getPlatforms()); + + view.dispose(); + model.dispose(); + + //// + makeModel("PRJ_PLATFORMS\ndefault -armv5\n"); + + view = getView(config); + assertNotNull(view); + + match(new String[] { "default", "-armv5" }, view.getPlatforms()); + match(new String[] { "default", "-armv5" }, view.getData().getPlatforms()); + view.dispose(); + model.dispose(); + + } + + public void testPlatformsChanging1() throws Exception { + makeModel("PRJ_PLATFORMS\nDEFAULTS\n"); + + IBldInfView view = getView(config); + assertNotNull(view); + + List platforms = view.getPlatforms(); + match(new String[] { "DEFAULTS" }, platforms); + + platforms.remove(0); + platforms.add("WINSCW"); + platforms.add("ARMV5"); + + commitTest(view, "PRJ_PLATFORMS\nWINSCW ARMV5\n"); + + /// + + platforms = view.getPlatforms(); + platforms.remove(1); + commitTest(view, "PRJ_PLATFORMS\nWINSCW\n"); + + /// + view.getPlatforms().clear(); + commitTest(view, "PRJ_PLATFORMS\n\n"); + + view.dispose(); + model.dispose(); + + } + + public void testMmpfilesParsing1() throws Exception { + makeModel("PRJ_MMPFILES\n"+ + "basic.mmp TIDY\n"+ + "another.mmp Build_as_ARM\n"+ + "PRJ_TESTMMPFILES\n"+ + "test.mmp MANUAL\n"); + + IBldInfView view = getView(config); + assertNotNull(view); + checkNoProblems(view); + + _testMmpfilesParsing1(view); + _testMmpfilesParsing1(view.getData()); + + view.dispose(); + model.dispose(); + + } + + private void _testMmpfilesParsing1(IBldInfData bldInfData) { + List maks = bldInfData.getMakMakeReferences(); + assertEquals(2, maks.size()); + + IMMPReference mmp = (IMMPReference) maks.get(0); + assertEquals(new Path("group/basic.mmp"), mmp.getPath()); + assertFalse(mmp.isBuildAsArm()); + assertFalse(mmp.isManual()); + assertFalse(mmp.isSupport()); + assertTrue(mmp.isTidy()); + + mmp = (IMMPReference) maks.get(1); + assertEquals(new Path("group/another.mmp"), mmp.getPath()); + assertTrue(mmp.isBuildAsArm()); + assertFalse(mmp.isManual()); + assertFalse(mmp.isSupport()); + assertFalse(mmp.isTidy()); + + + //// + maks = bldInfData.getTestMakMakeReferences(); + assertEquals(1, maks.size()); + + mmp = (IMMPReference) maks.get(0); + assertEquals(new Path("group/test.mmp"), mmp.getPath()); + assertFalse(mmp.isBuildAsArm()); + assertTrue(mmp.isManual()); + assertFalse(mmp.isSupport()); + assertFalse(mmp.isTidy()); + + //// + + IMMPReference[] mmps = bldInfData.getAllMMPReferences(); + assertEquals(3, mmps.length); + assertEquals(bldInfData.getMakMakeReferences().get(0), mmps[0]); + assertEquals(bldInfData.getMakMakeReferences().get(1), mmps[1]); + assertEquals(maks.get(0), mmps[2]); + } + + public void testMmpfilesParsing2() throws Exception { + // not a normally valid case, but used to validate + // that these are all considered equal and all expose .mmp extensions + makeModel("prj_mmpfiles\n"+ + "basic TIDY\n"+ + "baSic.MMP TIDY\n"+ + "BasIC.kkk TIDY\n"); + IBldInfView view = getView(config); + assertNotNull(view); + checkNoProblems(view); + + _testMmpfilesParsing2(view); + _testMmpfilesParsing2(view.getData()); + } + + private void _testMmpfilesParsing2(IBldInfData bldInfData) { + IMMPReference[] mmps = bldInfData.getAllMMPReferences(); + assertEquals(3, mmps.length); + assertEquals(new Path("group/basic.mmp"), mmps[0].getPath()); + assertEquals(new Path("group/baSic.mmp"), mmps[1].getPath()); + assertEquals(new Path("group/BasIC.mmp"), mmps[2].getPath()); + assertEquals(mmps[0], mmps[1]); + assertEquals(mmps[0], mmps[2]); + } + + public void testMakefilesParsing1() throws Exception { + makeModel("PRJ_mmpFILES\n"+ + "makefile ..\\simple.mk build_as_arm\n"+ + "another.mmp Build_as_ARM\n"+ + "gnumakefile Icons_scalable_dc.mk tidy\n"+ + "PRJ_TESTMMPFILES\n"+ + "#ifdef WINSCW\n"+ + "nmakefile msbuild.make\n"+ + "#endif\n" + ); + + macros = new ArrayList(); + macros.add(DefineFactory.createDefine("WINSCW")); + + IBldInfView view = getView(config); + assertNotNull(view); + checkNoProblems(view); + + _testMakefilesParsing1(view); + _testMakefilesParsing1(view.getData()); + + view.dispose(); + model.dispose(); + + } + + private void _testMakefilesParsing1(IBldInfData bldInfData) { + List maks = bldInfData.getMakMakeReferences(); + assertEquals(3, maks.size()); + + + IMakefileReference makefile; + IMMPReference mmp; + + makefile = (IMakefileReference) maks.get(0); + assertEquals(EMakeEngine.MAKEFILE, makefile.getMakeEngine()); + assertEquals(new Path("simple.mk"), makefile.getPath()); + assertTrue(makefile.isBuildAsArm()); + assertFalse(makefile.isTidy()); + + mmp = (IMMPReference) maks.get(1); + assertEquals(new Path("group/another.mmp"), mmp.getPath()); + assertTrue(mmp.isBuildAsArm()); + + makefile = (IMakefileReference) maks.get(2); + assertEquals(new Path("group/Icons_scalable_dc.mk"), makefile.getPath()); + assertEquals(EMakeEngine.GNUMAKEFILE, makefile.getMakeEngine()); + assertTrue(makefile.isTidy()); + assertFalse(makefile.isBuildAsArm()); + + + /// + + List testmaks = bldInfData.getTestMakMakeReferences(); + assertEquals(1, testmaks.size()); + + makefile = (IMakefileReference) testmaks.get(0); + assertEquals(new Path("group/msbuild.make"), makefile.getPath()); + assertEquals(EMakeEngine.NMAKEFILE, makefile.getMakeEngine()); + assertFalse(makefile.isTidy()); + assertFalse(makefile.isBuildAsArm()); + /// + + IMMPReference[] mmps = bldInfData.getAllMMPReferences(); + assertEquals(1, mmps.length); + assertEquals(maks.get(1), mmps[0]); + + IMakefileReference[] makefiles = bldInfData.getAllMakefileReferences(); + assertEquals(3, makefiles.length); + assertEquals(maks.get(0), makefiles[0]); + assertEquals(maks.get(2), makefiles[1]); + assertEquals(testmaks.get(0), makefiles[2]); + + assertEquals(4, bldInfData.getAllMakMakeReferences().length); + } + + public void testMmpfilesChangingCond() throws Exception { + makeModel("PRJ_MMPFILES\n"+ + "#ifdef MYTARGET\n"+ + "foo.mmp\n"+ + "#endif\n"); + + IBldInfView view = getView(config); + assertNotNull(view); + + // don't remove apparently empty statements + commitTest(view, "PRJ_MMPFILES\n"+ + "#ifdef MYTARGET\n"+ + "foo.mmp\n"+ + "#endif\n"); + } + + public void testMmpfilesChanging() throws Exception { + makeModel("PRJ_MMPFILES\n"); + + IBldInfView view = getView(config); + assertNotNull(view); + + IMMPReference mmp = view.createMMPReference(); + assertFalse(mmp.isValid()); + + // don't emit invalid entries + view.getMakMakeReferences().add(mmp); + + commitTest(view, "PRJ_MMPFILES\n"); + + /// + + mmp = view.createMMPReference(); + + mmp.setPath(new Path("group/program.mmp")); + view.getMakMakeReferences().add(mmp); + + commitTest(view, + "PRJ_MMPFILES\n"+ + "program.mmp\n"); + + // + + mmp = view.createMMPReference(); + mmp.setPath(new Path("another.mmp")); + mmp.setBuildAsArm(true); + mmp.setManual(false); + assertTrue(mmp.isBuildAsArm()); + assertFalse(mmp.isManual()); + view.getMakMakeReferences().add(mmp); + + // bug 4726: new format is fwd slash + commitTest(view, + "PRJ_MMPFILES\n"+ + "program.mmp\n"+ + "../another.mmp BUILD_AS_ARM\n"); + + // + + view.getMakMakeReferences().remove(0); + commitTest(view, + "PRJ_MMPFILES\n"+ + "../another.mmp BUILD_AS_ARM\n"); + + /// + + IMakefileReference makefile = view.createMakefileReference(); + view.getMakMakeReferences().add(makefile); + + // no empty nodes + commitTest(view, + "PRJ_MMPFILES\n"+ + "../another.mmp BUILD_AS_ARM\n"); + + /// + + makefile = view.createMakefileReference(); + view.getMakMakeReferences().add(makefile); + makefile.setMakeEngine(EMakeEngine.GNUMAKEFILE); + makefile.setPath(new Path("gfx/MakeGraphics.makefile")); + + commitTest(view, + "PRJ_MMPFILES\n"+ + "../another.mmp BUILD_AS_ARM\n"+ + "gnumakefile ../gfx/MakeGraphics.makefile\n"); + + + view.dispose(); + model.dispose(); + + } + + public void testMmpfilesChanging2() throws Exception { + makeModel("PRJ_MMPFILES\n"); + + IBldInfView view = getView(config); + assertNotNull(view); + + IMMPReference mmp = view.createMMPReference(); + mmp = view.createMMPReference(); + + // ensure user intent preserved + mmp.setPath(new Path("group/program")); + view.getMakMakeReferences().add(mmp); + + commitTest(view, + "PRJ_MMPFILES\n"+ + "program\n"); + + // ensure change matches existing mmp and results in no change + mmp = view.getAllMMPReferences()[0]; + mmp.setPath(new Path("group/program.mmp")); + + commitTest(view, + "PRJ_MMPFILES\n"+ + "program\n"); + + // ensure matches existing mmp + mmp = view.getAllMMPReferences()[0]; + mmp.setManual(true); + + commitTest(view, + "PRJ_MMPFILES\n"+ + "program MANUAL\n"); + + // ensure matches... + view.getMakMakeReferences().remove(view.getAllMMPReferences()[0]); + + // leave empty sections + commitTest(view, + "PRJ_MMPFILES\n"); + + + view.dispose(); + model.dispose(); + + } + + public void testExportsParsing() { + makeModel("PRJ_EXPORTS\n"+ + "../src/MyFile.txt\n"+ + "// user mistake below, should be full path\n"+ + "..\\gfx\\myfile.mbm sys\\resources\\MyApp\\myfile.mbm\n"+ + "..\\group\\here.exe c:\\sys\\bin\\virus.exe\n"+ + ":zip v28archive.zip \\epoc32\\releases\\winscw\\patches\n"); + + IBldInfView view = getView(config); + assertNotNull(view); + checkNoProblems(view); + + _testExportsParsing(view); + _testExportsParsing(view.getData()); + + } + + private void _testExportsParsing(IBldInfData bldInfData) { + List exports = bldInfData.getExports(); + assertEquals(4, exports.size()); + + IExport exp = exports.get(0); + assertEquals(new Path("src/MyFile.txt"), exp.getSourcePath()); + // implicit + assertEquals(new Path("/epoc32/include/MyFile.txt"), exp.getTargetPath()); + assertFalse(exp.isZipped()); + + exp = exports.get(1); + assertEquals(new Path("gfx/myfile.mbm"), exp.getSourcePath()); + // user mistake + assertEquals(new Path("/epoc32/include/sys/resources/MyApp/myfile.mbm"), exp.getTargetPath()); + assertFalse(exp.isZipped()); + + exp = exports.get(2); + assertEquals(new Path("group/here.exe"), exp.getSourcePath()); + assertEquals(new Path("c:/sys/bin/virus.exe"), exp.getTargetPath()); + assertFalse(exp.isZipped()); + + exp = exports.get(3); + assertEquals(new Path("group/v28archive.zip"), exp.getSourcePath()); + assertEquals(new Path("/epoc32/releases/winscw/patches"), exp.getTargetPath()); + assertTrue(exp.isZipped()); + } + + public void testExportsChanging() { + makeModel("// my empty bld.inf\n"+ + "PRJ_PLATFORMS DEFAULTS\n"+ + "PRJ_MMPFILES\n"+ + "PRJ_EXPORTS\n"); + IBldInfView view = getView(config); + assertNotNull(view); + + IExport exp = view.createExport(); + exp.setSourcePath(new Path("src/MyFile.txt")); + assertEquals(new Path("src/MyFile.txt"), exp.getSourcePath()); + view.getExports().add(exp); + + exp = view.createExport(); + exp.setSourcePath(new Path("gfx/myfile.mbm")); + exp.setTargetPath(new Path("\\sys\\resources\\MyApp\\myfile.mbm")); + assertEquals(new Path("\\sys\\resources\\MyApp\\myfile.mbm"), exp.getTargetPath()); + view.getExports().add(exp); + + exp = view.createExport(); + exp.setSourcePath(new Path("inc/header2.h")); + exp.setTargetPath(new Path("\\epoc32\\include\\header2.h")); + view.getExports().add(exp); + + exp = view.createExport(); + exp.setSourcePath(new Path("group/here.exe")); + exp.setTargetPath(new Path("c:/sys/bin/virus.exe")); + assertFalse(exp.isZipped()); + view.getExports().add(exp); + + exp = view.createExport(); + exp.setSourcePath(new Path("group/v28archive.zip")); + exp.setTargetPath(new Path("/epoc32/releases/winscw/patches")); + exp.setZipped(true); + assertTrue(exp.isZipped()); + view.getExports().add(exp); + + + commitTest(view, "// my empty bld.inf\n"+ + "PRJ_PLATFORMS DEFAULTS\n"+ + "PRJ_MMPFILES\n"+ + "PRJ_EXPORTS\n"+ + "../src/MyFile.txt\n"+ + "../gfx/myfile.mbm /sys/resources/MyApp/myfile.mbm\n"+ + "../inc/header2.h\n"+ // implicit path + "here.exe c:\\sys\\bin\\virus.exe\n"+ // backslash needed because of use of DOS 'copy' command + ":zip v28archive.zip /epoc32/releases/winscw/patches\n"); + + /// + + view.getExports().get(0).setZipped(true); + view.getExports().get(0).setTargetPath(new Path("/epoc32/include")); + commitTest(view, "// my empty bld.inf\n"+ + "PRJ_PLATFORMS DEFAULTS\n"+ + "PRJ_MMPFILES\n"+ + "PRJ_EXPORTS\n"+ + ":zip ../src/MyFile.txt\n"+ + "../gfx/myfile.mbm /sys/resources/MyApp/myfile.mbm\n"+ + "../inc/header2.h\n"+ // implicit path + "here.exe c:\\sys\\bin\\virus.exe\n"+ + ":zip v28archive.zip /epoc32/releases/winscw/patches\n"); + + view.dispose(); + model.dispose(); + } + + public void testExportsChanging2() { + makeModel("PRJ_EXPORTS\n"+ + "../src/MyFile.txt\n"+ + "// user mistake below, should be full path\n"+ + "..\\gfx\\myfile.mbm sys\\resources\\MyApp\\myfile.mbm\n"+ + "..\\group\\here.exe c:\\sys\\bin\\virus.exe\n"+ + "// unchanged entry keeps comment\n"+ + ":zip v28archive.zip \\epoc32\\releases\\winscw\\patches\n"); + + IBldInfView view = getView(config); + assertNotNull(view); + + view.getExports().get(1).setTargetPath(new Path("\\sys\\resources\\MyApp\\myfile.mbm")); + + commitTest(view, + "PRJ_EXPORTS\n"+ + "../src/MyFile.txt\n"+ + "// user mistake below, should be full path\n"+ + "..\\gfx\\myfile.mbm \\sys\\resources\\MyApp\\myfile.mbm\n"+ // keeps predom slash fmt + "..\\group\\here.exe c:\\sys\\bin\\virus.exe\n"+ + "// unchanged entry keeps comment\n"+ + ":zip v28archive.zip \\epoc32\\releases\\winscw\\patches\n"); + view.dispose(); + model.dispose(); + } + + public void testExportsChanging3() { + makeModel("PRJ_EXPORTS\n"+ + "../src/MyFile.txt\n"+ + "..\\gfx\\myfile.mbm\n"+ + ":zip v28archive.zip\n"); + + IBldInfView view = getView(config); + assertNotNull(view); + + assertEquals(new Path("/epoc32/include/MyFile.txt"), view.getExports().get(0).getTargetPath()); + assertEquals(new Path("/epoc32/include/myfile.mbm"), view.getExports().get(1).getTargetPath()); + commitTest(view, + "PRJ_EXPORTS\n"+ + "../src/MyFile.txt\n"+ + "..\\gfx\\myfile.mbm\n"+ + ":zip v28archive.zip\n"); + view.dispose(); + model.dispose(); + } + public void testProblems() { + makeModel("PRJ_UNKNOWN\n"+ + "../src/MyFile.txt\n"+ + "PRJ_PLATFORMS eee\n"); + + IBldInfView view = getView(config); + assertNotNull(view); + assertEquals(2, view.getMessages().length); + + commitTest(view,"PRJ_UNKNOWN\n"+ + "../src/MyFile.txt\n"+ + "PRJ_PLATFORMS eee\n"); + assertEquals(2, view.getMessages().length); + + view.getPlatforms().add("ooo"); + + + commitTest(view,"PRJ_UNKNOWN\n"+ + "../src/MyFile.txt\n"+ + "PRJ_PLATFORMS eee ooo\n"); + assertEquals(2, view.getMessages().length); + } + + public void testRootProject() { + // make sure we handle project root correctly when it's the root directory + for (int i = 0; i < 2; i++){ + parserConfig.projectPath = i == 0 ? new Path("c:\\") : new Path("c:"); + this.path = new Path("c:\\symbian\\9.1\\S60_3rd\\S60Ex\\Hello\\group\\bld.inf"); + makeModel("PRJ_MMPFILES\n"+ + "test.mmp\n"); + + IBldInfView view =model.createView(config); + _testRootProject(view); + _testRootProject(view.getData()); + } + } + + private void _testRootProject(IBldInfData bldInfData) { + IMMPReference mmp = bldInfData.getAllMMPReferences()[0]; + // important to be relative + assertEquals(new Path("symbian/9.1/S60_3rd/S60Ex/Hello/group/test.mmp"), mmp.getPath()); + } + + /** + * The base directory changes as files are #included + * + */ + public void testBaseDirectory() { + parserConfig.getFilesystem().put(new Path("c:/test/bld.inf").toOSString(), + "PRJ_MMPFILES\n"+ + "base.mmp\n"+ + "gnumakefile sub\\base.mk\n"+ + "PRJ_EXPORTS\n"+ + "base.txt\n"); + + parserConfig.getFilesystem().put(projectPath.append("utils").append("bld.inf").toOSString(), + "PRJ_EXPORTS\n"+ + "utils.txt\n"+ + "PRJ_MMPFILES\n"+ + "utils.mmp\n"+ + "nmakefile ..\\utils.mk\n"); + + makeModel( + "PRJ_MMPFILES\n"+ + "first.mmp\n"+ + "#include \"c:\\test\\bld.inf\"\n"+ + "#include \"../utils/bld.inf\"\n"+ + "PRJ_MMPFILES\n"+ + "last.mmp\n" + + "PRJ_EXPORTS\n"+ + "last.txt\n"); + + IBldInfView view = model.createView(config); + _testBaseDirectory(view); + _testBaseDirectory(view.getData()); + + } + + private void _testBaseDirectory(IBldInfData bldInfData) { + assertEquals(6, bldInfData.getMakMakeReferences().size()); + + assertEquals(new Path("group/first.mmp"), bldInfData.getMakMakeReferences().get(0).getPath()); + + // note: should not be relative path when outside the project + assertEquals(new Path("c:/test/base.mmp"), bldInfData.getMakMakeReferences().get(1).getPath()); + assertEquals(new Path("c:/test/sub/base.mk"), bldInfData.getMakMakeReferences().get(2).getPath()); + + assertEquals(new Path("utils/utils.mmp"), bldInfData.getMakMakeReferences().get(3).getPath()); + assertEquals(new Path("utils.mk"), bldInfData.getMakMakeReferences().get(4).getPath()); + + assertEquals(new Path("group/last.mmp"), bldInfData.getMakMakeReferences().get(5).getPath()); + + assertEquals(3, bldInfData.getExports().size()); + assertEquals(new Path("c:/test/base.txt"), bldInfData.getExports().get(0).getSourcePath()); + assertEquals(new Path("utils/utils.txt"), bldInfData.getExports().get(1).getSourcePath()); + assertEquals(new Path("group/last.txt"), bldInfData.getExports().get(2).getSourcePath()); + } + + public void testPreprocessorProblems() { + String string = "PRJ_MMPFILES\n"+ + "#if 1\n"+ + "first.mmp\n"+ + "#else\n"+ + "#if\n"; + makeModel(string); + + IBldInfView view = model.createView(config); + IASTProblemNode[] problemNodes = getProblems(view); + assertEquals(1, problemNodes.length); + checkMessages(problemNodes); + + assertEquals(1, view.getMakMakeReferences().size()); + + // ensure no crash + commitTest(view, string); + + } + + public void testIfNestingRecovery() { + String string = "\n" + + "PRJ_PLATFORMS\n" + + "DEFAULT\n" + + "\n" + + "PRJ_EXPORTS\n" + + "\n" + + "#ifndef RD_EMAIL_DOMAIN_UTILS\n" + + "..\\Utils\\inc\\IMASettingsStorer.h \\epoc32\\include\\oem\\IMASettingsStorer.h\n" + + "\n" + + "PRJ_MMPFILES\n" + + "..\\utils\\group\\ImumUtils.mmp\n" + + "\n" + + "// ********** NEW INTERNAL API PART\n" + + "#else\n" + + "..\\Utils_newApi\\inc\\IMPICMDS.H \\epoc32\\include\\oem\\impicmds.h\n" + + "\n" + + "PRJ_MMPFILES\n" + + "..\\DomainApi\\group\\imumda.mmp\n" + + "\n" + + "#endif\n"; + + makeModel(string); + + // normal case: macro not defined + IBldInfView view = model.createView(config); + checkNoProblems(view); + testSourceRegions(view, true); + + assertEquals(1, view.getMakMakeReferences().size()); + assertEquals(1, view.getExports().size()); + + commitTest(view, string); + // SPN case: "all" filter + //System.out.println("\\\\\\\\\\\\\\\\\\"); + view.dispose(); + view = model.createView(allConfig); + testSourceRegions(view, true); + + // should not continue reading #else part as MMPS + assertEquals(2, view.getMakMakeReferences().size()); + assertEquals(2, view.getExports().size()); + + commitTest(view, string); + + } + + public void testIfNestingRecovery2() { + String string = "\n" + + "PRJ_PLATFORMS\n" + + "#ifdef RD_EMAIL_DOMAIN_UTILS\n" + + "WINSCW\n"+ + "#endif\n"+ + "ARMV5\n"+ + "#if 1\n"+ + "PRJ_EXPORTS\n"+ + "..\\Utils\\inc\\IMASettingsStorer.h \\epoc32\\include\\oem\\IMASettingsStorer.h\n" + + "#else\n"+ + "PRJ_MMPFILES\n"+ + "test1.mmp\n"+ + " #if 1\n"+ + " test2.mmp\n"+ + " PRJ_EXPORTS\n"+ + " foo.txt foo.txt\n"+ + " #endif\n"+ + "test3.mmp\n"+ // yup, this is an export + "#endif\n"; + + makeModel(string); + + // normal case: macro not defined + IBldInfView view = model.createView(config); + checkNoProblems(view); + testSourceRegions(view, true); + + assertEquals(1, view.getPlatforms().size()); + assertEquals(0, view.getMakMakeReferences().size()); + assertEquals(1, view.getExports().size()); + + commitTest(view, string); + + // SPN case: "all" filter + view.dispose(); + + view = model.createView(allConfig); + testSourceRegions(view, true); + + assertEquals(2, view.getPlatforms().size()); + assertEquals(2, view.getMakMakeReferences().size()); + assertEquals(3, view.getExports().size()); + + commitTest(view, string); + + } + + public void testIfNestingRecovery3() { + String incl1 = "PRJ_PLATFORMS\n"+ + "DEFAULT\n"+ + "\n"+ + "PRJ_EXPORTS\n" + + "foo1.txt foo1.txt\n"+ + "\n"+ + "PRJ_MMPFILES\n"+ + "\n"+ + "first.mmp\n"+ + "\n"+ + "#if 1\n"+ + "makefile icons1.mk\n"+ + "#else\n"+ + "makefile icons2.mk\n"+ + "#endif\n"+ + "PRJ_TESTMMPFILES\n" + ; + String incl2 = "PRJ_PLATFORMS\n"+ + "\n"+ + "DEFAULT\n"+ + "\n"+ + "PRJ_MMPFILES\n"+ + "\n"+ + "second.mmp\n"+ + "PRJ_TESTMMPFILES\n"; + String string = "\n" + + "#if 1\n"+ + "#include \"inc1.h\"\n"+ + "#include \"inc2.h\"\n"+ + "#endif\n"+ + "PRJ_PLATFORMS\n"+ + "" + ; + + parserConfig.getFilesystem().put("inc1.h", incl1); + parserConfig.getFilesystem().put("inc2.h", incl2); + makeModel(string); + + IBldInfView view = model.createView(allConfig); + testSourceRegions(view, true); + + assertEquals(4, view.getMakMakeReferences().size()); + assertEquals(2, view.getPlatforms().size()); + assertEquals(1, view.getExports().size()); + + commitTest(view, string); + + } + + public void testIfNestingRecovery4a() { + // note lack of newline after PRJ_MMPFILES + String inf = "PRJ_EXTENSIONS\r\n" + + "start extension base/genexec\r\n" + + "\r\n" + + "option EXTRA_SRC_PATH $(EXTENSION_ROOT)/kernel\r\n" + + "\r\n" + + "end\r\n" + + "\r\n"+ + "PRJ_MMPFILES\r\n" + + "#if defined(GENERIC_MARM) || defined(WINS) || defined(GENERIC_X86)\r\n" + + "\r\n" + + "#if defined(GENERIC_MARM) && !defined(ARMCC)\r\n" + + "euser/epoc/egcc\r\n" + + "#endif\r\n" + + "\r\n" + + "euser/epoc/edllstub\r\n" + + "euser/edll\r\n" + + "euser/eexe\r\n" + + "#endif\n"; + makeModel(inf); + IBldInfView view = model.createView(allConfig); + testSourceRegions(view, true); + + checkNoProblems(view); + assertEquals(4, view.getMakMakeReferences().size()); + commitTest(view, inf); + + } + + public void testIfNestingRecovery4b() { + // note extra newline after PRJ_MMPFILES + String inf = "PRJ_EXTENSIONS\r\n" + + "start extension base/genexec\r\n" + + "\r\n" + + "option EXTRA_SRC_PATH $(EXTENSION_ROOT)/kernel\r\n" + + "\r\n" + + "end\r\n" + + "\r\n"+ + "PRJ_MMPFILES\r\n" + + "\r\n"+ + "#if defined(GENERIC_MARM) || defined(WINS) || defined(GENERIC_X86)\r\n" + + "\r\n" + + "#if defined(GENERIC_MARM) && !defined(ARMCC)\r\n" + + "euser/epoc/egcc\r\n" + + "#endif\r\n" + + "\r\n" + + "euser/epoc/edllstub\r\n" + + "euser/edll\r\n" + + "euser/eexe\r\n" + + "#endif\n"; + makeModel(inf); + IBldInfView view = model.createView(allConfig); + testSourceRegions(view, true); + + checkNoProblems(view); + assertEquals(4, view.getMakMakeReferences().size()); + commitTest(view, inf); + + } + + /** These two test that PRJ_PLATFORMS properly has a newline or space + * between its token and its arguments, AND that the list is terminated + * by a newline. + * + */ + public void testAddToEmptyPlatforms() { + makeModel("PRJ_PLATFORMS\n"+ + "\n"+ + "PRJ_MMPFILES\n"+ + "PRJ_EXPORTS\n"); + + IBldInfView view = model.createView(allConfig); + view.getPlatforms().add("WINSCW"); + view.getPlatforms().add("GCCE"); + + IMMPReference mmp = view.createMMPReference(); + mmp.setPath(new Path("group/file.mmp")); + view.getMakMakeReferences().add(mmp); + + // bug was a missing newline AND space + commitTest(view, + "PRJ_PLATFORMS\n"+ + "WINSCW GCCE\n"+ + "\n"+ + "PRJ_MMPFILES\n"+ + "file.mmp\n"+ + "PRJ_EXPORTS\n"+ + ""); + + } + /** These two test that PRJ_PLATFORMS properly has a newline or space + * between its token and its arguments, AND that the list is terminated + * by a newline. + * + */ + public void testAddToEmptyPlatforms2() { + makeModel("PRJ_PLATFORMS\n"+ + "PRJ_MMPFILES\n"+ + "PRJ_EXPORTS\n"); + + IBldInfView view = model.createView(allConfig); + view.getPlatforms().add("WINSCW"); + view.getPlatforms().add("GCCE"); + + IMMPReference mmp = view.createMMPReference(); + mmp.setPath(new Path("group/file.mmp")); + view.getMakMakeReferences().add(mmp); + + // bug was a missing newline AND space + commitTest(view, + "PRJ_PLATFORMS\n"+ + "WINSCW GCCE\n"+ + "PRJ_MMPFILES\n"+ + "file.mmp\n"+ + "PRJ_EXPORTS\n"); + + } + + public void testHugeMess() throws Exception { + String spdiaText = + "#include \r\n" + + "PRJ_PLATFORMS\r\n" + + "DEFAULT\r\n" + + "\r\n" + + "PRJ_EXPORTS\r\n" + + "..\\ControlInc\\SpdiaControl.h APP_LAYER_SDK_EXPORT_PATH(SpdiaControl.h)\r\n" + + "..\\inc\\sdm.hlp.hrh APP_LAYER_SDK_EXPORT_PATH(cshelp\\sdm.hlp.hrh)\r\n" + + "\r\n" + + "PRJ_MMPFILES\r\n" + + "\r\n" + + "\r\n" + + " \r\n" + + " #ifdef __SCALABLE_ICONS\r\n" + + " gnumakefile icons_dc_scalable_speeddial.mk\r\n" + + " gnumakefile icons_aif_scalable_dc_speeddial.mk\r\n" + + " #else\r\n" + + " gnumakefile icons_dc_speeddial.mk\r\n" + + " gnumakefile icons_aif_bitmaps_dc_speeddial.mk\r\n" + + " #endif\r\n" + + " \r\n" + + "gnumakefile icons_aif_scalable_speeddial.mk\r\n" + + "\r\n" + + "\r\n" + + "SpdCtrl.mmp\r\n" + + "SpeedDial.mmp\r\n" + + "\r\n" + + "PRJ_TESTMMPFILES\r\n" + + "//..\\tsrc\\CVTSpeeddial.mmp // CVT test case(s)\r\n" + + "//..\\TVoiceMailboxCallRemote\\group\\TVoiceMailboxCallRemote.mmp\r\n" + + "\r\n" + + "// End of File"; + + String phonebookuiText = + "PRJ_PLATFORMS\r\n" + + "DEFAULT\r\n" + + "\r\n" + + "// phonebookui subsystem\r\n" + + "#include \"..\\Speeddial\\group\\bld.inf\"\r\n" + + "\r\n" + + "PRJ_EXPORTS\r\n" + + "\r\n" + + "PRJ_MMPFILES\r\n" + + "\r\n" + + "PRJ_TESTMMPFILES\r\n" + + "\r\n" + + "PRJ_TESTEXPORTS\r\n" + + "\r\n" + + "\r\n" + + "\r\n" + + "// End of File \r\n"; + + Map originalFiles = new HashMap(); + originalFiles.put("..\\Speeddial\\group\\bld.inf", spdiaText); + // this fails + originalFiles.put("platform_paths.hrh", "\n"+"#ifndef MACRO\n"+"#define MACRO\n"+"\n"+"#endif\n"+"\n"); + // this passes + //originalFiles.put("platform_paths.hrh", "#ifndef MACRO\n"+"#define MACRO\n"+"\n"+"#endif\n"); + /////originalFiles.put("platform_paths.hrh", loadFileText("data/s60/platform_paths.hrh")); + /* + originalFiles.put("data_caging_paths.hrh", loadFileText("data/s60/data_caging_paths.hrh")); + originalFiles.put("bldvariant.hrh", loadFileText("data/s60/bldvariant.hrh")); + originalFiles.put("defaultcaps.hrh", loadFileText("data/s60/defaultcaps.hrh")); + originalFiles.put("features.hrh", loadFileText("data/s60/features.hrh")); + originalFiles.put("Symbian_OS_v9.3.hrh", loadFileText("data/s60/Symbian_OS_v9.3.hrh")); + originalFiles.put("ProductVariant.hrh", loadFileText("data/s60/ProductVariant.hrh")); + originalFiles.put("PbkConfig.hrh", loadFileText("data/s60/PbkConfig.hrh")); + */ + parserConfig.getFilesystem().clear(); + for (Map.Entry entry : originalFiles.entrySet()) { + parserConfig.getFilesystem().put(entry.getKey(), entry.getValue()); + } + makeModel(phonebookuiText); + + macros.add(DefineFactory.createDefine("__SCALABLE_ICONS")); + + IBldInfView view = model.createView(config); + for (String s : view.getPlatforms()) + assertEquals("DEFAULT", s); + /* + for (String p : view.getPlatforms()) { + System.out.print(p + " "); + } + System.out.println();*/ + IMessage[] messages = view.getMessages(); + for (IMessage p : messages) + System.out.println(p); + assertEquals(0, messages.length); + commitTest(view, phonebookuiText); + //view.commit(); + + for (Map.Entry entry : originalFiles.entrySet()) { + String curFile = parserConfig.getFilesystem().get(entry.getKey()); + assertEquals(entry.getValue(), curFile); + } + + assertEquals(phonebookuiText, model.getDocument().get()); + + } + + public void testAddNewMMP() { + String text = + "PRJ_PLATFORMS\r\n" + + "DEFAULT\r\n" + + "\r\n" + + "PRJ_EXPORTS\r\n" + + "//..\\Common\\inc\\MPlayerConstants.h \\epoc32\\include\\oem\\MPlayerConstants.h\r\n" + + "\r\n" + + "PRJ_MMPFILES\r\n" + + "\r\n" + + "#ifdef __ACTIVE_IDLE \r\n" + + "gnumakefile ..\\ActiveIdlePlugin\\group\\PlayerPluginIcons.mk \r\n" + + "#endif // __ACTIVE_IDLE\r\n" + + "\r\n" + + "gnumakefile icons_dc.mk\r\n" + + "\r\n" + + "gnumakefile ..\\CollectionUi\\group\\CollectionUiIcons_dc.mk\r\n" + + "gnumakefile ..\\PlaybackUi\\group\\PlaybackUiIcons_dc.mk\r\n" + + "\r\n" + + "#ifdef __SCALABLE_ICONS\r\n" + + "gnumakefile Icons_aif_scalable_dc.mk\r\n" + + "#else // __SCALABLE_ICONS\r\n" + + "gnumakefile Icons_aif_bitmaps_dc.mk\r\n" + + "#endif // __SCALABLE_ICONS\r\n" + + "\r\n" + + "..\\Collection\\group\\MCCommon.mmp\r\n" + + "..\\Collection\\group\\MCClient.mmp\r\n" + + "..\\Collection\\group\\MusicCollection.mmp\r\n" + + "..\\Collection\\group\\MCFileHandler.mmp\r\n" + + "..\\Collection\\group\\MCServer.mmp\r\n" + + "\r\n" + + "..\\DRMHelper\\group\\MPlayerDrmHelper.mmp\r\n" + + "..\\Engine\\group\\MusicPlayerEngine.mmp\r\n" + + "..\\CommonUi\\group\\MPlayerCommonUi.mmp\r\n" + + "..\\PlaylistEditor\\group\\MPlayerPlaylistEditor.mmp\r\n" + + "..\\CollectionUi\\group\\MPlayerCollectionUi.mmp\r\n" + + "..\\PlaybackUi\\group\\MPlayerPlaybackUi.mmp\r\n" + + "\r\n" + + "..\\App\\group\\MusicPlayer.mmp\r\n" + + "\r\n" + + "..\\ActiveIdleEngine\\group\\MPlayerRemoteControl.mmp\r\n" + + "..\\ActiveIdleEngine\\group\\RCtrlExtPluginInterface.mmp\r\n" + + "#ifdef __ACTIVE_IDLE\r\n" + + "..\\ActiveIdlePlugin\\group\\PlayerPlugin.mmp\r\n" + + "#endif // __ACTIVE_IDLE\r\n" + + "\r\n" + + "PRJ_TESTMMPFILES\r\n"; + + String text2 = + "PRJ_PLATFORMS\r\n" + + "DEFAULT\r\n" + + "\r\n" + + "PRJ_EXPORTS\r\n" + + "//..\\Common\\inc\\MPlayerConstants.h \\epoc32\\include\\oem\\MPlayerConstants.h\r\n" + + "\r\n" + + "PRJ_MMPFILES\r\n" + + "\r\n" + + "#ifdef __ACTIVE_IDLE \r\n" + + "gnumakefile ..\\ActiveIdlePlugin\\group\\PlayerPluginIcons.mk \r\n" + + "#endif // __ACTIVE_IDLE\r\n" + + "\r\n" + + "gnumakefile icons_dc.mk\r\n" + + "\r\n" + + "gnumakefile ..\\CollectionUi\\group\\CollectionUiIcons_dc.mk\r\n" + + "gnumakefile ..\\PlaybackUi\\group\\PlaybackUiIcons_dc.mk\r\n" + + "\r\n" + + "#ifdef __SCALABLE_ICONS\r\n" + + "gnumakefile Icons_aif_scalable_dc.mk\r\n" + + "#else // __SCALABLE_ICONS\r\n" + + "gnumakefile Icons_aif_bitmaps_dc.mk\r\n" + + "#endif // __SCALABLE_ICONS\r\n" + + "\r\n" + + "..\\Collection\\group\\MCCommon.mmp\r\n" + + "..\\Collection\\group\\MCClient.mmp\r\n" + + "..\\Collection\\group\\MusicCollection.mmp\r\n" + + "..\\Collection\\group\\MCFileHandler.mmp\r\n" + + "..\\Collection\\group\\MCServer.mmp\r\n" + + "\r\n" + + "..\\DRMHelper\\group\\MPlayerDrmHelper.mmp\r\n" + + "..\\Engine\\group\\MusicPlayerEngine.mmp\r\n" + + "..\\CommonUi\\group\\MPlayerCommonUi.mmp\r\n" + + "..\\PlaylistEditor\\group\\MPlayerPlaylistEditor.mmp\r\n" + + "..\\CollectionUi\\group\\MPlayerCollectionUi.mmp\r\n" + + "..\\PlaybackUi\\group\\MPlayerPlaybackUi.mmp\r\n" + + "\r\n" + + "..\\App\\group\\MusicPlayer.mmp\r\n" + + "\r\n" + + "..\\ActiveIdleEngine\\group\\MPlayerRemoteControl.mmp\r\n" + + "..\\ActiveIdleEngine\\group\\RCtrlExtPluginInterface.mmp\r\n" + + "second.mmp\r\n" + + "#ifdef __ACTIVE_IDLE\r\n" + + "..\\ActiveIdlePlugin\\group\\PlayerPlugin.mmp\r\n" + + "#endif // __ACTIVE_IDLE\r\n" + + "\r\n"+ + "PRJ_TESTMMPFILES\r\n" + + ""; + + makeModel(text); + IBldInfView view = model.createView(config); + IMMPReference mmp = view.createMMPReference(); + mmp.setPath(new Path("group/second.mmp")); + view.getMakMakeReferences().add(mmp); + commitTest(view, text2); + } + + public void testEmptyStmts() { + String text = + "PRJ_PLATFORMS\n"+ + "DEFAULT\n" + + "PRJ_MMPFILES\n"; + makeModel(text); + IBldInfView view = model.createView(config); + commitTest(view, text); + + IMMPReference reference = view.createMMPReference(); + reference.setPath(new Path("group/foo.mmp")); + view.getMakMakeReferences().add(reference); + + String text2 = + "PRJ_PLATFORMS\n"+ + "DEFAULT\n" + + "PRJ_MMPFILES\n"+ + "foo.mmp\n"; + commitTest(view, text2); + + } + + public void testModifyingIncludes() { + String inclText = + "//\r\n" + + "// Platforms\r\n" + + "//\r\n" + + "PRJ_PLATFORMS\r\n" + + "DEFAULT\r\n" + + "\r\n" + + "//\r\n" + + "// Phonebook exports\r\n" + + "//\r\n" + + "PRJ_EXPORTS\r\n" + + "\r\n" + + "// Export only when flag is not set\r\n" + + "#if !defined(RD_PHONEBOOK2)\r\n" + + "\r\n" + + "..\\PbkMMTelUtil\\Inc\\CPbkSimEntryCopyFactory.h \\epoc32\\include\\oem\\Phonebook\\CPbkSimEntryCopyFactory.h\r\n" + + "..\\PbkUsimUI\\Inc\\CSimPdDocumentBase.h \\epoc32\\include\\oem\\phonebook\\CSimPdDocumentBase.h\r\n" + + "..\\PbkUsimUI\\Inc\\PbkUSimServAppDef.h \\epoc32\\include\\oem\\phonebook\\PbkUSimServAppDef.h\r\n" + + "\r\n" + + "#endif // RD_PHONEBOOK2\r\n" + + "\r\n" + + "//\r\n" + + "// Phonebook SIM Bridge components\r\n" + + "//\r\n" + + "PRJ_MMPFILES\r\n" + + "\r\n" + + "#if !defined(RD_PHONEBOOK2)\r\n" + + "PbkMMTelUtil.mmp\r\n" + + "PbkUSimUI.mmp\r\n" + + "#endif // RD_PHONEBOOK2\r\n" + + "\r\n" + + "// End of file\r\n"; + String text = + "PRJ_PLATFORMS\n" + + "DEFAULT\n" + + "#include \"incl.inf\"\n"; + + macros.add(DefineFactory.createDefine("RD_PHONEBOOK2", "1")); + parserConfig.getFilesystem().put("incl.inf", inclText); + makeModel(text); + IBldInfView view = model.createView(config); + commitTest(view, text); + assertEquals(inclText, parserConfig.getFilesystem().get("incl.inf")); + + } + + public void testSpacing() { + makeModel(""); + + IBldInfView view = getView(config); + assertNotNull(view); + + List platforms = view.getPlatforms(); + + platforms.add("WINSCW"); + platforms.add("ARMV5"); + + IMMPReference mmp = view.createMMPReference(); + + mmp.setPath(new Path("group/program.mmp")); + view.getMakMakeReferences().add(mmp); + + IExport exp = view.createExport(); + exp.setSourcePath(new Path("src/MyFile.txt")); + assertEquals(new Path("src/MyFile.txt"), exp.getSourcePath()); + view.getExports().add(exp); + + commitTest(view, + "PRJ_PLATFORMS\n" + + "WINSCW ARMV5\n" + + "\n" + + "PRJ_MMPFILES\n" + + "program.mmp\n" + + "\n" + + "PRJ_EXPORTS\n" + + "../src/MyFile.txt\n"); + + mmp = view.createMMPReference(); + mmp.setPath(new Path("group/test.mmp")); + view.getTestMakMakeReferences().add(mmp); + + mmp = view.createMMPReference(); + mmp.setPath(new Path("group/another.mmp")); + view.getMakMakeReferences().add(mmp); + + commitTest(view, + "PRJ_PLATFORMS\n" + + "WINSCW ARMV5\n" + + "\n" + + "PRJ_MMPFILES\n" + + "program.mmp\n" + + "another.mmp\n" + + "\n" + + "PRJ_EXPORTS\n" + + "../src/MyFile.txt\n"+ + "\n"+ + "PRJ_TESTMMPFILES\n" + + "test.mmp\n"); + + } + + /** + * Bug 2770: don't add statements to blocks in other documents, + * since this copies the entire block to the main file. + * + */ + public void testLeaveNonMainBlocksAlone() { + // Note: the minimal case for this is much smaller, but + // might as well test with big real-life fileset. + String origFile = + "/*\r\n" + + "* ==============================================================================\r\n" + + "* Name : bld.inf\r\n" + + "* Part of : \r\n" + + "* Description : \r\n" + + "* Version : \r\n" + + "*\r\n" + + "* Copyright © 2006 Nokia. All rights reserved.\r\n" + + "* This material, including documentation and any related\r\n" + + "* computer programs, is protected by copyright controlled by\r\n" + + "* Nokia Corporation. All rights are reserved. Copying,\r\n" + + "* including reproducing, storing, adapting or translating, any\r\n" + + "* or all of this material requires the prior written consent of\r\n" + + "* Nokia. This material also contains confidential\r\n" + + "* information which may not be disclosed to others without the\r\n" + + "* prior written consent of Nokia.\r\n" + + "* ==============================================================================\r\n" + + "*/\r\n" + + "\r\n" + + "#include \r\n" + + "\r\n" + + "PRJ_PLATFORMS\r\n" + + "DEFAULT\r\n" + + "\r\n" + + "PRJ_EXPORTS\r\n" + + "..\\inc_domain\\mcdef.h APP_LAYER_DOMAIN_EXPORT_PATH(mcdef.h)\r\n" + + "..\\inc_domain\\MMusicShopBrViewCallback.h APP_LAYER_DOMAIN_EXPORT_PATH(MMusicShopBrViewCallback.h)\r\n" + + "..\\inc_domain\\MPlayerAudioUIController.h APP_LAYER_DOMAIN_EXPORT_PATH(MPlayerAudioUIController.h)\r\n" + + "..\\inc_domain\\MPlayerConstants.h APP_LAYER_DOMAIN_EXPORT_PATH(MPlayerConstants.h)\r\n" + + "..\\inc_domain\\MPlayerDrmHelper.h APP_LAYER_DOMAIN_EXPORT_PATH(MPlayerDrmHelper.h)\r\n" + + "..\\inc_domain\\MPlayerPlaybackView.h APP_LAYER_DOMAIN_EXPORT_PATH(MPlayerPlaybackView.h)\r\n" + + "..\\inc_domain\\MPlayerPlaylistEditor.h APP_LAYER_DOMAIN_EXPORT_PATH(MPlayerPlaylistEditor.h)\r\n" + + "..\\inc_domain\\MPlayerPlaylistModel.h APP_LAYER_DOMAIN_EXPORT_PATH(MPlayerPlaylistModel.h)\r\n" + + "..\\inc_domain\\MPlayerRemoteControl.h APP_LAYER_DOMAIN_EXPORT_PATH(MPlayerRemoteControl.h)\r\n" + + "..\\inc_domain\\mplayersecondarydisplayapi.h APP_LAYER_DOMAIN_EXPORT_PATH(mplayersecondarydisplayapi.h)\r\n" + + "..\\inc_domain\\MPlayerUIControllerObserver.h APP_LAYER_DOMAIN_EXPORT_PATH(MPlayerUIControllerObserver.h)\r\n" + + "..\\inc_domain\\musicplayerdomaincrkeys.h APP_LAYER_DOMAIN_EXPORT_PATH(musicplayerdomaincrkeys.h)\r\n" + + "..\\inc_domain\\MusicShopEmbeddedLauncher.h APP_LAYER_DOMAIN_EXPORT_PATH(MusicShopEmbeddedLauncher.h)\r\n" + + "..\\inc_domain\\MusicShopExternalInterface.h APP_LAYER_DOMAIN_EXPORT_PATH(MusicShopExternalInterface.h)\r\n" + + "..\\inc_domain\\MusicVisualizationPlugin.h APP_LAYER_DOMAIN_EXPORT_PATH(MusicVisualizationPlugin.h)\r\n" + + "..\\inc_domain\\MusicPlayerInternalCRKeys.h APP_LAYER_DOMAIN_EXPORT_PATH(MusicPlayerInternalCRKeys.h)\r\n" + + "\r\n" + + "\r\n" + + "PRJ_MMPFILES\r\n" + + "#include \"..\\MusicPlayer\\group\\bld.inf\"\r\n" + + "#include \"..\\MusicShop\\group\\bld.inf\"\r\n" + + "#include \"..\\MusicVisualization\\group\\bld.inf\"\r\n" + + "\r\n" + + "\r\n" + + "// End of File \r\n"; + + String updatedFile = + origFile + + "\r\n"+ + "PRJ_MMPFILES\r\n" + + "FMRadio.mmp\r\n"; + String musicPlayerBldInf = + "/*\r\n" + + "* ==============================================================================\r\n" + + "* Name : bld.inf\r\n" + + "* Part of : MusicPlayer\r\n" + + "* Description : \r\n" + + "* This file provides the information required for building the\r\n" + + "* whole MusicPlayer application including all related libraries.\r\n" + + "* Version : \r\n" + + "*\r\n" + + "* Copyright © 2002-2006 Nokia Corporation.\r\n" + + "* This material, including documentation and any related \r\n" + + "* computer programs, is protected by copyright controlled by \r\n" + + "* Nokia Corporation. All rights are reserved. Copying, \r\n" + + "* including reproducing, storing, adapting or translating, any \r\n" + + "* or all of this material requires the prior written consent of \r\n" + + "* Nokia Corporation. This material also contains confidential \r\n" + + "* information which may not be disclosed to others without the \r\n" + + "* prior written consent of Nokia Corporation.\r\n" + + "* ==============================================================================\r\n" + + "*/\r\n" + + "\r\n" + + "PRJ_PLATFORMS\r\n" + + "DEFAULT\r\n" + + "\r\n" + + "PRJ_EXPORTS\r\n" + + "//..\\Common\\inc\\MPlayerConstants.h \\epoc32\\include\\oem\\MPlayerConstants.h\r\n" + + "//..\\Engine\\inc\\MPlayerPlaylistModel.h \\epoc32\\include\\oem\\MPlayerPlaylistModel.h\r\n" + + "//..\\PlaylistEditor\\inc\\MPlayerPlaylistEditor.h \\epoc32\\include\\oem\\MPlayerPlaylistEditor.h\r\n" + + "//..\\DRMHelper\\inc\\MPlayerDrmHelper.h \\epoc32\\include\\oem\\MPlayerDrmHelper.h\r\n" + + "//..\\Common\\Inc\\MusicPlayerInternalCRKeys.h \\epoc32\\include\\oem\\MusicPlayerInternalCRKeys.h\r\n" + + "//..\\Common\\Inc\\musicplayerdomaincrkeys.h \\epoc32\\include\\oem\\musicplayerdomaincrkeys.h\r\n" + + "//..\\Common\\Inc\\MusicPlayerInternalPSKeys.h \\epoc32\\include\\oem\\MusicPlayerInternalPSKeys.h\r\n" + + "//..\\Engine\\inc\\MPlayerAudioUiController.h \\epoc32\\include\\oem\\MPlayerAudioUiController.h\r\n" + + "//..\\Engine\\inc\\MPlayerUIControllerObserver.h \\epoc32\\include\\oem\\MPlayerUIControllerObserver.h\r\n" + + "//..\\PlaybackUi\\inc\\MPlayerPlaybackView.h \\epoc32\\include\\oem\\MPlayerPlaybackView.h\r\n" + + "//..\\Common\\inc\\mplayersecondarydisplayapi.h \\epoc32\\include\\oem\\secondarydisplay\\mplayersecondarydisplayapi.h\r\n" + + "//..\\ActiveIdleEngine\\Inc\\MPlayerRemoteControl.h \\epoc32\\include\\oem\\MPlayerRemoteControl.h \r\n" + + "\r\n" + + "//..\\collection\\inc\\mcdef.h \\epoc32\\include\\oem\\mcdef.h\r\n" + + "\r\n" + + "//Export the compiled DBMS policy file for the Music Collection DB...\r\n" + + "\r\n" + + "//for emulator\r\n" + + "..\\Collection\\data\\101FE031.spd \\epoc32\\release\\winscw\\udeb\\z\\private\\100012a5\\policy\\101FE031.spd\r\n" + + "..\\Collection\\data\\101FE031.spd \\epoc32\\release\\winscw\\urel\\z\\private\\100012a5\\policy\\101FE031.spd\r\n" + + "\r\n" + + "//for ROM building\r\n" + + "..\\Collection\\data\\101FE031.spd \\epoc32\\data\\z\\private\\100012a5\\policy\\101FE031.spd\r\n" + + "\r\n" + + "// Empty sound file\r\n" + + "..\\App\\data\\NullSound.mp3 \\epoc32\\release\\winscw\\udeb\\z\\private\\102072C3\\NullSound.mp3\r\n" + + "..\\App\\data\\NullSound.mp3 \\epoc32\\release\\winscw\\urel\\z\\private\\102072C3\\NullSound.mp3\r\n" + + "..\\App\\data\\NullSound.mp3 \\epoc32\\data\\z\\private\\102072C3\\NullSound.mp3\r\n" + + "\r\n" + + "// Secure backup & restore\r\n" + + "backup_registration.xml \\epoc32\\RELEASE\\winscw\\urel\\z\\private\\102072C3\\backup_registration.xml\r\n" + + "backup_registration.xml \\epoc32\\RELEASE\\winscw\\udeb\\z\\private\\102072C3\\backup_registration.xml\r\n" + + "backup_registration.xml \\epoc32\\data\\z\\private\\102072C3\\backup_registration.xml\r\n" + + "\r\n" + + "PRJ_MMPFILES\r\n" + + "\r\n" + + "#ifdef __ACTIVE_IDLE \r\n" + + "gnumakefile ..\\ActiveIdlePlugin\\group\\PlayerPluginIcons.mk \r\n" + + "#endif // __ACTIVE_IDLE\r\n" + + "\r\n" + + "gnumakefile icons_dc.mk\r\n" + + "\r\n" + + "gnumakefile ..\\CollectionUi\\group\\CollectionUiIcons_dc.mk\r\n" + + "gnumakefile ..\\PlaybackUi\\group\\PlaybackUiIcons_dc.mk\r\n" + + "\r\n" + + "#ifdef __SCALABLE_ICONS\r\n" + + "gnumakefile Icons_aif_scalable_dc.mk\r\n" + + "#else // __SCALABLE_ICONS\r\n" + + "gnumakefile Icons_aif_bitmaps_dc.mk\r\n" + + "#endif // __SCALABLE_ICONS\r\n" + + "\r\n" + + "..\\Collection\\group\\MCCommon.mmp\r\n" + + "..\\Collection\\group\\MCClient.mmp\r\n" + + "..\\Collection\\group\\MusicCollection.mmp\r\n" + + "..\\Collection\\group\\MCFileHandler.mmp\r\n" + + "..\\Collection\\group\\MCServer.mmp\r\n" + + "\r\n" + + "..\\DRMHelper\\group\\MPlayerDrmHelper.mmp\r\n" + + "..\\Engine\\group\\MusicPlayerEngine.mmp\r\n" + + "..\\CommonUi\\group\\MPlayerCommonUi.mmp\r\n" + + "..\\PlaylistEditor\\group\\MPlayerPlaylistEditor.mmp\r\n" + + "..\\CollectionUi\\group\\MPlayerCollectionUi.mmp\r\n" + + "..\\PlaybackUi\\group\\MPlayerPlaybackUi.mmp\r\n" + + "\r\n" + + "..\\App\\group\\MusicPlayer.mmp\r\n" + + "\r\n" + + "..\\ActiveIdleEngine\\group\\MPlayerRemoteControl.mmp\r\n" + + "..\\ActiveIdleEngine\\group\\RCtrlExtPluginInterface.mmp\r\n" + + "#ifdef __ACTIVE_IDLE\r\n" + + "..\\ActiveIdlePlugin\\group\\PlayerPlugin.mmp\r\n" + + "#endif // __ACTIVE_IDLE\r\n" + + "\r\n" + + "PRJ_MMPFILES\r\n" + + "PRJ_TESTMMPFILES\r\n" + + ""; + + String musicShopBldInf = + "/*\r\n" + + "* ==============================================================================\r\n" + + "* Name : bld.inf\r\n" + + "* Part of : MusicShop\r\n" + + "* Description : This is a top level bld file that drives all sub-components\r\n" + + "* that make up the MusicShopEmbed, MusicShopApp and MusicShopLib\r\n" + + "* Version : %version: da1mmcf#15 %\r\n" + + "*\r\n" + + "* Copyright © 2006 Nokia. All rights reserved.\r\n" + + "* This material, including documentation and any related\r\n" + + "* computer programs, is protected by copyright controlled by\r\n" + + "* Nokia Corporation. All rights are reserved. Copying,\r\n" + + "* including reproducing, storing, adapting or translating, any\r\n" + + "* or all of this material requires the prior written consent of\r\n" + + "* Nokia. This material also contains confidential\r\n" + + "* information which may not be disclosed to others without the\r\n" + + "* prior written consent of Nokia.\r\n" + + "* ==============================================================================\r\n" + + "*/\r\n" + + "\r\n" + + "PRJ_PLATFORMS\r\n" + + "DEFAULT\r\n" + + "\r\n" + + "PRJ_EXPORTS\r\n" + + "\r\n" + + "PRJ_MMPFILES\r\n" + + "\r\n" + + "#ifdef __SERIES60_NATIVE_BROWSER\r\n" + + "gnumakefile MusicShop_Icons_dc.mk\r\n" + + "\r\n" + + "#ifdef __SCALABLE_ICONS\r\n" + + " gnumakefile MusicShop_Icons_aif_scalable_dc.mk\r\n" + + "#else // !__SCALABLE_ICONS\r\n" + + " gnumakefile MusicShop_Icons_aif_bitmaps_dc.mk\r\n" + + "#endif // __SCALABLE_ICONS\r\n" + + "\r\n" + + "..\\musicshopembed\\group\\MusicShopEmbed.mmp\r\n" + + "..\\musicshoplib\\group\\musicshoplib.mmp\r\n" + + "..\\musicshopapp\\group\\musicshopapp.mmp\r\n" + + "\r\n" + + "#endif // __SERIES60_NATIVE_BROWSER\r\n" + + "\r\n" + + "\r\n" + + "// End of File\r\n" + + ""; + String musicVisualizationBldInf = + "/*\r\n" + + "* ==============================================================================\r\n" + + "* Name : bld.inf\r\n" + + "* Part of : MusicVisualization\r\n" + + "* Description : \r\n" + + "* This file provides the information required for building the\r\n" + + "* all MusicVisualization projects including plugins.\r\n" + + "* Version : \r\n" + + "*\r\n" + + "* Copyright © 2005 Nokia Corporation.\r\n" + + "* This material, including documentation and any related \r\n" + + "* computer programs, is protected by copyright controlled by \r\n" + + "* Nokia Corporation. All rights are reserved. Copying, \r\n" + + "* including reproducing, storing, adapting or translating, any \r\n" + + "* or all of this material requires the prior written consent of \r\n" + + "* Nokia Corporation. This material also contains confidential \r\n" + + "* information which may not be disclosed to others without the \r\n" + + "* prior written consent of Nokia Corporation.\r\n" + + "* ==============================================================================\r\n" + + "*/\r\n" + + "\r\n" + + "PRJ_PLATFORMS\r\n" + + "DEFAULT\r\n" + + "\r\n" + + "PRJ_EXPORTS\r\n" + + "\r\n" + + "\r\n" + + "PRJ_MMPFILES\r\n" + + "\r\n" + + "gnumakefile ..\\Plugins\\MVPOscilloscope\\Group\\Icons_oscilloscope.mk\r\n" + + "gnumakefile ..\\Plugins\\MVPSpectrum\\Group\\Icons_spectrum.mk\r\n" + + "\r\n" + + "..\\Group\\MusicVisualizationPlugin.mmp\r\n" + + "..\\Plugins\\MVPOscilloscope\\Group\\MVPOscilloscope.mmp\r\n" + + "..\\Plugins\\MVPSpectrum\\Group\\MVPSpectrum.mmp\r\n" + + "\r\n" + + "PRJ_TESTMMPFILES\r\n" + + "\r\n" + + "// End of File\r\n" ; + + parserConfig.getFilesystem().put("..\\MusicPlayer\\group\\bld.inf", musicPlayerBldInf); + parserConfig.getFilesystem().put("..\\MusicShop\\group\\bld.inf", musicShopBldInf); + parserConfig.getFilesystem().put("..\\MusicVisualization\\group\\bld.inf", musicVisualizationBldInf); + + makeModel(origFile); + + IBldInfView view = getView(config); + assertNotNull(view); + + IMMPReference ref = view.createMMPReference(); + ref.setPath(new Path("group\\FMRadio.mmp")); + view.getMakMakeReferences().add(ref); + + commitTest(view, updatedFile); + assertEquals(parserConfig.getFilesystem().get("..\\MusicPlayer\\group\\bld.inf"), musicPlayerBldInf); + assertEquals(parserConfig.getFilesystem().get("..\\MusicShop\\group\\bld.inf"), musicShopBldInf); + assertEquals(parserConfig.getFilesystem().get("..\\MusicVisualization\\group\\bld.inf"), musicVisualizationBldInf); + + } + + + /** + * When we have a change that would affect another document, + * then the entire node is changed and the node moves into + * the main document. When deleting stuff, the case is even worse + * since updated nodes are replicated in main file, meaning + * delete doesn't happen at all. + *

+ * Bug 2784 + */ + public void testDeleteFromOtherDocument() { + String incFile = + "PRJ_MMPFILES\n" + + "first.mmp\n"+ + "second.mmp\n"; + + String mainFile = "#include \"inc.inf\"\n"; + + String inclFile = "inc.inf"; + parserConfig.getFilesystem().put(inclFile, incFile); + makeModel(mainFile); + + IBldInfView view = getView(config); + assertEquals(2, view.getMakMakeReferences().size()); + + view.getMakMakeReferences().remove(0); + + commitTest(view, + "#include \"inc.inf\"\n" + + ""); + assertEquals( + "PRJ_MMPFILES\n" + + "second.mmp\n", + parserConfig.getFilesystem().get(inclFile)); + + assertEquals(1, view.getMakMakeReferences().size()); + view.getMakMakeReferences().remove(0); + + commitTest(view, + "#include \"inc.inf\"\n" + + ""); + assertEquals("PRJ_MMPFILES\n" + + "", + parserConfig.getFilesystem().get(inclFile)); + + + } + + public void testBug2856() { + String includedFile = + "PRJ_EXPORTS\r\n" + + "we_symbian_variant.h\r\n" + + "\r\n" + + "PRJ_MMPFILES\r\n" + + "#include \"..\\bld2.inf\"\r\n" + + "#include \"..\\..\\ui\\common\\ControlLibUIQ\\group\\bld.inf\"\r\n" + + "\r\n" + + ""; + String includedFile2 = + "PRJ_MMPFILES\r\n" + + "other.mmp\r\n" + + "\r\n" + + ""; + String mainFile = + "PRJ_MMPFILES\r\n" + + "#include \"..\\bld1.inf\"\r\n" + + "app.mmp\r\n"; + + path = projectPath.append("bld.inf"); + parserConfig.getFilesystem().put(projectPath.removeLastSegments(1).append("bld1.inf").toOSString(), + includedFile); + parserConfig.getFilesystem().put(projectPath.removeLastSegments(2).append("bld2.inf").toOSString(), + includedFile2); + makeModel(mainFile); + + IBldInfView view = getView(config); + assertEquals(2, view.getMakMakeReferences().size()); + // outside proj, so absolute + assertEquals(projectPath.removeLastSegments(2).append("other.mmp"), + view.getMakMakeReferences().get(0).getPath()); + // inside proj, so relative + assertEquals(new Path("app.mmp"), + view.getMakMakeReferences().get(1).getPath()); + + } + + public void testBug3060_1() { + String text= "PRJ_MMPFILES\n"+ + "test.mmp\n"+ + "#if 0\n"+ + "@idiot\n"+ + "#endif\n"+ + ""; + + makeModel(text); + IBldInfView view = getView(config); + commitTest(view, text); + + } + public void testBug3060_2() { + // this shouldn't crash or corrupt the rewritten file + String text= "PRJ_MMPFILES\n"+ + "test.mmp\n"+ + "#ifdef 0\n"+ // yes, IFDEF 0!!! + "@idiot\n"+ + "#endif\n"+ + ""; + + makeModel(text); + IBldInfView view = getView(config); + commitTest(view, text); + } + + public void testBlockSyncsOverIncludes() { + + String text = "#include \"outer1.inf\"\r\n" + + "#include \"outer2.inf\"\r\n" + + ""; + String outer1 = + //"#include \r\n" + + "\r\n" + + "PRJ_PLATFORMS\r\n" + + "DEFAULT\r\n" + + "\r\n" + + "PRJ_EXPORTS\r\n" + + "..\\inc\\cphonecntfactory.h |..\\..\\..\\inc\\cphonecntfactory.h\r\n" + + "..\\group\\phonecntfinder_stub.SIS \\epoc32\\data\\z\\system\\install\\phonecntfinder_stub.SIS\r\n" + + "\r\n" + + "PRJ_MMPFILES\r\n" + + "..\\group\\phonecntfinder.mmp\r\n" + + "\r\n" + + "// PhoneCntFinderExt.\r\n" + + "#include \"inner1.inf\"\r\n" + + "\r\n" + + "// End of File\r\n" + + ""; + + String outer2 = + // 2 - 23 + "\r\n" + + "#ifndef RD_PHONE_NG\r\n" + + // 23-168 + "\r\n" + + "PRJ_PLATFORMS\r\n" + + "DEFAULT\r\n" + + "\r\n" + + "PRJ_EXPORTS\r\n" + + "\r\n" + + "// audio \r\n" + + "..\\inc\\audio\\MPhEngAudio.h |..\\..\\..\\inc\\MPhEngAudio.h\r\n" + + "#ifndef RD_VOIP_REL_2_2\r\n" + + // 193-289 + "..\\inc\\dtmfhandling\\CPhEngDtmfSender.h |..\\..\\..\\inc\\CPhEngDtmfSender.h\r\n" + + "#endif\r\n" + + // 297-408 + "\r\n" + + "\r\n" + + "// engine base\r\n" + + "..\\inc\\enginebase\\CPhEngModel.h |..\\..\\..\\inc\\CPhEngModel.h\r\n" + + "#if defined(__VOIP) && defined(RD_VOIP_REL_2_2)\r\n" + + // 461-683 + "..\\inc\\extensions\\mctipluginuids.h |..\\..\\..\\inc\\mctipluginuids.h\r\n" + + "..\\inc\\extensions\\phoneecomplugininterfaceuids.hrh |..\\..\\..\\inc\\phoneecomplugininterfaceuids.hrh\r\n" + + "#endif // __VOIP && RD_VOIP_REL_2_2\r\n" + + "\r\n" + + // 716-855 + // this line is corrupted due to the missync above + "// sis stub file\r\n" + + "phoneengine_stub.sis \\epoc32\\data\\z\\system\\install\\phoneengine_stub.sis\r\n" + + "\r\n" + + "PRJ_MMPFILES\r\n" + + "..\\Group\\PhoneEngine.mmp\r\n" + + "\r\n" + + "#endif // RD_PHONE_NG\r\n" + + "\r\n" + + // 878-896 + "// End of File\r\n" + + ""; + String inner1 = + "\r\n" + + "PRJ_PLATFORMS\r\n" + + "DEFAULT\r\n" + + "\r\n" + + "PRJ_EXPORTS\r\n" + + "..\\group\\phcntvoicerecoghandler_stub.SIS \\epoc32\\data\\z\\system\\install\\phcntvoicerecoghandler_stub.SIS\r\n" + + "\r\n" + + "PRJ_MMPFILES\r\n" + + "..\\group\\PhCntVoiceRecogHandler.mmp\r\n" + + "\r\n" + + "PRJ_TESTMMPFILES\r\n" + + "\r\n" + + "// End of File\r\n" + + ""; + + String inclFile = projectPath.append("outer1.inf").toOSString(); + parserConfig.getFilesystem().put(inclFile, outer1); + inclFile = projectPath.append("inner1.inf").toOSString(); + parserConfig.getFilesystem().put(inclFile, inner1); + inclFile = projectPath.append("outer2.inf").toOSString(); + parserConfig.getFilesystem().put(inclFile, outer2); + + makeModel(text); + IBldInfView view = getView(config); + checkNoProblems(view); + assertEquals(0, view.getTestMakMakeReferences().size()); + + } + + +}