Menu

[r3885]: / branches / parsnip / Src / Main / CS.SourceCode.Pascal.TestUnit.pas  Maximize  Restore  History

Download this file

147 lines (124 with data), 4.1 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
{
* 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) 2006-2013, Peter Johnson (www.delphidabbler.com).
*
* $Rev$
* $Date$
*
* Implements a class that generates Pascal units for use when test compiling
* snippets.
}
unit CS.SourceCode.Pascal.TestUnit;
interface
uses
// Delphi
SysUtils,
// Project
DB.USnippet;
type
/// <summary>Class that generates Pascal units for use when test compiling
/// snippets.</summary>
TPascalTestUnit = class(TObject)
strict private
const
/// <summary>Name used for all test units.</summary>
TestUnitName = 'CodeSnipTestUnit';
var
/// <summary>Reference to snippet for which test unit is required.
/// </summary>
fSnippet: TSnippet;
/// <summary>Builds and returns fully specified unit file name.</summary>
function UnitFileName: string;
/// <summary>Returns the type of encoding needed to store the given unit
/// source code in a file.</summary>
/// <remarks>The encoding will be the default ANSI encoding unless the
/// source code contains characters outside the ANSI code page, when the
/// UTF-8 encoding is returned.</remarks>
function RequiredFileEncoding(const SourceCode: string): TEncoding;
public
/// <summary>Sets up object to create Pascal test unit for given snippet.
/// </summary>
constructor Create(const Snippet: TSnippet);
/// <summary>Generates source code of test unit.</summary>
function GenerateUnitSource: string;
/// <summary>Saves generated source to file.</summary>
/// <param name="FileName">string [out] Set to name of unit file. Base name
/// is name of unit.</param>
/// <remarks>
/// <para>Base file name contains only valid ASCII characters.</para>
/// <para>File is saved in default ANSI encoding unless source code
/// contains any characters not valid in default ANSI code page. In this
/// case file is saved with UTF-8 encoding.</para>
/// </remarks>
procedure SaveUnit(out FileName: string);
end;
implementation
uses
// Project
CS.SourceCode.Pascal.SourceGen,
DB.USnippetKind,
UEncodings,
UIOUtils,
USystemInfo,
UUtils;
{ TPascalTestUnit }
constructor TPascalTestUnit.Create(const Snippet: TSnippet);
begin
Assert(Assigned(Snippet), ClassName + '.Create: Snippet is nil');
inherited Create;
fSnippet := Snippet;
end;
function TPascalTestUnit.GenerateUnitSource: string;
begin
if fSnippet.Kind <> skUnit then
begin
with TPascalSourceGen.Create do
try
IncludeSnippet(fSnippet);
Result := UnitAsString(TestUnitName);
finally
Free;
end;
end
else
Result := fSnippet.SourceCode;
end;
function TPascalTestUnit.RequiredFileEncoding(const SourceCode: string):
TEncoding;
begin
if EncodingSupportsString(SourceCode, TEncoding.Default) then
Result := TEncoding.Default
else
Result := TEncoding.UTF8;
end;
procedure TPascalTestUnit.SaveUnit(out FileName: string);
var
SourceCode: string;
Encoding: TEncoding;
begin
FileName := UnitFileName;
SourceCode := GenerateUnitSource;
// If all of the source code is supported by default ANSI code page we use
// that to write file, otherwise we use UTF-8.
// Preference for default ANSI encoding is because early Delphis can only read
// source code files in this format. Later versions that can handle unicode
// characters in units also support UTF-8 format source code files.
Encoding := RequiredFileEncoding(SourceCode);
try
TFileIO.WriteAllText(FileName, SourceCode, Encoding, True);
finally
TEncodingHelper.FreeEncoding(Encoding);
end;
end;
function TPascalTestUnit.UnitFileName: string;
const
PasExt = '.pas'; // file extension for Pascal unit:
begin
// Unit file name is in temp folder
Result := IncludeTrailingPathDelimiter(TSystemFolders.Temp)
+ TestUnitName + PasExt;
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.