From 2693b0102e673ab443a74daaa4898d59a998570f Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Thu, 15 Sep 2016 10:38:11 +0200 Subject: [PATCH] Add VectorVerifiers to check against glm::ivecX, glm::dvecX, and glm::bvecX --- include/openspace/documentation/verifier.h | 48 +++ include/openspace/documentation/verifier.inl | 36 +++ src/documentation/verifier.cpp | 10 + tests/test_documentation.inl | 290 ++++++++++++++++++- 4 files changed, 383 insertions(+), 1 deletion(-) diff --git a/include/openspace/documentation/verifier.h b/include/openspace/documentation/verifier.h index 533c7e992a..d6ca25dac4 100644 --- a/include/openspace/documentation/verifier.h +++ b/include/openspace/documentation/verifier.h @@ -79,6 +79,29 @@ struct TableVerifier : public TemplateVerifier { std::vector doc; }; +struct VectorVerifier {}; + +template +struct Vector2Verifier : public TemplateVerifier>, public VectorVerifier { + bool test(const ghoul::Dictionary& dict, const std::string& key) const override; + + std::string documentation() const override; +}; + +template +struct Vector3Verifier : public TemplateVerifier>, public VectorVerifier { + bool test(const ghoul::Dictionary& dict, const std::string& key) const override; + + std::string documentation() const override; +}; + +template +struct Vector4Verifier : public TemplateVerifier>, public VectorVerifier { + bool test(const ghoul::Dictionary& dict, const std::string& key) const override; + + std::string documentation() const override; +}; + // Operator Verifiers template @@ -86,6 +109,7 @@ struct LessVerifier : public T { static_assert(!std::is_base_of_v, "T cannot be BoolVerifier"); static_assert(!std::is_base_of_v, "T cannot be StringVerifier"); static_assert(!std::is_base_of_v, "T cannot be TableVerifier"); + static_assert(!std::is_base_of_v, "T cannot be TableVerifier"); LessVerifier(typename T::Type value); @@ -101,6 +125,7 @@ struct LessEqualVerifier : public T { static_assert(!std::is_base_of_v, "T cannot be BoolVerifier"); static_assert(!std::is_base_of_v, "T cannot be StringVerifier"); static_assert(!std::is_base_of_v, "T cannot be TableVerifier"); + static_assert(!std::is_base_of_v, "T cannot be TableVerifier"); LessEqualVerifier(typename T::Type value); @@ -116,6 +141,7 @@ struct GreaterVerifier : public T { static_assert(!std::is_base_of_v, "T cannot be BoolVerifier"); static_assert(!std::is_base_of_v, "T cannot be StringVerifier"); static_assert(!std::is_base_of_v, "T cannot be TableVerifier"); + static_assert(!std::is_base_of_v, "T cannot be TableVerifier"); GreaterVerifier(typename T::Type value); @@ -131,6 +157,7 @@ struct GreaterEqualVerifier : public T { static_assert(!std::is_base_of_v, "T cannot be BoolVerifier"); static_assert(!std::is_base_of_v, "T cannot be StringVerifier"); static_assert(!std::is_base_of_v, "T cannot be TableVerifier"); + static_assert(!std::is_base_of_v, "T cannot be TableVerifier"); GreaterEqualVerifier(typename T::Type value); @@ -201,6 +228,7 @@ struct InRangeVerifier : public T { static_assert(!std::is_base_of_v, "T cannot be BoolVerifier"); static_assert(!std::is_base_of_v, "T cannot be StringVerifier"); static_assert(!std::is_base_of_v, "T cannot be TableVerifier"); + static_assert(!std::is_base_of_v, "T cannot be TableVerifier"); InRangeVerifier(typename T::Type lower, typename T::Type upper); @@ -217,6 +245,7 @@ struct NotInRangeVerifier : public T { static_assert(!std::is_base_of_v, "T cannot be BoolVerifier"); static_assert(!std::is_base_of_v, "T cannot be StringVerifier"); static_assert(!std::is_base_of_v, "T cannot be TableVerifier"); + static_assert(!std::is_base_of_v, "T cannot be TableVerifier"); NotInRangeVerifier(typename T::Type lower, typename T::Type upper); @@ -265,6 +294,16 @@ struct OrVerifier : public Verifier { std::shared_ptr b; }; +using BoolVector2Verifier = Vector2Verifier; +using IntVector2Verifier = Vector2Verifier; +using DoubleVector2Verifier = Vector2Verifier; +using BoolVector3Verifier = Vector3Verifier; +using IntVector3Verifier = Vector3Verifier; +using DoubleVector3Verifier = Vector3Verifier; +using BoolVector4Verifier = Vector4Verifier; +using IntVector4Verifier = Vector4Verifier; +using DoubleVector4Verifier = Vector4Verifier; + using IntLessVerifier = LessVerifier; using DoubleLessVerifier = LessVerifier; using IntLessEqualVerifier = LessEqualVerifier; @@ -302,6 +341,15 @@ using DoubleAnnotationVerifier = AnnotationVerifier; using StringAnnotationVerifier = AnnotationVerifier; using TableAnnotationVerifier = AnnotationVerifier; +extern template struct Vector2Verifier; +extern template struct Vector2Verifier; +extern template struct Vector2Verifier; +extern template struct Vector3Verifier; +extern template struct Vector3Verifier; +extern template struct Vector3Verifier; +extern template struct Vector4Verifier; +extern template struct Vector4Verifier; +extern template struct Vector4Verifier; extern template struct LessVerifier; extern template struct LessVerifier; diff --git a/include/openspace/documentation/verifier.inl b/include/openspace/documentation/verifier.inl index c2b8f0d02d..040a0b09e7 100644 --- a/include/openspace/documentation/verifier.inl +++ b/include/openspace/documentation/verifier.inl @@ -31,6 +31,42 @@ std::string to_string(std::string value); namespace openspace { namespace documentation { +template +bool Vector2Verifier::test(const ghoul::Dictionary& d, const std::string& k) const { + return d.hasKeyAndValue>(k); +} + +template +std::string Vector2Verifier::documentation() const { + using namespace std::string_literals; + + return "Type: Vector2<"s + typeid(T).name() + ">"; +} + +template +bool Vector3Verifier::test(const ghoul::Dictionary& d, const std::string& k) const { + return d.hasKeyAndValue>(k); +} + +template +std::string Vector3Verifier::documentation() const { + using namespace std::string_literals; + + return "Type: Vector3<"s + typeid(T).name() + ">"; +} + +template +bool Vector4Verifier::test(const ghoul::Dictionary& d, const std::string& k) const { + return d.hasKeyAndValue>(k); +} + +template +std::string Vector4Verifier::documentation() const { + using namespace std::string_literals; + + return "Type: Vector4<"s + typeid(T).name() + ">"; +} + template LessVerifier::LessVerifier(typename T::Type value) : value(std::move(value)) diff --git a/src/documentation/verifier.cpp b/src/documentation/verifier.cpp index 4c8a8a2543..8e8c04e850 100644 --- a/src/documentation/verifier.cpp +++ b/src/documentation/verifier.cpp @@ -27,6 +27,16 @@ namespace openspace { namespace documentation { +template struct Vector2Verifier; +template struct Vector2Verifier; +template struct Vector2Verifier; +template struct Vector3Verifier; +template struct Vector3Verifier; +template struct Vector3Verifier; +template struct Vector4Verifier; +template struct Vector4Verifier; +template struct Vector4Verifier; + template struct LessVerifier; template struct LessVerifier; template struct LessEqualVerifier; diff --git a/tests/test_documentation.inl b/tests/test_documentation.inl index 9ddc0efda4..773088cad8 100644 --- a/tests/test_documentation.inl +++ b/tests/test_documentation.inl @@ -1752,7 +1752,7 @@ TEST_F(DocumentationTest, OrOperator) { }; ghoul::Dictionary positive { - { "a", ""s} + { "a", ""s } }; TestResult positiveRes = testSpecification(doc, positive); EXPECT_TRUE(positiveRes.success); @@ -1773,3 +1773,291 @@ TEST_F(DocumentationTest, OrOperator) { ASSERT_EQ(1, negativeRes.offenders.size()); EXPECT_EQ("a", negativeRes.offenders[0]); } + +TEST_F(DocumentationTest, BoolVector2Verifier) { + using namespace openspace::documentation; + + Documentation doc { + "Test", + {{ "a", new BoolVector2Verifier }} + }; + + ghoul::Dictionary positive { + { "a", glm::bvec2(true) } + }; + TestResult positiveRes = testSpecification(doc, positive); + EXPECT_TRUE(positiveRes.success); + EXPECT_EQ(0, positiveRes.offenders.size()); + + ghoul::Dictionary negative { + { "a", ghoul::Dictionary{ {"1", true}, {"2", 1.0} } } + }; + TestResult negativeRes = testSpecification(doc, negative); + EXPECT_FALSE(negativeRes.success); + ASSERT_EQ(1, negativeRes.offenders.size()); + EXPECT_EQ("a", negativeRes.offenders[0]); + + ghoul::Dictionary negative2 { + { "a", true } + }; + negativeRes = testSpecification(doc, negative2); + EXPECT_FALSE(negativeRes.success); + ASSERT_EQ(1, negativeRes.offenders.size()); + EXPECT_EQ("a", negativeRes.offenders[0]); +} + +TEST_F(DocumentationTest, IntVector2Verifier) { + using namespace openspace::documentation; + + Documentation doc { + "Test", + { { "a", new IntVector2Verifier } } + }; + + ghoul::Dictionary positive { + { "a", glm::ivec2(2) } + }; + TestResult positiveRes = testSpecification(doc, positive); + EXPECT_TRUE(positiveRes.success); + EXPECT_EQ(0, positiveRes.offenders.size()); + + ghoul::Dictionary negative { + { "a", ghoul::Dictionary{ { "1", true },{ "2", 1 } } } + }; + TestResult negativeRes = testSpecification(doc, negative); + EXPECT_FALSE(negativeRes.success); + ASSERT_EQ(1, negativeRes.offenders.size()); + EXPECT_EQ("a", negativeRes.offenders[0]); + + ghoul::Dictionary negative2 { + { "a", true } + }; + negativeRes = testSpecification(doc, negative2); + EXPECT_FALSE(negativeRes.success); + ASSERT_EQ(1, negativeRes.offenders.size()); + EXPECT_EQ("a", negativeRes.offenders[0]); +} + +TEST_F(DocumentationTest, DoubleVector2Verifier) { + using namespace openspace::documentation; + + Documentation doc{ + "Test", + { { "a", new DoubleVector2Verifier } } + }; + + ghoul::Dictionary positive { + { "a", glm::dvec2(2.0) } + }; + TestResult positiveRes = testSpecification(doc, positive); + EXPECT_TRUE(positiveRes.success); + EXPECT_EQ(0, positiveRes.offenders.size()); + + ghoul::Dictionary negative { + { "a", ghoul::Dictionary{ { "1", true }, { "2", 1.0 } } } + }; + TestResult negativeRes = testSpecification(doc, negative); + EXPECT_FALSE(negativeRes.success); + ASSERT_EQ(1, negativeRes.offenders.size()); + EXPECT_EQ("a", negativeRes.offenders[0]); + + ghoul::Dictionary negative2 { + { "a", true } + }; + negativeRes = testSpecification(doc, negative2); + EXPECT_FALSE(negativeRes.success); + ASSERT_EQ(1, negativeRes.offenders.size()); + EXPECT_EQ("a", negativeRes.offenders[0]); +} + +TEST_F(DocumentationTest, BoolVector3Verifier) { + using namespace openspace::documentation; + + Documentation doc { + "Test", + { { "a", new BoolVector3Verifier } } + }; + + ghoul::Dictionary positive { + { "a", glm::bvec3(true) } + }; + TestResult positiveRes = testSpecification(doc, positive); + EXPECT_TRUE(positiveRes.success); + EXPECT_EQ(0, positiveRes.offenders.size()); + + ghoul::Dictionary negative { + { "a", ghoul::Dictionary{ { "1", true },{ "2", 1.0 }, { "3", "s" } } } + }; + TestResult negativeRes = testSpecification(doc, negative); + EXPECT_FALSE(negativeRes.success); + ASSERT_EQ(1, negativeRes.offenders.size()); + EXPECT_EQ("a", negativeRes.offenders[0]); + + ghoul::Dictionary negative2 { + { "a", true } + }; + negativeRes = testSpecification(doc, negative2); + EXPECT_FALSE(negativeRes.success); + ASSERT_EQ(1, negativeRes.offenders.size()); + EXPECT_EQ("a", negativeRes.offenders[0]); +} + +TEST_F(DocumentationTest, IntVector3Verifier) { + using namespace openspace::documentation; + + Documentation doc { + "Test", + { { "a", new IntVector3Verifier } } + }; + + ghoul::Dictionary positive { + { "a", glm::ivec3(2) } + }; + TestResult positiveRes = testSpecification(doc, positive); + EXPECT_TRUE(positiveRes.success); + EXPECT_EQ(0, positiveRes.offenders.size()); + + ghoul::Dictionary negative { + { "a", ghoul::Dictionary{ { "1", true },{ "2", 1 }, { "3", "s" } } } + }; + TestResult negativeRes = testSpecification(doc, negative); + EXPECT_FALSE(negativeRes.success); + ASSERT_EQ(1, negativeRes.offenders.size()); + EXPECT_EQ("a", negativeRes.offenders[0]); + + ghoul::Dictionary negative2 { + { "a", true } + }; + negativeRes = testSpecification(doc, negative2); + EXPECT_FALSE(negativeRes.success); + ASSERT_EQ(1, negativeRes.offenders.size()); + EXPECT_EQ("a", negativeRes.offenders[0]); +} + +TEST_F(DocumentationTest, DoubleVector3Verifier) { + using namespace openspace::documentation; + + Documentation doc { + "Test", + { { "a", new DoubleVector3Verifier } } + }; + + ghoul::Dictionary positive { + { "a", glm::dvec3(2.0) } + }; + TestResult positiveRes = testSpecification(doc, positive); + EXPECT_TRUE(positiveRes.success); + EXPECT_EQ(0, positiveRes.offenders.size()); + + ghoul::Dictionary negative { + { "a", ghoul::Dictionary{ { "1", true },{ "2", 1.0 }, { "3", "s"} } } + }; + TestResult negativeRes = testSpecification(doc, negative); + EXPECT_FALSE(negativeRes.success); + ASSERT_EQ(1, negativeRes.offenders.size()); + EXPECT_EQ("a", negativeRes.offenders[0]); + + ghoul::Dictionary negative2 { + { "a", true } + }; + negativeRes = testSpecification(doc, negative2); + EXPECT_FALSE(negativeRes.success); + ASSERT_EQ(1, negativeRes.offenders.size()); + EXPECT_EQ("a", negativeRes.offenders[0]); +} + +TEST_F(DocumentationTest, BoolVector4Verifier) { + using namespace openspace::documentation; + + Documentation doc { + "Test", + { { "a", new BoolVector4Verifier } } + }; + + ghoul::Dictionary positive { + { "a", glm::bvec4(true) } + }; + TestResult positiveRes = testSpecification(doc, positive); + EXPECT_TRUE(positiveRes.success); + EXPECT_EQ(0, positiveRes.offenders.size()); + + ghoul::Dictionary negative { + { "a", ghoul::Dictionary{ { "1", true },{ "2", 1.0 }, { "3", "s" }, { "4", 1 }}} + }; + TestResult negativeRes = testSpecification(doc, negative); + EXPECT_FALSE(negativeRes.success); + ASSERT_EQ(1, negativeRes.offenders.size()); + EXPECT_EQ("a", negativeRes.offenders[0]); + + ghoul::Dictionary negative2 { + { "a", true } + }; + negativeRes = testSpecification(doc, negative2); + EXPECT_FALSE(negativeRes.success); + ASSERT_EQ(1, negativeRes.offenders.size()); + EXPECT_EQ("a", negativeRes.offenders[0]); +} + +TEST_F(DocumentationTest, IntVector4Verifier) { + using namespace openspace::documentation; + + Documentation doc { + "Test", + { { "a", new IntVector4Verifier } } + }; + + ghoul::Dictionary positive { + { "a", glm::ivec4(2) } + }; + TestResult positiveRes = testSpecification(doc, positive); + EXPECT_TRUE(positiveRes.success); + EXPECT_EQ(0, positiveRes.offenders.size()); + + ghoul::Dictionary negative { + { "a", ghoul::Dictionary{ { "1", true },{ "2", 1 },{ "3", "s" }, { "4", 1 } } } + }; + TestResult negativeRes = testSpecification(doc, negative); + EXPECT_FALSE(negativeRes.success); + ASSERT_EQ(1, negativeRes.offenders.size()); + EXPECT_EQ("a", negativeRes.offenders[0]); + + ghoul::Dictionary negative2{ + { "a", true } + }; + negativeRes = testSpecification(doc, negative2); + EXPECT_FALSE(negativeRes.success); + ASSERT_EQ(1, negativeRes.offenders.size()); + EXPECT_EQ("a", negativeRes.offenders[0]); +} + +TEST_F(DocumentationTest, DoubleVector4Verifier) { + using namespace openspace::documentation; + + Documentation doc { + "Test", + { { "a", new DoubleVector4Verifier } } + }; + + ghoul::Dictionary positive { + { "a", glm::dvec4(2.0) } + }; + TestResult positiveRes = testSpecification(doc, positive); + EXPECT_TRUE(positiveRes.success); + EXPECT_EQ(0, positiveRes.offenders.size()); + + ghoul::Dictionary negative { + { "a", ghoul::Dictionary{ { "1", true },{ "2", 1.0 },{ "3", "s" }, { "4", 1 } } } + }; + TestResult negativeRes = testSpecification(doc, negative); + EXPECT_FALSE(negativeRes.success); + ASSERT_EQ(1, negativeRes.offenders.size()); + EXPECT_EQ("a", negativeRes.offenders[0]); + + ghoul::Dictionary negative2 { + { "a", true } + }; + negativeRes = testSpecification(doc, negative2); + EXPECT_FALSE(negativeRes.success); + ASSERT_EQ(1, negativeRes.offenders.size()); + EXPECT_EQ("a", negativeRes.offenders[0]); +}