Skip to content

Commit

Permalink
Tidying up destruction of internals.
Browse files Browse the repository at this point in the history
  • Loading branch information
vincentparrett committed Dec 12, 2014
1 parent 6563957 commit c51aaed
Show file tree
Hide file tree
Showing 10 changed files with 107 additions and 53 deletions.
15 changes: 9 additions & 6 deletions DUnitX.TestFixture.pas
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,7 @@ TDUnitXTestFixture = class(TWeakReferencedObject, ITestFixture,ITestFixtureInf
procedure SetTearDownFixtureMethod(const AMethodName : string; const AMethod : TTestMethod; const AIsDestructor : boolean);
procedure SetTestInOwnThread(const value: Boolean);
class constructor Create;
class destructor Destroy;
public
constructor Create(const AName : string; const ACategory : string; const AInstance : TObject);overload;
constructor Create(const AName : string; const ACategory : string; const AClass : TClass);overload;
Expand Down Expand Up @@ -218,7 +219,6 @@ constructor TDUnitXTestFixture.Create(const AName : string; const ACategory : st
{$ENDIF}
FFixtureInstance := FTestClass.Create;
end;

end;

destructor TDUnitXTestFixture.Destroy;
Expand Down Expand Up @@ -416,12 +416,8 @@ function TDUnitXTestFixture.ITestFixtureInfo_GetTests: IList<ITestInfo>;

procedure TDUnitXTestFixture.OnMethodExecuted(const AMethod: TTestMethod);
begin
if FTearDownFixtureIsDestructor then
begin
if TMethod(AMethod).Code = TMethod(FTearDownFixtureMethod).Code then
if FTearDownFixtureIsDestructor and (TMethod(AMethod).Code = TMethod(FTearDownFixtureMethod).Code) then
FFixtureInstance := nil;
end;

end;

procedure TDUnitXTestFixture.SetEnabled(const value: Boolean);
Expand Down Expand Up @@ -495,6 +491,12 @@ function TDUnitXTestFixture.AddTestCase(const ACaseName, AName: string; const AC
FRttiContext := TRttiContext.Create;
end;

class destructor TDUnitXTestFixture.Destroy;
begin
FRttiContext.Free;
end;


constructor TDUnitXTestFixture.Create(const AName: string; const ACategory : string; const AInstance: TObject);
begin
FFixtureInstance := AInstance;
Expand All @@ -517,5 +519,6 @@ function TDUnitXTestFixture.CreateTestFromTestCase(const ACaseInfo : TestCaseInf
result.IgnoreMemoryLeaks := getIgnoreMemoryLeaksForMethod(AMethod);
end;


end.

19 changes: 16 additions & 3 deletions DUnitX.TestFramework.pas
Original file line number Diff line number Diff line change
Expand Up @@ -940,6 +940,7 @@ implementation
DUnitX.MemoryLeakMonitor.Default,
DUnitX.FixtureProviderPlugin,
DUnitX.FilterBuilder,
DUnitX.WeakReference,
Variants,
Math,
StrUtils,
Expand Down Expand Up @@ -1884,9 +1885,12 @@ class procedure TDUnitX.CheckCommandLine;
end;

class function TDUnitX.CurrentRunner: ITestRunner;
var
ref : IWeakReference<ITestRunner>;
begin
if not TDUnitXTestRunner.FActiveRunners.TryGetValue(TThread.CurrentThread.ThreadId,result) then
if not TDUnitXTestRunner.FActiveRunners.TryGetValue(TThread.CurrentThread.ThreadId,ref) then
raise Exception.Create('No Runner found for current thread');
result := ref.Data;

end;

Expand Down Expand Up @@ -1971,9 +1975,16 @@ procedure TTestFixtureHelper.Log(const msg: string);
procedure TTestFixtureHelper.Log(const logType : TLogLevel; const msg: string);
var
runner : ITestRunner;
ref : IWeakReference<ITestRunner>;
begin
if TDUnitXTestRunner.FActiveRunners.TryGetValue(TThread.CurrentThread.ThreadId,runner) then
runner.Log(logType,msg)
if TDUnitXTestRunner.FActiveRunners.TryGetValue(TThread.CurrentThread.ThreadId,ref) then
begin
runner := ref.Data;
if runner <> nil then
runner.Log(logType,msg)
else
System.Writeln(msg);
end
else
System.Writeln(msg);
end;
Expand Down Expand Up @@ -2036,4 +2047,6 @@ constructor CategoryAttribute.Create(const ACategory: string);
initialization
TDUnitX.RegisterPlugin(TDUnitXFixtureProviderPlugin.Create);

finalization

end.
24 changes: 13 additions & 11 deletions DUnitX.TestRunner.pas
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,11 @@ interface
type
/// Note - we rely on the fact that there will only ever be 1 testrunner
/// per thread, if this changes then handling of WriteLn will need to change
TDUnitXTestRunner = class(TInterfacedObject, ITestRunner)
TDUnitXTestRunner = class(TWeakReferencedObject, ITestRunner)
private class var
FRttiContext : TRttiContext;
public class var
FActiveRunners : TDictionary<Cardinal,ITestRunner>;
FActiveRunners : TDictionary<Cardinal,IWeakReference<ITestRunner>>;
private
FLoggers : TList<ITestLogger>;
FUseRTTI : boolean;
Expand Down Expand Up @@ -249,7 +249,7 @@ function TDUnitXTestRunner.BuildFixtures : IInterface;
class constructor TDUnitXTestRunner.Create;
begin
FRttiContext := TRttiContext.Create;
FActiveRunners := TDictionary<Cardinal,ITestRunner>.Create;
FActiveRunners := TDictionary<Cardinal,IWeakReference<ITestRunner>>.Create;
end;

function TDUnitXTestRunner.CheckMemoryAllocations(const test: ITest; out errorResult: ITestResult; const memoryAllocationProvider: IMemoryLeakMonitor): boolean;
Expand Down Expand Up @@ -302,7 +302,7 @@ constructor TDUnitXTestRunner.Create(const AListener: ITestLogger);
FLogMessages := TStringList.Create;
MonitorEnter(TDUnitXTestRunner.FActiveRunners);
try
TDUnitXTestRunner.FActiveRunners.Add(TThread.CurrentThread.ThreadID, Self);
TDUnitXTestRunner.FActiveRunners.Add(TThread.CurrentThread.ThreadID, TWeakReference<ITestRunner>.Create(Self));
finally
MonitorExit(TDUnitXTestRunner.FActiveRunners);
end;
Expand Down Expand Up @@ -333,7 +333,6 @@ destructor TDUnitXTestRunner.Destroy;
FLogMessages.Free;
FLoggers.Free;
FFixtureClasses.Free;

inherited;
end;

Expand Down Expand Up @@ -546,9 +545,12 @@ function TDUnitXTestRunner.ExecuteErrorResult(
end;

class function TDUnitXTestRunner.GetActiveRunner: ITestRunner;
var
ref : IWeakReference<ITestRunner>;
begin
result := nil;
FActiveRunners.TryGetValue(TThread.CurrentThread.ThreadId,result)
if FActiveRunners.TryGetValue(TThread.CurrentThread.ThreadId,ref) then
result := ref.Data;
end;

function TDUnitXTestRunner.ExecuteFailureResult(
Expand Down Expand Up @@ -627,13 +629,14 @@ function TDUnitXTestRunner.ExecuteSuccessfulResult(const context: ITestExecuteCo
Result := TDUnitXTestResult.Create(test as ITestInfo, TTestResultType.Pass, message);
end;

procedure TDUnitXTestRunner.ExecuteTearDownFixtureMethod(
const context: ITestExecuteContext; const threadId: Cardinal;
const fixture: ITestFixture);
procedure TDUnitXTestRunner.ExecuteTearDownFixtureMethod(const context: ITestExecuteContext; const threadId: Cardinal; const fixture: ITestFixture);
var
teardown : TTestMethod;
begin
try
Self.Loggers_TeardownFixture(threadId, fixture as ITestFixtureInfo);
fixture.TearDownFixtureMethod;
tearDown := fixture.TearDownFixtureMethod;
tearDown();
fixture.OnMethodExecuted(fixture.TearDownFixtureMethod);
except
on e: Exception do
Expand Down Expand Up @@ -810,7 +813,6 @@ procedure TDUnitXTestRunner.SetUseRTTI(const value: Boolean);
procedure TDUnitXTestRunner.Status(const msg: string);
begin
Self.Log(TLogLevel.Information,msg);

end;

procedure TDUnitXTestRunner.WriteLn;
Expand Down
28 changes: 14 additions & 14 deletions DUnitX_XE7.groupproj
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@
<Projects Include="Examples\DUnitXExamples_XE7.dproj">
<Dependencies/>
</Projects>
<Projects Include="Examples\DUnitXFiremonkeyGUI_XE7.dproj">
<Projects Include="Expert\DUnitX_IDE_Expert_XE7.dproj">
<Dependencies/>
</Projects>
<Projects Include="Expert\DUnitX_IDE_Expert_XE7.dproj">
<Projects Include="Examples\DUnitXFiremonkeyGUI_XE7.dproj">
<Dependencies/>
</Projects>
</ItemGroup>
Expand Down Expand Up @@ -41,15 +41,6 @@
<Target Name="DUnitXExamples_XE7:Make">
<MSBuild Projects="Examples\DUnitXExamples_XE7.dproj" Targets="Make"/>
</Target>
<Target Name="DUnitXFiremonkeyGUI_XE7">
<MSBuild Projects="Examples\DUnitXFiremonkeyGUI_XE7.dproj"/>
</Target>
<Target Name="DUnitXFiremonkeyGUI_XE7:Clean">
<MSBuild Projects="Examples\DUnitXFiremonkeyGUI_XE7.dproj" Targets="Clean"/>
</Target>
<Target Name="DUnitXFiremonkeyGUI_XE7:Make">
<MSBuild Projects="Examples\DUnitXFiremonkeyGUI_XE7.dproj" Targets="Make"/>
</Target>
<Target Name="DUnitX_IDE_Expert_XE7">
<MSBuild Projects="Expert\DUnitX_IDE_Expert_XE7.dproj"/>
</Target>
Expand All @@ -59,14 +50,23 @@
<Target Name="DUnitX_IDE_Expert_XE7:Make">
<MSBuild Projects="Expert\DUnitX_IDE_Expert_XE7.dproj" Targets="Make"/>
</Target>
<Target Name="DUnitXFiremonkeyGUI_XE7">
<MSBuild Projects="Examples\DUnitXFiremonkeyGUI_XE7.dproj"/>
</Target>
<Target Name="DUnitXFiremonkeyGUI_XE7:Clean">
<MSBuild Projects="Examples\DUnitXFiremonkeyGUI_XE7.dproj" Targets="Clean"/>
</Target>
<Target Name="DUnitXFiremonkeyGUI_XE7:Make">
<MSBuild Projects="Examples\DUnitXFiremonkeyGUI_XE7.dproj" Targets="Make"/>
</Target>
<Target Name="Build">
<CallTarget Targets="DUnitXTest_XE7;DUnitXExamples_XE7;DUnitXFiremonkeyGUI_XE7;DUnitX_IDE_Expert_XE7"/>
<CallTarget Targets="DUnitXTest_XE7;DUnitXExamples_XE7;DUnitX_IDE_Expert_XE7;DUnitXFiremonkeyGUI_XE7"/>
</Target>
<Target Name="Clean">
<CallTarget Targets="DUnitXTest_XE7:Clean;DUnitXExamples_XE7:Clean;DUnitXFiremonkeyGUI_XE7:Clean;DUnitX_IDE_Expert_XE7:Clean"/>
<CallTarget Targets="DUnitXTest_XE7:Clean;DUnitXExamples_XE7:Clean;DUnitX_IDE_Expert_XE7:Clean;DUnitXFiremonkeyGUI_XE7:Clean"/>
</Target>
<Target Name="Make">
<CallTarget Targets="DUnitXTest_XE7:Make;DUnitXExamples_XE7:Make;DUnitXFiremonkeyGUI_XE7:Make;DUnitX_IDE_Expert_XE7:Make"/>
<CallTarget Targets="DUnitXTest_XE7:Make;DUnitXExamples_XE7:Make;DUnitX_IDE_Expert_XE7:Make;DUnitXFiremonkeyGUI_XE7:Make"/>
</Target>
<Import Project="$(BDS)\Bin\CodeGear.Group.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Group.Targets')"/>
</Project>
1 change: 1 addition & 0 deletions Tests/DUnitX.Tests.Assert.pas
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,7 @@ procedure TTestsAssert.Fail_Throws_ETestFailure_Exception_With_Return_Address_Re
end;

Assert.WillRaise(MyProc, ETestFailure);
MyProc := nil;
end;

procedure TTestsAssert.Pass_Throws_ETestPass_Exception;
Expand Down
2 changes: 1 addition & 1 deletion Tests/DUnitX.Tests.DUnitCompatibility.pas
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,8 @@ procedure TMyDUnitTestSetUp.SetUp;

procedure TMyDUnitTestSetup.TearDown;
begin
inherited;
FObject.Free;
inherited;
end;

initialization
Expand Down
9 changes: 9 additions & 0 deletions Tests/DUnitX.Tests.Example.pas
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ TExampleFixture2 = class
procedure SetupFixture;
[Teardown]
procedure TearDownFixture;
destructor Destroy;override;
published
procedure Published_Procedures_Are_Included_As_Tests;
end;
Expand Down Expand Up @@ -183,6 +184,7 @@ procedure TMyExampleTests.TestTwo;
//CheckIs(x,TObject); //DUnit compatibility.
TDUnitX.CurrentRunner.Status('hello world');
Assert.IsTrue(x is TObject); /// a bit pointless since it's strongly typed.
x.Free;
end;

procedure TMyExampleTests.TestTwoOne;
Expand All @@ -194,10 +196,17 @@ procedure TMyExampleTests.TestTwoOne;
//CheckIs(x,TObject); //DUnit compatibility.
TDUnitX.CurrentRunner.Status('hello world');
Assert.IsTrue(x is TObject); /// a bit pointless since it's strongly typed.
x.Free;
end;

{ TExampleFixture2 }

destructor TExampleFixture2.Destroy;
begin

inherited;
end;

procedure TExampleFixture2.Published_Procedures_Are_Included_As_Tests;
begin
FPublished_Procedures_Are_Included_As_Tests_Called := True;
Expand Down
40 changes: 26 additions & 14 deletions Tests/DUnitX.Tests.IoC.pas
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,14 @@ interface
end;

TDUnitX_IoCTests = class
private
FContainer : TDUnitXIoC;
public
[SetupFixture]
procedure Setup;
procedure Setup;

[TearDownFixture]
procedure TearDownFixture;

{$IFDEF DELPHI_XE_UP}
[Test]
Expand Down Expand Up @@ -77,19 +82,21 @@ TFoo = class(TInterfacedObject,IFoo)

procedure TDUnitX_IoCTests.Setup;
begin
TDUnitXIoC.DefaultContainer.RegisterType<IFoo>(
FContainer := TDUnitXIoC.Create;

FContainer.RegisterType<IFoo>(
function : IFoo
begin
result := TFoo.Create;
end);

{$IFDEF DELPHI_XE_UP}
//NOTE: DUnitX.IoC has details on why this is only available for XE up.
TDUnitXIoC.DefaultContainer.RegisterType<IFoo,TFoo>('test');
FContainer.RegisterType<IFoo,TFoo>('test');
{$ENDIF}

//singletons
TDUnitXIoC.DefaultContainer.RegisterType<IFoo>(true,
FContainer.RegisterType<IFoo>(true,
function : IFoo
begin
result := TFoo.Create;
Expand All @@ -98,17 +105,22 @@ procedure TDUnitX_IoCTests.Setup;

{$IFDEF DELPHI_XE_UP}
//NOTE: DUnitX.IoC has details on why this is only available for XE up.
TDUnitXIoC.DefaultContainer.RegisterType<IFoo,TFoo>(true,'impl_singleton');
FContainer.RegisterType<IFoo,TFoo>(true,'impl_singleton');
{$ENDIF}
end;

procedure TDUnitX_IoCTests.TearDownFixture;
begin
FContainer.Free;
end;

procedure TDUnitX_IoCTests.Test_Activator_Non_Singleton;
var
foo1 : IFoo;
foo2 : IFoo;
begin
foo1 := TDUnitXIoC.DefaultContainer.Resolve<IFoo>();
foo2 := TDUnitXIoC.DefaultContainer.Resolve<IFoo>();
foo1 := FContainer.Resolve<IFoo>();
foo2 := FContainer.Resolve<IFoo>();

Assert.AreNotSame(foo1,foo2);
end;
Expand All @@ -118,13 +130,13 @@ procedure TDUnitX_IoCTests.Test_Activator_Singleton;
foo1 : IFoo;
foo2 : IFoo;
begin
foo1 := TDUnitXIoC.DefaultContainer.Resolve<IFoo>('activator_singleton');
foo2 := TDUnitXIoC.DefaultContainer.Resolve<IFoo>('activator_singleton');
foo1 := FContainer.Resolve<IFoo>('activator_singleton');
foo2 := FContainer.Resolve<IFoo>('activator_singleton');
Assert.AreSame(foo1,foo2);

{$IFDEF DELPHI_XE_UP}
//NOTE: DUnitX.IoC has details on why this is only available for XE up.
foo1 := TDUnitXIoC.DefaultContainer.Resolve<IFoo>('impl_singleton');
foo1 := FContainer.Resolve<IFoo>('impl_singleton');
Assert.AreNotSame(foo1,foo2);
{$ENDIF}
end;
Expand All @@ -136,8 +148,8 @@ procedure TDUnitX_IoCTests.Test_Implementation_Non_Singleton;
foo1 : IFoo;
foo2 : IFoo;
begin
foo1 := TDUnitXIoC.DefaultContainer.Resolve<IFoo>('test');
foo2 := TDUnitXIoC.DefaultContainer.Resolve<IFoo>('test');
foo1 := FContainer.Resolve<IFoo>('test');
foo2 := FContainer.Resolve<IFoo>('test');
Assert.AreNotSame(foo1,foo2);
end;

Expand All @@ -146,8 +158,8 @@ procedure TDUnitX_IoCTests.Test_Implementation_Singleton;
foo1 : IFoo;
foo2 : IFoo;
begin
foo1 := TDUnitXIoC.DefaultContainer.Resolve<IFoo>('impl_singleton');
foo2 := TDUnitXIoC.DefaultContainer.Resolve<IFoo>('impl_singleton');
foo1 := FContainer.Resolve<IFoo>('impl_singleton');
foo2 := FContainer.Resolve<IFoo>('impl_singleton');
Assert.AreSame(foo1,foo2);
end;
{$ENDIF}
Expand Down
Loading

0 comments on commit c51aaed

Please sign in to comment.