1 unit TestPascalParser; 2 3 {$mode objfpc}{$H+} 4 5 interface 6 7 uses 8 Classes, SysUtils, fpcunit, testutils, testregistry, FpPascalParser, FpErrorMessages, 9 {$ifdef FORCE_LAZLOGGER_DUMMY} LazLoggerDummy {$else} LazLoggerBase {$endif}; 10 11 type 12 13 { TTestPascalParser } 14 15 TTestPascalParser = class(TTestCase) 16 published 17 procedure TestParser; 18 end; 19 20 implementation 21 22 23 type 24 25 { TTestFpPascalExpression } 26 27 TTestFpPascalExpression=class(TFpPascalExpression) 28 public 29 property ExpressionPart; 30 end; 31 32 { TTestFpPascalExpression } 33 34 procedure TTestPascalParser.TestParser; 35 var 36 CurrentTestExprText: String; 37 CurrentTestExprObj: TTestFpPascalExpression; 38 GetChildnull39 function GetChild(p: TFpPascalExpressionPart; i: array of integer): TFpPascalExpressionPart; 40 var 41 j: Integer; 42 begin 43 Result := p; 44 for j := low(i) to high(i) do 45 Result := (Result as TFpPascalExpressionPartContainer).Items[i[j]]; 46 end; 47 GetChildnull48 function GetChild(i: array of integer): TFpPascalExpressionPart; 49 begin 50 Result := GetChild(CurrentTestExprObj.ExpressionPart, i); 51 end; 52 53 Procedure TestExpr(APart: TFpPascalExpressionPart; AClass: TFpPascalExpressionPartClass; 54 AText: String; AChildCount: Integer = -1); 55 begin 56 AssertNotNull(CurrentTestExprText+ ': IsAssigned', APart); 57 AssertTrue(CurrentTestExprText+': APart IS Class exp: '+AClass.ClassName+' was: '+APart.ClassName, 58 APart is AClass); 59 AssertEquals(CurrentTestExprText+': Text', AText, APart.GetText); 60 if AChildCount >=0 then begin 61 AssertTrue(CurrentTestExprText+': Is container ', APart is TFpPascalExpressionPartContainer); 62 AssertEquals(CurrentTestExprText+': childcount ', AChildCount, (APart as TFpPascalExpressionPartContainer).Count); 63 end; 64 end; 65 66 Procedure TestExpr(i: array of integer; AClass: TFpPascalExpressionPartClass; 67 AText: String; AChildCount: Integer = -1); 68 begin 69 TestExpr(GetChild(i), AClass, AText, AChildCount); 70 end; 71 72 procedure CreateExpr(t: string; ExpValid: Boolean); 73 var 74 s: String; 75 begin 76 FreeAndNil(CurrentTestExprObj); 77 CurrentTestExprText := t; 78 CurrentTestExprObj := TTestFpPascalExpression.Create(CurrentTestExprText, nil); 79 DebugLn(CurrentTestExprObj.DebugDump); 80 s := ErrorHandler.ErrorAsString(CurrentTestExprObj.Error); 81 AssertEquals('Valid '+s+ ' # '+CurrentTestExprText, ExpValid, CurrentTestExprObj.Valid); 82 end; 83 84 begin 85 CurrentTestExprObj := nil; 86 try 87 CreateExpr('a', True); 88 TestExpr([], TFpPascalExpressionPartIdentifier, 'a', 0); 89 90 CreateExpr('a b', False); 91 CreateExpr('a |', False); 92 CreateExpr('| b', False); 93 CreateExpr('|', False); 94 95 CreateExpr('@a', True); 96 TestExpr([], TFpPascalExpressionPartOperatorAddressOf, '@', 1); 97 TestExpr([0], TFpPascalExpressionPartIdentifier, 'a', 0); 98 99 CreateExpr('a@', False); 100 CreateExpr('@', False); 101 102 CreateExpr('-a', True); 103 TestExpr([], TFpPascalExpressionPartOperatorUnaryPlusMinus, '-', 1); 104 TestExpr([0], TFpPascalExpressionPartIdentifier, 'a', 0); 105 106 CreateExpr('+-a', True); 107 TestExpr([], TFpPascalExpressionPartOperatorUnaryPlusMinus, '+', 1); 108 TestExpr([0], TFpPascalExpressionPartOperatorUnaryPlusMinus, '-', 1); 109 TestExpr([0,0], TFpPascalExpressionPartIdentifier, 'a', 0); 110 111 CreateExpr('a+b', True); 112 TestExpr([], TFpPascalExpressionPartOperatorPlusMinus, '+', 2); 113 TestExpr([0], TFpPascalExpressionPartIdentifier, 'a', 0); 114 TestExpr([1], TFpPascalExpressionPartIdentifier, 'b', 0); 115 116 CreateExpr('a+', False); 117 CreateExpr('a*', False); 118 CreateExpr('a+b-', False); 119 CreateExpr('a@+b', False); 120 121 CreateExpr('a+-b', True); 122 TestExpr([], TFpPascalExpressionPartOperatorPlusMinus, '+', 2); 123 TestExpr([0], TFpPascalExpressionPartIdentifier, 'a', 0); 124 TestExpr([1], TFpPascalExpressionPartOperatorUnaryPlusMinus, '-', 1); 125 TestExpr([1,0], TFpPascalExpressionPartIdentifier, 'b', 0); 126 127 CreateExpr('+a + -@b - @+c', True); 128 TestExpr([], TFpPascalExpressionPartOperatorPlusMinus, '-', 2); 129 TestExpr( [0], TFpPascalExpressionPartOperatorPlusMinus, '+', 2); 130 TestExpr( [0,0], TFpPascalExpressionPartOperatorUnaryPlusMinus,'+', 1); 131 TestExpr( [0,0,0], TFpPascalExpressionPartIdentifier, 'a', 0); 132 TestExpr( [0,1], TFpPascalExpressionPartOperatorUnaryPlusMinus, '-', 1); 133 TestExpr( [0,1,0], TFpPascalExpressionPartOperatorAddressOf, '@', 1); 134 TestExpr([0,1,0,0], TFpPascalExpressionPartIdentifier, 'b', 0); 135 TestExpr( [1], TFpPascalExpressionPartOperatorAddressOf, '@', 1); 136 TestExpr( [1,0], TFpPascalExpressionPartOperatorUnaryPlusMinus, '+', 1); 137 TestExpr( [1,0,0], TFpPascalExpressionPartIdentifier, 'c', 0); 138 139 CreateExpr('a+b*c', True); 140 TestExpr([], TFpPascalExpressionPartOperatorPlusMinus, '+', 2); 141 TestExpr([0], TFpPascalExpressionPartIdentifier, 'a', 0); 142 TestExpr([1], TFpPascalExpressionPartOperatorMulDiv, '*', 2); 143 TestExpr([1,0], TFpPascalExpressionPartIdentifier, 'b', 0); 144 TestExpr([1,1], TFpPascalExpressionPartIdentifier, 'c', 0); 145 146 CreateExpr('a*b+c', True); 147 TestExpr([], TFpPascalExpressionPartOperatorPlusMinus, '+', 2); 148 TestExpr( [0], TFpPascalExpressionPartOperatorMulDiv, '*', 2); 149 TestExpr([0,0], TFpPascalExpressionPartIdentifier, 'a', 0); 150 TestExpr([0,1], TFpPascalExpressionPartIdentifier, 'b', 0); 151 TestExpr( [1], TFpPascalExpressionPartIdentifier, 'c', 0); 152 153 CreateExpr('a*b+c*d', True); 154 TestExpr([], TFpPascalExpressionPartOperatorPlusMinus, '+', 2); 155 TestExpr( [0], TFpPascalExpressionPartOperatorMulDiv, '*', 2); 156 TestExpr([0,0], TFpPascalExpressionPartIdentifier, 'a', 0); 157 TestExpr([0,1], TFpPascalExpressionPartIdentifier, 'b', 0); 158 TestExpr( [1], TFpPascalExpressionPartOperatorMulDiv, '*', 2); 159 TestExpr([1,0], TFpPascalExpressionPartIdentifier, 'c', 0); 160 TestExpr([1,1], TFpPascalExpressionPartIdentifier, 'd', 0); 161 162 CreateExpr('@a*@b+@c', True); 163 TestExpr([], TFpPascalExpressionPartOperatorPlusMinus, '+', 2); 164 TestExpr( [0], TFpPascalExpressionPartOperatorMulDiv, '*', 2); 165 TestExpr( [0,0], TFpPascalExpressionPartOperatorAddressOf, '@', 1); 166 TestExpr([0,0,0], TFpPascalExpressionPartIdentifier, 'a', 0); 167 TestExpr( [0,1], TFpPascalExpressionPartOperatorAddressOf, '@', 1); 168 TestExpr([0,1,0], TFpPascalExpressionPartIdentifier, 'b', 0); 169 TestExpr( [1], TFpPascalExpressionPartOperatorAddressOf, '@', 1); 170 TestExpr( [1,0], TFpPascalExpressionPartIdentifier, 'c', 0); 171 172 CreateExpr('@a*@b+@c*@d', True); 173 TestExpr([], TFpPascalExpressionPartOperatorPlusMinus, '+', 2); 174 TestExpr( [0], TFpPascalExpressionPartOperatorMulDiv, '*', 2); 175 TestExpr( [0,0], TFpPascalExpressionPartOperatorAddressOf, '@', 1); 176 TestExpr([0,0,0], TFpPascalExpressionPartIdentifier, 'a', 0); 177 TestExpr( [0,1], TFpPascalExpressionPartOperatorAddressOf, '@', 1); 178 TestExpr([0,1,0], TFpPascalExpressionPartIdentifier, 'b', 0); 179 TestExpr( [1], TFpPascalExpressionPartOperatorMulDiv, '*', 2); 180 TestExpr( [1,0], TFpPascalExpressionPartOperatorAddressOf, '@', 1); 181 TestExpr([1,0,0], TFpPascalExpressionPartIdentifier, 'c', 0); 182 TestExpr( [1,1], TFpPascalExpressionPartOperatorAddressOf, '@', 1); 183 TestExpr([1,1,0], TFpPascalExpressionPartIdentifier, 'd', 0); 184 185 186 CreateExpr('a.b', True); 187 TestExpr([], TFpPascalExpressionPartOperatorMemberOf, '.', 2); 188 TestExpr([0], TFpPascalExpressionPartIdentifier, 'a', 0); 189 TestExpr([1], TFpPascalExpressionPartIdentifier, 'b', 0); 190 191 CreateExpr('a.b^', True); 192 TestExpr([], TFpPascalExpressionPartOperatorDeRef, '^', 1); 193 TestExpr([0], TFpPascalExpressionPartOperatorMemberOf, '.', 2); 194 TestExpr([0,0], TFpPascalExpressionPartIdentifier, 'a', 0); 195 TestExpr([0,1], TFpPascalExpressionPartIdentifier, 'b', 0); 196 197 CreateExpr('a^.b', True); 198 TestExpr([], TFpPascalExpressionPartOperatorMemberOf, '.', 2); 199 TestExpr([0], TFpPascalExpressionPartOperatorDeRef, '^', 1); 200 TestExpr([0,0], TFpPascalExpressionPartIdentifier, 'a', 0); 201 TestExpr([1], TFpPascalExpressionPartIdentifier, 'b', 0); 202 203 CreateExpr('a.b.c', True); 204 TestExpr([], TFpPascalExpressionPartOperatorMemberOf, '.', 2); 205 TestExpr([0], TFpPascalExpressionPartOperatorMemberOf, '.', 2); 206 TestExpr([0,0], TFpPascalExpressionPartIdentifier, 'a', 0); 207 TestExpr([0,1], TFpPascalExpressionPartIdentifier, 'b', 0); 208 TestExpr([1], TFpPascalExpressionPartIdentifier, 'c', 0); 209 210 CreateExpr('(a)', True); 211 TestExpr([], TFpPascalExpressionPartBracketSubExpression, '(', 1); 212 TestExpr([0], TFpPascalExpressionPartIdentifier, 'a', 0); 213 214 CreateExpr('a)', False); 215 CreateExpr('(a', False); 216 CreateExpr(')', False); 217 CreateExpr('(', False); 218 CreateExpr('(*a)', False); 219 220 CreateExpr('(-a)', True); 221 TestExpr([], TFpPascalExpressionPartBracketSubExpression, '(', 1); 222 TestExpr([0], TFpPascalExpressionPartOperatorUnaryPlusMinus, '-', 1); 223 TestExpr([0,0], TFpPascalExpressionPartIdentifier, 'a', 0); 224 225 CreateExpr('-(-a)', True); 226 TestExpr([], TFpPascalExpressionPartOperatorUnaryPlusMinus, '-', 1); 227 TestExpr([0], TFpPascalExpressionPartBracketSubExpression, '(', 1); 228 TestExpr([0,0], TFpPascalExpressionPartOperatorUnaryPlusMinus, '-', 1); 229 TestExpr([0,0,0], TFpPascalExpressionPartIdentifier, 'a', 0); 230 231 CreateExpr('(a*b)', True); 232 TestExpr([], TFpPascalExpressionPartBracketSubExpression, '(', 1); 233 TestExpr([0], TFpPascalExpressionPartOperatorMulDiv, '*', 2); 234 TestExpr([0,0], TFpPascalExpressionPartIdentifier, 'a', 0); 235 TestExpr([0,1], TFpPascalExpressionPartIdentifier, 'b', 0); 236 237 CreateExpr('(-a*b)', True); 238 TestExpr([], TFpPascalExpressionPartBracketSubExpression, '(', 1); 239 TestExpr([0], TFpPascalExpressionPartOperatorMulDiv, '*', 2); 240 TestExpr([0,0], TFpPascalExpressionPartOperatorUnaryPlusMinus, '-', 1); 241 TestExpr([0,0,0], TFpPascalExpressionPartIdentifier, 'a', 0); 242 TestExpr([0,1], TFpPascalExpressionPartIdentifier, 'b', 0); 243 244 CreateExpr('(a)*b', True); 245 TestExpr([], TFpPascalExpressionPartOperatorMulDiv, '*', 2); 246 TestExpr([0], TFpPascalExpressionPartBracketSubExpression, '(', 1); 247 TestExpr([0,0], TFpPascalExpressionPartIdentifier, 'a', 0); 248 TestExpr([1], TFpPascalExpressionPartIdentifier, 'b', 0); 249 250 CreateExpr('(a+b)*c', True); 251 CreateExpr('(@a)*@c', True); 252 CreateExpr('(@a+@b)*@c', True); 253 254 CreateExpr('f(a+b)*c', True); 255 TestExpr( [], TFpPascalExpressionPartOperatorMulDiv, '*', 2); 256 TestExpr( [0], TFpPascalExpressionPartBracketArgumentList, '(', 2); 257 TestExpr( [0,0], TFpPascalExpressionPartIdentifier, 'f', 0); 258 TestExpr( [0,1], TFpPascalExpressionPartOperatorPlusMinus, '+', 2); 259 TestExpr([0,1,0], TFpPascalExpressionPartIdentifier, 'a', 0); 260 TestExpr([0,1,1], TFpPascalExpressionPartIdentifier, 'b', 0); 261 TestExpr( [1], TFpPascalExpressionPartIdentifier, 'c', 0); 262 263 CreateExpr('f(a)', True); 264 TestExpr([], TFpPascalExpressionPartBracketArgumentList, '(', 2); 265 TestExpr([0], TFpPascalExpressionPartIdentifier, 'f', 0); 266 TestExpr([1], TFpPascalExpressionPartIdentifier, 'a', 0); 267 268 CreateExpr('f(a)(b)', True); 269 TestExpr([], TFpPascalExpressionPartBracketArgumentList, '(', 2); 270 TestExpr([0], TFpPascalExpressionPartBracketArgumentList, '(', 2); 271 TestExpr([0,0], TFpPascalExpressionPartIdentifier, 'f', 0); 272 TestExpr([0,1], TFpPascalExpressionPartIdentifier, 'a', 0); 273 TestExpr([1], TFpPascalExpressionPartIdentifier, 'b', 0); 274 275 CreateExpr('f()', True); 276 TestExpr([], TFpPascalExpressionPartBracketArgumentList, '(', 1); 277 TestExpr([0], TFpPascalExpressionPartIdentifier, 'f', 0); 278 279 CreateExpr('f(a,b)', True); 280 TestExpr([], TFpPascalExpressionPartBracketArgumentList, '(', 3); 281 TestExpr([0], TFpPascalExpressionPartIdentifier, 'f', 0); 282 TestExpr([1], TFpPascalExpressionPartIdentifier, 'a', 0); 283 TestExpr([2], TFpPascalExpressionPartIdentifier, 'b', 0); 284 285 CreateExpr('f(a,b, c)', True); 286 TestExpr([], TFpPascalExpressionPartBracketArgumentList, '(', 4); 287 TestExpr([0], TFpPascalExpressionPartIdentifier, 'f', 0); 288 TestExpr([1], TFpPascalExpressionPartIdentifier, 'a', 0); 289 TestExpr([2], TFpPascalExpressionPartIdentifier, 'b', 0); 290 TestExpr([3], TFpPascalExpressionPartIdentifier, 'c', 0); 291 292 CreateExpr('f(x(a),b)', True); 293 TestExpr([], TFpPascalExpressionPartBracketArgumentList, '(', 3); 294 TestExpr([0], TFpPascalExpressionPartIdentifier, 'f', 0); 295 TestExpr([1], TFpPascalExpressionPartBracketArgumentList, '(', 2); 296 TestExpr([1,0], TFpPascalExpressionPartIdentifier, 'x', 0); 297 TestExpr([1,1], TFpPascalExpressionPartIdentifier, 'a', 0); 298 TestExpr([2], TFpPascalExpressionPartIdentifier, 'b', 0); 299 300 CreateExpr('f(,)', False); 301 CreateExpr('f(,,)', False); 302 CreateExpr('f(a,)', False); 303 CreateExpr('f(,a)', False); 304 CreateExpr('f(a,,b)', False); 305 306 CreateExpr('f(a)+b', True); 307 TestExpr([], TFpPascalExpressionPartOperatorPlusMinus, '+', 2); 308 TestExpr([0], TFpPascalExpressionPartBracketArgumentList, '(', 2); 309 TestExpr([0,0], TFpPascalExpressionPartIdentifier, 'f', 0); 310 TestExpr([0,1], TFpPascalExpressionPartIdentifier, 'a', 0); 311 TestExpr([1], TFpPascalExpressionPartIdentifier, 'b', 0); 312 313 CreateExpr('c+f(a)', True); 314 TestExpr([], TFpPascalExpressionPartOperatorPlusMinus, '+', 2); 315 TestExpr([0], TFpPascalExpressionPartIdentifier, 'c', 0); 316 TestExpr([1], TFpPascalExpressionPartBracketArgumentList, '(', 2); 317 TestExpr([1,0], TFpPascalExpressionPartIdentifier, 'f', 0); 318 TestExpr([1,1], TFpPascalExpressionPartIdentifier, 'a', 0); 319 320 CreateExpr('c.f(a)', True); // (c.f) (a) 321 TestExpr([], TFpPascalExpressionPartBracketArgumentList, '(', 2); 322 TestExpr([0], TFpPascalExpressionPartOperatorMemberOf, '.', 2); 323 TestExpr([0,0], TFpPascalExpressionPartIdentifier, 'c', 0); 324 TestExpr([0,1], TFpPascalExpressionPartIdentifier, 'f', 0); 325 TestExpr([1], TFpPascalExpressionPartIdentifier, 'a', 0); 326 327 CreateExpr('f(a).c', True); // (c.f) (a) 328 TestExpr([], TFpPascalExpressionPartOperatorMemberOf, '.', 2); 329 TestExpr([0], TFpPascalExpressionPartBracketArgumentList, '(', 2); 330 TestExpr([0,0], TFpPascalExpressionPartIdentifier, 'f', 0); 331 TestExpr([0,1], TFpPascalExpressionPartIdentifier, 'a', 0); 332 TestExpr([1], TFpPascalExpressionPartIdentifier, 'c', 0); 333 334 CreateExpr('@f(a)', True); // @( f(a) ) 335 TestExpr([], TFpPascalExpressionPartOperatorAddressOf, '@', 1); 336 TestExpr([0], TFpPascalExpressionPartBracketArgumentList, '(', 2); 337 TestExpr([0,0], TFpPascalExpressionPartIdentifier, 'f', 0); 338 TestExpr([0,1], TFpPascalExpressionPartIdentifier, 'a', 0); 339 340 CreateExpr('-f(a)', True); // -( f(a) ) 341 TestExpr([], TFpPascalExpressionPartOperatorUnaryPlusMinus, '-', 1); 342 TestExpr([0], TFpPascalExpressionPartBracketArgumentList, '(', 2); 343 TestExpr([0,0], TFpPascalExpressionPartIdentifier, 'f', 0); 344 TestExpr([0,1], TFpPascalExpressionPartIdentifier, 'a', 0); 345 346 CreateExpr('f^(a)', True); // (f^) (a) 347 TestExpr([], TFpPascalExpressionPartBracketArgumentList, '(', 2); 348 TestExpr([0], TFpPascalExpressionPartOperatorDeRef, '^', 1); 349 TestExpr([0,0], TFpPascalExpressionPartIdentifier, 'f', 0); 350 TestExpr([1], TFpPascalExpressionPartIdentifier, 'a', 0); 351 352 CreateExpr('f(a)^', True); // ( f(a) )^ 353 TestExpr([], TFpPascalExpressionPartOperatorDeRef, '^', 1); 354 TestExpr([0], TFpPascalExpressionPartBracketArgumentList, '(', 2); 355 TestExpr([0,0], TFpPascalExpressionPartIdentifier, 'f', 0); 356 TestExpr([0,1], TFpPascalExpressionPartIdentifier, 'a', 0); 357 358 CreateExpr('f(a)(b)^', True); // ( f(a)(b) )^ 359 TestExpr([], TFpPascalExpressionPartOperatorDeRef, '^', 1); 360 TestExpr([0], TFpPascalExpressionPartBracketArgumentList, '(', 2); 361 TestExpr([0,0], TFpPascalExpressionPartBracketArgumentList, '(', 2); 362 TestExpr([0,0,0], TFpPascalExpressionPartIdentifier, 'f', 0); 363 TestExpr([0,0,1], TFpPascalExpressionPartIdentifier, 'a', 0); 364 TestExpr([0,1], TFpPascalExpressionPartIdentifier, 'b', 0); 365 366 CreateExpr('f.()', False); 367 CreateExpr('f(*a)', False); 368 369 CreateExpr('f[a]', True); 370 CreateExpr('f * [a]', True); 371 372 CreateExpr('a^', True); 373 TestExpr([], TFpPascalExpressionPartOperatorDeRef, '^', 1); 374 TestExpr([0], TFpPascalExpressionPartIdentifier, 'a', 0); 375 376 CreateExpr('-a^', True); 377 TestExpr([], TFpPascalExpressionPartOperatorUnaryPlusMinus, '-', 1); 378 TestExpr([0], TFpPascalExpressionPartOperatorDeRef, '^', 1); 379 TestExpr([0,0], TFpPascalExpressionPartIdentifier, 'a', 0); 380 381 CreateExpr('@a^', True); 382 TestExpr([], TFpPascalExpressionPartOperatorAddressOf, '@', 1); 383 TestExpr([0], TFpPascalExpressionPartOperatorDeRef, '^', 1); 384 TestExpr([0,0], TFpPascalExpressionPartIdentifier, 'a', 0); 385 386 CreateExpr('-@a', True); 387 TestExpr([], TFpPascalExpressionPartOperatorUnaryPlusMinus, '-', 1); 388 TestExpr([0], TFpPascalExpressionPartOperatorAddressOf, '@', 1); 389 TestExpr([0,0], TFpPascalExpressionPartIdentifier, 'a', 0); 390 391 CreateExpr('-@a^', True); 392 TestExpr([], TFpPascalExpressionPartOperatorUnaryPlusMinus, '-', 1); 393 TestExpr([0], TFpPascalExpressionPartOperatorAddressOf, '@', 1); 394 TestExpr([0,0], TFpPascalExpressionPartOperatorDeRef, '^', 1); 395 TestExpr([0,0,0], TFpPascalExpressionPartIdentifier, 'a', 0); 396 397 CreateExpr('^f(a)', True); 398 TestExpr([], TFpPascalExpressionPartBracketArgumentList, '(', 2); 399 TestExpr([0], TFpPascalExpressionPartOperatorMakeRef, '^', 1); 400 TestExpr([0,0], TFpPascalExpressionPartIdentifier, 'f', 0); 401 TestExpr([1], TFpPascalExpressionPartIdentifier, 'a', 0); 402 403 CreateExpr('^f(a)^', True); 404 TestExpr([], TFpPascalExpressionPartOperatorDeRef, '^', 1); 405 TestExpr([0], TFpPascalExpressionPartBracketArgumentList, '(', 2); 406 TestExpr([0,0], TFpPascalExpressionPartOperatorMakeRef, '^', 1); 407 TestExpr([0,0,0], TFpPascalExpressionPartIdentifier, 'f', 0); 408 TestExpr([0,1], TFpPascalExpressionPartIdentifier, 'a', 0); 409 410 CreateExpr('@f(a)(b)', True); 411 TestExpr([], TFpPascalExpressionPartOperatorAddressOf, '@', 1); 412 TestExpr([0], TFpPascalExpressionPartBracketArgumentList, '(', 2); 413 TestExpr([0,0], TFpPascalExpressionPartBracketArgumentList, '(', 2); 414 TestExpr([0,0,0], TFpPascalExpressionPartIdentifier, 'f', 0); 415 TestExpr([0,0,1], TFpPascalExpressionPartIdentifier, 'a', 0); 416 TestExpr([0,1], TFpPascalExpressionPartIdentifier, 'b', 0); 417 418 CreateExpr('f(a)(b)^', True); 419 TestExpr([], TFpPascalExpressionPartOperatorDeRef, '^', 1); 420 TestExpr([0], TFpPascalExpressionPartBracketArgumentList, '(', 2); 421 TestExpr([0,0], TFpPascalExpressionPartBracketArgumentList, '(', 2); 422 TestExpr([0,0,0], TFpPascalExpressionPartIdentifier, 'f', 0); 423 TestExpr([0,0,1], TFpPascalExpressionPartIdentifier, 'a', 0); 424 TestExpr([0,1], TFpPascalExpressionPartIdentifier, 'b', 0); 425 426 CreateExpr('f[a]', True); 427 TestExpr([], TFpPascalExpressionPartBracketIndex, '[', 2); 428 TestExpr([0], TFpPascalExpressionPartIdentifier, 'f', 0); 429 TestExpr([1], TFpPascalExpressionPartIdentifier, 'a', 0); 430 431 CreateExpr('f[a,b]', True); 432 TestExpr([], TFpPascalExpressionPartBracketIndex, '[', 3); 433 TestExpr([0], TFpPascalExpressionPartIdentifier, 'f', 0); 434 TestExpr([1], TFpPascalExpressionPartIdentifier, 'a', 0); 435 TestExpr([2], TFpPascalExpressionPartIdentifier, 'b', 0); 436 437 CreateExpr('f[]', False); 438 CreateExpr('f[,]', False); 439 CreateExpr('f[,a]', False); 440 CreateExpr('f[a,]', False); 441 CreateExpr('f[a,,b]', False); 442 443 CreateExpr('TFoo(f^[0]).a', True); 444 445 CreateExpr('^^int(1)', True); 446 447 CreateExpr('x * [a]', True); 448 TestExpr([], TFpPascalExpressionPartOperatorMulDiv, '*', 2); 449 TestExpr([0], TFpPascalExpressionPartIdentifier, 'x', 0); 450 TestExpr([1], TFpPascalExpressionPartBracketSet, '[', 1); 451 TestExpr([1,0], TFpPascalExpressionPartIdentifier, 'a', 0); 452 453 CreateExpr('x * []', True); 454 TestExpr([], TFpPascalExpressionPartOperatorMulDiv, '*', 2); 455 TestExpr([0], TFpPascalExpressionPartIdentifier, 'x', 0); 456 TestExpr([1], TFpPascalExpressionPartBracketSet, '[', 0); 457 458 CreateExpr('x * [a,b]', True); 459 TestExpr([], TFpPascalExpressionPartOperatorMulDiv, '*', 2); 460 TestExpr([0], TFpPascalExpressionPartIdentifier, 'x', 0); 461 TestExpr([1], TFpPascalExpressionPartBracketSet, '[', 2); 462 TestExpr([1,0], TFpPascalExpressionPartIdentifier, 'a', 0); 463 TestExpr([1,1], TFpPascalExpressionPartIdentifier, 'b', 0); 464 465 CreateExpr('x * [,]', False); 466 CreateExpr('x * [,a]', False); 467 CreateExpr('x * [a,]', False); 468 469 finally 470 CurrentTestExprObj.Free; 471 end; 472 end; 473 474 475 476 initialization 477 478 RegisterTest(TTestPascalParser); 479 end. 480 481