xml/libxml2libs/test/xmlengtester/xmlengtester_target/src/xmlengtesterblocksxpath.cpp
changeset 0 e35f40988205
child 17 ed3155dbd163
child 32 889504eac4fb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xml/libxml2libs/test/xmlengtester/xmlengtester_target/src/xmlengtesterblocksxpath.cpp	Thu Dec 17 09:29:21 2009 +0200
@@ -0,0 +1,1011 @@
+// Copyright (c) 2005-2009 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:
+//
+
+
+// INCLUDE FILES
+#include "TestContentHandler.h"
+#include "XMLOutputContentHandler.h"
+#include "xmlengtester.h"
+
+#include <e32svr.h>
+#include <domain/osextensions/StifParser.h>
+#include <domain/osextensions/Stiftestinterface.h>
+
+#include <XmlEngXPathExtensionFunction.h>
+#include <XmlEngXPathEvaluationContext.h>
+#include <xmlengxpathconfiguration.h>
+#include <XmlEngXPathEvaluator.h>
+#include <XmlEngXPathExpression.h>
+#include <xmlengxpatherrors.h>
+
+#include <Xml\Parser.h>
+#include <Xml\ParserFeature.h>
+
+#include <libc\string.h>
+#include <charconv.h>
+#include <UTF.H>
+#include <xmlengxpathutils.h>
+
+using namespace Xml;
+
+/************************************** XPATH **************************************/
+
+// -----------------------------------------------------------------------------
+// CLibxml2Tester::EvaluateExpressionL
+// test method function.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CLibxml2Tester::EvaluateExpressionL( CStifItemParser& aItem)
+	{
+	RXmlEngNodeList <TXmlEngElement> noLi;
+	iDoc.DocumentElement().GetChildElements(noLi);
+	noLi.Next();
+	iNode = noLi.Next();
+	noLi.Close();
+		
+	TPtrC expr;
+	TBuf8<256> exp;
+	TInt i = 0;
+	while (aItem.GetNextString(expr) == KErrNone)
+		{
+		if (i > 0)
+			exp.Append(_L(" "));
+		exp.Append(expr);
+		i++;
+		}
+	
+    if ( i == 0 )
+        {
+        return KErrGeneral;
+        }
+    
+    while(TRUE)
+    	{
+    	TInt i = exp.Find(_L8("\\"));
+    	if (i == KErrNotFound)
+    		break;
+    	exp.Replace(i,1,_L8("/"));
+    	}    
+    
+    TXmlEngXPathEvaluator eval;
+    iResult = eval.EvaluateL(exp,iNode);
+    
+	return KErrNone;    
+	}
+	
+// -----------------------------------------------------------------------------
+// CLibxml2Tester::ToNumberL
+// test method function.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CLibxml2Tester::ToNumberL( CStifItemParser& /*aItem*/)
+	{
+	
+	TXmlEngXPathEvaluator eval;
+	
+	_LIT8(str1,"number(/test/test1[@attr1='1'])");
+	_LIT8(str2,"/test/test1[@attr1='1']");
+    RXmlEngXPathResult res1 = eval.EvaluateL(str1,iDoc.DocumentElement());
+    RXmlEngXPathResult res2 = eval.EvaluateL(str2,iDoc.DocumentElement());
+    
+    _LIT(KNodeToNumber,"Node to number checking error.");
+    // Jigs - PREQ 2051 - Change
+  	//if(res1.AsNumber() != TXmlEngXPathObject::ToNumberL(res2.AsNodeSet()[0]))
+		if(res1.AsNumber() != XmlEngXPathUtils::ToNumberL(res2.AsNodeSet()[0]))
+		{
+		TestModuleIf().Printf( infoNum++,KTEST_NAME, KNodeToNumber);
+		iLog->Log((TDesC)KNodeToNumber);
+    	return KErrGeneral;
+		}
+    
+    res1.Close();
+    res2.Close();
+    
+    _LIT8(str3,"number(/test/test1)");
+	_LIT8(str4,"/test/test1");
+    res1 = eval.EvaluateL(str3,iDoc.DocumentElement());
+    res2 = eval.EvaluateL(str4,iDoc.DocumentElement());
+    
+    _LIT(KSetToNumber,"NodeSet to number checking error.");
+    // Jigs - PREQ 2051 - Change
+  	if(res1.AsNumber() != XmlEngXPathUtils::ToNumberL(res2.AsNodeSet()))
+		{
+		TestModuleIf().Printf( infoNum++,KTEST_NAME, KSetToNumber);
+		iLog->Log((TDesC)KSetToNumber);
+    	return KErrGeneral;
+		}
+    
+    res1.Close();
+    res2.Close();
+    
+    _LIT8(str5,"number(\"12345.6\")");
+	_LIT8(str6,"12345.6");
+    res1 = eval.EvaluateL(str5,iDoc.DocumentElement());
+ 
+    _LIT(KStringToNumber,"String to number checking error.");
+    // Jigs - PREQ 2051 - Change
+  	if(res1.AsNumber() != XmlEngXPathUtils::ToNumberL(str6))
+		{
+		TestModuleIf().Printf( infoNum++,KTEST_NAME, KStringToNumber);
+		iLog->Log((TDesC)KStringToNumber);
+		return KErrGeneral;
+		}
+		 
+    res1.Close();
+    
+    _LIT(KBoolToNumber,"Boolean to number checking error.");
+    // Jigs - PREQ 2051 - Change
+  	if(!(XmlEngXPathUtils::ToNumberL(TRUE) == 1.0 && XmlEngXPathUtils::ToNumberL(FALSE) == 0.0))
+		{
+		TestModuleIf().Printf( infoNum++,KTEST_NAME, KBoolToNumber);
+		iLog->Log((TDesC)KBoolToNumber);
+		return KErrGeneral;
+		}
+
+	return KErrNone;    
+	}
+	
+// -----------------------------------------------------------------------------
+// CLibxml2Tester::ToBoolL
+// test method function.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CLibxml2Tester::ToBoolL( CStifItemParser& /*aItem*/)
+	{
+	
+	TXmlEngXPathEvaluator eval;
+	
+	_LIT8(str1,"boolean(/test/test1[@attr1='1'])");
+	_LIT8(str2,"/test/test1[@attr1='1']");
+	
+    RXmlEngXPathResult res1 = eval.EvaluateL(str1,iDoc.DocumentElement());
+    RXmlEngXPathResult res2 = eval.EvaluateL(str2,iDoc.DocumentElement());
+    
+    _LIT(KNodeToNumber,"Node to bool checking error.");
+  	//if(!(res1.AsBoolean() && TXmlEngXPathObject::ToBoolean(res2.AsNodeSet()[0])))
+	if(!(res1.AsBoolean() && XmlEngXPathUtils::ToBoolean(res2.AsNodeSet()[0])))
+		{
+		TestModuleIf().Printf( infoNum++,KTEST_NAME, KNodeToNumber);
+		iLog->Log((TDesC)KNodeToNumber);
+    	return KErrGeneral;
+		}
+    
+    res1.Close();
+    res2.Close();
+
+    _LIT8(str3,"boolean(/test/test4)");
+	_LIT8(str4,"/test/test4");
+    res1 = eval.EvaluateL(str3,iDoc.DocumentElement());
+    res2 = eval.EvaluateL(str4,iDoc.DocumentElement());
+    
+    _LIT(KSetToNumber,"NodeSet to bool checking error.");
+  	//if(!(!res1.AsBoolean() && !TXmlEngXPathObject::ToBoolean(res2.AsNodeSet())))
+		if(!(!res1.AsBoolean() && !XmlEngXPathUtils::ToBoolean(res2.AsNodeSet())))
+		{
+		TestModuleIf().Printf( infoNum++,KTEST_NAME, KSetToNumber);
+		iLog->Log((TDesC)KSetToNumber);
+    	return KErrGeneral;
+		}
+    
+    res1.Close();
+    res2.Close();
+    
+    _LIT8(str5,"boolean(12345.6)");
+	res1 = eval.EvaluateL(str5,iDoc.DocumentElement());
+    
+    _LIT(KStringToNumber,"String to number checking error.");
+  	//if(!(res1.AsBoolean() && TXmlEngXPathObject::ToBoolean((TReal)12345.6)))
+		if(!(res1.AsBoolean() && XmlEngXPathUtils::ToBoolean((TReal)12345.6)))
+		{
+		TestModuleIf().Printf( infoNum++,KTEST_NAME, KStringToNumber);
+		iLog->Log((TDesC)KStringToNumber);
+		return KErrGeneral;
+		}
+		 
+    res1.Close();
+    
+    _LIT(KBoolToNumber,"String to boolean checking error.");
+  	//if(TXmlEngXPathObject::ToBoolean(KNullDesC8))
+		if(XmlEngXPathUtils::ToBoolean(KNullDesC8))
+		{
+		TestModuleIf().Printf( infoNum++,KTEST_NAME, KBoolToNumber);
+		iLog->Log((TDesC)KBoolToNumber);
+		return KErrGeneral;
+		}
+
+	return KErrNone;    
+	}
+	
+// -----------------------------------------------------------------------------
+// CLibxml2Tester::ToStringL
+// test method function.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CLibxml2Tester::ToStringL( CStifItemParser& /*aItem*/)
+	{
+	
+	TXmlEngXPathEvaluator eval;
+	
+	_LIT8(str1,"string(/test/test1[@attr1='1'])");
+	_LIT8(str2,"/test/test1[@attr1='1']");
+    RXmlEngXPathResult res1 = eval.EvaluateL(str1,iDoc.DocumentElement());
+    RXmlEngXPathResult res2 = eval.EvaluateL(str2,iDoc.DocumentElement());
+
+    _LIT(KNodeToNumber,"Node to string checking error.");
+  	RBuf8 tmp;
+  	res1.AsStringL( tmp );
+  	CleanupClosePushL( tmp );
+  	RBuf8 tmp2;
+  	//TXmlEngXPathObject::ToStringL(res2.AsNodeSet()[0],tmp2);
+		XmlEngXPathUtils::ToStringL(res2.AsNodeSet()[0],tmp2);
+  	CleanupClosePushL( tmp2 );
+  	
+  	if(tmp.Compare(tmp2))
+		{
+		TestModuleIf().Printf( infoNum++,KTEST_NAME, KNodeToNumber);
+		iLog->Log((TDesC)KNodeToNumber);
+		CleanupStack::PopAndDestroy( &tmp2 );
+		CleanupStack::PopAndDestroy( &tmp );
+    	return KErrGeneral;
+		}
+    
+    tmp.Close();
+    tmp2.Close();
+    res1.Close();
+    res2.Close();
+    
+    _LIT8(str3,"string(/test/test1)");
+	_LIT8(str4,"/test/test1");
+    res1 = eval.EvaluateL(str3,iDoc.DocumentElement());
+    res2 = eval.EvaluateL(str4,iDoc.DocumentElement());
+    
+    _LIT(KSetToNumber,"NodeSet to string checking error.");
+  	res1.AsStringL(tmp);
+  	//TXmlEngXPathObject::ToStringL(res2.AsNodeSet(),tmp2);
+		XmlEngXPathUtils::ToStringL(res2.AsNodeSet(),tmp2);
+  	
+  	if(tmp.Compare(tmp2))
+		{
+		TestModuleIf().Printf( infoNum++,KTEST_NAME, KSetToNumber);
+		iLog->Log((TDesC)KSetToNumber);
+		CleanupStack::PopAndDestroy( &tmp2 );
+		CleanupStack::PopAndDestroy( &tmp );
+    	return KErrGeneral;
+		}
+    
+    tmp.Close();
+    tmp2.Close();
+    res1.Close();
+    res2.Close();
+    
+    _LIT8(str5,"string(12345.6)");
+	res1 = eval.EvaluateL(str5,iDoc.DocumentElement());
+    
+    _LIT(KStringToNumber,"Number to string checking error.");
+  	res1.AsStringL(tmp);
+  	//TXmlEngXPathObject::ToStringL((TReal)12345.6,tmp2);
+		XmlEngXPathUtils::ToStringL((TReal)12345.6,tmp2);
+  	
+  	if(tmp.Compare(tmp2))
+		{
+		TestModuleIf().Printf( infoNum++,KTEST_NAME, KStringToNumber);
+		iLog->Log((TDesC)KStringToNumber);
+		CleanupStack::PopAndDestroy( &tmp2 );
+		CleanupStack::PopAndDestroy( &tmp );
+		return KErrGeneral;
+		}
+	res1.Close();
+	tmp2.Close();
+	CleanupStack::PopAndDestroy( &tmp2 );
+	tmp.Close();
+    
+    //TXmlEngXPathObject::ToStringL(TRUE,tmp);
+		XmlEngXPathUtils::ToStringL(TRUE,tmp);
+    _LIT(KBoolToNumber,"Boolean checking error.");
+  	if(tmp.Compare(_L8("true")))
+		{
+		CleanupStack::PopAndDestroy( &tmp );
+		TestModuleIf().Printf( infoNum++,KTEST_NAME, KBoolToNumber);
+		iLog->Log((TDesC)KBoolToNumber);
+		return KErrGeneral;
+		}
+    
+    CleanupStack::PopAndDestroy(&tmp);
+	return KErrNone;    
+	}
+	
+// -----------------------------------------------------------------------------
+// CLibxml2Tester::SaveResultL
+// test method function.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CLibxml2Tester::SaveResultL( CStifItemParser& aItem)
+	{
+	_LIT(KOutputFileErrorName,"No output file name.");
+	_LIT(KOutputFileError,"Output file error: %d.");
+	_LIT8(KBoolean,"XPathResult: %b.");
+	_LIT8(KNumber,"XPathResult: %f.");
+	_LIT8(KString,"XPathResult: %S.");
+	_LIT8(KNode,"XPathResult:\r\n");
+	    
+    TPtrC OutputFile;
+    if ( aItem.GetNextString(OutputFile) != KErrNone )
+        {
+        TestModuleIf().Printf( infoNum++,KTEST_NAME,KOutputFileErrorName);
+     	iLog->Log((TDesC)KOutputFileErrorName);
+        return KErrGeneral;
+        }
+    RFs fs;
+	User::LeaveIfError(fs.Connect());
+	CleanupClosePushL(fs);
+	
+	RFile outputFile;
+	TFileName outFileName;
+	outFileName.Copy(OutputFile);
+	
+	// Open output file
+	TInt err = outputFile.Replace(fs,outFileName,EFileShareAny|EFileWrite);
+	
+	// If output file is correct
+	if (err == KErrNone)
+    {
+    	TBuf8<256> info;
+		TBuf8<256> info2;
+    	if(iResult.Type() == RXmlEngXPathResult::EBoolean)
+    		{
+    		info.Format(KBoolean,iResult.AsBoolean());
+			outputFile.Write(info);
+    		}
+    	else if(iResult.Type() == RXmlEngXPathResult::ENumber)
+    		{
+    		info.Format(KNumber,iResult.AsNumber());
+			outputFile.Write(info);
+    		} 
+    	else if(iResult.Type() == RXmlEngXPathResult::EString)
+    		{
+    		RBuf8 str;
+			iResult.AsStringL(str);
+			info2.Copy(str);
+			info.Format(KString,&info2);
+			outputFile.Write(info);
+			str.Close();
+			}
+		else
+			{
+			RXmlEngNodeSet nodeSet = iResult.AsNodeSet();
+			outputFile.Write(KNode);
+			for(int i=0; i<nodeSet.Length();i++)
+				{
+				TXmlEngNode node = nodeSet[i];
+				SaveNode(outputFile,node);
+				}
+			}
+    	outputFile.Close();
+	}
+	else
+	{
+		TestModuleIf().Printf( infoNum++,KTEST_NAME, KOutputFileError, err);
+		iLog->Log(KOutputFileError, err);
+		return err;	
+	}
+
+	iResult.Close();
+	CleanupStack::PopAndDestroy(&fs);
+	return KErrNone;    
+	}
+
+TInt CLibxml2Tester::InstanceL( CStifItemParser& /*aItem*/)
+	{
+    _LIT(KTestFail,"Test failed: %d.");
+    
+    _LIT8(KInstA, "<data>A<test>5</test><test att=\"10\">6</test></data>");
+    _LIT8(KInstB, "<data>B<test attr='345'>TestText</test><test/></data>");
+    _LIT8(KInstC, "<data>C<test3>345</test3></data>");
+    _LIT8(KDataContext, "<doc>D<test>10</test><test2/></doc>");
+    
+    RXmlEngDocument instA = parser.ParseL(TPtrC8(KInstA)); 
+    RXmlEngDocument instB = parser.ParseL(TPtrC8(KInstB)); 
+    RXmlEngDocument instC = parser.ParseL(TPtrC8(KInstC)); 
+    RXmlEngDocument contextDoc = parser.ParseL(TPtrC8(KDataContext)); 
+
+    // register instance doc trees
+    CXmlEngXFormsInstanceMap* map = CXmlEngXFormsInstanceMap::NewLC();
+    map->AddEntryL(instA, _L8("A"));
+    map->AddEntryL(instB, _L8("B"));
+    map->AddEntryL(instC, _L8("C"));
+
+    // TC1
+    TXmlEngXPathEvaluator eval;
+    eval.SetInstanceMap(map);
+    RXmlEngXPathResult result = eval.EvaluateL(_L8("instance('A')"), contextDoc, NULL);
+	
+    if(result.Type() != RXmlEngXPathResult::ENodeset)
+        {
+        TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 1);
+		iLog->Log(KTestFail, 1);
+		return KErrGeneral;
+        }        
+	RXmlEngNodeSet set = result.AsNodeSet();
+    if(set.Length() != 1)
+        {
+        TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 1);
+		iLog->Log(KTestFail, 1);
+		return KErrGeneral;
+        } 
+    TXmlEngNode node = set[0];
+    if(node.NodeType() != TXmlEngNode::EElement)
+        {
+        TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 1);
+		iLog->Log(KTestFail, 1);
+		return KErrGeneral;
+        } 
+    TPtrC8 name = node.Name();
+    if(name.Compare(_L8("data")))
+        {
+        TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 1);
+		iLog->Log(KTestFail, 1);
+		return KErrGeneral;
+        } 
+    RBuf8 content;
+    node.WholeTextContentsCopyL(content);
+    if( content.Compare(_L8("A56")) )
+        {
+        TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 1);
+		iLog->Log(KTestFail, 1);
+		return KErrGeneral;
+        } 
+    if(!node.IsSameNode(instA.DocumentElement()))
+        {
+        TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 1);
+		iLog->Log(KTestFail, 1);
+		return KErrGeneral;
+        } 
+    content.Close();
+	result.Free();
+
+    // TC2
+    result = eval.EvaluateL(_L8("/doc/test + instance('A')/test[position()=2]/@att + instance('C')/test3"), contextDoc, NULL);
+    if(result.Type() != RXmlEngXPathResult::ENumber)
+        {
+        TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 2);
+		iLog->Log(KTestFail, 2);
+		return KErrGeneral;
+        } 
+    TReal value = result.AsNumber();
+    if(value != 365)
+        {
+        TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 2);
+		iLog->Log(KTestFail, 2);
+		return KErrGeneral;
+        } 
+    result.Free();
+
+    // TC3
+    RXmlEngNodeSet dependents;
+    dependents.InitializeL();
+    RXmlEngXPathExpression expr = eval.CreateExpressionL( _L8("/doc/test + instance('A')/test[position()=2]/@att + instance('C')/test3"), NULL);
+    result = expr.EvaluateWithDependenciesL(contextDoc, dependents);
+    if(result.Type() != RXmlEngXPathResult::ENumber)
+        {
+        TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 3);
+		iLog->Log(KTestFail, 3);
+		return KErrGeneral;
+        } 
+    value = result.AsNumber();
+    if(value != 365)
+        {
+        TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 3);
+		iLog->Log(KTestFail, 3);
+		return KErrGeneral;
+        } 
+    
+    if(dependents.Length() != 3)
+        {
+        TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 3);
+		iLog->Log(KTestFail, 3);
+		return KErrGeneral;
+        } 
+    
+    for(int i = 0; i < 3; i++) {
+        node = dependents[i];
+        TPtrC8 name1 = node.Name();
+        RBuf8 content1;
+        node.WholeTextContentsCopyL( content1 );
+        
+        if ((!name1.Compare(_L8("test")) && !content1.Compare(_L8("10"))) &&
+                (!name1.Compare(_L8("test3")) && !content1.Compare(_L8("345"))) &&
+                (!name1.Compare(_L8("att")) && !content1.Compare(_L8("10"))))
+            {
+            TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 3);
+	    	iLog->Log(KTestFail, 3);
+	    	content1.Close();
+		    return KErrGeneral;    
+            }
+        
+        content1.Close();
+    }
+    result.Free();
+    expr.Destroy();
+    dependents.Free();
+
+    // TC4
+    dependents.InitializeL();
+    expr = eval.CreateExpressionL(_L8("instance('B')/test[@attr=instance('C')/test3]") , NULL);
+    result = expr.EvaluateWithDependenciesL(contextDoc, dependents);
+    RBuf8 strValue;
+    result.AsStringL( strValue );
+    if(strValue.Compare(_L8("TestText")))
+        {
+        TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 4);
+		iLog->Log(KTestFail, 4);
+		strValue.Close();
+		return KErrGeneral;
+        }
+        
+    strValue.Close();
+
+    if(dependents.Length() != 3)
+        {
+        TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 4);
+		iLog->Log(KTestFail, 4);
+		return KErrGeneral;
+        }
+        
+    TInt match = 0;
+    
+    for(int i = 0; i < 3; i++) {
+        node = dependents[i];
+        TPtrC8 name2 = node.Name();
+        RBuf8 content2;
+        node.WholeTextContentsCopyL( content2 );
+        
+            if (!name2.Compare(_L8("test")) && !content2.Compare(_L8("TestText"))) {
+                match++;
+            } else if (!name2.Compare(_L8("test3")) && !content2.Compare(_L8("345"))) {
+                match++;
+            } else if (!name2.Compare(_L8("attr")) && !content2.Compare(_L8("345"))) {
+                match++;
+            }
+        content2.Close();
+    }
+    if (match != 3)
+        {
+        TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 4);
+	    iLog->Log(KTestFail, 4);
+	    return KErrGeneral;
+        }
+        
+    dependents.Free();
+    expr.Destroy();
+    result.Free();
+
+    // TC5
+    map->RemoveEntryL(_L8("A"));
+    eval.SetInstanceMap(map);
+    result = eval.EvaluateL(_L8("instance('A')"), contextDoc, NULL);
+    if(result.Type() != RXmlEngXPathResult::ENodeset)
+        {
+        TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 5);
+		iLog->Log(KTestFail, 5);
+		return KErrGeneral;
+        }        
+	set = result.AsNodeSet();
+    if(set.Length() != 0)
+        {
+        TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 5);
+		iLog->Log(KTestFail, 5);
+		return KErrGeneral;
+        } 
+
+    // TC6
+    if(map != eval.InstanceMap())
+        {
+        TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 6);
+		iLog->Log(KTestFail, 6);
+		return KErrGeneral;
+        } 
+        
+    // TC7
+    dependents.InitializeL();
+    expr = eval.CreateExpressionL( _L8("instance('B')/test[@attr='x']") , NULL);
+    result = expr.EvaluateWithDependenciesL(contextDoc, dependents);
+    if(result.Type() != RXmlEngXPathResult::ENodeset)
+        {
+        TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 7);
+		iLog->Log(KTestFail, 7);
+		return KErrGeneral;
+        }        
+	set = result.AsNodeSet();
+    if(set.Length() != 0)
+        {
+        TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 7);
+		iLog->Log(KTestFail, 7);
+		return KErrGeneral;
+        } 
+    if(dependents.Length() != 1)
+        {
+        TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 7);
+		iLog->Log(KTestFail, 7);
+		return KErrGeneral;
+        }
+
+    for(int i = 0; i < 1; i++) {
+        node = dependents[i];
+        TPtrC8 name3 = node.Name();
+        RBuf8 content3;
+        node.WholeTextContentsCopyL( content3 );
+        
+        if (!(!name3.Compare(_L8("attr")) && !content3.Compare(_L8("345"))))
+            {
+            TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 7);
+	    	iLog->Log(KTestFail, 7);
+	    	content3.Close();
+		    return KErrGeneral;    
+            }
+        content3.Close();
+    }
+    dependents.Free();
+    expr.Destroy();
+    result.Free();
+
+    // cleanup 
+    instA.Close();   
+    instB.Close();   
+    instC.Close();   
+    contextDoc.Close(); 
+    CleanupStack::PopAndDestroy(); // map
+
+	return KErrNone;    
+	}
+
+class XPathDate: public MXmlEngXPathExtensionFunction
+    {
+public:
+    TInt MinArity(){return 1;}
+    TXmlEngEvaluationStatus Evaluate(MXmlEngXPathEvaluationContext* aEvalCtxt)
+        {
+        if (aEvalCtxt->Argument(0).Type() == RXmlEngXPathResult::ENodeset)
+            aEvalCtxt->SetResultL( _L8("Nodeset") );
+        if (aEvalCtxt->Argument(0).Type() == RXmlEngXPathResult::ENumber)
+            aEvalCtxt->SetResultL( _L8("Number") );
+        if (aEvalCtxt->Argument(0).Type() == RXmlEngXPathResult::EString)
+            aEvalCtxt->SetResultL( _L8("String") );
+        if (aEvalCtxt->Argument(0).Type() == RXmlEngXPathResult::EBoolean)
+            return EError;
+        return ESucceeded;
+        }
+    };
+    
+class XPathDate2: public MXmlEngXPathExtensionFunction
+    {
+public:
+    TInt MinArity(){return 1;}
+    TXmlEngEvaluationStatus Evaluate(MXmlEngXPathEvaluationContext* aEvalCtxt)
+        {
+        if (aEvalCtxt->Argument(0).Type() == RXmlEngXPathResult::ENodeset)
+            {
+            aEvalCtxt->InitializeNodeSetResult();
+            aEvalCtxt->AppendToResult(aEvalCtxt->Argument(0).AsNodeSet());
+            if(aEvalCtxt->Result().Type() != RXmlEngXPathResult::ENodeset)
+                return EError;
+            }
+            
+        if (aEvalCtxt->Argument(0).Type() == RXmlEngXPathResult::ENumber)
+            aEvalCtxt->SetResult(aEvalCtxt->Argument(0).AsNumber());
+        if (aEvalCtxt->Argument(0).Type() == RXmlEngXPathResult::EString)
+            aEvalCtxt->SetResultL( _L8("String") );
+        if (aEvalCtxt->Argument(0).Type() == RXmlEngXPathResult::EBoolean)
+            aEvalCtxt->SetResult(ETrue);
+        return ESucceeded;
+        }
+    };
+
+class XPathDate3: public MXmlEngXPathExtensionFunction
+    {
+public:
+    TInt MinArity(){return 2;}
+    TXmlEngEvaluationStatus Evaluate(MXmlEngXPathEvaluationContext* aEvalCtxt)
+        {
+        if(aEvalCtxt->ArgCount() != 2)
+            {
+            return EInvalidArgumentNumber;
+            }
+        aEvalCtxt->SetResult(aEvalCtxt->Argument(0).AsNumber() + aEvalCtxt->Argument(1).AsNodeSet().Length());
+        return ESucceeded;
+        }
+    };
+
+// -----------------------------------------------------------------------------
+// CLibxml2Tester::ExtensionFunctionL
+// test method function.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CLibxml2Tester::ExtensionFunctionL( CStifItemParser& /*aItem*/)
+	{
+	XPathDate myDate;
+
+	_LIT8(KDataContext, "<doc><test>10</test><test/><test/><test2>data</test2></doc>");
+	_LIT(KTestFail,"Test failed: %d.");
+	
+	XPathDate myFunct;
+	//TXmlEngExtensionFunctionDescriptor tExt = {&myFunct,"MyFunction"};
+	TXmlEngExtensionFunctionDescriptor tExt;
+	tExt.iFunc = &myFunct;
+	tExt.iName = "MyFunction";
+		// jigs
+    XmlEngXPathConfiguration::AddExtensionFunctionL(tExt);
+    // jigs
+    if(!XmlEngXPathConfiguration::IsFunctionSupportedL(_L8("MyFunction"),KNullDesC8))
+        {
+        TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 5);
+		iLog->Log(KTestFail, 5);
+		return KErrGeneral;
+        }
+	
+	RXmlEngDocument contextDoc = parser.ParseL(TPtrC8(KDataContext)); 
+	
+	TXmlEngXPathEvaluator eval;
+    RXmlEngXPathResult result = eval.EvaluateL( _L8("MyFunction(/doc/test)"), contextDoc, NULL);
+	
+    if(result.Type() != RXmlEngXPathResult::EString)
+        {
+        TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 1);
+		iLog->Log(KTestFail, 1);
+		return KErrGeneral;
+        }
+    
+    RBuf8 str;
+    result.AsStringL( str );
+    _LIT8(str2,"Nodeset");
+    _LIT8(str3,"String");
+    _LIT8(str4,"Number");
+    if(str.Compare(str2))
+        {
+        TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 1);
+		iLog->Log(KTestFail, 1);
+		str.Close();
+		return KErrGeneral;
+        }
+    str.Close();
+    result.Free();
+    
+	result = eval.EvaluateL( _L8("MyFunction(10)"), contextDoc, NULL);
+	if(result.Type() != RXmlEngXPathResult::EString)
+        {
+        TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 2);
+		iLog->Log(KTestFail, 2);
+		return KErrGeneral;
+        }
+	result.AsStringL(str);
+	if(str.Compare(str4))
+        {
+        TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 2);
+		iLog->Log(KTestFail, 2);
+		str.Close();
+		return KErrGeneral;
+        }
+    str.Close();
+    result.Free();
+    
+	result = eval.EvaluateL(_L8("MyFunction(\"data\")"), contextDoc, NULL);
+	if(result.Type() != RXmlEngXPathResult::EString)
+        {
+        TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 3);
+		iLog->Log(KTestFail, 3);
+		return KErrGeneral;
+        }
+	result.AsStringL(str);
+	if(str.Compare(str3))
+        {
+        TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 3);
+		iLog->Log(KTestFail, 3);
+		str.Close();
+		return KErrGeneral;
+        }
+    str.Close();
+    result.Free();
+    
+    TRAPD(err,result = eval.EvaluateL(_L8("MyFunction(boolean(10))"), contextDoc, NULL);)
+    if(err != KXmlEngErrXPathResult)
+        {
+        TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 4);
+		iLog->Log(KTestFail, 4);
+		return KErrGeneral;
+        }
+        // jigs
+    if(!XmlEngXPathConfiguration::IsFunctionSupportedL(_L8("MyFunction"),KNullDesC8))
+        {
+        TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 5);
+		iLog->Log(KTestFail, 5);
+		return KErrGeneral;
+        }
+        // jigs
+    XmlEngXPathConfiguration::RemoveExtensionFunction(tExt);
+    	// jigs
+    if(XmlEngXPathConfiguration::IsFunctionSupportedL(_L8("MyFunction"),KNullDesC8))
+        {
+        TestModuleIf().Printf(infoNum++,KTEST_NAME, KTestFail, 6);
+		iLog->Log(KTestFail, 6);
+		return KErrGeneral;
+        }
+
+    contextDoc.Close();
+	return KErrNone;    
+	}
+	
+// -----------------------------------------------------------------------------
+// CLibxml2Tester::ExtensionVectorL
+// test method function.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CLibxml2Tester::ExtensionVectorL( CStifItemParser& /*aItem*/)
+	{
+	XPathDate myDate;
+	XPathDate2 myDate2;
+	XPathDate3 myDate3;
+	
+	TXmlEngExtensionFunctionDescriptor extFunc;
+	extFunc.iFunc = &myDate;
+	extFunc.iName = "MyDate";
+	
+	TXmlEngExtensionFunctionDescriptor extFunc2;
+	extFunc2.iFunc = &myDate2;
+	extFunc2.iName = "MyDate2";
+	
+	TXmlEngExtensionFunctionDescriptor extFunc3;
+	extFunc3.iFunc = &myDate3;
+	extFunc3.iName = "MyDate3";
+	
+	RArray<TXmlEngExtensionFunctionDescriptor> extVect;
+	extVect.Append(extFunc);
+    extVect.Append(extFunc2);
+    extVect.Append(extFunc3);
+
+
+	_LIT8(KDataContext, "<doc><test>10</test><test/><test/><test2>data</test2></doc>");
+	_LIT(KTestFail,"Test failed: %d.");
+	
+	XPathDate myFunct;
+    //TXmlEngXPathConfiguration::AddExtensionFunctionVectorL(extVect,extVect.Count());
+    XmlEngXPathConfiguration::AddExtensionFunctionVectorL(extVect,extVect.Count());
+    
+    if(!XmlEngXPathConfiguration::IsFunctionSupportedL(_L8("MyDate"),KNullDesC8))
+        {
+        TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 6);
+		iLog->Log(KTestFail, 6);
+		return KErrGeneral;
+        }
+	
+	RXmlEngDocument contextDoc = parser.ParseL(TPtrC8(KDataContext)); 
+	
+	TXmlEngXPathEvaluator eval;
+    RXmlEngXPathResult result = eval.EvaluateL(_L8("MyDate2(/doc/test)"), contextDoc, NULL);
+	
+    if(result.Type() != RXmlEngXPathResult::ENodeset)
+        {
+        TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 1);
+		iLog->Log(KTestFail, 1);
+		return KErrGeneral;
+        }
+    
+    RXmlEngNodeSet set = result.AsNodeSet();
+    if(set.Length() != 3)
+        {
+        TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 1);
+		iLog->Log(KTestFail, 1);
+		return KErrGeneral;
+        }
+    result.Free();
+    
+	result = eval.EvaluateL(_L8("MyDate2(10)"), contextDoc, NULL);
+	if(result.Type() != RXmlEngXPathResult::ENumber)
+        {
+        TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 2);
+		iLog->Log(KTestFail, 2);
+		return KErrGeneral;
+        }
+	if(result.AsNumber() != 10)
+        {
+        TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 2);
+		iLog->Log(KTestFail, 2);
+		return KErrGeneral;
+        }
+    result.Free();
+    
+	result = eval.EvaluateL(_L8("MyDate2(\"data\")"), contextDoc, NULL);
+	if(result.Type() != RXmlEngXPathResult::EString)
+        {
+        TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 3);
+		iLog->Log(KTestFail, 3);
+		return KErrGeneral;
+        }
+	RBuf8 str;
+	result.AsStringL(str);
+	_LIT8(str3,"String");
+	if(str.Compare(str3))
+        {
+        TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 3);
+		iLog->Log(KTestFail, 3);
+		str.Close();
+		return KErrGeneral;
+        }
+    str.Close();
+    result.Free();
+    
+    result = eval.EvaluateL(_L8("MyDate2(boolean(10))"), contextDoc, NULL);
+	if(result.Type() != RXmlEngXPathResult::EBoolean)
+        {
+        TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 4);
+		iLog->Log(KTestFail, 4);
+		return KErrGeneral;
+        }
+	if(!result.AsBoolean())
+        {
+        TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 4);
+		iLog->Log(KTestFail, 4);
+		return KErrGeneral;
+        }
+    result.Free();
+    
+    result = eval.EvaluateL(_L8("MyDate3(3,/doc/test)"), contextDoc, NULL);
+	if(result.Type() != RXmlEngXPathResult::ENumber)
+        {
+        TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 5);
+		iLog->Log(KTestFail, 5);
+		return KErrGeneral;
+        }
+	if(result.AsNumber() != 6)
+        {
+        TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 5);
+		iLog->Log(KTestFail, 5);
+		return KErrGeneral;
+        }
+    result.Free();
+    // jigs
+    if(!XmlEngXPathConfiguration::IsFunctionSupportedL(_L8("MyDate"),KNullDesC8))
+        {
+        TestModuleIf().Printf( infoNum++,KTEST_NAME, KTestFail, 6);
+		iLog->Log(KTestFail, 6);
+		return KErrGeneral;
+        }
+    // jigs    
+    XmlEngXPathConfiguration::RemoveExtensionFunctionVector(extVect,extVect.Count());
+		// jigs
+    if(XmlEngXPathConfiguration::IsFunctionSupportedL(_L8("MyDate2"),KNullDesC8))
+        {
+        TestModuleIf().Printf(infoNum++,KTEST_NAME, KTestFail, 7);
+		iLog->Log(KTestFail, 7);
+		return KErrGeneral;
+        }
+        // jigs
+    if(XmlEngXPathConfiguration::IsFunctionSupportedL(_L8("MyDate"),KNullDesC8))
+        {
+        TestModuleIf().Printf(infoNum++,KTEST_NAME, KTestFail, 7);
+		iLog->Log(KTestFail, 7);
+		return KErrGeneral;
+        }
+
+    contextDoc.Close();
+    extVect.Close();
+	return KErrNone;    
+	}
+