Files
mars-flaim/xflaim/util/xpathtest1srv.cpp
ahodgkinson 12a621dc04 Changed license to LGPL.
git-svn-id: https://svn.code.sf.net/p/flaim/code/trunk@1010 0109f412-320b-0410-ab79-c3e0c5ffbbe6
2007-01-23 11:22:22 +00:00

702 lines
17 KiB
C++

//------------------------------------------------------------------------------
// Desc: XPATH unit test 1
// Tabs: 3
//
// Copyright (c) 2003-2007 Novell, Inc. All Rights Reserved.
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; version 2.1
// of the License.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Library Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, contact Novell, Inc.
//
// To contact Novell about this file by physical or electronic mail,
// you may find current contact information at www.novell.com.
//
// $Id$
//------------------------------------------------------------------------------
#include "flmunittest.h"
#if defined(NLM)
#define DB_NAME_STR "SYS:\\TST.DB"
#else
#define DB_NAME_STR "tst.db"
#endif
#define CD_NUM 1
#define TITLE_NUM 2
#define ARTIST_NUM 3
#define LOCATION_NUM 4
#define COMPANY_NUM 5
#define PRICE_NUM 6
#define YEAR_NUM 7
#define CATALOG_NUM 8
#define COUNTRY_NUM 9
#define CITY_NUM 10
/****************************************************************************
Desc:
****************************************************************************/
class IXPathTest1Impl : public TestBase
{
public:
const char * getName( void);
RCODE execute( void);
};
/****************************************************************************
Desc:
****************************************************************************/
RCODE getTest(
IFlmTest ** ppTest)
{
RCODE rc = NE_XFLM_OK;
if( (*ppTest = f_new IXPathTest1Impl) == NULL)
{
rc = NE_XFLM_MEM;
goto Exit;
}
Exit:
return( rc);
}
/****************************************************************************
Desc:
****************************************************************************/
const char * IXPathTest1Impl::getName( void)
{
return( "XPath Test 1");
}
/****************************************************************************
Desc:
****************************************************************************/
RCODE IXPathTest1Impl::execute( void)
{
RCODE rc = NE_XFLM_OK;
FlagSet flagSet;
FLMBOOL bTransStarted = FALSE;
FLMBOOL bDibCreated = FALSE;
IF_PosIStream * pPosIStream = NULL;
IF_Query * pQuery = NULL;
FLMUINT uiDictNum = 0;
IF_DOMNode * pReturn = NULL;
char szBuffer[ 128];
const char * ppszQueryFourResults[] =
{"Hide your heart", "Still got the blues",
"One night only", "Sylvias Mother", "Maggie May"};
const char * ppszQueryFiveResults[] =
{"Empire Burlesque", "Greatest Hits",
"Unchain my heart"};
const char * ppszQuerySixResults[] =
{"Gary Moore", "Rod Stewart"};
const char * ppszQuerySevenResults[] =
{"Bob Dylan", "Bonnie Tyler", "Dolly Parton",
"Eros Ramazzotti", "Bee Gees", "Dr.Hook",
"Andrea Bocelli", "Joe Cocker"};
const char * ppszQueryEightResults[] =
{"CBS Records", "RCA", "Virgin records",
"BMG", "CBS", "Pickwick", "EMI"};
const char * ppszQueryNineResults[] =
{"Still got the blues", "Eros", "One night only",
"Maggie May", "Romanza"};
const char * pszDoc1 =
"<catalog>"
"<cd>"
"<title>Empire Burlesque</title> "
"<artist>Bob Dylan</artist> "
"<location country=\"USA\" city=\"Las Angeles\"/> "
"<company>Columbia</company> "
"<price>1090</price> "
"<year>1985</year> "
"</cd>"
"<cd>"
"<title>Hide your heart</title> "
"<artist>Bonnie Tyler</artist>"
"<location country=\"UK\" city=\"Liverpool\"/> "
"<company>CBS Records</company> "
"<price>990</price> "
"<year>1988</year> "
"</cd>"
"<cd>"
"<title>Greatest Hits</title> "
"<artist>Dolly Parton</artist>"
"<location country=\"USA\" city=\"Hicksville\"/>"
"<company>RCA</company> "
"<price>990</price> "
"<year>1982</year> "
"</cd>"
"<cd>"
"<title>Still got the blues</title> "
"<artist>Gary Moore</artist> "
"<location country=\"UK\" city=\"London\"/> "
"<company>Virgin records</company> "
"<price>1020</price> "
"<year>1990</year> "
"</cd>"
"<cd>"
"<title>Eros</title> "
"<artist>Eros Ramazzotti</artist>"
"<location country=\"EU\" city=\"Europa\"/> "
"<company>BMG</company>"
"<price>990</price> "
"<year>1997</year>"
"</cd>"
"<cd>"
"<title>One night only</title>"
"<artist>Bee Gees</artist>"
"<location country=\"UK\" city=\"Birmingham\"/> "
"<company>Polydor</company>"
"<price>1090</price>"
"<year>1998</year>"
"</cd>"
"<cd>"
"<title>Sylvias Mother</title>"
"<artist>Dr.Hook</artist>"
"<location country=\"UK\" city=\"York\"/> "
"<company>CBS</company>"
"<price>810</price>"
"<year>1973</year>"
"</cd>"
"<cd>"
"<title>Maggie May</title>"
"<artist>Rod Stewart</artist>"
"<location country=\"UK\" city=\"London\"/> "
"<company>Pickwick</company>"
"<price>850</price>"
"<year>1990</year>"
"</cd>"
"<cd>"
"<title>Romanza</title>"
"<artist>Andrea Bocelli</artist>"
"<location country=\"EU\" city=\"Europa\"/> "
"<company>Polydor</company>"
"<price>1080</price>"
"<year>1996</year>"
"</cd>"
"<cd>"
"<title>Unchain my heart</title>"
"<artist>Joe Cocker</artist>"
"<location country=\"USA\" city=\"Seattle\"/> "
"<company>EMI</company>"
"<price>820</price>"
"<year>1987</year>"
"</cd>"
"</catalog>";
beginTest(
"Database Setup",
"Prep the database for the query tests",
"1) get the class factory for the dbSystem "
"2) Create the database 3) Setup element and attribute definitions "
"4) Import a document 5) get a IF_Query object",
"No Additional Details.");
if( RC_BAD( rc = initCleanTestState( DB_NAME_STR)))
{
MAKE_FLM_ERROR_STRING( "Failed to init test state.", m_szDetails, rc);
goto Exit;
}
bDibCreated = TRUE;
if( RC_BAD( rc = m_pDb->transBegin( XFLM_UPDATE_TRANS)))
{
MAKE_FLM_ERROR_STRING( "transBegin failed", m_szDetails, rc);
goto Exit;
}
bTransStarted = TRUE;
// Create element defs for easy lookups
uiDictNum = CD_NUM;
if( RC_BAD( rc = m_pDb->createElementDef(NULL, "cd", XFLM_NODATA_TYPE,
&uiDictNum, NULL)))
{
MAKE_FLM_ERROR_STRING( "Failed to create elementDef.", m_szDetails, rc);
goto Exit;
}
if( uiDictNum != CD_NUM)
{
MAKE_FLM_ERROR_STRING( "Dict num already in use.", m_szDetails, rc);
goto Exit;
}
uiDictNum = TITLE_NUM;
if( RC_BAD( rc = m_pDb->createElementDef(NULL, "title",
XFLM_TEXT_TYPE, &uiDictNum, NULL)))
{
MAKE_FLM_ERROR_STRING( "Failed to create elementDef.", m_szDetails, rc);
goto Exit;
}
if( uiDictNum != TITLE_NUM)
{
MAKE_FLM_ERROR_STRING( "Dict num already in use.", m_szDetails, rc);
goto Exit;
}
uiDictNum = ARTIST_NUM;
if( RC_BAD( rc = m_pDb->createElementDef(NULL, "artist",
XFLM_TEXT_TYPE, &uiDictNum, NULL)))
{
MAKE_FLM_ERROR_STRING( "Failed to create elementDef.", m_szDetails, rc);
goto Exit;
}
if( uiDictNum != ARTIST_NUM)
{
MAKE_FLM_ERROR_STRING( "Dict num already in use.", m_szDetails, rc);
goto Exit;
}
uiDictNum = LOCATION_NUM;
if( RC_BAD( rc = m_pDb->createElementDef(NULL, "location",
XFLM_TEXT_TYPE, &uiDictNum, NULL)))
{
MAKE_FLM_ERROR_STRING( "Failed to create elementDef.", m_szDetails, rc);
goto Exit;
}
if( uiDictNum != LOCATION_NUM)
{
MAKE_FLM_ERROR_STRING( "Dict num already in use.", m_szDetails, rc);
goto Exit;
}
uiDictNum = COMPANY_NUM;
if( RC_BAD( rc = m_pDb->createElementDef(NULL, "company", XFLM_TEXT_TYPE,
&uiDictNum, NULL)))
{
MAKE_FLM_ERROR_STRING( "Failed to create elementDef.", m_szDetails, rc);
goto Exit;
}
if( uiDictNum != COMPANY_NUM)
{
MAKE_FLM_ERROR_STRING( "Dict num already in use.", m_szDetails, rc);
goto Exit;
}
uiDictNum = PRICE_NUM;
if( RC_BAD( rc = m_pDb->createElementDef(NULL, "price", XFLM_NUMBER_TYPE,
&uiDictNum, NULL)))
{
MAKE_FLM_ERROR_STRING( "Failed to create elementDef.", m_szDetails, rc);
goto Exit;
}
if( uiDictNum != PRICE_NUM)
{
MAKE_FLM_ERROR_STRING( "Dict num already in use.", m_szDetails, rc);
goto Exit;
}
uiDictNum = YEAR_NUM;
if( RC_BAD( rc = m_pDb->createElementDef(NULL, "year", XFLM_NUMBER_TYPE,
&uiDictNum, NULL)))
{
MAKE_FLM_ERROR_STRING( "Failed to create elementDef.", m_szDetails, rc);
goto Exit;
}
if( uiDictNum != YEAR_NUM)
{
MAKE_FLM_ERROR_STRING( "Dict num already in use.", m_szDetails, rc);
goto Exit;
}
uiDictNum = CATALOG_NUM;
if( RC_BAD( rc = m_pDb->createElementDef(NULL, "catalog", XFLM_NODATA_TYPE,
&uiDictNum, NULL)))
{
MAKE_FLM_ERROR_STRING( "Failed to create elementDef.", m_szDetails, rc);
goto Exit;
}
if( uiDictNum != CATALOG_NUM)
{
MAKE_FLM_ERROR_STRING( "Dict num already in use.", m_szDetails, rc);
goto Exit;
}
uiDictNum = COUNTRY_NUM;
if( RC_BAD( rc = m_pDb->createAttributeDef(NULL, "country", XFLM_TEXT_TYPE,
&uiDictNum, NULL)))
{
MAKE_FLM_ERROR_STRING( "Failed to create attribute Def.", m_szDetails, rc);
goto Exit;
}
if( uiDictNum != COUNTRY_NUM)
{
MAKE_FLM_ERROR_STRING( "Dict num already in use.", m_szDetails, rc);
goto Exit;
}
uiDictNum = CITY_NUM;
if( RC_BAD( rc = m_pDb->createAttributeDef(NULL, "city", XFLM_TEXT_TYPE,
&uiDictNum, NULL)))
{
MAKE_FLM_ERROR_STRING( "Failed to create attribute Def.", m_szDetails, rc);
goto Exit;
}
if( uiDictNum != CITY_NUM)
{
MAKE_FLM_ERROR_STRING( "Dict num already in use.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = m_pDbSystem->createIFQuery( &pQuery)))
{
MAKE_FLM_ERROR_STRING( "Failed to create query object.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = importBuffer( pszDoc1, XFLM_DATA_COLLECTION)))
{
goto Exit;
}
endTest("PASS");
/********************* First Query ************************************/
beginTest(
"Query Test #1",
"/catalog/cd/title[. ~= \"Won Knight Only\"]",
"Run the query and validate the results.",
"");
if( RC_BAD( rc = pQuery->setupQueryExpr( m_pDb,
"/catalog/cd/title[. ~= \"Won Knight Only\"]")))
{
MAKE_FLM_ERROR_STRING( "Failed to set up query expression.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = pQuery->getFirst( m_pDb, &pReturn)))
{
MAKE_FLM_ERROR_STRING( "getFirst failed.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = pReturn->getUTF8( m_pDb, (FLMBYTE *)szBuffer,
sizeof( szBuffer), 0, sizeof( szBuffer) - 1)))
{
MAKE_FLM_ERROR_STRING( "getUTF8 failed.", m_szDetails, rc);
goto Exit;
}
if( f_strcmp( szBuffer, "One night only") != 0)
{
rc = NE_XFLM_FAILURE;
MAKE_FLM_ERROR_STRING( "Unexpected query result.", m_szDetails, rc);
goto Exit;
}
if( (rc = pQuery->getNext( m_pDb, &pReturn)) != NE_XFLM_EOF_HIT)
{
rc = NE_XFLM_FAILURE;
MAKE_FLM_ERROR_STRING( "Unexpected query result.", m_szDetails, rc);
goto Exit;
}
endTest("PASS");
/********************* Second Query ************************************/
beginTest(
"Query Test #2",
"/catalog/cd/price[. == 1080]",
"Run the query and validate the results.",
"");
if( RC_BAD( rc = pQuery->setupQueryExpr( m_pDb, "/catalog/cd/price[. == 1080]")))
{
MAKE_FLM_ERROR_STRING( "Failed to set up query expression.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = pQuery->getFirst( m_pDb, &pReturn)))
{
MAKE_FLM_ERROR_STRING( "getFirst failed.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = pReturn->getUTF8( m_pDb, (FLMBYTE *)szBuffer,
sizeof( szBuffer), 0, sizeof( szBuffer) - 1)))
{
MAKE_FLM_ERROR_STRING( "getUTF8 failed.", m_szDetails, rc);
goto Exit;
}
if( f_strcmp( szBuffer, "1080") != 0)
{
rc = NE_XFLM_FAILURE;
MAKE_FLM_ERROR_STRING( "Unexpected query result.", m_szDetails, rc);
goto Exit;
}
if( (rc = pQuery->getNext( m_pDb, &pReturn)) != NE_XFLM_EOF_HIT)
{
rc = NE_XFLM_FAILURE;
MAKE_FLM_ERROR_STRING( "Unexpected query result.", m_szDetails, rc);
goto Exit;
}
endTest("PASS");
/********************* Third Query ************************************/
beginTest(
"Query Test #3",
"/catalog/cd[price == 1080]/company",
"Run the query and validate the results.",
"");
if( RC_BAD( rc = pQuery->setupQueryExpr( m_pDb, "/catalog/cd[price == 1080]/company")))
{
MAKE_FLM_ERROR_STRING( "Failed to set up query expression.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = pQuery->getFirst( m_pDb, &pReturn)))
{
MAKE_FLM_ERROR_STRING( "getFirst failed.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = pReturn->getUTF8( m_pDb, (FLMBYTE *)szBuffer,
sizeof( szBuffer), 0, sizeof( szBuffer) - 1)))
{
MAKE_FLM_ERROR_STRING( "getUTF8 failed.", m_szDetails, rc);
goto Exit;
}
if( f_strcmp( szBuffer, "Polydor") != 0)
{
rc = NE_XFLM_FAILURE;
MAKE_FLM_ERROR_STRING( "Unexpected query result.", m_szDetails, rc);
goto Exit;
}
if( (rc = pQuery->getNext( m_pDb, &pReturn)) != NE_XFLM_EOF_HIT)
{
rc = NE_XFLM_FAILURE;
MAKE_FLM_ERROR_STRING( "Unexpected query result.", m_szDetails, rc);
goto Exit;
}
endTest("PASS");
/********************* Fourth Query ************************************/
beginTest(
"Query Test #4",
"/catalog/cd[location[@country == \"UK\"]]/title",
"Run the query and validate the results.",
"");
if( RC_BAD( rc = pQuery->setupQueryExpr( m_pDb,
"/catalog/cd[location[@country == \"UK\"]]/title")))
{
MAKE_FLM_ERROR_STRING( "Failed to set up query expression.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = checkQueryResults(
ppszQueryFourResults,
sizeof( ppszQueryFourResults) / sizeof( ppszQueryFourResults[0]),
pQuery,
m_szDetails)))
{
goto Exit;
}
endTest("PASS");
/********************* Fifth Query ************************************/
beginTest(
"Query Test #5",
"//cd[location[@country == \"USA\"]]/title",
"Run the query and validate the results.",
"");
if( RC_BAD( rc = pQuery->setupQueryExpr( m_pDb,
"//cd[location[@country == \"USA\"]]/title")))
{
MAKE_FLM_ERROR_STRING( "Failed to set up query expression.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = checkQueryResults(
ppszQueryFiveResults,
sizeof( ppszQueryFiveResults) / sizeof( ppszQueryFiveResults[0]),
pQuery,
m_szDetails)))
{
goto Exit;
}
endTest("PASS");
/********************* Sixth Query ************************************/
beginTest(
"Query Test #6",
"//cd[location[@city == \"London\"]]/artist",
"Run the query and validate the results.",
"");
if( RC_BAD( rc = pQuery->setupQueryExpr( m_pDb,
"//cd[location[@city == \"London\"]]/artist")))
{
MAKE_FLM_ERROR_STRING( "Failed to set up query expression.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = checkQueryResults(
ppszQuerySixResults,
sizeof( ppszQuerySixResults) / sizeof( ppszQuerySixResults[0]),
pQuery,
m_szDetails)))
{
goto Exit;
}
endTest("PASS");
/********************* Seventh Query ************************************/
beginTest(
"Query Test #7",
"//cd[location[@city != \"London\"]]/artist",
"Run the query and validate the results.",
"");
if( RC_BAD( rc = pQuery->setupQueryExpr( m_pDb,
"//cd[location[@city != \"London\"]]/artist")))
{
MAKE_FLM_ERROR_STRING( "Failed to set up query expression.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = checkQueryResults(
ppszQuerySevenResults,
sizeof( ppszQuerySevenResults) / sizeof( ppszQuerySevenResults[0]),
pQuery,
m_szDetails)))
{
goto Exit;
}
endTest("PASS");
/********************* Eighth Query ************************************/
beginTest(
"Query Test #8",
"//cd[price < 1080]/company",
"Run the query and validate the results.",
"");
if( RC_BAD( rc = pQuery->setupQueryExpr( m_pDb,
"//cd[price < 1080]/company")))
{
MAKE_FLM_ERROR_STRING( "Failed to set up query expression.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = checkQueryResults(
ppszQueryEightResults,
sizeof( ppszQueryEightResults) / sizeof( ppszQueryEightResults[0]),
pQuery,
m_szDetails)))
{
goto Exit;
}
endTest("PASS");
/********************* Ninth Query ************************************/
beginTest(
"Query Test #9",
"////cd[year >= 1990]/title",
"Run the query and validate the results.",
"");
if( RC_BAD( rc = pQuery->setupQueryExpr( m_pDb,
"//cd[year >= 1990]/title")))
{
MAKE_FLM_ERROR_STRING( "Failed to set up query expression.", m_szDetails, rc);
goto Exit;
}
if( RC_BAD( rc = checkQueryResults(
ppszQueryNineResults,
sizeof( ppszQueryNineResults) / sizeof( ppszQueryNineResults[0]),
pQuery,
m_szDetails)))
{
goto Exit;
}
endTest("PASS");
Exit:
if( RC_BAD( rc))
{
endTest("FAIL");
}
if( bTransStarted)
{
m_pDb->transCommit();
}
if( pPosIStream)
{
pPosIStream->Release();
}
if( pQuery)
{
pQuery->Release();
}
if( pReturn)
{
pReturn->Release();
}
shutdownTestState( DB_NAME_STR, bDibCreated);
return( rc);
}