diff options
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.m | 138 |
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)) |