203 lines
5.9 KiB
ObjectPascal
203 lines
5.9 KiB
ObjectPascal
|
|
||
|
unit CompilerTestFunctions;
|
||
|
|
||
|
interface
|
||
|
|
||
|
uses Classes,
|
||
|
TestFramework,
|
||
|
{ Project Units }
|
||
|
ifps3,
|
||
|
ifpscomp,
|
||
|
ifps3utl,
|
||
|
IFPS3CompExec,
|
||
|
CompilerTestBase;
|
||
|
|
||
|
type
|
||
|
|
||
|
TCompilerTestFunctions = class(TCompilerTestBase)
|
||
|
private
|
||
|
function MethodTest(const s: string): string;
|
||
|
procedure AssertS(s1, s2: string);
|
||
|
procedure AssertI(s1, s2: Longint);
|
||
|
procedure AssertE(s1, s2: extended);
|
||
|
protected
|
||
|
procedure OnCompile(Sender: TIFPS3CompExec); override;
|
||
|
procedure OnExecute(Sender: TIFPS3CompExec); override;
|
||
|
published
|
||
|
procedure CallProcedure;
|
||
|
procedure CallMethod;
|
||
|
procedure CallScriptFunctionAsMethod;
|
||
|
procedure WideStringFunctions;
|
||
|
procedure CheckConsts;
|
||
|
end;
|
||
|
|
||
|
{
|
||
|
TVariablesTest = class(TCompilerTest)
|
||
|
private
|
||
|
published
|
||
|
end; }
|
||
|
|
||
|
implementation
|
||
|
|
||
|
uses StrUtils, SysUtils, Math, Dialogs,
|
||
|
{ Project Units }
|
||
|
ifpiir_std,
|
||
|
ifpii_std,
|
||
|
ifpiir_stdctrls,
|
||
|
ifpii_stdctrls,
|
||
|
ifpiir_forms,
|
||
|
ifpii_forms,
|
||
|
ifpii_graphics,
|
||
|
ifpii_controls,
|
||
|
ifpii_classes,
|
||
|
ifpiir_graphics,
|
||
|
ifpiir_controls,
|
||
|
ifpiir_classes;
|
||
|
|
||
|
|
||
|
{ TFunctionsTest }
|
||
|
|
||
|
var
|
||
|
vResultS: string;
|
||
|
vResultSw: WideString;
|
||
|
aWideString: WideString;
|
||
|
|
||
|
procedure ResultS(const s: string);
|
||
|
begin
|
||
|
vResultS := s;
|
||
|
end;
|
||
|
|
||
|
procedure ResultSw(const s: WideString);
|
||
|
begin
|
||
|
vResultSw := s;
|
||
|
end;
|
||
|
|
||
|
function getWideString(): WideString;
|
||
|
begin
|
||
|
Result := aWideString;
|
||
|
end;
|
||
|
|
||
|
|
||
|
function MyWide2String(s: WideString): String;
|
||
|
begin
|
||
|
Result := s + '+Wide2String';
|
||
|
end;
|
||
|
|
||
|
function MyString2Wide(s: String): WideString;
|
||
|
begin
|
||
|
Result := s + '+String2Wide';
|
||
|
end;
|
||
|
|
||
|
function MyWide2Wide(s: WideString): WideString;
|
||
|
begin
|
||
|
Result := s + '+Wide2Wide';
|
||
|
end;
|
||
|
|
||
|
procedure TCompilerTestFunctions.OnCompile(Sender: TIFPS3CompExec);
|
||
|
begin
|
||
|
inherited;
|
||
|
Sender.AddMethod(Self, @TCompilerTestFunctions.AssertS, 'procedure AssertS(s1, s2: string);');
|
||
|
Sender.AddMethod(Self, @TCompilerTestFunctions.AssertI, 'procedure AssertI(s1, s2: Longint);');
|
||
|
Sender.AddMethod(Self, @TCompilerTestFunctions.AssertE, 'procedure AssertE(s1, s2: Extended);');
|
||
|
|
||
|
|
||
|
Sender.AddFunction(@ResultS, 'procedure ResultS(s: string);');
|
||
|
Sender.AddFunction(@ResultSw, 'procedure ResultSw(s: WideString);');
|
||
|
Sender.AddFunction(@MyString2Wide, 'function MyString2Wide(s: String): Widestring;');
|
||
|
Sender.AddFunction(@MyWide2String, 'function MyWide2String(s: Widestring): string;');
|
||
|
Sender.AddFunction(@MyWide2Wide, 'function MyWide2Wide(s: Widestring): Widestring;');
|
||
|
Sender.AddFunction(@getWideString, 'function getWideString(): Widestring;');
|
||
|
Sender.AddMethod(Self, @TCompilerTestFunctions.MethodTest, 'function MethodTest(s: string): string');
|
||
|
//Sender.AddRegisteredVariable('aWideString', 'WideString');
|
||
|
end;
|
||
|
|
||
|
procedure TCompilerTestFunctions.OnExecute(Sender: TIFPS3CompExec);
|
||
|
begin
|
||
|
inherited;
|
||
|
//Sender.SetVarToInstance('aWideString', aWideString);
|
||
|
end;
|
||
|
|
||
|
procedure TCompilerTestFunctions.CallProcedure;
|
||
|
begin
|
||
|
CompileRun('begin ResultS(''hello''); end.');
|
||
|
CheckEquals('hello', vResultS, last_script);
|
||
|
end;
|
||
|
|
||
|
|
||
|
procedure TCompilerTestFunctions.WideStringFunctions;
|
||
|
begin
|
||
|
CompileRun('begin ResultS(MyString2Wide(''hello'')); end.');
|
||
|
CheckEquals('hello+String2Wide', vResultS, last_script);
|
||
|
|
||
|
CompileRun('begin ResultS(MyWide2String(''hello'')); end.');
|
||
|
CheckEquals('hello+Wide2String', vResultS, last_script);
|
||
|
|
||
|
CompileRun('begin ResultS(MyWide2Wide(''hello'')); end.');
|
||
|
CheckEquals('hello+Wide2Wide', vResultS, last_script);
|
||
|
|
||
|
aWideString := 'Unicode=[' + WideChar($1F04) + WideChar($4004) + ']';
|
||
|
CompileRun('begin ResultSw(getWideString()); end.');
|
||
|
CheckEquals(aWideString, vResultSw, last_script);
|
||
|
end;
|
||
|
|
||
|
function TCompilerTestFunctions.MethodTest(const s: string): string;
|
||
|
begin
|
||
|
Result := 'Test+'+s;
|
||
|
end;
|
||
|
|
||
|
procedure TCompilerTestFunctions.CallMethod;
|
||
|
begin
|
||
|
CompileRun('begin ResultS(MethodTest(''hello'')); end.');
|
||
|
CheckEquals('Test+hello', vResultS, last_script);
|
||
|
end;
|
||
|
|
||
|
type
|
||
|
TTestMethod = function (s: string): string of object;
|
||
|
|
||
|
procedure TCompilerTestFunctions.CallScriptFunctionAsMethod;
|
||
|
var
|
||
|
Meth: TTestMethod;
|
||
|
begin
|
||
|
Compile('function Test(s:string): string; begin Result := ''Test Results: ''+s;end; begin end.');
|
||
|
Meth := TTestMethod(CompExec.GetProcMethod('Test'));
|
||
|
Check(@Meth <> nil, 'Unable to find function');
|
||
|
CheckEquals('Test Results: INDATA', Meth('INDATA'));
|
||
|
end;
|
||
|
|
||
|
|
||
|
procedure TCompilerTestFunctions.CheckConsts;
|
||
|
begin
|
||
|
CompileRun('const s1 = ''test''; s2 = ''data: ''+s1; s3 = s2 + ''324''; i1 = 123; i2 = i1+123; '#13#10+
|
||
|
'i3 = 123 + i2; r1 = 123.0; r2 = 4123; r3 = r1 + r2; r4 = 2344.4 + r1; r5 = 23 + r1; r6 = r1 + 2344.4; '#13#10+
|
||
|
'r7 = r6 + 23; begin AssertS(s1, ''test''); AssertS(s2, ''data: test''); AssertS(s3, ''data: test324'');'#13#10+
|
||
|
'AssertI(i1, 123);AssertI(i2, 246);AssertI(i3, 369);AssertE(r1, 123);AssertE(r1, 123.0);AssertE(r2, 4123);'#13#10+
|
||
|
'AssertE(r2, 4123.0);AssertE(r3, 4123 + 123);AssertE(r3, 4246);AssertE(r4, 2344.4 + 123);AssertE(r4, 2467.4);'#13#10+
|
||
|
'AssertE(r5, 123 + 23);AssertE(r5, 123.0 + 23.0);AssertE(r5, 146.0);AssertE(r6, 2344.4 + 123);AssertE(r6, 2467.4);'#13#10+
|
||
|
'AssertE(r7, 2467.4 + 23);AssertE(r7, 2490.4);end.');
|
||
|
|
||
|
end;
|
||
|
|
||
|
procedure TCompilerTestFunctions.AssertE(s1, s2: extended);
|
||
|
begin
|
||
|
if abs(s1 - s2) > 0.0001 then
|
||
|
raise Exception.Create('AssertE: '+floattostr(s1)+' '+floattostr(s2));
|
||
|
end;
|
||
|
|
||
|
procedure TCompilerTestFunctions.AssertI(s1, s2: Integer);
|
||
|
begin
|
||
|
if s1 <> s2 then
|
||
|
raise Exception.Create('AssertI: '+inttostr(s1)+' '+inttostr(s2));
|
||
|
end;
|
||
|
|
||
|
procedure TCompilerTestFunctions.AssertS(s1, s2: string);
|
||
|
begin
|
||
|
if s1 <> s2 then
|
||
|
raise Exception.Create('AssertS: '+s1+' '+s2);
|
||
|
end;
|
||
|
|
||
|
initialization
|
||
|
RegisterTests('Functions Tests',
|
||
|
[ TCompilerTestFunctions.Suite
|
||
|
]);
|
||
|
|
||
|
end.
|