diff --git a/tests/unit/ast_serialization.cpp b/tests/unit/ast_serialization.cpp index e05da4c31..664b7b3ec 100644 --- a/tests/unit/ast_serialization.cpp +++ b/tests/unit/ast_serialization.cpp @@ -30,11 +30,12 @@ using testing::UnorderedElementsAre; // Base class for all test types class Base { public: - explicit Base(const std::string &query) : query_string_(query) {} - ParsingContext context_; Parameters parameters_; - std::string query_string_; + + virtual ~Base() {} + + virtual Query *ParseQuery(const std::string &query_string) = 0; virtual PropertyIx Prop(const std::string &prop_name) = 0; @@ -74,8 +75,8 @@ class Base { class CapnpAstGenerator : public Base { public: - explicit CapnpAstGenerator(const std::string &query) : Base(query) { - ::frontend::opencypher::Parser parser(query); + Query *ParseQuery(const std::string &query_string) override { + ::frontend::opencypher::Parser parser(query_string); AstStorage tmp_storage; CypherMainVisitor visitor(context_, &tmp_storage); visitor.visit(parser.tree()); @@ -90,7 +91,7 @@ class CapnpAstGenerator : public Base { { const query::capnp::Tree::Reader reader = message.getRoot<query::capnp::Tree>(); - query_ = dynamic_cast<Query *>(Load(&storage_, reader)); + return dynamic_cast<Query *>(Load(&storage_, reader)); } } @@ -107,25 +108,22 @@ class CapnpAstGenerator : public Base { } AstStorage storage_; - Query *query_; }; class SlkAstGenerator : public Base { public: - explicit SlkAstGenerator(const std::string &query) : Base(query) { - ::frontend::opencypher::Parser parser(query); + Query *ParseQuery(const std::string &query_string) override { + ::frontend::opencypher::Parser parser(query_string); AstStorage tmp_storage; CypherMainVisitor visitor(context_, &tmp_storage); visitor.visit(parser.tree()); slk::Builder builder; - { - SaveAstPointer(visitor.query(), &builder); - } + { SaveAstPointer(visitor.query(), &builder); } { slk::Reader reader(builder.data(), builder.size()); - query_ = LoadAstPointer<Query>(&storage_, &reader); + return LoadAstPointer<Query>(&storage_, &reader); } } @@ -142,27 +140,47 @@ class SlkAstGenerator : public Base { } AstStorage storage_; - Query *query_; }; -template <typename T> -class CypherMainVisitorTest : public ::testing::Test {}; +class CypherMainVisitorTest + : public ::testing::TestWithParam<std::shared_ptr<Base>> {}; -typedef ::testing::Types<CapnpAstGenerator, SlkAstGenerator> AstGeneratorTypes; +std::shared_ptr<Base> gAstGeneratorTypes[] = { + std::make_shared<CapnpAstGenerator>(), + std::make_shared<SlkAstGenerator>(), +}; -TYPED_TEST_CASE(CypherMainVisitorTest, AstGeneratorTypes); +INSTANTIATE_TEST_CASE_P(AstGeneratorTypes, CypherMainVisitorTest, + ::testing::ValuesIn(gAstGeneratorTypes)); -TYPED_TEST(CypherMainVisitorTest, SyntaxException) { - ASSERT_THROW(TypeParam("CREATE ()-[*1....2]-()"), SyntaxException); +// NOTE: The above used to use *Typed Tests* functionality of gtest library. +// Unfortunately, the compilation time of this test increased to about 1 minute! +// Although using Typed Tests is the recommended way to achieve what we want, we +// are (ab)using *Value-Parameterized Tests* functionality instead. This cuts +// down the compilation time to about 20 seconds. The original code is here for +// future reference in case someone gets the idea to change to *appropriate* +// Typed Tests mechanism and ruin the compilation times. +// +// typedef ::testing::Types<CapnpAstGenerator, SlkAstGenerator> +// AstGeneratorTypes; +// +// TYPED_TEST_CASE(CypherMainVisitorTest, AstGeneratorTypes); + +TEST_P(CypherMainVisitorTest, SyntaxException) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("CREATE ()-[*1....2]-()"), + SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, SyntaxExceptionOnTrailingText) { - ASSERT_THROW(TypeParam("RETURN 2 + 2 mirko"), SyntaxException); +TEST_P(CypherMainVisitorTest, SyntaxExceptionOnTrailingText) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("RETURN 2 + 2 mirko"), SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, PropertyLookup) { - TypeParam ast_generator("RETURN n.x"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, PropertyLookup) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN n.x")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -177,9 +195,10 @@ TYPED_TEST(CypherMainVisitorTest, PropertyLookup) { ASSERT_EQ(property_lookup->property_, ast_generator.Prop("x")); } -TYPED_TEST(CypherMainVisitorTest, LabelsTest) { - TypeParam ast_generator("RETURN n:x:y"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, LabelsTest) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN n:x:y")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -195,9 +214,10 @@ TYPED_TEST(CypherMainVisitorTest, LabelsTest) { ElementsAre(ast_generator.Label("x"), ast_generator.Label("y"))); } -TYPED_TEST(CypherMainVisitorTest, EscapedLabel) { - TypeParam ast_generator("RETURN n:`l-$\"'ab``e````l`"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, EscapedLabel) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN n:`l-$\"'ab``e````l`")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -211,10 +231,11 @@ TYPED_TEST(CypherMainVisitorTest, EscapedLabel) { ElementsAre(ast_generator.Label("l-$\"'ab`e``l"))); } -TYPED_TEST(CypherMainVisitorTest, KeywordLabel) { +TEST_P(CypherMainVisitorTest, KeywordLabel) { for (const auto &label : {"DeLete", "UsER"}) { - TypeParam ast_generator(fmt::format("RETURN n:{}", label)); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery(fmt::format("RETURN n:{}", label))); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -228,9 +249,10 @@ TYPED_TEST(CypherMainVisitorTest, KeywordLabel) { } } -TYPED_TEST(CypherMainVisitorTest, HexLetterLabel) { - TypeParam ast_generator("RETURN n:a"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, HexLetterLabel) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN n:a")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -243,9 +265,10 @@ TYPED_TEST(CypherMainVisitorTest, HexLetterLabel) { ASSERT_THAT(labels_test->labels_, ElementsAre(ast_generator.Label("a"))); } -TYPED_TEST(CypherMainVisitorTest, ReturnNoDistinctNoBagSemantics) { - TypeParam ast_generator("RETURN x"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, ReturnNoDistinctNoBagSemantics) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN x")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -259,9 +282,10 @@ TYPED_TEST(CypherMainVisitorTest, ReturnNoDistinctNoBagSemantics) { ASSERT_FALSE(return_clause->body_.distinct); } -TYPED_TEST(CypherMainVisitorTest, ReturnDistinct) { - TypeParam ast_generator("RETURN DISTINCT x"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, ReturnDistinct) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN DISTINCT x")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -270,9 +294,10 @@ TYPED_TEST(CypherMainVisitorTest, ReturnDistinct) { ASSERT_TRUE(return_clause->body_.distinct); } -TYPED_TEST(CypherMainVisitorTest, ReturnLimit) { - TypeParam ast_generator("RETURN x LIMIT 5"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, ReturnLimit) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN x LIMIT 5")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -282,9 +307,10 @@ TYPED_TEST(CypherMainVisitorTest, ReturnLimit) { ast_generator.CheckLiteral(return_clause->body_.limit, 5); } -TYPED_TEST(CypherMainVisitorTest, ReturnSkip) { - TypeParam ast_generator("RETURN x SKIP 5"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, ReturnSkip) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN x SKIP 5")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -294,9 +320,10 @@ TYPED_TEST(CypherMainVisitorTest, ReturnSkip) { ast_generator.CheckLiteral(return_clause->body_.skip, 5); } -TYPED_TEST(CypherMainVisitorTest, ReturnOrderBy) { - TypeParam ast_generator("RETURN x, y, z ORDER BY z ASC, x, y DESC"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, ReturnOrderBy) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN x, y, z ORDER BY z ASC, x, y DESC")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -313,9 +340,10 @@ TYPED_TEST(CypherMainVisitorTest, ReturnOrderBy) { Pair(Ordering::DESC, "y"))); } -TYPED_TEST(CypherMainVisitorTest, ReturnNamedIdentifier) { - TypeParam ast_generator("RETURN var AS var5"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, ReturnNamedIdentifier) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN var AS var5")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -327,9 +355,10 @@ TYPED_TEST(CypherMainVisitorTest, ReturnNamedIdentifier) { ASSERT_EQ(identifier->name_, "var"); } -TYPED_TEST(CypherMainVisitorTest, ReturnAsterisk) { - TypeParam ast_generator("RETURN *"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, ReturnAsterisk) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN *")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -338,9 +367,10 @@ TYPED_TEST(CypherMainVisitorTest, ReturnAsterisk) { ASSERT_EQ(return_clause->body_.named_expressions.size(), 0U); } -TYPED_TEST(CypherMainVisitorTest, IntegerLiteral) { - TypeParam ast_generator("RETURN 42"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, IntegerLiteral) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN 42")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -349,14 +379,16 @@ TYPED_TEST(CypherMainVisitorTest, IntegerLiteral) { return_clause->body_.named_expressions[0]->expression_, 42, 1); } -TYPED_TEST(CypherMainVisitorTest, IntegerLiteralTooLarge) { - ASSERT_THROW(TypeParam("RETURN 10000000000000000000000000"), +TEST_P(CypherMainVisitorTest, IntegerLiteralTooLarge) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("RETURN 10000000000000000000000000"), SemanticException); } -TYPED_TEST(CypherMainVisitorTest, BooleanLiteralTrue) { - TypeParam ast_generator("RETURN TrUe"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, BooleanLiteralTrue) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN TrUe")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -365,9 +397,10 @@ TYPED_TEST(CypherMainVisitorTest, BooleanLiteralTrue) { return_clause->body_.named_expressions[0]->expression_, true, 1); } -TYPED_TEST(CypherMainVisitorTest, BooleanLiteralFalse) { - TypeParam ast_generator("RETURN faLSE"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, BooleanLiteralFalse) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN faLSE")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -376,9 +409,10 @@ TYPED_TEST(CypherMainVisitorTest, BooleanLiteralFalse) { return_clause->body_.named_expressions[0]->expression_, false, 1); } -TYPED_TEST(CypherMainVisitorTest, NullLiteral) { - TypeParam ast_generator("RETURN nULl"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, NullLiteral) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN nULl")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -388,9 +422,10 @@ TYPED_TEST(CypherMainVisitorTest, NullLiteral) { 1); } -TYPED_TEST(CypherMainVisitorTest, ParenthesizedExpression) { - TypeParam ast_generator("RETURN (2)"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, ParenthesizedExpression) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN (2)")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -399,9 +434,10 @@ TYPED_TEST(CypherMainVisitorTest, ParenthesizedExpression) { return_clause->body_.named_expressions[0]->expression_, 2); } -TYPED_TEST(CypherMainVisitorTest, OrOperator) { - TypeParam ast_generator("RETURN true Or false oR n"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, OrOperator) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN true Or false oR n")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -419,9 +455,10 @@ TYPED_TEST(CypherMainVisitorTest, OrOperator) { ASSERT_EQ(operand3->name_, "n"); } -TYPED_TEST(CypherMainVisitorTest, XorOperator) { - TypeParam ast_generator("RETURN true xOr false"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, XorOperator) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN true xOr false")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -432,9 +469,10 @@ TYPED_TEST(CypherMainVisitorTest, XorOperator) { ast_generator.CheckLiteral(xor_operator->expression2_, false); } -TYPED_TEST(CypherMainVisitorTest, AndOperator) { - TypeParam ast_generator("RETURN true and false"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, AndOperator) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN true and false")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -445,9 +483,10 @@ TYPED_TEST(CypherMainVisitorTest, AndOperator) { ast_generator.CheckLiteral(and_operator->expression2_, false); } -TYPED_TEST(CypherMainVisitorTest, AdditionSubtractionOperators) { - TypeParam ast_generator("RETURN 1 - 2 + 3"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, AdditionSubtractionOperators) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN 1 - 2 + 3")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -463,9 +502,10 @@ TYPED_TEST(CypherMainVisitorTest, AdditionSubtractionOperators) { ast_generator.CheckLiteral(addition_operator->expression2_, 3); } -TYPED_TEST(CypherMainVisitorTest, MulitplicationOperator) { - TypeParam ast_generator("RETURN 2 * 3"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, MulitplicationOperator) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN 2 * 3")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -476,9 +516,10 @@ TYPED_TEST(CypherMainVisitorTest, MulitplicationOperator) { ast_generator.CheckLiteral(mult_operator->expression2_, 3); } -TYPED_TEST(CypherMainVisitorTest, DivisionOperator) { - TypeParam ast_generator("RETURN 2 / 3"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, DivisionOperator) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN 2 / 3")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -489,9 +530,10 @@ TYPED_TEST(CypherMainVisitorTest, DivisionOperator) { ast_generator.CheckLiteral(div_operator->expression2_, 3); } -TYPED_TEST(CypherMainVisitorTest, ModOperator) { - TypeParam ast_generator("RETURN 2 % 3"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, ModOperator) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN 2 % 3")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -513,9 +555,10 @@ TYPED_TEST(CypherMainVisitorTest, ModOperator) { ast_generator.CheckLiteral(cmp_operator->expression2_, VALUE2); \ } while (0) -TYPED_TEST(CypherMainVisitorTest, ComparisonOperators) { - TypeParam ast_generator("RETURN 2 = 3 != 4 <> 5 < 6 > 7 <= 8 >= 9"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, ComparisonOperators) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN 2 = 3 != 4 <> 5 < 6 > 7 <= 8 >= 9")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -536,9 +579,10 @@ TYPED_TEST(CypherMainVisitorTest, ComparisonOperators) { #undef CHECK_COMPARISON -TYPED_TEST(CypherMainVisitorTest, ListIndexing) { - TypeParam ast_generator("RETURN [1,2,3] [ 2 ]"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, ListIndexing) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN [1,2,3] [ 2 ]")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -551,13 +595,16 @@ TYPED_TEST(CypherMainVisitorTest, ListIndexing) { ast_generator.CheckLiteral(list_index_op->expression2_, 2); } -TYPED_TEST(CypherMainVisitorTest, ListSlicingOperatorNoBounds) { - ASSERT_THROW(TypeParam("RETURN [1,2,3] [ .. ]"), SemanticException); +TEST_P(CypherMainVisitorTest, ListSlicingOperatorNoBounds) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("RETURN [1,2,3] [ .. ]"), + SemanticException); } -TYPED_TEST(CypherMainVisitorTest, ListSlicingOperator) { - TypeParam ast_generator("RETURN [1,2,3] [ .. 2 ]"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, ListSlicingOperator) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN [1,2,3] [ .. 2 ]")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -571,9 +618,10 @@ TYPED_TEST(CypherMainVisitorTest, ListSlicingOperator) { ast_generator.CheckLiteral(list_slicing_op->upper_bound_, 2); } -TYPED_TEST(CypherMainVisitorTest, InListOperator) { - TypeParam ast_generator("RETURN 5 IN [1,2]"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, InListOperator) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN 5 IN [1,2]")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -586,9 +634,10 @@ TYPED_TEST(CypherMainVisitorTest, InListOperator) { ASSERT_TRUE(list); } -TYPED_TEST(CypherMainVisitorTest, InWithListIndexing) { - TypeParam ast_generator("RETURN 1 IN [[1,2]][0]"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, InWithListIndexing) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN 1 IN [[1,2]][0]")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -605,10 +654,10 @@ TYPED_TEST(CypherMainVisitorTest, InWithListIndexing) { ast_generator.CheckLiteral(list_indexing->expression2_, 0); } -TYPED_TEST(CypherMainVisitorTest, CaseGenericForm) { - TypeParam ast_generator( - "RETURN CASE WHEN n < 10 THEN 1 WHEN n > 10 THEN 2 END"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, CaseGenericForm) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>(ast_generator.ParseQuery( + "RETURN CASE WHEN n < 10 THEN 1 WHEN n > 10 THEN 2 END")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -629,9 +678,10 @@ TYPED_TEST(CypherMainVisitorTest, CaseGenericForm) { ast_generator.CheckLiteral(if_operator2->else_expression_, TypedValue::Null); } -TYPED_TEST(CypherMainVisitorTest, CaseGenericFormElse) { - TypeParam ast_generator("RETURN CASE WHEN n < 10 THEN 1 ELSE 2 END"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, CaseGenericFormElse) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN CASE WHEN n < 10 THEN 1 ELSE 2 END")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -644,9 +694,10 @@ TYPED_TEST(CypherMainVisitorTest, CaseGenericFormElse) { ast_generator.CheckLiteral(if_operator->else_expression_, 2); } -TYPED_TEST(CypherMainVisitorTest, CaseSimpleForm) { - TypeParam ast_generator("RETURN CASE 5 WHEN 10 THEN 1 END"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, CaseSimpleForm) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN CASE 5 WHEN 10 THEN 1 END")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -661,9 +712,10 @@ TYPED_TEST(CypherMainVisitorTest, CaseSimpleForm) { ast_generator.CheckLiteral(if_operator->else_expression_, TypedValue::Null); } -TYPED_TEST(CypherMainVisitorTest, IsNull) { - TypeParam ast_generator("RETURN 2 iS NulL"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, IsNull) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN 2 iS NulL")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -673,9 +725,10 @@ TYPED_TEST(CypherMainVisitorTest, IsNull) { ast_generator.CheckLiteral(is_type_operator->expression_, 2); } -TYPED_TEST(CypherMainVisitorTest, IsNotNull) { - TypeParam ast_generator("RETURN 2 iS nOT NulL"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, IsNotNull) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN 2 iS nOT NulL")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -687,9 +740,10 @@ TYPED_TEST(CypherMainVisitorTest, IsNotNull) { ast_generator.CheckLiteral(is_type_operator->expression_, 2); } -TYPED_TEST(CypherMainVisitorTest, NotOperator) { - TypeParam ast_generator("RETURN not true"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, NotOperator) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN not true")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -699,9 +753,10 @@ TYPED_TEST(CypherMainVisitorTest, NotOperator) { ast_generator.CheckLiteral(not_operator->expression_, true); } -TYPED_TEST(CypherMainVisitorTest, UnaryMinusPlusOperators) { - TypeParam ast_generator("RETURN -+5"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, UnaryMinusPlusOperators) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN -+5")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -715,10 +770,10 @@ TYPED_TEST(CypherMainVisitorTest, UnaryMinusPlusOperators) { ast_generator.CheckLiteral(unary_plus_operator->expression_, 5); } -TYPED_TEST(CypherMainVisitorTest, Aggregation) { - TypeParam ast_generator( - "RETURN COUNT(a), MIN(b), MAX(c), SUM(d), AVG(e), COLLECT(f), COUNT(*)"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, Aggregation) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>(ast_generator.ParseQuery( + "RETURN COUNT(a), MIN(b), MAX(c), SUM(d), AVG(e), COLLECT(f), COUNT(*)")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -745,16 +800,19 @@ TYPED_TEST(CypherMainVisitorTest, Aggregation) { ASSERT_FALSE(aggregation->expression1_); } -TYPED_TEST(CypherMainVisitorTest, UndefinedFunction) { - ASSERT_THROW(TypeParam("RETURN " - "IHopeWeWillNeverHaveAwesomeMemgraphProcedureWithS" - "uchALongAndAwesomeNameSinceThisTestWouldFail(1)"), +TEST_P(CypherMainVisitorTest, UndefinedFunction) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery( + "RETURN " + "IHopeWeWillNeverHaveAwesomeMemgraphProcedureWithS" + "uchALongAndAwesomeNameSinceThisTestWouldFail(1)"), SemanticException); } -TYPED_TEST(CypherMainVisitorTest, Function) { - TypeParam ast_generator("RETURN abs(n, 2)"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, Function) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN abs(n, 2)")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -766,9 +824,10 @@ TYPED_TEST(CypherMainVisitorTest, Function) { ASSERT_TRUE(function->function_); } -TYPED_TEST(CypherMainVisitorTest, StringLiteralDoubleQuotes) { - TypeParam ast_generator("RETURN \"mi'rko\""); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, StringLiteralDoubleQuotes) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN \"mi'rko\"")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -777,9 +836,10 @@ TYPED_TEST(CypherMainVisitorTest, StringLiteralDoubleQuotes) { return_clause->body_.named_expressions[0]->expression_, "mi'rko", 1); } -TYPED_TEST(CypherMainVisitorTest, StringLiteralSingleQuotes) { - TypeParam ast_generator("RETURN 'mi\"rko'"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, StringLiteralSingleQuotes) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN 'mi\"rko'")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -788,9 +848,10 @@ TYPED_TEST(CypherMainVisitorTest, StringLiteralSingleQuotes) { return_clause->body_.named_expressions[0]->expression_, "mi\"rko", 1); } -TYPED_TEST(CypherMainVisitorTest, StringLiteralEscapedChars) { - TypeParam ast_generator("RETURN '\\\\\\'\\\"\\b\\B\\f\\F\\n\\N\\r\\R\\t\\T'"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, StringLiteralEscapedChars) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>(ast_generator.ParseQuery( + "RETURN '\\\\\\'\\\"\\b\\B\\f\\F\\n\\N\\r\\R\\t\\T'")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -800,9 +861,10 @@ TYPED_TEST(CypherMainVisitorTest, StringLiteralEscapedChars) { "\\'\"\b\b\f\f\n\n\r\r\t\t", 1); } -TYPED_TEST(CypherMainVisitorTest, StringLiteralEscapedUtf16) { - TypeParam ast_generator("RETURN '\\u221daaa\\u221daaa'"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, StringLiteralEscapedUtf16) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN '\\u221daaa\\u221daaa'")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -812,13 +874,16 @@ TYPED_TEST(CypherMainVisitorTest, StringLiteralEscapedUtf16) { u8"\u221daaa\u221daaa", 1); } -TYPED_TEST(CypherMainVisitorTest, StringLiteralEscapedUtf16Error) { - ASSERT_THROW(TypeParam("RETURN '\\U221daaa'"), SyntaxException); +TEST_P(CypherMainVisitorTest, StringLiteralEscapedUtf16Error) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("RETURN '\\U221daaa'"), + SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, StringLiteralEscapedUtf32) { - TypeParam ast_generator("RETURN '\\U0001F600aaaa\\U0001F600aaaaaaaa'"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, StringLiteralEscapedUtf32) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN '\\U0001F600aaaa\\U0001F600aaaaaaaa'")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -828,9 +893,10 @@ TYPED_TEST(CypherMainVisitorTest, StringLiteralEscapedUtf32) { u8"\U0001F600aaaa\U0001F600aaaaaaaa", 1); } -TYPED_TEST(CypherMainVisitorTest, DoubleLiteral) { - TypeParam ast_generator("RETURN 3.5"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, DoubleLiteral) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN 3.5")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -839,9 +905,10 @@ TYPED_TEST(CypherMainVisitorTest, DoubleLiteral) { return_clause->body_.named_expressions[0]->expression_, 3.5, 1); } -TYPED_TEST(CypherMainVisitorTest, DoubleLiteralExponent) { - TypeParam ast_generator("RETURN 5e-1"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, DoubleLiteralExponent) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN 5e-1")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -850,9 +917,10 @@ TYPED_TEST(CypherMainVisitorTest, DoubleLiteralExponent) { return_clause->body_.named_expressions[0]->expression_, 0.5, 1); } -TYPED_TEST(CypherMainVisitorTest, ListLiteral) { - TypeParam ast_generator("RETURN [3, [], 'johhny']"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, ListLiteral) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN [3, [], 'johhny']")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -868,9 +936,10 @@ TYPED_TEST(CypherMainVisitorTest, ListLiteral) { ast_generator.CheckLiteral(list_literal->elements_[2], "johhny"); } -TYPED_TEST(CypherMainVisitorTest, MapLiteral) { - TypeParam ast_generator("RETURN {a: 1, b: 'bla', c: [1, {a: 42}]}"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, MapLiteral) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN {a: 1, b: 'bla', c: [1, {a: 42}]}")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -892,10 +961,10 @@ TYPED_TEST(CypherMainVisitorTest, MapLiteral) { EXPECT_EQ(1, elem_2_1->elements_.size()); } -TYPED_TEST(CypherMainVisitorTest, NodePattern) { - TypeParam ast_generator( - "MATCH (:label1:label2:label3 {a : 5, b : 10}) RETURN 1"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, NodePattern) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>(ast_generator.ParseQuery( + "MATCH (:label1:label2:label3 {a : 5, b : 10}) RETURN 1")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -928,13 +997,16 @@ TYPED_TEST(CypherMainVisitorTest, NodePattern) { Pair(ast_generator.Prop("b"), 10))); } -TYPED_TEST(CypherMainVisitorTest, PropertyMapSameKeyAppearsTwice) { - EXPECT_THROW(TypeParam("MATCH ({a : 1, a : 2})"), SemanticException); +TEST_P(CypherMainVisitorTest, PropertyMapSameKeyAppearsTwice) { + auto &ast_generator = *GetParam(); + EXPECT_THROW(ast_generator.ParseQuery("MATCH ({a : 1, a : 2})"), + SemanticException); } -TYPED_TEST(CypherMainVisitorTest, NodePatternIdentifier) { - TypeParam ast_generator("MATCH (var) RETURN 1"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, NodePatternIdentifier) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("MATCH (var) RETURN 1")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -951,9 +1023,10 @@ TYPED_TEST(CypherMainVisitorTest, NodePatternIdentifier) { EXPECT_THAT(node->properties_, UnorderedElementsAre()); } -TYPED_TEST(CypherMainVisitorTest, RelationshipPatternNoDetails) { - TypeParam ast_generator("MATCH ()--() RETURN 1"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, RelationshipPatternNoDetails) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("MATCH ()--() RETURN 1")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -978,9 +1051,10 @@ TYPED_TEST(CypherMainVisitorTest, RelationshipPatternNoDetails) { } // PatternPart in braces. -TYPED_TEST(CypherMainVisitorTest, PatternPartBraces) { - TypeParam ast_generator("MATCH ((()--())) RETURN 1"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, PatternPartBraces) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("MATCH ((()--())) RETURN 1")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1003,10 +1077,10 @@ TYPED_TEST(CypherMainVisitorTest, PatternPartBraces) { EXPECT_FALSE(edge->identifier_->user_declared_); } -TYPED_TEST(CypherMainVisitorTest, RelationshipPatternDetails) { - TypeParam ast_generator( - "MATCH ()<-[:type1|type2 {a : 5, b : 10}]-() RETURN 1"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, RelationshipPatternDetails) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>(ast_generator.ParseQuery( + "MATCH ()<-[:type1|type2 {a : 5, b : 10}]-() RETURN 1")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1031,9 +1105,10 @@ TYPED_TEST(CypherMainVisitorTest, RelationshipPatternDetails) { Pair(ast_generator.Prop("b"), 10))); } -TYPED_TEST(CypherMainVisitorTest, RelationshipPatternVariable) { - TypeParam ast_generator("MATCH ()-[var]->() RETURN 1"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, RelationshipPatternVariable) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("MATCH ()-[var]->() RETURN 1")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1059,9 +1134,10 @@ void AssertMatchSingleEdgeAtom(Match *match, EdgeAtom *&edge) { ASSERT_TRUE(edge); } -TYPED_TEST(CypherMainVisitorTest, RelationshipPatternUnbounded) { - TypeParam ast_generator("MATCH ()-[r*]->() RETURN r"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, RelationshipPatternUnbounded) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("MATCH ()-[r*]->() RETURN r")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1074,9 +1150,10 @@ TYPED_TEST(CypherMainVisitorTest, RelationshipPatternUnbounded) { EXPECT_EQ(edge->upper_bound_, nullptr); } -TYPED_TEST(CypherMainVisitorTest, RelationshipPatternLowerBounded) { - TypeParam ast_generator("MATCH ()-[r*42..]->() RETURN r"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, RelationshipPatternLowerBounded) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("MATCH ()-[r*42..]->() RETURN r")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1089,9 +1166,10 @@ TYPED_TEST(CypherMainVisitorTest, RelationshipPatternLowerBounded) { EXPECT_EQ(edge->upper_bound_, nullptr); } -TYPED_TEST(CypherMainVisitorTest, RelationshipPatternUpperBounded) { - TypeParam ast_generator("MATCH ()-[r*..42]->() RETURN r"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, RelationshipPatternUpperBounded) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("MATCH ()-[r*..42]->() RETURN r")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1104,9 +1182,10 @@ TYPED_TEST(CypherMainVisitorTest, RelationshipPatternUpperBounded) { ast_generator.CheckLiteral(edge->upper_bound_, 42); } -TYPED_TEST(CypherMainVisitorTest, RelationshipPatternLowerUpperBounded) { - TypeParam ast_generator("MATCH ()-[r*24..42]->() RETURN r"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, RelationshipPatternLowerUpperBounded) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("MATCH ()-[r*24..42]->() RETURN r")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1119,9 +1198,10 @@ TYPED_TEST(CypherMainVisitorTest, RelationshipPatternLowerUpperBounded) { ast_generator.CheckLiteral(edge->upper_bound_, 42); } -TYPED_TEST(CypherMainVisitorTest, RelationshipPatternFixedRange) { - TypeParam ast_generator("MATCH ()-[r*42]->() RETURN r"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, RelationshipPatternFixedRange) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("MATCH ()-[r*42]->() RETURN r")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1134,10 +1214,11 @@ TYPED_TEST(CypherMainVisitorTest, RelationshipPatternFixedRange) { ast_generator.CheckLiteral(edge->upper_bound_, 42); } -TYPED_TEST(CypherMainVisitorTest, RelationshipPatternFloatingUpperBound) { +TEST_P(CypherMainVisitorTest, RelationshipPatternFloatingUpperBound) { // [r*1...2] should be parsed as [r*1..0.2] - TypeParam ast_generator("MATCH ()-[r*1...2]->() RETURN r"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("MATCH ()-[r*1...2]->() RETURN r")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1150,9 +1231,10 @@ TYPED_TEST(CypherMainVisitorTest, RelationshipPatternFloatingUpperBound) { ast_generator.CheckLiteral(edge->upper_bound_, 0.2); } -TYPED_TEST(CypherMainVisitorTest, RelationshipPatternUnboundedWithProperty) { - TypeParam ast_generator("MATCH ()-[r* {prop: 42}]->() RETURN r"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, RelationshipPatternUnboundedWithProperty) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("MATCH ()-[r* {prop: 42}]->() RETURN r")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1166,10 +1248,11 @@ TYPED_TEST(CypherMainVisitorTest, RelationshipPatternUnboundedWithProperty) { ast_generator.CheckLiteral(edge->properties_[ast_generator.Prop("prop")], 42); } -TYPED_TEST(CypherMainVisitorTest, - RelationshipPatternDotsUnboundedWithEdgeTypeProperty) { - TypeParam ast_generator("MATCH ()-[r:edge_type*..{prop: 42}]->() RETURN r"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, + RelationshipPatternDotsUnboundedWithEdgeTypeProperty) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>(ast_generator.ParseQuery( + "MATCH ()-[r:edge_type*..{prop: 42}]->() RETURN r")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1186,9 +1269,10 @@ TYPED_TEST(CypherMainVisitorTest, EXPECT_EQ(edge->edge_types_[0], edge_type); } -TYPED_TEST(CypherMainVisitorTest, RelationshipPatternUpperBoundedWithProperty) { - TypeParam ast_generator("MATCH ()-[r*..2{prop: 42}]->() RETURN r"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, RelationshipPatternUpperBoundedWithProperty) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("MATCH ()-[r*..2{prop: 42}]->() RETURN r")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1202,9 +1286,10 @@ TYPED_TEST(CypherMainVisitorTest, RelationshipPatternUpperBoundedWithProperty) { ast_generator.CheckLiteral(edge->properties_[ast_generator.Prop("prop")], 42); } -TYPED_TEST(CypherMainVisitorTest, ReturnUnanemdIdentifier) { - TypeParam ast_generator("RETURN var"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, ReturnUnanemdIdentifier) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN var")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1221,9 +1306,10 @@ TYPED_TEST(CypherMainVisitorTest, ReturnUnanemdIdentifier) { ASSERT_TRUE(identifier->user_declared_); } -TYPED_TEST(CypherMainVisitorTest, Create) { - TypeParam ast_generator("CREATE (n)"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, Create) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("CREATE (n)")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1239,9 +1325,10 @@ TYPED_TEST(CypherMainVisitorTest, Create) { ASSERT_EQ(node->identifier_->name_, "n"); } -TYPED_TEST(CypherMainVisitorTest, Delete) { - TypeParam ast_generator("DELETE n, m"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, Delete) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("DELETE n, m")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1258,9 +1345,10 @@ TYPED_TEST(CypherMainVisitorTest, Delete) { ASSERT_EQ(identifier2->name_, "m"); } -TYPED_TEST(CypherMainVisitorTest, DeleteDetach) { - TypeParam ast_generator("DETACH DELETE n"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, DeleteDetach) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("DETACH DELETE n")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1274,9 +1362,10 @@ TYPED_TEST(CypherMainVisitorTest, DeleteDetach) { ASSERT_EQ(identifier1->name_, "n"); } -TYPED_TEST(CypherMainVisitorTest, OptionalMatchWhere) { - TypeParam ast_generator("OPTIONAL MATCH (n) WHERE m RETURN 1"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, OptionalMatchWhere) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("OPTIONAL MATCH (n) WHERE m RETURN 1")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1290,9 +1379,10 @@ TYPED_TEST(CypherMainVisitorTest, OptionalMatchWhere) { ASSERT_EQ(identifier->name_, "m"); } -TYPED_TEST(CypherMainVisitorTest, Set) { - TypeParam ast_generator("SET a.x = b, c = d, e += f, g : h : i "); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, Set) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("SET a.x = b, c = d, e += f, g : h : i ")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1347,9 +1437,10 @@ TYPED_TEST(CypherMainVisitorTest, Set) { } } -TYPED_TEST(CypherMainVisitorTest, Remove) { - TypeParam ast_generator("REMOVE a.x, g : h : i"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, Remove) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("REMOVE a.x, g : h : i")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1378,9 +1469,10 @@ TYPED_TEST(CypherMainVisitorTest, Remove) { } } -TYPED_TEST(CypherMainVisitorTest, With) { - TypeParam ast_generator("WITH n AS m RETURN 1"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, With) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("WITH n AS m RETURN 1")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1399,13 +1491,16 @@ TYPED_TEST(CypherMainVisitorTest, With) { ASSERT_EQ(identifier->name_, "n"); } -TYPED_TEST(CypherMainVisitorTest, WithNonAliasedExpression) { - ASSERT_THROW(TypeParam("WITH n.x RETURN 1"), SemanticException); +TEST_P(CypherMainVisitorTest, WithNonAliasedExpression) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("WITH n.x RETURN 1"), + SemanticException); } -TYPED_TEST(CypherMainVisitorTest, WithNonAliasedVariable) { - TypeParam ast_generator("WITH n RETURN 1"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, WithNonAliasedVariable) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("WITH n RETURN 1")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1419,9 +1514,10 @@ TYPED_TEST(CypherMainVisitorTest, WithNonAliasedVariable) { ASSERT_EQ(identifier->name_, "n"); } -TYPED_TEST(CypherMainVisitorTest, WithDistinct) { - TypeParam ast_generator("WITH DISTINCT n AS m RETURN 1"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, WithDistinct) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("WITH DISTINCT n AS m RETURN 1")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1436,9 +1532,10 @@ TYPED_TEST(CypherMainVisitorTest, WithDistinct) { ASSERT_EQ(identifier->name_, "n"); } -TYPED_TEST(CypherMainVisitorTest, WithBag) { - TypeParam ast_generator("WITH n as m ORDER BY m SKIP 1 LIMIT 2 RETURN 1"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, WithBag) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>(ast_generator.ParseQuery( + "WITH n as m ORDER BY m SKIP 1 LIMIT 2 RETURN 1")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1453,9 +1550,10 @@ TYPED_TEST(CypherMainVisitorTest, WithBag) { ASSERT_TRUE(with->body_.skip); } -TYPED_TEST(CypherMainVisitorTest, WithWhere) { - TypeParam ast_generator("WITH n AS m WHERE k RETURN 1"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, WithWhere) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("WITH n AS m WHERE k RETURN 1")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1473,9 +1571,10 @@ TYPED_TEST(CypherMainVisitorTest, WithWhere) { ASSERT_EQ(identifier2->name_, "n"); } -TYPED_TEST(CypherMainVisitorTest, WithAnonymousVariableCapture) { - TypeParam ast_generator("WITH 5 as anon1 MATCH () return *"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, WithAnonymousVariableCapture) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("WITH 5 as anon1 MATCH () return *")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1491,55 +1590,65 @@ TYPED_TEST(CypherMainVisitorTest, WithAnonymousVariableCapture) { ASSERT_NE("anon1", atom->identifier_->name_); } -TYPED_TEST(CypherMainVisitorTest, ClausesOrdering) { +TEST_P(CypherMainVisitorTest, ClausesOrdering) { // Obviously some of the ridiculous combinations don't fail here, but they // will fail in semantic analysis or they make perfect sense as a part of // bigger query. - TypeParam("RETURN 1"); - ASSERT_THROW(TypeParam("RETURN 1 RETURN 1"), SemanticException); - ASSERT_THROW(TypeParam("RETURN 1 MATCH (n) RETURN n"), SemanticException); - ASSERT_THROW(TypeParam("RETURN 1 DELETE n"), SemanticException); - ASSERT_THROW(TypeParam("RETURN 1 MERGE (n)"), SemanticException); - ASSERT_THROW(TypeParam("RETURN 1 WITH n AS m RETURN 1"), SemanticException); - ASSERT_THROW(TypeParam("RETURN 1 AS n UNWIND n AS x RETURN x"), + auto &ast_generator = *GetParam(); + ast_generator.ParseQuery("RETURN 1"); + ASSERT_THROW(ast_generator.ParseQuery("RETURN 1 RETURN 1"), + SemanticException); + ASSERT_THROW(ast_generator.ParseQuery("RETURN 1 MATCH (n) RETURN n"), + SemanticException); + ASSERT_THROW(ast_generator.ParseQuery("RETURN 1 DELETE n"), + SemanticException); + ASSERT_THROW(ast_generator.ParseQuery("RETURN 1 MERGE (n)"), + SemanticException); + ASSERT_THROW(ast_generator.ParseQuery("RETURN 1 WITH n AS m RETURN 1"), + SemanticException); + ASSERT_THROW(ast_generator.ParseQuery("RETURN 1 AS n UNWIND n AS x RETURN x"), SemanticException); - ASSERT_THROW(TypeParam("OPTIONAL MATCH (n) MATCH (m) RETURN n, m"), + ASSERT_THROW( + ast_generator.ParseQuery("OPTIONAL MATCH (n) MATCH (m) RETURN n, m"), + SemanticException); + ast_generator.ParseQuery("OPTIONAL MATCH (n) WITH n MATCH (m) RETURN n, m"); + ast_generator.ParseQuery("OPTIONAL MATCH (n) OPTIONAL MATCH (m) RETURN n, m"); + ast_generator.ParseQuery("MATCH (n) OPTIONAL MATCH (m) RETURN n, m"); + + ast_generator.ParseQuery("CREATE (n)"); + ASSERT_THROW(ast_generator.ParseQuery("SET n:x MATCH (n) RETURN n"), SemanticException); - TypeParam("OPTIONAL MATCH (n) WITH n MATCH (m) RETURN n, m"); - TypeParam("OPTIONAL MATCH (n) OPTIONAL MATCH (m) RETURN n, m"); - TypeParam("MATCH (n) OPTIONAL MATCH (m) RETURN n, m"); + ast_generator.ParseQuery("REMOVE n.x SET n.x = 1"); + ast_generator.ParseQuery("REMOVE n:L RETURN n"); + ast_generator.ParseQuery("SET n.x = 1 WITH n AS m RETURN m"); - TypeParam("CREATE (n)"); - ASSERT_THROW(TypeParam("SET n:x MATCH (n) RETURN n"), SemanticException); - TypeParam("REMOVE n.x SET n.x = 1"); - TypeParam("REMOVE n:L RETURN n"); - TypeParam("SET n.x = 1 WITH n AS m RETURN m"); + ASSERT_THROW(ast_generator.ParseQuery("MATCH (n)"), SemanticException); + ast_generator.ParseQuery("MATCH (n) MATCH (n) RETURN n"); + ast_generator.ParseQuery("MATCH (n) SET n = m"); + ast_generator.ParseQuery("MATCH (n) RETURN n"); + ast_generator.ParseQuery("MATCH (n) WITH n AS m RETURN m"); - ASSERT_THROW(TypeParam("MATCH (n)"), SemanticException); - TypeParam("MATCH (n) MATCH (n) RETURN n"); - TypeParam("MATCH (n) SET n = m"); - TypeParam("MATCH (n) RETURN n"); - TypeParam("MATCH (n) WITH n AS m RETURN m"); + ASSERT_THROW(ast_generator.ParseQuery("WITH 1 AS n"), SemanticException); + ast_generator.ParseQuery("WITH 1 AS n WITH n AS m RETURN m"); + ast_generator.ParseQuery("WITH 1 AS n RETURN n"); + ast_generator.ParseQuery("WITH 1 AS n SET n += m"); + ast_generator.ParseQuery("WITH 1 AS n MATCH (n) RETURN n"); - ASSERT_THROW(TypeParam("WITH 1 AS n"), SemanticException); - TypeParam("WITH 1 AS n WITH n AS m RETURN m"); - TypeParam("WITH 1 AS n RETURN n"); - TypeParam("WITH 1 AS n SET n += m"); - TypeParam("WITH 1 AS n MATCH (n) RETURN n"); - - ASSERT_THROW(TypeParam("UNWIND [1,2,3] AS x"), SemanticException); - ASSERT_THROW(TypeParam("CREATE (n) UNWIND [1,2,3] AS x RETURN x"), + ASSERT_THROW(ast_generator.ParseQuery("UNWIND [1,2,3] AS x"), SemanticException); - TypeParam("UNWIND [1,2,3] AS x CREATE (n) RETURN x"); - TypeParam("CREATE (n) WITH n UNWIND [1,2,3] AS x RETURN x"); + ASSERT_THROW( + ast_generator.ParseQuery("CREATE (n) UNWIND [1,2,3] AS x RETURN x"), + SemanticException); + ast_generator.ParseQuery("UNWIND [1,2,3] AS x CREATE (n) RETURN x"); + ast_generator.ParseQuery("CREATE (n) WITH n UNWIND [1,2,3] AS x RETURN x"); } -TYPED_TEST(CypherMainVisitorTest, Merge) { - TypeParam ast_generator( - "MERGE (a) -[:r]- (b) ON MATCH SET a.x = b.x " - "ON CREATE SET b :label ON MATCH SET b = a"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, Merge) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("MERGE (a) -[:r]- (b) ON MATCH SET a.x = b.x " + "ON CREATE SET b :label ON MATCH SET b = a")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1554,9 +1663,10 @@ TYPED_TEST(CypherMainVisitorTest, Merge) { EXPECT_TRUE(dynamic_cast<SetLabels *>(merge->on_create_[0])); } -TYPED_TEST(CypherMainVisitorTest, Unwind) { - TypeParam ast_generator("UNWIND [1,2,3] AS elem RETURN elem"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, Unwind) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("UNWIND [1,2,3] AS elem RETURN elem")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1572,13 +1682,16 @@ TYPED_TEST(CypherMainVisitorTest, Unwind) { ASSERT_TRUE(dynamic_cast<ListLiteral *>(expr)); } -TYPED_TEST(CypherMainVisitorTest, UnwindWithoutAsError) { - EXPECT_THROW(TypeParam("UNWIND [1,2,3] RETURN 42"), SyntaxException); +TEST_P(CypherMainVisitorTest, UnwindWithoutAsError) { + auto &ast_generator = *GetParam(); + EXPECT_THROW(ast_generator.ParseQuery("UNWIND [1,2,3] RETURN 42"), + SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, CreateIndex) { - TypeParam ast_generator("Create InDeX oN :mirko(slavko)"); - auto *index_query = dynamic_cast<IndexQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, CreateIndex) { + auto &ast_generator = *GetParam(); + auto *index_query = dynamic_cast<IndexQuery *>( + ast_generator.ParseQuery("Create InDeX oN :mirko(slavko)")); ASSERT_TRUE(index_query); EXPECT_EQ(index_query->action_, IndexQuery::Action::CREATE); EXPECT_EQ(index_query->label_, ast_generator.Label("mirko")); @@ -1586,9 +1699,10 @@ TYPED_TEST(CypherMainVisitorTest, CreateIndex) { EXPECT_EQ(index_query->properties_, expected_properties); } -TYPED_TEST(CypherMainVisitorTest, CreateUniqueIndex) { - TypeParam ast_generator("Create unIqUe InDeX oN :mirko(slavko, pero)"); - auto *index_query = dynamic_cast<IndexQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, CreateUniqueIndex) { + auto &ast_generator = *GetParam(); + auto *index_query = dynamic_cast<IndexQuery *>( + ast_generator.ParseQuery("Create unIqUe InDeX oN :mirko(slavko, pero)")); ASSERT_TRUE(index_query); EXPECT_EQ(index_query->action_, IndexQuery::Action::CREATE_UNIQUE); EXPECT_EQ(index_query->label_, ast_generator.Label("mirko")); @@ -1597,14 +1711,16 @@ TYPED_TEST(CypherMainVisitorTest, CreateUniqueIndex) { ASSERT_EQ(index_query->properties_, expected_properties); } -TYPED_TEST(CypherMainVisitorTest, CreateUniqueIndexWithoutProperties) { - EXPECT_THROW(TypeParam ast_generator("Create unIqUe InDeX oN :mirko()"), +TEST_P(CypherMainVisitorTest, CreateUniqueIndexWithoutProperties) { + auto &ast_generator = *GetParam(); + EXPECT_THROW(ast_generator.ParseQuery("Create unIqUe InDeX oN :mirko()"), SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, CreateUniqueIndexWithSingleProperty) { - TypeParam ast_generator("Create unIqUe InDeX oN :mirko(slavko)"); - auto *index_query = dynamic_cast<IndexQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, CreateUniqueIndexWithSingleProperty) { + auto &ast_generator = *GetParam(); + auto *index_query = dynamic_cast<IndexQuery *>( + ast_generator.ParseQuery("Create unIqUe InDeX oN :mirko(slavko)")); ASSERT_TRUE(index_query); EXPECT_EQ(index_query->action_, IndexQuery::Action::CREATE_UNIQUE); EXPECT_EQ(index_query->label_, ast_generator.Label("mirko")); @@ -1612,9 +1728,10 @@ TYPED_TEST(CypherMainVisitorTest, CreateUniqueIndexWithSingleProperty) { ASSERT_EQ(index_query->properties_, expected_properties); } -TYPED_TEST(CypherMainVisitorTest, DropIndex) { - TypeParam ast_generator("dRoP InDeX oN :mirko(slavko)"); - auto *index_query = dynamic_cast<IndexQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, DropIndex) { + auto &ast_generator = *GetParam(); + auto *index_query = dynamic_cast<IndexQuery *>( + ast_generator.ParseQuery("dRoP InDeX oN :mirko(slavko)")); ASSERT_TRUE(index_query); EXPECT_EQ(index_query->action_, IndexQuery::Action::DROP); EXPECT_EQ(index_query->label_, ast_generator.Label("mirko")); @@ -1622,21 +1739,28 @@ TYPED_TEST(CypherMainVisitorTest, DropIndex) { EXPECT_EQ(index_query->properties_, expected_properties); } -TYPED_TEST(CypherMainVisitorTest, DropIndexWithoutProperties) { - EXPECT_THROW(TypeParam ast_generator("dRoP InDeX oN :mirko()"), +TEST_P(CypherMainVisitorTest, DropIndexWithoutProperties) { + auto &ast_generator = *GetParam(); + EXPECT_THROW(ast_generator.ParseQuery("dRoP InDeX oN :mirko()"), SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, DropIndexWithMultipleProperties) { - EXPECT_THROW(TypeParam ast_generator("dRoP InDeX oN :mirko(slavko, pero)"), +TEST_P(CypherMainVisitorTest, DropIndexWithMultipleProperties) { + auto &ast_generator = *GetParam(); + EXPECT_THROW(ast_generator.ParseQuery("dRoP InDeX oN :mirko(slavko, pero)"), SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, ReturnAll) { - { EXPECT_THROW(TypeParam("RETURN all(x in [1,2,3])"), SyntaxException); } +TEST_P(CypherMainVisitorTest, ReturnAll) { { - TypeParam ast_generator("RETURN all(x IN [1,2,3] WHERE x = 2)"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); + auto &ast_generator = *GetParam(); + EXPECT_THROW(ast_generator.ParseQuery("RETURN all(x in [1,2,3])"), + SyntaxException); + } + { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN all(x IN [1,2,3] WHERE x = 2)")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1655,10 +1779,15 @@ TYPED_TEST(CypherMainVisitorTest, ReturnAll) { } } -TYPED_TEST(CypherMainVisitorTest, ReturnSingle) { - { EXPECT_THROW(TypeParam("RETURN single(x in [1,2,3])"), SyntaxException); } - TypeParam ast_generator("RETURN single(x IN [1,2,3] WHERE x = 2)"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, ReturnSingle) { + { + auto &ast_generator = *GetParam(); + EXPECT_THROW(ast_generator.ParseQuery("RETURN single(x in [1,2,3])"), + SyntaxException); + } + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN single(x IN [1,2,3] WHERE x = 2)")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1676,9 +1805,10 @@ TYPED_TEST(CypherMainVisitorTest, ReturnSingle) { EXPECT_TRUE(eq); } -TYPED_TEST(CypherMainVisitorTest, ReturnReduce) { - TypeParam ast_generator("RETURN reduce(sum = 0, x IN [1,2,3] | sum + x)"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, ReturnReduce) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>(ast_generator.ParseQuery( + "RETURN reduce(sum = 0, x IN [1,2,3] | sum + x)")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1698,9 +1828,10 @@ TYPED_TEST(CypherMainVisitorTest, ReturnReduce) { EXPECT_TRUE(add); } -TYPED_TEST(CypherMainVisitorTest, ReturnExtract) { - TypeParam ast_generator("RETURN extract(x IN [1,2,3] | sum + x)"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, ReturnExtract) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN extract(x IN [1,2,3] | sum + x)")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1718,10 +1849,10 @@ TYPED_TEST(CypherMainVisitorTest, ReturnExtract) { EXPECT_TRUE(add); } -TYPED_TEST(CypherMainVisitorTest, MatchBfsReturn) { - TypeParam ast_generator( - "MATCH (n) -[r:type1|type2 *bfs..10 (e, n|e.prop = 42)]-> (m) RETURN r"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, MatchBfsReturn) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>(ast_generator.ParseQuery( + "MATCH (n) -[r:type1|type2 *bfs..10 (e, n|e.prop = 42)]-> (m) RETURN r")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1747,9 +1878,10 @@ TYPED_TEST(CypherMainVisitorTest, MatchBfsReturn) { ASSERT_TRUE(eq); } -TYPED_TEST(CypherMainVisitorTest, MatchVariableLambdaSymbols) { - TypeParam ast_generator("MATCH () -[*]- () RETURN *"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, MatchVariableLambdaSymbols) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("MATCH () -[*]- () RETURN *")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1765,11 +1897,11 @@ TYPED_TEST(CypherMainVisitorTest, MatchVariableLambdaSymbols) { EXPECT_FALSE(var_expand->filter_lambda_.inner_node->user_declared_); } -TYPED_TEST(CypherMainVisitorTest, MatchWShortestReturn) { - TypeParam ast_generator( +TEST_P(CypherMainVisitorTest, MatchWShortestReturn) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>(ast_generator.ParseQuery( "MATCH ()-[r:type1|type2 *wShortest 10 (we, wn | 42) total_weight " - "(e, n | true)]->() RETURN r"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); + "(e, n | true)]->() RETURN r")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1804,11 +1936,11 @@ TYPED_TEST(CypherMainVisitorTest, MatchWShortestReturn) { EXPECT_TRUE(shortest->total_weight_->user_declared_); } -TYPED_TEST(CypherMainVisitorTest, MatchWShortestNoFilterReturn) { - TypeParam ast_generator( +TEST_P(CypherMainVisitorTest, MatchWShortestNoFilterReturn) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>(ast_generator.ParseQuery( "MATCH ()-[r:type1|type2 *wShortest 10 (we, wn | 42)]->() " - "RETURN r"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); + "RETURN r")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1840,32 +1972,36 @@ TYPED_TEST(CypherMainVisitorTest, MatchWShortestNoFilterReturn) { EXPECT_FALSE(shortest->total_weight_->user_declared_); } -TYPED_TEST(CypherMainVisitorTest, SemanticExceptionOnWShortestLowerBound) { - ASSERT_THROW( - TypeParam("MATCH ()-[r *wShortest 10.. (e, n | 42)]-() RETURN r"), - SemanticException); - ASSERT_THROW( - TypeParam("MATCH ()-[r *wShortest 10..20 (e, n | 42)]-() RETURN r"), - SemanticException); -} - -TYPED_TEST(CypherMainVisitorTest, SemanticExceptionOnWShortestWithoutLambda) { - ASSERT_THROW(TypeParam("MATCH ()-[r *wShortest]-() RETURN r"), +TEST_P(CypherMainVisitorTest, SemanticExceptionOnWShortestLowerBound) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery( + "MATCH ()-[r *wShortest 10.. (e, n | 42)]-() RETURN r"), + SemanticException); + ASSERT_THROW(ast_generator.ParseQuery( + "MATCH ()-[r *wShortest 10..20 (e, n | 42)]-() RETURN r"), SemanticException); } -TYPED_TEST(CypherMainVisitorTest, SemanticExceptionOnUnionTypeMix) { - ASSERT_THROW( - TypeParam("RETURN 5 as X UNION ALL RETURN 6 AS X UNION RETURN 7 AS X"), - SemanticException); - ASSERT_THROW( - TypeParam("RETURN 5 as X UNION RETURN 6 AS X UNION ALL RETURN 7 AS X"), - SemanticException); +TEST_P(CypherMainVisitorTest, SemanticExceptionOnWShortestWithoutLambda) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("MATCH ()-[r *wShortest]-() RETURN r"), + SemanticException); } -TYPED_TEST(CypherMainVisitorTest, Union) { - TypeParam ast_generator("RETURN 5 AS X, 6 AS Y UNION RETURN 6 AS X, 5 AS Y"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, SemanticExceptionOnUnionTypeMix) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery( + "RETURN 5 as X UNION ALL RETURN 6 AS X UNION RETURN 7 AS X"), + SemanticException); + ASSERT_THROW(ast_generator.ParseQuery( + "RETURN 5 as X UNION RETURN 6 AS X UNION ALL RETURN 7 AS X"), + SemanticException); +} + +TEST_P(CypherMainVisitorTest, Union) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>(ast_generator.ParseQuery( + "RETURN 5 AS X, 6 AS Y UNION RETURN 6 AS X, 5 AS Y")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); @@ -1894,10 +2030,10 @@ TYPED_TEST(CypherMainVisitorTest, Union) { ASSERT_FALSE(return_clause->body_.distinct); } -TYPED_TEST(CypherMainVisitorTest, UnionAll) { - TypeParam ast_generator( - "RETURN 5 AS X UNION ALL RETURN 6 AS X UNION ALL RETURN 7 AS X"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, UnionAll) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>(ast_generator.ParseQuery( + "RETURN 5 AS X UNION ALL RETURN 6 AS X UNION ALL RETURN 7 AS X")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); @@ -1940,14 +2076,13 @@ TYPED_TEST(CypherMainVisitorTest, UnionAll) { ASSERT_FALSE(return_clause->body_.distinct); } -template <typename AstGeneratorT> -void check_auth_query(std::string input, AuthQuery::Action action, - std::string user, std::string role, - std::string user_or_role, +void check_auth_query(Base *ast_generator, std::string input, + AuthQuery::Action action, std::string user, + std::string role, std::string user_or_role, std::experimental::optional<TypedValue> password, std::vector<AuthQuery::Privilege> privileges) { - AstGeneratorT ast_generator(input); - auto *auth_query = dynamic_cast<AuthQuery *>(ast_generator.query_); + auto *auth_query = + dynamic_cast<AuthQuery *>(ast_generator->ParseQuery(input)); ASSERT_TRUE(auth_query); EXPECT_EQ(auth_query->action_, action); EXPECT_EQ(auth_query->user_, user); @@ -1956,193 +2091,224 @@ void check_auth_query(std::string input, AuthQuery::Action action, ASSERT_EQ(static_cast<bool>(auth_query->password_), static_cast<bool>(password)); if (password) { - ast_generator.CheckLiteral(auth_query->password_, *password); + ast_generator->CheckLiteral(auth_query->password_, *password); } EXPECT_EQ(auth_query->privileges_, privileges); } -TYPED_TEST(CypherMainVisitorTest, UserOrRoleName) { - ASSERT_THROW(TypeParam("CREATE ROLE `us|er`"), SyntaxException); - ASSERT_THROW(TypeParam("CREATE ROLE `us er`"), SyntaxException); - check_auth_query<TypeParam>("CREATE ROLE `user`", - AuthQuery::Action::CREATE_ROLE, "", "user", "", - {}, {}); - check_auth_query<TypeParam>("CREATE ROLE us___er", - AuthQuery::Action::CREATE_ROLE, "", "us___er", "", - {}, {}); - check_auth_query<TypeParam>("CREATE ROLE `us+er`", - AuthQuery::Action::CREATE_ROLE, "", "us+er", "", - {}, {}); -} - -TYPED_TEST(CypherMainVisitorTest, CreateRole) { - ASSERT_THROW(TypeParam("CREATE ROLE"), SyntaxException); - check_auth_query<TypeParam>("CREATE ROLE rola", - AuthQuery::Action::CREATE_ROLE, "", "rola", "", - {}, {}); - ASSERT_THROW(TypeParam("CREATE ROLE lagano rolamo"), SyntaxException); -} - -TYPED_TEST(CypherMainVisitorTest, DropRole) { - ASSERT_THROW(TypeParam("DROP ROLE"), SyntaxException); - check_auth_query<TypeParam>("DROP ROLE rola", AuthQuery::Action::DROP_ROLE, - "", "rola", "", {}, {}); - ASSERT_THROW(TypeParam("DROP ROLE lagano rolamo"), SyntaxException); -} - -TYPED_TEST(CypherMainVisitorTest, ShowRoles) { - ASSERT_THROW(TypeParam("SHOW ROLES ROLES"), SyntaxException); - check_auth_query<TypeParam>("SHOW ROLES", AuthQuery::Action::SHOW_ROLES, "", - "", "", {}, {}); -} - -TYPED_TEST(CypherMainVisitorTest, CreateUser) { - ASSERT_THROW(TypeParam("CREATE USER"), SyntaxException); - ASSERT_THROW(TypeParam("CREATE USER 123"), SyntaxException); - check_auth_query<TypeParam>("CREATE USER user", - AuthQuery::Action::CREATE_USER, "user", "", "", - {}, {}); - check_auth_query<TypeParam>("CREATE USER user IDENTIFIED BY 'password'", - AuthQuery::Action::CREATE_USER, "user", "", "", - "password", {}); - check_auth_query<TypeParam>("CREATE USER user IDENTIFIED BY ''", - AuthQuery::Action::CREATE_USER, "user", "", "", - "", {}); - check_auth_query<TypeParam>("CREATE USER user IDENTIFIED BY null", - AuthQuery::Action::CREATE_USER, "user", "", "", - TypedValue::Null, {}); - ASSERT_THROW(TypeParam("CRATE USER user IDENTIFIED BY password"), +TEST_P(CypherMainVisitorTest, UserOrRoleName) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("CREATE ROLE `us|er`"), SyntaxException); - ASSERT_THROW(TypeParam("CREATE USER user IDENTIFIED BY 5"), SyntaxException); - ASSERT_THROW(TypeParam("CREATE USER user IDENTIFIED BY "), SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("CREATE ROLE `us er`"), + SyntaxException); + check_auth_query(&ast_generator, "CREATE ROLE `user`", + AuthQuery::Action::CREATE_ROLE, "", "user", "", {}, {}); + check_auth_query(&ast_generator, "CREATE ROLE us___er", + AuthQuery::Action::CREATE_ROLE, "", "us___er", "", {}, {}); + check_auth_query(&ast_generator, "CREATE ROLE `us+er`", + AuthQuery::Action::CREATE_ROLE, "", "us+er", "", {}, {}); } -TYPED_TEST(CypherMainVisitorTest, SetPassword) { - ASSERT_THROW(TypeParam("SET PASSWORD FOR"), SyntaxException); - ASSERT_THROW(TypeParam("SET PASSWORD FOR user "), SyntaxException); - check_auth_query<TypeParam>("SET PASSWORD FOR user TO null", - AuthQuery::Action::SET_PASSWORD, "user", "", "", - TypedValue::Null, {}); - check_auth_query<TypeParam>("SET PASSWORD FOR user TO 'password'", - AuthQuery::Action::SET_PASSWORD, "user", "", "", - "password", {}); - ASSERT_THROW(TypeParam("SET PASSWORD FOR user To 5"), SyntaxException); +TEST_P(CypherMainVisitorTest, CreateRole) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("CREATE ROLE"), SyntaxException); + check_auth_query(&ast_generator, "CREATE ROLE rola", + AuthQuery::Action::CREATE_ROLE, "", "rola", "", {}, {}); + ASSERT_THROW(ast_generator.ParseQuery("CREATE ROLE lagano rolamo"), + SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, DropUser) { - ASSERT_THROW(TypeParam("DROP USER"), SyntaxException); - check_auth_query<TypeParam>("DROP USER user", AuthQuery::Action::DROP_USER, - "user", "", "", {}, {}); - ASSERT_THROW(TypeParam("DROP USER lagano rolamo"), SyntaxException); +TEST_P(CypherMainVisitorTest, DropRole) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("DROP ROLE"), SyntaxException); + check_auth_query(&ast_generator, "DROP ROLE rola", + AuthQuery::Action::DROP_ROLE, "", "rola", "", {}, {}); + ASSERT_THROW(ast_generator.ParseQuery("DROP ROLE lagano rolamo"), + SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, ShowUsers) { - ASSERT_THROW(TypeParam("SHOW USERS ROLES"), SyntaxException); - check_auth_query<TypeParam>("SHOW USERS", AuthQuery::Action::SHOW_USERS, "", - "", "", {}, {}); +TEST_P(CypherMainVisitorTest, ShowRoles) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("SHOW ROLES ROLES"), SyntaxException); + check_auth_query(&ast_generator, "SHOW ROLES", AuthQuery::Action::SHOW_ROLES, + "", "", "", {}, {}); } -TYPED_TEST(CypherMainVisitorTest, SetRole) { - ASSERT_THROW(TypeParam("SET ROLE"), SyntaxException); - ASSERT_THROW(TypeParam("SET ROLE user"), SyntaxException); - ASSERT_THROW(TypeParam("SET ROLE FOR user"), SyntaxException); - ASSERT_THROW(TypeParam("SET ROLE FOR user TO"), SyntaxException); - check_auth_query<TypeParam>("SET ROLE FOR user TO role", - AuthQuery::Action::SET_ROLE, "user", "role", "", - {}, {}); - check_auth_query<TypeParam>("SET ROLE FOR user TO null", - AuthQuery::Action::SET_ROLE, "user", "null", "", - {}, {}); +TEST_P(CypherMainVisitorTest, CreateUser) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("CREATE USER"), SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("CREATE USER 123"), SyntaxException); + check_auth_query(&ast_generator, "CREATE USER user", + AuthQuery::Action::CREATE_USER, "user", "", "", {}, {}); + check_auth_query(&ast_generator, "CREATE USER user IDENTIFIED BY 'password'", + AuthQuery::Action::CREATE_USER, "user", "", "", "password", + {}); + check_auth_query(&ast_generator, "CREATE USER user IDENTIFIED BY ''", + AuthQuery::Action::CREATE_USER, "user", "", "", "", {}); + check_auth_query(&ast_generator, "CREATE USER user IDENTIFIED BY null", + AuthQuery::Action::CREATE_USER, "user", "", "", + TypedValue::Null, {}); + ASSERT_THROW( + ast_generator.ParseQuery("CRATE USER user IDENTIFIED BY password"), + SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("CREATE USER user IDENTIFIED BY 5"), + SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("CREATE USER user IDENTIFIED BY "), + SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, ClearRole) { - ASSERT_THROW(TypeParam("CLEAR ROLE"), SyntaxException); - ASSERT_THROW(TypeParam("CLEAR ROLE user"), SyntaxException); - ASSERT_THROW(TypeParam("CLEAR ROLE FOR user TO"), SyntaxException); - check_auth_query<TypeParam>("CLEAR ROLE FOR user", - AuthQuery::Action::CLEAR_ROLE, "user", "", "", {}, - {}); +TEST_P(CypherMainVisitorTest, SetPassword) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("SET PASSWORD FOR"), SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("SET PASSWORD FOR user "), + SyntaxException); + check_auth_query(&ast_generator, "SET PASSWORD FOR user TO null", + AuthQuery::Action::SET_PASSWORD, "user", "", "", + TypedValue::Null, {}); + check_auth_query(&ast_generator, "SET PASSWORD FOR user TO 'password'", + AuthQuery::Action::SET_PASSWORD, "user", "", "", "password", + {}); + ASSERT_THROW(ast_generator.ParseQuery("SET PASSWORD FOR user To 5"), + SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, GrantPrivilege) { - ASSERT_THROW(TypeParam("GRANT"), SyntaxException); - ASSERT_THROW(TypeParam("GRANT TO user"), SyntaxException); - ASSERT_THROW(TypeParam("GRANT BLABLA TO user"), SyntaxException); - ASSERT_THROW(TypeParam("GRANT MATCH, TO user"), SyntaxException); - ASSERT_THROW(TypeParam("GRANT MATCH, BLABLA TO user"), SyntaxException); - check_auth_query<TypeParam>("GRANT MATCH TO user", - AuthQuery::Action::GRANT_PRIVILEGE, "", "", - "user", {}, {AuthQuery::Privilege::MATCH}); - check_auth_query<TypeParam>( - "GRANT MATCH, AUTH TO user", AuthQuery::Action::GRANT_PRIVILEGE, "", "", - "user", {}, {AuthQuery::Privilege::MATCH, AuthQuery::Privilege::AUTH}); +TEST_P(CypherMainVisitorTest, DropUser) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("DROP USER"), SyntaxException); + check_auth_query(&ast_generator, "DROP USER user", + AuthQuery::Action::DROP_USER, "user", "", "", {}, {}); + ASSERT_THROW(ast_generator.ParseQuery("DROP USER lagano rolamo"), + SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, DenyPrivilege) { - ASSERT_THROW(TypeParam("DENY"), SyntaxException); - ASSERT_THROW(TypeParam("DENY TO user"), SyntaxException); - ASSERT_THROW(TypeParam("DENY BLABLA TO user"), SyntaxException); - ASSERT_THROW(TypeParam("DENY MATCH, TO user"), SyntaxException); - ASSERT_THROW(TypeParam("DENY MATCH, BLABLA TO user"), SyntaxException); - check_auth_query<TypeParam>("DENY MATCH TO user", - AuthQuery::Action::DENY_PRIVILEGE, "", "", "user", - {}, {AuthQuery::Privilege::MATCH}); - check_auth_query<TypeParam>( - "DENY MATCH, AUTH TO user", AuthQuery::Action::DENY_PRIVILEGE, "", "", - "user", {}, {AuthQuery::Privilege::MATCH, AuthQuery::Privilege::AUTH}); +TEST_P(CypherMainVisitorTest, ShowUsers) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("SHOW USERS ROLES"), SyntaxException); + check_auth_query(&ast_generator, "SHOW USERS", AuthQuery::Action::SHOW_USERS, + "", "", "", {}, {}); } -TYPED_TEST(CypherMainVisitorTest, RevokePrivilege) { - ASSERT_THROW(TypeParam("REVOKE"), SyntaxException); - ASSERT_THROW(TypeParam("REVOKE FROM user"), SyntaxException); - ASSERT_THROW(TypeParam("REVOKE BLABLA FROM user"), SyntaxException); - ASSERT_THROW(TypeParam("REVOKE MATCH, FROM user"), SyntaxException); - ASSERT_THROW(TypeParam("REVOKE MATCH, BLABLA FROM user"), SyntaxException); - check_auth_query<TypeParam>("REVOKE MATCH FROM user", - AuthQuery::Action::REVOKE_PRIVILEGE, "", "", - "user", {}, {AuthQuery::Privilege::MATCH}); - check_auth_query<TypeParam>( - "REVOKE MATCH, AUTH FROM user", AuthQuery::Action::REVOKE_PRIVILEGE, "", - "", "user", {}, - {AuthQuery::Privilege::MATCH, AuthQuery::Privilege::AUTH}); - check_auth_query<TypeParam>( - "REVOKE ALL PRIVILEGES FROM user", AuthQuery::Action::REVOKE_PRIVILEGE, - "", "", "user", {}, kPrivilegesAll); +TEST_P(CypherMainVisitorTest, SetRole) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("SET ROLE"), SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("SET ROLE user"), SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("SET ROLE FOR user"), SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("SET ROLE FOR user TO"), + SyntaxException); + check_auth_query(&ast_generator, "SET ROLE FOR user TO role", + AuthQuery::Action::SET_ROLE, "user", "role", "", {}, {}); + check_auth_query(&ast_generator, "SET ROLE FOR user TO null", + AuthQuery::Action::SET_ROLE, "user", "null", "", {}, {}); } -TYPED_TEST(CypherMainVisitorTest, ShowPrivileges) { - ASSERT_THROW(TypeParam("SHOW PRIVILEGES FOR"), SyntaxException); - check_auth_query<TypeParam>("SHOW PRIVILEGES FOR user", - AuthQuery::Action::SHOW_PRIVILEGES, "", "", - "user", {}, {}); - ASSERT_THROW(TypeParam("SHOW PRIVILEGES FOR user1, user2"), SyntaxException); +TEST_P(CypherMainVisitorTest, ClearRole) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("CLEAR ROLE"), SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("CLEAR ROLE user"), SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("CLEAR ROLE FOR user TO"), + SyntaxException); + check_auth_query(&ast_generator, "CLEAR ROLE FOR user", + AuthQuery::Action::CLEAR_ROLE, "user", "", "", {}, {}); } -TYPED_TEST(CypherMainVisitorTest, ShowRoleForUser) { - ASSERT_THROW(TypeParam("SHOW ROLE FOR "), SyntaxException); - check_auth_query<TypeParam>("SHOW ROLE FOR user", - AuthQuery::Action::SHOW_ROLE_FOR_USER, "user", "", - "", {}, {}); - ASSERT_THROW(TypeParam("SHOW ROLE FOR user1, user2"), SyntaxException); +TEST_P(CypherMainVisitorTest, GrantPrivilege) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("GRANT"), SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("GRANT TO user"), SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("GRANT BLABLA TO user"), + SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("GRANT MATCH, TO user"), + SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("GRANT MATCH, BLABLA TO user"), + SyntaxException); + check_auth_query(&ast_generator, "GRANT MATCH TO user", + AuthQuery::Action::GRANT_PRIVILEGE, "", "", "user", {}, + {AuthQuery::Privilege::MATCH}); + check_auth_query(&ast_generator, "GRANT MATCH, AUTH TO user", + AuthQuery::Action::GRANT_PRIVILEGE, "", "", "user", {}, + {AuthQuery::Privilege::MATCH, AuthQuery::Privilege::AUTH}); } -TYPED_TEST(CypherMainVisitorTest, ShowUsersForRole) { - ASSERT_THROW(TypeParam("SHOW USERS FOR "), SyntaxException); - check_auth_query<TypeParam>("SHOW USERS FOR role", - AuthQuery::Action::SHOW_USERS_FOR_ROLE, "", - "role", "", {}, {}); - ASSERT_THROW(TypeParam("SHOW USERS FOR role1, role2"), SyntaxException); +TEST_P(CypherMainVisitorTest, DenyPrivilege) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("DENY"), SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("DENY TO user"), SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("DENY BLABLA TO user"), + SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("DENY MATCH, TO user"), + SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("DENY MATCH, BLABLA TO user"), + SyntaxException); + check_auth_query(&ast_generator, "DENY MATCH TO user", + AuthQuery::Action::DENY_PRIVILEGE, "", "", "user", {}, + {AuthQuery::Privilege::MATCH}); + check_auth_query(&ast_generator, "DENY MATCH, AUTH TO user", + AuthQuery::Action::DENY_PRIVILEGE, "", "", "user", {}, + {AuthQuery::Privilege::MATCH, AuthQuery::Privilege::AUTH}); } -TYPED_TEST(CypherMainVisitorTest, CreateStream) { +TEST_P(CypherMainVisitorTest, RevokePrivilege) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("REVOKE"), SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("REVOKE FROM user"), SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("REVOKE BLABLA FROM user"), + SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("REVOKE MATCH, FROM user"), + SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("REVOKE MATCH, BLABLA FROM user"), + SyntaxException); + check_auth_query(&ast_generator, "REVOKE MATCH FROM user", + AuthQuery::Action::REVOKE_PRIVILEGE, "", "", "user", {}, + {AuthQuery::Privilege::MATCH}); + check_auth_query(&ast_generator, "REVOKE MATCH, AUTH FROM user", + AuthQuery::Action::REVOKE_PRIVILEGE, "", "", "user", {}, + {AuthQuery::Privilege::MATCH, AuthQuery::Privilege::AUTH}); + check_auth_query(&ast_generator, "REVOKE ALL PRIVILEGES FROM user", + AuthQuery::Action::REVOKE_PRIVILEGE, "", "", "user", {}, + kPrivilegesAll); +} + +TEST_P(CypherMainVisitorTest, ShowPrivileges) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("SHOW PRIVILEGES FOR"), + SyntaxException); + check_auth_query(&ast_generator, "SHOW PRIVILEGES FOR user", + AuthQuery::Action::SHOW_PRIVILEGES, "", "", "user", {}, {}); + ASSERT_THROW(ast_generator.ParseQuery("SHOW PRIVILEGES FOR user1, user2"), + SyntaxException); +} + +TEST_P(CypherMainVisitorTest, ShowRoleForUser) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("SHOW ROLE FOR "), SyntaxException); + check_auth_query(&ast_generator, "SHOW ROLE FOR user", + AuthQuery::Action::SHOW_ROLE_FOR_USER, "user", "", "", {}, + {}); + ASSERT_THROW(ast_generator.ParseQuery("SHOW ROLE FOR user1, user2"), + SyntaxException); +} + +TEST_P(CypherMainVisitorTest, ShowUsersForRole) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("SHOW USERS FOR "), SyntaxException); + check_auth_query(&ast_generator, "SHOW USERS FOR role", + AuthQuery::Action::SHOW_USERS_FOR_ROLE, "", "role", "", {}, + {}); + ASSERT_THROW(ast_generator.ParseQuery("SHOW USERS FOR role1, role2"), + SyntaxException); +} + +TEST_P(CypherMainVisitorTest, CreateStream) { auto check_create_stream = - [](std::string input, const std::string &stream_name, - const std::string &stream_uri, const std::string &stream_topic, - const std::string &transform_uri, - std::experimental::optional<int64_t> batch_interval_in_ms, - std::experimental::optional<int64_t> batch_size) { - TypeParam ast_generator(input); - auto *stream_query = dynamic_cast<StreamQuery *>(ast_generator.query_); + [this](std::string input, const std::string &stream_name, + const std::string &stream_uri, const std::string &stream_topic, + const std::string &transform_uri, + std::experimental::optional<int64_t> batch_interval_in_ms, + std::experimental::optional<int64_t> batch_size) { + auto &ast_generator = *GetParam(); + auto *stream_query = + dynamic_cast<StreamQuery *>(ast_generator.ParseQuery(input)); ASSERT_TRUE(stream_query); EXPECT_EQ(stream_query->action_, StreamQuery::Action::CREATE_STREAM); EXPECT_EQ(stream_query->stream_name_, stream_name); @@ -2241,11 +2407,12 @@ TYPED_TEST(CypherMainVisitorTest, CreateStream) { SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, DropStream) { - auto check_drop_stream = [](std::string input, - const std::string &stream_name) { - TypeParam ast_generator(input); - auto *stream_query = dynamic_cast<StreamQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, DropStream) { + auto check_drop_stream = [this](std::string input, + const std::string &stream_name) { + auto &ast_generator = *GetParam(); + auto *stream_query = + dynamic_cast<StreamQuery *>(ast_generator.ParseQuery(input)); ASSERT_TRUE(stream_query); EXPECT_EQ(stream_query->action_, StreamQuery::Action::DROP_STREAM); EXPECT_EQ(stream_query->stream_name_, stream_name); @@ -2261,10 +2428,11 @@ TYPED_TEST(CypherMainVisitorTest, DropStream) { EXPECT_THROW(check_drop_stream("DroP STREAM '123'", "123"), SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, ShowStreams) { - auto check_show_streams = [](std::string input) { - TypeParam ast_generator(input); - auto *stream_query = dynamic_cast<StreamQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, ShowStreams) { + auto check_show_streams = [this](std::string input) { + auto &ast_generator = *GetParam(); + auto *stream_query = + dynamic_cast<StreamQuery *>(ast_generator.ParseQuery(input)); ASSERT_TRUE(stream_query); EXPECT_EQ(stream_query->action_, StreamQuery::Action::SHOW_STREAMS); }; @@ -2274,12 +2442,13 @@ TYPED_TEST(CypherMainVisitorTest, ShowStreams) { EXPECT_THROW(check_show_streams("SHOW STREAMS lololo"), SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, StartStopStream) { +TEST_P(CypherMainVisitorTest, StartStopStream) { auto check_start_stop_stream = - [](std::string input, const std::string &stream_name, bool is_start, - std::experimental::optional<int64_t> limit_batches) { - TypeParam ast_generator(input); - auto *stream_query = dynamic_cast<StreamQuery *>(ast_generator.query_); + [this](std::string input, const std::string &stream_name, bool is_start, + std::experimental::optional<int64_t> limit_batches) { + auto &ast_generator = *GetParam(); + auto *stream_query = + dynamic_cast<StreamQuery *>(ast_generator.ParseQuery(input)); ASSERT_TRUE(stream_query); EXPECT_EQ(stream_query->stream_name_, stream_name); @@ -2321,10 +2490,11 @@ TYPED_TEST(CypherMainVisitorTest, StartStopStream) { SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, StartStopAllStreams) { - auto check_start_stop_all_streams = [](std::string input, bool is_start) { - TypeParam ast_generator(input); - auto *stream_query = dynamic_cast<StreamQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, StartStopAllStreams) { + auto check_start_stop_all_streams = [this](std::string input, bool is_start) { + auto &ast_generator = *GetParam(); + auto *stream_query = + dynamic_cast<StreamQuery *>(ast_generator.ParseQuery(input)); ASSERT_TRUE(stream_query); EXPECT_EQ(stream_query->action_, is_start ? StreamQuery::Action::START_ALL_STREAMS @@ -2342,12 +2512,13 @@ TYPED_TEST(CypherMainVisitorTest, StartStopAllStreams) { SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, TestStream) { +TEST_P(CypherMainVisitorTest, TestStream) { auto check_test_stream = - [](std::string input, const std::string &stream_name, - std::experimental::optional<int64_t> limit_batches) { - TypeParam ast_generator(input); - auto *stream_query = dynamic_cast<StreamQuery *>(ast_generator.query_); + [this](std::string input, const std::string &stream_name, + std::experimental::optional<int64_t> limit_batches) { + auto &ast_generator = *GetParam(); + auto *stream_query = + dynamic_cast<StreamQuery *>(ast_generator.ParseQuery(input)); ASSERT_TRUE(stream_query); EXPECT_EQ(stream_query->stream_name_, stream_name); EXPECT_EQ(stream_query->action_, StreamQuery::Action::TEST_STREAM); @@ -2378,63 +2549,69 @@ TYPED_TEST(CypherMainVisitorTest, TestStream) { SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, TestExplainRegularQuery) { - { - TypeParam ast_generator("EXPLAIN RETURN n"); - EXPECT_TRUE(dynamic_cast<ExplainQuery *>(ast_generator.query_)); - } +TEST_P(CypherMainVisitorTest, TestExplainRegularQuery) { + auto &ast_generator = *GetParam(); + EXPECT_TRUE(dynamic_cast<ExplainQuery *>( + ast_generator.ParseQuery("EXPLAIN RETURN n"))); } -TYPED_TEST(CypherMainVisitorTest, TestExplainExplainQuery) { - EXPECT_THROW(TypeParam ast_generator("EXPLAIN EXPLAIN RETURN n"), +TEST_P(CypherMainVisitorTest, TestExplainExplainQuery) { + auto &ast_generator = *GetParam(); + EXPECT_THROW(ast_generator.ParseQuery("EXPLAIN EXPLAIN RETURN n"), SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, TestExplainAuthQuery) { - EXPECT_THROW(TypeParam ast_generator("EXPLAIN SHOW ROLES"), SyntaxException); +TEST_P(CypherMainVisitorTest, TestExplainAuthQuery) { + auto &ast_generator = *GetParam(); + EXPECT_THROW(ast_generator.ParseQuery("EXPLAIN SHOW ROLES"), SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, TestExplainStreamQuery) { - EXPECT_THROW(TypeParam ast_generator("EXPLAIN SHOW STREAMS"), +TEST_P(CypherMainVisitorTest, TestExplainStreamQuery) { + auto &ast_generator = *GetParam(); + EXPECT_THROW(ast_generator.ParseQuery("EXPLAIN SHOW STREAMS"), SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, TestProfileRegularQuery) { +TEST_P(CypherMainVisitorTest, TestProfileRegularQuery) { { - TypeParam ast_generator("PROFILE RETURN n"); - EXPECT_TRUE(dynamic_cast<ProfileQuery *>(ast_generator.query_)); + auto &ast_generator = *GetParam(); + EXPECT_TRUE(dynamic_cast<ProfileQuery *>( + ast_generator.ParseQuery("PROFILE RETURN n"))); } } -TYPED_TEST(CypherMainVisitorTest, TestProfileComplicatedQuery) { +TEST_P(CypherMainVisitorTest, TestProfileComplicatedQuery) { { - TypeParam ast_generator( + auto &ast_generator = *GetParam(); + EXPECT_TRUE(dynamic_cast<ProfileQuery *>(ast_generator.ParseQuery( "profile optional match (n) where n.hello = 5 " "return n union optional match (n) where n.there = 10 " - "return n"); - EXPECT_TRUE(dynamic_cast<ProfileQuery *>(ast_generator.query_)); + "return n"))); } } -TYPED_TEST(CypherMainVisitorTest, TestProfileProfileQuery) { - EXPECT_THROW(TypeParam ast_generator("PROFILE PROFILE RETURN n"), +TEST_P(CypherMainVisitorTest, TestProfileProfileQuery) { + auto &ast_generator = *GetParam(); + EXPECT_THROW(ast_generator.ParseQuery("PROFILE PROFILE RETURN n"), SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, TestProfileAuthQuery) { - EXPECT_THROW(TypeParam ast_generator("PROFILE SHOW ROLES"), SyntaxException); +TEST_P(CypherMainVisitorTest, TestProfileAuthQuery) { + auto &ast_generator = *GetParam(); + EXPECT_THROW(ast_generator.ParseQuery("PROFILE SHOW ROLES"), SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, TestProfileStreamQuery) { - EXPECT_THROW(TypeParam ast_generator("PROFILE SHOW STREAMS"), +TEST_P(CypherMainVisitorTest, TestProfileStreamQuery) { + auto &ast_generator = *GetParam(); + EXPECT_THROW(ast_generator.ParseQuery("PROFILE SHOW STREAMS"), SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, RegexMatch) { +TEST_P(CypherMainVisitorTest, RegexMatch) { { - TypeParam ast_generator( - "MATCH (n) WHERE n.name =~ \".*bla.*\" RETURN n.name"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>(ast_generator.ParseQuery( + "MATCH (n) WHERE n.name =~ \".*bla.*\" RETURN n.name")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -2448,8 +2625,9 @@ TYPED_TEST(CypherMainVisitorTest, RegexMatch) { ast_generator.CheckLiteral(regex_match->regex_, ".*bla.*"); } { - TypeParam ast_generator("RETURN \"text\" =~ \".*bla.*\""); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN \"text\" =~ \".*bla.*\"")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; diff --git a/tests/unit/cypher_main_visitor.cpp b/tests/unit/cypher_main_visitor.cpp index f3d40fc2a..758935c76 100644 --- a/tests/unit/cypher_main_visitor.cpp +++ b/tests/unit/cypher_main_visitor.cpp @@ -27,10 +27,12 @@ using testing::UnorderedElementsAre; // Base class for all test types class Base { public: - explicit Base(const std::string &query) : query_string_(query) {} ParsingContext context_; Parameters parameters_; - std::string query_string_; + + virtual ~Base() {} + + virtual Query *ParseQuery(const std::string &query_string) = 0; virtual PropertyIx Prop(const std::string &prop_name) = 0; @@ -71,11 +73,11 @@ class Base { // This generator uses ast constructed by parsing the query. class AstGenerator : public Base { public: - explicit AstGenerator(const std::string &query) : Base(query) { - ::frontend::opencypher::Parser parser(query); + Query *ParseQuery(const std::string &query_string) override { + ::frontend::opencypher::Parser parser(query_string); CypherMainVisitor visitor(context_, &ast_storage_); visitor.visit(parser.tree()); - query_ = visitor.query(); + return visitor.query(); } PropertyIx Prop(const std::string &prop_name) override { @@ -91,29 +93,17 @@ class AstGenerator : public Base { } AstStorage ast_storage_; - Query *query_; }; // This clones ast, but uses original one. This done just to ensure that cloning // doesn't change original. class OriginalAfterCloningAstGenerator : public AstGenerator { public: - explicit OriginalAfterCloningAstGenerator(const std::string &query) - : AstGenerator(query) { + Query *ParseQuery(const std::string &query_string) override { + auto *original_query = AstGenerator::ParseQuery(query_string); AstStorage storage; - query_->Clone(&storage); - } - - PropertyIx Prop(const std::string &prop_name) override { - return ast_storage_.GetPropertyIx(prop_name); - } - - LabelIx Label(const std::string &name) override { - return ast_storage_.GetLabelIx(name); - } - - EdgeTypeIx EdgeType(const std::string &name) override { - return ast_storage_.GetEdgeTypeIx(name); + original_query->Clone(&storage); + return original_query; } }; @@ -122,8 +112,8 @@ class OriginalAfterCloningAstGenerator : public AstGenerator { // any data from original ast. class ClonedAstGenerator : public Base { public: - explicit ClonedAstGenerator(const std::string &query) : Base(query) { - ::frontend::opencypher::Parser parser(query); + Query *ParseQuery(const std::string &query_string) override { + ::frontend::opencypher::Parser parser(query_string); AstStorage tmp_storage; { // Add a label, property and edge type into temporary storage so @@ -134,7 +124,7 @@ class ClonedAstGenerator : public Base { } CypherMainVisitor visitor(context_, &tmp_storage); visitor.visit(parser.tree()); - query_ = visitor.query()->Clone(&ast_storage_); + return visitor.query()->Clone(&ast_storage_); } PropertyIx Prop(const std::string &prop_name) override { @@ -150,22 +140,21 @@ class ClonedAstGenerator : public Base { } AstStorage ast_storage_; - Query *query_; }; // This generator strips ast, clones it and then plugs stripped out literals in // the same way it is done in ast cacheing in interpreter. class CachedAstGenerator : public Base { public: - explicit CachedAstGenerator(const std::string &query) : Base(query) { + Query *ParseQuery(const std::string &query_string) override { context_.is_query_cached = true; - StrippedQuery stripped(query_string_); + StrippedQuery stripped(query_string); parameters_ = stripped.literals(); ::frontend::opencypher::Parser parser(stripped.query()); AstStorage tmp_storage; CypherMainVisitor visitor(context_, &tmp_storage); visitor.visit(parser.tree()); - query_ = visitor.query()->Clone(&ast_storage_); + return visitor.query()->Clone(&ast_storage_); } PropertyIx Prop(const std::string &prop_name) override { @@ -181,29 +170,50 @@ class CachedAstGenerator : public Base { } AstStorage ast_storage_; - Query *query_; }; -template <typename T> -class CypherMainVisitorTest : public ::testing::Test {}; +class CypherMainVisitorTest + : public ::testing::TestWithParam<std::shared_ptr<Base>> {}; -typedef ::testing::Types<AstGenerator, OriginalAfterCloningAstGenerator, - ClonedAstGenerator, CachedAstGenerator> - AstGeneratorTypes; +std::shared_ptr<Base> gAstGeneratorTypes[] = { + std::make_shared<AstGenerator>(), + std::make_shared<OriginalAfterCloningAstGenerator>(), + std::make_shared<ClonedAstGenerator>(), + std::make_shared<CachedAstGenerator>(), +}; -TYPED_TEST_CASE(CypherMainVisitorTest, AstGeneratorTypes); +INSTANTIATE_TEST_CASE_P(AstGeneratorTypes, CypherMainVisitorTest, + ::testing::ValuesIn(gAstGeneratorTypes)); -TYPED_TEST(CypherMainVisitorTest, SyntaxException) { - ASSERT_THROW(TypeParam("CREATE ()-[*1....2]-()"), SyntaxException); +// NOTE: The above used to use *Typed Tests* functionality of gtest library. +// Unfortunately, the compilation time of this test increased to full 2 minutes! +// Although using Typed Tests is the recommended way to achieve what we want, we +// are (ab)using *Value-Parameterized Tests* functionality instead. This cuts +// down the compilation time to about 20 seconds. The original code is here for +// future reference in case someone gets the idea to change to *appropriate* +// Typed Tests mechanism and ruin the compilation times. +// +// typedef ::testing::Types<AstGenerator, OriginalAfterCloningAstGenerator, +// ClonedAstGenerator, CachedAstGenerator> +// AstGeneratorTypes; +// +// TYPED_TEST_CASE(CypherMainVisitorTest, AstGeneratorTypes); + +TEST_P(CypherMainVisitorTest, SyntaxException) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("CREATE ()-[*1....2]-()"), + SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, SyntaxExceptionOnTrailingText) { - ASSERT_THROW(TypeParam("RETURN 2 + 2 mirko"), SyntaxException); +TEST_P(CypherMainVisitorTest, SyntaxExceptionOnTrailingText) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("RETURN 2 + 2 mirko"), SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, PropertyLookup) { - TypeParam ast_generator("RETURN n.x"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, PropertyLookup) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN n.x")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -218,9 +228,10 @@ TYPED_TEST(CypherMainVisitorTest, PropertyLookup) { ASSERT_EQ(property_lookup->property_, ast_generator.Prop("x")); } -TYPED_TEST(CypherMainVisitorTest, LabelsTest) { - TypeParam ast_generator("RETURN n:x:y"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, LabelsTest) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN n:x:y")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -236,9 +247,10 @@ TYPED_TEST(CypherMainVisitorTest, LabelsTest) { ElementsAre(ast_generator.Label("x"), ast_generator.Label("y"))); } -TYPED_TEST(CypherMainVisitorTest, EscapedLabel) { - TypeParam ast_generator("RETURN n:`l-$\"'ab``e````l`"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, EscapedLabel) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN n:`l-$\"'ab``e````l`")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -252,10 +264,11 @@ TYPED_TEST(CypherMainVisitorTest, EscapedLabel) { ElementsAre(ast_generator.Label("l-$\"'ab`e``l"))); } -TYPED_TEST(CypherMainVisitorTest, KeywordLabel) { +TEST_P(CypherMainVisitorTest, KeywordLabel) { for (const auto &label : {"DeLete", "UsER"}) { - TypeParam ast_generator(fmt::format("RETURN n:{}", label)); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery(fmt::format("RETURN n:{}", label))); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -269,9 +282,10 @@ TYPED_TEST(CypherMainVisitorTest, KeywordLabel) { } } -TYPED_TEST(CypherMainVisitorTest, HexLetterLabel) { - TypeParam ast_generator("RETURN n:a"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, HexLetterLabel) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN n:a")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -284,9 +298,10 @@ TYPED_TEST(CypherMainVisitorTest, HexLetterLabel) { ASSERT_THAT(labels_test->labels_, ElementsAre(ast_generator.Label("a"))); } -TYPED_TEST(CypherMainVisitorTest, ReturnNoDistinctNoBagSemantics) { - TypeParam ast_generator("RETURN x"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, ReturnNoDistinctNoBagSemantics) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN x")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -300,9 +315,10 @@ TYPED_TEST(CypherMainVisitorTest, ReturnNoDistinctNoBagSemantics) { ASSERT_FALSE(return_clause->body_.distinct); } -TYPED_TEST(CypherMainVisitorTest, ReturnDistinct) { - TypeParam ast_generator("RETURN DISTINCT x"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, ReturnDistinct) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN DISTINCT x")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -311,9 +327,10 @@ TYPED_TEST(CypherMainVisitorTest, ReturnDistinct) { ASSERT_TRUE(return_clause->body_.distinct); } -TYPED_TEST(CypherMainVisitorTest, ReturnLimit) { - TypeParam ast_generator("RETURN x LIMIT 5"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, ReturnLimit) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN x LIMIT 5")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -323,9 +340,10 @@ TYPED_TEST(CypherMainVisitorTest, ReturnLimit) { ast_generator.CheckLiteral(return_clause->body_.limit, 5); } -TYPED_TEST(CypherMainVisitorTest, ReturnSkip) { - TypeParam ast_generator("RETURN x SKIP 5"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, ReturnSkip) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN x SKIP 5")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -335,9 +353,10 @@ TYPED_TEST(CypherMainVisitorTest, ReturnSkip) { ast_generator.CheckLiteral(return_clause->body_.skip, 5); } -TYPED_TEST(CypherMainVisitorTest, ReturnOrderBy) { - TypeParam ast_generator("RETURN x, y, z ORDER BY z ASC, x, y DESC"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, ReturnOrderBy) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN x, y, z ORDER BY z ASC, x, y DESC")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -354,9 +373,10 @@ TYPED_TEST(CypherMainVisitorTest, ReturnOrderBy) { Pair(Ordering::DESC, "y"))); } -TYPED_TEST(CypherMainVisitorTest, ReturnNamedIdentifier) { - TypeParam ast_generator("RETURN var AS var5"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, ReturnNamedIdentifier) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN var AS var5")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -368,9 +388,10 @@ TYPED_TEST(CypherMainVisitorTest, ReturnNamedIdentifier) { ASSERT_EQ(identifier->name_, "var"); } -TYPED_TEST(CypherMainVisitorTest, ReturnAsterisk) { - TypeParam ast_generator("RETURN *"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, ReturnAsterisk) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN *")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -379,9 +400,10 @@ TYPED_TEST(CypherMainVisitorTest, ReturnAsterisk) { ASSERT_EQ(return_clause->body_.named_expressions.size(), 0U); } -TYPED_TEST(CypherMainVisitorTest, IntegerLiteral) { - TypeParam ast_generator("RETURN 42"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, IntegerLiteral) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN 42")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -390,14 +412,16 @@ TYPED_TEST(CypherMainVisitorTest, IntegerLiteral) { return_clause->body_.named_expressions[0]->expression_, 42, 1); } -TYPED_TEST(CypherMainVisitorTest, IntegerLiteralTooLarge) { - ASSERT_THROW(TypeParam("RETURN 10000000000000000000000000"), +TEST_P(CypherMainVisitorTest, IntegerLiteralTooLarge) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("RETURN 10000000000000000000000000"), SemanticException); } -TYPED_TEST(CypherMainVisitorTest, BooleanLiteralTrue) { - TypeParam ast_generator("RETURN TrUe"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, BooleanLiteralTrue) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN TrUe")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -406,9 +430,10 @@ TYPED_TEST(CypherMainVisitorTest, BooleanLiteralTrue) { return_clause->body_.named_expressions[0]->expression_, true, 1); } -TYPED_TEST(CypherMainVisitorTest, BooleanLiteralFalse) { - TypeParam ast_generator("RETURN faLSE"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, BooleanLiteralFalse) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN faLSE")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -417,9 +442,10 @@ TYPED_TEST(CypherMainVisitorTest, BooleanLiteralFalse) { return_clause->body_.named_expressions[0]->expression_, false, 1); } -TYPED_TEST(CypherMainVisitorTest, NullLiteral) { - TypeParam ast_generator("RETURN nULl"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, NullLiteral) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN nULl")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -429,9 +455,10 @@ TYPED_TEST(CypherMainVisitorTest, NullLiteral) { 1); } -TYPED_TEST(CypherMainVisitorTest, ParenthesizedExpression) { - TypeParam ast_generator("RETURN (2)"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, ParenthesizedExpression) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN (2)")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -440,9 +467,10 @@ TYPED_TEST(CypherMainVisitorTest, ParenthesizedExpression) { return_clause->body_.named_expressions[0]->expression_, 2); } -TYPED_TEST(CypherMainVisitorTest, OrOperator) { - TypeParam ast_generator("RETURN true Or false oR n"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, OrOperator) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN true Or false oR n")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -460,9 +488,10 @@ TYPED_TEST(CypherMainVisitorTest, OrOperator) { ASSERT_EQ(operand3->name_, "n"); } -TYPED_TEST(CypherMainVisitorTest, XorOperator) { - TypeParam ast_generator("RETURN true xOr false"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, XorOperator) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN true xOr false")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -473,9 +502,10 @@ TYPED_TEST(CypherMainVisitorTest, XorOperator) { ast_generator.CheckLiteral(xor_operator->expression2_, false); } -TYPED_TEST(CypherMainVisitorTest, AndOperator) { - TypeParam ast_generator("RETURN true and false"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, AndOperator) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN true and false")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -486,9 +516,10 @@ TYPED_TEST(CypherMainVisitorTest, AndOperator) { ast_generator.CheckLiteral(and_operator->expression2_, false); } -TYPED_TEST(CypherMainVisitorTest, AdditionSubtractionOperators) { - TypeParam ast_generator("RETURN 1 - 2 + 3"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, AdditionSubtractionOperators) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN 1 - 2 + 3")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -504,9 +535,10 @@ TYPED_TEST(CypherMainVisitorTest, AdditionSubtractionOperators) { ast_generator.CheckLiteral(addition_operator->expression2_, 3); } -TYPED_TEST(CypherMainVisitorTest, MulitplicationOperator) { - TypeParam ast_generator("RETURN 2 * 3"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, MulitplicationOperator) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN 2 * 3")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -517,9 +549,10 @@ TYPED_TEST(CypherMainVisitorTest, MulitplicationOperator) { ast_generator.CheckLiteral(mult_operator->expression2_, 3); } -TYPED_TEST(CypherMainVisitorTest, DivisionOperator) { - TypeParam ast_generator("RETURN 2 / 3"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, DivisionOperator) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN 2 / 3")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -530,9 +563,10 @@ TYPED_TEST(CypherMainVisitorTest, DivisionOperator) { ast_generator.CheckLiteral(div_operator->expression2_, 3); } -TYPED_TEST(CypherMainVisitorTest, ModOperator) { - TypeParam ast_generator("RETURN 2 % 3"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, ModOperator) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN 2 % 3")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -554,9 +588,10 @@ TYPED_TEST(CypherMainVisitorTest, ModOperator) { ast_generator.CheckLiteral(cmp_operator->expression2_, VALUE2); \ } while (0) -TYPED_TEST(CypherMainVisitorTest, ComparisonOperators) { - TypeParam ast_generator("RETURN 2 = 3 != 4 <> 5 < 6 > 7 <= 8 >= 9"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, ComparisonOperators) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN 2 = 3 != 4 <> 5 < 6 > 7 <= 8 >= 9")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -577,9 +612,10 @@ TYPED_TEST(CypherMainVisitorTest, ComparisonOperators) { #undef CHECK_COMPARISON -TYPED_TEST(CypherMainVisitorTest, ListIndexing) { - TypeParam ast_generator("RETURN [1,2,3] [ 2 ]"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, ListIndexing) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN [1,2,3] [ 2 ]")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -592,13 +628,16 @@ TYPED_TEST(CypherMainVisitorTest, ListIndexing) { ast_generator.CheckLiteral(list_index_op->expression2_, 2); } -TYPED_TEST(CypherMainVisitorTest, ListSlicingOperatorNoBounds) { - ASSERT_THROW(TypeParam("RETURN [1,2,3] [ .. ]"), SemanticException); +TEST_P(CypherMainVisitorTest, ListSlicingOperatorNoBounds) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("RETURN [1,2,3] [ .. ]"), + SemanticException); } -TYPED_TEST(CypherMainVisitorTest, ListSlicingOperator) { - TypeParam ast_generator("RETURN [1,2,3] [ .. 2 ]"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, ListSlicingOperator) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN [1,2,3] [ .. 2 ]")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -612,9 +651,10 @@ TYPED_TEST(CypherMainVisitorTest, ListSlicingOperator) { ast_generator.CheckLiteral(list_slicing_op->upper_bound_, 2); } -TYPED_TEST(CypherMainVisitorTest, InListOperator) { - TypeParam ast_generator("RETURN 5 IN [1,2]"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, InListOperator) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN 5 IN [1,2]")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -627,9 +667,10 @@ TYPED_TEST(CypherMainVisitorTest, InListOperator) { ASSERT_TRUE(list); } -TYPED_TEST(CypherMainVisitorTest, InWithListIndexing) { - TypeParam ast_generator("RETURN 1 IN [[1,2]][0]"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, InWithListIndexing) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN 1 IN [[1,2]][0]")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -646,10 +687,10 @@ TYPED_TEST(CypherMainVisitorTest, InWithListIndexing) { ast_generator.CheckLiteral(list_indexing->expression2_, 0); } -TYPED_TEST(CypherMainVisitorTest, CaseGenericForm) { - TypeParam ast_generator( - "RETURN CASE WHEN n < 10 THEN 1 WHEN n > 10 THEN 2 END"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, CaseGenericForm) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>(ast_generator.ParseQuery( + "RETURN CASE WHEN n < 10 THEN 1 WHEN n > 10 THEN 2 END")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -670,9 +711,10 @@ TYPED_TEST(CypherMainVisitorTest, CaseGenericForm) { ast_generator.CheckLiteral(if_operator2->else_expression_, TypedValue::Null); } -TYPED_TEST(CypherMainVisitorTest, CaseGenericFormElse) { - TypeParam ast_generator("RETURN CASE WHEN n < 10 THEN 1 ELSE 2 END"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, CaseGenericFormElse) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN CASE WHEN n < 10 THEN 1 ELSE 2 END")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -685,9 +727,10 @@ TYPED_TEST(CypherMainVisitorTest, CaseGenericFormElse) { ast_generator.CheckLiteral(if_operator->else_expression_, 2); } -TYPED_TEST(CypherMainVisitorTest, CaseSimpleForm) { - TypeParam ast_generator("RETURN CASE 5 WHEN 10 THEN 1 END"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, CaseSimpleForm) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN CASE 5 WHEN 10 THEN 1 END")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -702,9 +745,10 @@ TYPED_TEST(CypherMainVisitorTest, CaseSimpleForm) { ast_generator.CheckLiteral(if_operator->else_expression_, TypedValue::Null); } -TYPED_TEST(CypherMainVisitorTest, IsNull) { - TypeParam ast_generator("RETURN 2 iS NulL"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, IsNull) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN 2 iS NulL")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -714,9 +758,10 @@ TYPED_TEST(CypherMainVisitorTest, IsNull) { ast_generator.CheckLiteral(is_type_operator->expression_, 2); } -TYPED_TEST(CypherMainVisitorTest, IsNotNull) { - TypeParam ast_generator("RETURN 2 iS nOT NulL"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, IsNotNull) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN 2 iS nOT NulL")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -728,9 +773,10 @@ TYPED_TEST(CypherMainVisitorTest, IsNotNull) { ast_generator.CheckLiteral(is_type_operator->expression_, 2); } -TYPED_TEST(CypherMainVisitorTest, NotOperator) { - TypeParam ast_generator("RETURN not true"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, NotOperator) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN not true")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -740,9 +786,10 @@ TYPED_TEST(CypherMainVisitorTest, NotOperator) { ast_generator.CheckLiteral(not_operator->expression_, true); } -TYPED_TEST(CypherMainVisitorTest, UnaryMinusPlusOperators) { - TypeParam ast_generator("RETURN -+5"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, UnaryMinusPlusOperators) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN -+5")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -756,10 +803,10 @@ TYPED_TEST(CypherMainVisitorTest, UnaryMinusPlusOperators) { ast_generator.CheckLiteral(unary_plus_operator->expression_, 5); } -TYPED_TEST(CypherMainVisitorTest, Aggregation) { - TypeParam ast_generator( - "RETURN COUNT(a), MIN(b), MAX(c), SUM(d), AVG(e), COLLECT(f), COUNT(*)"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, Aggregation) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>(ast_generator.ParseQuery( + "RETURN COUNT(a), MIN(b), MAX(c), SUM(d), AVG(e), COLLECT(f), COUNT(*)")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -786,16 +833,19 @@ TYPED_TEST(CypherMainVisitorTest, Aggregation) { ASSERT_FALSE(aggregation->expression1_); } -TYPED_TEST(CypherMainVisitorTest, UndefinedFunction) { - ASSERT_THROW(TypeParam("RETURN " - "IHopeWeWillNeverHaveAwesomeMemgraphProcedureWithS" - "uchALongAndAwesomeNameSinceThisTestWouldFail(1)"), +TEST_P(CypherMainVisitorTest, UndefinedFunction) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery( + "RETURN " + "IHopeWeWillNeverHaveAwesomeMemgraphProcedureWithS" + "uchALongAndAwesomeNameSinceThisTestWouldFail(1)"), SemanticException); } -TYPED_TEST(CypherMainVisitorTest, Function) { - TypeParam ast_generator("RETURN abs(n, 2)"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, Function) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN abs(n, 2)")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -807,9 +857,10 @@ TYPED_TEST(CypherMainVisitorTest, Function) { ASSERT_TRUE(function->function_); } -TYPED_TEST(CypherMainVisitorTest, StringLiteralDoubleQuotes) { - TypeParam ast_generator("RETURN \"mi'rko\""); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, StringLiteralDoubleQuotes) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN \"mi'rko\"")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -818,9 +869,10 @@ TYPED_TEST(CypherMainVisitorTest, StringLiteralDoubleQuotes) { return_clause->body_.named_expressions[0]->expression_, "mi'rko", 1); } -TYPED_TEST(CypherMainVisitorTest, StringLiteralSingleQuotes) { - TypeParam ast_generator("RETURN 'mi\"rko'"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, StringLiteralSingleQuotes) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN 'mi\"rko'")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -829,9 +881,10 @@ TYPED_TEST(CypherMainVisitorTest, StringLiteralSingleQuotes) { return_clause->body_.named_expressions[0]->expression_, "mi\"rko", 1); } -TYPED_TEST(CypherMainVisitorTest, StringLiteralEscapedChars) { - TypeParam ast_generator("RETURN '\\\\\\'\\\"\\b\\B\\f\\F\\n\\N\\r\\R\\t\\T'"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, StringLiteralEscapedChars) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>(ast_generator.ParseQuery( + "RETURN '\\\\\\'\\\"\\b\\B\\f\\F\\n\\N\\r\\R\\t\\T'")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -841,9 +894,10 @@ TYPED_TEST(CypherMainVisitorTest, StringLiteralEscapedChars) { "\\'\"\b\b\f\f\n\n\r\r\t\t", 1); } -TYPED_TEST(CypherMainVisitorTest, StringLiteralEscapedUtf16) { - TypeParam ast_generator("RETURN '\\u221daaa\\u221daaa'"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, StringLiteralEscapedUtf16) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN '\\u221daaa\\u221daaa'")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -853,13 +907,16 @@ TYPED_TEST(CypherMainVisitorTest, StringLiteralEscapedUtf16) { u8"\u221daaa\u221daaa", 1); } -TYPED_TEST(CypherMainVisitorTest, StringLiteralEscapedUtf16Error) { - ASSERT_THROW(TypeParam("RETURN '\\U221daaa'"), SyntaxException); +TEST_P(CypherMainVisitorTest, StringLiteralEscapedUtf16Error) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("RETURN '\\U221daaa'"), + SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, StringLiteralEscapedUtf32) { - TypeParam ast_generator("RETURN '\\U0001F600aaaa\\U0001F600aaaaaaaa'"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, StringLiteralEscapedUtf32) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN '\\U0001F600aaaa\\U0001F600aaaaaaaa'")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -869,9 +926,10 @@ TYPED_TEST(CypherMainVisitorTest, StringLiteralEscapedUtf32) { u8"\U0001F600aaaa\U0001F600aaaaaaaa", 1); } -TYPED_TEST(CypherMainVisitorTest, DoubleLiteral) { - TypeParam ast_generator("RETURN 3.5"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, DoubleLiteral) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN 3.5")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -880,9 +938,10 @@ TYPED_TEST(CypherMainVisitorTest, DoubleLiteral) { return_clause->body_.named_expressions[0]->expression_, 3.5, 1); } -TYPED_TEST(CypherMainVisitorTest, DoubleLiteralExponent) { - TypeParam ast_generator("RETURN 5e-1"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, DoubleLiteralExponent) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN 5e-1")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -891,9 +950,10 @@ TYPED_TEST(CypherMainVisitorTest, DoubleLiteralExponent) { return_clause->body_.named_expressions[0]->expression_, 0.5, 1); } -TYPED_TEST(CypherMainVisitorTest, ListLiteral) { - TypeParam ast_generator("RETURN [3, [], 'johhny']"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, ListLiteral) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN [3, [], 'johhny']")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -909,9 +969,10 @@ TYPED_TEST(CypherMainVisitorTest, ListLiteral) { ast_generator.CheckLiteral(list_literal->elements_[2], "johhny"); } -TYPED_TEST(CypherMainVisitorTest, MapLiteral) { - TypeParam ast_generator("RETURN {a: 1, b: 'bla', c: [1, {a: 42}]}"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, MapLiteral) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN {a: 1, b: 'bla', c: [1, {a: 42}]}")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -933,10 +994,10 @@ TYPED_TEST(CypherMainVisitorTest, MapLiteral) { EXPECT_EQ(1, elem_2_1->elements_.size()); } -TYPED_TEST(CypherMainVisitorTest, NodePattern) { - TypeParam ast_generator( - "MATCH (:label1:label2:label3 {a : 5, b : 10}) RETURN 1"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, NodePattern) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>(ast_generator.ParseQuery( + "MATCH (:label1:label2:label3 {a : 5, b : 10}) RETURN 1")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -969,13 +1030,16 @@ TYPED_TEST(CypherMainVisitorTest, NodePattern) { Pair(ast_generator.Prop("b"), 10))); } -TYPED_TEST(CypherMainVisitorTest, PropertyMapSameKeyAppearsTwice) { - EXPECT_THROW(TypeParam("MATCH ({a : 1, a : 2})"), SemanticException); +TEST_P(CypherMainVisitorTest, PropertyMapSameKeyAppearsTwice) { + auto &ast_generator = *GetParam(); + EXPECT_THROW(ast_generator.ParseQuery("MATCH ({a : 1, a : 2})"), + SemanticException); } -TYPED_TEST(CypherMainVisitorTest, NodePatternIdentifier) { - TypeParam ast_generator("MATCH (var) RETURN 1"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, NodePatternIdentifier) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("MATCH (var) RETURN 1")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -992,9 +1056,10 @@ TYPED_TEST(CypherMainVisitorTest, NodePatternIdentifier) { EXPECT_THAT(node->properties_, UnorderedElementsAre()); } -TYPED_TEST(CypherMainVisitorTest, RelationshipPatternNoDetails) { - TypeParam ast_generator("MATCH ()--() RETURN 1"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, RelationshipPatternNoDetails) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("MATCH ()--() RETURN 1")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1019,9 +1084,10 @@ TYPED_TEST(CypherMainVisitorTest, RelationshipPatternNoDetails) { } // PatternPart in braces. -TYPED_TEST(CypherMainVisitorTest, PatternPartBraces) { - TypeParam ast_generator("MATCH ((()--())) RETURN 1"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, PatternPartBraces) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("MATCH ((()--())) RETURN 1")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1044,10 +1110,10 @@ TYPED_TEST(CypherMainVisitorTest, PatternPartBraces) { EXPECT_FALSE(edge->identifier_->user_declared_); } -TYPED_TEST(CypherMainVisitorTest, RelationshipPatternDetails) { - TypeParam ast_generator( - "MATCH ()<-[:type1|type2 {a : 5, b : 10}]-() RETURN 1"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, RelationshipPatternDetails) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>(ast_generator.ParseQuery( + "MATCH ()<-[:type1|type2 {a : 5, b : 10}]-() RETURN 1")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1072,9 +1138,10 @@ TYPED_TEST(CypherMainVisitorTest, RelationshipPatternDetails) { Pair(ast_generator.Prop("b"), 10))); } -TYPED_TEST(CypherMainVisitorTest, RelationshipPatternVariable) { - TypeParam ast_generator("MATCH ()-[var]->() RETURN 1"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, RelationshipPatternVariable) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("MATCH ()-[var]->() RETURN 1")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1100,9 +1167,10 @@ void AssertMatchSingleEdgeAtom(Match *match, EdgeAtom *&edge) { ASSERT_TRUE(edge); } -TYPED_TEST(CypherMainVisitorTest, RelationshipPatternUnbounded) { - TypeParam ast_generator("MATCH ()-[r*]->() RETURN r"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, RelationshipPatternUnbounded) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("MATCH ()-[r*]->() RETURN r")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1115,9 +1183,10 @@ TYPED_TEST(CypherMainVisitorTest, RelationshipPatternUnbounded) { EXPECT_EQ(edge->upper_bound_, nullptr); } -TYPED_TEST(CypherMainVisitorTest, RelationshipPatternLowerBounded) { - TypeParam ast_generator("MATCH ()-[r*42..]->() RETURN r"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, RelationshipPatternLowerBounded) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("MATCH ()-[r*42..]->() RETURN r")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1130,9 +1199,10 @@ TYPED_TEST(CypherMainVisitorTest, RelationshipPatternLowerBounded) { EXPECT_EQ(edge->upper_bound_, nullptr); } -TYPED_TEST(CypherMainVisitorTest, RelationshipPatternUpperBounded) { - TypeParam ast_generator("MATCH ()-[r*..42]->() RETURN r"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, RelationshipPatternUpperBounded) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("MATCH ()-[r*..42]->() RETURN r")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1145,9 +1215,10 @@ TYPED_TEST(CypherMainVisitorTest, RelationshipPatternUpperBounded) { ast_generator.CheckLiteral(edge->upper_bound_, 42); } -TYPED_TEST(CypherMainVisitorTest, RelationshipPatternLowerUpperBounded) { - TypeParam ast_generator("MATCH ()-[r*24..42]->() RETURN r"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, RelationshipPatternLowerUpperBounded) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("MATCH ()-[r*24..42]->() RETURN r")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1160,9 +1231,10 @@ TYPED_TEST(CypherMainVisitorTest, RelationshipPatternLowerUpperBounded) { ast_generator.CheckLiteral(edge->upper_bound_, 42); } -TYPED_TEST(CypherMainVisitorTest, RelationshipPatternFixedRange) { - TypeParam ast_generator("MATCH ()-[r*42]->() RETURN r"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, RelationshipPatternFixedRange) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("MATCH ()-[r*42]->() RETURN r")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1175,10 +1247,11 @@ TYPED_TEST(CypherMainVisitorTest, RelationshipPatternFixedRange) { ast_generator.CheckLiteral(edge->upper_bound_, 42); } -TYPED_TEST(CypherMainVisitorTest, RelationshipPatternFloatingUpperBound) { +TEST_P(CypherMainVisitorTest, RelationshipPatternFloatingUpperBound) { // [r*1...2] should be parsed as [r*1..0.2] - TypeParam ast_generator("MATCH ()-[r*1...2]->() RETURN r"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("MATCH ()-[r*1...2]->() RETURN r")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1191,9 +1264,10 @@ TYPED_TEST(CypherMainVisitorTest, RelationshipPatternFloatingUpperBound) { ast_generator.CheckLiteral(edge->upper_bound_, 0.2); } -TYPED_TEST(CypherMainVisitorTest, RelationshipPatternUnboundedWithProperty) { - TypeParam ast_generator("MATCH ()-[r* {prop: 42}]->() RETURN r"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, RelationshipPatternUnboundedWithProperty) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("MATCH ()-[r* {prop: 42}]->() RETURN r")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1207,10 +1281,11 @@ TYPED_TEST(CypherMainVisitorTest, RelationshipPatternUnboundedWithProperty) { ast_generator.CheckLiteral(edge->properties_[ast_generator.Prop("prop")], 42); } -TYPED_TEST(CypherMainVisitorTest, - RelationshipPatternDotsUnboundedWithEdgeTypeProperty) { - TypeParam ast_generator("MATCH ()-[r:edge_type*..{prop: 42}]->() RETURN r"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, + RelationshipPatternDotsUnboundedWithEdgeTypeProperty) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>(ast_generator.ParseQuery( + "MATCH ()-[r:edge_type*..{prop: 42}]->() RETURN r")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1227,9 +1302,10 @@ TYPED_TEST(CypherMainVisitorTest, EXPECT_EQ(edge->edge_types_[0], edge_type); } -TYPED_TEST(CypherMainVisitorTest, RelationshipPatternUpperBoundedWithProperty) { - TypeParam ast_generator("MATCH ()-[r*..2{prop: 42}]->() RETURN r"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, RelationshipPatternUpperBoundedWithProperty) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("MATCH ()-[r*..2{prop: 42}]->() RETURN r")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1245,7 +1321,7 @@ TYPED_TEST(CypherMainVisitorTest, RelationshipPatternUpperBoundedWithProperty) { // TODO maybe uncomment // // PatternPart with variable. -// TYPED_TEST(CypherMainVisitorTest, PatternPartVariable) { +// TEST_P(CypherMainVisitorTest, PatternPartVariable) { // ParserTables parser("CREATE var=()--()"); // ASSERT_EQ(parser.identifiers_map_.size(), 1U); // ASSERT_EQ(parser.pattern_parts_.size(), 1U); @@ -1260,9 +1336,10 @@ TYPED_TEST(CypherMainVisitorTest, RelationshipPatternUpperBoundedWithProperty) { // parser.pattern_parts_.end()); // } -TYPED_TEST(CypherMainVisitorTest, ReturnUnanemdIdentifier) { - TypeParam ast_generator("RETURN var"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, ReturnUnanemdIdentifier) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("RETURN var")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1279,9 +1356,10 @@ TYPED_TEST(CypherMainVisitorTest, ReturnUnanemdIdentifier) { ASSERT_TRUE(identifier->user_declared_); } -TYPED_TEST(CypherMainVisitorTest, Create) { - TypeParam ast_generator("CREATE (n)"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, Create) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("CREATE (n)")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1297,9 +1375,10 @@ TYPED_TEST(CypherMainVisitorTest, Create) { ASSERT_EQ(node->identifier_->name_, "n"); } -TYPED_TEST(CypherMainVisitorTest, Delete) { - TypeParam ast_generator("DELETE n, m"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, Delete) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("DELETE n, m")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1316,9 +1395,10 @@ TYPED_TEST(CypherMainVisitorTest, Delete) { ASSERT_EQ(identifier2->name_, "m"); } -TYPED_TEST(CypherMainVisitorTest, DeleteDetach) { - TypeParam ast_generator("DETACH DELETE n"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, DeleteDetach) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("DETACH DELETE n")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1332,9 +1412,10 @@ TYPED_TEST(CypherMainVisitorTest, DeleteDetach) { ASSERT_EQ(identifier1->name_, "n"); } -TYPED_TEST(CypherMainVisitorTest, OptionalMatchWhere) { - TypeParam ast_generator("OPTIONAL MATCH (n) WHERE m RETURN 1"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, OptionalMatchWhere) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("OPTIONAL MATCH (n) WHERE m RETURN 1")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1348,9 +1429,10 @@ TYPED_TEST(CypherMainVisitorTest, OptionalMatchWhere) { ASSERT_EQ(identifier->name_, "m"); } -TYPED_TEST(CypherMainVisitorTest, Set) { - TypeParam ast_generator("SET a.x = b, c = d, e += f, g : h : i "); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, Set) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("SET a.x = b, c = d, e += f, g : h : i ")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1405,14 +1487,14 @@ TYPED_TEST(CypherMainVisitorTest, Set) { } } -TYPED_TEST(CypherMainVisitorTest, Remove) { - TypeParam ast_generator("REMOVE a.x, g : h : i"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, Remove) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("REMOVE a.x, g : h : i")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; ASSERT_EQ(single_query->clauses_.size(), 2U); - { auto *remove_property = dynamic_cast<RemoveProperty *>(single_query->clauses_[0]); @@ -1437,9 +1519,10 @@ TYPED_TEST(CypherMainVisitorTest, Remove) { } } -TYPED_TEST(CypherMainVisitorTest, With) { - TypeParam ast_generator("WITH n AS m RETURN 1"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, With) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("WITH n AS m RETURN 1")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1458,13 +1541,16 @@ TYPED_TEST(CypherMainVisitorTest, With) { ASSERT_EQ(identifier->name_, "n"); } -TYPED_TEST(CypherMainVisitorTest, WithNonAliasedExpression) { - ASSERT_THROW(TypeParam("WITH n.x RETURN 1"), SemanticException); +TEST_P(CypherMainVisitorTest, WithNonAliasedExpression) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("WITH n.x RETURN 1"), + SemanticException); } -TYPED_TEST(CypherMainVisitorTest, WithNonAliasedVariable) { - TypeParam ast_generator("WITH n RETURN 1"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, WithNonAliasedVariable) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<CypherQuery *>(ast_generator.ParseQuery("WITH n RETURN 1")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1478,9 +1564,10 @@ TYPED_TEST(CypherMainVisitorTest, WithNonAliasedVariable) { ASSERT_EQ(identifier->name_, "n"); } -TYPED_TEST(CypherMainVisitorTest, WithDistinct) { - TypeParam ast_generator("WITH DISTINCT n AS m RETURN 1"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, WithDistinct) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("WITH DISTINCT n AS m RETURN 1")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1495,9 +1582,10 @@ TYPED_TEST(CypherMainVisitorTest, WithDistinct) { ASSERT_EQ(identifier->name_, "n"); } -TYPED_TEST(CypherMainVisitorTest, WithBag) { - TypeParam ast_generator("WITH n as m ORDER BY m SKIP 1 LIMIT 2 RETURN 1"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, WithBag) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>(ast_generator.ParseQuery( + "WITH n as m ORDER BY m SKIP 1 LIMIT 2 RETURN 1")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1512,9 +1600,10 @@ TYPED_TEST(CypherMainVisitorTest, WithBag) { ASSERT_TRUE(with->body_.skip); } -TYPED_TEST(CypherMainVisitorTest, WithWhere) { - TypeParam ast_generator("WITH n AS m WHERE k RETURN 1"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, WithWhere) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("WITH n AS m WHERE k RETURN 1")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1532,9 +1621,10 @@ TYPED_TEST(CypherMainVisitorTest, WithWhere) { ASSERT_EQ(identifier2->name_, "n"); } -TYPED_TEST(CypherMainVisitorTest, WithAnonymousVariableCapture) { - TypeParam ast_generator("WITH 5 as anon1 MATCH () return *"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, WithAnonymousVariableCapture) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("WITH 5 as anon1 MATCH () return *")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1550,55 +1640,65 @@ TYPED_TEST(CypherMainVisitorTest, WithAnonymousVariableCapture) { ASSERT_NE("anon1", atom->identifier_->name_); } -TYPED_TEST(CypherMainVisitorTest, ClausesOrdering) { +TEST_P(CypherMainVisitorTest, ClausesOrdering) { // Obviously some of the ridiculous combinations don't fail here, but they // will fail in semantic analysis or they make perfect sense as a part of // bigger query. - TypeParam("RETURN 1"); - ASSERT_THROW(TypeParam("RETURN 1 RETURN 1"), SemanticException); - ASSERT_THROW(TypeParam("RETURN 1 MATCH (n) RETURN n"), SemanticException); - ASSERT_THROW(TypeParam("RETURN 1 DELETE n"), SemanticException); - ASSERT_THROW(TypeParam("RETURN 1 MERGE (n)"), SemanticException); - ASSERT_THROW(TypeParam("RETURN 1 WITH n AS m RETURN 1"), SemanticException); - ASSERT_THROW(TypeParam("RETURN 1 AS n UNWIND n AS x RETURN x"), + auto &ast_generator = *GetParam(); + ast_generator.ParseQuery("RETURN 1"); + ASSERT_THROW(ast_generator.ParseQuery("RETURN 1 RETURN 1"), + SemanticException); + ASSERT_THROW(ast_generator.ParseQuery("RETURN 1 MATCH (n) RETURN n"), + SemanticException); + ASSERT_THROW(ast_generator.ParseQuery("RETURN 1 DELETE n"), + SemanticException); + ASSERT_THROW(ast_generator.ParseQuery("RETURN 1 MERGE (n)"), + SemanticException); + ASSERT_THROW(ast_generator.ParseQuery("RETURN 1 WITH n AS m RETURN 1"), + SemanticException); + ASSERT_THROW(ast_generator.ParseQuery("RETURN 1 AS n UNWIND n AS x RETURN x"), SemanticException); - ASSERT_THROW(TypeParam("OPTIONAL MATCH (n) MATCH (m) RETURN n, m"), + ASSERT_THROW( + ast_generator.ParseQuery("OPTIONAL MATCH (n) MATCH (m) RETURN n, m"), + SemanticException); + ast_generator.ParseQuery("OPTIONAL MATCH (n) WITH n MATCH (m) RETURN n, m"); + ast_generator.ParseQuery("OPTIONAL MATCH (n) OPTIONAL MATCH (m) RETURN n, m"); + ast_generator.ParseQuery("MATCH (n) OPTIONAL MATCH (m) RETURN n, m"); + + ast_generator.ParseQuery("CREATE (n)"); + ASSERT_THROW(ast_generator.ParseQuery("SET n:x MATCH (n) RETURN n"), SemanticException); - TypeParam("OPTIONAL MATCH (n) WITH n MATCH (m) RETURN n, m"); - TypeParam("OPTIONAL MATCH (n) OPTIONAL MATCH (m) RETURN n, m"); - TypeParam("MATCH (n) OPTIONAL MATCH (m) RETURN n, m"); + ast_generator.ParseQuery("REMOVE n.x SET n.x = 1"); + ast_generator.ParseQuery("REMOVE n:L RETURN n"); + ast_generator.ParseQuery("SET n.x = 1 WITH n AS m RETURN m"); - TypeParam("CREATE (n)"); - ASSERT_THROW(TypeParam("SET n:x MATCH (n) RETURN n"), SemanticException); - TypeParam("REMOVE n.x SET n.x = 1"); - TypeParam("REMOVE n:L RETURN n"); - TypeParam("SET n.x = 1 WITH n AS m RETURN m"); + ASSERT_THROW(ast_generator.ParseQuery("MATCH (n)"), SemanticException); + ast_generator.ParseQuery("MATCH (n) MATCH (n) RETURN n"); + ast_generator.ParseQuery("MATCH (n) SET n = m"); + ast_generator.ParseQuery("MATCH (n) RETURN n"); + ast_generator.ParseQuery("MATCH (n) WITH n AS m RETURN m"); - ASSERT_THROW(TypeParam("MATCH (n)"), SemanticException); - TypeParam("MATCH (n) MATCH (n) RETURN n"); - TypeParam("MATCH (n) SET n = m"); - TypeParam("MATCH (n) RETURN n"); - TypeParam("MATCH (n) WITH n AS m RETURN m"); + ASSERT_THROW(ast_generator.ParseQuery("WITH 1 AS n"), SemanticException); + ast_generator.ParseQuery("WITH 1 AS n WITH n AS m RETURN m"); + ast_generator.ParseQuery("WITH 1 AS n RETURN n"); + ast_generator.ParseQuery("WITH 1 AS n SET n += m"); + ast_generator.ParseQuery("WITH 1 AS n MATCH (n) RETURN n"); - ASSERT_THROW(TypeParam("WITH 1 AS n"), SemanticException); - TypeParam("WITH 1 AS n WITH n AS m RETURN m"); - TypeParam("WITH 1 AS n RETURN n"); - TypeParam("WITH 1 AS n SET n += m"); - TypeParam("WITH 1 AS n MATCH (n) RETURN n"); - - ASSERT_THROW(TypeParam("UNWIND [1,2,3] AS x"), SemanticException); - ASSERT_THROW(TypeParam("CREATE (n) UNWIND [1,2,3] AS x RETURN x"), + ASSERT_THROW(ast_generator.ParseQuery("UNWIND [1,2,3] AS x"), SemanticException); - TypeParam("UNWIND [1,2,3] AS x CREATE (n) RETURN x"); - TypeParam("CREATE (n) WITH n UNWIND [1,2,3] AS x RETURN x"); + ASSERT_THROW( + ast_generator.ParseQuery("CREATE (n) UNWIND [1,2,3] AS x RETURN x"), + SemanticException); + ast_generator.ParseQuery("UNWIND [1,2,3] AS x CREATE (n) RETURN x"); + ast_generator.ParseQuery("CREATE (n) WITH n UNWIND [1,2,3] AS x RETURN x"); } -TYPED_TEST(CypherMainVisitorTest, Merge) { - TypeParam ast_generator( - "MERGE (a) -[:r]- (b) ON MATCH SET a.x = b.x " - "ON CREATE SET b :label ON MATCH SET b = a"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, Merge) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("MERGE (a) -[:r]- (b) ON MATCH SET a.x = b.x " + "ON CREATE SET b :label ON MATCH SET b = a")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1613,9 +1713,10 @@ TYPED_TEST(CypherMainVisitorTest, Merge) { EXPECT_TRUE(dynamic_cast<SetLabels *>(merge->on_create_[0])); } -TYPED_TEST(CypherMainVisitorTest, Unwind) { - TypeParam ast_generator("UNWIND [1,2,3] AS elem RETURN elem"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, Unwind) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("UNWIND [1,2,3] AS elem RETURN elem")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1631,23 +1732,27 @@ TYPED_TEST(CypherMainVisitorTest, Unwind) { ASSERT_TRUE(dynamic_cast<ListLiteral *>(expr)); } -TYPED_TEST(CypherMainVisitorTest, UnwindWithoutAsError) { - EXPECT_THROW(TypeParam("UNWIND [1,2,3] RETURN 42"), SyntaxException); +TEST_P(CypherMainVisitorTest, UnwindWithoutAsError) { + auto &ast_generator = *GetParam(); + EXPECT_THROW(ast_generator.ParseQuery("UNWIND [1,2,3] RETURN 42"), + SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, CreateIndex) { - TypeParam ast_generator("Create InDeX oN :mirko(slavko)"); - auto *index_query = dynamic_cast<IndexQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, CreateIndex) { + auto &ast_generator = *GetParam(); + auto *index_query = dynamic_cast<IndexQuery *>( + ast_generator.ParseQuery("Create InDeX oN :mirko(slavko)")); ASSERT_TRUE(index_query); EXPECT_EQ(index_query->action_, IndexQuery::Action::CREATE); EXPECT_EQ(index_query->label_, ast_generator.Label("mirko")); - std::vector<PropertyIx> expected_properties = {ast_generator.Prop("slavko")}; + std::vector<PropertyIx> expected_properties{ast_generator.Prop("slavko")}; EXPECT_EQ(index_query->properties_, expected_properties); } -TYPED_TEST(CypherMainVisitorTest, CreateUniqueIndex) { - TypeParam ast_generator("Create unIqUe InDeX oN :mirko(slavko, pero)"); - auto *index_query = dynamic_cast<IndexQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, CreateUniqueIndex) { + auto &ast_generator = *GetParam(); + auto *index_query = dynamic_cast<IndexQuery *>( + ast_generator.ParseQuery("Create unIqUe InDeX oN :mirko(slavko, pero)")); ASSERT_TRUE(index_query); EXPECT_EQ(index_query->action_, IndexQuery::Action::CREATE_UNIQUE); EXPECT_EQ(index_query->label_, ast_generator.Label("mirko")); @@ -1656,14 +1761,16 @@ TYPED_TEST(CypherMainVisitorTest, CreateUniqueIndex) { ASSERT_EQ(index_query->properties_, expected_properties); } -TYPED_TEST(CypherMainVisitorTest, CreateUniqueIndexWithoutProperties) { - EXPECT_THROW(TypeParam ast_generator("Create unIqUe InDeX oN :mirko()"), +TEST_P(CypherMainVisitorTest, CreateUniqueIndexWithoutProperties) { + auto &ast_generator = *GetParam(); + EXPECT_THROW(ast_generator.ParseQuery("Create unIqUe InDeX oN :mirko()"), SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, CreateUniqueIndexWithSingleProperty) { - TypeParam ast_generator("Create unIqUe InDeX oN :mirko(slavko)"); - auto *index_query = dynamic_cast<IndexQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, CreateUniqueIndexWithSingleProperty) { + auto &ast_generator = *GetParam(); + auto *index_query = dynamic_cast<IndexQuery *>( + ast_generator.ParseQuery("Create unIqUe InDeX oN :mirko(slavko)")); ASSERT_TRUE(index_query); EXPECT_EQ(index_query->action_, IndexQuery::Action::CREATE_UNIQUE); EXPECT_EQ(index_query->label_, ast_generator.Label("mirko")); @@ -1671,9 +1778,10 @@ TYPED_TEST(CypherMainVisitorTest, CreateUniqueIndexWithSingleProperty) { ASSERT_EQ(index_query->properties_, expected_properties); } -TYPED_TEST(CypherMainVisitorTest, DropIndex) { - TypeParam ast_generator("dRoP InDeX oN :mirko(slavko)"); - auto *index_query = dynamic_cast<IndexQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, DropIndex) { + auto &ast_generator = *GetParam(); + auto *index_query = dynamic_cast<IndexQuery *>( + ast_generator.ParseQuery("dRoP InDeX oN :mirko(slavko)")); ASSERT_TRUE(index_query); EXPECT_EQ(index_query->action_, IndexQuery::Action::DROP); EXPECT_EQ(index_query->label_, ast_generator.Label("mirko")); @@ -1681,21 +1789,28 @@ TYPED_TEST(CypherMainVisitorTest, DropIndex) { EXPECT_EQ(index_query->properties_, expected_properties); } -TYPED_TEST(CypherMainVisitorTest, DropIndexWithoutProperties) { - EXPECT_THROW(TypeParam ast_generator("dRoP InDeX oN :mirko()"), +TEST_P(CypherMainVisitorTest, DropIndexWithoutProperties) { + auto &ast_generator = *GetParam(); + EXPECT_THROW(ast_generator.ParseQuery("dRoP InDeX oN :mirko()"), SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, DropIndexWithMultipleProperties) { - EXPECT_THROW(TypeParam ast_generator("dRoP InDeX oN :mirko(slavko, pero)"), +TEST_P(CypherMainVisitorTest, DropIndexWithMultipleProperties) { + auto &ast_generator = *GetParam(); + EXPECT_THROW(ast_generator.ParseQuery("dRoP InDeX oN :mirko(slavko, pero)"), SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, ReturnAll) { - { EXPECT_THROW(TypeParam("RETURN all(x in [1,2,3])"), SyntaxException); } +TEST_P(CypherMainVisitorTest, ReturnAll) { { - TypeParam ast_generator("RETURN all(x IN [1,2,3] WHERE x = 2)"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); + auto &ast_generator = *GetParam(); + EXPECT_THROW(ast_generator.ParseQuery("RETURN all(x in [1,2,3])"), + SyntaxException); + } + { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN all(x IN [1,2,3] WHERE x = 2)")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1714,10 +1829,15 @@ TYPED_TEST(CypherMainVisitorTest, ReturnAll) { } } -TYPED_TEST(CypherMainVisitorTest, ReturnSingle) { - { EXPECT_THROW(TypeParam("RETURN single(x in [1,2,3])"), SyntaxException); } - TypeParam ast_generator("RETURN single(x IN [1,2,3] WHERE x = 2)"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, ReturnSingle) { + { + auto &ast_generator = *GetParam(); + EXPECT_THROW(ast_generator.ParseQuery("RETURN single(x in [1,2,3])"), + SyntaxException); + } + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN single(x IN [1,2,3] WHERE x = 2)")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1735,9 +1855,10 @@ TYPED_TEST(CypherMainVisitorTest, ReturnSingle) { EXPECT_TRUE(eq); } -TYPED_TEST(CypherMainVisitorTest, ReturnReduce) { - TypeParam ast_generator("RETURN reduce(sum = 0, x IN [1,2,3] | sum + x)"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, ReturnReduce) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>(ast_generator.ParseQuery( + "RETURN reduce(sum = 0, x IN [1,2,3] | sum + x)")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1757,9 +1878,10 @@ TYPED_TEST(CypherMainVisitorTest, ReturnReduce) { EXPECT_TRUE(add); } -TYPED_TEST(CypherMainVisitorTest, ReturnExtract) { - TypeParam ast_generator("RETURN extract(x IN [1,2,3] | sum + x)"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, ReturnExtract) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN extract(x IN [1,2,3] | sum + x)")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1777,10 +1899,10 @@ TYPED_TEST(CypherMainVisitorTest, ReturnExtract) { EXPECT_TRUE(add); } -TYPED_TEST(CypherMainVisitorTest, MatchBfsReturn) { - TypeParam ast_generator( - "MATCH (n) -[r:type1|type2 *bfs..10 (e, n|e.prop = 42)]-> (m) RETURN r"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, MatchBfsReturn) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>(ast_generator.ParseQuery( + "MATCH (n) -[r:type1|type2 *bfs..10 (e, n|e.prop = 42)]-> (m) RETURN r")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1806,9 +1928,10 @@ TYPED_TEST(CypherMainVisitorTest, MatchBfsReturn) { ASSERT_TRUE(eq); } -TYPED_TEST(CypherMainVisitorTest, MatchVariableLambdaSymbols) { - TypeParam ast_generator("MATCH () -[*]- () RETURN *"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, MatchVariableLambdaSymbols) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("MATCH () -[*]- () RETURN *")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1824,11 +1947,11 @@ TYPED_TEST(CypherMainVisitorTest, MatchVariableLambdaSymbols) { EXPECT_FALSE(var_expand->filter_lambda_.inner_node->user_declared_); } -TYPED_TEST(CypherMainVisitorTest, MatchWShortestReturn) { - TypeParam ast_generator( +TEST_P(CypherMainVisitorTest, MatchWShortestReturn) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>(ast_generator.ParseQuery( "MATCH ()-[r:type1|type2 *wShortest 10 (we, wn | 42) total_weight " - "(e, n | true)]->() RETURN r"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); + "(e, n | true)]->() RETURN r")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1863,11 +1986,11 @@ TYPED_TEST(CypherMainVisitorTest, MatchWShortestReturn) { EXPECT_TRUE(shortest->total_weight_->user_declared_); } -TYPED_TEST(CypherMainVisitorTest, MatchWShortestNoFilterReturn) { - TypeParam ast_generator( +TEST_P(CypherMainVisitorTest, MatchWShortestNoFilterReturn) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>(ast_generator.ParseQuery( "MATCH ()-[r:type1|type2 *wShortest 10 (we, wn | 42)]->() " - "RETURN r"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); + "RETURN r")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -1899,32 +2022,36 @@ TYPED_TEST(CypherMainVisitorTest, MatchWShortestNoFilterReturn) { EXPECT_FALSE(shortest->total_weight_->user_declared_); } -TYPED_TEST(CypherMainVisitorTest, SemanticExceptionOnWShortestLowerBound) { - ASSERT_THROW( - TypeParam("MATCH ()-[r *wShortest 10.. (e, n | 42)]-() RETURN r"), - SemanticException); - ASSERT_THROW( - TypeParam("MATCH ()-[r *wShortest 10..20 (e, n | 42)]-() RETURN r"), - SemanticException); -} - -TYPED_TEST(CypherMainVisitorTest, SemanticExceptionOnWShortestWithoutLambda) { - ASSERT_THROW(TypeParam("MATCH ()-[r *wShortest]-() RETURN r"), +TEST_P(CypherMainVisitorTest, SemanticExceptionOnWShortestLowerBound) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery( + "MATCH ()-[r *wShortest 10.. (e, n | 42)]-() RETURN r"), + SemanticException); + ASSERT_THROW(ast_generator.ParseQuery( + "MATCH ()-[r *wShortest 10..20 (e, n | 42)]-() RETURN r"), SemanticException); } -TYPED_TEST(CypherMainVisitorTest, SemanticExceptionOnUnionTypeMix) { - ASSERT_THROW( - TypeParam("RETURN 5 as X UNION ALL RETURN 6 AS X UNION RETURN 7 AS X"), - SemanticException); - ASSERT_THROW( - TypeParam("RETURN 5 as X UNION RETURN 6 AS X UNION ALL RETURN 7 AS X"), - SemanticException); +TEST_P(CypherMainVisitorTest, SemanticExceptionOnWShortestWithoutLambda) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("MATCH ()-[r *wShortest]-() RETURN r"), + SemanticException); } -TYPED_TEST(CypherMainVisitorTest, Union) { - TypeParam ast_generator("RETURN 5 AS X, 6 AS Y UNION RETURN 6 AS X, 5 AS Y"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, SemanticExceptionOnUnionTypeMix) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery( + "RETURN 5 as X UNION ALL RETURN 6 AS X UNION RETURN 7 AS X"), + SemanticException); + ASSERT_THROW(ast_generator.ParseQuery( + "RETURN 5 as X UNION RETURN 6 AS X UNION ALL RETURN 7 AS X"), + SemanticException); +} + +TEST_P(CypherMainVisitorTest, Union) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>(ast_generator.ParseQuery( + "RETURN 5 AS X, 6 AS Y UNION RETURN 6 AS X, 5 AS Y")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); @@ -1953,10 +2080,10 @@ TYPED_TEST(CypherMainVisitorTest, Union) { ASSERT_FALSE(return_clause->body_.distinct); } -TYPED_TEST(CypherMainVisitorTest, UnionAll) { - TypeParam ast_generator( - "RETURN 5 AS X UNION ALL RETURN 6 AS X UNION ALL RETURN 7 AS X"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, UnionAll) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>(ast_generator.ParseQuery( + "RETURN 5 AS X UNION ALL RETURN 6 AS X UNION ALL RETURN 7 AS X")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); @@ -1999,14 +2126,13 @@ TYPED_TEST(CypherMainVisitorTest, UnionAll) { ASSERT_FALSE(return_clause->body_.distinct); } -template <typename AstGeneratorT> -void check_auth_query(std::string input, AuthQuery::Action action, - std::string user, std::string role, - std::string user_or_role, +void check_auth_query(Base *ast_generator, std::string input, + AuthQuery::Action action, std::string user, + std::string role, std::string user_or_role, std::experimental::optional<TypedValue> password, std::vector<AuthQuery::Privilege> privileges) { - AstGeneratorT ast_generator(input); - auto *auth_query = dynamic_cast<AuthQuery *>(ast_generator.query_); + auto *auth_query = + dynamic_cast<AuthQuery *>(ast_generator->ParseQuery(input)); ASSERT_TRUE(auth_query); EXPECT_EQ(auth_query->action_, action); EXPECT_EQ(auth_query->user_, user); @@ -2015,193 +2141,224 @@ void check_auth_query(std::string input, AuthQuery::Action action, ASSERT_EQ(static_cast<bool>(auth_query->password_), static_cast<bool>(password)); if (password) { - ast_generator.CheckLiteral(auth_query->password_, *password); + ast_generator->CheckLiteral(auth_query->password_, *password); } EXPECT_EQ(auth_query->privileges_, privileges); } -TYPED_TEST(CypherMainVisitorTest, UserOrRoleName) { - ASSERT_THROW(TypeParam("CREATE ROLE `us|er`"), SyntaxException); - ASSERT_THROW(TypeParam("CREATE ROLE `us er`"), SyntaxException); - check_auth_query<TypeParam>("CREATE ROLE `user`", - AuthQuery::Action::CREATE_ROLE, "", "user", "", - {}, {}); - check_auth_query<TypeParam>("CREATE ROLE us___er", - AuthQuery::Action::CREATE_ROLE, "", "us___er", "", - {}, {}); - check_auth_query<TypeParam>("CREATE ROLE `us+er`", - AuthQuery::Action::CREATE_ROLE, "", "us+er", "", - {}, {}); -} - -TYPED_TEST(CypherMainVisitorTest, CreateRole) { - ASSERT_THROW(TypeParam("CREATE ROLE"), SyntaxException); - check_auth_query<TypeParam>("CREATE ROLE rola", - AuthQuery::Action::CREATE_ROLE, "", "rola", "", - {}, {}); - ASSERT_THROW(TypeParam("CREATE ROLE lagano rolamo"), SyntaxException); -} - -TYPED_TEST(CypherMainVisitorTest, DropRole) { - ASSERT_THROW(TypeParam("DROP ROLE"), SyntaxException); - check_auth_query<TypeParam>("DROP ROLE rola", AuthQuery::Action::DROP_ROLE, - "", "rola", "", {}, {}); - ASSERT_THROW(TypeParam("DROP ROLE lagano rolamo"), SyntaxException); -} - -TYPED_TEST(CypherMainVisitorTest, ShowRoles) { - ASSERT_THROW(TypeParam("SHOW ROLES ROLES"), SyntaxException); - check_auth_query<TypeParam>("SHOW ROLES", AuthQuery::Action::SHOW_ROLES, "", - "", "", {}, {}); -} - -TYPED_TEST(CypherMainVisitorTest, CreateUser) { - ASSERT_THROW(TypeParam("CREATE USER"), SyntaxException); - ASSERT_THROW(TypeParam("CREATE USER 123"), SyntaxException); - check_auth_query<TypeParam>("CREATE USER user", - AuthQuery::Action::CREATE_USER, "user", "", "", - {}, {}); - check_auth_query<TypeParam>("CREATE USER user IDENTIFIED BY 'password'", - AuthQuery::Action::CREATE_USER, "user", "", "", - "password", {}); - check_auth_query<TypeParam>("CREATE USER user IDENTIFIED BY ''", - AuthQuery::Action::CREATE_USER, "user", "", "", - "", {}); - check_auth_query<TypeParam>("CREATE USER user IDENTIFIED BY null", - AuthQuery::Action::CREATE_USER, "user", "", "", - TypedValue::Null, {}); - ASSERT_THROW(TypeParam("CRATE USER user IDENTIFIED BY password"), +TEST_P(CypherMainVisitorTest, UserOrRoleName) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("CREATE ROLE `us|er`"), SyntaxException); - ASSERT_THROW(TypeParam("CREATE USER user IDENTIFIED BY 5"), SyntaxException); - ASSERT_THROW(TypeParam("CREATE USER user IDENTIFIED BY "), SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("CREATE ROLE `us er`"), + SyntaxException); + check_auth_query(&ast_generator, "CREATE ROLE `user`", + AuthQuery::Action::CREATE_ROLE, "", "user", "", {}, {}); + check_auth_query(&ast_generator, "CREATE ROLE us___er", + AuthQuery::Action::CREATE_ROLE, "", "us___er", "", {}, {}); + check_auth_query(&ast_generator, "CREATE ROLE `us+er`", + AuthQuery::Action::CREATE_ROLE, "", "us+er", "", {}, {}); } -TYPED_TEST(CypherMainVisitorTest, SetPassword) { - ASSERT_THROW(TypeParam("SET PASSWORD FOR"), SyntaxException); - ASSERT_THROW(TypeParam("SET PASSWORD FOR user "), SyntaxException); - check_auth_query<TypeParam>("SET PASSWORD FOR user TO null", - AuthQuery::Action::SET_PASSWORD, "user", "", "", - TypedValue::Null, {}); - check_auth_query<TypeParam>("SET PASSWORD FOR user TO 'password'", - AuthQuery::Action::SET_PASSWORD, "user", "", "", - "password", {}); - ASSERT_THROW(TypeParam("SET PASSWORD FOR user To 5"), SyntaxException); +TEST_P(CypherMainVisitorTest, CreateRole) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("CREATE ROLE"), SyntaxException); + check_auth_query(&ast_generator, "CREATE ROLE rola", + AuthQuery::Action::CREATE_ROLE, "", "rola", "", {}, {}); + ASSERT_THROW(ast_generator.ParseQuery("CREATE ROLE lagano rolamo"), + SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, DropUser) { - ASSERT_THROW(TypeParam("DROP USER"), SyntaxException); - check_auth_query<TypeParam>("DROP USER user", AuthQuery::Action::DROP_USER, - "user", "", "", {}, {}); - ASSERT_THROW(TypeParam("DROP USER lagano rolamo"), SyntaxException); +TEST_P(CypherMainVisitorTest, DropRole) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("DROP ROLE"), SyntaxException); + check_auth_query(&ast_generator, "DROP ROLE rola", + AuthQuery::Action::DROP_ROLE, "", "rola", "", {}, {}); + ASSERT_THROW(ast_generator.ParseQuery("DROP ROLE lagano rolamo"), + SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, ShowUsers) { - ASSERT_THROW(TypeParam("SHOW USERS ROLES"), SyntaxException); - check_auth_query<TypeParam>("SHOW USERS", AuthQuery::Action::SHOW_USERS, "", - "", "", {}, {}); +TEST_P(CypherMainVisitorTest, ShowRoles) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("SHOW ROLES ROLES"), SyntaxException); + check_auth_query(&ast_generator, "SHOW ROLES", AuthQuery::Action::SHOW_ROLES, + "", "", "", {}, {}); } -TYPED_TEST(CypherMainVisitorTest, SetRole) { - ASSERT_THROW(TypeParam("SET ROLE"), SyntaxException); - ASSERT_THROW(TypeParam("SET ROLE user"), SyntaxException); - ASSERT_THROW(TypeParam("SET ROLE FOR user"), SyntaxException); - ASSERT_THROW(TypeParam("SET ROLE FOR user TO"), SyntaxException); - check_auth_query<TypeParam>("SET ROLE FOR user TO role", - AuthQuery::Action::SET_ROLE, "user", "role", "", - {}, {}); - check_auth_query<TypeParam>("SET ROLE FOR user TO null", - AuthQuery::Action::SET_ROLE, "user", "null", "", - {}, {}); +TEST_P(CypherMainVisitorTest, CreateUser) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("CREATE USER"), SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("CREATE USER 123"), SyntaxException); + check_auth_query(&ast_generator, "CREATE USER user", + AuthQuery::Action::CREATE_USER, "user", "", "", {}, {}); + check_auth_query(&ast_generator, "CREATE USER user IDENTIFIED BY 'password'", + AuthQuery::Action::CREATE_USER, "user", "", "", "password", + {}); + check_auth_query(&ast_generator, "CREATE USER user IDENTIFIED BY ''", + AuthQuery::Action::CREATE_USER, "user", "", "", "", {}); + check_auth_query(&ast_generator, "CREATE USER user IDENTIFIED BY null", + AuthQuery::Action::CREATE_USER, "user", "", "", + TypedValue::Null, {}); + ASSERT_THROW( + ast_generator.ParseQuery("CRATE USER user IDENTIFIED BY password"), + SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("CREATE USER user IDENTIFIED BY 5"), + SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("CREATE USER user IDENTIFIED BY "), + SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, ClearRole) { - ASSERT_THROW(TypeParam("CLEAR ROLE"), SyntaxException); - ASSERT_THROW(TypeParam("CLEAR ROLE user"), SyntaxException); - ASSERT_THROW(TypeParam("CLEAR ROLE FOR user TO"), SyntaxException); - check_auth_query<TypeParam>("CLEAR ROLE FOR user", - AuthQuery::Action::CLEAR_ROLE, "user", "", "", {}, - {}); +TEST_P(CypherMainVisitorTest, SetPassword) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("SET PASSWORD FOR"), SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("SET PASSWORD FOR user "), + SyntaxException); + check_auth_query(&ast_generator, "SET PASSWORD FOR user TO null", + AuthQuery::Action::SET_PASSWORD, "user", "", "", + TypedValue::Null, {}); + check_auth_query(&ast_generator, "SET PASSWORD FOR user TO 'password'", + AuthQuery::Action::SET_PASSWORD, "user", "", "", "password", + {}); + ASSERT_THROW(ast_generator.ParseQuery("SET PASSWORD FOR user To 5"), + SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, GrantPrivilege) { - ASSERT_THROW(TypeParam("GRANT"), SyntaxException); - ASSERT_THROW(TypeParam("GRANT TO user"), SyntaxException); - ASSERT_THROW(TypeParam("GRANT BLABLA TO user"), SyntaxException); - ASSERT_THROW(TypeParam("GRANT MATCH, TO user"), SyntaxException); - ASSERT_THROW(TypeParam("GRANT MATCH, BLABLA TO user"), SyntaxException); - check_auth_query<TypeParam>("GRANT MATCH TO user", - AuthQuery::Action::GRANT_PRIVILEGE, "", "", - "user", {}, {AuthQuery::Privilege::MATCH}); - check_auth_query<TypeParam>( - "GRANT MATCH, AUTH TO user", AuthQuery::Action::GRANT_PRIVILEGE, "", "", - "user", {}, {AuthQuery::Privilege::MATCH, AuthQuery::Privilege::AUTH}); +TEST_P(CypherMainVisitorTest, DropUser) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("DROP USER"), SyntaxException); + check_auth_query(&ast_generator, "DROP USER user", + AuthQuery::Action::DROP_USER, "user", "", "", {}, {}); + ASSERT_THROW(ast_generator.ParseQuery("DROP USER lagano rolamo"), + SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, DenyPrivilege) { - ASSERT_THROW(TypeParam("DENY"), SyntaxException); - ASSERT_THROW(TypeParam("DENY TO user"), SyntaxException); - ASSERT_THROW(TypeParam("DENY BLABLA TO user"), SyntaxException); - ASSERT_THROW(TypeParam("DENY MATCH, TO user"), SyntaxException); - ASSERT_THROW(TypeParam("DENY MATCH, BLABLA TO user"), SyntaxException); - check_auth_query<TypeParam>("DENY MATCH TO user", - AuthQuery::Action::DENY_PRIVILEGE, "", "", "user", - {}, {AuthQuery::Privilege::MATCH}); - check_auth_query<TypeParam>( - "DENY MATCH, AUTH TO user", AuthQuery::Action::DENY_PRIVILEGE, "", "", - "user", {}, {AuthQuery::Privilege::MATCH, AuthQuery::Privilege::AUTH}); +TEST_P(CypherMainVisitorTest, ShowUsers) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("SHOW USERS ROLES"), SyntaxException); + check_auth_query(&ast_generator, "SHOW USERS", AuthQuery::Action::SHOW_USERS, + "", "", "", {}, {}); } -TYPED_TEST(CypherMainVisitorTest, RevokePrivilege) { - ASSERT_THROW(TypeParam("REVOKE"), SyntaxException); - ASSERT_THROW(TypeParam("REVOKE FROM user"), SyntaxException); - ASSERT_THROW(TypeParam("REVOKE BLABLA FROM user"), SyntaxException); - ASSERT_THROW(TypeParam("REVOKE MATCH, FROM user"), SyntaxException); - ASSERT_THROW(TypeParam("REVOKE MATCH, BLABLA FROM user"), SyntaxException); - check_auth_query<TypeParam>("REVOKE MATCH FROM user", - AuthQuery::Action::REVOKE_PRIVILEGE, "", "", - "user", {}, {AuthQuery::Privilege::MATCH}); - check_auth_query<TypeParam>( - "REVOKE MATCH, AUTH FROM user", AuthQuery::Action::REVOKE_PRIVILEGE, "", - "", "user", {}, - {AuthQuery::Privilege::MATCH, AuthQuery::Privilege::AUTH}); - check_auth_query<TypeParam>( - "REVOKE ALL PRIVILEGES FROM user", AuthQuery::Action::REVOKE_PRIVILEGE, - "", "", "user", {}, kPrivilegesAll); +TEST_P(CypherMainVisitorTest, SetRole) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("SET ROLE"), SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("SET ROLE user"), SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("SET ROLE FOR user"), SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("SET ROLE FOR user TO"), + SyntaxException); + check_auth_query(&ast_generator, "SET ROLE FOR user TO role", + AuthQuery::Action::SET_ROLE, "user", "role", "", {}, {}); + check_auth_query(&ast_generator, "SET ROLE FOR user TO null", + AuthQuery::Action::SET_ROLE, "user", "null", "", {}, {}); } -TYPED_TEST(CypherMainVisitorTest, ShowPrivileges) { - ASSERT_THROW(TypeParam("SHOW PRIVILEGES FOR"), SyntaxException); - check_auth_query<TypeParam>("SHOW PRIVILEGES FOR user", - AuthQuery::Action::SHOW_PRIVILEGES, "", "", - "user", {}, {}); - ASSERT_THROW(TypeParam("SHOW PRIVILEGES FOR user1, user2"), SyntaxException); +TEST_P(CypherMainVisitorTest, ClearRole) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("CLEAR ROLE"), SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("CLEAR ROLE user"), SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("CLEAR ROLE FOR user TO"), + SyntaxException); + check_auth_query(&ast_generator, "CLEAR ROLE FOR user", + AuthQuery::Action::CLEAR_ROLE, "user", "", "", {}, {}); } -TYPED_TEST(CypherMainVisitorTest, ShowRoleForUser) { - ASSERT_THROW(TypeParam("SHOW ROLE FOR "), SyntaxException); - check_auth_query<TypeParam>("SHOW ROLE FOR user", - AuthQuery::Action::SHOW_ROLE_FOR_USER, "user", "", - "", {}, {}); - ASSERT_THROW(TypeParam("SHOW ROLE FOR user1, user2"), SyntaxException); +TEST_P(CypherMainVisitorTest, GrantPrivilege) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("GRANT"), SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("GRANT TO user"), SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("GRANT BLABLA TO user"), + SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("GRANT MATCH, TO user"), + SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("GRANT MATCH, BLABLA TO user"), + SyntaxException); + check_auth_query(&ast_generator, "GRANT MATCH TO user", + AuthQuery::Action::GRANT_PRIVILEGE, "", "", "user", {}, + {AuthQuery::Privilege::MATCH}); + check_auth_query(&ast_generator, "GRANT MATCH, AUTH TO user", + AuthQuery::Action::GRANT_PRIVILEGE, "", "", "user", {}, + {AuthQuery::Privilege::MATCH, AuthQuery::Privilege::AUTH}); } -TYPED_TEST(CypherMainVisitorTest, ShowUsersForRole) { - ASSERT_THROW(TypeParam("SHOW USERS FOR "), SyntaxException); - check_auth_query<TypeParam>("SHOW USERS FOR role", - AuthQuery::Action::SHOW_USERS_FOR_ROLE, "", - "role", "", {}, {}); - ASSERT_THROW(TypeParam("SHOW USERS FOR role1, role2"), SyntaxException); +TEST_P(CypherMainVisitorTest, DenyPrivilege) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("DENY"), SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("DENY TO user"), SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("DENY BLABLA TO user"), + SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("DENY MATCH, TO user"), + SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("DENY MATCH, BLABLA TO user"), + SyntaxException); + check_auth_query(&ast_generator, "DENY MATCH TO user", + AuthQuery::Action::DENY_PRIVILEGE, "", "", "user", {}, + {AuthQuery::Privilege::MATCH}); + check_auth_query(&ast_generator, "DENY MATCH, AUTH TO user", + AuthQuery::Action::DENY_PRIVILEGE, "", "", "user", {}, + {AuthQuery::Privilege::MATCH, AuthQuery::Privilege::AUTH}); } -TYPED_TEST(CypherMainVisitorTest, CreateStream) { +TEST_P(CypherMainVisitorTest, RevokePrivilege) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("REVOKE"), SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("REVOKE FROM user"), SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("REVOKE BLABLA FROM user"), + SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("REVOKE MATCH, FROM user"), + SyntaxException); + ASSERT_THROW(ast_generator.ParseQuery("REVOKE MATCH, BLABLA FROM user"), + SyntaxException); + check_auth_query(&ast_generator, "REVOKE MATCH FROM user", + AuthQuery::Action::REVOKE_PRIVILEGE, "", "", "user", {}, + {AuthQuery::Privilege::MATCH}); + check_auth_query(&ast_generator, "REVOKE MATCH, AUTH FROM user", + AuthQuery::Action::REVOKE_PRIVILEGE, "", "", "user", {}, + {AuthQuery::Privilege::MATCH, AuthQuery::Privilege::AUTH}); + check_auth_query(&ast_generator, "REVOKE ALL PRIVILEGES FROM user", + AuthQuery::Action::REVOKE_PRIVILEGE, "", "", "user", {}, + kPrivilegesAll); +} + +TEST_P(CypherMainVisitorTest, ShowPrivileges) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("SHOW PRIVILEGES FOR"), + SyntaxException); + check_auth_query(&ast_generator, "SHOW PRIVILEGES FOR user", + AuthQuery::Action::SHOW_PRIVILEGES, "", "", "user", {}, {}); + ASSERT_THROW(ast_generator.ParseQuery("SHOW PRIVILEGES FOR user1, user2"), + SyntaxException); +} + +TEST_P(CypherMainVisitorTest, ShowRoleForUser) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("SHOW ROLE FOR "), SyntaxException); + check_auth_query(&ast_generator, "SHOW ROLE FOR user", + AuthQuery::Action::SHOW_ROLE_FOR_USER, "user", "", "", {}, + {}); + ASSERT_THROW(ast_generator.ParseQuery("SHOW ROLE FOR user1, user2"), + SyntaxException); +} + +TEST_P(CypherMainVisitorTest, ShowUsersForRole) { + auto &ast_generator = *GetParam(); + ASSERT_THROW(ast_generator.ParseQuery("SHOW USERS FOR "), SyntaxException); + check_auth_query(&ast_generator, "SHOW USERS FOR role", + AuthQuery::Action::SHOW_USERS_FOR_ROLE, "", "role", "", {}, + {}); + ASSERT_THROW(ast_generator.ParseQuery("SHOW USERS FOR role1, role2"), + SyntaxException); +} + +TEST_P(CypherMainVisitorTest, CreateStream) { auto check_create_stream = - [](std::string input, const std::string &stream_name, - const std::string &stream_uri, const std::string &stream_topic, - const std::string &transform_uri, - std::experimental::optional<int64_t> batch_interval_in_ms, - std::experimental::optional<int64_t> batch_size) { - TypeParam ast_generator(input); - auto *stream_query = dynamic_cast<StreamQuery *>(ast_generator.query_); + [this](std::string input, const std::string &stream_name, + const std::string &stream_uri, const std::string &stream_topic, + const std::string &transform_uri, + std::experimental::optional<int64_t> batch_interval_in_ms, + std::experimental::optional<int64_t> batch_size) { + auto &ast_generator = *GetParam(); + auto *stream_query = + dynamic_cast<StreamQuery *>(ast_generator.ParseQuery(input)); ASSERT_TRUE(stream_query); EXPECT_EQ(stream_query->action_, StreamQuery::Action::CREATE_STREAM); EXPECT_EQ(stream_query->stream_name_, stream_name); @@ -2300,11 +2457,12 @@ TYPED_TEST(CypherMainVisitorTest, CreateStream) { SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, DropStream) { - auto check_drop_stream = [](std::string input, - const std::string &stream_name) { - TypeParam ast_generator(input); - auto *stream_query = dynamic_cast<StreamQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, DropStream) { + auto check_drop_stream = [this](std::string input, + const std::string &stream_name) { + auto &ast_generator = *GetParam(); + auto *stream_query = + dynamic_cast<StreamQuery *>(ast_generator.ParseQuery(input)); ASSERT_TRUE(stream_query); EXPECT_EQ(stream_query->action_, StreamQuery::Action::DROP_STREAM); EXPECT_EQ(stream_query->stream_name_, stream_name); @@ -2320,10 +2478,11 @@ TYPED_TEST(CypherMainVisitorTest, DropStream) { EXPECT_THROW(check_drop_stream("DroP STREAM '123'", "123"), SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, ShowStreams) { - auto check_show_streams = [](std::string input) { - TypeParam ast_generator(input); - auto *stream_query = dynamic_cast<StreamQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, ShowStreams) { + auto check_show_streams = [this](std::string input) { + auto &ast_generator = *GetParam(); + auto *stream_query = + dynamic_cast<StreamQuery *>(ast_generator.ParseQuery(input)); ASSERT_TRUE(stream_query); EXPECT_EQ(stream_query->action_, StreamQuery::Action::SHOW_STREAMS); }; @@ -2333,12 +2492,13 @@ TYPED_TEST(CypherMainVisitorTest, ShowStreams) { EXPECT_THROW(check_show_streams("SHOW STREAMS lololo"), SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, StartStopStream) { +TEST_P(CypherMainVisitorTest, StartStopStream) { auto check_start_stop_stream = - [](std::string input, const std::string &stream_name, bool is_start, - std::experimental::optional<int64_t> limit_batches) { - TypeParam ast_generator(input); - auto *stream_query = dynamic_cast<StreamQuery *>(ast_generator.query_); + [this](std::string input, const std::string &stream_name, bool is_start, + std::experimental::optional<int64_t> limit_batches) { + auto &ast_generator = *GetParam(); + auto *stream_query = + dynamic_cast<StreamQuery *>(ast_generator.ParseQuery(input)); ASSERT_TRUE(stream_query); EXPECT_EQ(stream_query->stream_name_, stream_name); @@ -2380,10 +2540,11 @@ TYPED_TEST(CypherMainVisitorTest, StartStopStream) { SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, StartStopAllStreams) { - auto check_start_stop_all_streams = [](std::string input, bool is_start) { - TypeParam ast_generator(input); - auto *stream_query = dynamic_cast<StreamQuery *>(ast_generator.query_); +TEST_P(CypherMainVisitorTest, StartStopAllStreams) { + auto check_start_stop_all_streams = [this](std::string input, bool is_start) { + auto &ast_generator = *GetParam(); + auto *stream_query = + dynamic_cast<StreamQuery *>(ast_generator.ParseQuery(input)); ASSERT_TRUE(stream_query); EXPECT_EQ(stream_query->action_, is_start ? StreamQuery::Action::START_ALL_STREAMS @@ -2401,12 +2562,13 @@ TYPED_TEST(CypherMainVisitorTest, StartStopAllStreams) { SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, TestStream) { +TEST_P(CypherMainVisitorTest, TestStream) { auto check_test_stream = - [](std::string input, const std::string &stream_name, - std::experimental::optional<int64_t> limit_batches) { - TypeParam ast_generator(input); - auto *stream_query = dynamic_cast<StreamQuery *>(ast_generator.query_); + [this](std::string input, const std::string &stream_name, + std::experimental::optional<int64_t> limit_batches) { + auto &ast_generator = *GetParam(); + auto *stream_query = + dynamic_cast<StreamQuery *>(ast_generator.ParseQuery(input)); ASSERT_TRUE(stream_query); EXPECT_EQ(stream_query->stream_name_, stream_name); EXPECT_EQ(stream_query->action_, StreamQuery::Action::TEST_STREAM); @@ -2437,107 +2599,111 @@ TYPED_TEST(CypherMainVisitorTest, TestStream) { SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, TestExplainRegularQuery) { - { - TypeParam ast_generator("EXPLAIN RETURN n"); - EXPECT_TRUE(dynamic_cast<ExplainQuery *>(ast_generator.query_)); - } +TEST_P(CypherMainVisitorTest, TestExplainRegularQuery) { + auto &ast_generator = *GetParam(); + EXPECT_TRUE(dynamic_cast<ExplainQuery *>( + ast_generator.ParseQuery("EXPLAIN RETURN n"))); } -TYPED_TEST(CypherMainVisitorTest, TestExplainExplainQuery) { - EXPECT_THROW(TypeParam ast_generator("EXPLAIN EXPLAIN RETURN n"), +TEST_P(CypherMainVisitorTest, TestExplainExplainQuery) { + auto &ast_generator = *GetParam(); + EXPECT_THROW(ast_generator.ParseQuery("EXPLAIN EXPLAIN RETURN n"), SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, TestExplainAuthQuery) { - EXPECT_THROW(TypeParam ast_generator("EXPLAIN SHOW ROLES"), SyntaxException); +TEST_P(CypherMainVisitorTest, TestExplainAuthQuery) { + auto &ast_generator = *GetParam(); + EXPECT_THROW(ast_generator.ParseQuery("EXPLAIN SHOW ROLES"), SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, TestExplainStreamQuery) { - EXPECT_THROW(TypeParam ast_generator("EXPLAIN SHOW STREAMS"), +TEST_P(CypherMainVisitorTest, TestExplainStreamQuery) { + auto &ast_generator = *GetParam(); + EXPECT_THROW(ast_generator.ParseQuery("EXPLAIN SHOW STREAMS"), SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, TestProfileRegularQuery) { +TEST_P(CypherMainVisitorTest, TestProfileRegularQuery) { { - TypeParam ast_generator("PROFILE RETURN n"); - EXPECT_TRUE(dynamic_cast<ProfileQuery *>(ast_generator.query_)); + auto &ast_generator = *GetParam(); + EXPECT_TRUE(dynamic_cast<ProfileQuery *>( + ast_generator.ParseQuery("PROFILE RETURN n"))); } } -TYPED_TEST(CypherMainVisitorTest, TestProfileComplicatedQuery) { +TEST_P(CypherMainVisitorTest, TestProfileComplicatedQuery) { { - TypeParam ast_generator( + auto &ast_generator = *GetParam(); + EXPECT_TRUE(dynamic_cast<ProfileQuery *>(ast_generator.ParseQuery( "profile optional match (n) where n.hello = 5 " "return n union optional match (n) where n.there = 10 " - "return n"); - EXPECT_TRUE(dynamic_cast<ProfileQuery *>(ast_generator.query_)); + "return n"))); } } -TYPED_TEST(CypherMainVisitorTest, TestProfileProfileQuery) { - EXPECT_THROW(TypeParam ast_generator("PROFILE PROFILE RETURN n"), +TEST_P(CypherMainVisitorTest, TestProfileProfileQuery) { + auto &ast_generator = *GetParam(); + EXPECT_THROW(ast_generator.ParseQuery("PROFILE PROFILE RETURN n"), SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, TestProfileAuthQuery) { - EXPECT_THROW(TypeParam ast_generator("PROFILE SHOW ROLES"), SyntaxException); +TEST_P(CypherMainVisitorTest, TestProfileAuthQuery) { + auto &ast_generator = *GetParam(); + EXPECT_THROW(ast_generator.ParseQuery("PROFILE SHOW ROLES"), SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, TestProfileStreamQuery) { - EXPECT_THROW(TypeParam ast_generator("PROFILE SHOW STREAMS"), +TEST_P(CypherMainVisitorTest, TestProfileStreamQuery) { + auto &ast_generator = *GetParam(); + EXPECT_THROW(ast_generator.ParseQuery("PROFILE SHOW STREAMS"), SyntaxException); } -TYPED_TEST(CypherMainVisitorTest, TestShowStorageInfo) { - { - TypeParam ast_generator("SHOW STORAGE INFO"); - auto *query = dynamic_cast<InfoQuery *>(ast_generator.query_); - ASSERT_TRUE(query); - EXPECT_EQ(query->info_type_, InfoQuery::InfoType::STORAGE); - } +TEST_P(CypherMainVisitorTest, TestShowStorageInfo) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<InfoQuery *>(ast_generator.ParseQuery("SHOW STORAGE INFO")); + ASSERT_TRUE(query); + EXPECT_EQ(query->info_type_, InfoQuery::InfoType::STORAGE); } -TYPED_TEST(CypherMainVisitorTest, TestShowIndexInfo) { - { - TypeParam ast_generator("SHOW INDEX INFO"); - auto *query = dynamic_cast<InfoQuery *>(ast_generator.query_); - ASSERT_TRUE(query); - EXPECT_EQ(query->info_type_, InfoQuery::InfoType::INDEX); - } +TEST_P(CypherMainVisitorTest, TestShowIndexInfo) { + auto &ast_generator = *GetParam(); + auto *query = + dynamic_cast<InfoQuery *>(ast_generator.ParseQuery("SHOW INDEX INFO")); + ASSERT_TRUE(query); + EXPECT_EQ(query->info_type_, InfoQuery::InfoType::INDEX); } -TYPED_TEST(CypherMainVisitorTest, TestShowConstraintInfo) { - { - TypeParam ast_generator("SHOW CONSTRAINT INFO"); - auto *query = dynamic_cast<InfoQuery *>(ast_generator.query_); - ASSERT_TRUE(query); - EXPECT_EQ(query->info_type_, InfoQuery::InfoType::CONSTRAINT); - } +TEST_P(CypherMainVisitorTest, TestShowConstraintInfo) { + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<InfoQuery *>( + ast_generator.ParseQuery("SHOW CONSTRAINT INFO")); + ASSERT_TRUE(query); + EXPECT_EQ(query->info_type_, InfoQuery::InfoType::CONSTRAINT); } -TYPED_TEST(CypherMainVisitorTest, CreateConstraintSyntaxError) { +TEST_P(CypherMainVisitorTest, CreateConstraintSyntaxError) { + auto &ast_generator = *GetParam(); EXPECT_THROW( - TypeParam ast_generator("CREATE CONSTRAINT ON (:label) ASSERT EXISTS"), + ast_generator.ParseQuery("CREATE CONSTRAINT ON (:label) ASSERT EXISTS"), SyntaxException); - EXPECT_THROW(TypeParam ast_generator("CREATE CONSTRAINT () ASSERT EXISTS"), + EXPECT_THROW(ast_generator.ParseQuery("CREATE CONSTRAINT () ASSERT EXISTS"), SyntaxException); EXPECT_THROW( - TypeParam ast_generator("CREATE CONSTRAINT ON () ASSERT EXISTS(prop1)"), + ast_generator.ParseQuery("CREATE CONSTRAINT ON () ASSERT EXISTS(prop1)"), SyntaxException); - EXPECT_THROW(TypeParam ast_generator( + EXPECT_THROW(ast_generator.ParseQuery( "CREATE CONSTRAINT ON () ASSERT EXISTS (prop1, prop2)"), SyntaxException); - EXPECT_THROW(TypeParam ast_generator("CREATE CONSTRAINT ON (n:label) ASSERT " - "EXISTS (n.prop1, missing.prop2)"), + EXPECT_THROW(ast_generator.ParseQuery("CREATE CONSTRAINT ON (n:label) ASSERT " + "EXISTS (n.prop1, missing.prop2)"), SemanticException); } -TYPED_TEST(CypherMainVisitorTest, CreateConstraint) { +TEST_P(CypherMainVisitorTest, CreateConstraint) { { - TypeParam ast_generator( - "CREATE CONSTRAINT ON (n:label) ASSERT EXISTS(n.prop1)"); - auto *query = dynamic_cast<ConstraintQuery *>(ast_generator.query_); + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<ConstraintQuery *>(ast_generator.ParseQuery( + "CREATE CONSTRAINT ON (n:label) ASSERT EXISTS(n.prop1)")); ASSERT_TRUE(query); EXPECT_EQ(query->action_type_, ConstraintQuery::ActionType::CREATE); EXPECT_EQ(query->label_, ast_generator.Label("label")); @@ -2545,9 +2711,9 @@ TYPED_TEST(CypherMainVisitorTest, CreateConstraint) { UnorderedElementsAre(ast_generator.Prop("prop1"))); } { - TypeParam ast_generator( - "CREATE CONSTRAINT ON (n:label) ASSERT EXISTS (n.prop1, n.prop2)"); - auto *query = dynamic_cast<ConstraintQuery *>(ast_generator.query_); + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<ConstraintQuery *>(ast_generator.ParseQuery( + "CREATE CONSTRAINT ON (n:label) ASSERT EXISTS (n.prop1, n.prop2)")); ASSERT_TRUE(query); EXPECT_EQ(query->action_type_, ConstraintQuery::ActionType::CREATE); EXPECT_EQ(query->label_, ast_generator.Label("label")); @@ -2557,11 +2723,11 @@ TYPED_TEST(CypherMainVisitorTest, CreateConstraint) { } } -TYPED_TEST(CypherMainVisitorTest, DropConstraint) { +TEST_P(CypherMainVisitorTest, DropConstraint) { { - TypeParam ast_generator( - "DROP CONSTRAINT ON (n:label) ASSERT EXISTS(n.prop1)"); - auto *query = dynamic_cast<ConstraintQuery *>(ast_generator.query_); + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<ConstraintQuery *>(ast_generator.ParseQuery( + "DROP CONSTRAINT ON (n:label) ASSERT EXISTS(n.prop1)")); ASSERT_TRUE(query); EXPECT_EQ(query->action_type_, ConstraintQuery::ActionType::DROP); EXPECT_EQ(query->label_, ast_generator.Label("label")); @@ -2569,9 +2735,9 @@ TYPED_TEST(CypherMainVisitorTest, DropConstraint) { UnorderedElementsAre(ast_generator.Prop("prop1"))); } { - TypeParam ast_generator( - "DROP CONSTRAINT ON (n:label) ASSERT EXISTS(n.prop1, n.prop2)"); - auto *query = dynamic_cast<ConstraintQuery *>(ast_generator.query_); + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<ConstraintQuery *>(ast_generator.ParseQuery( + "DROP CONSTRAINT ON (n:label) ASSERT EXISTS(n.prop1, n.prop2)")); ASSERT_TRUE(query); EXPECT_EQ(query->action_type_, ConstraintQuery::ActionType::DROP); EXPECT_EQ(query->label_, ast_generator.Label("label")); @@ -2581,11 +2747,11 @@ TYPED_TEST(CypherMainVisitorTest, DropConstraint) { } } -TYPED_TEST(CypherMainVisitorTest, RegexMatch) { +TEST_P(CypherMainVisitorTest, RegexMatch) { { - TypeParam ast_generator( - "MATCH (n) WHERE n.name =~ \".*bla.*\" RETURN n.name"); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>(ast_generator.ParseQuery( + "MATCH (n) WHERE n.name =~ \".*bla.*\" RETURN n.name")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_; @@ -2599,8 +2765,9 @@ TYPED_TEST(CypherMainVisitorTest, RegexMatch) { ast_generator.CheckLiteral(regex_match->regex_, ".*bla.*"); } { - TypeParam ast_generator("RETURN \"text\" =~ \".*bla.*\""); - auto *query = dynamic_cast<CypherQuery *>(ast_generator.query_); + auto &ast_generator = *GetParam(); + auto *query = dynamic_cast<CypherQuery *>( + ast_generator.ParseQuery("RETURN \"text\" =~ \".*bla.*\"")); ASSERT_TRUE(query); ASSERT_TRUE(query->single_query_); auto *single_query = query->single_query_;