// pipelinetests.cpp : Unit tests for some classes within src/mongo/db/pipeline.
/**
* Copyright (C) 2012 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 .
*
* As a special exception, the copyright holders give permission to link the
* code of portions of this program with the OpenSSL library under certain
* conditions as described in each individual source file and distribute
* linked combinations including the program with the OpenSSL library. You
* must comply with the GNU Affero General Public License in all respects
* for all of the code used other than as permitted herein. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you do not
* wish to do so, delete this exception statement from your version. If you
* delete this exception statement from all source files in the program,
* then also delete it in the license file.
*/
#include "mongo/pch.h"
#include "mongo/db/pipeline/field_path.h"
#include "mongo/dbtests/dbtests.h"
namespace PipelineTests {
namespace FieldPath {
using mongo::FieldPath;
/** FieldPath constructed from empty string. */
class Empty {
public:
void run() {
ASSERT_THROWS( FieldPath path( "" ), UserException );
}
};
/** FieldPath constructed from empty vector. */
class EmptyVector {
public:
void run() {
vector vec;
ASSERT_THROWS( FieldPath path( vec ), MsgAssertionException );
}
};
/** FieldPath constructed from a simple string (without dots). */
class Simple {
public:
void run() {
FieldPath path( "foo" );
ASSERT_EQUALS( 1U, path.getPathLength() );
ASSERT_EQUALS( "foo", path.getFieldName( 0 ) );
ASSERT_EQUALS( "foo", path.getPath( false ) );
ASSERT_EQUALS( "$foo", path.getPath( true ) );
}
};
/** FieldPath constructed from a single element vector. */
class SimpleVector {
public:
void run() {
vector vec( 1, "foo" );
FieldPath path( vec );
ASSERT_EQUALS( 1U, path.getPathLength() );
ASSERT_EQUALS( "foo", path.getFieldName( 0 ) );
ASSERT_EQUALS( "foo", path.getPath( false ) );
}
};
/** FieldPath consisting of a '$' character. */
class DollarSign {
public:
void run() {
ASSERT_THROWS( FieldPath path( "$" ), UserException );
}
};
/** FieldPath with a '$' prefix. */
class DollarSignPrefix {
public:
void run() {
ASSERT_THROWS( FieldPath path( "$a" ), UserException );
}
};
/** FieldPath constructed from a string with one dot. */
class Dotted {
public:
void run() {
FieldPath path( "foo.bar" );
ASSERT_EQUALS( 2U, path.getPathLength() );
ASSERT_EQUALS( "foo", path.getFieldName( 0 ) );
ASSERT_EQUALS( "bar", path.getFieldName( 1 ) );
ASSERT_EQUALS( "foo.bar", path.getPath( false ) );
ASSERT_EQUALS( "$foo.bar", path.getPath( true ) );
}
};
/** FieldPath constructed from a single element vector containing a dot. */
class VectorWithDot {
public:
void run() {
vector vec( 1, "fo.o" );
ASSERT_THROWS( FieldPath path( vec ), UserException );
}
};
/** FieldPath constructed from a two element vector. */
class TwoFieldVector {
public:
void run() {
vector vec;
vec.push_back( "foo" );
vec.push_back( "bar" );
FieldPath path( vec );
ASSERT_EQUALS( 2U, path.getPathLength() );
ASSERT_EQUALS( "foo.bar", path.getPath( false ) );
}
};
/** FieldPath with a '$' prefix in the second field. */
class DollarSignPrefixSecondField {
public:
void run() {
ASSERT_THROWS( FieldPath path( "a.$b" ), UserException );
}
};
/** FieldPath constructed from a string with two dots. */
class TwoDotted {
public:
void run() {
FieldPath path( "foo.bar.baz" );
ASSERT_EQUALS( 3U, path.getPathLength() );
ASSERT_EQUALS( "foo", path.getFieldName( 0 ) );
ASSERT_EQUALS( "bar", path.getFieldName( 1 ) );
ASSERT_EQUALS( "baz", path.getFieldName( 2 ) );
ASSERT_EQUALS( "foo.bar.baz", path.getPath( false ) );
}
};
/** FieldPath constructed from a string ending in a dot. */
class TerminalDot {
public:
void run() {
ASSERT_THROWS( FieldPath path( "foo." ), UserException );
}
};
/** FieldPath constructed from a string beginning with a dot. */
class PrefixDot {
public:
void run() {
ASSERT_THROWS( FieldPath path( ".foo" ), UserException );
}
};
/** FieldPath constructed from a string with adjacent dots. */
class AdjacentDots {
public:
void run() {
ASSERT_THROWS( FieldPath path( "foo..bar" ), UserException );
}
};
/** FieldPath constructed from a string with one letter between two dots. */
class LetterBetweenDots {
public:
void run() {
FieldPath path( "foo.a.bar" );
ASSERT_EQUALS( 3U, path.getPathLength() );
ASSERT_EQUALS( "foo.a.bar", path.getPath( false ) );
}
};
/** FieldPath containing a null character. */
class NullCharacter {
public:
void run() {
ASSERT_THROWS( FieldPath path( string( "foo.b\0r", 7 ) ), UserException );
}
};
/** FieldPath constructed with a vector containing a null character. */
class VectorNullCharacter {
public:
void run() {
vector vec;
vec.push_back( "foo" );
vec.push_back( string( "b\0r", 3 ) );
ASSERT_THROWS( FieldPath path( vec ), UserException );
}
};
/** Tail of a FieldPath. */
class Tail {
public:
void run() {
FieldPath path = FieldPath( "foo.bar" ).tail();
ASSERT_EQUALS( 1U, path.getPathLength() );
ASSERT_EQUALS( "bar", path.getPath( false ) );
}
};
/** Tail of a FieldPath with three fields. */
class TailThreeFields {
public:
void run() {
FieldPath path = FieldPath( "foo.bar.baz" ).tail();
ASSERT_EQUALS( 2U, path.getPathLength() );
ASSERT_EQUALS( "bar.baz", path.getPath( false ) );
}
};
} // namespace FieldPath
class All : public Suite {
public:
All() : Suite( "pipeline" ) {
}
void setupTests() {
add();
add();
add();
add();
add();
add();
add();
add();
add();
add();
add();
add();
add();
add();
add();
add();
add();
add();
add();
}
} myall;
} // namespace PipelineTests