mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-05 09:18:15 +02:00
6207 lines
226 KiB
ObjectPascal
6207 lines
226 KiB
ObjectPascal
{ CLDR collation Algorithm test routines.
|
|
|
|
Copyright (c) 2013-2015 by Inoussa OUEDRAOGO
|
|
|
|
The source code is distributed under the Library GNU
|
|
General Public License with the following modification:
|
|
|
|
- object files and libraries linked into an application may be
|
|
distributed without source code.
|
|
|
|
If you didn't receive a copy of the file COPYING, contact:
|
|
Free Software Foundation
|
|
675 Mass Ave
|
|
Cambridge, MA 02139
|
|
USA
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
}
|
|
|
|
unit cldrtest;
|
|
|
|
{$mode objfpc}{$H+}
|
|
{$typedaddress on}
|
|
{$warn 4056 off} //Conversion between ordinals and pointers is not portable
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils,
|
|
unicodeset, helper, cldrhelper, unicodedata, cldrtxt, cldrxml;
|
|
|
|
function ToAnsiChars(const AValue : array of TUnicodeCodePoint) : string;
|
|
function DumpSequenceAnsi(const ASequence : TOrderedCharacters) : string;
|
|
function DumpWeigth(const AItem : TUCA_WeightRec) : string;overload;
|
|
function DumpWeigth(const AItems : array of TUCA_WeightRec) : string;overload;
|
|
function DumpLine(ALine : TUCA_LineRec) : string;
|
|
function DumpLines(ALines : TUCA_LineRecArray) : string;
|
|
function CodePointToArray(const ACodePoint : TUnicodeCodePoint) : TUnicodeCodePointArray;overload;
|
|
function CodePointToArray(const ACodePoints : array of TUnicodeCodePoint) : TUnicodeCodePointArray;overload;
|
|
function ToWeight(const APrimary, ASecondary, ATertiary : Cardinal) : TUCA_WeightRecArray;overload;
|
|
function ToWeight(const AWeigths : array of Cardinal) : TUCA_WeightRecArray;overload;
|
|
|
|
procedure exec_tests(const APropagateException : Boolean = True);
|
|
|
|
procedure test1();
|
|
procedure test2();
|
|
procedure test3();
|
|
procedure test4();
|
|
procedure test5();
|
|
procedure test6();
|
|
procedure test7();
|
|
procedure test8();
|
|
procedure test9();
|
|
procedure test10();
|
|
procedure test11();
|
|
procedure test12();
|
|
procedure test13();
|
|
procedure test14();
|
|
procedure test15();
|
|
procedure test16a();
|
|
procedure test16b();
|
|
procedure test16c();
|
|
procedure test16d();
|
|
procedure test16e();
|
|
procedure test17a();
|
|
procedure test17b();
|
|
procedure test17c();
|
|
|
|
procedure test_parser_1();
|
|
procedure test_parser_2();
|
|
procedure test_parser_3();
|
|
procedure test_parser_4();
|
|
procedure test_parser_5();
|
|
procedure test_parser_6();
|
|
procedure test_parser_7();
|
|
procedure test_parser_8();
|
|
procedure test_parser_9();
|
|
procedure test_parser_abreviating_1();
|
|
procedure test_parser_abreviating_2();
|
|
procedure test_parser_abreviating_3();
|
|
procedure test_parser_abreviating_4();
|
|
procedure test_parser_abreviating_5();
|
|
procedure test_parser_abreviating_6();
|
|
procedure test_parser_abreviating_7();
|
|
procedure test_parser_abreviating_8();
|
|
procedure test_parser_abreviating_9();
|
|
procedure test_parser_abreviating_10();
|
|
procedure test_parser_contraction_1();
|
|
procedure test_parser_contraction_2();
|
|
procedure test_parser_expansion_1();
|
|
procedure test_parser_special_char_1();
|
|
procedure test_parser_special_char_2();
|
|
procedure test_parser_special_char_3();
|
|
procedure test_parser_special_char_4();
|
|
procedure test_parser_special_char_5();
|
|
procedure test_parser_special_char_6();
|
|
procedure test_parser_special_char_7();
|
|
procedure test_parser_special_char_8();
|
|
procedure test_parser_special_char_9();
|
|
procedure test_parser_skip_comment_1();
|
|
procedure test_parser_skip_comment_2();
|
|
procedure test_parser_skip_comment_3();
|
|
procedure test_parser_quoted_string_1();
|
|
procedure test_parser_quoted_string_2();
|
|
procedure test_parser_quoted_string_3();
|
|
procedure test_parser_quoted_string_4();
|
|
procedure test_parser_quoted_string_5();
|
|
procedure test_parser_quoted_string_6();
|
|
procedure test_parser_quoted_string_7();
|
|
procedure test_parser_quoted_string_8();
|
|
procedure test_parser_contexte_before_1();
|
|
procedure test_parser_contexte_before_2();
|
|
procedure test_parser_contexte_before_3();
|
|
procedure test_parser_contexte_before_4();
|
|
procedure test_parser_placement_before_1();
|
|
procedure test_parser_placement_before_2();
|
|
procedure test_parser_placement_before_3();
|
|
procedure test_parser_multi_unit_statement_line_1();
|
|
procedure test_parser_multi_unit_statement_line_2();
|
|
procedure test_parser_multi_unit_statement_line_3();
|
|
procedure test_parser_multi_statement_line_1();
|
|
procedure test_parser_multi_statement_line_2();
|
|
procedure test_parser_multi_statement_line_3();
|
|
procedure test_parser_multi_statement_line_4();
|
|
|
|
procedure test_parser_multi_line_statements_1();
|
|
|
|
procedure test_parser_setting_1();
|
|
procedure test_parser_setting_2();
|
|
procedure test_parser_setting_3();
|
|
procedure test_parser_setting_4();
|
|
procedure test_parser_setting_5();
|
|
procedure test_parser_setting_6();
|
|
procedure test_parser_setting_7();
|
|
procedure test_parser_setting_8();
|
|
procedure test_parser_setting_multi_statement_1();
|
|
procedure test_parser_setting_multi_statement_2();
|
|
procedure test_parser_setting_multi_statement_3();
|
|
procedure test_parser_setting_multi_statement_4();
|
|
procedure test_parser_setting_unicodeset_1();
|
|
procedure test_parser_setting_unicodeset_2();
|
|
procedure test_parser_setting_unicodeset_3();
|
|
procedure test_parser_setting_unicodeset_4();
|
|
|
|
procedure test_collation_parser_HeaderParsing();
|
|
procedure test_collation_parser_HeaderParsing_2();
|
|
procedure test_collation_parser_FullParsing();
|
|
procedure test_collation_parser_FullParsing_2();
|
|
procedure test_collation_parser_complete_rules();
|
|
procedure test_collation_parser_complete_rules_2();
|
|
|
|
procedure test_unicode_set_1();
|
|
procedure test_unicode_set_2();
|
|
procedure test_unicode_set_3();
|
|
|
|
const
|
|
UNICODE_LINE_BREAK = #10;
|
|
|
|
implementation
|
|
uses
|
|
typinfo;
|
|
|
|
|
|
function ComputeWeigths(
|
|
const AData : PReorderUnit;
|
|
const ADataLen : Integer;
|
|
const ADataWeigths : TUCA_LineRecArray;
|
|
out AResult : TUCA_LineRecArray
|
|
) : Integer;
|
|
begin
|
|
Result := cldrhelper.ComputeWeigths(AData,ADataLen,ADataWeigths,[],AResult);
|
|
end;
|
|
|
|
function inner_do_exec_test(
|
|
ATest : TProcedure;
|
|
const APropagateException : Boolean
|
|
) : Boolean;
|
|
begin
|
|
Result := False;
|
|
if APropagateException then begin
|
|
ATest();
|
|
Result := True;
|
|
end else begin
|
|
try
|
|
ATest();
|
|
Result := True;
|
|
except
|
|
on e : Exception do begin
|
|
writeln('Failure:');
|
|
writeln(e.Message);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure exec_utils_tests(
|
|
const APropagateException : Boolean;
|
|
out ATotal,
|
|
AErrors : Integer
|
|
);
|
|
|
|
procedure do_exec_test(
|
|
ATest : TProcedure;
|
|
const APropagateException : Boolean
|
|
);
|
|
begin
|
|
ATotal := ATotal+1;
|
|
if not inner_do_exec_test(ATest,APropagateException) then
|
|
AErrors := AErrors+1;
|
|
end;
|
|
|
|
begin
|
|
ATotal := 0;
|
|
AErrors := 0;
|
|
WriteLn;WriteLn;WriteLn;WriteLn;
|
|
WriteLn('UTILITIES TESTS - START');
|
|
WriteLn('***************************** TEST UNICODESET 1 ******************');
|
|
do_exec_test(@test_unicode_set_1,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST UNICODESET 2 ******************');
|
|
do_exec_test(@test_unicode_set_2,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST UNICODESET 3 ******************');
|
|
do_exec_test(@test_unicode_set_3,APropagateException);
|
|
WriteLn;
|
|
WriteLn('UTILITIES TESTS - START');
|
|
WriteLn;
|
|
WriteLn;
|
|
end;
|
|
|
|
procedure exec_parser_tests(
|
|
const APropagateException : Boolean;
|
|
out ATotal,
|
|
AErrors : Integer
|
|
);
|
|
|
|
procedure do_exec_test(
|
|
ATest : TProcedure;
|
|
const APropagateException : Boolean
|
|
);
|
|
begin
|
|
ATotal := ATotal+1;
|
|
if not inner_do_exec_test(ATest,APropagateException) then
|
|
AErrors := AErrors+1;
|
|
end;
|
|
|
|
begin
|
|
ATotal := 0;
|
|
AErrors := 0;
|
|
WriteLn;WriteLn;WriteLn;WriteLn;
|
|
WriteLn('PARSER TESTS');
|
|
WriteLn('***************************** TEST PARSER 1 ******************');
|
|
do_exec_test(@test_parser_1,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST PARSER 2 ******************');
|
|
do_exec_test(@test_parser_2,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST PARSER 3 ******************');
|
|
do_exec_test(@test_parser_3,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST PARSER 4 ******************');
|
|
do_exec_test(@test_parser_4,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST PARSER 5 ******************');
|
|
do_exec_test(@test_parser_5,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST PARSER 6 ******************');
|
|
do_exec_test(@test_parser_6,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST PARSER 7 ******************');
|
|
do_exec_test(@test_parser_7,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST PARSER 8 ******************');
|
|
do_exec_test(@test_parser_7,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST PARSER 9 ******************');
|
|
do_exec_test(@test_parser_9,APropagateException);
|
|
WriteLn;
|
|
WriteLn;
|
|
WriteLn('***************************** TEST ABREVIATING 1 ******************');
|
|
do_exec_test(@test_parser_abreviating_1,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST ABREVIATING 2 ******************');
|
|
do_exec_test(@test_parser_abreviating_2,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST ABREVIATING 3 ******************');
|
|
do_exec_test(@test_parser_abreviating_3,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST ABREVIATING 4 ******************');
|
|
do_exec_test(@test_parser_abreviating_4,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST ABREVIATING 5 ******************');
|
|
do_exec_test(@test_parser_abreviating_5,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST ABREVIATING 6 ******************');
|
|
do_exec_test(@test_parser_abreviating_6,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST ABREVIATING 7 ******************');
|
|
do_exec_test(@test_parser_abreviating_7,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST ABREVIATING 8 ******************');
|
|
do_exec_test(@test_parser_abreviating_8,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST ABREVIATING 9 ******************');
|
|
do_exec_test(@test_parser_abreviating_9,APropagateException);
|
|
WriteLn;
|
|
WriteLn;
|
|
WriteLn('***************************** TEST ABREVIATING 10 ******************');
|
|
do_exec_test(@test_parser_abreviating_10,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST CONTRACTION 1 ******************');
|
|
do_exec_test(@test_parser_contraction_1,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST CONTRACTION 2 ******************');
|
|
do_exec_test(@test_parser_contraction_2,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST EXPANSION 1 ******************');
|
|
do_exec_test(@test_parser_expansion_1,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST SPECIAL CHAR 1 ******************');
|
|
do_exec_test(@test_parser_special_char_1,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST SPECIAL CHAR 2 ******************');
|
|
do_exec_test(@test_parser_special_char_2,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST SPECIAL CHAR 3 ******************');
|
|
do_exec_test(@test_parser_special_char_3,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST SPECIAL CHAR 4 ******************');
|
|
do_exec_test(@test_parser_special_char_4,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST SPECIAL CHAR 5 ******************');
|
|
do_exec_test(@test_parser_special_char_5,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST SPECIAL CHAR 6 ******************');
|
|
do_exec_test(@test_parser_special_char_6,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST SPECIAL CHAR 7 ******************');
|
|
do_exec_test(@test_parser_special_char_7,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST SPECIAL CHAR 8 ******************');
|
|
do_exec_test(@test_parser_special_char_8,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST SPECIAL CHAR 9 ******************');
|
|
do_exec_test(@test_parser_special_char_9,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST SKIP COMMENT 1 ******************');
|
|
do_exec_test(@test_parser_skip_comment_1,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST SKIP COMMENT 2 ******************');
|
|
do_exec_test(@test_parser_skip_comment_2,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST SKIP COMMENT 3 ******************');
|
|
do_exec_test(@test_parser_skip_comment_3,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST QUOTED STRING 1 ******************');
|
|
do_exec_test(@test_parser_quoted_string_1,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST QUOTED STRING 2 ******************');
|
|
do_exec_test(@test_parser_quoted_string_2,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST QUOTED STRING 3 ******************');
|
|
do_exec_test(@test_parser_quoted_string_3,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST QUOTED STRING 4 ******************');
|
|
do_exec_test(@test_parser_quoted_string_4,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST QUOTED STRING 5 ******************');
|
|
do_exec_test(@test_parser_quoted_string_5,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST QUOTED STRING 6 ******************');
|
|
do_exec_test(@test_parser_quoted_string_6,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST QUOTED STRING 7 ******************');
|
|
do_exec_test(@test_parser_quoted_string_7,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST QUOTED STRING 8 ******************');
|
|
do_exec_test(@test_parser_quoted_string_8,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST CONTEXT BEFORE 1 ******************');
|
|
do_exec_test(@test_parser_contexte_before_1,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST CONTEXT BEFORE 2 ******************');
|
|
do_exec_test(@test_parser_contexte_before_2,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST CONTEXT BEFORE 3 ******************');
|
|
do_exec_test(@test_parser_contexte_before_3,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST CONTEXT BEFORE 4 ******************');
|
|
do_exec_test(@test_parser_contexte_before_4,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST PLACEMENT BEFORE 1 ******************');
|
|
do_exec_test(@test_parser_placement_before_1,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST PLACEMENT BEFORE 2 ******************');
|
|
do_exec_test(@test_parser_placement_before_2,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST PLACEMENT BEFORE 3 ******************');
|
|
do_exec_test(@test_parser_placement_before_3,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST MULTI UNIT STATEMENT LINE 1 ******************');
|
|
do_exec_test(@test_parser_multi_unit_statement_line_1,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST MULTI UNIT STATEMENT LINE 2 ******************');
|
|
do_exec_test(@test_parser_multi_unit_statement_line_2,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST MULTI UNIT STATEMENT LINE 3 ******************');
|
|
do_exec_test(@test_parser_multi_unit_statement_line_3,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST MULTI STATEMENT LINE 1 ******************');
|
|
do_exec_test(@test_parser_multi_statement_line_1,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST MULTI STATEMENT LINE 2 ******************');
|
|
do_exec_test(@test_parser_multi_statement_line_2,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST MULTI STATEMENT LINE 3 ******************');
|
|
do_exec_test(@test_parser_multi_statement_line_3,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST MULTI STATEMENT LINE 4 ******************');
|
|
do_exec_test(@test_parser_multi_statement_line_4,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST MULTI LINE STATEMENTS 1 ******************');
|
|
do_exec_test(@test_parser_multi_line_statements_1,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST SETTING STATEMENT 1 ******************');
|
|
do_exec_test(@test_parser_setting_1,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST SETTING STATEMENT 2 ******************');
|
|
do_exec_test(@test_parser_setting_2,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST SETTING STATEMENT 3 ******************');
|
|
do_exec_test(@test_parser_setting_3,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST SETTING STATEMENT 4 ******************');
|
|
do_exec_test(@test_parser_setting_4,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST SETTING STATEMENT 5 ******************');
|
|
do_exec_test(@test_parser_setting_5,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST SETTING STATEMENT 6 ******************');
|
|
do_exec_test(@test_parser_setting_6,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST SETTING STATEMENT 7 ******************');
|
|
do_exec_test(@test_parser_setting_7,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST SETTING STATEMENT 8 ******************');
|
|
do_exec_test(@test_parser_setting_8,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST SETTING MULTI STATEMENT 1 ******************');
|
|
do_exec_test(@test_parser_setting_multi_statement_1,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST SETTING MULTI STATEMENT 2 ******************');
|
|
do_exec_test(@test_parser_setting_multi_statement_2,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST SETTING MULTI STATEMENT 3 ******************');
|
|
do_exec_test(@test_parser_setting_multi_statement_3,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST SETTING MULTI STATEMENT 4 ******************');
|
|
do_exec_test(@test_parser_setting_multi_statement_4,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST SETTING UNICODE SET 1 ******************');
|
|
do_exec_test(@test_parser_setting_unicodeset_1,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST SETTING UNICODE SET 2 ******************');
|
|
do_exec_test(@test_parser_setting_unicodeset_2,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST SETTING UNICODE SET 3 ******************');
|
|
do_exec_test(@test_parser_setting_unicodeset_3,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST SETTING UNICODE SET 4 ******************');
|
|
do_exec_test(@test_parser_setting_unicodeset_4,APropagateException);
|
|
WriteLn;
|
|
|
|
WriteLn;
|
|
WriteLn('***************************** TEST REPOSITORY 1 ******************');
|
|
do_exec_test(@test_collation_parser_HeaderParsing,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST REPOSITORY 2 ******************');
|
|
do_exec_test(@test_collation_parser_FullParsing,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST REPOSITORY 3 ******************');
|
|
do_exec_test(@test_collation_parser_complete_rules,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST REPOSITORY 4 ******************');
|
|
do_exec_test(@test_collation_parser_HeaderParsing_2,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST REPOSITORY 5 ******************');
|
|
do_exec_test(@test_collation_parser_FullParsing_2,APropagateException);
|
|
WriteLn;
|
|
WriteLn('***************************** TEST REPOSITORY 6 ******************');
|
|
do_exec_test(@test_collation_parser_complete_rules_2,APropagateException);
|
|
WriteLn;
|
|
|
|
WriteLn;
|
|
WriteLn;
|
|
|
|
WriteLn('END PARSER TESTS');
|
|
WriteLn('*******************************************************');
|
|
end;
|
|
|
|
procedure exec_basic_tests(
|
|
const APropagateException : Boolean;
|
|
out ATotal,
|
|
AErrors : Integer
|
|
);
|
|
|
|
procedure do_exec_test(
|
|
ATest : TProcedure;
|
|
const APropagateException : Boolean
|
|
);
|
|
begin
|
|
ATotal := ATotal+1;
|
|
if not inner_do_exec_test(ATest,APropagateException) then
|
|
AErrors := AErrors+1;
|
|
end;
|
|
|
|
begin
|
|
ATotal := 0;
|
|
AErrors := 0;
|
|
|
|
WriteLn('***************************** TEST 1 ******************');
|
|
do_exec_test(@test1,APropagateException);
|
|
WriteLn('***************************** TEST 2 ******************');
|
|
do_exec_test(@test2,APropagateException);
|
|
WriteLn('***************************** TEST 3 ******************');
|
|
do_exec_test(@test3,APropagateException);
|
|
WriteLn('***************************** TEST 4 ******************');
|
|
do_exec_test(@test4,APropagateException);
|
|
WriteLn('***************************** TEST 5 ******************');
|
|
do_exec_test(@test5,APropagateException);
|
|
WriteLn('***************************** TEST 6 ******************');
|
|
do_exec_test(@test6,APropagateException);
|
|
WriteLn('***************************** TEST 7 ******************');
|
|
do_exec_test(@test7,APropagateException);
|
|
WriteLn('***************************** TEST 8 ******************');
|
|
do_exec_test(@test8,APropagateException);
|
|
WriteLn('***************************** TEST 9 ******************');
|
|
do_exec_test(@test9,APropagateException);
|
|
WriteLn('***************************** TEST 10 ******************');
|
|
do_exec_test(@test10,APropagateException);
|
|
WriteLn('***************************** TEST 11 ******************');
|
|
do_exec_test(@test11,APropagateException);
|
|
WriteLn('***************************** TEST 12 ******************');
|
|
do_exec_test(@test12,APropagateException);
|
|
WriteLn('***************************** TEST 13 ******************');
|
|
do_exec_test(@test13,APropagateException);
|
|
WriteLn('***************************** TEST 14 ******************');
|
|
do_exec_test(@test14,APropagateException);
|
|
WriteLn('***************************** TEST 15 ******************');
|
|
do_exec_test(@test15,APropagateException);
|
|
WriteLn('***************************** TEST 16 A ******************');
|
|
do_exec_test(@test16a,APropagateException);
|
|
WriteLn('***************************** TEST 16 B ******************');
|
|
do_exec_test(@test16b,APropagateException);
|
|
WriteLn('***************************** TEST 16 C ******************');
|
|
do_exec_test(@test16c,APropagateException);
|
|
WriteLn('***************************** TEST 16 D ******************');
|
|
do_exec_test(@test16d,APropagateException);
|
|
WriteLn('***************************** TEST 16 E ******************');
|
|
do_exec_test(@test16e,APropagateException);
|
|
WriteLn('***************************** TEST 17 A ******************');
|
|
do_exec_test(@test17a,APropagateException);
|
|
WriteLn('***************************** TEST 17 B ******************');
|
|
do_exec_test(@test17b,APropagateException);
|
|
WriteLn('***************************** TEST 17 C ******************');
|
|
do_exec_test(@test17c,APropagateException);
|
|
end;
|
|
|
|
procedure exec_tests(const APropagateException : Boolean);
|
|
var
|
|
total, errors, t, e : Integer;
|
|
begin
|
|
total := 0;
|
|
errors := 0;
|
|
|
|
exec_utils_tests(APropagateException,t,e);
|
|
total := total+t;
|
|
errors := errors+e;
|
|
|
|
exec_parser_tests(APropagateException,t,e);
|
|
total := total+t;
|
|
errors := errors+e;
|
|
|
|
exec_basic_tests(APropagateException,t,e);
|
|
total := total+t;
|
|
errors := errors+e;
|
|
|
|
WriteLn('**** END TESTS',sLineBreak,sLineBreak);
|
|
|
|
WriteLn('------------------ RESULTS => START ------------------------------');
|
|
WriteLn(Format(' %d Total tests',[total]));
|
|
WriteLn(Format(' %d tests failed',[errors]));
|
|
|
|
WriteLn('------------------ RESULTS => END ------------------------------');
|
|
end;
|
|
|
|
function ToAnsiChars(const AValue : array of TUnicodeCodePoint) : string;
|
|
var
|
|
i : Integer;
|
|
s : string;
|
|
begin
|
|
Result := '';
|
|
for i := Low(AValue) to High(AValue) do begin
|
|
if (AValue[i] <= 127) then
|
|
Result := Result + AnsiChar(AValue[i])
|
|
else
|
|
begin
|
|
s := Format('%x',[AValue[i]]);
|
|
if (Length(s) < 4) then
|
|
s := StringOfChar('0',4-Length(s)) + s;
|
|
Result := Result + '$' + s;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function DumpSequenceAnsi(const ASequence : TOrderedCharacters) : string;
|
|
var
|
|
i : Integer;
|
|
s : string;
|
|
p : PReorderUnit;
|
|
begin
|
|
s := '';
|
|
if (ASequence.ActualLength < 1) then
|
|
exit;
|
|
p := @ASequence.Data[0];
|
|
i := 0;
|
|
while (i < ASequence.ActualLength) do begin
|
|
if (p^.WeigthKind <> TReorderWeigthKind.Deletion) then
|
|
Break;
|
|
WriteStr(s,s, ' ',ToAnsiChars(p^.Characters),'- ');
|
|
Inc(p);
|
|
Inc(i);
|
|
end;
|
|
|
|
if (i < ASequence.ActualLength) then begin
|
|
s := s + ' ' + ToAnsiChars(p^.Characters) + ' ';
|
|
Inc(i);
|
|
Inc(p);
|
|
for i := i to ASequence.ActualLength - 1 do begin
|
|
//WriteStr(s,s,AnsiChar(p^.Characters[0]),' <',(1+Ord(p^.WeigthKind)),' ');
|
|
if p^.IsVirtual() then
|
|
WriteStr(s,s,' [',GetEnumName(TypeInfo(TReorderLogicalReset),Ord(p^.VirtualPosition)),'] ')
|
|
else
|
|
WriteStr(s,s,'<',(1+Ord(p^.WeigthKind)),' ',ToAnsiChars(p^.Characters));
|
|
if (Length(p^.Context) > 0) then
|
|
WriteStr(s,s,'[',ToAnsiChars(p^.Context),']');
|
|
WriteStr(s,s,' ');
|
|
Inc(p);
|
|
end;
|
|
end;
|
|
Result := s;
|
|
end;
|
|
|
|
function DumpWeigth(const AItem : TUCA_WeightRec) : string;overload;
|
|
var
|
|
r : string;
|
|
begin
|
|
r := '[';
|
|
if AItem.Variable then
|
|
r := r + '*'
|
|
else
|
|
r := r + '.';
|
|
r := r + Format('%x.%x.%x',[AItem.Weights[0],AItem.Weights[1],AItem.Weights[2]]);
|
|
r := r + ']';
|
|
Result := r;
|
|
end;
|
|
|
|
function DumpWeigth(const AItems : array of TUCA_WeightRec) : string;
|
|
var
|
|
r : string;
|
|
i : Integer;
|
|
begin
|
|
r := '';
|
|
for i := 0 to Length(AItems) - 1 do
|
|
r := r + ' ' +DumpWeigth(AItems[i]);
|
|
Result := Trim(r);
|
|
end;
|
|
|
|
function DumpKey(const AItem : TUCASortKey) : string;
|
|
var
|
|
i : Integer;
|
|
r : string;
|
|
begin
|
|
r := '';
|
|
for i := Low(AItem) to High(AItem) do
|
|
r := Trim(r) + ' ' + Format('%4x',[AItem[i]]);
|
|
Result := r;
|
|
end;
|
|
|
|
function DumpLine(ALine : TUCA_LineRec) : string;
|
|
var
|
|
i : Integer;
|
|
r : string;
|
|
ctxItem : TUCA_LineContextItemRec;
|
|
begin
|
|
r := '';
|
|
if ALine.HasContext() then begin
|
|
r := r + '*';
|
|
for i := 0 to Length(ALine.Context.Data) - 1 do begin
|
|
ctxItem := ALine.Context.Data[i];
|
|
r := r + sLineBreak +
|
|
' ' + ToAnsiChars(ctxItem.CodePoints) + ' => ' + DumpWeigth(ctxItem.Weights);
|
|
end;
|
|
r := r + sLineBreak + ' ';
|
|
end;
|
|
if (Length(ALine.Weights) = 0) then begin
|
|
r := r + '[]';
|
|
end else begin
|
|
for i := Low(ALine.Weights) to High(ALine.Weights) do
|
|
r := r + DumpWeigth(ALine.Weights[i]);
|
|
end;
|
|
Result := Format('%s %s',[ToAnsiChars(ALine.CodePoints),r]);
|
|
end;
|
|
|
|
function DumpLines(ALines : TUCA_LineRecArray) : string;
|
|
var
|
|
i : Integer;
|
|
r : string;
|
|
begin
|
|
r := '';
|
|
for i := Low(ALines) to High(ALines) do
|
|
r := r + ' ' + DumpLine(ALines[i]) + sLineBreak;
|
|
Result := r;
|
|
end;
|
|
|
|
function CodePointToArray(const ACodePoint : TUnicodeCodePoint) : TUnicodeCodePointArray;overload;
|
|
begin
|
|
SetLength(Result,1);
|
|
Result[0] := ACodePoint;
|
|
end;
|
|
|
|
function CodePointToArray(const ACodePoints : array of TUnicodeCodePoint) : TUnicodeCodePointArray;overload;
|
|
var
|
|
i : Integer;
|
|
begin
|
|
SetLength(Result,Length(ACodePoints));
|
|
for i := 0 to length(ACodePoints) - 1 do
|
|
Result[i] := ACodePoints[i];
|
|
end;
|
|
|
|
function ToWeight(const APrimary, ASecondary, ATertiary : Cardinal) : TUCA_WeightRecArray;overload;
|
|
begin
|
|
SetLength(Result,1);
|
|
Result[0].Weights[0] := APrimary;
|
|
Result[0].Weights[1] := ASecondary;
|
|
Result[0].Weights[2] := ATertiary;
|
|
Result[0].Weights[3] := 0;
|
|
end;
|
|
|
|
function ToWeight(const AWeigths : array of Cardinal) : TUCA_WeightRecArray;overload;
|
|
var
|
|
i, k, c : Integer;
|
|
begin
|
|
c := Length(AWeigths);
|
|
SetLength(Result,(c div 3));
|
|
k := 0;
|
|
for i := 0 to (c div 3) - 1 do begin
|
|
Result[i].Weights[0] := AWeigths[k+0];
|
|
Result[i].Weights[1] := AWeigths[k+1];
|
|
Result[i].Weights[2] := AWeigths[k+2];
|
|
Result[i].Weights[3] := 0;
|
|
k := k + 3;
|
|
end;
|
|
end;
|
|
|
|
procedure constructPropBook(
|
|
var ABook : unicodedata.TUCA_DataBook;
|
|
const AFirstTable : TucaBmpFirstTable;
|
|
const ASecondTable : TucaBmpSecondTable;
|
|
const AOFirstTable : TucaOBmpFirstTable;
|
|
const AOSecondTable : TucaOBmpSecondTable;
|
|
const AInitDataBook : helper.TUCA_DataBook;
|
|
const AInitPropBook : helper.PUCA_PropBook
|
|
);
|
|
var
|
|
c, i, k, ci : Integer;
|
|
begin
|
|
c := Length(AFirstTable);
|
|
if (c > 0) then begin
|
|
ABook.BMP_Table1 := AllocMem(c);
|
|
Move(AFirstTable[0],ABook.BMP_Table1^,c);
|
|
end;
|
|
c := Length(ASecondTable);
|
|
if (c > 0) then begin
|
|
ABook.BMP_Table2 := AllocMem(c*SizeOf(UInt24)*256);
|
|
for i := 0 to c - 1 do begin
|
|
for k := 0 to 255 do
|
|
ABook.BMP_Table2[(i*256)+k] := ASecondTable[i][k];
|
|
end;
|
|
end;
|
|
|
|
c := Length(AOFirstTable);
|
|
if (c > 0) then begin
|
|
ABook.OBMP_Table1 := AllocMem(c*SizeOf(Word));
|
|
Move(AOFirstTable[0],ABook.OBMP_Table1^,(c*SizeOf(Word)));
|
|
end;
|
|
c := Length(AOSecondTable);
|
|
if (c > 0) then begin
|
|
ci := Length(AOSecondTable[0]);
|
|
ABook.OBMP_Table2 := AllocMem(c*SizeOf(UInt24)*ci);
|
|
for i := 0 to c - 1 do begin
|
|
for k := 0 to ci - 1 do
|
|
ABook.OBMP_Table2[(i*ci)+k] := AOSecondTable[i][k];
|
|
end;
|
|
end;
|
|
|
|
StringToByteArray(AInitDataBook.Version,PByte(@ABook.Version[1]),Length(ABook.Version));
|
|
ABook.VariableWeight := unicodedata.TUCA_VariableKind(Ord(AInitDataBook.VariableWeight));
|
|
ABook.Backwards := AInitDataBook.Backwards;
|
|
ABook.PropCount := AInitPropBook^.ItemSize;
|
|
ABook.Props := Pointer(AInitPropBook^.Items);
|
|
ABook.VariableLowLimit := AInitPropBook^.VariableLowLimit;
|
|
ABook.VariableHighLimit := AInitPropBook^.VariableHighLimit;
|
|
end;
|
|
|
|
procedure ConstructUnicodeBook(
|
|
const AWeitghs : TUCA_LineRecArray;
|
|
const AVersion : string;
|
|
const ACollationName : string;
|
|
const ABase : unicodedata.PUCA_DataBook;
|
|
var AUnicodeBook : unicodedata.TUCA_DataBook
|
|
);
|
|
var
|
|
dataBook : helper.TUCA_DataBook;
|
|
propBook : helper.PUCA_PropBook;
|
|
firstTable : TucaBmpFirstTable;
|
|
secondTable : TucaBmpSecondTable;
|
|
ofirstTable : TucaOBmpFirstTable;
|
|
osecondTable : TucaOBmpSecondTable;
|
|
i : Integer;
|
|
begin
|
|
FillByte(dataBook,SizeOf(dataBook),0);
|
|
dataBook.Version := AVersion;
|
|
SetLength(dataBook.Lines,Length(AWeitghs));
|
|
for i := 0 to Length(AWeitghs)-1 do begin
|
|
dataBook.Lines[i] := AWeitghs[i];
|
|
dataBook.Lines[i].Stored := True;
|
|
end;
|
|
MakeUCA_Props(@dataBook,propBook);
|
|
FillChar(firstTable,SizeOf(firstTable),0);
|
|
secondTable := nil;
|
|
FillChar(ofirstTable,SizeOf(ofirstTable),0);
|
|
osecondTable := nil;
|
|
MakeUCA_BmpTables(firstTable,secondTable,propBook);
|
|
MakeUCA_OBmpTables(ofirstTable,osecondTable,propBook);
|
|
FillByte(AUnicodeBook,SizeOf(AUnicodeBook),0);
|
|
constructPropBook(
|
|
AUnicodeBook,firstTable,secondTable,ofirstTable,osecondTable,
|
|
dataBook,propBook
|
|
);
|
|
StringToByteArray(ACollationName,PByte(@AUnicodeBook.CollationName[1]),Length(AUnicodeBook.CollationName));
|
|
AUnicodeBook.Base := ABase;
|
|
end;
|
|
|
|
procedure CheckEqual(A,B : UnicodeString; ACollation : unicodedata.PUCA_DataBook);
|
|
var
|
|
keyA, keyB : TUCASortKey;
|
|
s : string;
|
|
begin
|
|
keyA := ComputeSortKey(A,ACollation);
|
|
keyB := ComputeSortKey(B,ACollation);
|
|
if (CompareSortKey(keyA,keyB) <> 0) then begin
|
|
s := Format(' KeyA=%s%s KeyB=%s',[DumpKey(keyA),sLineBreak,DumpKey(keyB)]);
|
|
s := Format('"%s" <>= "%s" %s%s',[A,B,sLineBreak,s]);
|
|
raise Exception.Create(s);
|
|
end;
|
|
end;
|
|
|
|
procedure CheckNotEqual(A,B : UnicodeString; ACollation : unicodedata.PUCA_DataBook);
|
|
var
|
|
keyA, keyB : TUCASortKey;
|
|
s : string;
|
|
begin
|
|
keyA := ComputeSortKey(A,ACollation);
|
|
keyB := ComputeSortKey(B,ACollation);
|
|
if (CompareSortKey(keyA,keyB) = 0) then begin
|
|
s := Format(' KeyA=%s%s KeyB=%s',[DumpKey(keyA),sLineBreak,DumpKey(keyB)]);
|
|
s := Format('"%s" = "%s" %s%s',[A,B,sLineBreak,s]);
|
|
raise Exception.Create(s);
|
|
end;
|
|
end;
|
|
|
|
procedure CheckInf(A,B : UnicodeString; ACollation : unicodedata.PUCA_DataBook);
|
|
var
|
|
keyA, keyB : TUCASortKey;
|
|
s : string;
|
|
begin
|
|
keyA := ComputeSortKey(A,ACollation);
|
|
keyB := ComputeSortKey(B,ACollation);
|
|
if (CompareSortKey(keyA,keyB) >= 0) then begin
|
|
s := Format(' KeyA=%s%s KeyB=%s',[DumpKey(keyA),sLineBreak,DumpKey(keyB)]);
|
|
s := Format('"%s" >= "%s" %s%s',[A,B,sLineBreak,s])+sLineBreak;
|
|
raise Exception.Create(s);
|
|
end;
|
|
end;
|
|
|
|
procedure CheckInf(AStrings : array of UnicodeString; ACollation : unicodedata.PUCA_DataBook);
|
|
var
|
|
c, i : Integer;
|
|
keyA, keyB : TUCASortKey;
|
|
s : string;
|
|
begin
|
|
c := Length(AStrings);
|
|
if (c < 2) then
|
|
exit;
|
|
keyA := ComputeSortKey(AStrings[0],ACollation);
|
|
for i := 1 to c - 1 do begin
|
|
keyB := ComputeSortKey(AStrings[i],ACollation);
|
|
if (CompareSortKey(keyA,keyB) >= 0) then begin
|
|
s := Format(' KeyA=%s%s KeyB=%s',[DumpKey(keyA),sLineBreak,DumpKey(keyB)]);
|
|
s := Format('"%s" >= "%s" %s%s',[AStrings[i-1],AStrings[i],sLineBreak,s]);
|
|
raise Exception.Create(s);
|
|
end;
|
|
keyA := keyB;
|
|
end;
|
|
end;
|
|
|
|
procedure test1_prepareWeigth(var AData : TUCA_LineRecArray);
|
|
var
|
|
p : PUCA_LineRec;
|
|
begin
|
|
SetLength(AData,12);
|
|
p := @AData[Low(AData)];
|
|
p^.CodePoints := CodePointToArray(Ord('a'));
|
|
p^.Weights := ToWeight($15EF,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('b'));
|
|
p^.Weights := ToWeight($1605,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('c'));
|
|
p^.Weights := ToWeight($161D,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('d'));
|
|
p^.Weights := ToWeight($1631,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('e'));
|
|
p^.Weights := ToWeight($164C,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('f'));
|
|
p^.Weights := ToWeight($1684,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('g'));
|
|
p^.Weights := ToWeight($1691,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('h'));
|
|
p^.Weights := ToWeight($16B4,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('i'));
|
|
p^.Weights := ToWeight($16CD,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('j'));
|
|
p^.Weights := ToWeight($16E6,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('k'));
|
|
p^.Weights := ToWeight($16FF,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('l'));
|
|
p^.Weights := ToWeight($1711,$0020,$0002);
|
|
end;
|
|
|
|
procedure test1();
|
|
var
|
|
sequence : TOrderedCharacters;
|
|
statement : TReorderSequence;
|
|
wfirst, wresult : TUCA_LineRecArray;
|
|
i : Integer;
|
|
unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
|
|
begin
|
|
statement.Clear();
|
|
test1_prepareWeigth(wfirst);
|
|
sequence := TOrderedCharacters.Create();
|
|
sequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
|
|
sequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
|
|
sequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,3));
|
|
sequence.Append(TReorderUnit.From(Ord('d'),TReorderWeigthKind.Primary,4));
|
|
sequence.Append(TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,5));
|
|
sequence.Append(TReorderUnit.From(Ord('f'),TReorderWeigthKind.Primary,6));
|
|
sequence.Append(TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,7));
|
|
sequence.Append(TReorderUnit.From(Ord('h'),TReorderWeigthKind.Primary,8));
|
|
sequence.Append(TReorderUnit.From(Ord('i'),TReorderWeigthKind.Primary,9));
|
|
sequence.Append(TReorderUnit.From(Ord('j'),TReorderWeigthKind.Primary,10));
|
|
sequence.Append(TReorderUnit.From(Ord('k'),TReorderWeigthKind.Primary,11));
|
|
sequence.Append(TReorderUnit.From(Ord('l'),TReorderWeigthKind.Primary,12));
|
|
for i := 0 to sequence.ActualLength - 1 do
|
|
sequence.Data[i].Changed := False;
|
|
WriteLn('Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
|
|
ConstructUnicodeBook(wfirst,'test1','first',nil,unicodeBook1);
|
|
CheckInf(['a','b','c','d','e','f','g','h','i','j','k','l'],@unicodeBook1);
|
|
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('a');
|
|
statement.SetElementCount(1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn('Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
|
|
CheckInf(['a','g'{*},'b','c','d','e','f','h','i','j','k','l'],@unicodeBook2);
|
|
|
|
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('a');
|
|
statement.SetElementCount(2);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('h'),TReorderWeigthKind.Primary,0);
|
|
statement.Elements[1] := TReorderUnit.From(Ord('k'),TReorderWeigthKind.Primary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn('Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
|
|
CheckInf(['a','h'{*},'k'{*},'g'{*},'b','c','d','e','f','i','j','l'],@unicodeBook2);
|
|
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('h');
|
|
statement.SetElementCount(1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Secondary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn('Statement #3 = ',sLineBreak,' ',DumpSequenceAnsi(sequence));
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
|
|
CheckInf(['a','h'{*},'g'{*},'k'{*},'b','c','d','e','f','i','j','l'],@unicodeBook2);
|
|
end;
|
|
|
|
procedure test2_prepareWeigth(var AData : TUCA_LineRecArray);
|
|
var
|
|
p : PUCA_LineRec;
|
|
begin
|
|
SetLength(AData,11);
|
|
p := @AData[Low(AData)];
|
|
p^.CodePoints := CodePointToArray(Ord('a'));
|
|
p^.Weights := ToWeight($15EF,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray([Ord('('),Ord('a'),Ord(')')]);
|
|
p^.Weights := ToWeight($15EF,$0020,$0006); //15EF.0020.0006.24D0
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('A'));
|
|
p^.Weights := ToWeight($15EF,$0020,$0008); //15EF.0020.0008.0041
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray([Ord('('),Ord('A'),Ord(')')]);
|
|
p^.Weights := ToWeight($15EF,$0020,$000C); //15EF.0020.000C
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray([Ord('a'),Ord('`')]);
|
|
p^.Weights := ToWeight([$15EF,$0020,$0002, $0000,$0035,$0002]); //[.15EF.0020.0002.0061][.0000.0035.0002.0300]
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray([Ord('A'),Ord('`')]);
|
|
p^.Weights := ToWeight([$15EF,$0020,$0008, $0000,$0035,$0002]); //[.15EF.0020.0008.0041][.0000.0035.0002.0300]
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray([Ord('a'),Ord('e')]);
|
|
p^.Weights := ToWeight([$15F0,$0020,$0002]); //[.15EF.0020.0004.00E6][.0000.0139.0004.00E6][.164C.0020.0004.00E6]
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray([Ord(UpCase('a')),Ord(UpCase('e'))]);
|
|
p^.Weights := ToWeight([$15F0,$0020,$0006]);//[.15EF.0020.000A.00C6][.0000.0139.0004.00C6][.164C.0020.000A.00C6]
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('b'));
|
|
p^.Weights := ToWeight($1605,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray([Ord('('),Ord('b'),Ord(')')]);
|
|
p^.Weights := ToWeight($1605,$0020,$0006); //.1605.0020.0006.24D1
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('B'));
|
|
p^.Weights := ToWeight($1605,$0020,$0008); //1605.0020.0008.0042
|
|
end;
|
|
|
|
procedure test2();
|
|
var
|
|
sequenceClean, sequence : TOrderedCharacters;
|
|
statement : TReorderSequence;
|
|
wfirst, wresult : TUCA_LineRecArray;
|
|
i : Integer;
|
|
unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
|
|
begin
|
|
statement.Clear();
|
|
test2_prepareWeigth(wfirst);
|
|
sequenceClean := TOrderedCharacters.Create();
|
|
sequenceClean.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
|
|
sequenceClean.Append(TReorderUnit.From([Ord('('),Ord('a'),Ord(')')],TReorderWeigthKind.Tertiary,2));
|
|
sequenceClean.Append(TReorderUnit.From(Ord('A'),TReorderWeigthKind.Tertiary,3));
|
|
sequenceClean.Append(TReorderUnit.From([Ord('('),Ord('A'),Ord(')')],TReorderWeigthKind.Tertiary,4));
|
|
|
|
//sequenceClean.Append(TReorderUnit.From(Ord('à'),TReorderWeigthKind.Secondary,0));
|
|
sequenceClean.Append(TReorderUnit.From([Ord('a'),Ord('`')],TReorderWeigthKind.Secondary,5));
|
|
//sequenceClean.Append(TReorderUnit.From(Ord(UpCase('à')),TReorderWeigthKind.Tertiary,0));
|
|
sequenceClean.Append(TReorderUnit.From([Ord('A'),Ord('`')],TReorderWeigthKind.Tertiary,6));
|
|
|
|
sequenceClean.Append(TReorderUnit.From([Ord('a'),Ord('e')],TReorderWeigthKind.Primary,7));
|
|
sequenceClean.Append(TReorderUnit.From([Ord(UpCase('a')),Ord(UpCase('e'))],TReorderWeigthKind.Tertiary,8));
|
|
|
|
sequenceClean.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,9));
|
|
sequenceClean.Append(TReorderUnit.From([Ord('('),Ord('b'),Ord(')')],TReorderWeigthKind.Tertiary,10));
|
|
sequenceClean.Append(TReorderUnit.From(Ord('B'),TReorderWeigthKind.Tertiary,11));
|
|
for i := 0 to sequenceClean.ActualLength - 1 do
|
|
sequenceClean.Data[i].Changed := False;
|
|
|
|
WriteLn('Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
|
|
WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
|
|
ConstructUnicodeBook(wfirst,'test1','first',nil,unicodeBook1);
|
|
CheckInf(['a','(a)','A','(A)', 'a`','A`', 'ae','AE', 'b','(b)','B'],@unicodeBook1);
|
|
|
|
sequence := sequenceClean.Clone();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('a');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn('Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
|
|
CheckInf(['a','(a)','A','(A)', 'a`','A`', 'g'{*}, 'ae','AE', 'b','(b)','B'],@unicodeBook2);
|
|
CheckInf(['gg','ae'],@unicodeBook2);
|
|
CheckInf(['gb','ae'],@unicodeBook2);
|
|
//CheckInf(['aeae','AE'],@unicodeBook2);
|
|
|
|
sequence := sequenceClean.Clone();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('a');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Secondary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn('Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
|
|
CheckInf(['a','(a)','A','(A)', 'g'{*}, 'a`','A`', 'ae','AE', 'b','(b)','B'],@unicodeBook2);
|
|
CheckInf(['(A)a','ga'],@unicodeBook2);
|
|
CheckInf(['g','ae'],@unicodeBook2);
|
|
|
|
sequence := sequenceClean.Clone();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('a');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Tertiary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn('Statement #3 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
|
|
CheckInf(['a', 'g'{*},'(a)','A','(A)', 'a`','A`', 'ae','AE', 'b','(b)','B'],@unicodeBook2);
|
|
CheckInf(['aa','ga'],@unicodeBook2);
|
|
CheckInf(['ga','(a)a'],@unicodeBook2);
|
|
|
|
sequence := sequenceClean.Clone();
|
|
SetLength(statement.Reset,2);
|
|
statement.Reset[0] := Ord('a');
|
|
statement.Reset[1] := Ord('`');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Tertiary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn('Statement #4 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
|
|
CheckInf(['a','(a)','A','(A)', 'a`', 'g'{*},'A`', 'ae','AE', 'b','(b)','B'],@unicodeBook2);
|
|
CheckInf(['a`a','ga'],@unicodeBook2);
|
|
CheckInf(['ga','ae'],@unicodeBook2);
|
|
end;
|
|
|
|
//------------------------------------------------------
|
|
|
|
procedure test3_prepareWeigth(var AData : TUCA_LineRecArray);
|
|
var
|
|
p : PUCA_LineRec;
|
|
begin
|
|
SetLength(AData,12);
|
|
p := @AData[Low(AData)];
|
|
p^.CodePoints := CodePointToArray(Ord('a'));
|
|
p^.Weights := ToWeight($15EF,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('b'));
|
|
p^.Weights := ToWeight($1605,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('c'));
|
|
p^.Weights := ToWeight($161D,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('d'));
|
|
p^.Weights := ToWeight($1631,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('e'));
|
|
p^.Weights := ToWeight($164C,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('f'));
|
|
p^.Weights := ToWeight($1684,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('g'));
|
|
p^.Weights := ToWeight($1691,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('h'));
|
|
p^.Weights := ToWeight($16B4,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('i'));
|
|
p^.Weights := ToWeight($16CD,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('j'));
|
|
p^.Weights := ToWeight($16E6,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('k'));
|
|
p^.Weights := ToWeight($16FF,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('l'));
|
|
p^.Weights := ToWeight($1711,$0020,$0002);
|
|
end;
|
|
|
|
procedure PopulateSequence(var ASequence : TOrderedCharacters);
|
|
var
|
|
i : Integer;
|
|
begin
|
|
ASequence := TOrderedCharacters.Create();
|
|
ASequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
|
|
ASequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
|
|
ASequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,3));
|
|
ASequence.Append(TReorderUnit.From(Ord('d'),TReorderWeigthKind.Primary,4));
|
|
ASequence.Append(TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,5));
|
|
ASequence.Append(TReorderUnit.From(Ord('f'),TReorderWeigthKind.Primary,6));
|
|
ASequence.Append(TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,7));
|
|
ASequence.Append(TReorderUnit.From(Ord('h'),TReorderWeigthKind.Primary,8));
|
|
ASequence.Append(TReorderUnit.From(Ord('i'),TReorderWeigthKind.Primary,9));
|
|
ASequence.Append(TReorderUnit.From(Ord('j'),TReorderWeigthKind.Primary,10));
|
|
ASequence.Append(TReorderUnit.From(Ord('k'),TReorderWeigthKind.Primary,11));
|
|
ASequence.Append(TReorderUnit.From(Ord('l'),TReorderWeigthKind.Primary,12));
|
|
for i := 0 to ASequence.ActualLength - 1 do
|
|
ASequence.Data[i].Changed := False;
|
|
end;
|
|
|
|
procedure test3();
|
|
var
|
|
sequence, sequenceClean : TOrderedCharacters;
|
|
statement : TReorderSequence;
|
|
wfirst, wresult : TUCA_LineRecArray;
|
|
i : Integer;
|
|
unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
|
|
keyA, keyB : TUCASortKey;
|
|
us : UnicodeString;
|
|
begin //'a','b','c','d','e','f','g','h','i','j','k','l'
|
|
statement.Clear();
|
|
test3_prepareWeigth(wfirst);
|
|
PopulateSequence(sequenceClean);
|
|
|
|
WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
|
|
WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
|
|
|
|
//Generate the original tables
|
|
ConstructUnicodeBook(wfirst,'test3','first',nil,unicodeBook1);
|
|
|
|
us := 'a';
|
|
keyA := ComputeSortKey(us,@unicodeBook1);
|
|
for i := Ord('b') to Ord('l') do begin
|
|
us := unicodeChar(i);
|
|
keyB := ComputeSortKey(us,@unicodeBook1);
|
|
if (CompareSortKey(keyA,keyB) >= 0) then
|
|
raise Exception.CreateFmt('"%s" >= "%s" !',[AnsiChar(i-1),AnsiChar(i)]);
|
|
keyA := keyB;
|
|
end;
|
|
|
|
// --- test 1
|
|
sequence := sequenceClean.Clone();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('b');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
//Generate updatet tables
|
|
ConstructUnicodeBook(wresult,'test3','second',@unicodeBook1,unicodeBook2);
|
|
CheckInf(['a','b','g'{*}, 'c','d','e','f','h','i','j','k','l'],@unicodeBook2);
|
|
CheckInf(['bb','g'{*}],@unicodeBook2);
|
|
CheckInf(['bc','g'{*}],@unicodeBook2);
|
|
CheckInf(['bc','gg'{*}],@unicodeBook2);
|
|
CheckInf(['bg','bc'{*}],@unicodeBook2);
|
|
WriteLn(' -- test 1 - ok');
|
|
|
|
// --- test 2
|
|
sequence := sequenceClean.Clone();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('c');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From([Ord('c'),Ord('h')],TReorderWeigthKind.Primary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
//Generate updatet tables
|
|
ConstructUnicodeBook(wresult,'test3','second',@unicodeBook1,unicodeBook2);
|
|
CheckInf(['a','b','c','ch'{*},'d','e','f','g','h','i','j','k','l'],@unicodeBook2);
|
|
CheckInf(['ca','ch'{*}],@unicodeBook2);
|
|
CheckInf(['cc','ch'{*}],@unicodeBook2);
|
|
CheckInf(['cd','ch'{*}],@unicodeBook2);
|
|
CheckInf(['ce','ch'{*}],@unicodeBook2);
|
|
CheckInf(['cf','ch'{*}],@unicodeBook2);
|
|
CheckInf(['ci','ch'{*}],@unicodeBook2);
|
|
CheckInf(['cj','ch'{*}],@unicodeBook2);
|
|
CheckInf(['ck','ch'{*}],@unicodeBook2);
|
|
CheckInf(['cl','ch'{*}],@unicodeBook2);
|
|
CheckInf(['ac','ach'{*}],@unicodeBook2);
|
|
CheckInf(['aci','achat'{*}],@unicodeBook2);
|
|
WriteLn(' -- test 2 - ok');
|
|
|
|
// --- test 3
|
|
sequence := sequenceClean.Clone();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('c');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('k'),TReorderWeigthKind.Identity,0);
|
|
sequence.ApplyStatement(@statement);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
//Generate updatet tables
|
|
ConstructUnicodeBook(wresult,'test3','second',@unicodeBook1,unicodeBook2);
|
|
CheckInf(['a','b','k'{*},'d','e','f','g','h','i','j','l'],@unicodeBook2);
|
|
CheckInf(['a','b','c'{*},'d','e','f','g','h','i','j','l'],@unicodeBook2);
|
|
CheckEqual('c','k',@unicodeBook2);
|
|
CheckEqual('cc','kk',@unicodeBook2);
|
|
CheckEqual('ck','kc',@unicodeBook2);
|
|
CheckEqual('kc','kk',@unicodeBook2);
|
|
CheckEqual('cckkc','kckcc',@unicodeBook2);
|
|
|
|
CheckInf(['acb','akc'{*}],@unicodeBook2);
|
|
WriteLn(' -- test 3 - ok');
|
|
|
|
// --- test 4
|
|
sequence := sequenceClean.Clone();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('a');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From([Ord('c')],TReorderWeigthKind.Primary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
statement.Reset[0] := Ord('c');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From([Ord('c'),Ord('h')],TReorderWeigthKind.Primary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
//Generate updatet tables
|
|
ConstructUnicodeBook(wresult,'test3','second',@unicodeBook1,unicodeBook2);
|
|
CheckInf(['a','c'{*},'ch'{*},'b','d','e','f','g','h','i','j','k','l'],@unicodeBook2);
|
|
CheckInf(['ca','ch'{*}],@unicodeBook2);
|
|
CheckInf(['cc','ch'{*}],@unicodeBook2);
|
|
CheckInf(['cd','ch'{*}],@unicodeBook2);
|
|
CheckInf(['ce','ch'{*}],@unicodeBook2);
|
|
CheckInf(['cf','ch'{*}],@unicodeBook2);
|
|
CheckInf(['ci','ch'{*}],@unicodeBook2);
|
|
CheckInf(['cj','ch'{*}],@unicodeBook2);
|
|
CheckInf(['ck','ch'{*}],@unicodeBook2);
|
|
CheckInf(['cl','ch'{*}],@unicodeBook2);
|
|
CheckInf(['ac','ach'{*}],@unicodeBook2);
|
|
CheckInf(['aci','achat'{*}],@unicodeBook2);
|
|
WriteLn(' -- test 4 - ok');
|
|
end;
|
|
|
|
|
|
//------------------------------------------------------
|
|
|
|
procedure test4_prepareWeigth(var AData : TUCA_LineRecArray);
|
|
var
|
|
p : PUCA_LineRec;
|
|
begin
|
|
SetLength(AData,12);
|
|
p := @AData[Low(AData)];
|
|
p^.CodePoints := CodePointToArray(Ord('a'));
|
|
p^.Weights := ToWeight($15EF,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('b'));
|
|
p^.Weights := ToWeight($1605,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('c')); {*}
|
|
p^.Weights := ToWeight($1606,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('d'));
|
|
p^.Weights := ToWeight($1631,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('e'));
|
|
p^.Weights := ToWeight($164C,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('f'));
|
|
p^.Weights := ToWeight($1684,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('g'));
|
|
p^.Weights := ToWeight($1691,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('h'));
|
|
p^.Weights := ToWeight($16B4,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('i'));
|
|
p^.Weights := ToWeight($16CD,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('j'));
|
|
p^.Weights := ToWeight($16E6,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('k'));
|
|
p^.Weights := ToWeight($16FF,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('l'));
|
|
p^.Weights := ToWeight($1711,$0020,$0002);
|
|
end;
|
|
|
|
procedure test4();
|
|
var
|
|
sequence, sequenceClean : TOrderedCharacters;
|
|
statement : TReorderSequence;
|
|
wfirst, wresult : TUCA_LineRecArray;
|
|
i : Integer;
|
|
unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
|
|
keyA, keyB : TUCASortKey;
|
|
us : UnicodeString;
|
|
begin
|
|
statement.Clear();
|
|
test4_prepareWeigth(wfirst);
|
|
PopulateSequence(sequenceClean);
|
|
|
|
WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
|
|
WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
|
|
|
|
//Generate the original tables
|
|
ConstructUnicodeBook(wfirst,'test4','first',nil,unicodeBook1);
|
|
|
|
us := 'a';
|
|
keyA := ComputeSortKey(us,@unicodeBook1);
|
|
for i := Ord('b') to Ord('l') do begin
|
|
us := unicodeChar(i);
|
|
keyB := ComputeSortKey(us,@unicodeBook1);
|
|
if (CompareSortKey(keyA,keyB) >= 0) then
|
|
raise Exception.CreateFmt('"%s" >= "%s" !',[AnsiChar(i-1),AnsiChar(i)]);
|
|
keyA := keyB;
|
|
end;
|
|
|
|
// --- test 1
|
|
sequence := sequenceClean.Clone();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('b');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn(' Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
//Generate updatet tables
|
|
ConstructUnicodeBook(wresult,'test4','second',@unicodeBook1,unicodeBook2);
|
|
unicodeBook2.Base := @unicodeBook1;
|
|
CheckInf(['a','b','g'{*}, 'c','d','e','f','h','i','j','k','l'],@unicodeBook2);
|
|
CheckInf(['g'{*}, 'c'],@unicodeBook2);
|
|
CheckInf(['gg'{*}, 'c'],@unicodeBook2);
|
|
CheckInf(['gg'{*}, 'cc'],@unicodeBook2);
|
|
CheckInf(['g'{*}, 'ca'],@unicodeBook2);
|
|
CheckInf(['gg'{*}, 'ca'],@unicodeBook2);
|
|
CheckInf(['bb','g'{*}],@unicodeBook2);
|
|
CheckInf(['bc','g'{*}],@unicodeBook2);
|
|
CheckInf(['bc','gg'{*}],@unicodeBook2);
|
|
CheckInf(['bg','bc'{*}],@unicodeBook2);
|
|
WriteLn(' -- test 1 - ok',sLineBreak);
|
|
|
|
// --- test 2
|
|
sequence := sequenceClean.Clone();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('b');
|
|
SetLength(statement.Elements,2);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,0);
|
|
statement.Elements[1] := TReorderUnit.From(Ord('k'),TReorderWeigthKind.Primary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn(' Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
//Generate updatet tables
|
|
ConstructUnicodeBook(wresult,'test4','second',@unicodeBook1,unicodeBook2);
|
|
unicodeBook2.Base := @unicodeBook1;
|
|
CheckInf(['a','b','g'{*},'k'{*}, 'c','d','e','f','h','i','j','l'],@unicodeBook2);
|
|
CheckInf(['g'{*}, 'c'],@unicodeBook2);
|
|
CheckInf(['k'{*}, 'c'],@unicodeBook2);
|
|
CheckInf(['b','kk'{*}],@unicodeBook2);
|
|
CheckInf(['bb','kk'{*}],@unicodeBook2);
|
|
CheckInf(['b','kkk'{*}],@unicodeBook2);
|
|
CheckInf(['gk','kk'{*}],@unicodeBook2);
|
|
CheckInf(['gk','k'{*}],@unicodeBook2);
|
|
CheckInf(['gk','kkk'{*}],@unicodeBook2);
|
|
|
|
CheckInf(['gg'{*}, 'c'],@unicodeBook2);
|
|
CheckInf(['gg'{*}, 'cc'],@unicodeBook2);
|
|
CheckInf(['g'{*}, 'ca'],@unicodeBook2);
|
|
CheckInf(['gg'{*}, 'ca'],@unicodeBook2);
|
|
CheckInf(['bb','g'{*}],@unicodeBook2);
|
|
CheckInf(['bc','g'{*}],@unicodeBook2);
|
|
CheckInf(['bc','gg'{*}],@unicodeBook2);
|
|
CheckInf(['bg','bc'{*}],@unicodeBook2);
|
|
WriteLn(' -- test 2 - ok');
|
|
end;
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
procedure test5_prepareWeigth(var AData : TUCA_LineRecArray);
|
|
var
|
|
p : PUCA_LineRec;
|
|
begin
|
|
SetLength(AData,6);
|
|
p := @AData[Low(AData)];
|
|
p^.CodePoints := CodePointToArray(Ord('a'));
|
|
p^.Weights := ToWeight($15EF,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('b'));
|
|
p^.Weights := ToWeight($1605,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray([Ord('a'),Ord('d'),Ord('a')]);
|
|
p^.Weights := ToWeight($1609,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('c'));
|
|
p^.Weights := ToWeight($161D,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('d'));
|
|
p^.Weights := ToWeight($1631,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('e'));
|
|
p^.Weights := ToWeight($164C,$0020,$0002);
|
|
end;
|
|
|
|
procedure test5_PopulateSequence(var ASequence : TOrderedCharacters);
|
|
var
|
|
i : Integer;
|
|
begin
|
|
ASequence := TOrderedCharacters.Create();
|
|
ASequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
|
|
ASequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
|
|
ASequence.Append(TReorderUnit.From([Ord('a'),Ord('d'),Ord('a')],TReorderWeigthKind.Primary,3));
|
|
ASequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,4));
|
|
ASequence.Append(TReorderUnit.From(Ord('d'),TReorderWeigthKind.Primary,5));
|
|
ASequence.Append(TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,6));
|
|
for i := 0 to ASequence.ActualLength - 1 do
|
|
ASequence.Data[i].Changed := False;
|
|
end;
|
|
|
|
procedure test5();
|
|
var
|
|
sequence, sequenceClean : TOrderedCharacters;
|
|
statement : TReorderSequence;
|
|
wfirst, wresult : TUCA_LineRecArray;
|
|
unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
|
|
begin
|
|
statement.Clear();
|
|
test5_prepareWeigth(wfirst);
|
|
test5_PopulateSequence(sequenceClean);
|
|
|
|
WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
|
|
WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
|
|
|
|
//Generate the original tables
|
|
ConstructUnicodeBook(wfirst,'test5','first',nil,unicodeBook1);
|
|
CheckInf(['a','b','ada','c','d','e'],@unicodeBook1);
|
|
CheckInf(['ba','adaa'],@unicodeBook1);
|
|
|
|
// --- test 1
|
|
sequence := sequenceClean.Clone();
|
|
SetLength(statement.Reset,0);
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Deletion,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn(' Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
//Generate updatet tables
|
|
ConstructUnicodeBook(wresult,'test5','second',@unicodeBook1,unicodeBook2);
|
|
unicodeBook2.Base := @unicodeBook1;
|
|
CheckInf(['a','b','ada','d','e', 'c'{* deleted !}],@unicodeBook2);
|
|
CheckInf(['ee','ca'],@unicodeBook2);
|
|
WriteLn(' -- test 1 - ok',sLineBreak);
|
|
|
|
// --- test 2
|
|
sequence := sequenceClean.Clone();
|
|
statement.Clear();
|
|
SetLength(statement.Reset,0);
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From([Ord('a'),Ord('d'),Ord('a')],TReorderWeigthKind.Deletion,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn(' Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
//Generate updatet tables
|
|
ConstructUnicodeBook(wresult,'test5','second',@unicodeBook1,unicodeBook2);
|
|
unicodeBook2.Base := @unicodeBook1;
|
|
CheckInf(['a', 'adac'{* deleted !}, 'b','c','d','e'],@unicodeBook2);
|
|
CheckInf(['a','ada'],@unicodeBook2);
|
|
CheckInf(['ada','b'],@unicodeBook2);
|
|
CheckInf(['ac','ada'],@unicodeBook2);
|
|
CheckInf(['ac','adac'],@unicodeBook2);
|
|
CheckInf(['abe','ada'],@unicodeBook2);
|
|
CheckInf(['abe','adae'],@unicodeBook2);
|
|
WriteLn(' -- test 2 - ok',sLineBreak);
|
|
end;
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
procedure test6_prepareWeigth(var AData : TUCA_LineRecArray);
|
|
var
|
|
p : PUCA_LineRec;
|
|
begin
|
|
SetLength(AData,7);
|
|
p := @AData[Low(AData)];
|
|
p^.CodePoints := CodePointToArray(Ord('a'));
|
|
p^.Weights := ToWeight($15EF,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('b'));
|
|
p^.Weights := ToWeight($1605,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray([Ord('a'),Ord('d')]);
|
|
p^.Weights := ToWeight($1609,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray([Ord('a'),Ord('d'),Ord('a')]);
|
|
p^.Weights := ToWeight($1613,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('c'));
|
|
p^.Weights := ToWeight($161D,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('d'));
|
|
p^.Weights := ToWeight($1631,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('e'));
|
|
p^.Weights := ToWeight($164C,$0020,$0002);
|
|
end;
|
|
|
|
procedure test6_PopulateSequence(var ASequence : TOrderedCharacters);
|
|
var
|
|
i : Integer;
|
|
begin
|
|
ASequence := TOrderedCharacters.Create();
|
|
ASequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
|
|
ASequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
|
|
ASequence.Append(TReorderUnit.From([Ord('a'),Ord('d')],TReorderWeigthKind.Primary,3));
|
|
ASequence.Append(TReorderUnit.From([Ord('a'),Ord('d'),Ord('a')],TReorderWeigthKind.Primary,4));
|
|
ASequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,5));
|
|
ASequence.Append(TReorderUnit.From(Ord('d'),TReorderWeigthKind.Primary,6));
|
|
ASequence.Append(TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,7));
|
|
for i := 0 to ASequence.ActualLength - 1 do
|
|
ASequence.Data[i].Changed := False;
|
|
end;
|
|
|
|
procedure test6();
|
|
var
|
|
sequence, sequenceClean : TOrderedCharacters;
|
|
statement : TReorderSequence;
|
|
wfirst, wresult : TUCA_LineRecArray;
|
|
unicodeBook1, unicodeBook2, unicodeBook3 : unicodedata.TUCA_DataBook;
|
|
begin
|
|
statement.Clear();
|
|
test6_prepareWeigth(wfirst);
|
|
test6_PopulateSequence(sequenceClean);
|
|
|
|
WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
|
|
WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
|
|
|
|
//Generate the original tables
|
|
ConstructUnicodeBook(wfirst,'test6','first',nil,unicodeBook1);
|
|
CheckInf(['a','b','ad','ada','c','d','e'],@unicodeBook1);
|
|
CheckInf(['ba','ad'],@unicodeBook1);
|
|
CheckInf(['ba','adaa'],@unicodeBook1);
|
|
|
|
// --- test 1
|
|
sequence := sequenceClean.Clone();
|
|
SetLength(statement.Reset,0);
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From([Ord('a'),Ord('d')],TReorderWeigthKind.Deletion,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn(' Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
//Generate updatet tables
|
|
ConstructUnicodeBook(wresult,'test6','second',@unicodeBook1,unicodeBook2);
|
|
unicodeBook2.Base := @unicodeBook1;
|
|
CheckInf(['a', 'ad'{*},'ada', 'b','c','d','e'],@unicodeBook2);
|
|
CheckInf(['ab','ad'],@unicodeBook2);
|
|
CheckInf(['ab','adb'],@unicodeBook2);
|
|
CheckInf(['ad','ba'],@unicodeBook2);
|
|
CheckInf(['adaa','ba'],@unicodeBook2);
|
|
WriteLn(' -- test 1 - ok',sLineBreak);
|
|
|
|
// --- test 2
|
|
//sequence := sequenceClean.Clone();
|
|
SetLength(statement.Reset,0);
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From([Ord('a'),Ord('d'),Ord('a')],TReorderWeigthKind.Deletion,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn(' Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
//Generate updatet tables
|
|
ConstructUnicodeBook(wresult,'test6','second',@unicodeBook2,unicodeBook3);
|
|
unicodeBook3.Base := @unicodeBook2;
|
|
CheckInf(['a', 'ad'{*},'ada'{*}, 'b','c','d','e'],@unicodeBook3);
|
|
CheckInf(['ab','ad'],@unicodeBook3);
|
|
CheckInf(['ab','adb'],@unicodeBook3);
|
|
CheckInf(['ab','ada'],@unicodeBook3);
|
|
WriteLn(' -- test 2 - ok',sLineBreak);
|
|
|
|
// --- test 3
|
|
sequence := sequenceClean.Clone();
|
|
SetLength(statement.Reset,0);
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From([Ord('a'),Ord('d'),Ord('a')],TReorderWeigthKind.Deletion,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn(' Statement #3 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
//Generate updatet tables
|
|
ConstructUnicodeBook(wresult,'test6','second',@unicodeBook1,unicodeBook2);
|
|
unicodeBook2.Base := @unicodeBook1;
|
|
CheckInf(['a', 'b', 'ad', 'c','d','e'],@unicodeBook2);
|
|
CheckInf(['ad','ada'],@unicodeBook2);
|
|
WriteLn(' -- test 3 - ok',sLineBreak);
|
|
end;
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
procedure test7_prepareWeigth(var AData : TUCA_LineRecArray);
|
|
var
|
|
p : PUCA_LineRec;
|
|
begin
|
|
SetLength(AData,8);
|
|
p := @AData[Low(AData)];
|
|
p^.CodePoints := CodePointToArray($030A);//030A ; [.0000.0043.0002.030A] # COMBINING RING ABOVE
|
|
p^.Weights := ToWeight($0000,$0043,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray($0327);//0327 ; [.0000.0056.0002.0327] # COMBINING CEDILLA
|
|
p^.Weights := ToWeight($0000,$0056,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray($0061);//a
|
|
p^.Weights := ToWeight($15EF,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray($0062);//b
|
|
p^.Weights := ToWeight($1605,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray($0063);//c
|
|
p^.Weights := ToWeight($161D,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray($0064);//d
|
|
p^.Weights := ToWeight($1631,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray([$0061,$030A]);//a,030A;COMBINING RING ABOVE
|
|
p^.Weights := ToWeight($164C,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('k'));
|
|
p^.Weights := ToWeight($16FF,$0020,$0002);
|
|
end;
|
|
|
|
procedure test7_PopulateSequence(var ASequence : TOrderedCharacters);
|
|
var
|
|
i : Integer;
|
|
begin
|
|
ASequence := TOrderedCharacters.Create();
|
|
ASequence.Append(TReorderUnit.From($030A,TReorderWeigthKind.Tertiary,1));
|
|
ASequence.Append(TReorderUnit.From($0327,TReorderWeigthKind.Tertiary,2));
|
|
ASequence.Append(TReorderUnit.From($0061,TReorderWeigthKind.Primary,3));
|
|
ASequence.Append(TReorderUnit.From($0062,TReorderWeigthKind.Primary,4));
|
|
ASequence.Append(TReorderUnit.From($0063,TReorderWeigthKind.Primary,5));
|
|
ASequence.Append(TReorderUnit.From($0064,TReorderWeigthKind.Primary,6));
|
|
ASequence.Append(TReorderUnit.From([$0061,$030A],TReorderWeigthKind.Primary,7));
|
|
ASequence.Append(TReorderUnit.From(Ord('k'),TReorderWeigthKind.Primary,11));
|
|
for i := 0 to ASequence.ActualLength - 1 do
|
|
ASequence.Data[i].Changed := False;
|
|
end;
|
|
|
|
procedure test7();
|
|
var
|
|
sequence, sequenceClean : TOrderedCharacters;
|
|
statement : TReorderSequence;
|
|
wfirst, wresult : TUCA_LineRecArray;
|
|
unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
|
|
begin // Permutation simple test
|
|
statement.Clear();
|
|
test7_prepareWeigth(wfirst);
|
|
test7_PopulateSequence(sequenceClean);
|
|
|
|
WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
|
|
WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
|
|
|
|
//Generate the original tables
|
|
ConstructUnicodeBook(wfirst,'test7','first',nil,unicodeBook1);
|
|
CheckInf([#$030A,#$0327,#$0061,#$0062,#$0063,#$0064, #$0061#$030A,'k'],@unicodeBook1);
|
|
CheckInf([#$0064, #$0061#$030A#$0327#$0062,'k'],@unicodeBook1);// Permutation here $030A <=> #$0327
|
|
CheckInf([#$0064, #$0061#$0327#$030A#$0062,'k'],@unicodeBook1);
|
|
CheckEqual(#$0061#$030A#$0327, #$0061#$0327#$030A,@unicodeBook1);
|
|
|
|
// --- test 2
|
|
sequence := sequenceClean.Clone();
|
|
SetLength(statement.Reset,0);
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From([$0061,$030A],TReorderWeigthKind.Deletion,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn(' Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
//Generate updatet tables
|
|
ConstructUnicodeBook(wresult,'test7','second',@unicodeBook1,unicodeBook2);
|
|
unicodeBook2.Base := @unicodeBook1;
|
|
CheckInf([#$030A,#$0327,#$0061,#$0061#$030A ,#$0062,#$0063,#$0064,'k'],@unicodeBook2);
|
|
CheckInf([#$0061, #$0061#$030A#$0327#$0062,#$0062,#$0064],@unicodeBook2);
|
|
CheckInf([#$0061, #$0061#$030A#$0062#$0327,#$0062,#$0064],@unicodeBook2);
|
|
WriteLn(' -- test 2 - ok',sLineBreak);
|
|
end;
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
procedure test8_prepareWeigth(var AData : TUCA_LineRecArray);
|
|
var
|
|
p : PUCA_LineRec;
|
|
begin
|
|
SetLength(AData,12);
|
|
p := @AData[Low(AData)];
|
|
p^.CodePoints := CodePointToArray(Ord('a'));
|
|
p^.Weights := ToWeight($15EF,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('b'));
|
|
p^.Weights := ToWeight($1605,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('c'));
|
|
p^.Weights := ToWeight($161D,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('d'));
|
|
p^.Weights := ToWeight($1631,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('e'));
|
|
p^.Weights := ToWeight($164C,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('f'));
|
|
p^.Weights := ToWeight($1684,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('g'));
|
|
p^.Weights := ToWeight($1691,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('h'));
|
|
p^.Weights := ToWeight($16B4,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('i'));
|
|
p^.Weights := ToWeight($16CD,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('j'));
|
|
p^.Weights := ToWeight($16E6,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('k'));
|
|
p^.Weights := ToWeight($16FF,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('l'));
|
|
p^.Weights := ToWeight($1711,$0020,$0002);
|
|
end;
|
|
|
|
procedure test8_PopulateSequence(var ASequence : TOrderedCharacters);
|
|
var
|
|
i : Integer;
|
|
begin
|
|
ASequence := TOrderedCharacters.Create();
|
|
ASequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
|
|
ASequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
|
|
ASequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,3));
|
|
ASequence.Append(TReorderUnit.From(Ord('d'),TReorderWeigthKind.Primary,4));
|
|
ASequence.Append(TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,5));
|
|
ASequence.Append(TReorderUnit.From(Ord('f'),TReorderWeigthKind.Primary,6));
|
|
ASequence.Append(TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,7));
|
|
ASequence.Append(TReorderUnit.From(Ord('h'),TReorderWeigthKind.Primary,8));
|
|
ASequence.Append(TReorderUnit.From(Ord('i'),TReorderWeigthKind.Primary,9));
|
|
ASequence.Append(TReorderUnit.From(Ord('j'),TReorderWeigthKind.Primary,10));
|
|
ASequence.Append(TReorderUnit.From(Ord('k'),TReorderWeigthKind.Primary,11));
|
|
ASequence.Append(TReorderUnit.From(Ord('l'),TReorderWeigthKind.Primary,12));
|
|
for i := 0 to ASequence.ActualLength - 1 do
|
|
ASequence.Data[i].Changed := False;
|
|
end;
|
|
|
|
procedure test8();
|
|
var
|
|
sequence, sequenceClean : TOrderedCharacters;
|
|
statement : TReorderSequence;
|
|
wfirst, wresult : TUCA_LineRecArray;
|
|
unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
|
|
begin
|
|
statement.Clear();
|
|
test8_prepareWeigth(wfirst);
|
|
test8_PopulateSequence(sequenceClean);
|
|
|
|
WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
|
|
WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
|
|
|
|
//Generate the original tables
|
|
ConstructUnicodeBook(wfirst,'test8','first',nil,unicodeBook1);
|
|
CheckInf('l','-'{* computed are greater},@unicodeBook1);
|
|
|
|
// --- test 1
|
|
sequence := sequenceClean.Clone();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('c');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('-'),[Ord('c')],TReorderWeigthKind.Identity,0);
|
|
sequence.ApplyStatement(@statement);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
//Generate updatet tables
|
|
ConstructUnicodeBook(wresult,'test8','second',@unicodeBook1,unicodeBook2);
|
|
CheckInf(['a','b','c','d','e','f','g','h','i','j','k','l'],@unicodeBook2);
|
|
CheckEqual('cc','c-'{*},@unicodeBook2);
|
|
CheckEqual('ccc','c-c'{*},@unicodeBook2);
|
|
CheckEqual('cca','c-a'{*},@unicodeBook2);
|
|
CheckEqual('cce','c-e'{*},@unicodeBook2);
|
|
CheckInf(['cc','c-c'{*}],@unicodeBook2);
|
|
CheckInf(['bc','bc-c'{*}],@unicodeBook2);
|
|
CheckInf('l','-'{* computed are greater},@unicodeBook2);
|
|
WriteLn(' -- test 1 - ok');
|
|
|
|
// --- test 2
|
|
sequence := sequenceClean.Clone();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('c');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('-'),[Ord('c')],TReorderWeigthKind.Primary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
//Generate updatet tables
|
|
ConstructUnicodeBook(wresult,'test8','second',@unicodeBook1,unicodeBook2);
|
|
CheckInf(['a','b','c','d','e','f','g','h','i','j','k','l'],@unicodeBook2);
|
|
CheckInf('cc','c-'{*},@unicodeBook2);
|
|
CheckInf('ccl','c-'{*},@unicodeBook2);
|
|
CheckInf('ccc','c-c'{*},@unicodeBook2);
|
|
CheckInf('cca','c-a'{*},@unicodeBook2);
|
|
CheckInf('cce','c-e'{*},@unicodeBook2);
|
|
CheckInf(['cc','c-c'{*}],@unicodeBook2);
|
|
CheckInf(['bc','bc-c'{*}],@unicodeBook2);
|
|
CheckInf('l','-'{* computed are greater},@unicodeBook2);
|
|
WriteLn(' -- test 2 - ok');
|
|
|
|
// --- test 3
|
|
sequence := sequenceClean.Clone();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('c');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From([Ord('-'),Ord('+')],[Ord('c')],TReorderWeigthKind.Identity,0);
|
|
sequence.ApplyStatement(@statement);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
//Generate updatet tables
|
|
ConstructUnicodeBook(wresult,'test8','second',@unicodeBook1,unicodeBook2);
|
|
CheckInf(['a','b','c','d','e','f','g','h','i','j','k','l'],@unicodeBook2);
|
|
CheckEqual('cc','c-+'{*},@unicodeBook2);
|
|
CheckEqual('ccc','c-+c'{*},@unicodeBook2);
|
|
CheckEqual('cca','c-+a'{*},@unicodeBook2);
|
|
CheckEqual('cce','c-+e'{*},@unicodeBook2);
|
|
CheckInf(['cc','c-+c'{*}],@unicodeBook2);
|
|
CheckInf(['bc','bc-+c'{*}],@unicodeBook2);
|
|
CheckInf('l','-+'{* computed are greater},@unicodeBook2);
|
|
WriteLn(' -- test 3 - ok');
|
|
|
|
// --- test 4 : '-' has 3 contexts to force the context tree to have at least
|
|
// a "Left" and a "Right"
|
|
sequence := sequenceClean.Clone();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('c');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('-'),[Ord('c')],TReorderWeigthKind.Identity,0);
|
|
sequence.ApplyStatement(@statement);
|
|
statement.Reset[0] := Ord('f');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('-'),[Ord('f')],TReorderWeigthKind.Identity,0);
|
|
sequence.ApplyStatement(@statement);
|
|
statement.Reset[0] := Ord('a');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('-'),[Ord('a')],TReorderWeigthKind.Identity,0);
|
|
sequence.ApplyStatement(@statement);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
//Generate updatet tables
|
|
ConstructUnicodeBook(wresult,'test8','second',@unicodeBook1,unicodeBook2);
|
|
CheckInf(['a','b','c','d','e','f','g','h','i','j','k','l'],@unicodeBook2);
|
|
// Check c
|
|
CheckEqual('cc','c-'{*},@unicodeBook2);
|
|
CheckEqual('ccc','c-c'{*},@unicodeBook2);
|
|
CheckEqual('cca','c-a'{*},@unicodeBook2);
|
|
CheckEqual('cce','c-e'{*},@unicodeBook2);
|
|
CheckInf(['cc','c-c'{*}],@unicodeBook2);
|
|
CheckInf(['bc','bc-c'{*}],@unicodeBook2);
|
|
//check f
|
|
CheckEqual('ff','f-'{*},@unicodeBook2);
|
|
CheckEqual('fff','f-f'{*},@unicodeBook2);
|
|
CheckEqual('ffa','f-a'{*},@unicodeBook2);
|
|
CheckEqual('ffe','f-e'{*},@unicodeBook2);
|
|
CheckInf(['ff','f-f'{*}],@unicodeBook2);
|
|
CheckInf(['bf','bf-f'{*}],@unicodeBook2);
|
|
//check c and f
|
|
CheckEqual('ccf','c-f'{*},@unicodeBook2);
|
|
CheckEqual('ccff','c-f-'{*},@unicodeBook2);
|
|
CheckEqual('ccfff','c-f-f'{*},@unicodeBook2);
|
|
CheckEqual('ffcc','f-c-'{*},@unicodeBook2);
|
|
CheckEqual('ffccf','f-c-f'{*},@unicodeBook2);
|
|
|
|
CheckInf('ffccf','g'{*},@unicodeBook2);
|
|
CheckInf('a-','ab',@unicodeBook2);
|
|
// check - alone
|
|
CheckInf('l','-'{* computed are greater},@unicodeBook2);
|
|
WriteLn(' -- test 4 - ok');
|
|
|
|
// --- test 5 : Add a contraction to force the code path
|
|
sequence := sequenceClean.Clone();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('a');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From([Ord('-'),Ord('h')],TReorderWeigthKind.Primary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
statement.Reset[0] := Ord('c');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('-'),[Ord('c')],TReorderWeigthKind.Identity,0);
|
|
sequence.ApplyStatement(@statement);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
//Generate updatet tables
|
|
ConstructUnicodeBook(wresult,'test8','second',@unicodeBook1,unicodeBook2);
|
|
CheckInf(['a','-h','b','c','d','e','f','g','h','i','j','k','l'],@unicodeBook2);
|
|
CheckEqual('cc','c-'{*},@unicodeBook2);
|
|
CheckEqual('ccc','c-c'{*},@unicodeBook2);
|
|
CheckEqual('cca','c-a'{*},@unicodeBook2);
|
|
CheckEqual('cce','c-e'{*},@unicodeBook2);
|
|
CheckInf(['cc','c-c'{*}],@unicodeBook2);
|
|
CheckInf(['bc','bc-c'{*}],@unicodeBook2);
|
|
CheckInf(['ab','-hb'{*}],@unicodeBook2);
|
|
CheckInf(['-hb','ba'],@unicodeBook2);
|
|
CheckInf('l','-'{* computed are greater},@unicodeBook2);
|
|
WriteLn(' -- test 5 - ok');
|
|
|
|
WriteLn(' -- test - ok',sLineBreak);
|
|
end;
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
procedure test9_prepareWeigth(var AData : TUCA_LineRecArray);
|
|
var
|
|
p : PUCA_LineRec;
|
|
begin
|
|
SetLength(AData,8);
|
|
p := @AData[Low(AData)];
|
|
p^.CodePoints := CodePointToArray($030A);//030A ; [.0000.0043.0002.030A] # COMBINING RING ABOVE
|
|
p^.Weights := ToWeight($0000,$0043,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray($0327);//0327 ; [.0000.0056.0002.0327] # COMBINING CEDILLA
|
|
p^.Weights := ToWeight($0000,$0056,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray($0061);//a
|
|
p^.Weights := ToWeight($15EF,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray($0062);//b
|
|
p^.Weights := ToWeight($1605,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray($0063);//c
|
|
p^.Weights := ToWeight($161D,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray($0064);//d
|
|
p^.Weights := ToWeight($1631,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray([$0061,$030A]);//a,030A;COMBINING RING ABOVE
|
|
p^.Weights := ToWeight($164C,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('k'));
|
|
p^.Weights := ToWeight($16FF,$0020,$0002);
|
|
end;
|
|
|
|
procedure test9_PopulateSequence(var ASequence : TOrderedCharacters);
|
|
var
|
|
i : Integer;
|
|
begin
|
|
ASequence := TOrderedCharacters.Create();
|
|
ASequence.Append(TReorderUnit.From($030A,TReorderWeigthKind.Tertiary,1));
|
|
ASequence.Append(TReorderUnit.From($0327,TReorderWeigthKind.Tertiary,2));
|
|
ASequence.Append(TReorderUnit.From($0061,TReorderWeigthKind.Primary,3));
|
|
ASequence.Append(TReorderUnit.From($0062,TReorderWeigthKind.Primary,4));
|
|
ASequence.Append(TReorderUnit.From($0063,TReorderWeigthKind.Primary,5));
|
|
ASequence.Append(TReorderUnit.From($0064,TReorderWeigthKind.Primary,6));
|
|
ASequence.Append(TReorderUnit.From([$0061,$030A],TReorderWeigthKind.Primary,7));
|
|
ASequence.Append(TReorderUnit.From(Ord('k'),TReorderWeigthKind.Primary,11));
|
|
for i := 0 to ASequence.ActualLength - 1 do
|
|
ASequence.Data[i].Changed := False;
|
|
end;
|
|
|
|
procedure test9();
|
|
var
|
|
sequence, sequenceClean : TOrderedCharacters;
|
|
statement : TReorderSequence;
|
|
wfirst, wresult : TUCA_LineRecArray;
|
|
unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
|
|
begin// Permutation with Context
|
|
statement.Clear();
|
|
test7_prepareWeigth(wfirst);
|
|
test7_PopulateSequence(sequenceClean);
|
|
|
|
WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
|
|
WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
|
|
|
|
//Generate the original tables
|
|
ConstructUnicodeBook(wfirst,'test9','first',nil,unicodeBook1);
|
|
CheckInf([#$030A,#$0327,#$0061,#$0062,#$0063,#$0064, #$0061#$030A,'k'],@unicodeBook1);
|
|
CheckInf([#$0064, #$0061#$030A#$0327#$0062,'k'],@unicodeBook1);// Permutation here $030A <=> #$0327
|
|
|
|
// --- test 2
|
|
sequence := sequenceClean.Clone();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := $0062;
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From([Ord('k'),$032D],[$0061],TReorderWeigthKind.Secondary,0); //032D;COMBINING CIRCUMFLEX ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING CIRCUMFLEX BELOW;;;;
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn(' Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
//Generate updatet tables
|
|
ConstructUnicodeBook(wresult,'test9','second',@unicodeBook1,unicodeBook2);
|
|
unicodeBook2.Base := @unicodeBook1;
|
|
CheckInf([#$030A,#$0327,#$0061,#$0062,#$0063,#$0064,'k'],@unicodeBook2);
|
|
CheckInf([#$0061'k'#$032D ,#$0061#$0063],@unicodeBook2);
|
|
CheckNotEqual(#$0061'k'#$0327#$032D, #$0061#$0327,@unicodeBook2);
|
|
CheckInf([#$0061'k'#$0327#$032D ,#$0061#$0063],@unicodeBook2);
|
|
WriteLn(' -- test 2 - ok',sLineBreak);
|
|
end;
|
|
|
|
//------------------------------------------------------
|
|
|
|
procedure test10_prepareWeigth(var AData : TUCA_LineRecArray);
|
|
var
|
|
p : PUCA_LineRec;
|
|
begin
|
|
SetLength(AData,12);
|
|
p := @AData[Low(AData)];
|
|
p^.CodePoints := CodePointToArray(Ord('a'));
|
|
p^.Weights := ToWeight($15EF,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray([Ord('('),Ord('a'),Ord(')')]);
|
|
p^.Weights := ToWeight($15EF,$0020,$0006); //15EF.0020.0006.24D0
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('A'));
|
|
p^.Weights := ToWeight($15EF,$0020,$0008); //15EF.0020.0008.0041
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray([Ord('('),Ord('A'),Ord(')')]);
|
|
p^.Weights := ToWeight($15EF,$0020,$000C); //15EF.0020.000C
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray([Ord('a'),Ord('`')]);
|
|
p^.Weights := ToWeight([$15EF,$0020,$0002, $0000,$0035,$0002]); //[.15EF.0020.0002.0061][.0000.0035.0002.0300]
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray([Ord('A'),Ord('`')]);
|
|
p^.Weights := ToWeight([$15EF,$0020,$0008, $0000,$0035,$0002]); //[.15EF.0020.0008.0041][.0000.0035.0002.0300]
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray([Ord('a'),Ord('e')]);
|
|
p^.Weights := ToWeight([$15F0,$0020,$0002]); //[.15EF.0020.0004.00E6][.0000.0139.0004.00E6][.164C.0020.0004.00E6]
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray([Ord(UpCase('a')),Ord(UpCase('e'))]);
|
|
p^.Weights := ToWeight([$15F0,$0020,$0006]);//[.15EF.0020.000A.00C6][.0000.0139.0004.00C6][.164C.0020.000A.00C6]
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('b'));
|
|
p^.Weights := ToWeight($1605,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray([Ord('('),Ord('b'),Ord(')')]);
|
|
p^.Weights := ToWeight($1605,$0020,$0006); //.1605.0020.0006.24D1
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('B'));
|
|
p^.Weights := ToWeight($1605,$0020,$0008); //1605.0020.0008.0042
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('c'));
|
|
p^.Weights := ToWeight($161D,$0020,$0002);
|
|
end;
|
|
|
|
procedure test10_PopulateSequence(var ASequence : TOrderedCharacters);
|
|
var
|
|
i : Integer;
|
|
begin
|
|
ASequence := TOrderedCharacters.Create();
|
|
ASequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
|
|
ASequence.Append(TReorderUnit.From([Ord('('),Ord('a'),Ord(')')],TReorderWeigthKind.Tertiary,2));
|
|
ASequence.Append(TReorderUnit.From(Ord('A'),TReorderWeigthKind.Tertiary,3));
|
|
ASequence.Append(TReorderUnit.From([Ord('('),Ord('A'),Ord(')')],TReorderWeigthKind.Tertiary,4));
|
|
|
|
//ASequence.Append(TReorderUnit.From(Ord('à'),TReorderWeigthKind.Secondary,0));
|
|
ASequence.Append(TReorderUnit.From([Ord('a'),Ord('`')],TReorderWeigthKind.Secondary,5));
|
|
//ASequence.Append(TReorderUnit.From(Ord(UpCase('à')),TReorderWeigthKind.Tertiary,0));
|
|
ASequence.Append(TReorderUnit.From([Ord('A'),Ord('`')],TReorderWeigthKind.Tertiary,6));
|
|
|
|
ASequence.Append(TReorderUnit.From([Ord('a'),Ord('e')],TReorderWeigthKind.Primary,7));
|
|
ASequence.Append(TReorderUnit.From([Ord(UpCase('a')),Ord(UpCase('e'))],TReorderWeigthKind.Tertiary,8));
|
|
|
|
ASequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,9));
|
|
ASequence.Append(TReorderUnit.From([Ord('('),Ord('b'),Ord(')')],TReorderWeigthKind.Tertiary,10));
|
|
ASequence.Append(TReorderUnit.From(Ord('B'),TReorderWeigthKind.Tertiary,11));
|
|
|
|
ASequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,12));
|
|
for i := 0 to ASequence.ActualLength - 1 do
|
|
ASequence.Data[i].Changed := False;
|
|
end;
|
|
|
|
procedure test10();
|
|
var
|
|
sequence, sequenceClean : TOrderedCharacters;
|
|
statement : TReorderSequence;
|
|
wfirst, wresult : TUCA_LineRecArray;
|
|
unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
|
|
begin
|
|
statement.Clear();
|
|
test10_prepareWeigth(wfirst);
|
|
test10_PopulateSequence(sequenceClean);
|
|
|
|
WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
|
|
WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
|
|
|
|
//Generate the original tables
|
|
ConstructUnicodeBook(wfirst,'test6','first',nil,unicodeBook1);
|
|
CheckInf(['a','(a)','A','(A)', 'a`','A`', 'ae','AE', 'b','(b)','B', 'c'],@unicodeBook1);
|
|
|
|
// --- test 1
|
|
sequence := sequenceClean.Clone();
|
|
statement.Clear();
|
|
statement.Before := True;
|
|
SetLength(statement.Reset,2);
|
|
statement.Reset[0] := Ord('a');
|
|
statement.Reset[1] := Ord('e');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn('Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
|
|
CheckInf(['a','(a)','A','(A)', 'a`','A`', 'g'{*}, 'ae','AE', 'b','(b)','B', 'c'],@unicodeBook2);
|
|
CheckInf(['gg','ae'],@unicodeBook2);
|
|
CheckInf(['gb','ae'],@unicodeBook2);
|
|
WriteLn(' -- test 1 - ok',sLineBreak);
|
|
|
|
// --- test 2
|
|
sequence := sequenceClean.Clone();
|
|
statement.Clear();
|
|
statement.Before := True;
|
|
SetLength(statement.Reset,2);
|
|
statement.Reset[0] := Ord('a');
|
|
statement.Reset[1] := Ord('e');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Secondary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn('Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
ConstructUnicodeBook(wresult,'test2','2',@unicodeBook1,unicodeBook2);
|
|
CheckInf(['a','(a)','A','(A)', 'a`','A`', 'g'{*}, 'ae','AE', 'b','(b)','B', 'c'],@unicodeBook2);
|
|
CheckInf(['A`B','gg'],@unicodeBook2);
|
|
CheckInf(['A`b','g'],@unicodeBook2);
|
|
WriteLn(' -- test 2 - ok',sLineBreak);
|
|
|
|
// --- test 3
|
|
sequence := sequenceClean.Clone();
|
|
statement.Clear();
|
|
statement.Before := True;
|
|
SetLength(statement.Reset,2);
|
|
statement.Reset[0] := Ord('a');
|
|
statement.Reset[1] := Ord('e');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Tertiary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn('Statement #3 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
ConstructUnicodeBook(wresult,'test2','2',@unicodeBook1,unicodeBook2);
|
|
CheckInf(['a','(a)','A','(A)', 'a`','A`', 'g'{*}, 'ae','AE', 'b','(b)','B', 'c'],@unicodeBook2);
|
|
CheckInf(['A`B','gg'],@unicodeBook2);
|
|
CheckInf(['A`b','g'],@unicodeBook2);
|
|
WriteLn(' -- test 3 - ok',sLineBreak);
|
|
|
|
// --- test 4
|
|
sequence := sequenceClean.Clone();
|
|
statement.Clear();
|
|
statement.Before := True;
|
|
SetLength(statement.Reset,2);
|
|
statement.Reset[0] := Ord('A');
|
|
statement.Reset[1] := Ord('`');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Tertiary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn('Statement #4.1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
statement.Clear();
|
|
statement.Before := True;
|
|
SetLength(statement.Reset,2);
|
|
statement.Reset[0] := Ord('A');
|
|
statement.Reset[1] := Ord('`');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('G'),TReorderWeigthKind.Secondary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn('Statement #4.2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
ConstructUnicodeBook(wresult,'test2','2',@unicodeBook1,unicodeBook2);
|
|
CheckInf(['a','(a)','A','(A)', 'G','a`','g'{*},'A`', 'ae','AE', 'b','(b)','B', 'c'],@unicodeBook2);
|
|
CheckInf(['gg','A`B'],@unicodeBook2);
|
|
CheckInf(['g','A`b'],@unicodeBook2);
|
|
CheckInf(['A','gg'],@unicodeBook2);
|
|
CheckInf(['A','Ga'],@unicodeBook2);
|
|
WriteLn(' -- test 4 - ok',sLineBreak);
|
|
|
|
// --- test 5
|
|
sequence := sequenceClean.Clone();
|
|
statement.Clear();
|
|
statement.Before := True;
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('B');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn('Statement #5 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
|
|
CheckInf(['a','(a)','A','(A)', 'a`','A`', 'ae','AE', 'g'{*}, 'b','(b)','B', 'c'],@unicodeBook2);
|
|
CheckInf(['gg','b'],@unicodeBook2);
|
|
CheckInf(['ae','gb'],@unicodeBook2);
|
|
WriteLn(' -- test 5 - ok',sLineBreak);
|
|
end;
|
|
|
|
//------------------------------------------------------
|
|
|
|
procedure test11_prepareWeigth(var AData : TUCA_LineRecArray);
|
|
var
|
|
p : PUCA_LineRec;
|
|
begin
|
|
SetLength(AData,12);
|
|
p := @AData[Low(AData)];
|
|
p^.CodePoints := CodePointToArray(Ord('a'));
|
|
p^.Weights := ToWeight($15EF,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('b'));
|
|
p^.Weights := ToWeight($1605,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('c'));
|
|
p^.Weights := ToWeight($161D,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('d'));
|
|
p^.Weights := ToWeight($1631,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('e'));
|
|
p^.Weights := ToWeight($164C,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('f'));
|
|
p^.Weights := ToWeight($1684,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('g'));
|
|
p^.Weights := ToWeight($1691,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('h'));
|
|
p^.Weights := ToWeight($16B4,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('i'));
|
|
p^.Weights := ToWeight($16CD,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('j'));
|
|
p^.Weights := ToWeight($16E6,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('k'));
|
|
p^.Weights := ToWeight($16FF,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('l'));
|
|
p^.Weights := ToWeight($1711,$0020,$0002);
|
|
end;
|
|
|
|
procedure test11_PopulateSequence(var ASequence : TOrderedCharacters);
|
|
var
|
|
i : Integer;
|
|
begin
|
|
ASequence := TOrderedCharacters.Create();
|
|
ASequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
|
|
ASequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
|
|
ASequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,3));
|
|
ASequence.Append(TReorderUnit.From(Ord('d'),TReorderWeigthKind.Primary,4));
|
|
ASequence.Append(TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,5));
|
|
ASequence.Append(TReorderUnit.From(Ord('f'),TReorderWeigthKind.Primary,6));
|
|
ASequence.Append(TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,7));
|
|
ASequence.Append(TReorderUnit.From(Ord('h'),TReorderWeigthKind.Primary,8));
|
|
ASequence.Append(TReorderUnit.From(Ord('i'),TReorderWeigthKind.Primary,9));
|
|
ASequence.Append(TReorderUnit.From(Ord('j'),TReorderWeigthKind.Primary,10));
|
|
ASequence.Append(TReorderUnit.From(Ord('k'),TReorderWeigthKind.Primary,11));
|
|
ASequence.Append(TReorderUnit.From(Ord('l'),TReorderWeigthKind.Primary,12));
|
|
for i := 0 to ASequence.ActualLength - 1 do
|
|
ASequence.Data[i].Changed := False;
|
|
end;
|
|
|
|
procedure test11();
|
|
var
|
|
sequence, sequenceClean : TOrderedCharacters;
|
|
statement : TReorderSequence;
|
|
wfirst, wresult : TUCA_LineRecArray;
|
|
unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
|
|
begin
|
|
statement.Clear();
|
|
test11_prepareWeigth(wfirst);
|
|
test11_PopulateSequence(sequenceClean);
|
|
|
|
WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
|
|
WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
|
|
//Generate the original tables
|
|
ConstructUnicodeBook(wfirst,'test11','first',nil,unicodeBook1);
|
|
CheckInf(['a','b','c','d','e','f','g','h','i','j','k','l'],@unicodeBook1);
|
|
|
|
// --- test 1
|
|
sequence := sequenceClean.Clone();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('c');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('x'),TReorderWeigthKind.Tertiary,0);
|
|
statement.Elements[0].SetExpansion(Ord('h'));
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn(' Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
//Generate updatet tables
|
|
ConstructUnicodeBook(wresult,'test1','second',@unicodeBook1,unicodeBook2);
|
|
CheckInf(['a','b','c','x'{*},'d','e','f','g','h','i','j','k','l'],@unicodeBook2);
|
|
CheckInf('ch','x'{*},@unicodeBook2);
|
|
CheckInf('cha','xa'{*},@unicodeBook2);
|
|
CheckInf('chk','xka'{*},@unicodeBook2);
|
|
WriteLn(' -- test 1 - ok');
|
|
|
|
// --- test 2
|
|
sequence := sequenceClean.Clone();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('c');
|
|
SetLength(statement.Elements,2);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('x'),TReorderWeigthKind.Tertiary,0);
|
|
statement.Elements[0].SetExpansion(Ord('h'));
|
|
statement.Elements[1] := TReorderUnit.From(Ord('X'),TReorderWeigthKind.Tertiary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn(' Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
//Generate updatet tables
|
|
ConstructUnicodeBook(wresult,'test2','second',@unicodeBook1,unicodeBook2);
|
|
CheckInf(['a','b','c','x'{*},'X'{*},'d','e','f','g','h','i','j','k','l'],@unicodeBook2);
|
|
CheckInf('ch','x'{*},@unicodeBook2);
|
|
CheckInf('cha','xa'{*},@unicodeBook2);
|
|
CheckInf('chk','xka'{*},@unicodeBook2);
|
|
CheckInf('ch','X'{*},@unicodeBook2);
|
|
CheckInf('cha','Xa'{*},@unicodeBook2);
|
|
CheckInf('chk','Xka'{*},@unicodeBook2);
|
|
WriteLn(' -- test 2 - ok');
|
|
|
|
end;
|
|
|
|
//------------------------------------------------------
|
|
|
|
procedure test12_prepareWeigth(var AData : TUCA_LineRecArray);
|
|
var
|
|
p : PUCA_LineRec;
|
|
begin
|
|
SetLength(AData,1);
|
|
p := @AData[Low(AData)];
|
|
p^.CodePoints := CodePointToArray(Ord('a'));
|
|
p^.Weights := ToWeight($15EF,$0120,$0002);
|
|
end;
|
|
|
|
procedure test12_PopulateSequence(var ASequence : TOrderedCharacters);
|
|
var
|
|
i : Integer;
|
|
begin
|
|
ASequence := TOrderedCharacters.Create();
|
|
ASequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
|
|
for i := 0 to ASequence.ActualLength - 1 do
|
|
ASequence.Data[i].Changed := False;
|
|
end;
|
|
|
|
procedure Check(const ACondition : Boolean; const AMsg : string);overload;
|
|
begin
|
|
if not ACondition then
|
|
raise Exception.Create(AMsg);
|
|
end;
|
|
|
|
procedure Check(
|
|
const ACondition : Boolean;
|
|
const AFormatMsg : string;
|
|
const AArgs : array of const
|
|
);overload;
|
|
begin
|
|
Check(ACondition,Format(AFormatMsg,AArgs));
|
|
end;
|
|
|
|
procedure Check(const ACondition : Boolean);overload;
|
|
begin
|
|
Check(ACondition,'Check failed.')
|
|
end;
|
|
|
|
procedure CheckSimpleProps(
|
|
AItem : PUCA_PropItemRec;
|
|
AHasCodePoint,
|
|
AIsValid : Boolean;
|
|
AChildCount : Byte;
|
|
AContextual : Boolean
|
|
);overload;
|
|
var
|
|
p : PUCA_PropItemRec;
|
|
begin
|
|
p := AItem;
|
|
Check(p<>nil,'p = nil');
|
|
Check(p^.HasCodePoint()=AHasCodePoint,'HasCodePoint');
|
|
Check(p^.IsValid()=AIsValid,'IsValid');
|
|
Check(p^.ChildCount=AChildCount,'ChildCount');
|
|
Check(p^.Contextual=AContextual,'Contextual');
|
|
end;
|
|
|
|
procedure CheckSimpleProps(
|
|
AItem : PUCA_PropItemRec;
|
|
AHasCodePoint,
|
|
AIsValid : Boolean;
|
|
AChildCount : Byte;
|
|
AContextual,
|
|
AIsDeleted : Boolean
|
|
);overload;
|
|
begin
|
|
CheckSimpleProps(AItem,AHasCodePoint,AIsValid,AChildCount,AContextual);
|
|
Check(AItem^.IsDeleted=AIsDeleted,'IsDeleted');
|
|
end;
|
|
|
|
procedure CheckWeigths(AItem : PUCA_PropItemRec; const AWeigths : array of Word);overload;
|
|
var
|
|
p : PUCA_PropItemRec;
|
|
c, i : Integer;
|
|
pb : PByte;
|
|
pw : PWord;
|
|
begin
|
|
p := AItem;
|
|
c := Length(AWeigths);
|
|
if ((c mod 3) > 0) then
|
|
Check(False,'Invalid Weigth Array.');
|
|
c := c div 3;
|
|
Check(c=p^.WeightLength,'WeightLength');
|
|
if (c = 0) then
|
|
exit;
|
|
pb := PByte(PtrUInt(p)+SizeOf(TUCA_PropItemRec));
|
|
pw := @AWeigths[Low(AWeigths)];
|
|
//First Item
|
|
Check(PWord(pb)^ = pw^, 'First Item[0]');
|
|
pw := pw + 1;
|
|
pb := pb + 2;
|
|
if (pw^ > High(Byte)) then begin
|
|
Check(PWord(pb)^ = pw^, 'First Item[1]');
|
|
pb := pb + 2;
|
|
end else begin
|
|
Check(pb^ = pw^, 'First Item[1]');
|
|
pb := pb + 1;
|
|
end;
|
|
pw := pw + 1;
|
|
if (pw^ > High(Byte)) then begin
|
|
Check(PWord(pb)^ = pw^, 'First Item[2]');
|
|
pb := pb + 2;
|
|
end else begin
|
|
Check(pb^ = pw^, 'First Item[2]');
|
|
pb := pb + 1;
|
|
end;
|
|
pw := pw + 1;
|
|
// Others
|
|
for i := 1 to c-1 do begin
|
|
Check(PWord(pb)^ = pw^, 'Item[0],i=%d',[i]);
|
|
Inc(pw);
|
|
pb := pb + 2;
|
|
Check(PWord(pb)^ = pw^, 'Item[1],i=%d',[i]);
|
|
Inc(pw);
|
|
pb := pb + 2;
|
|
Check(PWord(pb)^ = pw^, 'Item[2],i=%d',[i]);
|
|
Inc(pw);
|
|
pb := pb + 2;
|
|
end;
|
|
end;
|
|
|
|
procedure CheckWeigths(
|
|
AData : PUCA_PropWeights;
|
|
const ADataCount : Integer;
|
|
const AWeigths : array of Word
|
|
);overload;
|
|
var
|
|
c: Integer;
|
|
begin
|
|
c := Length(AWeigths);
|
|
if ((c mod 3) > 0) then
|
|
Check(False,'Invalid Weigth Array.');
|
|
c := c div 3;
|
|
Check(c=ADataCount,'WeightLength');
|
|
if (c = 0) then
|
|
exit;
|
|
if not CompareMem(AData,@AWeigths[0],(ADataCount*3*SizeOf(Word))) then
|
|
Check(False,'Weight');
|
|
end;
|
|
|
|
function CalcWeigthSize(const AWeigths : array of Word) : Integer;
|
|
var
|
|
c : Integer;
|
|
begin
|
|
c := Length(AWeigths);
|
|
if ((c mod 3) > 0) then
|
|
Check(False,'Invalid Weigth Array.');
|
|
Result := c * SizeOf(Word);
|
|
if (c>0) then begin
|
|
if (AWeigths[1] <= High(Byte)) then
|
|
Result := Result - 1;
|
|
if (AWeigths[2] <= High(Byte)) then
|
|
Result := Result - 1;
|
|
end;
|
|
end;
|
|
|
|
procedure test12_check_1(const ABook : unicodedata.TUCA_DataBook);
|
|
var
|
|
p, px : PUCA_PropItemRec;
|
|
size, sizeTotal, t: Cardinal;
|
|
begin
|
|
sizeTotal := 0;
|
|
// for 'b'
|
|
p := ABook.Props;
|
|
CheckSimpleProps(p,False,True,0,False);
|
|
CheckWeigths(p,[$15F0,0,0]);// CheckWeigths(p,[$15F0,0,0, $15F0,0,0]);
|
|
size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15F0,0,0]);
|
|
Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
|
|
Check(p^.Size = size,'size');
|
|
sizeTotal:= sizeTotal+size;
|
|
|
|
// for 'c'
|
|
p := PUCA_PropItemRec(PtrUInt(p)+size);
|
|
CheckSimpleProps(p,False,True,0,False);
|
|
CheckWeigths(p,[$15F1,0,0]);
|
|
size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15F1,0,0]);
|
|
Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
|
|
Check(p^.Size = size,'size');
|
|
sizeTotal:= sizeTotal+size;
|
|
|
|
// for 'x'
|
|
p := PUCA_PropItemRec(PtrUInt(p)+size);
|
|
px := p;
|
|
CheckSimpleProps(p,False,False,1,False);
|
|
CheckWeigths(p,[]);
|
|
size := SizeOf(TUCA_PropItemRec);
|
|
Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
|
|
t := size;
|
|
sizeTotal:= sizeTotal+size;
|
|
// for 'y'
|
|
p := PUCA_PropItemRec(PtrUInt(p)+size);
|
|
CheckSimpleProps(p,True,True,0,False);
|
|
CheckWeigths(p,[$15F2,0,0]);
|
|
size := SizeOf(TUCA_PropItemRec) +
|
|
SizeOf(UInt24) +
|
|
CalcWeigthSize([$15F2,0,0]);
|
|
Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
|
|
Check(p^.Size = size,'size(y)');
|
|
|
|
Check(px^.Size = (t+size),'size(x)');
|
|
|
|
sizeTotal:= sizeTotal+size;
|
|
Check(ABook.PropCount = sizeTotal,'size(total)');
|
|
end;
|
|
|
|
procedure test12_check_2(const ABook : unicodedata.TUCA_DataBook);
|
|
var
|
|
p, ph : PUCA_PropItemRec;
|
|
size, sizeTotal, t: Integer;
|
|
begin
|
|
sizeTotal := 0;
|
|
// for 'b'
|
|
p := ABook.Props;
|
|
CheckSimpleProps(p,False,True,0,False);
|
|
CheckWeigths(p,[$15EF,$121,0]); //CheckWeigths(p,[$15EF,$121,0, $15EF,0,0]);
|
|
size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15EF,$121,0]);
|
|
Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
|
|
Check(p^.Size = size,'size');
|
|
sizeTotal:= sizeTotal+size;
|
|
|
|
// for 'c'
|
|
p := PUCA_PropItemRec(PtrUInt(p)+size);
|
|
CheckSimpleProps(p,False,True,0,False);
|
|
CheckWeigths(p,[$15EF,$122,0]);
|
|
size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15EF,$122,0]);
|
|
Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
|
|
Check(p^.Size = size,'size');
|
|
sizeTotal:= sizeTotal+size;
|
|
|
|
// for 'h'
|
|
p := PUCA_PropItemRec(PtrUInt(p)+size);
|
|
ph := p;
|
|
CheckSimpleProps(p,False,False,1,False);
|
|
CheckWeigths(p,[]);
|
|
size := SizeOf(TUCA_PropItemRec);
|
|
Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
|
|
t := size;
|
|
sizeTotal:= sizeTotal+size;
|
|
// for 'i'
|
|
p := PUCA_PropItemRec(PtrUInt(p)+size);
|
|
CheckSimpleProps(p,True,True,0,False);
|
|
CheckWeigths(p,[$15EF,$123,0]);
|
|
size := SizeOf(TUCA_PropItemRec) +
|
|
SizeOf(UInt24) +
|
|
CalcWeigthSize([$15EF,$123,0]);
|
|
Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
|
|
Check(p^.Size = size,'size(i)');
|
|
sizeTotal:= sizeTotal+size;
|
|
|
|
Check(ph^.Size = (t+size),'size(h)');
|
|
|
|
// for 'k'
|
|
p := PUCA_PropItemRec(PtrUInt(p)+size);
|
|
CheckSimpleProps(p,False,True,0,False);
|
|
CheckWeigths(p,[$15EF,$123,1]);
|
|
size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15EF,$123,1]);
|
|
Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
|
|
Check(p^.Size = size,'size(k)');
|
|
sizeTotal:= sizeTotal+size;
|
|
|
|
Check(ABook.PropCount = sizeTotal,'size(total)');
|
|
end;
|
|
|
|
procedure test12_check_3(const ABook : unicodedata.TUCA_DataBook);
|
|
var
|
|
p, pc : PUCA_PropItemRec;
|
|
size, sizeTotal, t: Integer;
|
|
begin
|
|
sizeTotal := 0;
|
|
// for 'b'
|
|
p := ABook.Props;
|
|
CheckSimpleProps(p,False,True,0,False);
|
|
CheckWeigths(p,[$15EF,$121,0]);
|
|
size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15EF,$121,0]);
|
|
Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
|
|
Check(p^.Size = size,'size');
|
|
sizeTotal:= sizeTotal+size;
|
|
|
|
// for 'c'
|
|
p := PUCA_PropItemRec(PtrUInt(p)+size);
|
|
pc := p;
|
|
CheckSimpleProps(p,False,True,1,False);
|
|
CheckWeigths(p,[$15EF,$122,0]);
|
|
size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15EF,$122,0]);
|
|
Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
|
|
t := size;
|
|
sizeTotal:= sizeTotal+size;
|
|
|
|
// for 'i'
|
|
p := PUCA_PropItemRec(PtrUInt(p)+size);
|
|
CheckSimpleProps(p,True,True,0,False);
|
|
CheckWeigths(p,[$15EF,$123,0]);
|
|
size := SizeOf(TUCA_PropItemRec) +
|
|
SizeOf(UInt24) +
|
|
CalcWeigthSize([$15EF,$123,0]);
|
|
Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
|
|
Check(p^.Size = size,'size(i)');
|
|
sizeTotal:= sizeTotal+size;
|
|
|
|
Check(pc^.Size = (t+size),'size(c)');
|
|
|
|
// for 'k'
|
|
p := PUCA_PropItemRec(PtrUInt(p)+size);
|
|
CheckSimpleProps(p,False,True,0,False);
|
|
CheckWeigths(p,[$15EF,$123,1]);
|
|
size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15EF,$123,1]);
|
|
Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
|
|
Check(p^.Size = size,'size(k)');
|
|
sizeTotal:= sizeTotal+size;
|
|
|
|
Check(ABook.PropCount = sizeTotal,'size(total)');
|
|
end;
|
|
|
|
procedure test12_check_4(const ABook : unicodedata.TUCA_DataBook);
|
|
var
|
|
p, pc : PUCA_PropItemRec;
|
|
size, sizeTotal, t: Integer;
|
|
begin
|
|
sizeTotal := 0;
|
|
// for 'b'
|
|
p := ABook.Props;
|
|
CheckSimpleProps(p,False,True,0,False);
|
|
CheckWeigths(p,[$15EF,$121,0]);
|
|
size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15EF,$121,0]);
|
|
Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
|
|
Check(p^.Size = size,'size');
|
|
sizeTotal:= sizeTotal+size;
|
|
|
|
// for 'c'
|
|
p := PUCA_PropItemRec(PtrUInt(p)+size);
|
|
pc := p;
|
|
CheckSimpleProps(p,False,True,2,False);
|
|
CheckWeigths(p,[$15EF,$122,0]);
|
|
size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15EF,$122,0]);
|
|
Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
|
|
t := size;
|
|
sizeTotal:= sizeTotal+size;
|
|
|
|
// for 'i' as in 'ci'
|
|
p := PUCA_PropItemRec(PtrUInt(p)+size);
|
|
CheckSimpleProps(p,True,True,0,False);
|
|
CheckWeigths(p,[$15EF,$123,0]);
|
|
size := SizeOf(TUCA_PropItemRec) +
|
|
SizeOf(UInt24) +
|
|
CalcWeigthSize([$15EF,$123,0]);
|
|
Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
|
|
Check(p^.Size = size,'size(i)');
|
|
t := t+size;
|
|
sizeTotal:= sizeTotal+size;
|
|
|
|
// for 's' as in 'cs'
|
|
p := PUCA_PropItemRec(PtrUInt(p)+size);
|
|
CheckSimpleProps(p,True,True,0,False);
|
|
CheckWeigths(p,[$15EF+1,0,0]);
|
|
size := SizeOf(TUCA_PropItemRec) +
|
|
SizeOf(UInt24) +
|
|
CalcWeigthSize([$15EF+1,0,0]);
|
|
Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
|
|
Check(p^.Size = size,'size(s)');
|
|
t := t+size;
|
|
sizeTotal:= sizeTotal+size;
|
|
|
|
Check(pc^.Size = t,'size(c)');
|
|
|
|
// for 'k'
|
|
p := PUCA_PropItemRec(PtrUInt(p)+size);
|
|
CheckSimpleProps(p,False,True,0,False);
|
|
CheckWeigths(p,[$15EF,$123,1]);
|
|
size := SizeOf(TUCA_PropItemRec) + CalcWeigthSize([$15EF,$123,1]);
|
|
Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
|
|
Check(p^.Size = size,'size(k)');
|
|
sizeTotal:= sizeTotal+size;
|
|
|
|
Check(ABook.PropCount = sizeTotal,'size(total)');
|
|
end;
|
|
|
|
procedure test12();
|
|
var
|
|
sequence, sequenceClean : TOrderedCharacters;
|
|
statement : TReorderSequence;
|
|
wfirst, wresult : TUCA_LineRecArray;
|
|
unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
|
|
begin
|
|
statement.Clear();
|
|
test12_prepareWeigth(wfirst);
|
|
test12_PopulateSequence(sequenceClean);
|
|
|
|
WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
|
|
WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
|
|
//Generate the original tables
|
|
ConstructUnicodeBook(wfirst,'test','first',nil,unicodeBook1);
|
|
|
|
// --- test 1
|
|
sequence := sequenceClean.Clone();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('a');
|
|
SetLength(statement.Elements,3);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,0);
|
|
statement.Elements[1] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,0);
|
|
statement.Elements[2] := TReorderUnit.From([Ord('x'),Ord('y')],TReorderWeigthKind.Primary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn(' Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
//Generate updatet tables
|
|
ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
|
|
CheckInf(['a','b','c','xy'],@unicodeBook2);
|
|
test12_check_1(unicodeBook2);
|
|
WriteLn(' -- test 1 - ok');
|
|
|
|
// --- test 2
|
|
sequence := sequenceClean.Clone();
|
|
statement.Clear();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('a');
|
|
SetLength(statement.Elements,4);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Secondary,0);
|
|
statement.Elements[1] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Secondary,0);
|
|
statement.Elements[2] := TReorderUnit.From([Ord('h'),Ord('i')],TReorderWeigthKind.Secondary,0);
|
|
statement.Elements[3] := TReorderUnit.From(Ord('k'),TReorderWeigthKind.Tertiary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn(' Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
//Generate updatet tables
|
|
ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
|
|
CheckInf(['a','b','c','hi','k'],@unicodeBook2);
|
|
test12_check_2(unicodeBook2);
|
|
WriteLn(' -- test 2 - ok');
|
|
|
|
// --- test 3
|
|
sequence := sequenceClean.Clone();
|
|
statement.Clear();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('a');
|
|
SetLength(statement.Elements,4);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Secondary,0);
|
|
statement.Elements[1] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Secondary,0);
|
|
statement.Elements[2] := TReorderUnit.From([Ord('c'),Ord('i')],TReorderWeigthKind.Secondary,0);
|
|
statement.Elements[3] := TReorderUnit.From(Ord('k'),TReorderWeigthKind.Tertiary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn(' Statement #3 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
//Generate updatet tables
|
|
ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
|
|
CheckInf(['a','b','c','ci','k'],@unicodeBook2);
|
|
test12_check_3(unicodeBook2);
|
|
WriteLn(' -- test 3 - ok');
|
|
|
|
// --- test 4
|
|
sequence := sequenceClean.Clone();
|
|
statement.Clear();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('a');
|
|
SetLength(statement.Elements,5);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Secondary,0);
|
|
statement.Elements[1] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Secondary,0);
|
|
statement.Elements[2] := TReorderUnit.From([Ord('c'),Ord('i')],TReorderWeigthKind.Secondary,0);
|
|
statement.Elements[3] := TReorderUnit.From(Ord('k'),TReorderWeigthKind.Tertiary,0);
|
|
statement.Elements[4] := TReorderUnit.From([Ord('c'),Ord('s')],TReorderWeigthKind.Primary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn(' Statement #4 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
//Generate updatet tables
|
|
ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
|
|
CheckInf(['a','b','c','ci','k','cs'],@unicodeBook2);
|
|
test12_check_4(unicodeBook2);
|
|
WriteLn(' -- test 4 - ok');
|
|
end;
|
|
|
|
//------------------------------------------------------
|
|
|
|
procedure test13_prepareWeigth(var AData : TUCA_LineRecArray);
|
|
var
|
|
p : PUCA_LineRec;
|
|
begin
|
|
SetLength(AData,2);
|
|
p := @AData[Low(AData)];
|
|
p^.CodePoints := CodePointToArray(Ord('a'));
|
|
p^.Weights := ToWeight($15EF,$0120,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray([Ord('b')]);
|
|
p^.Weights := ToWeight($15F0,$0120,$0002);
|
|
end;
|
|
|
|
procedure test13_PopulateSequence(var ASequence : TOrderedCharacters);
|
|
var
|
|
i : Integer;
|
|
begin
|
|
ASequence := TOrderedCharacters.Create();
|
|
ASequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
|
|
ASequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
|
|
for i := 0 to ASequence.ActualLength - 1 do
|
|
ASequence.Data[i].Changed := False;
|
|
end;
|
|
|
|
procedure test13_check_1(const ABook : unicodedata.TUCA_DataBook);
|
|
var
|
|
p, pb : PUCA_PropItemRec;
|
|
size, sizeTotal, t: Integer;
|
|
begin
|
|
sizeTotal := 0;
|
|
// for 'b'
|
|
p := ABook.Props;
|
|
pb := p;
|
|
CheckSimpleProps(p,False,True,1,False,True);
|
|
CheckWeigths(p,[]);
|
|
size := SizeOf(TUCA_PropItemRec);
|
|
Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
|
|
t := size;
|
|
sizeTotal:= sizeTotal+size;
|
|
|
|
// for 'u' as in 'bu'
|
|
p := PUCA_PropItemRec(PtrUInt(p)+size);
|
|
CheckSimpleProps(p,True,True,0,False,False);
|
|
CheckWeigths(p,[$15F0,0,0]);
|
|
size := SizeOf(TUCA_PropItemRec) +
|
|
SizeOf(UInt24) +
|
|
CalcWeigthSize([$15F0,0,0]);
|
|
Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
|
|
Check(p^.Size = size,'size(u)');
|
|
t := t+size;
|
|
sizeTotal:= sizeTotal+size;
|
|
|
|
Check(pb^.Size = t,'size(c)');
|
|
|
|
Check(ABook.PropCount = sizeTotal,'size(total)');
|
|
end;
|
|
|
|
procedure test13_check_2(const ABook : unicodedata.TUCA_DataBook);
|
|
var
|
|
p, pb : PUCA_PropItemRec;
|
|
size, sizeTotal, t: Integer;
|
|
begin
|
|
sizeTotal := 0;
|
|
// for 'b'
|
|
p := ABook.Props;
|
|
pb := p;
|
|
CheckSimpleProps(p,False,True,1,False,True);
|
|
CheckWeigths(p,[]);
|
|
size := SizeOf(TUCA_PropItemRec);
|
|
Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
|
|
t := size;
|
|
sizeTotal:= sizeTotal+size;
|
|
|
|
// for 'u' as in 'bu'
|
|
p := PUCA_PropItemRec(PtrUInt(p)+size);
|
|
CheckSimpleProps(p,True,True,0,False,False);
|
|
CheckWeigths(p,[$15F0,0,0]);
|
|
size := SizeOf(TUCA_PropItemRec) +
|
|
SizeOf(UInt24) +
|
|
CalcWeigthSize([$15F0,0,0]);
|
|
Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
|
|
Check(p^.Size = size,'size(u)');
|
|
t := t+size;
|
|
sizeTotal:= sizeTotal+size;
|
|
|
|
Check(pb^.Size = t,'size(c)');
|
|
|
|
// for 'c'
|
|
p := PUCA_PropItemRec(PtrUInt(p)+size);
|
|
CheckSimpleProps(p,False,True,0,False,False);
|
|
CheckWeigths(p,[$15F1,0,0]);
|
|
size := SizeOf(TUCA_PropItemRec) +
|
|
CalcWeigthSize([$15F1,0,0]);
|
|
Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
|
|
Check(p^.Size = size,'size(c)');
|
|
sizeTotal:= sizeTotal+size;
|
|
|
|
Check(ABook.PropCount = sizeTotal,'size(total)');
|
|
end;
|
|
|
|
procedure test13();
|
|
var
|
|
sequence, sequenceClean : TOrderedCharacters;
|
|
statement : TReorderSequence;
|
|
wfirst, wresult : TUCA_LineRecArray;
|
|
unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
|
|
begin
|
|
statement.Clear();
|
|
test12_prepareWeigth(wfirst);
|
|
test12_PopulateSequence(sequenceClean);
|
|
|
|
WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
|
|
WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
|
|
//Generate the original tables
|
|
ConstructUnicodeBook(wfirst,'test','first',nil,unicodeBook1);
|
|
|
|
// --- test 1
|
|
sequence := sequenceClean.Clone();
|
|
statement.Clear();
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Deletion,0);
|
|
sequence.ApplyStatement(@statement);
|
|
statement.Clear();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('a');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From([Ord('b'),Ord('u')],TReorderWeigthKind.Primary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn(' Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
//Generate updatet tables
|
|
ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
|
|
CheckInf(['a','bu','b'{because b's weigth is now computed!}],@unicodeBook2);
|
|
test13_check_1(unicodeBook2);
|
|
WriteLn(' -- test 1 - ok');
|
|
|
|
// --- test 2
|
|
sequence := sequenceClean.Clone();
|
|
statement.Clear();
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Deletion,0);
|
|
sequence.ApplyStatement(@statement);
|
|
statement.Clear();
|
|
SetLength(statement.Reset,2);
|
|
statement.Reset[0] := Ord('a');
|
|
SetLength(statement.Elements,2);
|
|
statement.Elements[0] := TReorderUnit.From([Ord('b'),Ord('u')],TReorderWeigthKind.Primary,0);
|
|
statement.Elements[1] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn(' Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
//Generate updatet tables
|
|
ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
|
|
CheckInf(['a','bu','c','b'{because b's weigth is now computed!}],@unicodeBook2);
|
|
test13_check_2(unicodeBook2);
|
|
WriteLn(' -- test 2 - ok');
|
|
end;
|
|
|
|
//------------------------------------------------------
|
|
|
|
procedure test14_prepareWeigth(var AData : TUCA_LineRecArray);
|
|
var
|
|
p : PUCA_LineRec;
|
|
begin
|
|
SetLength(AData,1);
|
|
p := @AData[Low(AData)];
|
|
p^.CodePoints := CodePointToArray(Ord('a'));
|
|
p^.Weights := ToWeight($15EF,$0120,$0002);
|
|
end;
|
|
|
|
procedure test14_PopulateSequence(var ASequence : TOrderedCharacters);
|
|
var
|
|
i : Integer;
|
|
begin
|
|
ASequence := TOrderedCharacters.Create();
|
|
ASequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
|
|
for i := 0 to ASequence.ActualLength - 1 do
|
|
ASequence.Data[i].Changed := False;
|
|
end;
|
|
|
|
procedure test14_check_1(const ABook : unicodedata.TUCA_DataBook);
|
|
var
|
|
p : PUCA_PropItemRec;
|
|
size, sizeTotal: Integer;
|
|
ctx : PUCA_PropItemContextTreeRec;
|
|
ctxItem : PUCA_PropItemContextTreeNodeRec;
|
|
pb : PByte;
|
|
begin
|
|
sizeTotal := 0;
|
|
// for 'b'
|
|
p := ABook.Props;
|
|
pb := PByte(p);
|
|
size := 0;
|
|
CheckSimpleProps(p,True,True,0,True,False);
|
|
size := SizeOf(TUCA_PropItemRec)+SizeOf(UInt24){codepoint};
|
|
CheckWeigths(p,[]);
|
|
ctx := PUCA_PropItemContextTreeRec(PtrUInt(p)+SizeOf(TUCA_PropItemRec)+SizeOf(UInt24));
|
|
Check(ctx^.Size>0,'ctx^.Size');
|
|
ctxItem := PUCA_PropItemContextTreeNodeRec(PtrUInt(ctx)+SizeOf(ctx^.Size));
|
|
Check(ctxItem<>nil,'ctxItem');
|
|
Check(ctxItem^.Left=0,'ctxItem^.Left');
|
|
Check(ctxItem^.Right=0,'ctxItem^.Right');
|
|
Check(ctxItem^.Data.CodePointCount=1,'ctxItem^.Data.CodePointCount');
|
|
Check(ctxItem^.Data.WeightCount=1,'ctxItem^.Data.WeightCount');
|
|
pb := PByte(PtrUInt(@ctxItem^.Data)+SizeOf(ctxItem^.Data));
|
|
Check(Cardinal(PUInt24(pb)^)=Ord('a'),'Context CodePoint');
|
|
pb := pb + (ctxItem^.Data.CodePointCount*SizeOf(UInt24));
|
|
CheckWeigths(PUCA_PropWeights(pb),ctxItem^.Data.WeightCount,[$15EF,$120,$3]);
|
|
|
|
size := SizeOf(TUCA_PropItemRec)+
|
|
SizeOf(UInt24){codepoint}+
|
|
SizeOf(TUCA_PropItemContextTreeRec.Size)+
|
|
SizeOf(TUCA_PropItemContextTreeNodeRec) +
|
|
(ctxItem^.Data.CodePointCount*SizeOf(UInt24))+
|
|
(ctxItem^.Data.WeightCount*SizeOf(TUCA_PropWeights));
|
|
|
|
Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
|
|
sizeTotal:= sizeTotal+size;
|
|
|
|
Check(ABook.PropCount = sizeTotal,'size(total)');
|
|
end;
|
|
|
|
procedure test14_check_2(const ABook : unicodedata.TUCA_DataBook);
|
|
var
|
|
p : PUCA_PropItemRec;
|
|
size, sizeTotal : Integer;
|
|
ctx : PUCA_PropItemContextTreeRec;
|
|
ctxItem : PUCA_PropItemContextTreeNodeRec;
|
|
pb : PByte;
|
|
begin
|
|
sizeTotal := 0;
|
|
// for 'b'
|
|
p := ABook.Props;
|
|
pb := PByte(p);
|
|
size := 0;
|
|
CheckSimpleProps(p,True,True,0,True,False);
|
|
CheckWeigths(p,[]);
|
|
ctx := PUCA_PropItemContextTreeRec(PtrUInt(p)+SizeOf(TUCA_PropItemRec)+SizeOf(UInt24));
|
|
Check(ctx^.Size>0,'ctx^.Size');
|
|
ctxItem := PUCA_PropItemContextTreeNodeRec(PtrUInt(ctx)+SizeOf(ctx^.Size));
|
|
Check(ctxItem<>nil,'ctxItem');
|
|
Check(ctxItem^.Left=0,'ctxItem^.Left');
|
|
Check(ctxItem^.Right=0,'ctxItem^.Right');
|
|
Check(ctxItem^.Data.CodePointCount=1,'ctxItem^.Data.CodePointCount');
|
|
Check(ctxItem^.Data.WeightCount=1,'ctxItem^.Data.WeightCount');
|
|
pb := PByte(PtrUInt(@ctxItem^.Data)+SizeOf(ctxItem^.Data));
|
|
Check(Cardinal(PUInt24(pb)^)=Ord('a'),'Context CodePoint');
|
|
pb := pb + (ctxItem^.Data.CodePointCount*SizeOf(UInt24));
|
|
CheckWeigths(PUCA_PropWeights(pb),ctxItem^.Data.WeightCount,[$15EF,$120,$3]);
|
|
size := SizeOf(TUCA_PropItemRec)+
|
|
SizeOf(UInt24){codepoint}+
|
|
SizeOf(TUCA_PropItemContextTreeRec.Size)+
|
|
SizeOf(TUCA_PropItemContextTreeNodeRec) +
|
|
(ctxItem^.Data.CodePointCount*SizeOf(UInt24))+
|
|
(ctxItem^.Data.WeightCount*SizeOf(TUCA_PropWeights));
|
|
Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
|
|
sizeTotal:= sizeTotal+size;
|
|
|
|
// for 'c'
|
|
p := PUCA_PropItemRec(PtrUInt(p)+size);
|
|
CheckSimpleProps(p,False,True,0,False,False);
|
|
CheckWeigths(p,[$15F0,$0,$0]);
|
|
size := SizeOf(TUCA_PropItemRec) +
|
|
CalcWeigthSize([$15F0,$0,$0]);
|
|
Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
|
|
Check(p^.Size = size,'size(u)');
|
|
sizeTotal:= sizeTotal+size;
|
|
|
|
Check(ABook.PropCount = sizeTotal,'size(total)');
|
|
end;
|
|
|
|
procedure test14_check_3(const ABook : unicodedata.TUCA_DataBook);
|
|
var
|
|
p : PUCA_PropItemRec;
|
|
size, sizeTotal, t: Integer;
|
|
ctx : PUCA_PropItemContextTreeRec;
|
|
ctxItem : PUCA_PropItemContextTreeNodeRec;
|
|
pb : PByte;
|
|
begin
|
|
sizeTotal := 0;
|
|
// for 'b'
|
|
p := ABook.Props;
|
|
pb := PByte(p);
|
|
size := 0;
|
|
CheckSimpleProps(p,True,True,0,True,False);
|
|
CheckWeigths(p,[]);
|
|
ctx := PUCA_PropItemContextTreeRec(PtrUInt(p)+SizeOf(TUCA_PropItemRec)+SizeOf(UInt24));
|
|
Check(ctx^.Size>0,'ctx^.Size');
|
|
ctxItem := PUCA_PropItemContextTreeNodeRec(PtrUInt(ctx)+SizeOf(ctx^.Size));
|
|
Check(ctxItem<>nil,'ctxItem');
|
|
Check(ctxItem^.Left=0,'ctxItem^.Left');
|
|
Check(ctxItem^.Right<>0,'ctxItem^.Right');
|
|
Check(ctxItem^.Data.CodePointCount=1,'ctxItem^.Data.CodePointCount');
|
|
Check(ctxItem^.Data.WeightCount=1,'ctxItem^.Data.WeightCount');
|
|
pb := PByte(PtrUInt(@ctxItem^.Data)+SizeOf(ctxItem^.Data));
|
|
Check(Cardinal(PUInt24(pb)^)=Ord('a'),'Context CodePoint');
|
|
pb := pb + (ctxItem^.Data.CodePointCount*SizeOf(UInt24));
|
|
CheckWeigths(PUCA_PropWeights(pb),ctxItem^.Data.WeightCount,[$15EF,$120,$3]);
|
|
|
|
t := SizeOf(TUCA_PropItemContextTreeNodeRec) +
|
|
(ctxItem^.Data.CodePointCount*SizeOf(UInt24))+
|
|
(ctxItem^.Data.WeightCount*SizeOf(TUCA_PropWeights));
|
|
Check(ctxItem^.Right = t,'ctxItem^.Right');
|
|
ctxItem := PUCA_PropItemContextTreeNodeRec(PtrUInt(ctxItem)+t);
|
|
Check(ctxItem^.Left=0,'ctxItem^.Left');
|
|
Check(ctxItem^.Right=0,'ctxItem^.Right');
|
|
Check(ctxItem^.Data.CodePointCount=1,'ctxItem^.Data.CodePointCount');
|
|
Check(ctxItem^.Data.WeightCount=2,'ctxItem^.Data.WeightCount');
|
|
pb := PByte(PtrUInt(@ctxItem^.Data)+SizeOf(ctxItem^.Data));
|
|
Check(Cardinal(PUInt24(pb)^)=Ord('f'),'Context CodePoint');
|
|
pb := pb + (ctxItem^.Data.CodePointCount*SizeOf(UInt24));
|
|
CheckWeigths(PUCA_PropWeights(pb),ctxItem^.Data.WeightCount,[$15F1,$0,$1, $1,0,0]);
|
|
|
|
size := SizeOf(TUCA_PropItemRec)+
|
|
SizeOf(UInt24){codepoint}+
|
|
SizeOf(TUCA_PropItemContextTreeRec.Size)+
|
|
t+
|
|
SizeOf(TUCA_PropItemContextTreeNodeRec) +
|
|
(ctxItem^.Data.CodePointCount*SizeOf(UInt24))+
|
|
(ctxItem^.Data.WeightCount*SizeOf(TUCA_PropWeights));
|
|
Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
|
|
sizeTotal:= sizeTotal+size;
|
|
|
|
// for 'e'
|
|
p := PUCA_PropItemRec(PtrUInt(p)+size);
|
|
CheckSimpleProps(p,False,True,0,False,False);
|
|
CheckWeigths(p,[$15F0,$0,$0]);
|
|
size := SizeOf(TUCA_PropItemRec) +
|
|
CalcWeigthSize([$15F0,$0,$0]);
|
|
Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
|
|
Check(p^.Size = size,'size(e)');
|
|
sizeTotal:= sizeTotal+size;
|
|
|
|
// for 'f'
|
|
p := PUCA_PropItemRec(PtrUInt(p)+size);
|
|
CheckSimpleProps(p,False,True,0,False,False);
|
|
CheckWeigths(p,[$15F1,$0,$0, $1,0,0]);
|
|
size := SizeOf(TUCA_PropItemRec) +
|
|
CalcWeigthSize([$15F1,$0,$0, $1,0,0]);
|
|
Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
|
|
Check(p^.Size = size,'size(f)');
|
|
sizeTotal:= sizeTotal+size;
|
|
|
|
Check(ABook.PropCount = sizeTotal,'size(total)');
|
|
end;
|
|
|
|
procedure test14_check_4(const ABook : unicodedata.TUCA_DataBook);
|
|
var
|
|
p : PUCA_PropItemRec;
|
|
size, sizeTotal, t, ctxSize: Integer;
|
|
ctx : PUCA_PropItemContextTreeRec;
|
|
ctxItem, ctxItemParent : PUCA_PropItemContextTreeNodeRec;
|
|
pb : PByte;
|
|
begin
|
|
sizeTotal := 0;
|
|
ctxSize := 0;
|
|
// for 'b'
|
|
p := ABook.Props;
|
|
pb := PByte(p);
|
|
size := 0;
|
|
CheckSimpleProps(p,True,True,0,True,False);
|
|
CheckWeigths(p,[]);
|
|
ctx := PUCA_PropItemContextTreeRec(PtrUInt(p)+SizeOf(TUCA_PropItemRec)+SizeOf(UInt24));
|
|
Check(ctx^.Size>0,'ctx^.Size');
|
|
ctxItem := PUCA_PropItemContextTreeNodeRec(PtrUInt(ctx)+SizeOf(ctx^.Size));
|
|
ctxItemParent := ctxItem;
|
|
Check(ctxItem<>nil,'ctxItem');
|
|
Check(ctxItem^.Left<>0,'ctxItem^.Left');
|
|
Check(ctxItem^.Right<>0,'ctxItem^.Right');
|
|
Check(ctxItem^.Data.CodePointCount=1,'ctxItem^.Data.CodePointCount');
|
|
Check(ctxItem^.Data.WeightCount=2,'ctxItem^.Data.WeightCount');
|
|
pb := PByte(PtrUInt(@ctxItem^.Data)+SizeOf(ctxItem^.Data));
|
|
Check(Cardinal(PUInt24(pb)^)=Ord('f'),'Context CodePoint');
|
|
pb := pb + (ctxItem^.Data.CodePointCount*SizeOf(UInt24));
|
|
CheckWeigths(PUCA_PropWeights(pb),ctxItem^.Data.WeightCount,[$15F1,$0,$1, $1,0,0]);
|
|
t := SizeOf(TUCA_PropItemContextTreeNodeRec) +
|
|
(ctxItem^.Data.CodePointCount*SizeOf(UInt24))+
|
|
(ctxItem^.Data.WeightCount*SizeOf(TUCA_PropWeights));
|
|
ctxSize := ctxSize+t;
|
|
|
|
Check(ctxItem^.Left = t,'ctxItem^.Left');
|
|
ctxItem := PUCA_PropItemContextTreeNodeRec(PtrUInt(ctxItem)+t);
|
|
Check(ctxItem^.Left=0,'ctxItem^.Left');
|
|
Check(ctxItem^.Right=0,'ctxItem^.Right');
|
|
Check(ctxItem^.Data.CodePointCount=1,'ctxItem^.Data.CodePointCount');
|
|
Check(ctxItem^.Data.WeightCount=1,'ctxItem^.Data.WeightCount');
|
|
pb := PByte(PtrUInt(@ctxItem^.Data)+SizeOf(ctxItem^.Data));
|
|
Check(Cardinal(PUInt24(pb)^)=Ord('a'),'Context CodePoint');
|
|
pb := pb + (ctxItem^.Data.CodePointCount*SizeOf(UInt24));
|
|
CheckWeigths(PUCA_PropWeights(pb),ctxItem^.Data.WeightCount,[$15EF,$120,$3]);
|
|
t := SizeOf(TUCA_PropItemContextTreeNodeRec) +
|
|
(ctxItem^.Data.CodePointCount*SizeOf(UInt24))+
|
|
(ctxItem^.Data.WeightCount*SizeOf(TUCA_PropWeights));
|
|
ctxSize := ctxSize+t;
|
|
|
|
ctxItem := PUCA_PropItemContextTreeNodeRec(PtrUInt(ctxItemParent)+ctxSize);
|
|
Check(ctxItem^.Left=0,'ctxItem^.Left');
|
|
Check(ctxItem^.Right=0,'ctxItem^.Right');
|
|
Check(ctxItem^.Data.CodePointCount=1,'ctxItem^.Data.CodePointCount');
|
|
Check(ctxItem^.Data.WeightCount=2,'ctxItem^.Data.WeightCount');
|
|
pb := PByte(PtrUInt(@ctxItem^.Data)+SizeOf(ctxItem^.Data));
|
|
Check(Cardinal(PUInt24(pb)^)=Ord('h'),'Context CodePoint');
|
|
pb := pb + (ctxItem^.Data.CodePointCount*SizeOf(UInt24));
|
|
CheckWeigths(PUCA_PropWeights(pb),ctxItem^.Data.WeightCount,[$15F1,$1,$1, $1,0,0]);
|
|
t := SizeOf(TUCA_PropItemContextTreeNodeRec) +
|
|
(ctxItem^.Data.CodePointCount*SizeOf(UInt24))+
|
|
(ctxItem^.Data.WeightCount*SizeOf(TUCA_PropWeights));
|
|
ctxSize := ctxSize+t;
|
|
|
|
ctxSize := ctxSize + SizeOf(TUCA_PropItemContextTreeRec.Size);
|
|
Check(ctx^.Size = ctxSize,'ctx^.Size');
|
|
size := SizeOf(TUCA_PropItemRec)+
|
|
SizeOf(UInt24){codepoint}+
|
|
ctxSize;
|
|
Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
|
|
sizeTotal:= sizeTotal+size;
|
|
|
|
// for 'e'
|
|
p := PUCA_PropItemRec(PtrUInt(p)+size);
|
|
CheckSimpleProps(p,False,True,0,False,False);
|
|
CheckWeigths(p,[$15F0,$0,$0]);
|
|
size := SizeOf(TUCA_PropItemRec) +
|
|
CalcWeigthSize([$15F0,$0,$0]);
|
|
Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
|
|
Check(p^.Size = size,'size(e)');
|
|
sizeTotal:= sizeTotal+size;
|
|
|
|
// for 'f'
|
|
p := PUCA_PropItemRec(PtrUInt(p)+size);
|
|
CheckSimpleProps(p,False,True,0,False,False);
|
|
CheckWeigths(p,[$15F1,$0,$0, $1,0,0]);
|
|
size := SizeOf(TUCA_PropItemRec) +
|
|
CalcWeigthSize([$15F1,$0,$0, $1,0,0]);
|
|
Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
|
|
Check(p^.Size = size,'size(f)');
|
|
sizeTotal:= sizeTotal+size;
|
|
|
|
// for 'g'
|
|
p := PUCA_PropItemRec(PtrUInt(p)+size);
|
|
CheckSimpleProps(p,False,True,0,False,False);
|
|
CheckWeigths(p,[$15F1,$0,$2, $1,0,0]);
|
|
size := SizeOf(TUCA_PropItemRec) +
|
|
CalcWeigthSize([$15F1,$0,$2, $1,0,0]);
|
|
Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
|
|
Check(p^.Size = size,'size(g)');
|
|
sizeTotal:= sizeTotal+size;
|
|
|
|
// for 'h'
|
|
p := PUCA_PropItemRec(PtrUInt(p)+size);
|
|
CheckSimpleProps(p,False,True,0,False,False);
|
|
CheckWeigths(p,[$15F1,$1,$0, $1,0,0]);
|
|
size := SizeOf(TUCA_PropItemRec) +
|
|
CalcWeigthSize([$15F1,$1,$0, $1,0,0]);
|
|
Check(p^.GetSelfOnlySize() = size,'GetSelfOnlySize');
|
|
Check(p^.Size = size,'size(h)');
|
|
sizeTotal:= sizeTotal+size;
|
|
|
|
Check(ABook.PropCount = sizeTotal,'size(total)');
|
|
end;
|
|
|
|
procedure test14();
|
|
var
|
|
sequence, sequenceClean : TOrderedCharacters;
|
|
statement : TReorderSequence;
|
|
wfirst, wresult : TUCA_LineRecArray;
|
|
unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
|
|
begin
|
|
statement.Clear();
|
|
test12_prepareWeigth(wfirst);
|
|
test12_PopulateSequence(sequenceClean);
|
|
|
|
WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
|
|
WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
|
|
//Generate the original tables
|
|
ConstructUnicodeBook(wfirst,'test','first',nil,unicodeBook1);
|
|
|
|
// --- test 1
|
|
sequence := sequenceClean.Clone();
|
|
statement.Clear();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('a');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('a')],TReorderWeigthKind.Tertiary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn(' Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
//Generate updatet tables
|
|
ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
|
|
test14_check_1(unicodeBook2);
|
|
WriteLn(' -- test 1 - ok');
|
|
WriteLn;
|
|
|
|
// --- test 2
|
|
sequence := sequenceClean.Clone();
|
|
statement.Clear();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('a');
|
|
SetLength(statement.Elements,2);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('a')],TReorderWeigthKind.Tertiary,0);
|
|
statement.Elements[1] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn(' Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
//Generate updatet tables
|
|
ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
|
|
test14_check_2(unicodeBook2);
|
|
WriteLn(' -- test 2 - ok');
|
|
WriteLn;
|
|
|
|
// --- test 3
|
|
sequence := sequenceClean.Clone();
|
|
statement.Clear();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('a');
|
|
SetLength(statement.Elements,2);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,0);
|
|
statement.Elements[1] := TReorderUnit.From(Ord('f'),TReorderWeigthKind.Primary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
statement.Clear();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('a');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('a')],TReorderWeigthKind.Tertiary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
statement.Clear();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('f');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('f')],TReorderWeigthKind.Tertiary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
|
|
WriteLn(' Statement #3 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
//Generate updatet tables
|
|
ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
|
|
test14_check_3(unicodeBook2);
|
|
WriteLn(' -- test 3 - ok');
|
|
WriteLn;
|
|
|
|
// --- test 4
|
|
sequence := sequenceClean.Clone();
|
|
statement.Clear();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('a');
|
|
SetLength(statement.Elements,4);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,0);
|
|
statement.Elements[1] := TReorderUnit.From(Ord('f'),TReorderWeigthKind.Primary,0);
|
|
statement.Elements[2] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Tertiary,0);
|
|
statement.Elements[3] := TReorderUnit.From(Ord('h'),TReorderWeigthKind.Secondary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
statement.Clear();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('f');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('f')],TReorderWeigthKind.Tertiary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
statement.Clear();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('a');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('a')],TReorderWeigthKind.Tertiary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
statement.Clear();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('h');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('h')],TReorderWeigthKind.Tertiary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
|
|
WriteLn(' Statement #4 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
//Generate updatet tables
|
|
ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
|
|
test14_check_4(unicodeBook2);
|
|
WriteLn(' -- test 4 - ok');
|
|
WriteLn;
|
|
end;
|
|
|
|
//------------------------------------------------------
|
|
|
|
procedure test15_prepareWeigth(var AData : TUCA_LineRecArray);
|
|
var
|
|
p : PUCA_LineRec;
|
|
begin
|
|
SetLength(AData,1);
|
|
p := @AData[Low(AData)];
|
|
p^.CodePoints := CodePointToArray(Ord('a'));
|
|
p^.Weights := ToWeight($15EF,$0120,$0002);
|
|
end;
|
|
|
|
procedure test15_PopulateSequence(var ASequence : TOrderedCharacters);
|
|
var
|
|
i : Integer;
|
|
begin
|
|
ASequence := TOrderedCharacters.Create();
|
|
ASequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
|
|
for i := 0 to ASequence.ActualLength - 1 do
|
|
ASequence.Data[i].Changed := False;
|
|
end;
|
|
|
|
function ConvertEndianFromNative(
|
|
const AData : Pointer;
|
|
const ADataLen : Integer
|
|
) : Boolean;
|
|
type
|
|
PUCA_PropItemRec = helper.PUCA_PropItemRec;
|
|
var
|
|
s : PUCA_PropItemRec;
|
|
x, y : array of Byte;
|
|
px, py : PUCA_PropItemRec;
|
|
begin
|
|
if (ADataLen <= 0) then
|
|
exit(True);
|
|
s := PUCA_PropItemRec(AData);
|
|
SetLength(x,ADataLen);
|
|
px := PUCA_PropItemRec(@x[0]);
|
|
ReverseFromNativeEndian(s,ADataLen,px);
|
|
|
|
SetLength(y,ADataLen);
|
|
py := PUCA_PropItemRec(@y[0]);
|
|
ReverseToNativeEndian(px,ADataLen,py);
|
|
Result := CompareMem(AData,@y[0],Length(x));
|
|
end;
|
|
|
|
procedure test15();
|
|
var
|
|
sequence, sequenceClean : TOrderedCharacters;
|
|
statement : TReorderSequence;
|
|
wfirst, wresult : TUCA_LineRecArray;
|
|
unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
|
|
begin
|
|
statement.Clear();
|
|
test12_prepareWeigth(wfirst);
|
|
test12_PopulateSequence(sequenceClean);
|
|
|
|
WriteLn(' Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequenceClean),sLineBreak);
|
|
WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
|
|
//Generate the original tables
|
|
ConstructUnicodeBook(wfirst,'test','first',nil,unicodeBook1);
|
|
|
|
// --- test 1
|
|
sequence := sequenceClean.Clone();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('a');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn(' Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
//Generate updatet tables
|
|
ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
|
|
Check(ConvertEndianFromNative(unicodeBook2.Props,unicodeBook2.PropCount),'Endian conversion failed.');
|
|
WriteLn(' -- test 1 - ok');
|
|
|
|
// --- test 2
|
|
sequence := sequenceClean.Clone();
|
|
statement.Clear();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('a');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('a')],TReorderWeigthKind.Tertiary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn(' Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
//Generate updatet tables
|
|
ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
|
|
Check(ConvertEndianFromNative(unicodeBook2.Props,unicodeBook2.PropCount),'Endian conversion failed.');
|
|
WriteLn(' -- test 2 - ok');
|
|
WriteLn;
|
|
|
|
// --- test 3
|
|
sequence := sequenceClean.Clone();
|
|
statement.Clear();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('a');
|
|
SetLength(statement.Elements,2);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('a')],TReorderWeigthKind.Tertiary,0);
|
|
statement.Elements[1] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn(' Statement #3 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
//Generate updatet tables
|
|
ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
|
|
Check(ConvertEndianFromNative(unicodeBook2.Props,unicodeBook2.PropCount),'Endian conversion failed.');
|
|
WriteLn(' -- test 3 - ok');
|
|
WriteLn;
|
|
|
|
// --- test 4
|
|
sequence := sequenceClean.Clone();
|
|
statement.Clear();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('a');
|
|
SetLength(statement.Elements,2);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,0);
|
|
statement.Elements[1] := TReorderUnit.From(Ord('f'),TReorderWeigthKind.Primary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
statement.Clear();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('a');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('a')],TReorderWeigthKind.Tertiary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
statement.Clear();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('f');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('f')],TReorderWeigthKind.Tertiary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn(' Statement #4 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
//Generate updatet tables
|
|
ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
|
|
Check(ConvertEndianFromNative(unicodeBook2.Props,unicodeBook2.PropCount),'Endian conversion failed.');
|
|
WriteLn(' -- test 4 - ok');
|
|
WriteLn;
|
|
|
|
// --- test 5
|
|
sequence := sequenceClean.Clone();
|
|
statement.Clear();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('a');
|
|
SetLength(statement.Elements,4);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,0);
|
|
statement.Elements[1] := TReorderUnit.From(Ord('f'),TReorderWeigthKind.Primary,0);
|
|
statement.Elements[2] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Tertiary,0);
|
|
statement.Elements[3] := TReorderUnit.From(Ord('h'),TReorderWeigthKind.Secondary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
statement.Clear();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('f');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('f')],TReorderWeigthKind.Tertiary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
statement.Clear();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('a');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('a')],TReorderWeigthKind.Tertiary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
statement.Clear();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('h');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('b'),[Ord('h')],TReorderWeigthKind.Tertiary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
|
|
WriteLn(' Statement #5 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
//Generate updatet tables
|
|
ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
|
|
Check(ConvertEndianFromNative(unicodeBook2.Props,unicodeBook2.PropCount),'Endian conversion failed.');
|
|
WriteLn(' -- test 5 - ok');
|
|
WriteLn;
|
|
|
|
// --- test 6
|
|
sequence := sequenceClean.Clone();
|
|
statement.Clear();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('a');
|
|
SetLength(statement.Elements,2);
|
|
statement.Elements[0] := TReorderUnit.From([Ord('a'),Ord('d')],[Ord('a')],TReorderWeigthKind.Tertiary,0);
|
|
statement.Elements[1] := TReorderUnit.From([Ord('a'),Ord('d')],TReorderWeigthKind.Primary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn(' Statement #6 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
//Generate updatet tables
|
|
ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
|
|
Check(ConvertEndianFromNative(unicodeBook2.Props,unicodeBook2.PropCount),'Endian conversion failed.');
|
|
WriteLn(' -- test 6 - ok');
|
|
WriteLn;
|
|
|
|
// --- test 7
|
|
sequence := sequenceClean.Clone();
|
|
statement.Clear();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('a');
|
|
SetLength(statement.Elements,3);
|
|
statement.Elements[0] := TReorderUnit.From([Ord('a'),Ord('d')],[Ord('a')],TReorderWeigthKind.Tertiary,0);
|
|
statement.Elements[1] := TReorderUnit.From([Ord('a'),Ord('d')],TReorderWeigthKind.Primary,0);
|
|
statement.Elements[2] := TReorderUnit.From(Ord('e'),[Ord('a'),Ord('d')],TReorderWeigthKind.Identity,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn(' Statement #7 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
//Generate updatet tables
|
|
ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
|
|
Check(ConvertEndianFromNative(unicodeBook2.Props,unicodeBook2.PropCount),'Endian conversion failed.');
|
|
WriteLn(' -- test 7 - ok');
|
|
WriteLn;
|
|
|
|
// --- test 8
|
|
sequence := sequenceClean.Clone();
|
|
statement.Clear();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('a');
|
|
SetLength(statement.Elements,3);
|
|
statement.Elements[0] := TReorderUnit.From([Ord('a'),Ord('d')],[Ord('a')],TReorderWeigthKind.Tertiary,0);
|
|
statement.Elements[1] := TReorderUnit.From([Ord('a'),Ord('x')],TReorderWeigthKind.Primary,0);
|
|
statement.Elements[2] := TReorderUnit.From([Ord('e'),Ord('a'),Ord('r')],[Ord('a'),Ord('d')],TReorderWeigthKind.Primary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn(' Statement #8 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
//Generate updatet tables
|
|
ConstructUnicodeBook(wresult,'test','second',@unicodeBook1,unicodeBook2);
|
|
Check(ConvertEndianFromNative(unicodeBook2.Props,unicodeBook2.PropCount),'Endian conversion failed.');
|
|
WriteLn(' -- test 8 - ok');
|
|
WriteLn;
|
|
|
|
end;
|
|
|
|
procedure test16_prepareWeigth(var AData : TUCA_LineRecArray);
|
|
var
|
|
p : PUCA_LineRec;
|
|
begin
|
|
SetLength(AData,3);
|
|
p := @AData[Low(AData)];
|
|
p^.CodePoints := CodePointToArray(Ord('a'));
|
|
p^.Weights := ToWeight($15EF,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('b'));
|
|
p^.Weights := ToWeight($1605,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('c'));
|
|
p^.Weights := ToWeight($161D,$0020,$0002);
|
|
end;
|
|
|
|
procedure test16a();
|
|
var
|
|
sequence : TOrderedCharacters;
|
|
statement : TReorderSequence;
|
|
wfirst, wresult : TUCA_LineRecArray;
|
|
i : Integer;
|
|
unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
|
|
begin
|
|
statement.Clear();
|
|
test16_prepareWeigth(wfirst);
|
|
sequence := TOrderedCharacters.Create();
|
|
sequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
|
|
sequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
|
|
sequence.Append(TReorderUnit.From(TReorderLogicalReset.LastRegular));
|
|
sequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,3));
|
|
for i := 0 to sequence.ActualLength - 1 do
|
|
sequence.Data[i].Changed := False;
|
|
WriteLn('Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
|
|
ConstructUnicodeBook(wfirst,'test1','first',nil,unicodeBook1);
|
|
CheckInf(['a','b','c'],@unicodeBook1);
|
|
|
|
// --- test 1
|
|
SetLength(statement.Reset,1);
|
|
statement.LogicalPosition := TReorderLogicalReset.LastRegular;
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('x'),TReorderWeigthKind.Primary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn('Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
|
|
CheckInf(['a','b','x'{*},'c'],@unicodeBook2);
|
|
WriteLn(' -- test 1 - ok');
|
|
end;
|
|
|
|
procedure test16b();
|
|
var
|
|
sequence : TOrderedCharacters;
|
|
statement : TReorderSequence;
|
|
wfirst, wresult : TUCA_LineRecArray;
|
|
i : Integer;
|
|
unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
|
|
begin
|
|
statement.Clear();
|
|
test16_prepareWeigth(wfirst);
|
|
sequence := TOrderedCharacters.Create();
|
|
sequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
|
|
sequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
|
|
sequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,3));
|
|
for i := 0 to sequence.ActualLength - 1 do
|
|
sequence.Data[i].Changed := False;
|
|
WriteLn('Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
|
|
ConstructUnicodeBook(wfirst,'test1','first',nil,unicodeBook1);
|
|
CheckInf(['a','b','c'],@unicodeBook1);
|
|
|
|
// --- test 1
|
|
SetLength(statement.Reset,1);
|
|
statement.LogicalPosition := TReorderLogicalReset.LastRegular;
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('x'),TReorderWeigthKind.Primary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn('Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
|
|
CheckInf(['a','b','c','x'{*}],@unicodeBook2);
|
|
WriteLn(' -- test 1 - ok');
|
|
writeln;
|
|
writeln;
|
|
|
|
// test 2
|
|
statement.Clear();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('x');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('y'),TReorderWeigthKind.Primary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn('Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
ConstructUnicodeBook(wresult,'test2','2',@unicodeBook1,unicodeBook2);
|
|
CheckInf(['a','b','c','x'{*},'y'{*}],@unicodeBook2);
|
|
WriteLn(' -- test 2 - ok');
|
|
end;
|
|
|
|
procedure test16c();
|
|
var
|
|
sequence : TOrderedCharacters;
|
|
statement : TReorderSequence;
|
|
wfirst, wresult : TUCA_LineRecArray;
|
|
i : Integer;
|
|
unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
|
|
begin
|
|
statement.Clear();
|
|
test16_prepareWeigth(wfirst);
|
|
sequence := TOrderedCharacters.Create();
|
|
sequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
|
|
sequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
|
|
sequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,3));
|
|
for i := 0 to sequence.ActualLength - 1 do
|
|
sequence.Data[i].Changed := False;
|
|
WriteLn('Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
|
|
ConstructUnicodeBook(wfirst,'test1','first',nil,unicodeBook1);
|
|
CheckInf(['a','b','c'],@unicodeBook1);
|
|
|
|
// --- test 1
|
|
SetLength(statement.Reset,1);
|
|
statement.LogicalPosition := TReorderLogicalReset.LastRegular;
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('x'),TReorderWeigthKind.Secondary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn('Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
|
|
CheckInf(['a','b','c','x'{*}],@unicodeBook2);
|
|
WriteLn(' -- test 1 - ok');
|
|
writeln;
|
|
writeln;
|
|
|
|
// test 2
|
|
statement.Clear();
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('x');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('y'),TReorderWeigthKind.Primary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn('Statement #2 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
ConstructUnicodeBook(wresult,'test2','2',@unicodeBook1,unicodeBook2);
|
|
CheckInf(['a','b','c','x'{*},'y'{*}],@unicodeBook2);
|
|
WriteLn(' -- test 2 - ok');
|
|
end;
|
|
|
|
procedure test16d();
|
|
var
|
|
sequence : TOrderedCharacters;
|
|
statement : TReorderSequence;
|
|
wfirst, wresult : TUCA_LineRecArray;
|
|
i : Integer;
|
|
unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
|
|
begin
|
|
statement.Clear();
|
|
test16_prepareWeigth(wfirst);
|
|
sequence := TOrderedCharacters.Create();
|
|
sequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
|
|
sequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
|
|
sequence.Append(TReorderUnit.From(TReorderLogicalReset.LastRegular));
|
|
sequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,3));
|
|
for i := 0 to sequence.ActualLength - 1 do
|
|
sequence.Data[i].Changed := False;
|
|
WriteLn('Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
|
|
ConstructUnicodeBook(wfirst,'test1','first',nil,unicodeBook1);
|
|
CheckInf(['a','b','c'],@unicodeBook1);
|
|
|
|
// --- test 1
|
|
SetLength(statement.Reset,1);
|
|
statement.LogicalPosition := TReorderLogicalReset.LastRegular;
|
|
statement.Before := True;
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('x'),TReorderWeigthKind.Primary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn('Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
|
|
CheckInf(['a','x'{*},'b','c'],@unicodeBook2);
|
|
WriteLn(' -- test 1 - ok');
|
|
end;
|
|
|
|
procedure test16e_prepareWeigth(var AData : TUCA_LineRecArray);
|
|
var
|
|
p : PUCA_LineRec;
|
|
begin
|
|
SetLength(AData,5);
|
|
p := @AData[Low(AData)];
|
|
p^.CodePoints := CodePointToArray(Ord('a'));
|
|
p^.Weights := ToWeight(1,10,10);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('b'));
|
|
p^.Weights := ToWeight(2,10,10);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray([Ord('b'),Ord('2')]);
|
|
p^.Weights := ToWeight(2,20,10);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray([Ord('b'),Ord('3')]);
|
|
p^.Weights := ToWeight(2,20,20);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('c'));
|
|
p^.Weights := ToWeight(3,10,10);
|
|
end;
|
|
|
|
procedure test16e();
|
|
var
|
|
sequence : TOrderedCharacters;
|
|
statement : TReorderSequence;
|
|
wfirst, wresult : TUCA_LineRecArray;
|
|
i : Integer;
|
|
unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
|
|
begin
|
|
statement.Clear();
|
|
test16e_prepareWeigth(wfirst);
|
|
sequence := TOrderedCharacters.Create();
|
|
sequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
|
|
sequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
|
|
sequence.Append(TReorderUnit.From([Ord('b'),Ord('2')],TReorderWeigthKind.Secondary,3));
|
|
sequence.Append(TReorderUnit.From([Ord('b'),Ord('3')],TReorderWeigthKind.Tertiary,4));
|
|
sequence.Append(TReorderUnit.From(TReorderLogicalReset.LastRegular));
|
|
sequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,5));
|
|
for i := 0 to sequence.ActualLength - 1 do
|
|
sequence.Data[i].Changed := False;
|
|
WriteLn('Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
|
|
ConstructUnicodeBook(wfirst,'test1','first',nil,unicodeBook1);
|
|
CheckInf(['a','b','b2','b3','c'],@unicodeBook1);
|
|
|
|
// --- test 1
|
|
SetLength(statement.Reset,1);
|
|
statement.LogicalPosition := TReorderLogicalReset.LastRegular;
|
|
statement.Before := True;
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('x'),TReorderWeigthKind.Secondary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn('Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
|
|
CheckInf(['a','b','x'{*},'b2','b3','c'],@unicodeBook2);
|
|
WriteLn(' -- test 1 - ok');
|
|
end;
|
|
|
|
procedure test17a_prepareWeigth(var AData : TUCA_LineRecArray);
|
|
var
|
|
p : PUCA_LineRec;
|
|
begin
|
|
SetLength(AData,3);
|
|
p := @AData[Low(AData)];
|
|
p^.CodePoints := CodePointToArray(Ord('a'));
|
|
p^.Weights := ToWeight($15EF,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('b'));
|
|
p^.Weights := ToWeight([$1605,$0020,$0002, $17FE,$0300,$0400]);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('c'));
|
|
p^.Weights := ToWeight($161D,$0020,$0002);
|
|
end;
|
|
|
|
procedure test17a();
|
|
var
|
|
sequence : TOrderedCharacters;
|
|
statement : TReorderSequence;
|
|
wfirst, wresult : TUCA_LineRecArray;
|
|
i : Integer;
|
|
unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
|
|
begin
|
|
// test17* are about "Weights" generation
|
|
statement.Clear();
|
|
test17a_prepareWeigth(wfirst);
|
|
sequence := TOrderedCharacters.Create();
|
|
sequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
|
|
sequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
|
|
sequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,3));
|
|
for i := 0 to sequence.ActualLength - 1 do
|
|
sequence.Data[i].Changed := False;
|
|
WriteLn('Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
|
|
ConstructUnicodeBook(wfirst,'test1','first',nil,unicodeBook1);
|
|
CheckInf(['a','b','c'],@unicodeBook1);
|
|
|
|
// --- test 1
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('b');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('x'),TReorderWeigthKind.Primary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn('Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
|
|
CheckInf(['a','b','x'{*},'c'],@unicodeBook2);
|
|
WriteLn(' -- test 1 - ok');
|
|
end;
|
|
|
|
procedure test17b_prepareWeigth(var AData : TUCA_LineRecArray);
|
|
var
|
|
p : PUCA_LineRec;
|
|
begin
|
|
SetLength(AData,3);
|
|
p := @AData[Low(AData)];
|
|
p^.CodePoints := CodePointToArray(Ord('a'));
|
|
p^.Weights := ToWeight($15EF,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('b'));
|
|
p^.Weights := ToWeight([$1605,$0020,$0002]);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('c'));
|
|
p^.Weights := ToWeight($1606,$0020,$0002);
|
|
end;
|
|
|
|
procedure test17b();
|
|
var
|
|
sequence : TOrderedCharacters;
|
|
statement : TReorderSequence;
|
|
wfirst, wresult : TUCA_LineRecArray;
|
|
i : Integer;
|
|
unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
|
|
begin
|
|
// test17* are about "Weights" generation
|
|
statement.Clear();
|
|
test17b_prepareWeigth(wfirst);
|
|
sequence := TOrderedCharacters.Create();
|
|
sequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
|
|
sequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
|
|
sequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,3));
|
|
for i := 0 to sequence.ActualLength - 1 do
|
|
sequence.Data[i].Changed := False;
|
|
WriteLn('Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
|
|
ConstructUnicodeBook(wfirst,'test1','first',nil,unicodeBook1);
|
|
CheckInf(['a','b','c'],@unicodeBook1);
|
|
|
|
// --- test 1
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('b');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('x'),TReorderWeigthKind.Primary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn('Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
|
|
CheckInf(['a','b','x'{*},'c'],@unicodeBook2);
|
|
WriteLn(' -- test 1 - ok');
|
|
end;
|
|
|
|
procedure test17c_prepareWeigth(var AData : TUCA_LineRecArray);
|
|
var
|
|
p : PUCA_LineRec;
|
|
begin
|
|
SetLength(AData,3);
|
|
p := @AData[Low(AData)];
|
|
p^.CodePoints := CodePointToArray(Ord('a'));
|
|
p^.Weights := ToWeight($15EF,$0020,$0002);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('b'));
|
|
p^.Weights := ToWeight([$1605,$0020,$0002, $17FE,$0300,$0400]);
|
|
Inc(p);
|
|
p^.CodePoints := CodePointToArray(Ord('c'));
|
|
p^.Weights := ToWeight($1606,$0020,$0002);
|
|
end;
|
|
|
|
procedure test17c();
|
|
var
|
|
sequence : TOrderedCharacters;
|
|
statement : TReorderSequence;
|
|
wfirst, wresult : TUCA_LineRecArray;
|
|
i : Integer;
|
|
unicodeBook1, unicodeBook2 : unicodedata.TUCA_DataBook;
|
|
begin
|
|
// test17* are about "Weights" generation
|
|
statement.Clear();
|
|
test17c_prepareWeigth(wfirst);
|
|
sequence := TOrderedCharacters.Create();
|
|
sequence.Append(TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,1));
|
|
sequence.Append(TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,2));
|
|
sequence.Append(TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,3));
|
|
for i := 0 to sequence.ActualLength - 1 do
|
|
sequence.Data[i].Changed := False;
|
|
WriteLn('Initial = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
WriteLn(DumpLines(wfirst),sLineBreak+sLineBreak);
|
|
ConstructUnicodeBook(wfirst,'test1','first',nil,unicodeBook1);
|
|
CheckInf(['a','b','c'],@unicodeBook1);
|
|
|
|
// --- test 1
|
|
SetLength(statement.Reset,1);
|
|
statement.Reset[0] := Ord('b');
|
|
SetLength(statement.Elements,1);
|
|
statement.Elements[0] := TReorderUnit.From(Ord('x'),TReorderWeigthKind.Primary,0);
|
|
sequence.ApplyStatement(@statement);
|
|
WriteLn('Statement #1 = ',sLineBreak,' ',DumpSequenceAnsi(sequence),sLineBreak);
|
|
wresult := nil;
|
|
ComputeWeigths(@sequence.Data[0],sequence.ActualLength,wfirst,wresult);
|
|
WriteLn(DumpLines(wresult),sLineBreak+sLineBreak);
|
|
ConstructUnicodeBook(wresult,'test1','1',@unicodeBook1,unicodeBook2);
|
|
CheckInf(['a','b','x'{*},'c'],@unicodeBook2);
|
|
WriteLn(' -- test 1 - ok');
|
|
end;
|
|
|
|
procedure CheckEqual(A,B : array of TUnicodeCodePoint; const AMsg : string);overload;
|
|
var
|
|
i : Integer;
|
|
begin
|
|
Check((Length(A)=Length(B)),'Length() <>');
|
|
if (Length(A) > 0) then begin
|
|
for i := Low(A) to High(A) do
|
|
Check(A[i] = B[i],'%s, A[%d] <>',[AMsg,i]);
|
|
end;
|
|
end;
|
|
|
|
procedure CheckEqual(A,B : TReorderUnit; const AMsg : string);overload;
|
|
var
|
|
i : Integer;
|
|
begin
|
|
Check((A.VirtualPosition=B.VirtualPosition),'VirtualPosition <>');
|
|
Check((A.InitialPosition=B.InitialPosition),'InitialPosition <>');
|
|
Check((A.Changed=B.Changed),'Changed <>');
|
|
Check((A.WeigthKind=B.WeigthKind),'WeigthKind <>');
|
|
CheckEqual(A.Context,B.Context,'Context');
|
|
CheckEqual(A.ExpansionChars,B.ExpansionChars,'ExpansionChars');
|
|
CheckEqual(A.Characters,B.Characters,'Characters');
|
|
CheckEqual(A.Context,B.Context,'Context');
|
|
end;
|
|
|
|
procedure CheckEqual(A,B : TReorderSequence);overload;
|
|
var
|
|
i : Integer;
|
|
begin
|
|
Check((A.LogicalPosition=B.LogicalPosition),'LogicalPosition <>');
|
|
Check((A.Before=B.Before),'Before <>');
|
|
CheckEqual(A.Reset,B.Reset,'Reset');
|
|
Check((Length(A.Elements)=Length(B.Elements)),'Length(Elements) <>');
|
|
for i := Low(A.Elements) to High(A.Elements) do
|
|
CheckEqual(A.Elements[i],B.Elements[i],Format('Elements[%d]',[i]));
|
|
end;
|
|
|
|
procedure CheckEqual(AActual, AExpected : UTF8String; const AMsg : string);overload;
|
|
begin
|
|
Check(
|
|
(AActual=AExpected),
|
|
Format('%s, Expected "%s" Found "%s".',[AMsg,AExpected,AActual])
|
|
);
|
|
end;
|
|
|
|
procedure CheckEqual(AActual, AExpected : TSettingRec);overload;
|
|
var
|
|
i : Integer;
|
|
begin
|
|
CheckEqual(AActual.Name,AExpected.Name,'Name');
|
|
Check((AActual.OptionValue=AExpected.OptionValue),'OptionValue <>');
|
|
Check((Length(AActual.Values)=Length(AExpected.Values)),'Length(Values) <>');
|
|
for i := Low(AActual.Values) to High(AExpected.Values) do
|
|
CheckEqual(AActual.Values[i],AExpected.Values[i],Format('Values[%d]',[i]));
|
|
end;
|
|
|
|
function CountLines(const AStr : ansistring) : Integer;
|
|
var
|
|
c, i : Integer;
|
|
begin
|
|
c := 0;
|
|
for i := 1 to Length(AStr) do begin
|
|
if (AStr[i] = #10) then
|
|
c := c+1;
|
|
end;
|
|
if (c = 0) and (AStr <> '') then
|
|
c := c+1;
|
|
Result := c;
|
|
end;
|
|
|
|
procedure do_test_parser(
|
|
AText : ansistring;
|
|
const AExpected : TReorderSequence;
|
|
const ALineCount : Integer
|
|
);overload;
|
|
var
|
|
locText : UTF8String;
|
|
locTextPointer : PAnsiChar;
|
|
locStartPosition,
|
|
locMaxLen : Integer;
|
|
locStatement : TParsedStatement;
|
|
locNextPos,
|
|
locLineCount : Integer;
|
|
begin
|
|
locText := AText;
|
|
WriteLn('Parsing "',locText,'" ...');
|
|
locTextPointer := @locText[1];
|
|
locMaxLen := Length(locText);
|
|
locStartPosition := 0;
|
|
locNextPos := 0;
|
|
locLineCount := 0;
|
|
Clear(locStatement);
|
|
Check(
|
|
ParseStatement(
|
|
locTextPointer,locStartPosition,locMaxLen,@locStatement,locNextPos,locLineCount
|
|
),
|
|
'Fail to Parse : "%s".', [locText]
|
|
);
|
|
Check((locStatement.Kind=TStatementKind.Sequence),'Fail to Parse(StatementKind) : "%s".', [locText]);
|
|
if (locLineCount > 1) then
|
|
WriteLn;
|
|
WriteLn(' Next Position : ',locNextPos);
|
|
WriteLn(' Line Count : ',locLineCount);
|
|
if (CountLines(locText) = 1) then
|
|
Check((locNextPos>=locMaxLen),'Next Position');
|
|
if (ALineCount > 0) then
|
|
Check((locLineCount=ALineCount),'Line Count');
|
|
CheckEqual(locStatement.ReorderSequence,AExpected);
|
|
|
|
WriteLn(' -- test ok');
|
|
end;
|
|
|
|
procedure do_test_parser(AText : ansistring; const AExpected : TReorderSequence);inline;overload;
|
|
begin
|
|
do_test_parser(AText,AExpected,1);
|
|
end;
|
|
|
|
procedure do_test_parser_for_setting(
|
|
AText : ansistring;
|
|
const ASettingName : UTF8String;
|
|
const ASettingValues : array of UTF8String;
|
|
const AOption : TSettingOption;
|
|
const ALineCount : Integer
|
|
);overload;
|
|
var
|
|
locText : UTF8String;
|
|
locTextPointer : PAnsiChar;
|
|
locStartPosition,
|
|
locMaxLen : Integer;
|
|
locStatement : TParsedStatement;
|
|
locNextPos,
|
|
locLineCount, i : Integer;
|
|
begin
|
|
locText := AText;
|
|
WriteLn('Parsing "',locText,'" ...');
|
|
locTextPointer := @locText[1];
|
|
locMaxLen := Length(locText);
|
|
locStartPosition := 0;
|
|
locNextPos := 0;
|
|
locLineCount := 0;
|
|
Clear(locStatement);
|
|
Check(
|
|
ParseStatement(
|
|
locTextPointer,locStartPosition,locMaxLen,@locStatement,locNextPos,locLineCount
|
|
),
|
|
'Fail to Parse : "%s".', [locText]
|
|
);
|
|
Check((locStatement.Kind=TStatementKind.Setting),'Fail to Parse(StatementKind) : "%s".', [locText]);
|
|
if (locLineCount > 1) then
|
|
WriteLn;
|
|
WriteLn(' Next Position : ',locNextPos);
|
|
WriteLn(' Line Count : ',locLineCount);
|
|
if (CountLines(locText) = 1) then
|
|
Check((locNextPos>=locMaxLen),'Next Position');
|
|
if (ALineCount > 0) then
|
|
Check((locLineCount=ALineCount),'Line Count');
|
|
CheckEqual(locStatement.Setting.Name,ASettingName,'Setting Name');
|
|
Check((Length(locStatement.Setting.Values) = Length(ASettingValues)),'Values should not be empty');
|
|
for i := 0 to Length(ASettingValues)-1 do begin
|
|
CheckEqual(locStatement.Setting.Values[i],ASettingValues[i],'Setting Value');
|
|
end;
|
|
Check((locStatement.Setting.OptionValue = AOption),'Option');
|
|
|
|
WriteLn(' -- test ok');
|
|
end;
|
|
|
|
procedure do_test_parser_for_setting(
|
|
AText : ansistring;
|
|
const ASettingName : UTF8String;
|
|
const ASettingValue : UTF8String;
|
|
const AOption : TSettingOption
|
|
);inline;overload;
|
|
begin
|
|
do_test_parser_for_setting(AText,ASettingName,ASettingValue,AOption,1);
|
|
end;
|
|
|
|
procedure test_parser_1();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
locStatement.LogicalPosition := TReorderLogicalReset.LastTertiaryIgnorable;
|
|
locStatement.SetElementCount(1);
|
|
locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Identity,0);
|
|
do_test_parser('& [last tertiary ignorable] = a',locStatement);
|
|
end;
|
|
|
|
procedure do_test_parser_for_setting_multi(
|
|
AText : ansistring;
|
|
const ASettings : array of TSettingRec
|
|
);overload;
|
|
var
|
|
locText : UTF8String;
|
|
locTextPointer : PAnsiChar;
|
|
locStartPosition,
|
|
locMaxLen : Integer;
|
|
locStatement : TParsedStatement;
|
|
locNextPos,
|
|
locLineCount, i, k : Integer;
|
|
locStatements : TSettingRecArray;
|
|
begin
|
|
locText := AText;
|
|
WriteLn('Parsing "',locText,'" ...');
|
|
locTextPointer := @locText[1];
|
|
locMaxLen := Length(locText);
|
|
SetLength(locStatements,12);
|
|
locStartPosition := 0;
|
|
locNextPos := 0;
|
|
locLineCount := 0;
|
|
k := 0;
|
|
while (locStartPosition < locMaxLen) do begin
|
|
Clear(locStatement);
|
|
if not ParseStatement(
|
|
locTextPointer,locStartPosition,locMaxLen,@locStatement,
|
|
locNextPos,locLineCount
|
|
)
|
|
then begin
|
|
break;
|
|
end;
|
|
if (locStatement.Kind <> TStatementKind.Setting) then
|
|
break;
|
|
locStatements[k].Assign(@locStatement.Setting);
|
|
locStartPosition := locNextPos;
|
|
k := k+1;
|
|
if (k > Length(ASettings)) then
|
|
raise Exception.CreateFmt(
|
|
'%d Statements expected, more was parsed.',
|
|
[Length(ASettings)]
|
|
);
|
|
end;
|
|
Check((k=Length(ASettings)), 'Statement Count');
|
|
for i := 0 to Length(ASettings)-1 do begin
|
|
try
|
|
CheckEqual(locStatements[i],ASettings[i]);
|
|
except
|
|
WriteLn(Format(' Setting[%d] Fails',[i]));
|
|
raise;
|
|
end;
|
|
end;
|
|
|
|
WriteLn(' -- test ok');
|
|
end;
|
|
|
|
procedure test_parser_2();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
locStatement.LogicalPosition := TReorderLogicalReset.LastTertiaryIgnorable;
|
|
locStatement.SetElementCount(1);
|
|
locStatement.Elements[0] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,0);
|
|
do_test_parser('& [last tertiary ignorable] < b',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_3();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
locStatement.LogicalPosition := TReorderLogicalReset.LastTertiaryIgnorable;
|
|
locStatement.SetElementCount(1);
|
|
locStatement.Elements[0] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Secondary,0);
|
|
do_test_parser('& [last tertiary ignorable] << c',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_4();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
locStatement.LogicalPosition := TReorderLogicalReset.LastTertiaryIgnorable;
|
|
locStatement.SetElementCount(1);
|
|
locStatement.Elements[0] := TReorderUnit.From(Ord('d'),TReorderWeigthKind.Tertiary,0);
|
|
do_test_parser('& [last tertiary ignorable] <<< d',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_5();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
locStatement.LogicalPosition := TReorderLogicalReset.LastTertiaryIgnorable;
|
|
locStatement.SetElementCount(1);
|
|
locStatement.Elements[0] := TReorderUnit.From(1,TReorderWeigthKind.Primary,0);
|
|
do_test_parser('& [last tertiary ignorable] < ''\u0001''',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_6();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
locStatement.LogicalPosition := TReorderLogicalReset.LastTertiaryIgnorable;
|
|
locStatement.SetElementCount(1);
|
|
locStatement.Elements[0] := TReorderUnit.From(7,TReorderWeigthKind.Secondary,0);
|
|
do_test_parser('& [last tertiary ignorable] << ''\u0007''',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_7();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
locStatement.LogicalPosition := TReorderLogicalReset.LastTertiaryIgnorable;
|
|
locStatement.SetElementCount(1);
|
|
locStatement.Elements[0] := TReorderUnit.From(9,TReorderWeigthKind.Secondary,0);
|
|
do_test_parser('& [last tertiary ignorable] << ''\u0009''',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_8();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
locStatement.LogicalPosition := TReorderLogicalReset.LastTertiaryIgnorable;
|
|
locStatement.SetElementCount(1);
|
|
locStatement.Elements[0] := TReorderUnit.From($000110BD,TReorderWeigthKind.Primary,0);
|
|
do_test_parser('& [last tertiary ignorable] < ''\U000110BD''',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_9();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,1);
|
|
locStatement.Reset[0] := Ord('x');
|
|
locStatement.SetElementCount(1);
|
|
locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,0);
|
|
do_test_parser('&x < a',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_abreviating_1();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,1);
|
|
locStatement.Reset[0] := Ord('x');
|
|
locStatement.SetElementCount(3);
|
|
locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,0);
|
|
locStatement.Elements[1] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,0);
|
|
locStatement.Elements[2] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,0);
|
|
do_test_parser('&x <* abc',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_abreviating_2();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,1);
|
|
locStatement.Reset[0] := Ord('x');
|
|
locStatement.SetElementCount(7);
|
|
locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,0);
|
|
locStatement.Elements[1] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,0);
|
|
locStatement.Elements[2] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,0);
|
|
locStatement.Elements[3] := TReorderUnit.From(Ord('d'),TReorderWeigthKind.Primary,0);
|
|
locStatement.Elements[4] := TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,0);
|
|
locStatement.Elements[5] := TReorderUnit.From(Ord('f'),TReorderWeigthKind.Primary,0);
|
|
locStatement.Elements[6] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,0);
|
|
do_test_parser('&x <* abcd-g',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_abreviating_3();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,1);
|
|
locStatement.Reset[0] := Ord('x');
|
|
locStatement.SetElementCount(8);
|
|
locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,0);
|
|
locStatement.Elements[1] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,0);
|
|
locStatement.Elements[2] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,0);
|
|
locStatement.Elements[3] := TReorderUnit.From(Ord('d'),TReorderWeigthKind.Primary,0);
|
|
locStatement.Elements[4] := TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,0);
|
|
locStatement.Elements[5] := TReorderUnit.From(Ord('f'),TReorderWeigthKind.Primary,0);
|
|
locStatement.Elements[6] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,0);
|
|
locStatement.Elements[7] := TReorderUnit.From(Ord('p'),TReorderWeigthKind.Primary,0);
|
|
do_test_parser('&x <* abcd-gp',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_abreviating_4();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,1);
|
|
locStatement.Reset[0] := Ord('x');
|
|
locStatement.SetElementCount(11);
|
|
locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,0);
|
|
locStatement.Elements[1] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,0);
|
|
locStatement.Elements[2] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,0);
|
|
locStatement.Elements[3] := TReorderUnit.From(Ord('d'),TReorderWeigthKind.Primary,0);
|
|
locStatement.Elements[4] := TReorderUnit.From(Ord('e'),TReorderWeigthKind.Primary,0);
|
|
locStatement.Elements[5] := TReorderUnit.From(Ord('f'),TReorderWeigthKind.Primary,0);
|
|
locStatement.Elements[6] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Primary,0);
|
|
locStatement.Elements[7] := TReorderUnit.From(Ord('p'),TReorderWeigthKind.Primary,0);
|
|
locStatement.Elements[8] := TReorderUnit.From(Ord('q'),TReorderWeigthKind.Primary,0);
|
|
locStatement.Elements[9] := TReorderUnit.From(Ord('r'),TReorderWeigthKind.Primary,0);
|
|
locStatement.Elements[10] := TReorderUnit.From(Ord('s'),TReorderWeigthKind.Primary,0);
|
|
do_test_parser('&x <* abcd-gp-s',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_abreviating_5();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,1);
|
|
locStatement.Reset[0] := Ord('x');
|
|
locStatement.SetElementCount(3);
|
|
locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Secondary,0);
|
|
locStatement.Elements[1] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Secondary,0);
|
|
locStatement.Elements[2] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Secondary,0);
|
|
do_test_parser('&x <<* abc',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_abreviating_6();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,1);
|
|
locStatement.Reset[0] := Ord('x');
|
|
locStatement.SetElementCount(11);
|
|
locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Secondary,0);
|
|
locStatement.Elements[1] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Secondary,0);
|
|
locStatement.Elements[2] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Secondary,0);
|
|
locStatement.Elements[3] := TReorderUnit.From(Ord('d'),TReorderWeigthKind.Secondary,0);
|
|
locStatement.Elements[4] := TReorderUnit.From(Ord('e'),TReorderWeigthKind.Secondary,0);
|
|
locStatement.Elements[5] := TReorderUnit.From(Ord('f'),TReorderWeigthKind.Secondary,0);
|
|
locStatement.Elements[6] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Secondary,0);
|
|
locStatement.Elements[7] := TReorderUnit.From(Ord('p'),TReorderWeigthKind.Secondary,0);
|
|
locStatement.Elements[8] := TReorderUnit.From(Ord('q'),TReorderWeigthKind.Secondary,0);
|
|
locStatement.Elements[9] := TReorderUnit.From(Ord('r'),TReorderWeigthKind.Secondary,0);
|
|
locStatement.Elements[10] := TReorderUnit.From(Ord('s'),TReorderWeigthKind.Secondary,0);
|
|
do_test_parser('&x <<* abcd-gp-s',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_abreviating_7();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,1);
|
|
locStatement.Reset[0] := Ord('x');
|
|
locStatement.SetElementCount(3);
|
|
locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Tertiary,0);
|
|
locStatement.Elements[1] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Tertiary,0);
|
|
locStatement.Elements[2] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Tertiary,0);
|
|
do_test_parser('&x <<<* abc',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_abreviating_8();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,1);
|
|
locStatement.Reset[0] := Ord('x');
|
|
locStatement.SetElementCount(11);
|
|
locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Tertiary,0);
|
|
locStatement.Elements[1] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Tertiary,0);
|
|
locStatement.Elements[2] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Tertiary,0);
|
|
locStatement.Elements[3] := TReorderUnit.From(Ord('d'),TReorderWeigthKind.Tertiary,0);
|
|
locStatement.Elements[4] := TReorderUnit.From(Ord('e'),TReorderWeigthKind.Tertiary,0);
|
|
locStatement.Elements[5] := TReorderUnit.From(Ord('f'),TReorderWeigthKind.Tertiary,0);
|
|
locStatement.Elements[6] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Tertiary,0);
|
|
locStatement.Elements[7] := TReorderUnit.From(Ord('p'),TReorderWeigthKind.Tertiary,0);
|
|
locStatement.Elements[8] := TReorderUnit.From(Ord('q'),TReorderWeigthKind.Tertiary,0);
|
|
locStatement.Elements[9] := TReorderUnit.From(Ord('r'),TReorderWeigthKind.Tertiary,0);
|
|
locStatement.Elements[10] := TReorderUnit.From(Ord('s'),TReorderWeigthKind.Tertiary,0);
|
|
do_test_parser('&x <<<* abcd-gp-s',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_abreviating_9();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,1);
|
|
locStatement.Reset[0] := Ord('x');
|
|
locStatement.SetElementCount(3);
|
|
locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Identity,0);
|
|
locStatement.Elements[1] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Identity,0);
|
|
locStatement.Elements[2] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Identity,0);
|
|
do_test_parser('&x =* abc',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_abreviating_10();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,1);
|
|
locStatement.Reset[0] := Ord('x');
|
|
locStatement.SetElementCount(11);
|
|
locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Identity,0);
|
|
locStatement.Elements[1] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Identity,0);
|
|
locStatement.Elements[2] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Identity,0);
|
|
locStatement.Elements[3] := TReorderUnit.From(Ord('d'),TReorderWeigthKind.Identity,0);
|
|
locStatement.Elements[4] := TReorderUnit.From(Ord('e'),TReorderWeigthKind.Identity,0);
|
|
locStatement.Elements[5] := TReorderUnit.From(Ord('f'),TReorderWeigthKind.Identity,0);
|
|
locStatement.Elements[6] := TReorderUnit.From(Ord('g'),TReorderWeigthKind.Identity,0);
|
|
locStatement.Elements[7] := TReorderUnit.From(Ord('p'),TReorderWeigthKind.Identity,0);
|
|
locStatement.Elements[8] := TReorderUnit.From(Ord('q'),TReorderWeigthKind.Identity,0);
|
|
locStatement.Elements[9] := TReorderUnit.From(Ord('r'),TReorderWeigthKind.Identity,0);
|
|
locStatement.Elements[10] := TReorderUnit.From(Ord('s'),TReorderWeigthKind.Identity,0);
|
|
do_test_parser('&x =* abcd-gp-s',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_contraction_1();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,1);
|
|
locStatement.Reset[0] := Ord('k');
|
|
locStatement.SetElementCount(1);
|
|
locStatement.Elements[0] := TReorderUnit.From([Ord('c'),Ord('h')],TReorderWeigthKind.Primary,0);
|
|
do_test_parser('&k < ch',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_contraction_2();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,3);
|
|
locStatement.Reset[0] := Ord('a');
|
|
locStatement.Reset[1] := Ord('b');
|
|
locStatement.Reset[2] := Ord('c');
|
|
locStatement.SetElementCount(1);
|
|
locStatement.Elements[0] := TReorderUnit.From([Ord('c'),Ord('h')],TReorderWeigthKind.Primary,0);
|
|
do_test_parser('&abc < ch',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_expansion_1();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,1);
|
|
locStatement.Reset[0] := Ord('a');
|
|
locStatement.SetElementCount(1);
|
|
locStatement.Elements[0] := TReorderUnit.From(Ord('z'),TReorderWeigthKind.Primary,0);
|
|
locStatement.Elements[0].ExpansionChars := CodePointToArray(Ord('e'));
|
|
do_test_parser('&a < z/e',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_special_char_1();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,1);
|
|
locStatement.Reset[0] := Ord('x');
|
|
locStatement.SetElementCount(1);
|
|
locStatement.Elements[0] := TReorderUnit.From(Ord('/'),TReorderWeigthKind.Primary,0);
|
|
do_test_parser('&x < ''/''',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_special_char_2();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,1);
|
|
locStatement.Reset[0] := Ord('x');
|
|
locStatement.SetElementCount(1);
|
|
locStatement.Elements[0] := TReorderUnit.From(Ord('&'),TReorderWeigthKind.Primary,0);
|
|
do_test_parser('&x < ''&''',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_special_char_3();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,1);
|
|
locStatement.Reset[0] := Ord('x');
|
|
locStatement.SetElementCount(1);
|
|
locStatement.Elements[0] := TReorderUnit.From(Ord('<'),TReorderWeigthKind.Primary,0);
|
|
do_test_parser('&x < ''<''',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_special_char_4();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,1);
|
|
locStatement.Reset[0] := Ord('x');
|
|
locStatement.SetElementCount(1);
|
|
locStatement.Elements[0] := TReorderUnit.From(Ord('|'),TReorderWeigthKind.Primary,0);
|
|
do_test_parser('&x < ''|''',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_special_char_5();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,1);
|
|
locStatement.Reset[0] := Ord('x');
|
|
locStatement.SetElementCount(1);
|
|
locStatement.Elements[0] := TReorderUnit.From(Ord('*'),TReorderWeigthKind.Primary,0);
|
|
do_test_parser('&x < ''*''',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_special_char_6();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,1);
|
|
locStatement.Reset[0] := Ord('x');
|
|
locStatement.SetElementCount(1);
|
|
locStatement.Elements[0] := TReorderUnit.From(Ord('['),TReorderWeigthKind.Primary,0);
|
|
do_test_parser('&x < ''[''',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_special_char_7();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,1);
|
|
locStatement.Reset[0] := Ord('x');
|
|
locStatement.SetElementCount(1);
|
|
locStatement.Elements[0] := TReorderUnit.From(Ord(']'),TReorderWeigthKind.Primary,0);
|
|
do_test_parser('&x < '']''',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_special_char_8();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,1);
|
|
locStatement.Reset[0] := Ord('[');
|
|
locStatement.SetElementCount(1);
|
|
locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Identity,0);
|
|
do_test_parser('&''[''=a',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_special_char_9();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,1);
|
|
locStatement.Reset[0] := Ord('\');
|
|
locStatement.SetElementCount(1);
|
|
locStatement.Elements[0] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Identity,0);
|
|
do_test_parser('&''\\''=c',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_skip_comment_1();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,1);
|
|
locStatement.Reset[0] := Ord('x');
|
|
locStatement.SetElementCount(1);
|
|
locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,0);
|
|
do_test_parser(
|
|
'&x #' + sLineBreak +
|
|
' < a',
|
|
locStatement, 2
|
|
);
|
|
end;
|
|
|
|
procedure test_parser_skip_comment_2();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,1);
|
|
locStatement.Reset[0] := Ord('x');
|
|
locStatement.SetElementCount(1);
|
|
locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,0);
|
|
do_test_parser(
|
|
'&x # hello' + sLineBreak +
|
|
' < a',
|
|
locStatement, 2
|
|
);
|
|
end;
|
|
|
|
procedure test_parser_skip_comment_3();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,1);
|
|
locStatement.Reset[0] := Ord('x');
|
|
locStatement.SetElementCount(1);
|
|
locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,0);
|
|
do_test_parser(
|
|
'&x # hello' + sLineBreak +
|
|
sLineBreak +
|
|
#9#9' ' + sLineBreak +
|
|
' < a',
|
|
locStatement, 4
|
|
);
|
|
end;
|
|
|
|
procedure test_parser_quoted_string_1();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,1);
|
|
locStatement.Reset[0] := Ord('x');
|
|
locStatement.SetElementCount(1);
|
|
locStatement.Elements[0] :=
|
|
TReorderUnit.From(
|
|
[Ord('<'),Ord('#'),Ord('|'),Ord('/'),Ord('!')],
|
|
TReorderWeigthKind.Primary,0
|
|
);
|
|
do_test_parser('&x < ''<#|/!''',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_quoted_string_2();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,1);
|
|
locStatement.Reset[0] := Ord('x');
|
|
locStatement.SetElementCount(1);
|
|
locStatement.Elements[0] :=
|
|
TReorderUnit.From(
|
|
[Ord('<'),Ord('#'),Ord('|'),Ord('/'),Ord('!'),Ord('A')],
|
|
TReorderWeigthKind.Primary,0
|
|
);
|
|
do_test_parser('&x < ''<#|/!''A',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_quoted_string_3();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,1);
|
|
locStatement.Reset[0] := Ord('x');
|
|
locStatement.SetElementCount(1);
|
|
locStatement.Elements[0] :=
|
|
TReorderUnit.From(
|
|
[Ord('<'),Ord('#'),Ord('|'),Ord('/'),Ord('!')],
|
|
TReorderWeigthKind.Primary,0
|
|
);
|
|
do_test_parser('&x < ''<#|/!''#',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_quoted_string_4();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,1);
|
|
locStatement.Reset[0] := Ord('x');
|
|
locStatement.SetElementCount(1);
|
|
locStatement.Elements[0] :=
|
|
TReorderUnit.From(
|
|
[Ord('<'),Ord('#'),Ord('|'),Ord('/'),Ord('!'),Ord('A')],
|
|
TReorderWeigthKind.Primary,0
|
|
);
|
|
do_test_parser('&x < ''<#|/!''A#',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_quoted_string_5();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,3);
|
|
locStatement.Reset[0] := Ord('x');
|
|
locStatement.Reset[1] := Ord('-');
|
|
locStatement.Reset[2] := Ord('y');
|
|
locStatement.SetElementCount(1);
|
|
locStatement.Elements[0] :=
|
|
TReorderUnit.From(Ord('k'),TReorderWeigthKind.Tertiary,0);
|
|
do_test_parser('&''x''-''y''<<<k',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_quoted_string_6();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,1);
|
|
locStatement.Reset[0] := Ord('x');
|
|
locStatement.SetElementCount(1);
|
|
locStatement.Elements[0] :=
|
|
TReorderUnit.From(Ord('|'),TReorderWeigthKind.Primary,0);
|
|
do_test_parser('&x < ''|''',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_quoted_string_7();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,1);
|
|
locStatement.Reset[0] := Ord('x');
|
|
locStatement.SetElementCount(1);
|
|
locStatement.Elements[0] :=
|
|
TReorderUnit.From([Ord('a'),Ord('|')],TReorderWeigthKind.Primary,0);
|
|
do_test_parser('&x < a''|''',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_quoted_string_8();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,1);
|
|
locStatement.Reset[0] := Ord('x');
|
|
locStatement.SetElementCount(1);
|
|
locStatement.Elements[0] :=
|
|
TReorderUnit.From([Ord('a'),Ord('|'),Ord('c')],TReorderWeigthKind.Primary,0);
|
|
do_test_parser('&x < a''|''c',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_contexte_before_1();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,1);
|
|
locStatement.Reset[0] := Ord('x');
|
|
locStatement.SetElementCount(1);
|
|
locStatement.Elements[0] :=
|
|
TReorderUnit.From(Ord('-'),[Ord('a')],TReorderWeigthKind.Secondary,0);
|
|
do_test_parser('&x << a|-',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_contexte_before_2();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,1);
|
|
locStatement.Reset[0] := Ord('a');
|
|
locStatement.SetElementCount(1);
|
|
locStatement.Elements[0] :=
|
|
TReorderUnit.From(Ord('-'),[Ord('a')],TReorderWeigthKind.Tertiary,0);
|
|
do_test_parser('&a <<< a|-',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_contexte_before_3();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,1);
|
|
locStatement.Reset[0] := Ord('x');
|
|
locStatement.SetElementCount(1);
|
|
locStatement.Elements[0] :=
|
|
TReorderUnit.From(
|
|
Ord('-'),[Ord('a'),Ord('z'),Ord('k')],TReorderWeigthKind.Secondary,0
|
|
);
|
|
do_test_parser('&x << azk|-',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_contexte_before_4();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,1);
|
|
locStatement.Reset[0] := Ord('x');
|
|
locStatement.SetElementCount(1);
|
|
locStatement.Elements[0] :=
|
|
TReorderUnit.From(
|
|
[Ord('a'),Ord(':')],[Ord('a'),Ord('z'),Ord('k')],
|
|
TReorderWeigthKind.Secondary,0
|
|
);
|
|
do_test_parser('&x << azk|a:',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_placement_before_1();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,1);
|
|
locStatement.Reset[0] := Ord('x');
|
|
locStatement.Before := True;
|
|
locStatement.SetElementCount(1);
|
|
locStatement.Elements[0] := TReorderUnit.From(Ord('k'),TReorderWeigthKind.Secondary,0);
|
|
do_test_parser('&[before 2] x << k',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_placement_before_2();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,1);
|
|
locStatement.Reset[0] := Ord('x');
|
|
locStatement.Before := True;
|
|
locStatement.SetElementCount(1);
|
|
locStatement.Elements[0] :=
|
|
TReorderUnit.From([Ord('z'),Ord('k')],TReorderWeigthKind.Tertiary,0);
|
|
do_test_parser('&[before 3] x <<< zk',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_placement_before_3();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,1);
|
|
locStatement.Reset[0] := Ord('x');
|
|
locStatement.Before := True;
|
|
locStatement.SetElementCount(1);
|
|
locStatement.Elements[0] := TReorderUnit.From(Ord('z'),TReorderWeigthKind.Primary,0);
|
|
do_test_parser('&[before 1] x < z',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_multi_unit_statement_line_1();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,1);
|
|
locStatement.Reset[0] := Ord('x');
|
|
locStatement.SetElementCount(3);
|
|
locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,0);
|
|
locStatement.Elements[1] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,0);
|
|
locStatement.Elements[2] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,0);
|
|
do_test_parser('&x < a < b < c',locStatement);
|
|
do_test_parser('&x <a <b <c',locStatement);
|
|
do_test_parser('&x <a<b<c',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_multi_unit_statement_line_2();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,1);
|
|
locStatement.Reset[0] := Ord('x');
|
|
locStatement.SetElementCount(3);
|
|
locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,0);
|
|
locStatement.Elements[1] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Secondary,0);
|
|
locStatement.Elements[2] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Tertiary,0);
|
|
do_test_parser('&x < a << b <<< c',locStatement);
|
|
do_test_parser('&x <a <<b <<<c',locStatement);
|
|
do_test_parser('&x <a<<b<<<c',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_multi_unit_statement_line_3();
|
|
var
|
|
locStatement : TReorderSequence;
|
|
begin
|
|
locStatement.Clear();
|
|
SetLength(locStatement.Reset,1);
|
|
locStatement.Reset[0] := Ord('x');
|
|
locStatement.SetElementCount(3);
|
|
locStatement.Elements[0] := TReorderUnit.From(Ord('a'),TReorderWeigthKind.Tertiary,0);
|
|
locStatement.Elements[1] := TReorderUnit.From(Ord('b'),TReorderWeigthKind.Secondary,0);
|
|
locStatement.Elements[2] := TReorderUnit.From(Ord('c'),TReorderWeigthKind.Tertiary,0);
|
|
do_test_parser('&x <<< a << b <<< c',locStatement);
|
|
do_test_parser('&x <<<a <<b <<<c',locStatement);
|
|
do_test_parser('&x <<<a<<b<<<c',locStatement);
|
|
end;
|
|
|
|
procedure test_parser_multi_statement_line_1();
|
|
const STATEMENT_BUFFER : UTF8String = '&r <<a &s <<< b';
|
|
var
|
|
locStatements : array of TReorderSequence;
|
|
locStatement : TParsedStatement;
|
|
locExpectedStatement : TReorderSequence;
|
|
lineCount, i, bufferLength, k, nextPost : Integer;
|
|
buffer : PAnsiChar;
|
|
begin
|
|
buffer := @STATEMENT_BUFFER[1];
|
|
WriteLn('Parsing "',buffer,'" ...');
|
|
bufferLength := Length(buffer);
|
|
SetLength(locStatements,10);
|
|
lineCount := 0;
|
|
nextPost := 0;
|
|
i := 0;
|
|
k := 0;
|
|
while (i < bufferLength) do begin
|
|
Clear(locStatement);
|
|
if not ParseStatement(buffer,i,bufferLength,@locStatement,nextPost,lineCount) then
|
|
Break;
|
|
if (locStatement.Kind <> TStatementKind.Sequence) then
|
|
break;
|
|
locStatements[k].Assign(@locStatement.ReorderSequence);
|
|
i := nextPost;
|
|
k := k+1;
|
|
if (k > 2) then
|
|
raise Exception.Create('2 Statements expected, more was parsed.');
|
|
end;
|
|
Check((k=2), 'Statement Count');
|
|
|
|
locExpectedStatement.Clear();
|
|
SetLength(locExpectedStatement.Reset,1);
|
|
locExpectedStatement.Reset[0] := Ord('r');
|
|
locExpectedStatement.SetElementCount(1);
|
|
locExpectedStatement.Elements[0] :=
|
|
TReorderUnit.From(Ord('a'),TReorderWeigthKind.Secondary,0);
|
|
CheckEqual(locStatements[0],locExpectedStatement);
|
|
|
|
locExpectedStatement.Clear();
|
|
SetLength(locExpectedStatement.Reset,1);
|
|
locExpectedStatement.Reset[0] := Ord('s');
|
|
locExpectedStatement.SetElementCount(1);
|
|
locExpectedStatement.Elements[0] :=
|
|
TReorderUnit.From(Ord('b'),TReorderWeigthKind.Tertiary,0);
|
|
CheckEqual(locStatements[1],locExpectedStatement);
|
|
|
|
WriteLn(' -- test ok');
|
|
end;
|
|
|
|
procedure test_parser_multi_statement_line_2();
|
|
const STATEMENT_BUFFER : UTF8String = '&r <a <b <<B &s <<< b <c';
|
|
var
|
|
locStatements : array of TReorderSequence;
|
|
locStatement : TParsedStatement;
|
|
locExpectedStatement : TReorderSequence;
|
|
lineCount, i, bufferLength, k, nextPost : Integer;
|
|
buffer : PAnsiChar;
|
|
begin
|
|
buffer := @STATEMENT_BUFFER[1];
|
|
WriteLn('Parsing "',buffer,'" ...');
|
|
bufferLength := Length(buffer);
|
|
SetLength(locStatements,10);
|
|
lineCount := 0;
|
|
nextPost := 0;
|
|
i := 0;
|
|
k := 0;
|
|
while (i < bufferLength) do begin
|
|
Clear(locStatement);
|
|
if not ParseStatement(buffer,i,bufferLength,@locStatement,nextPost,lineCount) then
|
|
Break;
|
|
if (locStatement.Kind <> TStatementKind.Sequence) then
|
|
break;
|
|
locStatements[k].Assign(@locStatement.ReorderSequence);
|
|
i := nextPost;
|
|
k := k+1;
|
|
if (k > 2) then
|
|
raise Exception.Create('2 Statements expected, more was parsed.');
|
|
end;
|
|
Check((k=2), 'Statement Count');
|
|
|
|
locExpectedStatement.Clear();
|
|
SetLength(locExpectedStatement.Reset,1);
|
|
locExpectedStatement.Reset[0] := Ord('r');
|
|
locExpectedStatement.SetElementCount(3);
|
|
locExpectedStatement.Elements[0] :=
|
|
TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,0);
|
|
locExpectedStatement.Elements[1] :=
|
|
TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,0);
|
|
locExpectedStatement.Elements[2] :=
|
|
TReorderUnit.From(Ord('B'),TReorderWeigthKind.Secondary,0);
|
|
CheckEqual(locStatements[0],locExpectedStatement);
|
|
|
|
locExpectedStatement.Clear();
|
|
SetLength(locExpectedStatement.Reset,1);
|
|
locExpectedStatement.Reset[0] := Ord('s');
|
|
locExpectedStatement.SetElementCount(2);
|
|
locExpectedStatement.Elements[0] :=
|
|
TReorderUnit.From(Ord('b'),TReorderWeigthKind.Tertiary,0);
|
|
locExpectedStatement.Elements[1] :=
|
|
TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,0);
|
|
CheckEqual(locStatements[1],locExpectedStatement);
|
|
|
|
WriteLn(' -- test ok');
|
|
end;
|
|
|
|
procedure test_parser_multi_statement_line_3();
|
|
const STATEMENT_BUFFER : UTF8String = '&r <a <b <<B &s <<< b <c &x <A <W';
|
|
var
|
|
locStatements : array of TReorderSequence;
|
|
locStatement : TParsedStatement;
|
|
locExpectedStatement : TReorderSequence;
|
|
lineCount, i, bufferLength, k, nextPost : Integer;
|
|
buffer : PAnsiChar;
|
|
begin
|
|
buffer := @STATEMENT_BUFFER[1];
|
|
WriteLn('Parsing "',buffer,'" ...');
|
|
bufferLength := Length(buffer);
|
|
SetLength(locStatements,10);
|
|
lineCount := 0;
|
|
nextPost := 0;
|
|
i := 0;
|
|
k := 0;
|
|
while (i < bufferLength) do begin
|
|
Clear(locStatement);
|
|
if not ParseStatement(buffer,i,bufferLength,@locStatement,nextPost,lineCount) then
|
|
Break;
|
|
if (locStatement.Kind <> TStatementKind.Sequence) then
|
|
break;
|
|
locStatements[k].Assign(@locStatement.ReorderSequence);
|
|
i := nextPost;
|
|
k := k+1;
|
|
if (k > 3) then
|
|
raise Exception.Create('3 Statements expected, more was parsed.');
|
|
end;
|
|
Check((k=3), 'Statement Count');
|
|
|
|
locExpectedStatement.Clear();
|
|
SetLength(locExpectedStatement.Reset,1);
|
|
locExpectedStatement.Reset[0] := Ord('r');
|
|
locExpectedStatement.SetElementCount(3);
|
|
locExpectedStatement.Elements[0] :=
|
|
TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,0);
|
|
locExpectedStatement.Elements[1] :=
|
|
TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,0);
|
|
locExpectedStatement.Elements[2] :=
|
|
TReorderUnit.From(Ord('B'),TReorderWeigthKind.Secondary,0);
|
|
CheckEqual(locStatements[0],locExpectedStatement);
|
|
|
|
locExpectedStatement.Clear();
|
|
SetLength(locExpectedStatement.Reset,1);
|
|
locExpectedStatement.Reset[0] := Ord('s');
|
|
locExpectedStatement.SetElementCount(2);
|
|
locExpectedStatement.Elements[0] :=
|
|
TReorderUnit.From(Ord('b'),TReorderWeigthKind.Tertiary,0);
|
|
locExpectedStatement.Elements[1] :=
|
|
TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,0);
|
|
CheckEqual(locStatements[1],locExpectedStatement);
|
|
|
|
locExpectedStatement.Clear();
|
|
SetLength(locExpectedStatement.Reset,1);
|
|
locExpectedStatement.Reset[0] := Ord('x');
|
|
locExpectedStatement.SetElementCount(2);
|
|
locExpectedStatement.Elements[0] :=
|
|
TReorderUnit.From(Ord('A'),TReorderWeigthKind.Primary,0);
|
|
locExpectedStatement.Elements[1] :=
|
|
TReorderUnit.From(Ord('W'),TReorderWeigthKind.Primary,0);
|
|
CheckEqual(locStatements[2],locExpectedStatement);
|
|
|
|
WriteLn(' -- test ok');
|
|
end;
|
|
|
|
procedure test_parser_multi_statement_line_4();
|
|
const STATEMENT_BUFFER : UTF8String =
|
|
' &r <a <b <<B &s <<< b <c &x <A <W';
|
|
var
|
|
locStatements : array of TReorderSequence;
|
|
locStatement : TParsedStatement;
|
|
locExpectedStatement : TReorderSequence;
|
|
lineCount, i, bufferLength, k, nextPost : Integer;
|
|
buffer : PAnsiChar;
|
|
begin
|
|
buffer := @STATEMENT_BUFFER[1];
|
|
WriteLn('Parsing "',buffer,'" ...');
|
|
bufferLength := Length(buffer);
|
|
SetLength(locStatements,10);
|
|
lineCount := 0;
|
|
nextPost := 0;
|
|
i := 0;
|
|
k := 0;
|
|
while (i < bufferLength) do begin
|
|
Clear(locStatement);
|
|
if not ParseStatement(buffer,i,bufferLength,@locStatement,nextPost,lineCount) then
|
|
Break;
|
|
if (locStatement.Kind <> TStatementKind.Sequence) then
|
|
break;
|
|
locStatements[k].Assign(@locStatement.ReorderSequence);
|
|
i := nextPost;
|
|
k := k+1;
|
|
if (k > 3) then
|
|
raise Exception.Create('3 Statements expected, more was parsed.');
|
|
end;
|
|
Check((k=3), 'Statement Count');
|
|
|
|
locExpectedStatement.Clear();
|
|
SetLength(locExpectedStatement.Reset,1);
|
|
locExpectedStatement.Reset[0] := Ord('r');
|
|
locExpectedStatement.SetElementCount(3);
|
|
locExpectedStatement.Elements[0] :=
|
|
TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,0);
|
|
locExpectedStatement.Elements[1] :=
|
|
TReorderUnit.From(Ord('b'),TReorderWeigthKind.Primary,0);
|
|
locExpectedStatement.Elements[2] :=
|
|
TReorderUnit.From(Ord('B'),TReorderWeigthKind.Secondary,0);
|
|
CheckEqual(locStatements[0],locExpectedStatement);
|
|
|
|
locExpectedStatement.Clear();
|
|
SetLength(locExpectedStatement.Reset,1);
|
|
locExpectedStatement.Reset[0] := Ord('s');
|
|
locExpectedStatement.SetElementCount(2);
|
|
locExpectedStatement.Elements[0] :=
|
|
TReorderUnit.From(Ord('b'),TReorderWeigthKind.Tertiary,0);
|
|
locExpectedStatement.Elements[1] :=
|
|
TReorderUnit.From(Ord('c'),TReorderWeigthKind.Primary,0);
|
|
CheckEqual(locStatements[1],locExpectedStatement);
|
|
|
|
locExpectedStatement.Clear();
|
|
SetLength(locExpectedStatement.Reset,1);
|
|
locExpectedStatement.Reset[0] := Ord('x');
|
|
locExpectedStatement.SetElementCount(2);
|
|
locExpectedStatement.Elements[0] :=
|
|
TReorderUnit.From(Ord('A'),TReorderWeigthKind.Primary,0);
|
|
locExpectedStatement.Elements[1] :=
|
|
TReorderUnit.From(Ord('W'),TReorderWeigthKind.Primary,0);
|
|
CheckEqual(locStatements[2],locExpectedStatement);
|
|
|
|
WriteLn(' -- test ok');
|
|
end;
|
|
|
|
procedure test_parser_multi_line_statements_1();
|
|
const STATEMENT_BUFFER : UTF8String =
|
|
'&r <a #123'#10 +
|
|
'&s <<< b ';
|
|
var
|
|
locStatements : array of TReorderSequence;
|
|
locStatement : TParsedStatement;
|
|
locExpectedStatement : TReorderSequence;
|
|
lineCount, i, bufferLength, k, nextPost : Integer;
|
|
buffer : PAnsiChar;
|
|
begin
|
|
buffer := @STATEMENT_BUFFER[1];
|
|
WriteLn('Parsing "',buffer,'" ...');
|
|
bufferLength := Length(buffer);
|
|
SetLength(locStatements,10);
|
|
lineCount := 0;
|
|
nextPost := 0;
|
|
i := 0;
|
|
k := 0;
|
|
while (i < bufferLength) do begin
|
|
Clear(locStatement);
|
|
if not ParseStatement(buffer,i,bufferLength,@locStatement,nextPost,lineCount) then
|
|
Break;
|
|
if (locStatement.Kind <> TStatementKind.Sequence) then
|
|
break;
|
|
locStatements[k].Assign(@locStatement.ReorderSequence);
|
|
i := nextPost;
|
|
k := k+1;
|
|
if (k > 2) then
|
|
raise Exception.Create('2 Statements expected, more was parsed.');
|
|
end;
|
|
Check((k=2), 'Statement Count');
|
|
|
|
locExpectedStatement.Clear();
|
|
SetLength(locExpectedStatement.Reset,1);
|
|
locExpectedStatement.Reset[0] := Ord('r');
|
|
locExpectedStatement.SetElementCount(1);
|
|
locExpectedStatement.Elements[0] :=
|
|
TReorderUnit.From(Ord('a'),TReorderWeigthKind.Primary,0);
|
|
CheckEqual(locStatements[0],locExpectedStatement);
|
|
|
|
locExpectedStatement.Clear();
|
|
SetLength(locExpectedStatement.Reset,1);
|
|
locExpectedStatement.Reset[0] := Ord('s');
|
|
locExpectedStatement.SetElementCount(1);
|
|
locExpectedStatement.Elements[0] :=
|
|
TReorderUnit.From(Ord('b'),TReorderWeigthKind.Tertiary,0);
|
|
CheckEqual(locStatements[1],locExpectedStatement);
|
|
|
|
WriteLn(' -- test ok');
|
|
end;
|
|
|
|
procedure test_parser_setting_1;
|
|
begin
|
|
do_test_parser_for_setting('[strength 1]','strength','1',TSettingOption.Strength);
|
|
end;
|
|
|
|
procedure test_parser_setting_2;
|
|
begin
|
|
do_test_parser_for_setting('[alternate shifted]','alternate','shifted',TSettingOption.Alternate);
|
|
end;
|
|
|
|
procedure test_parser_setting_3;
|
|
begin
|
|
do_test_parser_for_setting('[alternate non-ignorable]','alternate','non-ignorable',TSettingOption.Alternate);
|
|
end;
|
|
|
|
procedure test_parser_setting_4;
|
|
begin
|
|
do_test_parser_for_setting('[reorder Grek digit]','reorder',['Grek','digit'],TSettingOption.Reorder,1);
|
|
end;
|
|
|
|
procedure test_parser_setting_5;
|
|
begin
|
|
do_test_parser_for_setting(
|
|
'[azerty one two three four five]','azerty',
|
|
['one','two','three', 'four', 'five'],TSettingOption.Unknown, 1
|
|
);
|
|
end;
|
|
|
|
procedure test_parser_setting_6;
|
|
begin
|
|
do_test_parser_for_setting(
|
|
'[strength'+ UNICODE_LINE_BREAK +
|
|
' 1]',
|
|
'strength',['1'],TSettingOption.Strength,2
|
|
);
|
|
do_test_parser_for_setting(
|
|
'[ strength '+ UNICODE_LINE_BREAK +
|
|
' 1'+ UNICODE_LINE_BREAK+' ] ',
|
|
'strength',['1'],TSettingOption.Strength,3
|
|
);
|
|
end;
|
|
|
|
procedure test_parser_setting_7;
|
|
begin
|
|
do_test_parser_for_setting(
|
|
'[Backwards # sample comment'+ UNICODE_LINE_BREAK +
|
|
' one]',
|
|
'Backwards',['one'],TSettingOption.Backwards,2
|
|
);
|
|
end;
|
|
|
|
procedure test_parser_setting_8;
|
|
begin
|
|
do_test_parser_for_setting('[STRENGTH 1]','STRENGTH','1',TSettingOption.Strength);
|
|
do_test_parser_for_setting('[STRengTH 1]','STRengTH','1',TSettingOption.Strength);
|
|
end;
|
|
|
|
procedure test_parser_setting_multi_statement_1;
|
|
begin
|
|
do_test_parser_for_setting_multi(
|
|
'[strength 1]' + UNICODE_LINE_BREAK +
|
|
'[alternate shifted]',
|
|
[ TSettingRec.From('strength',['1'],TSettingOption.Strength),
|
|
TSettingRec.From('alternate',['shifted'],TSettingOption.Alternate)
|
|
]
|
|
);
|
|
end;
|
|
|
|
procedure test_parser_setting_multi_statement_2;
|
|
begin
|
|
do_test_parser_for_setting_multi(
|
|
'[strength 1][alternate shifted]',
|
|
[ TSettingRec.From('strength',['1'],TSettingOption.Strength),
|
|
TSettingRec.From('alternate',['shifted'],TSettingOption.Alternate)
|
|
]
|
|
);
|
|
end;
|
|
|
|
procedure test_parser_setting_multi_statement_3;
|
|
begin
|
|
do_test_parser_for_setting_multi(
|
|
'[strength 1] [alternate shifted]',
|
|
[ TSettingRec.From('strength',['1'],TSettingOption.Strength),
|
|
TSettingRec.From('alternate',['shifted'],TSettingOption.Alternate)
|
|
]
|
|
);
|
|
end;
|
|
|
|
procedure test_parser_setting_multi_statement_4;
|
|
begin
|
|
do_test_parser_for_setting_multi(
|
|
'[strength 1] [alternate non-ignorable][normalization off]',
|
|
[ TSettingRec.From('strength',['1'],TSettingOption.Strength),
|
|
TSettingRec.From('alternate',['non-ignorable'],TSettingOption.Alternate),
|
|
TSettingRec.From('normalization',['off'],TSettingOption.Normalization)
|
|
]
|
|
);
|
|
end;
|
|
|
|
procedure test_parser_setting_unicodeset_1;
|
|
begin
|
|
do_test_parser_for_setting(
|
|
'[suppressContractions [d-k]]','suppressContractions',
|
|
'[d-k]',TSettingOption.SuppressContractions
|
|
);
|
|
end;
|
|
|
|
procedure test_parser_setting_unicodeset_2;
|
|
begin
|
|
do_test_parser_for_setting(
|
|
'[optimize [x]]','optimize','[x]',TSettingOption.Optimize
|
|
);
|
|
end;
|
|
|
|
procedure test_parser_setting_unicodeset_3;
|
|
begin
|
|
do_test_parser_for_setting(
|
|
'[suppressContractions [a {ab} {ac}]]','suppressContractions',
|
|
'[a {ab} {ac}]',TSettingOption.SuppressContractions
|
|
);
|
|
end;
|
|
|
|
procedure test_parser_setting_unicodeset_4;
|
|
begin
|
|
do_test_parser_for_setting(
|
|
'[suppressContractions [[a-c][a {ab}]]]','suppressContractions',
|
|
'[[a-c][a {ab}]]',TSettingOption.SuppressContractions
|
|
);
|
|
end;
|
|
|
|
//----------------------------------------------------------------------------//
|
|
const
|
|
COLLATION_XML_TEXT =
|
|
'<ldml>' + UNICODE_LINE_BREAK +
|
|
' <identity>' + UNICODE_LINE_BREAK +
|
|
' <version number="1.2.3"/>' + UNICODE_LINE_BREAK +
|
|
' <generation date="$Date: 2014-07-08 21:39:31 -0500 (Tue, 08 Jul 2014) $"/>' + UNICODE_LINE_BREAK +
|
|
' <language type="xy" />' + UNICODE_LINE_BREAK +
|
|
' </identity>' + UNICODE_LINE_BREAK +
|
|
' <collations >' + UNICODE_LINE_BREAK +
|
|
' <defaultCollation>one</defaultCollation>' + UNICODE_LINE_BREAK +
|
|
' <collation type="abc" >' + UNICODE_LINE_BREAK +
|
|
' <cr><![CDATA[' + UNICODE_LINE_BREAK +
|
|
' [import xy-u-co-private-two]' + UNICODE_LINE_BREAK +
|
|
' [import xy-u-co-one]' + UNICODE_LINE_BREAK +
|
|
' [import xy-u-co-standard]' + UNICODE_LINE_BREAK +
|
|
' [suppressContractions [qh]]' + UNICODE_LINE_BREAK +
|
|
' &w<u<v' + UNICODE_LINE_BREAK +
|
|
' ]]></cr>' + UNICODE_LINE_BREAK +
|
|
' </collation>' + UNICODE_LINE_BREAK +
|
|
' <collation type="one" >' + UNICODE_LINE_BREAK +
|
|
' <cr><![CDATA[' + UNICODE_LINE_BREAK +
|
|
' &h<z<b' + UNICODE_LINE_BREAK +
|
|
' ]]></cr>' + UNICODE_LINE_BREAK +
|
|
' </collation>' + UNICODE_LINE_BREAK +
|
|
' <collation type="private-two" >' + UNICODE_LINE_BREAK +
|
|
' <cr><![CDATA[' + UNICODE_LINE_BREAK +
|
|
' &f<c<<<ce' + UNICODE_LINE_BREAK +
|
|
' &q<qh<<<p' + UNICODE_LINE_BREAK +
|
|
' ]]></cr>' + UNICODE_LINE_BREAK +
|
|
' </collation >' + UNICODE_LINE_BREAK +
|
|
' <collation type="standard" >' + UNICODE_LINE_BREAK +
|
|
' <cr><![CDATA[' + UNICODE_LINE_BREAK +
|
|
' &d<c<b<a' + UNICODE_LINE_BREAK +
|
|
' ]]></cr>' + UNICODE_LINE_BREAK +
|
|
' </collation>' + UNICODE_LINE_BREAK +
|
|
' </collations>' + UNICODE_LINE_BREAK +
|
|
'</ldml>';
|
|
COLLATION_XML_TEXT2 =
|
|
'<ldml>' + UNICODE_LINE_BREAK +
|
|
' <identity>' + UNICODE_LINE_BREAK +
|
|
' <version number="1.2.3"/>' + UNICODE_LINE_BREAK +
|
|
' <generation date="$Date: 2014-07-08 21:39:31 -0500 (Tue, 08 Jul 2014) $"/>' + UNICODE_LINE_BREAK +
|
|
' <language type="kw" />' + UNICODE_LINE_BREAK +
|
|
' </identity>' + UNICODE_LINE_BREAK +
|
|
' <collations >' + UNICODE_LINE_BREAK +
|
|
' <defaultCollation>wend</defaultCollation>' + UNICODE_LINE_BREAK +
|
|
' <collation type="kis" >' + UNICODE_LINE_BREAK +
|
|
' <cr><![CDATA[' + UNICODE_LINE_BREAK +
|
|
' &x<c<v' + UNICODE_LINE_BREAK +
|
|
' ]]></cr>' + UNICODE_LINE_BREAK +
|
|
' </collation>' + UNICODE_LINE_BREAK +
|
|
' <collation type="wend" >' + UNICODE_LINE_BREAK +
|
|
' <cr><![CDATA[' + UNICODE_LINE_BREAK +
|
|
' [import xy-u-co-one]' + UNICODE_LINE_BREAK +
|
|
' [backwards 2]' + UNICODE_LINE_BREAK +
|
|
' [alternate non-ignorable]' + UNICODE_LINE_BREAK +
|
|
' [normalization off]' + UNICODE_LINE_BREAK +
|
|
' [strength 2]' + UNICODE_LINE_BREAK +
|
|
' &F<<P<<<C' + UNICODE_LINE_BREAK +
|
|
' &L<a<<<Z' + UNICODE_LINE_BREAK +
|
|
' ]]></cr>' + UNICODE_LINE_BREAK +
|
|
' </collation>' + UNICODE_LINE_BREAK +
|
|
' </collations>' + UNICODE_LINE_BREAK +
|
|
'</ldml>';
|
|
|
|
function PrepareCollationStream(const AText : string) : TStream;
|
|
begin
|
|
Result := TMemoryStream.Create();
|
|
if (AText <> '') then
|
|
Result.Write(AText[1],(Length(AText)*SizeOf(Char)));
|
|
end;
|
|
|
|
function PrepareRepositoryLoader() : ICldrCollationLoader;
|
|
var
|
|
s : array of TStream;
|
|
begin
|
|
SetLength(s,2);
|
|
s[0] := PrepareCollationStream(COLLATION_XML_TEXT);
|
|
s[1] := PrepareCollationStream(COLLATION_XML_TEXT2);
|
|
Result := TCldrCollationStreamLoader.Create(['xy','kw'],s) as ICldrCollationLoader;
|
|
end;
|
|
|
|
procedure test_collation_parser_HeaderParsing();
|
|
var
|
|
rep : TCldrCollationRepository;
|
|
col : TCldrCollation;
|
|
typ : TCldrCollationItem;
|
|
imp : TCldrImport;
|
|
begin
|
|
rep := TCldrCollationRepository.Create(PrepareRepositoryLoader());
|
|
try
|
|
Check(rep.Find('xy')=nil, 'Find() before load.');
|
|
Check(rep.Find('ab')=nil, 'Find() before load.');
|
|
col := rep.Load('xy',TCldrParserMode.HeaderParsing);
|
|
Check(col <> nil, 'load()');
|
|
Check(col.Mode=TCldrParserMode.HeaderParsing, 'Mode');
|
|
Check(rep.Find('xy') <> nil, 'Find() after load.');
|
|
Check(rep.Find('ab')=nil);
|
|
WriteLn(' - Step 1 ok');
|
|
|
|
Check(col.DefaultType='one', 'DefaultType');
|
|
Check(col.ItemCount=4, 'col.ItemCount');
|
|
Check(col.Find('one')<>nil, 'col.Find()');
|
|
Check(col.Find('private-two')<>nil, 'col.Find()');
|
|
Check(col.Find('standard')<>nil, 'col.Find()');
|
|
Check(col.Find('abc')<>nil, 'col.Find()');
|
|
|
|
WriteLn(' - Step 2 ok');
|
|
|
|
typ := col.Find('private-two');
|
|
check(typ.IsPrivate(),'IsPrivate()');
|
|
|
|
WriteLn(' - Step 3 ok');
|
|
|
|
Check(col.Find('one').Imports.Count=0, 'one.imports=0');
|
|
Check(col.Find('private-two').Imports.Count=0, 'private-two.imports=0');
|
|
Check(col.Find('standard').Imports.Count=0, 'standard.imports=0');
|
|
|
|
WriteLn(' - Step 4 ok');
|
|
|
|
typ := col.Find('abc');
|
|
check(typ.Imports.Count=0,'abc.imports=0');
|
|
|
|
WriteLn(' - Step 5 ok');
|
|
finally
|
|
rep.Free();
|
|
end;
|
|
|
|
WriteLn(' -- test ok');
|
|
end;
|
|
|
|
procedure test_collation_parser_HeaderParsing_2();
|
|
var
|
|
rep : TCldrCollationRepository;
|
|
col : TCldrCollation;
|
|
typ : TCldrCollationItem;
|
|
imp : TCldrImport;
|
|
begin
|
|
rep := TCldrCollationRepository.Create(PrepareRepositoryLoader());
|
|
try
|
|
Check(rep.Find('kw')=nil, 'Find() before load.');
|
|
Check(rep.Find('xy')=nil, 'Find() before load.');
|
|
col := rep.Load('kw',TCldrParserMode.HeaderParsing);
|
|
Check(col <> nil, 'load()');
|
|
Check(col.Mode=TCldrParserMode.HeaderParsing, 'Mode');
|
|
Check(rep.Find('kw') <> nil, 'Find() after load.');
|
|
WriteLn(' - Step 1 ok');
|
|
|
|
Check(rep.Find('xy')=nil, 'Find(xy) after load.');
|
|
WriteLn(' - Step 2 ok');
|
|
|
|
typ := col.Find('wend');
|
|
check(typ.Imports.Count=0,'wend.imports=0');
|
|
|
|
WriteLn(' - Step 3 ok');
|
|
finally
|
|
rep.Free();
|
|
end;
|
|
|
|
WriteLn(' -- test ok');
|
|
end;
|
|
|
|
function ParseSingleStatement(
|
|
const AText : UnicodeString;
|
|
var AStatement : TParsedStatement
|
|
) : Boolean;
|
|
var
|
|
np, lc : Integer;
|
|
u8 : UTF8String;
|
|
begin
|
|
u8 := UTF8Encode(AText);
|
|
np := 0;
|
|
lc := 0;
|
|
Result := ParseStatement(@u8[1],0,Length(u8),@AStatement,np,lc);
|
|
end;
|
|
|
|
function ParseMultiStatements(
|
|
AText : UnicodeString;
|
|
AStatementList : PReorderSequence;
|
|
const AListLength : Integer
|
|
) : Integer;
|
|
var
|
|
c, nextPos, lineCount, i : Integer;
|
|
u8 : UTF8String;
|
|
buffer : PAnsiChar;
|
|
statement, lastStatement : PReorderSequence;
|
|
ps : TParsedStatement;
|
|
begin
|
|
u8 := UTF8Encode(AText);
|
|
c := Length(u8);
|
|
buffer := @u8[1];
|
|
nextPos := 0;
|
|
i := 0;
|
|
lineCount := 0;
|
|
statement := AStatementList;
|
|
lastStatement := AStatementList+AListLength;
|
|
while (i < c) and (statement < lastStatement) do begin
|
|
Clear(ps);
|
|
if not ParseStatement(buffer,i,c,@ps,nextPos,lineCount) then
|
|
Break;
|
|
if (ps.Kind <> TStatementKind.Sequence) then
|
|
break;
|
|
statement^.Assign(@ps.ReorderSequence);
|
|
i := nextPos;
|
|
Inc(statement);
|
|
end;
|
|
Result := statement-AStatementList;
|
|
end;
|
|
|
|
type
|
|
TReorderSequenceArrayRec = record
|
|
Data : TReorderSequenceArray;
|
|
ActualLengh : Integer;
|
|
end;
|
|
PReorderSequenceArrayRec = ^TReorderSequenceArrayRec;
|
|
|
|
function CopyVisitorFunc(
|
|
ARule : PReorderSequence;
|
|
AOwner : TCldrCollationItem;
|
|
AData : Pointer
|
|
) : Boolean;
|
|
var
|
|
p : PReorderSequenceArrayRec;
|
|
begin
|
|
p := PReorderSequenceArrayRec(AData);
|
|
Result := (p^.ActualLengh < Length(p^.Data));
|
|
if Result then begin
|
|
p^.Data[p^.ActualLengh].Assign(ARule);
|
|
p^.ActualLengh := p^.ActualLengh+1;
|
|
end;
|
|
end;
|
|
|
|
procedure test_collation_parser_FullParsing();
|
|
var
|
|
rep : TCldrCollationRepository;
|
|
col : TCldrCollation;
|
|
typ : TCldrCollationItem;
|
|
imp : TCldrImport;
|
|
locStatement : TParsedStatement;
|
|
locStatementList : TReorderSequenceArray;
|
|
c, i : Integer;
|
|
begin
|
|
rep := TCldrCollationRepository.Create(PrepareRepositoryLoader());
|
|
try
|
|
Check(rep.Find('xy')=nil, 'Find() before load.');
|
|
Check(rep.Find('ab')=nil, 'Find() before load.');
|
|
col := rep.Load('xy',TCldrParserMode.FullParsing);
|
|
Check(col <> nil, 'load()');
|
|
Check(col.Mode=TCldrParserMode.FullParsing, 'Mode');
|
|
Check(rep.Find('xy') <> nil, 'Find() after load.');
|
|
Check(rep.Find('ab')=nil);
|
|
WriteLn(' - Step 1 ok');
|
|
|
|
Check(col.DefaultType='one', 'DefaultType');
|
|
Check(col.ItemCount=4, 'col.ItemCount');
|
|
Check(col.Find('one')<>nil, 'col.Find()');
|
|
Check(col.Find('private-two')<>nil, 'col.Find()');
|
|
Check(col.Find('standard')<>nil, 'col.Find()');
|
|
Check(col.Find('abc')<>nil, 'col.Find()');
|
|
|
|
WriteLn(' - Step 2 ok');
|
|
|
|
typ := col.Find('private-two');
|
|
check(typ.IsPrivate(),'IsPrivate()');
|
|
|
|
WriteLn(' - Step 3 ok');
|
|
|
|
Check(col.Find('one').Imports.Count=0, 'one.imports=0');
|
|
Check(col.Find('private-two').Imports.Count=0, 'private-two.imports=0');
|
|
Check(col.Find('standard').Imports.Count=0, 'standard.imports=0');
|
|
|
|
WriteLn(' - Step 4 ok');
|
|
|
|
typ := col.Find('abc');
|
|
check(typ.Imports.Count=3,'abc.imports=3');
|
|
imp := typ.Imports[0];
|
|
check(imp<>nil, 'abc.Imports[0]');
|
|
check(
|
|
(imp.Source = 'xy') and (imp.TypeName = 'private-two'),
|
|
'abc.Imports[0]'
|
|
);
|
|
imp := typ.Imports[1];
|
|
check(imp<>nil, 'abc.Imports[1]');
|
|
check(
|
|
(imp.Source = 'xy') and (imp.TypeName = 'one'),
|
|
'abc.Imports[1]'
|
|
);
|
|
imp := typ.Imports[2];
|
|
check(imp<>nil, 'abc.Imports[2]');
|
|
check(
|
|
(imp.Source = 'xy') and (imp.TypeName = 'standard'),
|
|
'abc.Imports[2]'
|
|
);
|
|
Check((typ.ChangedFields = []), 'ChangedFields');
|
|
Check(Length(typ.Rules)=5,'Length(abc.Rules)=5');
|
|
Check((typ.Rules[3].Kind=TCldrCollationRuleKind.ReorderSequence),'typ.Rules[3].Kind=ReorderSequence');
|
|
Check(Length(typ.Rules[3].Reorder.Elements)=2,'Length(typ.Rules[3].Elements)=2');
|
|
Check(typ.Rules[3].Reorder.Elements[0].WeigthKind=TReorderWeigthKind.Deletion,'typ.Rules[3].Elements[0].WeigthKind=TReorderWeigthKind.Deletion');
|
|
Check(Length(typ.Rules[3].Reorder.Elements[0].Characters)=1,'Length(typ.Rules[3].Elements[0].Characters)=1');
|
|
Check(typ.Rules[3].Reorder.Elements[0].Characters[0]=Ord('h'),'typ.Rules[3].Elements[0].Characters[0]=h');
|
|
Check(typ.Rules[3].Reorder.Elements[1].Characters[0]=Ord('q'),'typ.Rules[3].Elements[1].Characters[0]=q');
|
|
WriteLn(' - Step 5 ok');
|
|
|
|
typ := col.Find('one');
|
|
Check(Length(typ.Rules)>0, 'one.Rules <> nil');
|
|
Clear(locStatement);
|
|
Check(ParseSingleStatement('&h<z<b',locStatement));
|
|
Check((locStatement.Kind = TStatementKind.Sequence));
|
|
Check(typ.Rules[0].Kind=TCldrCollationRuleKind.ReorderSequence);
|
|
CheckEqual(locStatement.ReorderSequence,typ.Rules[0].Reorder);
|
|
WriteLn(' - Step 6 ok');
|
|
|
|
typ := col.Find('private-two');
|
|
Check(Length(typ.Rules)>0, 'private-two.Rules <> nil');
|
|
c := 2;
|
|
SetLength(locStatementList,5);
|
|
Check(
|
|
ParseMultiStatements(
|
|
'&f<c<<<ce' + UNICODE_LINE_BREAK+'&q<qh<<<p ',
|
|
@locStatementList[0],
|
|
Length(locStatementList)
|
|
) = c
|
|
);
|
|
for i := 0 to c-1 do begin
|
|
Check(typ.Rules[i].Kind=TCldrCollationRuleKind.ReorderSequence);
|
|
CheckEqual(locStatementList[i],typ.Rules[i].Reorder);
|
|
end;
|
|
WriteLn(' - Step 7 ok');
|
|
|
|
typ := col.Find('standard');
|
|
Check((typ.Backwards = False), 'typ.Backwards = False');
|
|
Check((typ.Normalization = True), 'typ.Normalization = True');
|
|
Check((typ.Strength = TComparisonStrength.Tertiary), 'typ.Strength = Tertiary');
|
|
Check((typ.VariableWeight = Low(helper.TUCA_VariableKind)), 'typ.VariableWeight = Low(TUCA_VariableKind)');
|
|
Check(Length(typ.Rules)>0, 'standard.Rules <> nil');
|
|
Clear(locStatement);
|
|
Check(ParseSingleStatement('&d<c<b<a',locStatement));
|
|
Check((locStatement.Kind = TStatementKind.Sequence));
|
|
Check(typ.Rules[0].Kind=TCldrCollationRuleKind.ReorderSequence);
|
|
CheckEqual(locStatement.ReorderSequence,typ.Rules[0].Reorder);
|
|
WriteLn(' - Step 8 ok');
|
|
finally
|
|
rep.Free();
|
|
end;
|
|
|
|
WriteLn(' -- test ok');
|
|
end;
|
|
|
|
procedure test_collation_parser_FullParsing_2();
|
|
var
|
|
rep : TCldrCollationRepository;
|
|
col : TCldrCollation;
|
|
typ : TCldrCollationItem;
|
|
imp : TCldrImport;
|
|
locStatementList : TReorderSequenceArray;
|
|
c, i : Integer;
|
|
begin
|
|
rep := TCldrCollationRepository.Create(PrepareRepositoryLoader());
|
|
try
|
|
Check(rep.Find('kw')=nil, 'Find() before load.');
|
|
Check(rep.Find('xy')=nil, 'Find() before load.');
|
|
col := rep.Load('kw',TCldrParserMode.FullParsing);
|
|
Check(col <> nil, 'load()');
|
|
Check(col.Mode=TCldrParserMode.FullParsing, 'Mode');
|
|
Check(rep.Find('kw') <> nil, 'Find() after load.');
|
|
WriteLn(' - Step 1 ok');
|
|
|
|
typ := col.Find('wend');
|
|
check(typ.Imports.Count=1,'wend.imports=1');
|
|
imp := typ.Imports[0];
|
|
check(imp<>nil, 'wend.Imports[0]');
|
|
check(
|
|
(imp.Source = 'xy') and (imp.TypeName = 'one'),
|
|
'wend.Imports[0]'
|
|
);
|
|
Check(Length(typ.Rules)>0, 'wend.Rules <> nil');
|
|
Check((typ.Backwards = True),'typ.Backwards = True');
|
|
Check((typ.Normalization = False), 'typ.Normalization = False');
|
|
Check((typ.Strength = TComparisonStrength.Secondary), 'typ.Strength = Secondary');
|
|
Check((typ.VariableWeight = ucaNonIgnorable), 'typ.VariableWeight = ucaNonIgnorable');
|
|
Check(
|
|
(typ.ChangedFields =
|
|
[ cldrhelper.TCollationField.BackWards,cldrhelper.TCollationField.Alternate,
|
|
cldrhelper.TCollationField.Normalization,cldrhelper.TCollationField.Strength
|
|
]
|
|
),
|
|
'ChangedFields'
|
|
);
|
|
c := 2;
|
|
SetLength(locStatementList,5);
|
|
Check(
|
|
ParseMultiStatements(
|
|
'&F<<P<<<C' + UNICODE_LINE_BREAK+'&L<a<<<Z ',
|
|
@locStatementList[0],
|
|
Length(locStatementList)
|
|
) = c
|
|
);
|
|
Check((typ.Rules[0].Kind=TCldrCollationRuleKind.Import),'typ.Rules[0].Kind=Import');
|
|
for i := 0 to c-1 do begin
|
|
Check((typ.Rules[i+1{Import}].Kind=TCldrCollationRuleKind.ReorderSequence),'typ.Rules[i+1{Import}].Kind=ReorderSequence');
|
|
CheckEqual(locStatementList[i],typ.Rules[i+1{Import}].Reorder);
|
|
end;
|
|
WriteLn(' - Step 2 ok');
|
|
|
|
finally
|
|
rep.Free();
|
|
end;
|
|
|
|
WriteLn(' -- test ok');
|
|
end;
|
|
|
|
procedure test_collation_parser_complete_rules();
|
|
var
|
|
rep : TCldrCollationRepository;
|
|
col : TCldrCollation;
|
|
typ, xtyp : TCldrCollationItem;
|
|
c, i, k : Integer;
|
|
locData : TReorderSequenceArrayRec;
|
|
begin
|
|
rep := TCldrCollationRepository.Create(PrepareRepositoryLoader());
|
|
try
|
|
col := rep.Load('xy',TCldrParserMode.FullParsing);
|
|
SetLength(locData.Data,23);
|
|
|
|
typ := col.Find('one');
|
|
locData.ActualLengh := 0;
|
|
Check(ForEachRule(typ,@CopyVisitorFunc,@locData), 'ForEachRule(one) - 1');
|
|
Check(locData.ActualLengh = 1, 'ForEachRule(one) - 2');
|
|
Check((typ.Rules[0].Kind=TCldrCollationRuleKind.ReorderSequence),'typ.Rules[0].Kind=ReorderSequence');
|
|
CheckEqual(locData.Data[0],typ.Rules[0].Reorder);
|
|
WriteLn(' - Step 1 ok');
|
|
|
|
typ := col.Find('private-two');
|
|
locData.ActualLengh := 0;
|
|
Check(ForEachRule(typ,@CopyVisitorFunc,@locData), 'ForEachRule(private-two) - 1');
|
|
Check(locData.ActualLengh = 2, 'ForEachRule(private-two) - 2');
|
|
for i := 0 to locData.ActualLengh-1 do begin
|
|
Check((typ.Rules[i].Kind=TCldrCollationRuleKind.ReorderSequence),'typ.Rules[i].Kind=ReorderSequence');
|
|
CheckEqual(locData.Data[i],typ.Rules[i].Reorder);
|
|
end;
|
|
WriteLn(' - Step 2 ok');
|
|
|
|
typ := col.Find('abc');
|
|
locData.ActualLengh := 0;
|
|
SetLength(locData.Data,23);
|
|
Check(ForEachRule(typ,@CopyVisitorFunc,@locData), 'ForEachRule(abc) - 1');
|
|
Check(
|
|
locData.ActualLengh = 2+2{private-two}+1{one}+1{standard},
|
|
'ForEachRule(abc) - 2'
|
|
);
|
|
xtyp := col.Find('private-two');
|
|
c := 0;
|
|
for i := 0 to Length(xtyp.Rules)-1 do begin
|
|
Check((xtyp.Rules[i].Kind=TCldrCollationRuleKind.ReorderSequence),'xtyp.Rules[i].Kind=ReorderSequence');
|
|
CheckEqual(locData.Data[c+i],xtyp.Rules[i].Reorder);
|
|
end;
|
|
c := c+Length(xtyp.Rules);
|
|
xtyp := col.Find('one');
|
|
for i := 0 to Length(xtyp.Rules)-1 do begin
|
|
Check((xtyp.Rules[i].Kind=TCldrCollationRuleKind.ReorderSequence),'xtyp.Rules[i].Kind=ReorderSequence');
|
|
CheckEqual(locData.Data[c+i],xtyp.Rules[i].Reorder);
|
|
end;
|
|
c := c+Length(xtyp.Rules);
|
|
xtyp := col.Find('standard');
|
|
for i := 0 to Length(xtyp.Rules)-1 do begin
|
|
Check((xtyp.Rules[i].Kind=TCldrCollationRuleKind.ReorderSequence),'xtyp.Rules[i].Kind=ReorderSequence');
|
|
CheckEqual(locData.Data[c+i],xtyp.Rules[i].Reorder);
|
|
end;
|
|
k := 3{import statemnts};
|
|
c := c+Length(xtyp.Rules);
|
|
for i := k to Length(typ.Rules)-1 do begin
|
|
Check((typ.Rules[i].Kind=TCldrCollationRuleKind.ReorderSequence),'typ.Rules[i].Kind=ReorderSequence');
|
|
CheckEqual(locData.Data[c+(i-k)],typ.Rules[i].Reorder);
|
|
end;
|
|
WriteLn(' - Step 3 ok');
|
|
finally
|
|
rep.Free();
|
|
end;
|
|
|
|
WriteLn(' -- test ok');
|
|
end;
|
|
|
|
procedure test_collation_parser_complete_rules_2();
|
|
var
|
|
rep : TCldrCollationRepository;
|
|
col, xcol : TCldrCollation;
|
|
typ, xtyp : TCldrCollationItem;
|
|
locData : TReorderSequenceArrayRec;
|
|
c, i, k : Integer;
|
|
begin
|
|
rep := TCldrCollationRepository.Create(PrepareRepositoryLoader());
|
|
try
|
|
col := rep.Load('kw',TCldrParserMode.FullParsing);
|
|
SetLength(locData.Data,23);
|
|
|
|
typ := col.Find('wend');
|
|
locData.ActualLengh := 0;
|
|
Check(ForEachRule(typ,@CopyVisitorFunc,@locData), 'ForEachRule(wend) - 1');
|
|
Check(locData.ActualLengh = 2+1{one}, 'ForEachRule(wend) - 2');
|
|
xcol := rep.Find('xy');
|
|
Check(xcol <> nil);
|
|
xtyp := xcol.Find('one');
|
|
Check(xtyp <> nil);
|
|
Check(Length(xtyp.Rules)=1);
|
|
c := 0;
|
|
for i := 0 to Length(xtyp.Rules)-1 do begin
|
|
Check((xtyp.Rules[i].Kind=TCldrCollationRuleKind.ReorderSequence),'xtyp.Rules[i].Kind=ReorderSequence');
|
|
CheckEqual(locData.Data[c+i],xtyp.Rules[i].Reorder);
|
|
end;
|
|
k := 1 {imports};
|
|
c := c+Length(xtyp.Rules);
|
|
for i := k to Length(typ.Rules)-1 do begin
|
|
Check((typ.Rules[i].Kind=TCldrCollationRuleKind.ReorderSequence),'typ.Rules[i].Kind=ReorderSequence');
|
|
CheckEqual(locData.Data[c+i-k],typ.Rules[i].Reorder);
|
|
end;
|
|
WriteLn(' - Step 1 ok');
|
|
|
|
finally
|
|
rep.Free();
|
|
end;
|
|
|
|
WriteLn(' -- test ok');
|
|
end;
|
|
|
|
procedure test_unicode_set_1();
|
|
var
|
|
x : TUnicodeSet;
|
|
i : Integer;
|
|
s : string;
|
|
begin
|
|
x := TUnicodeSet.Create();
|
|
try
|
|
for i := 0 to 256-1 do
|
|
Check(not x.Contains(AnsiChar(i)));
|
|
WriteLn(' - Stept 1 ok');
|
|
|
|
s := 'azerty';
|
|
x.AddPattern(Format('[%s]',[s]));
|
|
for i := 1 to Length(s) do
|
|
Check(x.Contains(s[i]));
|
|
WriteLn(' - Stept 2 ok');
|
|
finally
|
|
x.Free();
|
|
end;
|
|
|
|
WriteLn(' -- test ok');
|
|
end;
|
|
|
|
procedure test_unicode_set_2();
|
|
var
|
|
x : TUnicodeSet;
|
|
i : Integer;
|
|
begin
|
|
x := TUnicodeSet.Create();
|
|
try
|
|
x.AddPattern('[d-h]');
|
|
for i := Ord('d') to Ord('h') do
|
|
Check(x.Contains(Char(i)));
|
|
WriteLn(' - Stept 1 ok');
|
|
|
|
for i := Ord('a') to Ord('d')-1 do
|
|
Check(not x.Contains(Char(i)));
|
|
WriteLn(' - Stept 2 ok');
|
|
|
|
for i := Ord('h')+1 to 256-1 do
|
|
Check(not x.Contains(Char(i)));
|
|
WriteLn(' - Stept 3 ok');
|
|
finally
|
|
x.Free();
|
|
end;
|
|
|
|
WriteLn(' -- test ok');
|
|
end;
|
|
|
|
procedure test_unicode_set_3();
|
|
var
|
|
x : TUnicodeSet;
|
|
s, s1 : string;
|
|
begin
|
|
x := TUnicodeSet.Create();
|
|
try
|
|
s := 'azerty';
|
|
x.AddPattern(Format('[{%s}]',[s]));
|
|
Check(x.Contains(s));
|
|
WriteLn(' - Stept 1 ok');
|
|
|
|
Check(not x.Contains(s+'12'));
|
|
WriteLn(' - Stept 2 ok');
|
|
|
|
Check(not x.Contains('qs'+s));
|
|
WriteLn(' - Stept 3 ok');
|
|
|
|
s1 := s+'x';
|
|
x.AddPattern(Format('[{%s}]',[s1]));
|
|
Check(x.Contains(s));
|
|
Check(x.Contains(s1));
|
|
WriteLn(' - Stept 4 ok');
|
|
finally
|
|
x.Free();
|
|
end;
|
|
|
|
WriteLn(' -- test ok');
|
|
end;
|
|
|
|
procedure test_collation_table_empty();
|
|
{var
|
|
stackItem : TCollationTable; }
|
|
begin
|
|
|
|
end;
|
|
|
|
end.
|