diff -r 000000000000 -r f58d6ec98e88 aknlayoutcompiler/src/MakeLayConvTest.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/aknlayoutcompiler/src/MakeLayConvTest.cpp Thu Dec 17 09:14:18 2009 +0200 @@ -0,0 +1,271 @@ +/* +* Copyright (c) 2002-2004 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "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: +* +* +*/ + + + +// disable "identifier was truncated to '255' characters in the browser information" warning +#pragma warning (disable:4786) + +#include "MakeLayConvTest.h" +#include "LayoutCompilerErr.h" +#include "LayoutParse.h" +#include "Lay2Cdl.h" +#include "CodeGenConsts.h" +#include +#include +#include +using namespace std; +using namespace CdlCompilerToolkit; + +typedef LayoutProcessArgsErr MakeLayoutConvTestArgsErr; + + + +int MakeLayoutConvTest::Process(const vector& args) + { + if (args.size() != 4) + throw MakeLayoutConvTestArgsErr(); + + string cdlName = args[2]; + CCdlTkCdlFileParser parser(cdlName); + auto_ptr iface(parser.LoadAndParse(true)); + + string layoutName = args[3]; + auto_ptr layoutParse = TLayParseLayout::Parse(layoutName); + + MakeLayoutConvTest process(*iface, *layoutParse); + process.RunProcess(); + + return 0; + } + +void MakeLayoutConvTest::ShowHelp(ostream& stream) + { + stream << "MakeLayConvTest " << endl; + stream << " Creates layout conversion test code." << endl; + } + +MakeLayoutConvTest::MakeLayoutConvTest(CCdlTkInterface& aInterface, TLayout& aLayout) +: iInterface(aInterface), iLayout(aLayout) + { + } + +MakeLayoutConvTest::~MakeLayoutConvTest() + { + } + +void MakeLayoutConvTest::RunProcess() + { + InitFiles(); + + for (TLayout::iterator pTab = iLayout.begin(); pTab != iLayout.end(); ++pTab) + { + AddTableToTest(**pTab); + } + + CompleteFiles(); + WriteTestFiles(); + } + +void MakeLayoutConvTest::AddTableToTest(TLayoutTable& aTable) + { + for (TLayoutTable::iterator pLine = aTable.begin(); pLine != aTable.end(); ++pLine) + { + TLayoutLine& line = **pLine; + AddLineToTest(line); + } + + } + +void MakeLayoutConvTest::AddLineToTest(TLayoutLine& aLine) + { + string apiName = LayoutToCdl::LineApiName(aLine); + const CCdlTkFunctionApi* api = FindApi(apiName); + if (!api) + return; + + AddTest(aLine, *api); + if (aLine["B"].size() > 1) + { + apiName = KFuncMultiline + apiName; + api = FindApi(apiName); + if (api) + { + AddTest(aLine, *api); + } + } + } + +void MakeLayoutConvTest::AddTest(TLayoutLine& aLine, const CCdlTkFunctionApi& aApi) + { + AddTestToOldH(aLine, aApi); + AddTestToOldCpp(aLine, aApi); + AddTestFunc(aLine, aApi); + } + +const CCdlTkFunctionApi* MakeLayoutConvTest::FindApi(const string& aName) + { + return &iInterface.ApiList().Find(aName)->AsFunc(); + } + +void MakeLayoutConvTest::WriteTestFiles() + { + WriteTestFile("OldLayout.h", iOldH); + WriteTestFile("OldLayout.cpp", iOldCpp); + WriteTestFile("TestLayout.cpp", iFuncs + iTests); + } + +void MakeLayoutConvTest::WriteTestFile(const string& aFileName, const string& iContent) + { + CCdlTkFileCleanup tempFile; + ofstream stream; + CdlTkUtil::OpenTempOutput(stream, tempFile); + stream << iContent; + stream.close(); + CdlTkUtil::ExportFileIfWritable(tempFile, CdlTkUtil::ResolvePath(CdlTkUtil::OutputPath(), aFileName)); + } + +void MakeLayoutConvTest::AddTestToOldH(TLayoutLine& aLine, const CCdlTkFunctionApi& aApi) + { + string f = OldFuncSig(aLine, aApi) + ";\n"; + CdlTkUtil::AppendString(iOldH, f); + } + +const string KOldFunc = "\ +$TYPE Old_$NAME$PARAMLIST\n\ +\t{\n\ +\treturn $LAGNAME$PARAMS;\n\ +\t}\n\n"; + +void MakeLayoutConvTest::AddTestToOldCpp(TLayoutLine& aLine, const CCdlTkFunctionApi& aApi) + { + string lagName = "AKN_LAYOUT_WINDOW_" + aApi.Name(); + if (aApi.ReturnType() == KTypeTextLineLayout) + lagName = "AKN_LAYOUT_TEXT_" + aApi.Name(); + else if (aApi.ReturnType() == KTypeMultiLineTextLayout) + lagName = "AKN_LAYOUT_MULTILINE_TEXT_" + aApi.Name().substr(KFuncMultiline.length()); // remove "Multiline_" + + string params = aApi.ParamNameList(); + if (!params.empty()) + params = string("(") + params + ")"; + + CdlTkUtil::CReplaceSet rep; + rep.Add("$TYPE", aApi.ReturnType()); + rep.Add("$NAME", aApi.Name()); + rep.Add("$PARAMLIST", aApi.ParamsTypeAndNameList()); + rep.Add("$LAGNAME", lagName); + rep.Add("$PARAMS", params); + CdlTkUtil::AppendString(iOldCpp, CdlTkUtil::MultiReplace(rep, KOldFunc)); + } + +const string KTestFunc = "\ +void Test_$NAME(const AknLayout::CInstance& aInst)\n\ +\t{\n\ +$PARENT\ +$LOOPS_START\ +$INDENTCheckLayout(aInst.$NAME($PARAMS), Old_$NAME($PARAMS));\n\ +$LOOPS_END\ +\t}\n\n"; + +const string KTestLoop = "$INDENTfor (" + KTypeInt + " $PARAM_NAME = 0; $PARAM_NAME < $MAX; $PARAM_NAME++)\n$INDENT\t{\n"; + +void MakeLayoutConvTest::AddTestFunc(TLayoutLine& aLine, const CCdlTkFunctionApi& aApi) + { + string testCall = string("\tTest_") + aApi.Name() + "(aInst);\n"; + CdlTkUtil::AppendString(iTests, testCall); + string indent = "\t"; + + string loopStart; + string loopEnd; + const CCdlTkApiParams& params = aApi.Params(); + for (CCdlTkApiParams::const_iterator pParam = params.begin(); pParam != params.end(); ++pParam) + { + if (pParam->Type() == KTypeInt) + { + string paramName = pParam->Name(); + int max = 0; + for (TLayoutLine::iterator pVal = aLine.begin(); pVal != aLine.end(); ++pVal) + { + if (pVal->second.ParamName() == paramName) + { + max = pVal->second.size(); + break; + } + } + + CdlTkUtil::CReplaceSet rep; + rep.Add("$PARAM_NAME", paramName); + rep.Add("$MAX", CdlTkUtil::IntToString(max)); + rep.Add("$INDENT", indent); + CdlTkUtil::AppendString(loopStart, CdlTkUtil::MultiReplace(rep, KTestLoop)); + indent += "\t"; + loopEnd = indent + "}\n" + loopEnd; + } + } + + CdlTkUtil::CReplaceSet rep; + rep.Add("$NAME", aApi.Name()); + rep.Add("$LOOPS_START", loopStart); + rep.Add("$PARAMS", aApi.ParamNameList()); + rep.Add("$LOOPS_END", loopEnd); + rep.Add("$INDENT", indent); + rep.Add("$PARENT", aLine.iNeedsP ? "\tTRect aParentRect(0,0,176,208);\n" : ""); + CdlTkUtil::AppendString(iFuncs, CdlTkUtil::MultiReplace(rep, KTestFunc)); + } + +const string KOldFuncName = "Old_$NAME"; +const string KFuncSig = "$TYPE $NAME$PARAMS"; + +string MakeLayoutConvTest::OldFuncSig(TLayoutLine& aLine, const CCdlTkFunctionApi& aApi) + { + string type = aApi.ReturnType(); + string name = CdlTkUtil::Replace("$NAME", aApi.Name(), KOldFuncName); + string params = aApi.ParamsTypeAndNameList(); + + CdlTkUtil::CReplaceSet rep; + rep.Add("$TYPE", type); + rep.Add("$NAME", name); + rep.Add("$PARAMS", params); + return CdlTkUtil::MultiReplace(rep, KFuncSig); + } + +void MakeLayoutConvTest::InitFiles() + { + iOldH = ""; + + iOldCpp = "\ +#include \n\ +#include \n\ +#include \"OldLayout.h\"\n\n"; + + iFuncs = "\ +#include \"LayTestUtils.h\"\n\ +#include \"OldLayout.h\"\n\n"; + + iTests = "\ +void RunTests(const AknLayout::CInstance& aInst)\n\ +\t{\n"; + + } + +void MakeLayoutConvTest::CompleteFiles() + { + iTests += "\t}\n"; + } + +