summaryrefslogtreecommitdiff
path: root/src/mongo/db/matcher/expression_parser_test.cpp
diff options
context:
space:
mode:
authorEliot Horowitz <eliot@10gen.com>2013-04-23 12:26:52 -0400
committerEliot Horowitz <eliot@10gen.com>2013-04-23 12:27:44 -0400
commit2aff8e4b59393067557204da5333bfc16677ecb3 (patch)
tree32d13c73988e8c4c0c5d312f0cb007b73c4145be /src/mongo/db/matcher/expression_parser_test.cpp
parent62a22563d4bd9b21c1e168246c8899b5da4e28bc (diff)
downloadmongo-2aff8e4b59393067557204da5333bfc16677ecb3.tar.gz
SERVER-6400 new expression tree and parser
Will eventually replace Matcher
Diffstat (limited to 'src/mongo/db/matcher/expression_parser_test.cpp')
-rw-r--r--src/mongo/db/matcher/expression_parser_test.cpp100
1 files changed, 100 insertions, 0 deletions
diff --git a/src/mongo/db/matcher/expression_parser_test.cpp b/src/mongo/db/matcher/expression_parser_test.cpp
new file mode 100644
index 00000000000..3cff591b299
--- /dev/null
+++ b/src/mongo/db/matcher/expression_parser_test.cpp
@@ -0,0 +1,100 @@
+// expression_parser_test.cpp
+
+/**
+ * Copyright (C) 2013 10gen Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "mongo/unittest/unittest.h"
+
+#include "mongo/db/matcher/expression_parser.h"
+
+#include "mongo/bson/bsonobj.h"
+#include "mongo/bson/bsonobjbuilder.h"
+#include "mongo/bson/bsonmisc.h"
+#include "mongo/db/json.h"
+#include "mongo/db/matcher.h"
+#include "mongo/db/matcher/expression.h"
+#include "mongo/db/matcher/expression_leaf.h"
+
+namespace mongo {
+
+ /// HACK HACK HACK
+
+ MatchDetails::MatchDetails() :
+ _elemMatchKeyRequested() {
+ resetOutput();
+ }
+ void MatchDetails::resetOutput() {
+ _loadedRecord = false;
+ _elemMatchKeyFound = false;
+ _elemMatchKey = "";
+ }
+
+ // ----------------------------
+
+ TEST( ExpressionParserTest, SimpleEQ1 ) {
+ BSONObj query = BSON( "x" << 2 );
+ StatusWithExpression result = ExpressionParser::parse( query );
+ ASSERT_TRUE( result.isOK() );
+
+ ASSERT( result.getValue()->matches( BSON( "x" << 2 ) ) );
+ ASSERT( !result.getValue()->matches( BSON( "x" << 3 ) ) );
+ }
+
+ TEST( ExpressionParserTest, Multiple1 ) {
+ BSONObj query = BSON( "x" << 5 << "y" << BSON( "$gt" << 5 << "$lt" << 8 ) );
+ StatusWithExpression result = ExpressionParser::parse( query );
+ ASSERT_TRUE( result.isOK() );
+
+ ASSERT( result.getValue()->matches( BSON( "x" << 5 << "y" << 7 ) ) );
+ ASSERT( result.getValue()->matches( BSON( "x" << 5 << "y" << 6 ) ) );
+ ASSERT( !result.getValue()->matches( BSON( "x" << 6 << "y" << 7 ) ) );
+ ASSERT( !result.getValue()->matches( BSON( "x" << 5 << "y" << 9 ) ) );
+ ASSERT( !result.getValue()->matches( BSON( "x" << 5 << "y" << 4 ) ) );
+ }
+
+ StatusWith<int> fib( int n ) {
+ if ( n < 0 ) return StatusWith<int>( ErrorCodes::BadValue, "paramter to fib has to be >= 0" );
+ if ( n <= 1 ) return StatusWith<int>( 1 );
+ StatusWith<int> a = fib( n - 1 );
+ StatusWith<int> b = fib( n - 2 );
+ if ( !a.isOK() ) return a;
+ if ( !b.isOK() ) return b;
+ return StatusWith<int>( a.getValue() + b.getValue() );
+ }
+
+ TEST( StatusWithTest, Fib1 ) {
+ StatusWith<int> x = fib( -2 );
+ ASSERT( !x.isOK() );
+
+ x = fib(0);
+ ASSERT( x.isOK() );
+ ASSERT( 1 == x.getValue() );
+
+ x = fib(1);
+ ASSERT( x.isOK() );
+ ASSERT( 1 == x.getValue() );
+
+ x = fib(2);
+ ASSERT( x.isOK() );
+ ASSERT( 2 == x.getValue() );
+
+ x = fib(3);
+ ASSERT( x.isOK() );
+ ASSERT( 3 == x.getValue() );
+
+
+ }
+}