utcexprparsparser.pp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. unit utcExprParsParser;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, punit, math, fpexprpars;
  6. procedure RegisterTests;
  7. implementation
  8. uses typinfo;
  9. type
  10. TMyFPExpressionParser = class(TFPExpressionParser)
  11. public
  12. property ExprNode;
  13. property Scanner;
  14. property Dirty;
  15. end;
  16. var
  17. FP: TMyFPExpressionParser;
  18. FTestExpr: String;
  19. procedure AssertLeftRight(N: TFPExprNode; LeftClass, RightClass: TClass);
  20. begin
  21. AssertNotNull('Node should not be nil', N);
  22. AssertEquals('Node should be a binary operation', True, N is TFPBinaryOperation);
  23. if N is TFPBinaryOperation then
  24. begin
  25. AssertEquals('Left node class', LeftClass, TFPBinaryOperation(N).Left.ClassType);
  26. AssertEquals('Right node class', RightClass, TFPBinaryOperation(N).Right.ClassType);
  27. end;
  28. end;
  29. procedure AssertOperand(N: TFPExprNode; OperandClass: TClass);
  30. begin
  31. AssertNotNull('Node should not be nil', N);
  32. AssertEquals('Node should be a unary operation', True, N is TFPUnaryOperator);
  33. if N is TFPUnaryOperator then
  34. AssertEquals('Operand node class', OperandClass, TFPUnaryOperator(N).Operand.ClassType);
  35. end;
  36. procedure AssertEqualsResultType(Msg: String; AExpected, AActual: TResultType);
  37. begin
  38. AssertEquals(Msg, ResultTypeName(AExpected), ResultTypeName(AActual));
  39. end;
  40. procedure AssertResultType(RT: TResultType);
  41. begin
  42. AssertEqualsResultType('Result type', RT, FP.ExprNode.NodeType);
  43. end;
  44. procedure AssertResult(F: TExprFloat);
  45. begin
  46. AssertEquals('Float result', F, FP.AsFloat, 1E-9);
  47. end;
  48. procedure AssertCurrencyResult(C: Currency);
  49. begin
  50. AssertEquals('Currency result', C, FP.AsCurrency, 1E-4);
  51. end;
  52. procedure AssertResult(I: Int64);
  53. begin
  54. AssertEquals('Integer result', I, FP.AsInteger);
  55. end;
  56. procedure AssertResult(S: String);
  57. begin
  58. AssertEquals('String result', S, FP.AsString);
  59. end;
  60. procedure AssertResult(B: Boolean);
  61. begin
  62. AssertEquals('Boolean result', B, FP.AsBoolean);
  63. end;
  64. procedure AssertDateTimeResult(D: TDateTime);
  65. begin
  66. AssertEquals('DateTime result', D, FP.AsDateTime);
  67. end;
  68. function Parser_Setup: string;
  69. begin
  70. FP := TMyFPExpressionParser.Create(nil);
  71. end;
  72. function Parser_TearDown : string;
  73. begin
  74. FreeAndNil(FP);
  75. end;
  76. procedure TestParser(AExpr: String);
  77. begin
  78. FP.Expression := AExpr;
  79. end;
  80. function TestParserExpressions_TestCreate: TTestString;
  81. begin
  82. Result := '';
  83. AssertNotNull('Parser created', FP);
  84. end;
  85. function TestParserExpressions_TestNumberValues: TTestString;
  86. begin
  87. Result := '';
  88. TestParser('123');
  89. AssertResult(123);
  90. TestParser('123.456');
  91. AssertResult(123.456);
  92. end;
  93. // ... and so on for all the other test cases ...
  94. procedure RegisterTests;
  95. begin
  96. AddSuite('TParserExpressionsTests', @Parser_Setup, @Parser_TearDown);
  97. AddTest('TestCreate', @TestParserExpressions_TestCreate, 'TParserExpressionsTests');
  98. AddTest('TestNumberValues', @TestParserExpressions_TestNumberValues, 'TParserExpressionsTests');
  99. // ... and so on for all the other tests ...
  100. end;
  101. end.