/*------------------------------------------------------------------------------
* Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team
*
* Distributable under the terms of either the Apache License (Version 2.0) or
* the GNU Lesser General Public License, as specified in the COPYING file.
------------------------------------------------------------------------------*/
#include "test.h"


/// Java QueryParser tests
/// Helper functions and classes

class QPTestFilter: public TokenFilter {
public:

	bool inPhrase;
	int32_t savedStart, savedEnd;

	/**
	* Filter which discards the token 'stop' and which expands the
	* token 'phrase' into 'phrase1 phrase2'
	*/
	QPTestFilter(TokenStream* in):
		TokenFilter(in,true),
		inPhrase(false),
		savedStart(0),
		savedEnd(0)
	{
	}

	CL_NS(analysis)::Token* next(CL_NS(analysis)::Token* token) {
		if (inPhrase) {
			inPhrase = false;
			token->set( _T("phrase2"), savedStart, savedEnd);
			return token;
		}else{
			while( input->next(token) != NULL ){
				if ( _tcscmp(token->termBuffer<TCHAR> (), _T("phrase")) == 0 ) {
					inPhrase = true;
					savedStart = token->startOffset();
					savedEnd = token->endOffset();
					token->set( _T("phrase1"), savedStart, savedEnd);
					return token;
				}else if ( _tcscmp(token->termBuffer<TCHAR> (), _T("stop") ) !=0 ){
					return token;
				}
			}
		}
		return NULL;
	}
};

class QPTestAnalyzer: public Analyzer {
public:
	QPTestAnalyzer() {
	}

	/** Filters LowerCaseTokenizer with StopFilter. */
	TokenStream* tokenStream(const TCHAR* /*fieldName*/, Reader* reader) {
		return _CLNEW QPTestFilter(_CLNEW LowerCaseTokenizer<TCHAR> (reader));
	}
};

class QPTestParser : public QueryParser {
public:
	QPTestParser(TCHAR* f, Analyzer* a) : QueryParser(f, a){
	}
	virtual ~QPTestParser(){
	}

protected:
	Query* getFuzzyQuery(TCHAR* /*field*/, TCHAR* /*termStr*/, float_t /*minSimilarity*/) {
		_CLTHROWA(CL_ERR_Parse,"Fuzzy queries not allowed");
	}

	Query* getWildcardQuery(TCHAR* /*field*/, TCHAR* /*termStr*/) {
		_CLTHROWA(CL_ERR_Parse,"Wildcard queries not allowed");
	}
};

QueryParser* getParser(Analyzer* a) {
	if (a == NULL)
		return NULL;
	QueryParser* qp = _CLNEW QueryParser(_T("field"), a);
	qp->setDefaultOperator(QueryParser::OR_OPERATOR);
	return qp;
}

Query* getQuery(CuTest *tc,const TCHAR* query, Analyzer* a, int ignoreCLError=0) {
	bool del = (a==NULL);
	QueryParser* qp = NULL;
	try{
		if (a == NULL)
			a = _CLNEW SimpleAnalyzer<TCHAR> ();

		qp = getParser(a);
		Query* ret = qp->parse(query);

		_CLLDELETE(qp);
		if ( del )
			_CLLDELETE(a);
		return ret;
	}catch(CLuceneError& e){
		_CLLDELETE(qp);
		if ( del ) _CLLDELETE(a);
		if (ignoreCLError != e.number())
			CuFail(tc,e);
		else
			throw e;
		return NULL;
	}catch(...){
		_CLLDELETE(qp);
		if ( del ) _CLLDELETE(a);
		CuFail(tc,_T("/%s/ threw an error.\n"),query);
		return NULL;
	}
}

void assertQueryEquals(CuTest* tc, QueryParser* qp, const TCHAR* field, const TCHAR* query, const TCHAR* result) {
    Query* q = qp->parse(query);
    TCHAR* s = q->toString(field);
    _CLLDELETE(q);
    if (_tcscmp(s,result)!=0){
        TCHAR str[CL_MAX_PATH];
        _tcscpy(str,s);
        _CLDELETE_LCARRAY(s);
        _CLLDELETE(qp);
        CuFail(tc, _T("Query /%s/ yielded /%s/, expecting /%s/\n"), query, str, result);
        return;
    }
    _CLDELETE_LCARRAY(s);
}

void assertQueryEquals(CuTest *tc,const TCHAR* query, Analyzer* a, const TCHAR* result)  {

	Query* q = getQuery(tc,query, a);
	if ( q == NULL ){
		CuFail(tc, _T("getQuery returned NULL unexpectedly for query /%s/\n"), query);
		return;
	}

	TCHAR* s = q->toString(_T("field"));
	int ret = _tcscmp(s,result);
	_CLDELETE(q);
	if ( ret != 0 ) {
		TCHAR str[CL_MAX_PATH];
		_tcscpy(str,s);
		_CLDELETE_LCARRAY(s);
		CuFail(tc, _T("FAILED Query /%s/ yielded /%s/, expecting /%s/\n"), query, str, result);
	}
	_CLDELETE_CARRAY(s);
}

void assertWildcardQueryEquals(CuTest *tc, const TCHAR* query, bool lowercase, const TCHAR* result, bool allowLeadingWildcard=false){
	SimpleAnalyzer<TCHAR>  a;
	QueryParser* qp = getParser(&a);
	qp->setLowercaseExpandedTerms(lowercase);
	qp->setAllowLeadingWildcard(allowLeadingWildcard);
	Query* q = qp->parse(query);
	_CLLDELETE(qp);

	TCHAR* s = q->toString(_T("field"));
	_CLLDELETE(q);
	if (_tcscmp(s,result) != 0) {
		TCHAR str[CL_MAX_PATH];
		_tcscpy(str,s);
		_CLDELETE_CARRAY(s);
		CuFail(tc,_T("WildcardQuery /%s/ yielded /%s/, expecting /%s/"),query, str, result);
	}
	_CLDELETE_CARRAY(s);
}

void assertCorrectQuery(CuTest *tc,const TCHAR* query, Analyzer* a, const char* inst, const TCHAR* msg){
	Query* q = getQuery(tc,query,a);
	bool success = q->instanceOf(inst);
	_CLDELETE(q);
	CuAssert(tc,msg,success);
}

void assertCorrectQuery(CuTest *tc,Query* q, const char* inst, bool bDeleteQuery = false){
	bool ret = q->instanceOf(inst);
	if (bDeleteQuery) _CLLDELETE(q);
	CuAssertTrue(tc,ret);
}

void assertParseException(CuTest *tc,const TCHAR* queryString) {
	try {
		getQuery(tc,queryString, NULL, CL_ERR_Parse);
	} catch (CLuceneError&){
		return;
	}
	CuFail(tc,_T("ParseException expected, not thrown"));
}

void assertEscapedQueryEquals(CuTest *tc,const TCHAR* query, Analyzer* a, const TCHAR* result){
	TCHAR* escapedQuery = QueryParser::escape(query);
	if (_tcscmp(escapedQuery, result) != 0) {
		TCHAR str[CL_MAX_PATH];
		_tcscpy(str,escapedQuery);
		_CLDELETE_LCARRAY(escapedQuery);
		CuFail(tc, _T("Query /%s/ yielded /%s/, expecting /%s/\n"), query, escapedQuery, result);
	}
	_CLDELETE_LCARRAY(escapedQuery);
}

Query* getQueryDOA(const TCHAR* query, Analyzer* a=NULL) {
	bool bOwnsAnalyzer=false;
	if (a == NULL){
		a = _CLNEW SimpleAnalyzer<TCHAR> ();
		bOwnsAnalyzer=true;
	}
	QueryParser* qp = _CLNEW QueryParser(_T("field"), a);
	qp->setDefaultOperator(QueryParser::AND_OPERATOR);
	Query* q = qp->parse(query);
	_CLLDELETE(qp);
	if (bOwnsAnalyzer) _CLLDELETE(a);
	return q;
}

void assertQueryEqualsDOA(CuTest *tc,const TCHAR* query, Analyzer* a, const TCHAR* result){
	Query* q = getQueryDOA(query, a);
	TCHAR* s = q->toString(_T("field"));
	_CLLDELETE(q);
	if (_tcscmp(s,result)!=0) {
		TCHAR str[CL_MAX_PATH];
		_tcscpy(str,s);
		_CLDELETE_LCARRAY(s);
		CuFail(tc,_T("Query /%s/ yielded /%s/, expecting /%s/"),query, str, result);
	}
	_CLDELETE_LCARRAY(s);
}

/// END Helper functions and classes

void testSimple(CuTest *tc) {
	StandardAnalyzer a;
	KeywordAnalyzer b;
	assertQueryEquals(tc,_T("term term term"), NULL, _T("term term term"));

#ifdef _UCS2
	TCHAR tmp1[100];

	lucene_utf8towcs(tmp1,"t\xc3\xbcrm term term",100);
	assertQueryEquals(tc,tmp1, NULL, tmp1);
	assertQueryEquals(tc,tmp1, &a, tmp1);

	lucene_utf8towcs(tmp1,"\xc3\xbcmlaut",100);
	assertQueryEquals(tc,tmp1, NULL, tmp1);
	assertQueryEquals(tc,tmp1, &a, tmp1);
#endif

	assertQueryEquals(tc, _T("\"\""), &b, _T(""));
	assertQueryEquals(tc, _T("foo:\"\""), &b, _T("foo:"));

	assertQueryEquals(tc,_T("a AND b"), NULL, _T("+a +b"));
	assertQueryEquals(tc,_T("(a AND b)"), NULL, _T("+a +b"));
	assertQueryEquals(tc,_T("c OR (a AND b)"), NULL, _T("c (+a +b)"));
	assertQueryEquals(tc,_T("a AND NOT b"), NULL, _T("+a -b"));
	assertQueryEquals(tc,_T("a AND -b"), NULL, _T("+a -b"));
	assertQueryEquals(tc,_T("a AND !b"), NULL, _T("+a -b"));
	assertQueryEquals(tc,_T("a && b"), NULL, _T("+a +b"));
	assertQueryEquals(tc,_T("a && ! b"), NULL, _T("+a -b"));

	assertQueryEquals(tc,_T("a OR b"), NULL, _T("a b"));
	assertQueryEquals(tc,_T("a || b"), NULL, _T("a b"));
	assertQueryEquals(tc,_T("a OR !b"), NULL, _T("a -b"));
	assertQueryEquals(tc,_T("a OR ! b"), NULL, _T("a -b"));
	assertQueryEquals(tc,_T("a OR -b"), NULL, _T("a -b"));

	assertQueryEquals(tc,_T("+term -term term"), NULL, _T("+term -term term"));
	assertQueryEquals(tc,_T("foo:term AND field:anotherTerm"), NULL,
					_T("+foo:term +anotherterm"));
	assertQueryEquals(tc,_T("term AND \"phrase phrase\""), NULL,
					_T("+term +\"phrase phrase\"") );
	assertQueryEquals(tc,_T("\"hello there\""), NULL, _T("\"hello there\"") );

	assertCorrectQuery(tc, _T("a AND b"), NULL,"BooleanQuery",_T("a AND b") );
	assertCorrectQuery(tc, _T("hello"), NULL,"TermQuery", _T("hello"));
	assertCorrectQuery(tc, _T("\"hello there\""), NULL,"PhraseQuery", _T("\"hello there\""));

	assertQueryEquals(tc,_T("germ term^2.0"), NULL, _T("germ term^2.0"));
    assertQueryEquals(tc,_T("(term)^2.0"), NULL, _T("term^2.0"));
	assertQueryEquals(tc,_T("(germ term)^2.0"), NULL, _T("(germ term)^2.0"));
	assertQueryEquals(tc,_T("term^2.0"), NULL, _T("term^2.0"));
	assertQueryEquals(tc,_T("term^2"), NULL, _T("term^2.0"));
	assertQueryEquals(tc,_T("term^2.3"), NULL, _T("term^2.3"));
	assertQueryEquals(tc,_T("\"germ term\"^2.0"), NULL, _T("\"germ term\"^2.0"));
	assertQueryEquals(tc,_T("\"germ term\"^2.02"), NULL, _T("\"germ term\"^2.0"));
	assertQueryEquals(tc,_T("\"term germ\"^2"), NULL, _T("\"term germ\"^2.0") );

	assertQueryEquals(tc,_T("(foo OR bar) AND (baz OR boo)"), NULL,
					_T("+(foo bar) +(baz boo)"));
	assertQueryEquals(tc,_T("((a OR b) AND NOT c) OR d"), NULL,
					_T("(+(a b) -c) d"));
	assertQueryEquals(tc,_T("+(apple \"steve jobs\") -(foo bar baz)"), NULL,
					_T("+(apple \"steve jobs\") -(foo bar baz)") );
	assertQueryEquals(tc,_T("+title:(dog OR cat) -author:\"bob dole\""), NULL,
					_T("+(title:dog title:cat) -author:\"bob dole\"") );

	QueryParser* qp = _CLNEW QueryParser(_T("field"), &a);
	// make sure OR is the default:
	CLUCENE_ASSERT(QueryParser::OR_OPERATOR == qp->getDefaultOperator());
	qp->setDefaultOperator(QueryParser::AND_OPERATOR);
	CLUCENE_ASSERT(QueryParser::AND_OPERATOR == qp->getDefaultOperator());

	// try creating a query and make sure it uses AND
	Query* bq = qp->parse(_T("term1 term2"));
	CLUCENE_ASSERT( bq != NULL );
	TCHAR* s = bq->toString(_T("field"));
	if ( _tcscmp(s,_T("+term1 +term2")) != 0 ) {
		CuFail(tc, _T("FAILED Query /term1 term2/ yielded /%s/, expecting +term1 +term2\n"), s);
	}
	_CLDELETE_CARRAY(s);
	_CLDELETE(bq);

	qp->setDefaultOperator(QueryParser::OR_OPERATOR);
	CLUCENE_ASSERT(QueryParser::OR_OPERATOR == qp->getDefaultOperator());
	_CLDELETE(qp);
}

void testPunct(CuTest *tc) {
	WhitespaceAnalyzer<TCHAR>  a;
	assertQueryEquals(tc,_T("a&b"), &a, _T("a&b"));
	assertQueryEquals(tc,_T("a&&b"), &a, _T("a&&b"));
	assertQueryEquals(tc,_T(".NET"), &a, _T(".NET"));
}

void testSlop(CuTest *tc) {
	assertQueryEquals(tc,_T("\"term germ\"~2"), NULL, _T("\"term germ\"~2") );
	assertQueryEquals(tc,_T("\"term germ\"~2 flork"), NULL, _T("\"term germ\"~2 flork") );
	assertQueryEquals(tc,_T("\"term\"~2"), NULL, _T("term"));
	assertQueryEquals(tc,_T("\" \"~2 germ"), NULL, _T("germ"));
	assertQueryEquals(tc,_T("\"term germ\"~2^2"), NULL, _T("\"term germ\"~2^2.0") );

	/*
	###  These do not work anymore with the new QP, and they do not exist in the official Java tests
	assertQueryEquals(tc,_T("term~2"), NULL, _T("term"));
	assertQueryEquals(tc,_T("term~0.5"), NULL, _T("term"));
	assertQueryEquals(tc,_T("term~0.6"), NULL, _T("term"));
	*/
}

void testNumber(CuTest *tc) {
	// The numbers go away because SimpleAnalzyer ignores them
	assertQueryEquals(tc,_T("3"), NULL, _T(""));
	assertQueryEquals(tc,_T("term 1.0 1 2"), NULL, _T("term"));
	assertQueryEquals(tc,_T("term term1 term2"), NULL, _T("term term term"));

	StandardAnalyzer a;
	assertQueryEquals(tc,_T("3"), &a, _T("3"));
	assertQueryEquals(tc,_T("term 1.0 1 2"), &a, _T("term 1.0 1 2"));
	assertQueryEquals(tc,_T("term term1 term2"), &a, _T("term term1 term2"));
}

void testWildcard(CuTest *tc)
{
	assertQueryEquals(tc,_T("term*"), NULL, _T("term*"));
	assertQueryEquals(tc,_T("term*^2"), NULL, _T("term*^2.0"));
	assertQueryEquals(tc,_T("term~"), NULL, _T("term~0.5"));
	assertQueryEquals(tc,_T("term~0.7"), NULL, _T("term~0.7"));
	assertQueryEquals(tc,_T("term~^2"), NULL, _T("term~0.5^2.0"));
	assertQueryEquals(tc,_T("term^2~"), NULL, _T("term~0.5^2.0"));
	assertQueryEquals(tc,_T("term*germ"), NULL, _T("term*germ"));
	assertQueryEquals(tc,_T("term*germ^3"), NULL, _T("term*germ^3.0"));

	assertCorrectQuery(tc, _T("term*"), NULL,"PrefixQuery", _T("term*"));
	assertCorrectQuery(tc, _T("term*^2"), NULL,"PrefixQuery", _T("term*^2.0"));
	assertCorrectQuery(tc, _T("term~"), NULL,"FuzzyQuery", _T("term~0.5"));
	assertCorrectQuery(tc, _T("term~0.7"), NULL,"FuzzyQuery", _T("term~0.7"));
	assertCorrectQuery(tc, _T("t*"), NULL,"PrefixQuery", _T("t*"));

	FuzzyQuery* fq = (FuzzyQuery*)getQuery(tc,_T("term~0.7"), NULL);
	float_t simDiff = fq->getMinSimilarity() - 0.7;
	if ( simDiff < 0 ) simDiff *= -1;
	CuAssertTrue(tc, simDiff < 0.1);
	CuAssertTrue(tc, FuzzyQuery::defaultPrefixLength == fq->getPrefixLength());
	_CLLDELETE(fq);
	fq = (FuzzyQuery*)getQuery(tc, _T("term~"), NULL);
	
	simDiff = fq->getMinSimilarity() - 0.5;
	if ( simDiff < 0 ) simDiff *= -1;
	CuAssertTrue(tc, simDiff < 0.1);
	CuAssertTrue(tc, FuzzyQuery::defaultPrefixLength == fq->getPrefixLength());
	_CLDELETE(fq);

	assertParseException(tc,_T("term~1.1"));	// value > 1, throws exception

	assertCorrectQuery(tc, _T("term*germ"), NULL,"WildcardQuery", _T("term*germ"));

	/* Tests to see that wild card terms are (or are not) properly
	* lower-cased with propery parser configuration
	*/
	// First prefix queries:
	// by default, convert to lowercase:
	assertWildcardQueryEquals(tc,_T("Term*"), true, _T("term*"));
	// explicitly set lowercase:
	assertWildcardQueryEquals(tc,_T("term*"), true, _T("term*"));
	assertWildcardQueryEquals(tc,_T("Term*"), true, _T("term*"));
	assertWildcardQueryEquals(tc,_T("TERM*"), true, _T("term*"));
	// explicitly disable lowercase conversion:
	assertWildcardQueryEquals(tc,_T("term*"), false, _T("term*"));
	assertWildcardQueryEquals(tc,_T("Term*"), false, _T("Term*"));
	assertWildcardQueryEquals(tc,_T("TERM*"), false, _T("TERM*"));
	// Then 'full' wildcard queries:
	// by default, convert to lowercase:
	assertQueryEquals(tc,_T("Te?m"), NULL,_T("te?m"));
	// explicitly set lowercase:
	assertWildcardQueryEquals(tc,_T("te?m"), true, _T("te?m"));
	assertWildcardQueryEquals(tc,_T("Te?m"), true, _T("te?m"));
	assertWildcardQueryEquals(tc,_T("TE?M"), true, _T("te?m"));
	assertWildcardQueryEquals(tc,_T("Te?m*gerM"), true, _T("te?m*germ"));
	// explicitly disable lowercase conversion:
	assertWildcardQueryEquals(tc,_T("te?m"), false, _T("te?m"));
	assertWildcardQueryEquals(tc,_T("Te?m"), false, _T("Te?m"));
	assertWildcardQueryEquals(tc,_T("TE?M"), false, _T("TE?M"));
	assertWildcardQueryEquals(tc,_T("Te?m*gerM"), false, _T("Te?m*gerM"));
	//  Fuzzy queries:
	assertQueryEquals(tc,_T("Term~"), NULL,_T("term~0.5"));
	assertWildcardQueryEquals(tc,_T("Term~"), true, _T("term~0.5"));
	assertWildcardQueryEquals(tc,_T("Term~"), false, _T("Term~0.5"));
	//  Range queries:
	assertQueryEquals(tc,_T("[A TO C]"), NULL,_T("[a TO c]"));
	assertWildcardQueryEquals(tc,_T("[A TO C]"), true, _T("[a TO c]"));
	assertWildcardQueryEquals(tc,_T("[A TO C]"), false, _T("[A TO C]"));
	// Test suffix queries: first disallow
	assertParseException(tc,_T("*Term"));
	assertParseException(tc,_T("?Term"));

	// Test suffix queries: then allow
	assertWildcardQueryEquals(tc,_T("*Term"), true, _T("*term"), true);
	assertWildcardQueryEquals(tc,_T("?Term"), true, _T("?term"), true);

	// ### not in the Java tests
	// assertQueryEquals(tc,_T("term~0.5"), NULL, _T("term"));
}

void testLeadingWildcardType(CuTest *tc) {
	SimpleAnalyzer<TCHAR>  a;
	QueryParser* qp = getParser(&a);
	qp->setAllowLeadingWildcard(true);
	assertCorrectQuery(tc, qp->parse(_T("t*erm*")), WildcardQuery::getClassName(), true);
	assertCorrectQuery(tc, qp->parse(_T("?t*erm*")), WildcardQuery::getClassName(), true); // should not throw an exception
	assertCorrectQuery(tc, qp->parse(_T("*t*erm*")), WildcardQuery::getClassName(), true);
	_CLLDELETE(qp);
}

void testQPA(CuTest *tc) {
	QPTestAnalyzer qpAnalyzer;
	assertQueryEquals(tc,_T("term term^3.0 term"), &qpAnalyzer, _T("term term^3.0 term") );
	assertQueryEquals(tc,_T("term stop^3.0 term"), &qpAnalyzer, _T("term term") );

	assertQueryEquals(tc,_T("term term term"), &qpAnalyzer, _T("term term term") );
	assertQueryEquals(tc,_T("term +stop term"), &qpAnalyzer, _T("term term") );
	assertQueryEquals(tc,_T("term -stop term"), &qpAnalyzer, _T("term term") );

	assertQueryEquals(tc,_T("drop AND (stop) AND roll"), &qpAnalyzer, _T("+drop +roll") );
	assertQueryEquals(tc,_T("term +(stop) term"), &qpAnalyzer, _T("term term") );
	assertQueryEquals(tc,_T("term -(stop) term"), &qpAnalyzer, _T("term term") );

	assertQueryEquals(tc,_T("drop AND stop AND roll"), &qpAnalyzer, _T("+drop +roll") );
	assertQueryEquals(tc,_T("term phrase term"), &qpAnalyzer,
					_T("term \"phrase1 phrase2\" term") );
	assertQueryEquals(tc,_T("term AND NOT phrase term"), &qpAnalyzer,
					_T("+term -\"phrase1 phrase2\" term") );
	assertQueryEquals(tc,_T("stop^3"), &qpAnalyzer, _T("") );
	assertQueryEquals(tc,_T("stop"), &qpAnalyzer, _T("") );
	assertQueryEquals(tc,_T("(stop)^3"), &qpAnalyzer, _T("") );
	assertQueryEquals(tc,_T("((stop))^3"), &qpAnalyzer, _T("") );
	assertQueryEquals(tc,_T("(stop^3)"), &qpAnalyzer, _T("") );
	assertQueryEquals(tc,_T("((stop)^3)"), &qpAnalyzer, _T("") );
	assertQueryEquals(tc,_T("(stop)"), &qpAnalyzer, _T("") );
	assertQueryEquals(tc,_T("((stop))"), &qpAnalyzer, _T("") );
	assertCorrectQuery(tc, _T("term term term"), &qpAnalyzer,"BooleanQuery", _T("term term term"));
	assertCorrectQuery(tc, _T("term +stop"), &qpAnalyzer,"TermQuery", _T("term +stop"));
}

void testRange(CuTest *tc) {
	StandardAnalyzer a;

    assertQueryEquals(tc, _T("[ a TO z]"), NULL, _T("[a TO z]"));
    assertCorrectQuery(tc, _T("[ a TO z]"), NULL, "ConstantScoreRangeQuery", _T("[a TO z]"));

    QueryParser* qp = _CLNEW QueryParser(_T("field"), &a);
	qp->setUseOldRangeQuery(true);
    Query* q = qp->parse(_T("[ a TO z]"));
    _CLLDELETE(qp);
    CLUCENE_ASSERT(q->instanceOf("RangeQuery"));
    _CLLDELETE(q);

	assertQueryEquals(tc, _T("[ a TO z ]"), NULL, _T("[a TO z]"));
	assertQueryEquals(tc, _T("{ a TO z}"), NULL, _T("{a TO z}"));
	assertQueryEquals(tc, _T("{ a TO z }"), NULL, _T("{a TO z}"));
	assertQueryEquals(tc, _T("{ a TO z }^2.0"), NULL, _T("{a TO z}^2.0"));
	assertQueryEquals(tc, _T("[ a TO z] OR bar"), NULL, _T("[a TO z] bar"));
	assertQueryEquals(tc, _T("[ a TO z] AND bar"), NULL, _T("+[a TO z] +bar"));
	assertQueryEquals(tc, _T("( bar blar { a TO z}) "), NULL, _T("bar blar {a TO z}"));
	assertQueryEquals(tc, _T("gack ( bar blar { a TO z}) "), NULL, _T("gack (bar blar {a TO z})"));

	// Old CLucene tests - check this is working without TO as well
	assertQueryEquals(tc,_T("[ a z]"), NULL, _T("[a TO z]"));
	assertCorrectQuery(tc, _T("[ a z]"), NULL, "ConstantScoreRangeQuery", _T("[ a z]") );
	assertQueryEquals(tc,_T("[ a z ]"), NULL, _T("[a TO z]"));
	assertQueryEquals(tc,_T("{ a z}"), NULL, _T("{a TO z}"));
	assertQueryEquals(tc,_T("{ a z }"), NULL, _T("{a TO z}"));
	assertQueryEquals(tc,_T("{ a z }^2.0"), NULL, _T("{a TO z}^2.0"));
	assertQueryEquals(tc,_T("[ a z] OR bar"), NULL, _T("[a TO z] bar"));
	assertQueryEquals(tc,_T("[ a z] AND bar"), NULL, _T("+[a TO z] +bar"));
	assertQueryEquals(tc,_T("( bar blar { a z}) "), NULL, _T("bar blar {a TO z}"));
	assertQueryEquals(tc,_T("gack ( bar blar { a z}) "), NULL, _T("gack (bar blar {a TO z})"));

	// ### Incompatiable with new QP, and does not appear in the Java tests; use the format below instead
	// assertQueryEquals(tc,_T("[050-070]"), &a, _T("[050 TO -070]"));
	assertQueryEquals(tc,_T("[050 -070]"), &a, _T("[050 TO -070]"));
}

/// TODO: Complete missing date tests here

/** for testing DateTools support */
TCHAR* getDate(int64_t d, DateTools::Resolution resolution) {
    if (resolution == DateTools::NO_RESOLUTION) {
        return DateField::timeToString(d);
    } else {
        return DateTools::timeToString(d, resolution);
    }
}

/** for testing DateTools support */
TCHAR* getDate(const TCHAR* s, DateTools::Resolution resolution) {
    return getDate(DateTools::stringToTime(s), resolution);      
}

void assertDateRangeQueryEquals(CuTest* tc, QueryParser* qp, const TCHAR* field,
                                const TCHAR* startDate, const TCHAR* endDate, 
                                int64_t endDateInclusive, DateTools::Resolution resolution)
{
    StringBuffer query;
    query.append(field);
    query.append(_T(":["));
    query.append(startDate);
    query.append(_T(" TO "));
    query.append(endDate);
    query.appendChar(_T(']'));

    StringBuffer result;
    result.appendChar(_T('['));
    TCHAR* tmp = getDate(startDate, resolution);
    result.append(tmp);
    _CLDELETE_LCARRAY(tmp);
    result.append(_T(" TO "));
    tmp = getDate(endDateInclusive, resolution);
    result.append(tmp);
    _CLDELETE_LCARRAY(tmp);
    result.appendChar(_T(']'));

    assertQueryEquals(tc, qp, field, query.getBuffer(), result.getBuffer());

    query.clear();
    result.clear();

    query.append(field);
    query.append(_T(":{"));
    query.append(startDate);
    query.append(_T(" TO "));
    query.append(endDate);
    query.appendChar(_T('}'));

    result.appendChar(_T('{'));
    tmp = getDate(startDate, resolution);
    result.append(tmp);
    _CLDELETE_LCARRAY(tmp);
    result.append(_T(" TO "));
    tmp = getDate(endDate, resolution);
    result.append(tmp);
    _CLDELETE_LCARRAY(tmp);
    result.appendChar(_T('}'));

    assertQueryEquals(tc, qp, field, query.getBuffer(), result.getBuffer());
}

TCHAR* getLocalizedDate(int32_t year, int32_t month, int32_t day, bool extendLastDate) {
    if (extendLastDate)
        return CL_NS(document)::DateTools::getISOFormat(year, month, day, 11, 59, 59, 999);
    else
        return CL_NS(document)::DateTools::getISOFormat(year, month, day);
    
}

void testDateRange(CuTest* tc) {

    TCHAR* startDate = getLocalizedDate(2002, 1, 1, false);
    TCHAR* endDate = getLocalizedDate(2002, 1, 4, false);
    const int64_t endDateExpected = CL_NS(document)::DateTools::getTime(2002,1,4,23,59,59,999);
    const TCHAR* defaultField = _T("default");
    const TCHAR* monthField = _T("month");
    const TCHAR* hourField = _T("hour");
    
    SimpleAnalyzer<TCHAR>  a;
    QueryParser* qp = _CLNEW QueryParser(_T("field"), &a);

    // Don't set any date resolution and verify if DateField is used
    assertDateRangeQueryEquals(tc, qp, defaultField, startDate, endDate, 
        endDateExpected, DateTools::NO_RESOLUTION);

    // set a field specific date resolution
    qp->setDateResolution(monthField, DateTools::MONTH_FORMAT);

    // DateField should still be used for defaultField
    assertDateRangeQueryEquals(tc, qp, defaultField, startDate, endDate, 
        endDateExpected, DateTools::NO_RESOLUTION);

    // set default date resolution to MILLISECOND 
    qp->setDateResolution(DateTools::MILLISECOND_FORMAT);

    // set second field specific date resolution    
    qp->setDateResolution(hourField, DateTools::HOUR_FORMAT);

    // for this field no field specific date resolution has been set,
    // so verify if the default resolution is used
    assertDateRangeQueryEquals(tc, qp, defaultField, startDate, endDate, 
        endDateExpected, DateTools::MILLISECOND_FORMAT);

    // verify if field specific date resolutions are used for these two fields
    assertDateRangeQueryEquals(tc, qp, monthField, startDate, endDate, 
        endDateExpected, DateTools::MONTH_FORMAT);

    assertDateRangeQueryEquals(tc, qp, hourField, startDate, endDate, 
        endDateExpected, DateTools::HOUR_FORMAT);

    _CLDELETE_LCARRAY(startDate);
    _CLDELETE_LCARRAY(endDate);
}

void testEscaped(CuTest *tc) {
	WhitespaceAnalyzer<TCHAR>  a;
	/*assertQueryEquals(tc, _T("\\[brackets"), &a, _T("[brackets") );
	assertQueryEquals(tc, _T("\\\\\\[brackets"), &a, _T("\\[brackets") );
    assertQueryEquals(tc,_T("\\[brackets"), NULL, _T("brackets") );*/

	assertQueryEquals(tc,_T("\\a"), &a, _T("a") );

    assertQueryEquals(tc,_T("a\\-b:c"), &a, _T("a-b:c") );
    assertQueryEquals(tc,_T("a\\+b:c"), &a, _T("a+b:c") );
    assertQueryEquals(tc,_T("a\\:b:c"), &a, _T("a:b:c") );
    assertQueryEquals(tc,_T("a\\\\b:c"), &a, _T("a\\b:c") );

    assertQueryEquals(tc,_T("a:b\\-c"), &a, _T("a:b-c") );
    assertQueryEquals(tc,_T("a:b\\+c"), &a, _T("a:b+c") );
    assertQueryEquals(tc,_T("a:b\\:c"), &a, _T("a:b:c") );
    assertQueryEquals(tc,_T("a:b\\\\c"), &a, _T("a:b\\c") );

    assertQueryEquals(tc,_T("a:b\\-c*"), &a, _T("a:b-c*") );
    assertQueryEquals(tc,_T("a:b\\+c*"), &a, _T("a:b+c*") );
    assertQueryEquals(tc,_T("a:b\\:c*"), &a, _T("a:b:c*") );

    assertQueryEquals(tc,_T("a:b\\\\c*"), &a, _T("a:b\\c*") );

    assertQueryEquals(tc,_T("a:b\\-?c"), &a, _T("a:b-?c") );
    assertQueryEquals(tc,_T("a:b\\+?c"), &a, _T("a:b+?c") );
    assertQueryEquals(tc,_T("a:b\\:?c"), &a, _T("a:b:?c") );

    assertQueryEquals(tc,_T("a:b\\\\?c"), &a, _T("a:b\\?c") );

    assertQueryEquals(tc,_T("a:b\\-c~"), &a, _T("a:b-c~0.5") );
    assertQueryEquals(tc,_T("a:b\\+c~"), &a, _T("a:b+c~0.5") );
    assertQueryEquals(tc,_T("a:b\\:c~"), &a, _T("a:b:c~0.5") );
    assertQueryEquals(tc,_T("a:b\\\\c~"), &a, _T("a:b\\c~0.5") );

    assertQueryEquals(tc,_T("[ a\\- TO a\\+ ]"), &a, _T("[a- TO a+]") );
    assertQueryEquals(tc,_T("[ a\\: TO a\\~ ]"), &a, _T("[a: TO a~]") );
    assertQueryEquals(tc,_T("[ a\\\\ TO a\\* ]"), &a, _T("[a\\ TO a*]") );

    assertQueryEquals(tc, _T("[\"c\\:\\\\temp\\\\\\~foo0.txt\" TO \"c\\:\\\\temp\\\\\\~foo9.txt\"]"), &a,
                      _T("[c:\\temp\\~foo0.txt TO c:\\temp\\~foo9.txt]"));

    assertQueryEquals(tc, _T("a\\\\\\+b"), &a, _T("a\\+b"));

    assertQueryEquals(tc, _T("a \\\"b c\\\" d"), &a, _T("a \"b c\" d"));
    assertQueryEquals(tc, _T("\"a \\\"b c\\\" d\""), &a, _T("\"a \"b c\" d\""));
    assertQueryEquals(tc, _T("\"a \\+b c d\""), &a, _T("\"a +b c d\""));

    assertQueryEquals(tc, _T("c\\:\\\\temp\\\\\\~foo.txt"), &a, _T("c:\\temp\\~foo.txt"));

	assertParseException(tc, _T("XY\\")); // there must be a character after the escape char

    // test unicode escaping
    assertQueryEquals(tc,_T("a\\u0062c"), &a, _T("abc"));
    assertQueryEquals(tc,_T("XY\\u005a"), &a, _T("XYZ"));
    assertQueryEquals(tc,_T("XY\\u005A"), &a, _T("XYZ"));
    assertQueryEquals(tc,_T("\"a \\\\\\u0028\\u0062\\\" c\""), &a, _T("\"a \\(b\" c\""));

    assertParseException(tc,_T("XY\\u005G"));  // test non-hex character in escaped unicode sequence
    assertParseException(tc,_T("XY\\u005"));   // test incomplete escaped unicode sequence

    // Tests bug LUCENE-800
    assertQueryEquals(tc,_T("(item:\\\\ item:ABCD\\\\)"), &a, _T("item:\\ item:ABCD\\"));
    assertParseException(tc,_T("(item:\\\\ item:ABCD\\\\))")); // unmatched closing paranthesis
    assertQueryEquals(tc,_T("\\*"), &a, _T("*"));
    assertQueryEquals(tc,_T("\\\\"), &a, _T("\\"));  // escaped backslash

    assertParseException(tc,_T("\\")); // a backslash must always be escaped
}

void testQueryStringEscaping(CuTest *tc) {
	WhitespaceAnalyzer<TCHAR>  a;

	assertEscapedQueryEquals(tc, _T("a-b:c"), &a, _T("a\\-b\\:c"));
	assertEscapedQueryEquals(tc,_T("a+b:c"), &a, _T("a\\+b\\:c"));
	assertEscapedQueryEquals(tc, _T("a:b:c"), &a, _T("a\\:b\\:c"));
	assertEscapedQueryEquals(tc, _T("a\\b:c"), &a, _T("a\\\\b\\:c"));

	assertEscapedQueryEquals(tc,_T("a:b-c"), &a, _T("a\\:b\\-c"));
	assertEscapedQueryEquals(tc,_T("a:b+c"), &a, _T("a\\:b\\+c"));
	assertEscapedQueryEquals(tc,_T("a:b:c"), &a, _T("a\\:b\\:c"));
	assertEscapedQueryEquals(tc,_T("a:b\\c"), &a, _T("a\\:b\\\\c"));

	assertEscapedQueryEquals(tc,_T("a:b-c*"), &a, _T("a\\:b\\-c\\*"));
	assertEscapedQueryEquals(tc,_T("a:b+c*"), &a, _T("a\\:b\\+c\\*"));
	assertEscapedQueryEquals(tc,_T("a:b:c*"), &a, _T("a\\:b\\:c\\*"));

	assertEscapedQueryEquals(tc,_T("a:b\\\\c*"), &a, _T("a\\:b\\\\\\\\c\\*"));

	assertEscapedQueryEquals(tc,_T("a:b-?c"), &a, _T("a\\:b\\-\\?c"));
	assertEscapedQueryEquals(tc,_T("a:b+?c"), &a, _T("a\\:b\\+\\?c"));
	assertEscapedQueryEquals(tc,_T("a:b:?c"), &a, _T("a\\:b\\:\\?c"));

	assertEscapedQueryEquals(tc,_T("a:b?c"), &a, _T("a\\:b\\?c"));

	assertEscapedQueryEquals(tc,_T("a:b-c~"), &a, _T("a\\:b\\-c\\~"));
	assertEscapedQueryEquals(tc,_T("a:b+c~"), &a, _T("a\\:b\\+c\\~"));
	assertEscapedQueryEquals(tc,_T("a:b:c~"), &a, _T("a\\:b\\:c\\~"));
	assertEscapedQueryEquals(tc,_T("a:b\\c~"), &a, _T("a\\:b\\\\c\\~"));

	assertEscapedQueryEquals(tc,_T("[ a - TO a+ ]"), NULL, _T("\\[ a \\- TO a\\+ \\]"));
	assertEscapedQueryEquals(tc,_T("[ a : TO a~ ]"), NULL, _T("\\[ a \\: TO a\\~ \\]"));
	assertEscapedQueryEquals(tc,_T("[ a\\ TO a* ]"), NULL, _T("\\[ a\\\\ TO a\\* \\]"));

	// LUCENE-881
	assertEscapedQueryEquals(tc,_T("|| abc ||"), &a, _T("\\|\\| abc \\|\\|"));
	assertEscapedQueryEquals(tc,_T("&& abc &&"), &a, _T("\\&\\& abc \\&\\&"));
}

void testTabNewlineCarriageReturn(CuTest *tc){
	assertQueryEqualsDOA(tc,_T("+weltbank +worlbank"), NULL,
		_T("+weltbank +worlbank"));

	assertQueryEqualsDOA(tc,_T("+weltbank\n+worlbank"), NULL,
		_T("+weltbank +worlbank"));
	assertQueryEqualsDOA(tc,_T("weltbank \n+worlbank"), NULL,
		_T("+weltbank +worlbank"));
	assertQueryEqualsDOA(tc,_T("weltbank \n +worlbank"), NULL,
		_T("+weltbank +worlbank"));

	assertQueryEqualsDOA(tc,_T("+weltbank\r+worlbank"), NULL,
		_T("+weltbank +worlbank"));
	assertQueryEqualsDOA(tc,_T("weltbank \r+worlbank"), NULL,
		_T("+weltbank +worlbank"));
	assertQueryEqualsDOA(tc,_T("weltbank \r +worlbank"), NULL,
		_T("+weltbank +worlbank"));

	assertQueryEqualsDOA(tc,_T("+weltbank\r\n+worlbank"), NULL,
		_T("+weltbank +worlbank"));
	assertQueryEqualsDOA(tc,_T("weltbank \r\n+worlbank"), NULL,
		_T("+weltbank +worlbank"));
	assertQueryEqualsDOA(tc,_T("weltbank \r\n +worlbank"), NULL,
		_T("+weltbank +worlbank"));
	assertQueryEqualsDOA(tc,_T("weltbank \r \n +worlbank"), NULL,
		_T("+weltbank +worlbank"));

	assertQueryEqualsDOA(tc,_T("+weltbank\t+worlbank"), NULL,
		_T("+weltbank +worlbank"));
	assertQueryEqualsDOA(tc,_T("weltbank \t+worlbank"), NULL,
		_T("+weltbank +worlbank"));
	assertQueryEqualsDOA(tc,_T("weltbank \t +worlbank"), NULL,
		_T("+weltbank +worlbank"));
}

void testSimpleDAO(CuTest *tc){
	assertQueryEqualsDOA(tc,_T("term term term"), NULL, _T("+term +term +term"));
	assertQueryEqualsDOA(tc,_T("term +term term"), NULL, _T("+term +term +term"));
	assertQueryEqualsDOA(tc,_T("term term +term"), NULL, _T("+term +term +term"));
	assertQueryEqualsDOA(tc,_T("term +term +term"), NULL, _T("+term +term +term"));
	assertQueryEqualsDOA(tc,_T("-term term term"), NULL, _T("-term +term +term"));
}

void testBoost(CuTest *tc){
	const TCHAR* stopWords[] = {_T("on"), NULL};
	StandardAnalyzer* oneStopAnalyzer = _CLNEW StandardAnalyzer(reinterpret_cast<const TCHAR**>(&stopWords));
	QueryParser* qp = _CLNEW QueryParser(_T("field"), oneStopAnalyzer);
	Query* q = qp->parse(_T("on^1.0"));
	CLUCENE_ASSERT(q != NULL);
	_CLLDELETE(q);
	q = qp->parse(_T("\"hello\"^2.0"));
	CLUCENE_ASSERT(q != NULL);
	CLUCENE_ASSERT(q->getBoost() == 2.0f);
	_CLLDELETE(q);
	q = qp->parse(_T("hello^2.0"));
	CLUCENE_ASSERT(q != NULL);
	CLUCENE_ASSERT(q->getBoost() == 2.0f);
	_CLLDELETE(q);
	q = qp->parse(_T("\"on\"^1.0"));
	CLUCENE_ASSERT(q != NULL);
	_CLLDELETE(q);
	_CLLDELETE(qp);
	_CLLDELETE(oneStopAnalyzer);

	StandardAnalyzer a;
	QueryParser* qp2 = _CLNEW QueryParser(_T("field"), &a);
	q = qp2->parse(_T("the^3"));
	// "the" is a stop word so the result is an empty query:
	CLUCENE_ASSERT(q != NULL);
	TCHAR* tmp = q->toString();
	CLUCENE_ASSERT( _tcscmp(tmp, _T("")) == 0 );
	_CLDELETE_LCARRAY(tmp);
	CLUCENE_ASSERT(1.0f == q->getBoost());
	_CLLDELETE(q);
	_CLLDELETE(qp2);
}

/// TODO: Port tests starting from assertParseException

void testMatchAllDocs(CuTest *tc) {
	WhitespaceAnalyzer<TCHAR>  a;
	QueryParser* qp = _CLNEW QueryParser(_T("field"), &a);
	assertCorrectQuery(tc,qp->parse(_T("*:*")),"MatchAllDocsQuery",true);
	assertCorrectQuery(tc,qp->parse(_T("(*:*)")),"MatchAllDocsQuery",true);

	BooleanQuery* bq = (BooleanQuery*)qp->parse(_T("+*:* -*:*"));
	BooleanClause** clauses = _CL_NEWARRAY(BooleanClause*, bq->getClauseCount() + 1);
	bq->getClauses(clauses);
	assertCorrectQuery(tc, clauses[0]->getQuery(), "MatchAllDocsQuery");
	assertCorrectQuery(tc, clauses[1]->getQuery(), "MatchAllDocsQuery");
	_CLDELETE_LARRAY(clauses);
	_CLLDELETE(bq);
	_CLLDELETE(qp);
}

// Tracker Bug ID 2870826 by Veit Jahns
void testDefaultField(CuTest* tc){
    WhitespaceAnalyzer<TCHAR>  a;
	QueryParser* qp = _CLNEW QueryParser(_T("field"), &a);
    Query* bq = qp->parse(_T("term1 author:term2 term3"));
    CLUCENE_ASSERT( bq != NULL );
    TCHAR* s = bq->toString(_T("field"));
    _CLLDELETE(bq);
    if ( _tcscmp(s,_T("term1 author:term2 term3")) != 0 )
        CuFail(tc, _T("FAILED Query /term1 author:term2 term3/ yielded /%s/, expecting term1 author:term2 term3\n"), s);
    _CLDELETE_LCARRAY(s);

    bq = qp->parse(_T("term1 *:term2 term3"));
    s = bq->toString(_T("field"));
    if ( _tcscmp(s,_T("term1 *:term2 term3")) != 0 )
        CuFail(tc, _T("FAILED Query /term1 *:term2 term3/ yielded /%s/, expecting term1 *:term2 term3\n"), s);

    _CLDELETE_LCARRAY(s);
    _CLLDELETE(bq);

    _CLLDELETE(qp);
}

CuSuite *testQueryParser(void)
{
	CuSuite *suite = CuSuiteNew(_T("CLucene Query Parser Test"));

	SUITE_ADD_TEST(suite, testSimple);
	SUITE_ADD_TEST(suite, testPunct);
	SUITE_ADD_TEST(suite, testSlop);
	SUITE_ADD_TEST(suite, testNumber);
	SUITE_ADD_TEST(suite, testWildcard);
	SUITE_ADD_TEST(suite, testLeadingWildcardType);
	SUITE_ADD_TEST(suite, testQPA);
	SUITE_ADD_TEST(suite, testRange);
    //SUITE_ADD_TEST(suite, testDateRange);
	SUITE_ADD_TEST(suite, testEscaped);
	SUITE_ADD_TEST(suite, testQueryStringEscaping);
	SUITE_ADD_TEST(suite, testTabNewlineCarriageReturn);
	SUITE_ADD_TEST(suite, testSimpleDAO);
	SUITE_ADD_TEST(suite, testBoost);

	SUITE_ADD_TEST(suite, testMatchAllDocs);

    SUITE_ADD_TEST(suite, testDefaultField);

	return suite;
}
// EOF
