aboutsummaryrefslogtreecommitdiff
path: root/test/option.cc
diff options
context:
space:
mode:
Diffstat (limited to 'test/option.cc')
-rw-r--r--test/option.cc89
1 files changed, 89 insertions, 0 deletions
diff --git a/test/option.cc b/test/option.cc
new file mode 100644
index 0000000..8697089
--- /dev/null
+++ b/test/option.cc
@@ -0,0 +1,89 @@
+#include <option.h>
+#include <cstdlib>
+#include <cstdio>
+
+struct Checker {
+ static unsigned cnt;
+
+ Checker() {
+ ++cnt;
+ }
+ Checker(const Checker&) {
+ ++cnt;
+ }
+ Checker(Checker&&) {
+ ++cnt;
+ }
+ ~Checker() {
+ --cnt;
+ }
+};
+
+unsigned Checker::cnt = 0;
+
+int main() {
+ using option::option;
+
+ auto check_cnt = [](unsigned expect) {
+ if (expect != Checker::cnt) {
+ std::printf("Checker: expect=%u cnt=%u\n", expect, Checker::cnt);
+ std::abort();
+ }
+
+ };
+
+ {
+ option<int> o1;
+ option<int> o2{::option::none{}};
+
+ assert(!o1.has_value());
+ assert(!o2.has_value());
+ }
+
+ // Assume we start test with cnt=0.
+ check_cnt(0);
+
+ {
+ option<Checker> o1(Checker{});
+ // copy construct
+ option<Checker> o2 = o1;
+ // move construct
+ option<Checker> o3 = o1.take();
+
+ assert(!o1.has_value());
+ assert(o2.has_value());
+ assert(o3.has_value());
+
+ // move option
+ option<Checker> o4 = std::move(o2);
+
+ assert(!o2.has_value());
+ assert(o4.has_value());
+
+ // take reference to inner
+ auto x = o3.value();
+ // take ownership of inner
+ auto y = o4.take();
+
+ assert(!o1.has_value());
+ assert(!o2.has_value());
+ assert(o3.has_value());
+ assert(!o4.has_value());
+ }
+
+ // Expect to finish test with cnt=0.
+ check_cnt(0);
+
+ {
+ option<Checker> o1;
+ assert(!o1.has_value());
+
+ o1.emplace();
+ assert(o1.has_value());
+ }
+
+ // Expect to finish test with cnt=0.
+ check_cnt(0);
+
+ return 0;
+}