fpc/packages/fcl-passrc/tests/tconstparser.pas
michael a665785b93 * Fixed warnings/hints
git-svn-id: trunk@22130 -
2012-08-19 16:40:52 +00:00

632 lines
16 KiB
ObjectPascal

unit tconstparser;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, fpcunit, pastree, pscanner, tcbaseparser, testregistry;
Type
{ TTestConstParser }
TTestConstParser = Class(TTestParser)
private
FConst: TPasConst;
FExpr: TPasExpr;
FHint : string;
FTyped: String;
Protected
Function ParseConst(ASource : String) : TPasConst;
Procedure CheckExprNameKindClass(AKind : TPasExprKind; AClass : TClass);
Property TheConst : TPasConst Read FConst;
Property TheExpr : TPasExpr Read FExpr;
Property Hint : string Read FHint Write FHint;
Property Typed : String Read FTyped Write FTyped;
procedure SetUp; override;
Public
Procedure DoTestSimpleIntConst;
Procedure DoTestSimpleFloatConst;
Procedure DoTestSimpleStringConst;
Procedure DoTestSimpleNilConst;
Procedure DoTestSimpleBoolConst;
Procedure DoTestSimpleIdentifierConst;
Procedure DoTestSimpleSetConst;
Procedure DoTestSimpleExprConst;
Published
Procedure TestSimpleIntConst;
Procedure TestSimpleFloatConst;
Procedure TestSimpleStringConst;
Procedure TestSimpleNilConst;
Procedure TestSimpleBoolConst;
Procedure TestSimpleIdentifierConst;
Procedure TestSimpleSetConst;
Procedure TestSimpleExprConst;
Procedure TestSimpleIntConstDeprecatedMsg;
Procedure TestSimpleIntConstDeprecated;
Procedure TestSimpleFloatConstDeprecated;
Procedure TestSimpleStringConstDeprecated;
Procedure TestSimpleNilConstDeprecated;
Procedure TestSimpleBoolConstDeprecated;
Procedure TestSimpleIdentifierConstDeprecated;
Procedure TestSimpleSetConstDeprecated;
Procedure TestSimpleExprConstDeprecated;
Procedure TestSimpleIntConstPlatform;
Procedure TestSimpleFloatConstPlatform;
Procedure TestSimpleStringConstPlatform;
Procedure TestSimpleNilConstPlatform;
Procedure TestSimpleBoolConstPlatform;
Procedure TestSimpleIdentifierConstPlatform;
Procedure TestSimpleSetConstPlatform;
Procedure TestSimpleExprConstPlatform;
Procedure TestSimpleIntConstExperimental;
Procedure TestSimpleFloatConstExperimental;
Procedure TestSimpleStringConstExperimental;
Procedure TestSimpleNilConstExperimental;
Procedure TestSimpleBoolConstExperimental;
Procedure TestSimpleIdentifierConstExperimental;
Procedure TestSimpleSetConstExperimental;
Procedure TestSimpleExprConstExperimental;
Procedure TestTypedIntConst;
Procedure TestTypedFloatConst;
Procedure TestTypedStringConst;
Procedure TestTypedNilConst;
Procedure TestTypedBoolConst;
Procedure TestTypedIdentifierConst;
Procedure TestTypedSetConst;
Procedure TestTypedExprConst;
Procedure TestRecordConst;
Procedure TestArrayConst;
end;
{ TTestResourcestringParser }
TTestResourcestringParser = Class(TTestParser)
private
FExpr: TPasExpr;
FHint : string;
FTheStr: TPasResString;
Protected
Function ParseResourcestring(ASource : String) : TPasResString;
Procedure CheckExprNameKindClass(AKind : TPasExprKind; AClass : TClass);
Property Hint : string Read FHint Write FHint;
Property TheStr : TPasResString Read FTheStr;
Property TheExpr : TPasExpr Read FExpr;
Public
Procedure DoTestSimple;
Procedure DoTestSum;
Procedure DoTestSum2;
Published
Procedure TestSimple;
Procedure TestSimpleDeprecated;
Procedure TestSimplePlatform;
Procedure TestSum1;
Procedure TestSum1Deprecated;
Procedure TestSum1Platform;
Procedure TestSum2;
Procedure TestSum2Deprecated;
Procedure TestSum2Platform;
end;
implementation
{ TTestConstParser }
function TTestConstParser.ParseConst(ASource: String): TPasConst;
Var
D : String;
begin
Add('Const');
D:=' A ';
If (Typed<>'') then
D:=D+' : '+Typed+' ';
D:=D+' = '+ASource;
If Hint<>'' then
D:=D+' '+Hint;
Add(' '+D+';');
ParseDeclarations;
AssertEquals('One constant definition',1,Declarations.Consts.Count);
AssertEquals('First declaration is constant definition.',TPasConst,TObject(Declarations.Consts[0]).ClassType);
Result:=TPasConst(Declarations.Consts[0]);
AssertNotNull(Result.Expr);
FExpr:=Result.Expr;
FConst:=Result;
Definition:=Result;
end;
procedure TTestConstParser.CheckExprNameKindClass(
AKind: TPasExprKind; AClass : TClass);
begin
AssertEquals('Correct name','A',TheConst.Name);
AssertExpression('Const', TheExpr,aKind,AClass);
end;
procedure TTestConstParser.SetUp;
begin
inherited SetUp;
Hint:='';
end;
procedure TTestConstParser.DoTestSimpleIntConst;
begin
ParseConst('1');
AssertExpression('Integer Const',TheExpr,pekNumber,'1');
end;
procedure TTestConstParser.DoTestSimpleFloatConst;
begin
ParseConst('1.2');
AssertExpression('Float const', TheExpr,pekNumber,'1.2');
end;
procedure TTestConstParser.DoTestSimpleStringConst;
begin
ParseConst('''test''');
AssertExpression('String const', TheExpr,pekString,'''test''');
end;
procedure TTestConstParser.DoTestSimpleNilConst;
begin
ParseConst('Nil');
CheckExprNameKindClass(pekNil,TNilExpr);
end;
procedure TTestConstParser.DoTestSimpleBoolConst;
begin
ParseConst('True');
CheckExprNameKindClass(pekBoolConst,TBoolconstExpr);
AssertEquals('Correct expression value',True,TBoolconstExpr(TheExpr).Value);
end;
procedure TTestConstParser.DoTestSimpleIdentifierConst;
begin
ParseConst('taCenter');
AssertExpression('Enumeration const', theExpr,pekIdent,'taCenter');
end;
procedure TTestConstParser.DoTestSimpleSetConst;
begin
ParseConst('[taLeftJustify,taRightJustify]');
CheckExprNameKindClass(pekSet,TParamsExpr);
AssertEquals('Correct set count',2,Length(TParamsExpr(TheExpr).Params));
AssertExpression('Set element 1',TParamsExpr(TheExpr).Params[0],pekIdent,'taLeftJustify');
AssertExpression('Set element 2',TParamsExpr(TheExpr).Params[1],pekIdent,'taRightJustify');
end;
procedure TTestConstParser.DoTestSimpleExprConst;
Var
B : TBinaryExpr;
begin
ParseConst('1 + 2');
CheckExprNameKindClass(pekBinary,TBinaryExpr);
B:=TBinaryExpr(TheExpr);
AssertExpression('Left expression',B.Left,pekNumber,'1');
AssertExpression('Right expression',B.Right,pekNumber,'2');
end;
procedure TTestConstParser.TestSimpleIntConst;
begin
DoTestSimpleIntConst
end;
procedure TTestConstParser.TestSimpleFloatConst;
begin
DoTestSimpleFloatConst
end;
procedure TTestConstParser.TestSimpleStringConst;
begin
DoTestSimpleStringConst
end;
procedure TTestConstParser.TestSimpleNilConst;
begin
DoTestSimpleNilConst
end;
procedure TTestConstParser.TestSimpleBoolConst;
begin
DoTestSimpleBoolConst
end;
procedure TTestConstParser.TestSimpleIdentifierConst;
begin
DoTestSimpleIdentifierConst
end;
procedure TTestConstParser.TestSimpleSetConst;
begin
DoTestSimpleSetConst
end;
procedure TTestConstParser.TestSimpleExprConst;
begin
DoTestSimpleExprConst;
end;
procedure TTestConstParser.TestSimpleIntConstDeprecatedMsg;
begin
Hint:='deprecated ''this is old''' ;
DoTestSimpleIntConst;
CheckHint(hDeprecated);
end;
procedure TTestConstParser.TestSimpleIntConstDeprecated;
begin
Hint:='deprecated';
DoTestSimpleIntConst;
CheckHint(hDeprecated);
end;
procedure TTestConstParser.TestSimpleFloatConstDeprecated;
begin
Hint:='deprecated';
DoTestSimpleIntConst;
CheckHint(hDeprecated);
end;
procedure TTestConstParser.TestSimpleStringConstDeprecated;
begin
Hint:='deprecated';
DoTestSimpleStringConst;
CheckHint(hDeprecated);
end;
procedure TTestConstParser.TestSimpleNilConstDeprecated;
begin
Hint:='deprecated';
DoTestSimpleNilConst;
CheckHint(hDeprecated);
end;
procedure TTestConstParser.TestSimpleBoolConstDeprecated;
begin
Hint:='deprecated';
DoTestSimpleBoolConst;
CheckHint(hDeprecated);
end;
procedure TTestConstParser.TestSimpleIdentifierConstDeprecated;
begin
Hint:='deprecated';
DoTestSimpleIdentifierConst;
CheckHint(hDeprecated);
end;
procedure TTestConstParser.TestSimpleSetConstDeprecated;
begin
Hint:='deprecated';
DoTestSimpleSetConst;
CheckHint(hDeprecated);
end;
procedure TTestConstParser.TestSimpleExprConstDeprecated;
begin
Hint:='deprecated';
DoTestSimpleExprConst;
CheckHint(hDeprecated);
end;
procedure TTestConstParser.TestSimpleIntConstPlatform;
begin
Hint:='Platform';
DoTestSimpleIntConst;
CheckHint(hPlatform);
end;
procedure TTestConstParser.TestSimpleFloatConstPlatform;
begin
Hint:='Platform';
DoTestSimpleIntConst;
CheckHint(hPlatform);
end;
procedure TTestConstParser.TestSimpleStringConstPlatform;
begin
Hint:='Platform';
DoTestSimpleStringConst;
CheckHint(hPlatform);
end;
procedure TTestConstParser.TestSimpleNilConstPlatform;
begin
Hint:='Platform';
DoTestSimpleNilConst;
CheckHint(hPlatform);
end;
procedure TTestConstParser.TestSimpleBoolConstPlatform;
begin
Hint:='Platform';
DoTestSimpleBoolConst;
CheckHint(hPlatform);
end;
procedure TTestConstParser.TestSimpleIdentifierConstPlatform;
begin
Hint:='Platform';
DoTestSimpleIdentifierConst;
CheckHint(hPlatform);
end;
procedure TTestConstParser.TestSimpleExprConstPlatform;
begin
Hint:='Platform';
DoTestSimpleExprConst;
CheckHint(hPlatform);
end;
procedure TTestConstParser.TestSimpleSetConstPlatform;
begin
Hint:='Platform';
DoTestSimpleSetConst;
CheckHint(hPlatform);
end;
procedure TTestConstParser.TestSimpleIntConstExperimental;
begin
Hint:='Experimental';
DoTestSimpleIntConst;
CheckHint(hExperimental);
end;
procedure TTestConstParser.TestSimpleFloatConstExperimental;
begin
Hint:='Experimental';
DoTestSimpleIntConst;
CheckHint(hExperimental);
end;
procedure TTestConstParser.TestSimpleStringConstExperimental;
begin
Hint:='Experimental';
DoTestSimpleStringConst;
CheckHint(hExperimental);
end;
procedure TTestConstParser.TestSimpleNilConstExperimental;
begin
Hint:='Experimental';
DoTestSimpleNilConst;
CheckHint(hExperimental);
end;
procedure TTestConstParser.TestSimpleBoolConstExperimental;
begin
Hint:='Experimental';
DoTestSimpleBoolConst;
CheckHint(hExperimental);
end;
procedure TTestConstParser.TestSimpleIdentifierConstExperimental;
begin
Hint:='Experimental';
DoTestSimpleIdentifierConst;
CheckHint(hExperimental);
end;
procedure TTestConstParser.TestSimpleSetConstExperimental;
begin
Hint:='Experimental';
DoTestSimpleSetConst;
CheckHint(hExperimental);
end;
procedure TTestConstParser.TestSimpleExprConstExperimental;
begin
Hint:='Experimental';
DoTestSimpleExprConst;
CheckHint(hExperimental);
end;
procedure TTestConstParser.TestTypedIntConst;
begin
Typed:='Integer';
DoTestSimpleIntConst
end;
procedure TTestConstParser.TestTypedFloatConst;
begin
Typed:='Double';
DoTestSimpleFloatConst
end;
procedure TTestConstParser.TestTypedStringConst;
begin
Typed:='shortstring';
DoTestSimpleStringConst
end;
procedure TTestConstParser.TestTypedNilConst;
begin
Typed:='PChar';
DoTestSimpleNilConst
end;
procedure TTestConstParser.TestTypedBoolConst;
begin
Typed:='Boolean';
DoTestSimpleBoolConst
end;
procedure TTestConstParser.TestTypedIdentifierConst;
begin
Typed:='TAlign';
DoTestSimpleIdentifierConst
end;
procedure TTestConstParser.TestTypedSetConst;
begin
Typed:='TAligns';
DoTestSimpleSetConst
end;
procedure TTestConstParser.TestTypedExprConst;
begin
Typed:='ShortInt';
DoTestSimpleExprConst;
end;
procedure TTestConstParser.TestRecordConst;
Var
R : TRecordValues;
Fi : TRecordValuesItem;
begin
Typed := 'TPoint';
ParseConst('(x:1;y: 2)');
AssertEquals('Record Values',TRecordValues,TheExpr.ClassType);
R:=TheExpr as TRecordValues;
AssertEquals('Expression list of ',pekListOfExp,TheExpr.Kind);
AssertEquals('2 elements',2,Length(R.Fields));
FI:=R.Fields[0];
AssertEquals('Name field 1','x',Fi.Name);
AssertExpression('Field 1 value',Fi.ValueExp,pekNumber,'1');
FI:=R.Fields[1];
AssertEquals('Name field 2','y',Fi.Name);
AssertExpression('Field 2 value',Fi.ValueExp,pekNumber,'2');
end;
procedure TTestConstParser.TestArrayConst;
Var
R : TArrayValues;
begin
Typed := 'TMyArray';
ParseConst('(1 , 2)');
AssertEquals('Array Values',TArrayValues,TheExpr.ClassType);
R:=TheExpr as TArrayValues;
AssertEquals('Expression list of ',pekListOfExp,TheExpr.Kind);
AssertEquals('2 elements',2,Length(R.Values));
AssertExpression('Element 1 value',R.Values[0],pekNumber,'1');
AssertExpression('Element 2 value',R.Values[1],pekNumber,'2');
end;
{ TTestResourcestringParser }
function TTestResourcestringParser.ParseResourcestring(ASource: String
): TPasResString;
Var
D : String;
begin
Add('Resourcestring');
D:=' A = '+ASource;
If Hint<>'' then
D:=D+' '+Hint;
Add(' '+D+';');
Add('end.');
//Writeln(source.text);
ParseDeclarations;
AssertEquals('One resourcestring definition',1,Declarations.ResStrings.Count);
AssertEquals('First declaration is constant definition.',TPasResString,TObject(Declarations.ResStrings[0]).ClassType);
Result:=TPasResString(Declarations.ResStrings[0]);
FTheStr:=Result;
FExpr:=Result.Expr;
Definition:=Result;
end;
procedure TTestResourcestringParser.CheckExprNameKindClass(AKind: TPasExprKind;
AClass: TClass);
begin
AssertEquals('Correct name','A',TheStr.Name);
AssertEquals('Correct expression kind',aKind,TheExpr.Kind);
AssertEquals('Correct expression class',AClass,TheExpr.ClassType);
// Writeln('Delcaration : ',TheStr.GetDeclaration(True));
end;
procedure TTestResourcestringParser.DoTestSimple;
begin
ParseResourcestring('''Something''');
CheckExprNameKindClass(pekString,TPrimitiveExpr);
AssertEquals('Correct expression value','''Something''',TPrimitiveExpr(TheExpr).Value);
end;
procedure TTestResourcestringParser.DoTestSum;
begin
ParseResourcestring('''Something''+'' else''');
CheckExprNameKindClass(pekBinary,TBinaryExpr);
AssertEquals('Correct left',TPrimitiveExpr,TBinaryExpr(TheExpr).Left.ClassType);
AssertEquals('Correct right',TPrimitiveExpr,TBinaryExpr(TheExpr).Right.ClassType);
AssertEquals('Correct left expression value','''Something''',TPrimitiveExpr(TBinaryExpr(TheExpr).Left).Value);
AssertEquals('Correct right expression value',''' else''',TPrimitiveExpr(TBinaryExpr(TheExpr).Right).Value);
end;
procedure TTestResourcestringParser.DoTestSum2;
begin
ParseResourcestring('''Something''+different');
CheckExprNameKindClass(pekBinary,TBinaryExpr);
AssertEquals('Correct left',TPrimitiveExpr,TBinaryExpr(TheExpr).Left.ClassType);
AssertEquals('Correct right',TPrimitiveExpr,TBinaryExpr(TheExpr).Right.ClassType);
AssertEquals('Correct left expression value','''Something''',TPrimitiveExpr(TBinaryExpr(TheExpr).Left).Value);
AssertEquals('Correct right expression value','different',TPrimitiveExpr(TBinaryExpr(TheExpr).Right).Value);
end;
procedure TTestResourcestringParser.TestSimple;
begin
DoTestSimple;
end;
procedure TTestResourcestringParser.TestSimpleDeprecated;
begin
Hint:='deprecated';
DoTestSimple;
CheckHint(hDeprecated);
end;
procedure TTestResourcestringParser.TestSimplePlatform;
begin
Hint:='platform';
DoTestSimple;
CheckHint(hPlatform);
end;
procedure TTestResourcestringParser.TestSum2;
begin
DoTestSum2;
end;
procedure TTestResourcestringParser.TestSum2Deprecated;
begin
Hint:='deprecated';
DoTestSum2;
CheckHint(hDeprecated);
end;
procedure TTestResourcestringParser.TestSum2Platform;
begin
Hint:='platform';
DoTestSum2;
CheckHint(hplatform);
end;
procedure TTestResourcestringParser.TestSum1;
begin
DoTestSum;
end;
procedure TTestResourcestringParser.TestSum1Deprecated;
begin
Hint:='deprecated';
DoTestSum;
CheckHint(hDeprecated);
end;
procedure TTestResourcestringParser.TestSum1Platform;
begin
Hint:='platform';
DoTestSum;
CheckHint(hplatform);
end;
initialization
RegisterTests([TTestConstParser,TTestResourcestringParser]);
end.