aboutsummaryrefslogtreecommitdiff
path: root/Examples/test-suite/octave/cpp11_std_unique_ptr_runme.m
diff options
context:
space:
mode:
Diffstat (limited to 'Examples/test-suite/octave/cpp11_std_unique_ptr_runme.m')
-rw-r--r--Examples/test-suite/octave/cpp11_std_unique_ptr_runme.m138
1 files changed, 138 insertions, 0 deletions
diff --git a/Examples/test-suite/octave/cpp11_std_unique_ptr_runme.m b/Examples/test-suite/octave/cpp11_std_unique_ptr_runme.m
new file mode 100644
index 000000000..dbd461711
--- /dev/null
+++ b/Examples/test-suite/octave/cpp11_std_unique_ptr_runme.m
@@ -0,0 +1,138 @@
+# do not dump Octave core
+if exist("crash_dumps_octave_core", "builtin")
+ crash_dumps_octave_core(0);
+endif
+
+cpp11_std_unique_ptr
+
+function checkCount(expected_count)
+ actual_count = Klass_getTotal_count();
+ if (actual_count != expected_count)
+ error("Counts incorrect, expected:%d actual:%d", expected_count, actual_count);
+ endif
+end
+
+# Test raw pointer handling involving virtual inheritance
+kini = KlassInheritance("KlassInheritanceInput");
+checkCount(1);
+s = useKlassRawPtr(kini);
+if (!strcmp(s, "KlassInheritanceInput"))
+ error("Incorrect string: %s", s);
+endif
+clear kini;
+checkCount(0);
+
+
+# unique_ptr as input
+kin = Klass("KlassInput");
+checkCount(1);
+s = takeKlassUniquePtr(kin);
+checkCount(0);
+if (!strcmp(s, "KlassInput"))
+ error("Incorrect string: %s", s);
+endif
+if (!is_nullptr(kin))
+ error("is_nullptr failed");
+endif
+clear kin; # Should not fail, even though already deleted
+checkCount(0);
+
+kin = Klass("KlassInput");
+checkCount(1);
+s = takeKlassUniquePtr(kin);
+checkCount(0);
+if (!strcmp(s, "KlassInput"))
+ error("Incorrect string: %s", s);
+endif
+if (!is_nullptr(kin))
+ error("is_nullptr failed");
+endif
+exception_thrown = false;
+try
+ takeKlassUniquePtr(kin);
+catch e
+ if (isempty(strfind(e.message, "cannot release ownership as memory is not owned")))
+ error("incorrect exception message %s", e.message);
+ endif
+ exception_thrown = true;
+end_try_catch
+if (!exception_thrown)
+ error("double usage of takeKlassUniquePtr should have been an error");
+endif
+clear kin; # Should not fail, even though already deleted
+checkCount(0);
+
+kin = Klass("KlassInput");
+exception_thrown = false;
+notowned = get_not_owned_ptr(kin);
+try
+ takeKlassUniquePtr(notowned);
+catch e
+ if (isempty(strfind(e.message, "cannot release ownership as memory is not owned")))
+ error("incorrect exception message %s", e.message);
+ endif
+ exception_thrown = true;
+end_try_catch
+if (!exception_thrown)
+ error("Should have thrown 'Cannot release ownership as memory is not owned' error");
+endif
+checkCount(1);
+clear kin;
+checkCount(0);
+
+kini = KlassInheritance("KlassInheritanceInput");
+checkCount(1);
+s = takeKlassUniquePtr(kini);
+checkCount(0);
+if (!strcmp(s, "KlassInheritanceInput"))
+ error("Incorrect string: %s", s);
+endif
+if (!is_nullptr(kini))
+ error("is_nullptr failed");
+endif
+clear kini; # Should not fail, even though already deleted
+checkCount(0);
+
+null = []; # NULL pointer
+null_ptr = make_null();
+takeKlassUniquePtr([]);
+takeKlassUniquePtr(null);
+takeKlassUniquePtr(null_ptr);
+checkCount(0);
+
+# overloaded parameters
+if (overloadTest() != 0)
+ error("overloadTest failed");
+endif
+if (overloadTest(null) != 1)
+ error("overloadTest failed");
+endif
+if (overloadTest(Klass("over")) != 1)
+ error("overloadTest failed");
+endif
+checkCount(0);
+
+
+# unique_ptr as output
+k1 = makeKlassUniquePtr("first");
+if (!strcmp(k1.getLabel(), "first"))
+ error("wrong object label");
+endif
+
+k2 = makeKlassUniquePtr("second");
+checkCount(2);
+
+clear k1;
+checkCount(1);
+
+if (!strcmp(k2.getLabel(), "second"))
+ error("wrong object label");
+endif
+
+clear k2;
+checkCount(0);
+
+null_smart_prt = makeNullUniquePtr();
+assert(ismatrix(null_smart_prt))
+assert(size(null_smart_prt) == size([]))
+assert(isequal([], null_smart_prt))