|
@@ -530,6 +530,7 @@ type
|
|
private
|
|
private
|
|
Published
|
|
Published
|
|
Procedure TestCreate;
|
|
Procedure TestCreate;
|
|
|
|
+ Procedure TestNumberValues;
|
|
Procedure TestSimpleNodeFloat;
|
|
Procedure TestSimpleNodeFloat;
|
|
procedure TestSimpleNodeInteger;
|
|
procedure TestSimpleNodeInteger;
|
|
procedure TestSimpleNodeBooleanTrue;
|
|
procedure TestSimpleNodeBooleanTrue;
|
|
@@ -1320,10 +1321,19 @@ procedure TTestExpressionScanner.TestTokens;
|
|
|
|
|
|
Const
|
|
Const
|
|
TestStrings : Array[TTokenType] of String
|
|
TestStrings : Array[TTokenType] of String
|
|
|
|
+ (*
|
|
|
|
+ TTokenType = (ttPlus, ttMinus, ttLessThan, ttLargerThan, ttEqual, ttDiv,
|
|
|
|
+ ttMod, ttMul, ttLeft, ttRight, ttLessThanEqual,
|
|
|
|
+ ttLargerThanEqual, ttunequal, ttNumber, ttString, ttIdentifier,
|
|
|
|
+ ttComma, ttAnd, ttOr, ttXor, ttTrue, ttFalse, ttNot, ttif,
|
|
|
|
+ ttCase, ttPower, ttEOF); // keep ttEOF last
|
|
|
|
+
|
|
|
|
+ *)
|
|
= ('+','-','<','>','=','/',
|
|
= ('+','-','<','>','=','/',
|
|
- '*','(',')','<=','>=',
|
|
|
|
- '<>','1','''abc''','abc',',','and',
|
|
|
|
- 'or','xor','true','false','not','if','case','^','');
|
|
|
|
|
|
+ 'mod','*','(',')','<=',
|
|
|
|
+ '>=', '<>','1','''abc''','abc',
|
|
|
|
+ ',','and', 'or','xor','true','false','not',
|
|
|
|
+ 'if','case','^','');
|
|
|
|
|
|
var
|
|
var
|
|
t : TTokenType;
|
|
t : TTokenType;
|
|
@@ -1348,17 +1358,23 @@ end;
|
|
|
|
|
|
procedure TTestExpressionScanner.TestNumber;
|
|
procedure TTestExpressionScanner.TestNumber;
|
|
begin
|
|
begin
|
|
- {TestString('123',ttNumber);
|
|
|
|
|
|
+ TestString('123',ttNumber);
|
|
|
|
+ TestString('$FF',ttNumber);
|
|
|
|
+ TestString('&77',ttNumber);
|
|
|
|
+ TestString('%11111111',ttNumber);
|
|
TestString('123.4',ttNumber);
|
|
TestString('123.4',ttNumber);
|
|
TestString('123.E4',ttNumber);
|
|
TestString('123.E4',ttNumber);
|
|
TestString('1.E4',ttNumber);
|
|
TestString('1.E4',ttNumber);
|
|
TestString('1e-2',ttNumber);
|
|
TestString('1e-2',ttNumber);
|
|
|
|
+ DoInValidNumber('$GG');
|
|
|
|
+ DoInvalidNumber('&88');
|
|
|
|
+ DoInvalidNumber('%22');
|
|
DoInvalidNumber('1..1');
|
|
DoInvalidNumber('1..1');
|
|
-}
|
|
|
|
DoInvalidNumber('1.E--1');
|
|
DoInvalidNumber('1.E--1');
|
|
// DoInvalidNumber('.E-1');
|
|
// DoInvalidNumber('.E-1');
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+
|
|
procedure TTestExpressionScanner.TestInvalidCharacter;
|
|
procedure TTestExpressionScanner.TestInvalidCharacter;
|
|
begin
|
|
begin
|
|
DoInvalidNumber('~');
|
|
DoInvalidNumber('~');
|
|
@@ -2843,6 +2859,60 @@ begin
|
|
AssertEquals('No identifiers',0,FP.Identifiers.Count);
|
|
AssertEquals('No identifiers',0,FP.Identifiers.Count);
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+procedure TTestParserExpressions.TestNumberValues;
|
|
|
|
+
|
|
|
|
+ Procedure DoTest(E : String; V : integer);
|
|
|
|
+
|
|
|
|
+ var
|
|
|
|
+ res: TFPExpressionResult;
|
|
|
|
+
|
|
|
|
+ begin
|
|
|
|
+ FP.Expression:=E;
|
|
|
|
+ res := FP.Evaluate;
|
|
|
|
+ AssertTrue('Expression '+E+': Result is a number', Res.ResultType in [rtInteger,rtFloat]);
|
|
|
|
+ AssertTrue('Expression '+E+': Correct value', ArgToFloat(res)=V);
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+begin
|
|
|
|
+ // Decimal numbers
|
|
|
|
+ DoTest('1', 1);
|
|
|
|
+ DoTest('1E2', 100);
|
|
|
|
+ DoTest('1.0/1E-2', 100);
|
|
|
|
+ // DoTest('200%', 2);
|
|
|
|
+ WriteLn;
|
|
|
|
+ // Hex numbers
|
|
|
|
+ DoTest('$0001', 1);
|
|
|
|
+ DoTest('-$01', -1);
|
|
|
|
+ DoTest('$A', 10);
|
|
|
|
+ DoTest('$FF', 255);
|
|
|
|
+ DoTest('$fe', 254);
|
|
|
|
+ DoTest('$FFFF', $FFFF);
|
|
|
|
+ DoTest('1E2', 100);
|
|
|
|
+ DoTest('$E', 14);
|
|
|
|
+ DoTest('$D+1E2', 113);
|
|
|
|
+ DoTest('$0A-$0B', -1);
|
|
|
|
+ // Hex and variables
|
|
|
|
+ FP.Identifiers.AddVariable('a', rtInteger, '1');
|
|
|
|
+ FP.Identifiers.AddVariable('b', rtInteger, '$B');
|
|
|
|
+ DoTest('a', 1);
|
|
|
|
+ DoTest('b', $B);
|
|
|
|
+ DoTest('$A+a', 11);
|
|
|
|
+ DoTest('$B-b', 0);
|
|
|
|
+ WriteLn;
|
|
|
|
+ // Octal numbers
|
|
|
|
+ DoTest('&10', 8);
|
|
|
|
+ DoTest('&10+10', 18);
|
|
|
|
+ // Mixed hex and octal expression
|
|
|
|
+ DoTest('&10-$0008', 0);
|
|
|
|
+ WriteLn;
|
|
|
|
+ // Binary numbers
|
|
|
|
+ DoTest('%1', 1);
|
|
|
|
+ DoTest('%11', 3);
|
|
|
|
+ DoTest('%1000', 8);
|
|
|
|
+
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
|
|
procedure TTestParserExpressions.TestSimpleNodeFloat;
|
|
procedure TTestParserExpressions.TestSimpleNodeFloat;
|
|
begin
|
|
begin
|
|
@@ -4343,7 +4413,7 @@ begin
|
|
AssertEquals('One variable added',1,FP.Identifiers.Count);
|
|
AssertEquals('One variable added',1,FP.Identifiers.Count);
|
|
AssertSame('Result equals variable added',I,FP.Identifiers[0]);
|
|
AssertSame('Result equals variable added',I,FP.Identifiers[0]);
|
|
AssertEquals('Variable has correct resulttype',rtDateTime,I.ResultType);
|
|
AssertEquals('Variable has correct resulttype',rtDateTime,I.ResultType);
|
|
- AssertEquals('Variable has correct value',FormatDateTime('cccc',D),I.Value);
|
|
|
|
|
|
+ AssertEquals('Variable has correct value',FormatDateTime('yyyy-mm-dd hh:nn:ss',D),I.Value);
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure TTestParserVariables.AddVariabletwice;
|
|
procedure TTestParserVariables.AddVariabletwice;
|
|
@@ -5547,7 +5617,7 @@ begin
|
|
AssertSame('Result equals variable added',I,FM.Identifiers[0]);
|
|
AssertSame('Result equals variable added',I,FM.Identifiers[0]);
|
|
AssertEquals('Variable has correct category',ord(bcUser),Ord(I.Category));
|
|
AssertEquals('Variable has correct category',ord(bcUser),Ord(I.Category));
|
|
AssertEquals('Variable has correct resulttype',rtDateTime,I.ResultType);
|
|
AssertEquals('Variable has correct resulttype',rtDateTime,I.ResultType);
|
|
- AssertEquals('Variable has correct value',FormatDateTime('cccc',D),I.Value);
|
|
|
|
|
|
+ AssertEquals('Variable has correct value',FormatDateTime('yyyy-mm-dd hh:nn:ss',D),I.Value);
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure TTestBuiltinsManager.TestFunction1;
|
|
procedure TTestBuiltinsManager.TestFunction1;
|
|
@@ -5720,7 +5790,6 @@ procedure TTestBuiltins.TestRegister;
|
|
|
|
|
|
begin
|
|
begin
|
|
RegisterStdBuiltins(FM);
|
|
RegisterStdBuiltins(FM);
|
|
- AssertEquals('Correct number of identifiers',69,FM.IdentifierCount);
|
|
|
|
Assertvariable('pi',rtFloat);
|
|
Assertvariable('pi',rtFloat);
|
|
AssertFunction('cos','F','F',bcMath);
|
|
AssertFunction('cos','F','F',bcMath);
|
|
AssertFunction('sin','F','F',bcMath);
|
|
AssertFunction('sin','F','F',bcMath);
|
|
@@ -5785,11 +5854,13 @@ begin
|
|
AssertFunction('strtotimedef','D','SD',bcConversion);
|
|
AssertFunction('strtotimedef','D','SD',bcConversion);
|
|
AssertFunction('strtodatetime','D','S',bcConversion);
|
|
AssertFunction('strtodatetime','D','S',bcConversion);
|
|
AssertFunction('strtodatetimedef','D','SD',bcConversion);
|
|
AssertFunction('strtodatetimedef','D','SD',bcConversion);
|
|
|
|
+ AssertFunction('formatfloat','S','SF',bcConversion);
|
|
AssertFunction('sum','F','F',bcAggregate);
|
|
AssertFunction('sum','F','F',bcAggregate);
|
|
AssertFunction('count','I','',bcAggregate);
|
|
AssertFunction('count','I','',bcAggregate);
|
|
AssertFunction('avg','F','F',bcAggregate);
|
|
AssertFunction('avg','F','F',bcAggregate);
|
|
AssertFunction('min','F','F',bcAggregate);
|
|
AssertFunction('min','F','F',bcAggregate);
|
|
AssertFunction('max','F','F',bcAggregate);
|
|
AssertFunction('max','F','F',bcAggregate);
|
|
|
|
+ AssertEquals('Correct number of identifiers',70,FM.IdentifierCount);
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure TTestBuiltins.TestVariablepi;
|
|
procedure TTestBuiltins.TestVariablepi;
|