134 lines
2.9 KiB
Tcl
134 lines
2.9 KiB
Tcl
|
|
if [ catch { load ./li_std_auto_ptr[info sharedlibextension] li_std_auto_ptr} err_msg ] {
|
|
puts stderr "Could not load shared object:\n$err_msg"
|
|
}
|
|
|
|
|
|
proc checkCount {expected_count} {
|
|
set actual_count [Klass_getTotal_count]
|
|
if {$actual_count != $expected_count} {
|
|
error "Counts incorrect, expected: $expected_count actual: $actual_count"
|
|
}
|
|
}
|
|
|
|
################################# Tcl pointer recycling bug start
|
|
# Not copied from cpp11_std_unique_ptr_runme.tcl
|
|
################################# Tcl pointer recycling bug end
|
|
|
|
# Test raw pointer handling involving virtual inheritance
|
|
KlassInheritance kini "KlassInheritanceInput"
|
|
checkCount 1
|
|
set s [useKlassRawPtr kini]
|
|
kini -delete
|
|
checkCount 0
|
|
|
|
|
|
# auto_ptr as input
|
|
Klass kin "KlassInput"
|
|
checkCount 1
|
|
set s [takeKlassAutoPtr kin]
|
|
checkCount 0
|
|
if {[kin cget -thisown]} {
|
|
error "thisown should be false"
|
|
}
|
|
if {$s != "KlassInput"} {
|
|
error "Incorrect string: $s"
|
|
}
|
|
if {![is_nullptr kin]} {
|
|
error "is_nullptr failed"
|
|
}
|
|
kin -delete # Should not fail, even though already deleted
|
|
checkCount 0
|
|
|
|
Klass kin "KlassInput"
|
|
checkCount 1
|
|
set s [takeKlassAutoPtr kin]
|
|
checkCount 0
|
|
if {[kin cget -thisown]} {
|
|
error "thisown should be false"
|
|
}
|
|
if {$s != "KlassInput"} {
|
|
error "Incorrect string: $s"
|
|
}
|
|
if {![is_nullptr kin]} {
|
|
error "is_nullptr failed"
|
|
}
|
|
set exception_thrown 0
|
|
if [ catch { set s [takeKlassAutoPtr kin] } e ] {
|
|
if {[string first "cannot release ownership as memory is not owned" $e] == -1} {
|
|
error "incorrect exception message: $e"
|
|
}
|
|
set exception_thrown 1
|
|
}
|
|
if {!$exception_thrown} {
|
|
error "double usage of takeKlassAutoPtr should have been an error"
|
|
}
|
|
kin -delete # Should not fail, even though already deleted
|
|
checkCount 0
|
|
|
|
Klass kin "KlassInput"
|
|
set exception_thrown 0
|
|
set notowned [get_not_owned_ptr kin]
|
|
if [ catch {
|
|
takeKlassAutoPtr notowned
|
|
} ] {
|
|
set exception_thrown 1
|
|
}
|
|
if {!$exception_thrown} {
|
|
error "Should have thrown 'Cannot release ownership as memory is not owned' error"
|
|
}
|
|
checkCount 1
|
|
kin -delete
|
|
checkCount 0
|
|
|
|
KlassInheritance kini "KlassInheritanceInput"
|
|
checkCount 1
|
|
set s [takeKlassAutoPtr kini]
|
|
checkCount 0
|
|
if {[kini cget -thisown]} {
|
|
error "thisown should be false"
|
|
}
|
|
if {$s != "KlassInheritanceInput"} {
|
|
error "Incorrect string: $s"
|
|
}
|
|
if {![is_nullptr kini]} {
|
|
error "is_nullptr failed"
|
|
}
|
|
kini -delete # Should not fail, even though already deleted
|
|
checkCount 0
|
|
|
|
takeKlassAutoPtr "NULL"
|
|
takeKlassAutoPtr [make_null]
|
|
checkCount 0
|
|
|
|
# overloaded parameters
|
|
if {[overloadTest] != 0} {
|
|
error "overloadTest failed"
|
|
}
|
|
if {[overloadTest "NULL"] != 1} {
|
|
error "overloadTest failed"
|
|
}
|
|
if {[overloadTest [Klass k "over"]] != 1} {
|
|
error "overloadTest failed"
|
|
}
|
|
checkCount 0
|
|
|
|
|
|
# auto_ptr as output
|
|
set k1 [makeKlassAutoPtr "first"]
|
|
set k2 [makeKlassAutoPtr "second"]
|
|
checkCount 2
|
|
|
|
$k1 -delete
|
|
checkCount 1
|
|
|
|
if {[$k2 getLabel] != "second"} {
|
|
error "wrong object label"
|
|
}
|
|
|
|
$k2 -delete
|
|
checkCount 0
|
|
|
|
if {[makeNullAutoPtr] != "NULL"} {
|
|
error "null failure"
|
|
}
|