From: <the...@us...> - 2006-02-03 21:49:56
|
Revision: 578 Author: the_kique Date: 2006-02-03 13:49:42 -0800 (Fri, 03 Feb 2006) ViewCVS: http://svn.sourceforge.net/instantobjects?rev=578&view=rev Log Message: ----------- Test case to demostrate the infinite loop in FreeCircularReferences Modified Paths: -------------- trunk/Source/Tests/TestInstantReferences.pas Modified: trunk/Source/Tests/TestInstantReferences.pas =================================================================== --- trunk/Source/Tests/TestInstantReferences.pas 2006-02-03 04:14:57 UTC (rev 577) +++ trunk/Source/Tests/TestInstantReferences.pas 2006-02-03 21:49:42 UTC (rev 578) @@ -71,6 +71,8 @@ // + -> D -> E // then delete E procedure TestCircularReferences5; + //Emulate the retrive behavior + procedure TestCircularReferencesRetrive; end; TestTInstantEmbReferences = class(TTestCase) @@ -574,7 +576,7 @@ 1, vPerson.Employer.Projects[1].Manager.RefCount); AssertEquals('vPerson.Employer.Projects[1].Manager.ReferencedBy.Count 1', 1, vPerson.Employer.Projects[1].Manager.ReferencedBy.Count); - + vPerson.Employer.Projects[1].Manager := nil; AssertEquals('vPerson.Employer.ProjectCount 1', 2, vPerson.Employer.ProjectCount); @@ -583,6 +585,58 @@ end; end; +procedure TestTInstantReferences_Leak.TestCircularReferencesRetrive; +var + vPerson1: TPerson; + vPerson2: TPerson; + vProject1: TProject; +begin + FOwner.Name := 'Owner'; + + vPerson1 := TPerson.Create(FConn); //A + try + AssertNotNull(vPerson1); + vPerson1.Name := 'vPerson1'; + //A -> B + vPerson1.EmployBy(FOwner); + + AssertNotNull(vPerson1.Employer); + AssertEquals('vPerson1.Employer.Name A', 'Owner', vPerson1.Employer.Name); + + vProject1 := TProject.Create(FConn); //C + try + AssertNotNull(vProject1); + vProject1.Name := 'vProject1'; + //A -> B -> C -> A + vProject1.Manager := vPerson1; + FOwner.AddProject(vProject1); + + vPerson2 := TPerson.Create(FConn); //D + try + AssertNotNull(vPerson1); + vPerson2.Name := 'vPerson1'; + //A -> B -> C -> A + // | + // +-> D + vPerson2.EmployBy(FOwner); + AssertNotNull(vPerson2.Employer); + AssertEquals('vPerson2.Employer.Name A', 'Owner', vPerson2.Employer.Name); + //Decrement the RefCount to emulate the Retrive constructor + FOwner.Release; + vPerson1.Release; + finally + //This cause an infinite loop and close the test application + vPerson2.Free; + end; + finally + vProject1.Free; + end; + + finally + vPerson1.Free; + end; +end; + function TestTInstantEmbReferences.RefsEmbeddedCompare(Holder, Obj1, Obj2: TInstantObject): Integer; var |