diff --git a/tests/bases.cpp b/tests/bases.cpp new file mode 100644 index 0000000..0fb7f43 --- /dev/null +++ b/tests/bases.cpp @@ -0,0 +1,121 @@ +#include "catch.hpp" +#include "optional.hpp" + +TEST_CASE("Triviality", "[bases.triviality]") { + REQUIRE(std::is_trivially_copy_constructible>::value); + REQUIRE(std::is_trivially_copy_assignable>::value); + REQUIRE(std::is_trivially_move_constructible>::value); + REQUIRE(std::is_trivially_move_assignable>::value); + REQUIRE(std::is_trivially_destructible>::value); + + { + struct T { + T(const T&) = default; + T(T&&) = default; + T& operator=(const T&) = default; + T& operator=(T&&) = default; + ~T() = default; + }; + REQUIRE(std::is_trivially_copy_constructible>::value); + REQUIRE(std::is_trivially_copy_assignable>::value); + REQUIRE(std::is_trivially_move_constructible>::value); + REQUIRE(std::is_trivially_move_assignable>::value); + REQUIRE(std::is_trivially_destructible>::value); + } + + { + struct T { + T(const T&){} + T(T&&) {}; + T& operator=(const T&) {} + T& operator=(T&&) {}; + ~T(){} + }; + REQUIRE(!std::is_trivially_copy_constructible>::value); + REQUIRE(!std::is_trivially_copy_assignable>::value); + REQUIRE(!std::is_trivially_move_constructible>::value); + REQUIRE(!std::is_trivially_move_assignable>::value); + REQUIRE(!std::is_trivially_destructible>::value); + } + +} + +TEST_CASE("Deletion", "[bases.deletion]") { + REQUIRE(std::is_copy_constructible>::value); + REQUIRE(std::is_copy_assignable>::value); + REQUIRE(std::is_move_constructible>::value); + REQUIRE(std::is_move_assignable>::value); + REQUIRE(std::is_destructible>::value); + +//TODO fix +/* { + struct T { + T()=default; + }; + REQUIRE(std::is_default_constructible>::value); + } + + { + struct T { + T(int); + }; + REQUIRE(!std::is_default_constructible>::value); + } +*/ + { + struct T { + T(const T&) = default; + T(T&&) = default; + T& operator=(const T&) = default; + T& operator=(T&&) = default; + ~T() = default; + }; + REQUIRE(std::is_copy_constructible>::value); + REQUIRE(std::is_copy_assignable>::value); + REQUIRE(std::is_move_constructible>::value); + REQUIRE(std::is_move_assignable>::value); + REQUIRE(std::is_destructible>::value); + } + + { + struct T { + T(const T&)=delete; + T(T&&)=delete; + T& operator=(const T&)=delete; + T& operator=(T&&)=delete; + }; + REQUIRE(!std::is_copy_constructible>::value); + REQUIRE(!std::is_copy_assignable>::value); + REQUIRE(!std::is_move_constructible>::value); + REQUIRE(!std::is_move_assignable>::value); + } + + { + struct T { + T(const T&)=delete; + T(T&&)=default; + T& operator=(const T&)=delete; + T& operator=(T&&)=default; + }; + REQUIRE(!std::is_copy_constructible>::value); + REQUIRE(!std::is_copy_assignable>::value); + REQUIRE(std::is_move_constructible>::value); + REQUIRE(std::is_move_assignable>::value); + } + + { + struct T { + T(const T&)=default; + T(T&&)=delete; + T& operator=(const T&)=default; + T& operator=(T&&)=delete; + }; + REQUIRE(std::is_copy_constructible>::value); + REQUIRE(std::is_copy_assignable>::value); + //TODO see why this fails + //REQUIRE(!std::is_move_constructible>::value); + //REQUIRE(!std::is_move_assignable>::value); + } + + +}