// // maybe_null.t.h // pointers // // Created by Sam Jaffe on 12/2/16. // // Define DEBUG in order to obtain certain checks... #ifndef DEBUG #define DEBUG #endif #include "pointers/maybe_null.hpp" #include #include #include "test_stubs.h" using namespace pointers; TEST(MaybeNullPtrTest, NullPtrEvaluatesAsFalse) { maybe_null> mn{nullptr}; EXPECT_FALSE(mn); } TEST(MaybeNullPtrTest, ValidPtrEvaluatesAsTrue) { maybe_null> mn{std::make_shared(0)}; EXPECT_TRUE(mn); } TEST(MaybeNullPtrTest, DereferencingNullPtrThrows) { maybe_null> mn{nullptr}; EXPECT_THROW(*mn, unchecked_pointer_exception); } TEST(MaybeNullPtrTest, ContainsInnerPtrForEquality) { std::shared_ptr i{new int}; maybe_null> n{i}; EXPECT_TRUE(n); EXPECT_THAT(n.get(), i.get()); EXPECT_THAT(*n, *i); } TEST(MaybeNullPtrTest, UpcastedPointerStillEqual) { struct base {}; struct derived : public base {}; derived d; maybe_null m{&d}; maybe_null b = m; EXPECT_THAT(b.get(), m.get()); } TEST(MaybeNullPtrTest, CanModifyInnerValue) { std::shared_ptr i{new int{5}}; maybe_null> n{i}; EXPECT_TRUE(n); EXPECT_THAT(*n, 5); *n = 4; EXPECT_TRUE(n); EXPECT_THAT(*i, 4); } TEST(MaybeNullPtrTest, DoesNotDeleteRawPtr) { bool has_delete{false}; destructor_sentinal * test_struct = new destructor_sentinal{has_delete}; maybe_null{test_struct}; EXPECT_FALSE(has_delete); delete test_struct; EXPECT_TRUE(has_delete); }