summaryrefslogtreecommitdiff
path: root/vendor/CppQuickCheck-2018-03-28/include/cppqc/CompactCheck.h
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/CppQuickCheck-2018-03-28/include/cppqc/CompactCheck.h')
-rw-r--r--vendor/CppQuickCheck-2018-03-28/include/cppqc/CompactCheck.h178
1 files changed, 178 insertions, 0 deletions
diff --git a/vendor/CppQuickCheck-2018-03-28/include/cppqc/CompactCheck.h b/vendor/CppQuickCheck-2018-03-28/include/cppqc/CompactCheck.h
new file mode 100644
index 00000000..cdd204a0
--- /dev/null
+++ b/vendor/CppQuickCheck-2018-03-28/include/cppqc/CompactCheck.h
@@ -0,0 +1,178 @@
+/*
+ * Copyright (c) 2016, Vladimir Strisovsky All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "Test.h"
+#include "Arbitrary.h"
+
+namespace cppqc
+{
+
+template<typename Function>
+struct CompactCheckFunction
+{
+ using type = Function;
+ Function m_Function;
+
+ CompactCheckFunction(Function&& fnc)
+ : m_Function(std::move(fnc))
+ {}
+
+ CompactCheckFunction(CompactCheckFunction&&) = default;
+
+ static const bool valid = true;
+
+ template<typename ReturnType, typename ... T>
+ ReturnType apply(ReturnType, const T& ... v) const
+ {
+ return m_Function(v ...);
+ }
+};
+
+template<>
+struct CompactCheckFunction<void>
+{
+ using type = void;
+ static const bool valid = false;
+
+ CompactCheckFunction() = default;
+ CompactCheckFunction(CompactCheckFunction&&) = default;
+
+ template<typename ReturnType, typename ... T>
+ ReturnType apply(ReturnType r, const T& ... v) const
+ {
+ return r;
+ }
+};
+
+template<typename CheckFunction, typename TrivialFunction, typename ClassifyFunction, typename ... T>
+class CompactCheck : public Property<T ...>
+{
+ std::string m_name;
+
+ template<typename _CheckFunction, typename _TrivialFunction, typename _ClassifyFunction, typename ... _T>
+ friend class CompactCheck;
+
+ using CheckFunctionT = CompactCheckFunction<CheckFunction>;
+ CheckFunctionT m_checkFnc;
+
+ using TrivialFunctionT = CompactCheckFunction<TrivialFunction>;
+ TrivialFunctionT m_trivialFnc;
+
+ using ClassifyFunctionT = CompactCheckFunction<ClassifyFunction>;
+ ClassifyFunctionT m_classifyFnc;
+
+ CompactCheck( std::string name,
+ CheckFunctionT&& checkFunction,
+ TrivialFunctionT&& trivialFunctions,
+ ClassifyFunctionT&& classifyFunction)
+ : m_name(std::move(name))
+ , m_checkFnc(std::move(checkFunction))
+ , m_trivialFnc(std::move(trivialFunctions))
+ , m_classifyFnc(std::move(classifyFunction))
+ {}
+
+ bool check(const T& ... v) const override
+ {
+ return m_checkFnc.apply(true, v ...);
+ }
+
+ bool trivial(const T& ... v) const override
+ {
+ return m_trivialFnc.apply(false, v ...);
+ }
+
+ std::string classify(const T& ... v) const override
+ {
+ return m_classifyFnc.apply(std::string(), v ...);
+ }
+
+ std::string name() const
+ {
+ return m_name.empty() ? "no-name" : m_name;
+ }
+
+public:
+ CompactCheck()
+ {}
+
+ CompactCheck(const Generator<T>& ... g)
+ : Property<T ...>(g ...)
+ {}
+
+ template<typename _CheckFunction>
+ CompactCheck<_CheckFunction, TrivialFunction, ClassifyFunction, T ...> property(const std::string& name, _CheckFunction&& checkFnc)
+ {
+ static_assert(CheckFunctionT::valid == false, "Check function is already set");
+ return CompactCheck<_CheckFunction, TrivialFunction, ClassifyFunction, T ...>( name,
+ std::move(checkFnc),
+ std::move(m_trivialFnc),
+ std::move(m_classifyFnc));
+ }
+
+ template<typename _TrivialFunction>
+ CompactCheck<CheckFunction, _TrivialFunction, ClassifyFunction, T ...> trivial(_TrivialFunction&& trivialFnc)
+ {
+ static_assert(TrivialFunctionT::valid == false, "Trivial function is already set");
+ return CompactCheck<CheckFunction, _TrivialFunction, ClassifyFunction, T ...>( std::move(m_name),
+ std::move(m_checkFnc),
+ std::move(trivialFnc),
+ std::move(m_classifyFnc));
+ }
+
+ template<typename _ClassifyFunction>
+ CompactCheck<CheckFunction, TrivialFunction, _ClassifyFunction, T ...> classify(_ClassifyFunction&& classifyFnc)
+ {
+ static_assert(ClassifyFunctionT::valid == false, "Classsify function is already set");
+ return CompactCheck<CheckFunction, TrivialFunction, _ClassifyFunction, T ...>( std::move(m_name),
+ std::move(m_checkFnc),
+ std::move(m_trivialFnc),
+ std::move(classifyFnc));
+ }
+
+ Result test( std::size_t maxSuccess = 100, std::size_t maxDiscarded = 0, std::size_t maxSize = 0)
+ {
+ return quickCheck(*this, maxSuccess, maxDiscarded, maxSize);
+ }
+
+ Result testWithOutput( std::ostream &out = std::cout, std::size_t maxSuccess = 100, std::size_t maxDiscarded = 0, std::size_t maxSize = 0)
+ {
+ return quickCheckOutput(*this, out, maxSuccess, maxDiscarded, maxSize);
+ }
+};
+
+template<typename ... T>
+CompactCheck<void, void, void, T ...> gen()
+{
+ return CompactCheck<void, void, void, T ...>();
+}
+
+template<typename ... T>
+CompactCheck<void, void, void, T ...> gen(const Generator<T>& ... g)
+{
+ return CompactCheck<void, void, void, T ...>(g ...);
+}
+
+
+}