Menu

[r3166]: / trunk / Src / UTestCompile.pas  Maximize  Restore  History

Download this file

215 lines (188 with data), 6.6 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
{
* This Source Code Form is subject to the terms of the Mozilla Public License,
* v. 2.0. If a copy of the MPL was not distributed with this file, You can
* obtain one at http://mozilla.org/MPL/2.0/
*
* Copyright (C) 2005-2013, Peter Johnson (www.delphidabbler.com).
*
* $Rev$
* $Date$
*
* Class that performs a test compilation of a snippet using all supported and
* installed versions of Delphi and returns details of success or failure.
}
unit UTestCompile;
interface
uses
// Delphi
Classes,
// Project
Compilers.UGlobals, DB.USnippet, UBaseObjects;
type
{
TTestCompile:
Class that performs a test compilation of a snippet using all supported and
installed compilers and returns details of success or failure.
}
TTestCompile = class(TNoPublicConstructObject)
strict private
fSnippet: TSnippet;
{The snippet we are to compile}
fCompilers: ICompilers;
{Object used to perform compilation}
procedure GenerateSourceFile(out FileName: string);
{Generates a source file for snippet under test.
@param FileName [out] Name of the generated file.
}
class function CompileSourceFile(const SrcFile: string;
const Compiler: ICompiler): TCompileResult;
{Compiles a source file using a specified compiler.
@param SrcFile [in] Fully specified name of the source file.
@param Compiler [in] Compiler to be used.
@return Result of the compilation.
}
function DoCompile: TCompileResults;
{Compiles snippet under test with all installed and supported compiler
versions.
@return Compilation results for each supported compiler (crQuery is
returned for each supported compiler that is not installed).
}
strict protected
constructor InternalCreate(const ACompilers: ICompilers;
const ASnippet: TSnippet);
{Class constructor. Sets up object that can test compile a snippet.
@param ACompilers [in] Compilers object used to perform compilation.
@param ASnippet [in] Snippet to be test compiled.
}
public
class function Compile(const ACompilers: ICompilers;
const ASnippet: TSnippet): TCompileResults;
{Compiles a specified snippet with all installed and supported compilers.
@param ACompilers [in] Compilers object used to perform compilation.
@param ASnippet [in] Snippet to be compiled.
@return Compilation results for each supported compiler (crQuery is
returned for each supported compiler that is not installed).
}
end;
{
TTestCompileThread:
Thread that performs a test compilation of a snippet.
}
TTestCompileThread = class(TThread)
strict private
var fCompilers: ICompilers; // Compilers used for test compilation
var fSnippet: TSnippet; // Snippet to be compiled
strict protected
procedure Execute; override;
{Performs test compilation in a thread.
}
public
constructor Create(ACompilers: ICompilers; ASnippet: TSnippet);
{Object constructor. Sets up suspended thread.
@param ACompilers [in] Compilers to be used for test compilation.
@param ASnippet [in] Snippet to be compiled.
}
end;
implementation
uses
// Delphi
SysUtils, Windows {for inlining},
// Project
UTestUnit;
{ TTestCompile }
class function TTestCompile.Compile(const ACompilers: ICompilers;
const ASnippet: TSnippet): TCompileResults;
{Compiles a specified snippet with all installed and supported compilers.
@param ACompilers [in] Compilers object used to perform compilation.
@param ASnippet [in] Snippet to be compiled.
@return Compilation results for each supported compiler (crQuery is returned
for each supported compiler that is not installed).
}
begin
with InternalCreate(ACompilers, ASnippet) do
try
Result := DoCompile;
finally
Free;
end;
end;
class function TTestCompile.CompileSourceFile(const SrcFile: string;
const Compiler: ICompiler): TCompileResult;
{Compiles a source file using a specified compiler.
@param SrcFile [in] Fully specified name of the source file.
@param Compiler [in] Compiler to be used.
@return Result of the compilation.
}
var
Dir: string; // Directory containing source file and used for output
begin
Dir := ExtractFileDir(SrcFile);
Result := Compiler.Compile(Dir, ExtractFileName(SrcFile));
Compiler.DeleteObjFiles(Dir, ExtractFileName(SrcFile));
end;
function TTestCompile.DoCompile: TCompileResults;
{Compiles snippet under test with all installed and supported compiler
versions.
@return Compilation results for each supported compiler (crQuery is returned
for each supported compiler that is not installed).
}
var
Compiler: ICompiler; // references each supported compiler
SrcFileName: string; // name of test unit source file
begin
GenerateSourceFile(SrcFileName);
try
for Compiler in fCompilers do
if Compiler.IsAvailable then
Result[Compiler.GetID] := CompileSourceFile(SrcFileName, Compiler)
else
Result[Compiler.GetID] := crQuery;
finally
SysUtils.DeleteFile(SrcFileName);
end;
end;
procedure TTestCompile.GenerateSourceFile(out FileName: string);
{Generates a source file for snippet under test.
@param FileName [out] Name of the generated file.
}
begin
with TTestUnit.Create(fSnippet) do
try
SaveUnit(FileName);
finally
Free;
end;
end;
constructor TTestCompile.InternalCreate(const ACompilers: ICompilers;
const ASnippet: TSnippet);
{Class constructor. Sets up object that can test compile a snippet.
@param ACompilers [in] Compilers object used to perform compilation.
@param ASnippet [in] Snippet to be test compiled.
}
begin
Assert(Assigned(ASnippet), ClassName + '.InternalCreate: ASnippet is nil');
Assert(Assigned(ACompilers),
ClassName + '.InternalCreate: ACompilers is nil');
inherited InternalCreate;
fSnippet := ASnippet;
fCompilers := ACompilers;
end;
{ TTestCompileThread }
constructor TTestCompileThread.Create(ACompilers: ICompilers;
ASnippet: TSnippet);
{Object constructor. Sets up suspended thread.
@param ACompilers [in] Compilers to be used for test compilation.
@param ASnippet [in] Snippet to be compiled.
}
begin
inherited Create(True);
fCompilers := ACompilers;
fSnippet := ASnippet;
end;
procedure TTestCompileThread.Execute;
{Performs test compilation in a thread.
}
begin
TTestCompile.Compile(fCompilers, fSnippet);
end;
end.
Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.