| from cpp11_std_unique_ptr import * | |
| def checkCount(expected_count): | |
| actual_count = Klass.getTotal_count() | |
| if (actual_count != expected_count): | |
| raise RuntimeError("Counts incorrect, expected: {} actual:{}".format(expected_count, 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) | |
| # #### INPUT BY VALUE #### | |
| # unique_ptr as input | |
| kin = Klass("KlassInput") | |
| checkCount(1) | |
| s = takeKlassUniquePtr(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 = takeKlassUniquePtr(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 = takeKlassUniquePtr(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 takeKlassUniquePtr 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: | |
| takeKlassUniquePtr(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 = takeKlassUniquePtr(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) | |
| takeKlassUniquePtr(None) | |
| takeKlassUniquePtr(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) | |
| # #### INPUT BY RVALUE REF #### | |
| # unique_ptr as input | |
| kin = Klass("KlassInput") | |
| checkCount(1) | |
| s = moveKlassUniquePtr(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 = moveKlassUniquePtr(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 = moveKlassUniquePtr(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 moveKlassUniquePtr 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: | |
| moveKlassUniquePtr(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 = moveKlassUniquePtr(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) | |
| moveKlassUniquePtr(None) | |
| moveKlassUniquePtr(make_null()) | |
| checkCount(0) | |
| # overloaded parameters | |
| if moveOverloadTest() != 0: | |
| raise RuntimeError("moveOverloadTest failed") | |
| if moveOverloadTest(None) != 1: | |
| raise RuntimeError("moveOverloadTest failed") | |
| if moveOverloadTest(Klass("over")) != 1: | |
| raise RuntimeError("moveOverloadTest failed") | |
| checkCount(0) | |
| # #### INPUT BY NON-CONST LVALUE REF #### | |
| # unique_ptr as input | |
| kin = Klass("KlassInput") | |
| checkCount(1) | |
| s = moveRefKlassUniquePtr(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 = moveRefKlassUniquePtr(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 = moveRefKlassUniquePtr(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 moveRefKlassUniquePtr 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: | |
| moveRefKlassUniquePtr(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 = moveRefKlassUniquePtr(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) | |
| moveRefKlassUniquePtr(None) | |
| moveRefKlassUniquePtr(make_null()) | |
| checkCount(0) | |
| # overloaded parameters | |
| if moveRefOverloadTest() != 0: | |
| raise RuntimeError("moveRefOverloadTest failed") | |
| if moveRefOverloadTest(None) != 1: | |
| raise RuntimeError("moveRefOverloadTest failed") | |
| if moveRefOverloadTest(Klass("over")) != 1: | |
| raise RuntimeError("moveRefOverloadTest failed") | |
| checkCount(0) | |
| # #### INPUT BY CONST LVALUE REF #### | |
| # unique_ptr as input | |
| kin = Klass("KlassInput") | |
| checkCount(1) | |
| s = useRefKlassUniquePtr(kin) | |
| checkCount(1) | |
| if s != "KlassInput": | |
| raise RuntimeError("Incorrect string: " + s) | |
| del kin | |
| checkCount(0) | |
| kini = KlassInheritance("KlassInheritanceInput") | |
| checkCount(1) | |
| s = useRefKlassUniquePtr(kini) | |
| checkCount(1) | |
| if s != "KlassInheritanceInput": | |
| raise RuntimeError("Incorrect string: " + s) | |
| del kini | |
| checkCount(0) | |
| useRefKlassUniquePtr(None) | |
| useRefKlassUniquePtr(make_null()) | |
| checkCount(0) | |
| # overloaded parameters | |
| if useRefOverloadTest() != 0: | |
| raise RuntimeError("useRefOverloadTest failed") | |
| if useRefOverloadTest(None) != 1: | |
| raise RuntimeError("useRefOverloadTest failed") | |
| kin = Klass("over") | |
| if useRefOverloadTest(kin) != 1: | |
| raise RuntimeError("useRefOverloadTest failed") | |
| checkCount(1) | |
| del kin | |
| checkCount(0) | |
| # unique_ptr as output | |
| k1 = makeKlassUniquePtr("first") | |
| k2 = makeKlassUniquePtr("second") | |
| checkCount(2) | |
| del k1 | |
| checkCount(1) | |
| if k2.getLabel() != "second": | |
| raise "wrong object label" | |
| del k2 | |
| checkCount(0) | |
| if (makeNullUniquePtr() != None): | |
| raise RuntimeError("null failure") | |
| # unique_ptr as output (rvalue ref) | |
| k1 = makeRVRKlassUniquePtr("first") | |
| if k1.getLabel() != "first": | |
| raise "wrong object label" | |
| if (makeRVRKlassUniquePtr(None) != None): | |
| raise RuntimeError("null failure") | |
| # unique_ptr as output (lvalue ref) | |
| k1 = makeRefKlassUniquePtr("lvalueref") | |
| if k1.getLabel() != "lvalueref": | |
| raise "wrong object label" | |
| if (makeRVRKlassUniquePtr(None) != None): | |
| raise RuntimeError("null failure") |