Squashed 'third_party/optional/' content from commit 1baad184f
Change-Id: I9b2473a84dcf6d9892f1f7a9fd21b340796b6ff5
git-subtree-dir: third_party/optional
git-subtree-split: 1baad184f022a3a7502db094a984a86adedf9626
diff --git a/tests/assignment.cpp b/tests/assignment.cpp
new file mode 100644
index 0000000..205ed7b
--- /dev/null
+++ b/tests/assignment.cpp
@@ -0,0 +1,71 @@
+#include "catch.hpp"
+#include "optional.hpp"
+
+TEST_CASE("Assignment value", "[assignment.value]") {
+ tl::optional<int> o1 = 42;
+ tl::optional<int> o2 = 12;
+ tl::optional<int> o3;
+
+ o1 = o1;
+ REQUIRE(*o1 == 42);
+
+ o1 = o2;
+ REQUIRE(*o1 == 12);
+
+ o1 = o3;
+ REQUIRE(!o1);
+
+ o1 = 42;
+ REQUIRE(*o1 == 42);
+
+ o1 = tl::nullopt;
+ REQUIRE(!o1);
+
+ o1 = std::move(o2);
+ REQUIRE(*o1 == 12);
+
+ tl::optional<short> o4 = 42;
+
+ o1 = o4;
+ REQUIRE(*o1 == 42);
+
+ o1 = std::move(o4);
+ REQUIRE(*o1 == 42);
+}
+
+
+TEST_CASE("Assignment reference", "[assignment.ref]") {
+ auto i = 42;
+ auto j = 12;
+
+ tl::optional<int&> o1 = i;
+ tl::optional<int&> o2 = j;
+ tl::optional<int&> o3;
+
+ o1 = o1;
+ REQUIRE(*o1 == 42);
+ REQUIRE(&*o1 == &i);
+
+ o1 = o2;
+ REQUIRE(*o1 == 12);
+
+ o1 = o3;
+ REQUIRE(!o1);
+
+ auto k = 42;
+ o1 = k;
+ REQUIRE(*o1 == 42);
+ REQUIRE(*o1 == i);
+ REQUIRE(*o1 == k);
+ REQUIRE(&*o1 != &i);
+ REQUIRE(&*o1 == &k);
+
+ k = 12;
+ REQUIRE(*o1 == 12);
+
+ o1 = tl::nullopt;
+ REQUIRE(!o1);
+
+ o1 = std::move(o2);
+ REQUIRE(*o1 == 12);
+}