from li_std_auto_ptr import * def checkCount(expected_count): actual_count = Klass.getTotal_count() if (actual_count != expected_count): raise RuntimeError("Counts incorrect, expected:" + expected_count + " actual:" + actual_count) # Test raw pointer handling involving virtual inheritance kini = KlassInheritance("KlassInheritanceInput") checkCount(1) s = useKlassRawPtr(kini) if s != "KlassInheritanceInput": raise RuntimeError("Incorrect string: " + s) del kini checkCount(0) # auto_ptr as input kin = Klass("KlassInput") checkCount(1) s = takeKlassAutoPtr(kin) checkCount(0) if kin.thisown: raise RuntimeError("thisown should be false") if s != "KlassInput": raise RuntimeError("Incorrect string: " + s) if not is_nullptr(kin): raise RuntimeError("is_nullptr failed") del kin # Should not fail, even though already deleted checkCount(0) kin = Klass("KlassInput") checkCount(1) s = takeKlassAutoPtr(kin) checkCount(0) if kin.thisown: raise RuntimeError("thisown should be false") if s != "KlassInput": raise RuntimeError("Incorrect string: " + s) if not is_nullptr(kin): raise RuntimeError("is_nullptr failed") exception_thrown = False try: s = takeKlassAutoPtr(kin) except RuntimeError as e: if "cannot release ownership as memory is not owned" not in str(e): raise RuntimeError("incorrect exception message"); exception_thrown = True if not exception_thrown: raise RuntimeError("double usage of takeKlassAutoPtr should have been an error") del kin # Should not fail, even though already deleted checkCount(0) kin = Klass("KlassInput") exception_thrown = False notowned = get_not_owned_ptr(kin) try: takeKlassAutoPtr(notowned) except RuntimeError as e: exception_thrown = True if not exception_thrown: raise RuntimeError("Should have thrown 'Cannot release ownership as memory is not owned' error") checkCount(1) del kin checkCount(0) kini = KlassInheritance("KlassInheritanceInput") checkCount(1) s = takeKlassAutoPtr(kini) checkCount(0) if kini.thisown: raise RuntimeError("thisown should be false") if s != "KlassInheritanceInput": raise RuntimeError("Incorrect string: " + s) if not is_nullptr(kini): raise RuntimeError("is_nullptr failed") del kini # Should not fail, even though already deleted checkCount(0) takeKlassAutoPtr(None) takeKlassAutoPtr(make_null()) checkCount(0) # overloaded parameters if overloadTest() != 0: raise RuntimeError("overloadTest failed") if overloadTest(None) != 1: raise RuntimeError("overloadTest failed") if overloadTest(Klass("over")) != 1: raise RuntimeError("overloadTest failed") checkCount(0); # auto_ptr as output k1 = makeKlassAutoPtr("first") k2 = makeKlassAutoPtr("second") checkCount(2) del k1 checkCount(1) if k2.getLabel() != "second": raise "wrong object label" del k2 checkCount(0) if (makeNullAutoPtr() != None): raise RuntimeError("null failure")