{$MODE OBJFPC} { -*- delphi -*- } {$INCLUDE settings.inc} program test_tokenutils_tokeniser; uses tokenutils, sysutils; procedure Verify(Condition: Boolean; Message: UTF8String); begin if (not Condition) then begin Writeln('FAIL: ', Message); Halt(1); end; end; procedure VerifyTokenTypes(Tokens: TTokenArray; Types: array of TTokenType; Test: UTF8String); var Index: Cardinal; begin Verify(Length(Tokens) = Length(Types), 'unexpected number of tokens in ' + Test + '; wanted ' + IntToStr(Length(Types)) + ' but got ' + IntToStr(Length(Tokens))); for Index := Low(Tokens) to High(Tokens) do begin Verify(Tokens[Index].TokenType = Types[Index], 'wrong type for token ' + IntToStr(Index) + ' in ' + Test); end; end; procedure VerifyIntegerValues(Tokens: TTokenArray; Values: array of Integer; Test: UTF8String); var Index: Cardinal; begin Verify(Length(Tokens) = Length(Values), 'unexpected number of tokens in ' + Test + '; wanted ' + IntToStr(Length(Values)) + ' but got ' + IntToStr(Length(Tokens))); for Index := Low(Tokens) to High(Tokens) do if (Tokens[Index].TokenType = ttInteger) then Verify(Tokens[Index].IntegerValue = Values[Index], 'wrong value for token ' + IntToStr(Index) + ' in ' + Test + ': wanted ' + IntToStr(Values[Index]) + ' but got ' + IntToStr(Tokens[Index].IntegerValue)); end; procedure VerifyStringValues(Tokens: TTokenArray; Values: array of UTF8String; Test: UTF8String); var Index: Cardinal; begin Verify(Length(Tokens) = Length(Values), 'unexpected number of tokens in ' + Test + '; wanted ' + IntToStr(Length(Values)) + ' but got ' + IntToStr(Length(Tokens))); for Index := Low(Tokens) to High(Tokens) do if (Tokens[Index].TokenType = ttString) then Verify(Tokens[Index].StringValue^ = Values[Index], 'wrong value for token ' + IntToStr(Index) + ' in ' + Test + ': wanted ' + Values[Index] + ' but got ' + Tokens[Index].StringValue^); end; var Tokens: TTokenArray; begin Tokens := GetLineTokens('123'); VerifyTokenTypes(Tokens, [ttInteger], 'Test 1'); Verify(Tokens[0].IntegerValue = 123, 'Test 1: check value'); FreeLineTokens(Tokens); Tokens := GetLineTokens('123 456 -789 01 001 010 011 '); VerifyTokenTypes(Tokens, [ttInteger, ttInteger, ttInteger, ttInteger, ttInteger, ttInteger, ttInteger], 'Test 2'); VerifyIntegerValues(Tokens, [123, 456, -789, 1, 1, 10, 11], 'Test 2'); FreeLineTokens(Tokens); Tokens := GetLineTokens('1, max 2'); VerifyTokenTypes(Tokens, [ttInteger, ttComma, ttString, ttInteger], 'Test 3'); VerifyIntegerValues(Tokens, [1, 0, 0, 2], 'Test 3'); VerifyStringValues(Tokens, ['', '', 'max', ''], 'Test 3'); FreeLineTokens(Tokens); Tokens := GetLineTokens(','); VerifyTokenTypes(Tokens, [ttError], 'Test 4'); FreeLineTokens(Tokens); Tokens := GetLineTokens(',,'); VerifyTokenTypes(Tokens, [ttError, ttError], 'Test 5'); FreeLineTokens(Tokens); Tokens := GetLineTokens(' , , -0'); VerifyTokenTypes(Tokens, [ttError, ttError, ttInteger], 'Test 6'); VerifyIntegerValues(Tokens, [-1, -1, 0], 'Test 6'); FreeLineTokens(Tokens); Tokens := GetLineTokens(' , , --0'); VerifyTokenTypes(Tokens, [ttError, ttError, ttError, ttError, ttInteger], 'Test 7'); VerifyIntegerValues(Tokens, [-1, -1, -1, -1, 0], 'Test 7'); FreeLineTokens(Tokens); Tokens := GetLineTokens('2147483630 2147483646 2147483647 2147483648 2147483649 -2147483646 -2147483647 -2147483648 -2147483649'); VerifyTokenTypes(Tokens, [ttInteger, ttInteger, ttInteger, ttError, ttError, ttInteger, ttInteger, ttInteger, ttError], 'Test 8'); VerifyIntegerValues(Tokens, [2147483630, 2147483646, 2147483647, 0, 0, -2147483646, -2147483647, -2147483648, 0], 'Test 8'); FreeLineTokens(Tokens); Tokens := GetLineTokens('from the -10 to all the lands', 'to'); VerifyTokenTypes(Tokens, [ttString, ttString, ttInteger, ttString, ttString], 'Test 9'); VerifyIntegerValues(Tokens, [2, 2, -10, 2, 2], 'Test 9'); VerifyStringValues(Tokens, ['from', 'the', '', 'to', 'all the lands'], 'Test 9'); FreeLineTokens(Tokens); Tokens := GetLineTokens('from 10 to 10 and 10', 'to'); VerifyTokenTypes(Tokens, [ttString, ttInteger, ttString, ttString], 'Test 10'); VerifyIntegerValues(Tokens, [2, 10, 2, 2], 'Test 10'); VerifyStringValues(Tokens, ['from', '-', 'to', '10 and 10'], 'Test 10'); FreeLineTokens(Tokens); Tokens := GetLineTokens('stop,', 'stop'); VerifyTokenTypes(Tokens, [ttString, ttError, ttComma], 'Test 11'); VerifyStringValues(Tokens, ['stop', 'x', 'x'], 'Test 11'); FreeLineTokens(Tokens); Tokens := GetLineTokens('stopstop', 'stop'); VerifyTokenTypes(Tokens, [ttString], 'Test 12'); VerifyStringValues(Tokens, ['stopstop'], 'Test 12'); FreeLineTokens(Tokens); Tokens := GetLineTokens('word word "word word word" word word ""'); VerifyTokenTypes(Tokens, [ttString, ttString, ttString, ttString, ttString, ttString], 'Test 13'); VerifyStringValues(Tokens, ['word', 'word', 'word word word', 'word', 'word', ''], 'Test 13'); FreeLineTokens(Tokens); Tokens := GetLineTokens('word word "'); VerifyTokenTypes(Tokens, [ttString, ttString, ttError, ttString], 'Test 14'); VerifyStringValues(Tokens, ['word', 'word', 'x', '"'], 'Test 14'); FreeLineTokens(Tokens); Tokens := GetLineTokens('word word "words'); VerifyTokenTypes(Tokens, [ttString, ttString, ttError, ttString], 'Test 15'); VerifyStringValues(Tokens, ['word', 'word', 'x', '"words'], 'Test 15'); FreeLineTokens(Tokens); Tokens := GetLineTokens('Topic Bonus: 1 per second from Test1', 'from'); VerifyTokenTypes(Tokens, [ttString, ttString, ttInteger, ttString, ttString, ttString, ttString], 'Test 16'); VerifyIntegerValues(Tokens, [-9, -9, 1, -9, -9, -9, -9], 'Test 16'); VerifyStringValues(Tokens, ['Topic', 'Bonus:', 'x', 'per', 'second', 'from', 'Test1'], 'Test 16'); FreeLineTokens(Tokens); end.