- If Octave segfaults during cleanup, it usually cannot dump its core and therefore just freezes, which hold up e.g Travis build jobs
570 lines
15 KiB
Matlab
570 lines
15 KiB
Matlab
# do not dump Octave core
|
|
if exist("crash_dumps_octave_core", "builtin")
|
|
crash_dumps_octave_core(0);
|
|
endif
|
|
|
|
1;
|
|
li_boost_shared_ptr;
|
|
|
|
function verifyValue(expected, got)
|
|
if (expected ~= got)
|
|
error("verify value failed.");% Expected: ", expected, " Got: ", got)
|
|
end
|
|
endfunction
|
|
|
|
function verifyCount(expected, k)
|
|
got = use_count(k);
|
|
if (expected ~= got)
|
|
error("verify use_count failed. Expected: %d Got: %d ", expected, got);
|
|
end
|
|
endfunction
|
|
|
|
function runtest()
|
|
li_boost_shared_ptr; # KTTODO this needs to be here at present. Global module failure?
|
|
# simple shared_ptr usage - created in C++
|
|
k = Klass("me oh my");
|
|
val = k.getValue();
|
|
verifyValue("me oh my", val)
|
|
verifyCount(1, k)
|
|
|
|
# simple shared_ptr usage - not created in C++
|
|
k = factorycreate();
|
|
val = k.getValue();
|
|
verifyValue("factorycreate", val)
|
|
verifyCount(1, k)
|
|
|
|
# pass by shared_ptr
|
|
k = Klass("me oh my");
|
|
kret = smartpointertest(k);
|
|
val = kret.getValue();
|
|
verifyValue("me oh my smartpointertest", val)
|
|
verifyCount(2, k)
|
|
verifyCount(2, kret)
|
|
|
|
# pass by shared_ptr pointer
|
|
k = Klass("me oh my");
|
|
kret = smartpointerpointertest(k);
|
|
val = kret.getValue();
|
|
verifyValue("me oh my smartpointerpointertest", val)
|
|
verifyCount(2, k)
|
|
verifyCount(2, kret)
|
|
|
|
# pass by shared_ptr reference
|
|
k = Klass("me oh my");
|
|
kret = smartpointerreftest(k);
|
|
val = kret.getValue();
|
|
verifyValue("me oh my smartpointerreftest", val)
|
|
verifyCount(2, k)
|
|
verifyCount(2, kret)
|
|
|
|
# pass by shared_ptr pointer reference
|
|
k = Klass("me oh my");
|
|
kret = smartpointerpointerreftest(k);
|
|
val = kret.getValue();
|
|
verifyValue("me oh my smartpointerpointerreftest", val)
|
|
verifyCount(2, k)
|
|
verifyCount(2, kret)
|
|
|
|
# const pass by shared_ptr
|
|
k = Klass("me oh my");
|
|
kret = constsmartpointertest(k);
|
|
val = kret.getValue();
|
|
verifyValue("me oh my", val)
|
|
verifyCount(2, k)
|
|
verifyCount(2, kret)
|
|
|
|
# const pass by shared_ptr pointer
|
|
k = Klass("me oh my");
|
|
kret = constsmartpointerpointertest(k);
|
|
val = kret.getValue();
|
|
verifyValue("me oh my", val)
|
|
verifyCount(2, k)
|
|
verifyCount(2, kret)
|
|
|
|
# const pass by shared_ptr reference
|
|
k = Klass("me oh my");
|
|
kret = constsmartpointerreftest(k);
|
|
val = kret.getValue();
|
|
verifyValue("me oh my", val)
|
|
verifyCount(2, k)
|
|
verifyCount(2, kret)
|
|
|
|
# pass by value
|
|
k = Klass("me oh my");
|
|
kret = valuetest(k);
|
|
val = kret.getValue();
|
|
verifyValue("me oh my valuetest", val)
|
|
verifyCount(1, k)
|
|
verifyCount(1, kret)
|
|
|
|
# pass by pointer
|
|
k = Klass("me oh my");
|
|
kret = pointertest(k);
|
|
val = kret.getValue();
|
|
verifyValue("me oh my pointertest", val)
|
|
verifyCount(1, k)
|
|
verifyCount(1, kret)
|
|
|
|
# pass by reference
|
|
k = Klass("me oh my");
|
|
kret = reftest(k);
|
|
val = kret.getValue();
|
|
verifyValue("me oh my reftest", val)
|
|
verifyCount(1, k)
|
|
verifyCount(1, kret)
|
|
|
|
# pass by pointer reference
|
|
k = Klass("me oh my");
|
|
kret = pointerreftest(k);
|
|
val = kret.getValue();
|
|
verifyValue("me oh my pointerreftest", val)
|
|
verifyCount(1, k)
|
|
verifyCount(1, kret)
|
|
|
|
# null tests
|
|
#KTODO None not defined
|
|
# k = None;
|
|
|
|
# if (smartpointertest(k) ~= None)
|
|
# error("return was not null")
|
|
# end
|
|
|
|
# if (smartpointerpointertest(k) ~= None)
|
|
# error("return was not null")
|
|
# end
|
|
|
|
# if (smartpointerreftest(k) ~= None)
|
|
# error("return was not null")
|
|
# end
|
|
|
|
# if (smartpointerpointerreftest(k) ~= None)
|
|
# error("return was not null")
|
|
# end
|
|
|
|
# if (nullsmartpointerpointertest(None) ~= "null pointer")
|
|
# error("not null smartpointer pointer")
|
|
# end
|
|
|
|
# # try:
|
|
# # valuetest(k)
|
|
# # error("Failed to catch null pointer")
|
|
# # except ValueError:
|
|
# # pass
|
|
|
|
# if (pointertest(k) ~= None)
|
|
# error("return was not null")
|
|
# end
|
|
|
|
# # try:
|
|
# # reftest(k)
|
|
# # error("Failed to catch null pointer")
|
|
# # except ValueError:
|
|
# # pass
|
|
|
|
# $owner
|
|
k = pointerownertest();
|
|
val = k.getValue();
|
|
verifyValue("pointerownertest", val)
|
|
verifyCount(1, k)
|
|
k = smartpointerpointerownertest();
|
|
val = k.getValue();
|
|
verifyValue("smartpointerpointerownertest", val)
|
|
verifyCount(1, k)
|
|
|
|
# //////////////////////////////// Derived class ////////////////////////////////////////
|
|
# derived pass by shared_ptr
|
|
k = KlassDerived("me oh my");
|
|
kret = derivedsmartptrtest(k);
|
|
val = kret.getValue();
|
|
verifyValue("me oh my derivedsmartptrtest-Derived", val)
|
|
verifyCount(2, k)
|
|
verifyCount(2, kret)
|
|
|
|
# derived pass by shared_ptr pointer
|
|
k = KlassDerived("me oh my");
|
|
kret = derivedsmartptrpointertest(k);
|
|
val = kret.getValue();
|
|
verifyValue("me oh my derivedsmartptrpointertest-Derived", val)
|
|
verifyCount(2, k)
|
|
verifyCount(2, kret)
|
|
|
|
# derived pass by shared_ptr ref
|
|
k = KlassDerived("me oh my");
|
|
kret = derivedsmartptrreftest(k);
|
|
val = kret.getValue();
|
|
verifyValue("me oh my derivedsmartptrreftest-Derived", val)
|
|
verifyCount(2, k)
|
|
verifyCount(2, kret)
|
|
|
|
# derived pass by shared_ptr pointer ref
|
|
k = KlassDerived("me oh my");
|
|
kret = derivedsmartptrpointerreftest(k);
|
|
val = kret.getValue();
|
|
verifyValue("me oh my derivedsmartptrpointerreftest-Derived", val)
|
|
verifyCount(2, k)
|
|
verifyCount(2, kret)
|
|
|
|
# derived pass by pointer
|
|
k = KlassDerived("me oh my");
|
|
kret = derivedpointertest(k);
|
|
val = kret.getValue();
|
|
verifyValue("me oh my derivedpointertest-Derived", val)
|
|
verifyCount(1, k)
|
|
verifyCount(1, kret)
|
|
|
|
# derived pass by ref
|
|
k = KlassDerived("me oh my");
|
|
kret = derivedreftest(k);
|
|
val = kret.getValue();
|
|
verifyValue("me oh my derivedreftest-Derived", val)
|
|
verifyCount(1, k)
|
|
verifyCount(1, kret)
|
|
|
|
# //////////////////////////////// Derived and base class mixed ////////////////////////////////////////
|
|
# pass by shared_ptr (mixed)
|
|
k = KlassDerived("me oh my");
|
|
kret = smartpointertest(k);
|
|
val = kret.getValue();
|
|
verifyValue("me oh my smartpointertest-Derived", val)
|
|
verifyCount(2, k)
|
|
verifyCount(2, kret)
|
|
|
|
# pass by shared_ptr pointer (mixed)
|
|
k = KlassDerived("me oh my");
|
|
kret = smartpointerpointertest(k);
|
|
val = kret.getValue();
|
|
verifyValue("me oh my smartpointerpointertest-Derived", val)
|
|
verifyCount(2, k)
|
|
verifyCount(2, kret)
|
|
|
|
# pass by shared_ptr reference (mixed)
|
|
k = KlassDerived("me oh my");
|
|
kret = smartpointerreftest(k);
|
|
val = kret.getValue();
|
|
verifyValue("me oh my smartpointerreftest-Derived", val)
|
|
verifyCount(2, k)
|
|
verifyCount(2, kret)
|
|
|
|
# pass by shared_ptr pointer reference (mixed)
|
|
k = KlassDerived("me oh my");
|
|
kret = smartpointerpointerreftest(k);
|
|
val = kret.getValue();
|
|
verifyValue("me oh my smartpointerpointerreftest-Derived", val)
|
|
verifyCount(2, k)
|
|
verifyCount(2, kret)
|
|
|
|
# pass by value (mixed)
|
|
k = KlassDerived("me oh my");
|
|
kret = valuetest(k);
|
|
val = kret.getValue();
|
|
verifyValue("me oh my valuetest", val) # note slicing
|
|
verifyCount(1, k)
|
|
verifyCount(1, kret)
|
|
|
|
# pass by pointer (mixed)
|
|
k = KlassDerived("me oh my");
|
|
kret = pointertest(k);
|
|
val = kret.getValue();
|
|
verifyValue("me oh my pointertest-Derived", val)
|
|
verifyCount(1, k)
|
|
verifyCount(1, kret)
|
|
# pass by ref (mixed)
|
|
k = KlassDerived("me oh my");
|
|
kret = reftest(k);
|
|
val = kret.getValue();
|
|
verifyValue("me oh my reftest-Derived", val)
|
|
verifyCount(1, k)
|
|
verifyCount(1, kret)
|
|
|
|
# //////////////////////////////// Overloading tests ////////////////////////////////////////
|
|
# Base class
|
|
k = Klass("me oh my");
|
|
verifyValue(overload_rawbyval(k), "rawbyval")
|
|
verifyValue(overload_rawbyref(k), "rawbyref")
|
|
verifyValue(overload_rawbyptr(k), "rawbyptr")
|
|
verifyValue(overload_rawbyptrref(k), "rawbyptrref")
|
|
|
|
verifyValue(overload_smartbyval(k), "smartbyval")
|
|
verifyValue(overload_smartbyref(k), "smartbyref")
|
|
verifyValue(overload_smartbyptr(k), "smartbyptr")
|
|
verifyValue(overload_smartbyptrref(k), "smartbyptrref")
|
|
|
|
# Derived class
|
|
k = KlassDerived("me oh my");
|
|
verifyValue(overload_rawbyval(k), "rawbyval")
|
|
verifyValue(overload_rawbyref(k), "rawbyref")
|
|
verifyValue(overload_rawbyptr(k), "rawbyptr")
|
|
verifyValue(overload_rawbyptrref(k), "rawbyptrref")
|
|
|
|
verifyValue(overload_smartbyval(k), "smartbyval")
|
|
verifyValue(overload_smartbyref(k), "smartbyref")
|
|
verifyValue(overload_smartbyptr(k), "smartbyptr")
|
|
verifyValue(overload_smartbyptrref(k), "smartbyptrref")
|
|
|
|
# 3rd derived class
|
|
k = Klass3rdDerived("me oh my");
|
|
val = k.getValue();
|
|
verifyValue("me oh my-3rdDerived", val)
|
|
verifyCount(1, k)
|
|
|
|
val = test3rdupcast(k);
|
|
verifyValue("me oh my-3rdDerived", val)
|
|
verifyCount(1, k)
|
|
|
|
# //////////////////////////////// Member variables ////////////////////////////////////////
|
|
# smart pointer by value
|
|
m = MemberVariables();
|
|
k = Klass("smart member value");
|
|
m.SmartMemberValue = k;
|
|
val = k.getValue();
|
|
verifyValue("smart member value", val)
|
|
verifyCount(2, k)
|
|
|
|
kmember = m.SmartMemberValue;
|
|
val = kmember.getValue();
|
|
verifyValue("smart member value", val)
|
|
verifyCount(3, kmember)
|
|
verifyCount(3, k)
|
|
|
|
clear m
|
|
verifyCount(2, kmember)
|
|
verifyCount(2, k)
|
|
|
|
# smart pointer by pointer
|
|
m = MemberVariables();
|
|
k = Klass("smart member pointer");
|
|
m.SmartMemberPointer = k;
|
|
val = k.getValue();
|
|
verifyValue("smart member pointer", val)
|
|
verifyCount(1, k)
|
|
|
|
kmember = m.SmartMemberPointer;
|
|
val = kmember.getValue();
|
|
verifyValue("smart member pointer", val)
|
|
verifyCount(2, kmember)
|
|
verifyCount(2, k)
|
|
|
|
clear m
|
|
verifyCount(2, kmember)
|
|
verifyCount(2, k)
|
|
|
|
# smart pointer by reference
|
|
m = MemberVariables();
|
|
k = Klass("smart member reference");
|
|
m.SmartMemberReference = k;
|
|
val = k.getValue();
|
|
verifyValue("smart member reference", val)
|
|
verifyCount(2, k)
|
|
|
|
kmember = m.SmartMemberReference;
|
|
val = kmember.getValue();
|
|
verifyValue("smart member reference", val)
|
|
verifyCount(3, kmember)
|
|
verifyCount(3, k)
|
|
|
|
# The C++ reference refers to SmartMemberValue...
|
|
kmemberVal = m.SmartMemberValue;
|
|
val = kmember.getValue();
|
|
verifyValue("smart member reference", val)
|
|
verifyCount(4, kmemberVal)
|
|
verifyCount(4, kmember)
|
|
verifyCount(4, k)
|
|
|
|
clear m
|
|
verifyCount(3, kmemberVal)
|
|
verifyCount(3, kmember)
|
|
verifyCount(3, k)
|
|
|
|
# plain by value
|
|
m = MemberVariables();
|
|
k = Klass("plain member value");
|
|
m.MemberValue = k;
|
|
val = k.getValue();
|
|
verifyValue("plain member value", val)
|
|
verifyCount(1, k)
|
|
|
|
kmember = m.MemberValue;
|
|
val = kmember.getValue();
|
|
verifyValue("plain member value", val)
|
|
verifyCount(1, kmember)
|
|
verifyCount(1, k)
|
|
|
|
clear m
|
|
verifyCount(1, kmember)
|
|
verifyCount(1, k)
|
|
|
|
# plain by pointer
|
|
m = MemberVariables();
|
|
k = Klass("plain member pointer");
|
|
m.MemberPointer = k;
|
|
val = k.getValue();
|
|
verifyValue("plain member pointer", val)
|
|
verifyCount(1, k)
|
|
|
|
kmember = m.MemberPointer;
|
|
val = kmember.getValue();
|
|
verifyValue("plain member pointer", val)
|
|
verifyCount(1, kmember)
|
|
verifyCount(1, k)
|
|
|
|
clear m
|
|
verifyCount(1, kmember)
|
|
verifyCount(1, k)
|
|
|
|
# plain by reference
|
|
m = MemberVariables();
|
|
k = Klass("plain member reference");
|
|
m.MemberReference = k;
|
|
val = k.getValue();
|
|
verifyValue("plain member reference", val)
|
|
verifyCount(1, k)
|
|
|
|
kmember = m.MemberReference;
|
|
val = kmember.getValue();
|
|
verifyValue("plain member reference", val)
|
|
verifyCount(1, kmember)
|
|
verifyCount(1, k)
|
|
|
|
clear m
|
|
verifyCount(1, kmember)
|
|
verifyCount(1, k)
|
|
|
|
# null member variables
|
|
m = MemberVariables();
|
|
|
|
# shared_ptr by value
|
|
k = m.SmartMemberValue;
|
|
#KTODO None not defined
|
|
# if (k ~= None)
|
|
# error("expected null")
|
|
# end
|
|
|
|
# m.SmartMemberValue = None
|
|
# k = m.SmartMemberValue
|
|
# if (k ~= None)
|
|
# error("expected null")
|
|
# end
|
|
# verifyCount(0, k)
|
|
|
|
# # plain by value
|
|
# # try:
|
|
# # m.MemberValue = None
|
|
# # error("Failed to catch null pointer")
|
|
# # except ValueError:
|
|
# # pass
|
|
|
|
# # ////////////////////////////////// Global variables ////////////////////////////////////////
|
|
# # smart pointer
|
|
# kglobal = cvar.GlobalSmartValue
|
|
# if (kglobal ~= None)
|
|
# error("expected null")
|
|
# end
|
|
|
|
k = Klass("smart global value");
|
|
cvar.GlobalSmartValue = k;
|
|
verifyCount(2, k)
|
|
|
|
kglobal = cvar.GlobalSmartValue;
|
|
val = kglobal.getValue();
|
|
verifyValue("smart global value", val)
|
|
verifyCount(3, kglobal)
|
|
verifyCount(3, k)
|
|
verifyValue("smart global value", cvar.GlobalSmartValue.getValue())
|
|
#KTTODO cvar.GlobalSmartValue = None
|
|
|
|
# plain value
|
|
k = Klass("global value");
|
|
cvar.GlobalValue = k;
|
|
verifyCount(1, k)
|
|
|
|
kglobal = cvar.GlobalValue;
|
|
val = kglobal.getValue();
|
|
verifyValue("global value", val)
|
|
verifyCount(1, kglobal)
|
|
verifyCount(1, k)
|
|
verifyValue("global value", cvar.GlobalValue.getValue())
|
|
|
|
# try:
|
|
# cvar.GlobalValue = None
|
|
# error("Failed to catch null pointer")
|
|
# except ValueError:
|
|
# pass
|
|
|
|
# plain pointer
|
|
kglobal = cvar.GlobalPointer;
|
|
#KTODO if (kglobal ~= None)
|
|
#KTODO error("expected null")
|
|
#KTODO end
|
|
|
|
k = Klass("global pointer");
|
|
cvar.GlobalPointer = k;
|
|
verifyCount(1, k)
|
|
|
|
kglobal = cvar.GlobalPointer;
|
|
val = kglobal.getValue();
|
|
verifyValue("global pointer", val)
|
|
verifyCount(1, kglobal)
|
|
verifyCount(1, k)
|
|
#KTODO cvar.GlobalPointer = None
|
|
|
|
# plain reference
|
|
k = Klass("global reference");
|
|
cvar.GlobalReference = k;
|
|
verifyCount(1, k)
|
|
|
|
kglobal = cvar.GlobalReference;
|
|
val = kglobal.getValue();
|
|
verifyValue("global reference", val)
|
|
verifyCount(1, kglobal)
|
|
verifyCount(1, k)
|
|
|
|
# try:
|
|
# cvar.GlobalReference = None
|
|
# error("Failed to catch null pointer")
|
|
# except ValueError:
|
|
# pass
|
|
|
|
# ////////////////////////////////// Templates ////////////////////////////////////////
|
|
pid = PairIntDouble(10, 20.2);
|
|
if (pid.baseVal1 ~= 20 || pid.baseVal2 ~= 40.4)
|
|
error("Base values wrong")
|
|
end
|
|
if (pid.val1 ~= 10 || pid.val2 ~= 20.2)
|
|
error("Derived Values wrong")
|
|
end
|
|
|
|
endfunction
|
|
|
|
debug = false;%true;
|
|
|
|
if (debug)
|
|
fprintf( "Started\n" )
|
|
end
|
|
|
|
cvar.debug_shared = debug;
|
|
|
|
# Change loop count to run for a long time to monitor memory
|
|
loopCount = 1; #5000
|
|
for i=0:loopCount
|
|
runtest()
|
|
end
|
|
|
|
# Expect 1 instance - the one global variable (GlobalValue)
|
|
#KTTODO next fails, possibly because we commented GlobalSmartValue=None
|
|
#if (Klass.getTotal_count() ~= 1)
|
|
# error("Klass.total_count=%d", Klass.getTotal_count())
|
|
#end
|
|
|
|
wrapper_count = shared_ptr_wrapper_count() ;
|
|
#KTTODO next fails as NOT_COUNTING not in octave name space, so we hard-wire it here
|
|
#if (wrapper_count ~= NOT_COUNTING)
|
|
if (wrapper_count ~= -123456)
|
|
# Expect 1 instance - the one global variable (GlobalSmartValue)
|
|
if (wrapper_count ~= 1)
|
|
error("shared_ptr wrapper count=%s", wrapper_count)
|
|
end
|
|
end
|
|
|
|
if (debug)
|
|
fprintf( "Finished\n" )
|
|
end
|