From 343d872be9f91e5fcb9167021790831458cbf19c Mon Sep 17 00:00:00 2001 From: Steven Le Rouzic Date: Fri, 1 Nov 2024 22:56:06 +0100 Subject: More work on option --- asl/tests/meta_tests.cpp | 12 +++++++ asl/tests/option_tests.cpp | 80 +++++++++++++++++++++++++++++++++++++++++++++- asl/tests/test_types.hpp | 4 +-- 3 files changed, 93 insertions(+), 3 deletions(-) (limited to 'asl/tests') diff --git a/asl/tests/meta_tests.cpp b/asl/tests/meta_tests.cpp index 5de4f8d..4397763 100644 --- a/asl/tests/meta_tests.cpp +++ b/asl/tests/meta_tests.cpp @@ -168,3 +168,15 @@ static_assert(!asl::trivially_copyable); static_assert(!asl::trivially_copyable); static_assert(asl::trivially_copyable); static_assert(asl::trivially_copyable); + +class Base {}; +class Derived : public Base {}; +class C {}; +class D { public: operator C() { return c; } C c; }; +class E { public: template E(T&&) {} }; + +static_assert(asl::convertible); +static_assert(!asl::convertible); +static_assert(asl::convertible); +static_assert(!asl::convertible); +static_assert(asl::convertible); diff --git a/asl/tests/option_tests.cpp b/asl/tests/option_tests.cpp index e7fff8b..dea046e 100644 --- a/asl/tests/option_tests.cpp +++ b/asl/tests/option_tests.cpp @@ -1,6 +1,13 @@ #include "asl/option.hpp" #include "asl/tests/test_types.hpp" -#include "asl/testing/testing.hpp" +#include "asl/testing/testing.hpp" + +class Base {}; +class Derived : public Base {}; + +static_assert(!asl::is_option); +static_assert(asl::is_option>); +static_assert(asl::is_option>); static_assert(asl::trivially_destructible>); static_assert(!asl::trivially_destructible>); @@ -22,8 +29,39 @@ static_assert(!asl::copy_assignable>); static_assert(asl::move_assignable>); static_assert(asl::move_assignable>); +static_assert(asl::move_assignable>); static_assert(!asl::move_assignable>); +static_assert(asl::assignable&, asl::option>); +static_assert(!asl::assignable&, asl::option>); + +static_assert(!asl::convertible, asl::option>); +static_assert(asl::convertible, asl::option>); + +class ExplicitConversion { public: explicit ExplicitConversion(int) {} }; +class ImplicitConversion { public: ImplicitConversion(int) {} }; // NOLINT + +static_assert(!asl::convertible); +static_assert(asl::convertible); + +static_assert(!asl::convertible>); +static_assert(asl::convertible>); + +static_assert(!asl::convertible, asl::option>); +static_assert(asl::convertible, asl::option>); + +static_assert(asl::trivially_copy_constructible>); +static_assert(!asl::trivially_copy_constructible>); + +static_assert(asl::trivially_move_constructible>); +static_assert(!asl::trivially_move_constructible>); + +static_assert(asl::trivially_copy_assignable>); +static_assert(!asl::trivially_copy_assignable>); + +static_assert(asl::trivially_move_assignable>); +static_assert(!asl::trivially_move_assignable>); + ASL_TEST(make_null) { asl::option a; @@ -111,3 +149,43 @@ ASL_TEST(deduction_guide) asl::option opt(45); ASL_TEST_EXPECT(opt.value() == 45); } + +ASL_TEST(convert_copy) +{ + asl::option opt8 = uint8_t{8}; + asl::option opt16 = opt8; + + ASL_TEST_EXPECT(opt16.has_value()); + ASL_TEST_EXPECT(opt16.value() == 8); + + opt8 = uint8_t{10}; + ASL_TEST_EXPECT(opt8.has_value()); + ASL_TEST_EXPECT(opt8.value() == 10); + + opt16 = asl::nullopt; + ASL_TEST_EXPECT(!opt16.has_value()); + + opt16 = opt8; + ASL_TEST_EXPECT(opt16.has_value()); + ASL_TEST_EXPECT(opt16.value() == 10); +} + +ASL_TEST(convert_move) +{ + asl::option opt8 = uint8_t{8}; + asl::option opt16 = ASL_MOVE(opt8); + + ASL_TEST_EXPECT(opt16.has_value()); + ASL_TEST_EXPECT(opt16.value() == 8); + + opt8 = ASL_MOVE(uint8_t{10}); + ASL_TEST_EXPECT(opt8.has_value()); + ASL_TEST_EXPECT(opt8.value() == 10); + + opt16 = asl::nullopt; + ASL_TEST_EXPECT(!opt16.has_value()); + + opt16 = ASL_MOVE(opt8); + ASL_TEST_EXPECT(opt16.has_value()); + ASL_TEST_EXPECT(opt16.value() == 10); +} diff --git a/asl/tests/test_types.hpp b/asl/tests/test_types.hpp index cabc084..f988aec 100644 --- a/asl/tests/test_types.hpp +++ b/asl/tests/test_types.hpp @@ -14,11 +14,11 @@ struct MoveConstructible { MoveConstructible(MoveConstructible&&) {} }; struct TriviallyMoveConstructible { TriviallyMoveConstructible(TriviallyMoveConstructible&&) = default; }; struct NonMoveConstructible { NonMoveConstructible(NonMoveConstructible&&) = delete; }; -struct CopyAssignable { CopyAssignable& operator=(const CopyAssignable&) { return *this; } }; +struct CopyAssignable { CopyAssignable(const CopyAssignable&) {} CopyAssignable& operator=(const CopyAssignable&) { return *this; } }; struct TriviallyCopyAssignable { TriviallyCopyAssignable& operator=(const TriviallyCopyAssignable&) = default; }; struct NonCopyAssignable { NonCopyAssignable& operator=(const NonCopyAssignable&) = delete; }; -struct MoveAssignable { MoveAssignable& operator=(MoveAssignable&&) { return *this; } }; +struct MoveAssignable { MoveAssignable(MoveAssignable&&) {} MoveAssignable& operator=(MoveAssignable&&) { return *this; } }; struct TriviallyMoveAssignable { TriviallyMoveAssignable& operator=(TriviallyMoveAssignable&&) = default; }; struct NonMoveAssignable { NonMoveAssignable& operator=(NonMoveAssignable&&) = delete; }; -- cgit