aknlayoutcompiler/src/MakeLayConvTest.cpp
changeset 0 f58d6ec98e88
--- /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 <fstream>
+#include <algorithm>
+#include <iostream>
+using namespace std;
+using namespace CdlCompilerToolkit;
+
+typedef LayoutProcessArgsErr<MakeLayoutConvTest> MakeLayoutConvTestArgsErr;
+
+
+
+int MakeLayoutConvTest::Process(const vector<string>& args)
+	{
+	if (args.size() != 4)
+		throw MakeLayoutConvTestArgsErr();
+
+	string cdlName = args[2];
+	CCdlTkCdlFileParser parser(cdlName);
+	auto_ptr<CCdlTkInterface> iface(parser.LoadAndParse(true));
+
+	string layoutName = args[3];
+	auto_ptr<TLayParseLayout> layoutParse = TLayParseLayout::Parse(layoutName);
+
+	MakeLayoutConvTest process(*iface, *layoutParse);
+	process.RunProcess();
+
+	return 0;
+	}
+
+void MakeLayoutConvTest::ShowHelp(ostream& stream)
+	{
+	stream << "MakeLayConvTest <cdlName> <layoutName>" << 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 <e32std.h>\n\
+#include <OldLayout.lag>\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";
+	}
+
+