unit testStringSearchUnit; interface uses StringUnit, StringSearchUnit, XPtest, uses_end; procedure testSearch; procedure testRangeAnsiPosForwardBackward; procedure testRangeWidePosForwardBackward; implementation procedure testSearch; procedure CheckFunction(ForwardSearchIndex, BackwardSearchIndex: Integer; const SubStr, S: String; RangeStart, RangeCount: Integer); begin Check( ForwardSearchIndex, Search(sdForwardToBackward, S, SubStr, StartIndexCount(RangeStart, RangeCount))); Check( BackwardSearchIndex, Search(sdBackwardToForward, S, SubStr, StartIndexCount(RangeStart, RangeCount))); end; function PosForward(const SubStr, S: String; CaseCompare: TCaseCompare = ccCaseSensitive; Index: Integer = 1; Count: Integer = MaxInt): Integer; overload; begin Result := Search(sdForwardToBackward, S, SubStr, StartIndexCount(Index, Count), CaseCompare); end; function PosForward(const SubStr, S: String; Index: Integer; Count: Integer = MaxInt; CaseCompare: TCaseCompare = ccCaseSensitive): Integer; overload; begin Result := Search(sdForwardToBackward, S, SubStr, StartIndexCount(Index, Count), CaseCompare); end; function PosBackward(const Substr, S: String; CaseCompare: TCaseCompare = ccCaseSensitive; Index: Integer = 1; Count: Integer = MaxInt): Integer; overload; begin Result := Search(sdBackwardToForward, S, Substr, StartIndexCount(Index, Count), CaseCompare); end; function PosBackward(const Substr, S: String; Index: Integer; Count: Integer = MaxInt; CaseCompare: TCaseCompare = ccCaseSensitive): Integer; overload; begin Result := Search(sdBackwardToForward, S, Substr, StartIndexCount(Index, Count), CaseCompare); end; begin CheckFunction( 0, 0, 'ABC', 'abcdefghi', 1, 3); CheckFunction( 1, 1, 'ABC', 'ABCDEFGHI', 1, 3); CheckFunction( 0, 0, 'ABC', 'ABCDEFGHI', 1, 2); CheckFunction( 1, 1, 'ABC', 'ABCDEFGHI', 1, 4); CheckFunction( 0, 0, 'ABC', 'ABCDEFGHI', 2, 4); CheckFunction( 4, 4, 'DEF', 'ABCDEFGHI', 1, 6); CheckFunction( 0, 0, 'DEF', 'ABCDEFGHI', 1, 5); CheckFunction( 4, 4, 'DEF', 'ABCDEFGHI', 3, 6); CheckFunction( 4, 4, 'DEF', 'ABCDEFGHI', 4, 3); CheckFunction( 0, 0, 'DEF', 'ABCDEFGHI', 4, 2); CheckFunction( 0, 0, 'DEF', 'ABCDEFGHI', 5, 5); CheckFunction( 0, 0, 'DEF', 'ABCDEFGHI', 0, 6); CheckFunction( 1, 1, 'ABC', 'ABCDEFGHI', 1, MaxInt); Check( 1, PosForward('ABC', 'ABCDEFGHI', ccCaseSensitive, 1) ); Check( 1, PosForward('ABC', 'ABCDEFGHI') ); Check( 1, PosBackward('ABC', 'ABCDEFGHI', ccCaseSensitive, 1) ); Check( 1, PosBackward('ABC', 'ABCDEFGHI') ); CheckFunction( 0, 0, 'ABC', 'ABCDEFGHI', 2, MaxInt); Check( 0, PosForward('ABC', 'ABCDEFGHI', ccCaseSensitive, 2) ); Check( 0, PosBackward('ABC', 'ABCDEFGHI', ccCaseSensitive, 2) ); CheckFunction( 4, 4, 'DEF', 'ABCDEFGHI', 1, MaxInt); Check( 4, PosForward('DEF', 'ABCDEFGHI') ); Check( 4, PosBackward('DEF', 'ABCDEFGHI') ); CheckFunction( 4, 4, 'DEF', 'ABCDEFGHI', 3, MaxInt); CheckFunction( 4, 4, 'DEF', 'ABCDEFGHI', 4, MaxInt); CheckFunction( 0, 0, 'DEF', 'ABCDEFGHI', 5, MaxInt); CheckFunction( 4, 4, 'DEF', 'ABCDEFGHI', 0, MaxInt); // CheckFunction( 1, 1, 'あいう', 'あいう123GHI', 1, 7); CheckFunction( 1, 1, 'あいう', 'あいう123GHI', 1, 6); CheckFunction( 1, 1, 'あいう', 'あいう123GHI', 1, 5); CheckFunction( 1, 1, 'あいう', 'あいう123GHI', 1, 4); CheckFunction( 1, 1, 'あいう', 'あいう123GHI', 1, 3); CheckFunction( 0, 0, 'あいう', 'あいう123GHI', 1, 2); CheckFunction( 0, 0, 'あいう', 'あいう123GHI', 1, 1); CheckFunction( 0, 0, 'あいう', 'あいう123GHI', 2, 6); CheckFunction( 4, 4, '123', 'あいう123GHI', 1, 11); CheckFunction( 4, 4, '123', 'あいう123GHI', 1, 10); CheckFunction( 4, 4, '123', 'あいう123GHI', 1, 9); CheckFunction( 4, 4, '123', 'あいう123GHI', 4, 7); CheckFunction( 4, 4, '123', 'あいう123GHI', 3, 6); CheckFunction( 4, 4, '123', 'あいう123GHI', 2, 6); CheckFunction( 4, 4, '123', 'あいう123GHI', 4, 8); CheckFunction( 4, 4, '123', 'あいう123GHI', 3, 5); CheckFunction( 4, 4, '123', 'あいう123GHI', 3, 4); CheckFunction( 0, 0, '123', 'あいう123GHI', 3, 3); CheckFunction( 0, 0, '123', 'あいう123GHI', 3, 2); CheckFunction( 4, 4, '123', 'あいう123GHI', 4, 5); CheckFunction( 4, 4, '123', 'あいう123GHI', 4, 4); CheckFunction( 4, 4, '123', 'あいう123GHI', 4, 3); CheckFunction( 0, 0, '123', 'あいう123GHI', 4, 2); CheckFunction( 0, 0, '123', 'あいう123GHI', 5, 8); CheckFunction( 0, 0, '123', 'あいう123GHI', 5, 7); CheckFunction( 0, 0, '123', 'あいう123GHI', 5, 6); CheckFunction( 1, 1, 'あいう', 'あいう123GHI', 1, MaxInt); Check( 1, PosForward('あいう', 'あいう123GHI', 1) ); Check( 1, PosForward('あいう', 'あいう123GHI') ); Check( 1, PosBackward('あいう', 'あいう123GHI', 1) ); Check( 1, PosBackward('あいう', 'あいう123GHI') ); CheckFunction( 0, 0, 'あいう', 'あいう123GHI', 2, MaxInt); Check( 0, PosForward('あいう', 'あいう123GHI', 2) ); Check( 0, PosBackward('あいう', 'あいう123GHI', 2) ); CheckFunction( 4, 4, '123', 'あいう123GHI', 1, MaxInt); Check( 4, PosForward('123', 'あいう123GHI') ); Check( 4, PosBackward('123', 'あいう123GHI') ); CheckFunction( 4, 4, '123', 'あいう123GHI', 3, MaxInt); CheckFunction( 4, 4, '123', 'あいう123GHI', 4, MaxInt); CheckFunction( 0, 0, '123', 'あいう123GHI', 5, MaxInt); CheckFunction( 4, 4, '123', 'あいう123GHI', 0, MaxInt); // CheckFunction( 1, 1, 'ABC', 'ABCDEFABCDEF', 1, 3); CheckFunction( 1, 7, 'ABC', 'ABCDEFABCDEF', 1, MaxInt); CheckFunction( 1, 7, 'ABC', 'ABCDEFABCDEF', 1, 9); CheckFunction( 1, 1, 'ABC', 'ABCDEFABCDEF', 1, 8); CheckFunction( 7, 7, 'ABC', 'ABCDEFABCDEF', 2, 8); CheckFunction( 0, 0, 'ABC', 'ABCDEFABCDEF', 2, 7); CheckFunction( 1, 1, 'あいう', 'あいう123あいう123', 1, 3); CheckFunction( 1, 7, 'あいう', 'あいう123あいう123', 1, MaxInt); CheckFunction( 1, 7, 'あいう', 'あいう123あいう123', 1, 9); CheckFunction( 1, 1, 'あいう', 'あいう123あいう123', 1, 8); CheckFunction( 7, 7, 'あいう', 'あいう123あいう123', 2, 8); CheckFunction( 0, 0, 'あいう', 'あいう123あいう123', 2, 7); CheckFunction( 4, 4, '゚Д゚', 'ミ,,゚Д゚彡', 1, 7); CheckFunction(1,1, 'リンゴ', 'リンゴ', 1, 3); CheckFunction(0,0, 'リンゴ', 'リンゴ', 1, 3); //これは一致しない CheckFunction(1,1, 'リ', 'リンコ', 1, 3); CheckFunction(0,0, 'リ', 'リンコ', 1, 3); //これもだめ CheckFunction(0,0, 'リ', 'リンコ', 1, 3); //これもだめ CheckFunction(0,0, '゚', 'リンコ゚', 1, 3); CheckFunction(4,4, '゚', 'リンコ゚', 1, 4); CheckFunction(4,8, '゚', 'リンコ゚リンコ゚', 1, 8); CheckFunction(4,4, '゚', 'リンコ゚リンコ゚', 1, 7); CheckFunction(8,8, '゚', 'リンコ゚リンコ゚', 5, 4); end; procedure testRangeAnsiPosForwardBackward; procedure CheckFunction(ForwardSearchIndex, BackwardSearchIndex: Integer; const SubStr, S: String; RangeStart, RangeCount: Integer); begin Check( ForwardSearchIndex, PosForward(SubStr, S, ccCaseSensitive, RangeStart, RangeCount)); Check( BackwardSearchIndex, PosBackward(SubStr, S, ccCaseSensitive, RangeStart, RangeCount)); end; begin CheckFunction( 0, 0, 'ABC', 'abcdefghi', 1, 3); CheckFunction( 1, 1, 'ABC', 'ABCDEFGHI', 1, 3); CheckFunction( 0, 0, 'ABC', 'ABCDEFGHI', 1, 2); CheckFunction( 1, 1, 'ABC', 'ABCDEFGHI', 1, 4); CheckFunction( 0, 0, 'ABC', 'ABCDEFGHI', 2, 4); CheckFunction( 4, 4, 'DEF', 'ABCDEFGHI', 1, 6); CheckFunction( 0, 0, 'DEF', 'ABCDEFGHI', 1, 5); CheckFunction( 4, 4, 'DEF', 'ABCDEFGHI', 3, 6); CheckFunction( 4, 4, 'DEF', 'ABCDEFGHI', 4, 3); CheckFunction( 0, 0, 'DEF', 'ABCDEFGHI', 4, 2); CheckFunction( 0, 0, 'DEF', 'ABCDEFGHI', 5, 5); CheckFunction( 0, 0, 'DEF', 'ABCDEFGHI', 0, 6); CheckFunction( 1, 1, 'ABC', 'ABCDEFGHI', 1, MaxInt); Check( 1, PosForward('ABC', 'ABCDEFGHI', ccCaseSensitive, 1) ); Check( 1, PosForward('ABC', 'ABCDEFGHI') ); Check( 1, PosBackward('ABC', 'ABCDEFGHI', ccCaseSensitive, 1) ); Check( 1, PosBackward('ABC', 'ABCDEFGHI') ); CheckFunction( 0, 0, 'ABC', 'ABCDEFGHI', 2, MaxInt); Check( 0, PosForward('ABC', 'ABCDEFGHI', ccCaseSensitive, 2) ); Check( 0, PosBackward('ABC', 'ABCDEFGHI', ccCaseSensitive, 2) ); CheckFunction( 4, 4, 'DEF', 'ABCDEFGHI', 1, MaxInt); Check( 4, PosForward('DEF', 'ABCDEFGHI') ); Check( 4, PosBackward('DEF', 'ABCDEFGHI') ); CheckFunction( 4, 4, 'DEF', 'ABCDEFGHI', 3, MaxInt); CheckFunction( 4, 4, 'DEF', 'ABCDEFGHI', 4, MaxInt); CheckFunction( 0, 0, 'DEF', 'ABCDEFGHI', 5, MaxInt); CheckFunction( 0, 0, 'DEF', 'ABCDEFGHI', 0, MaxInt); // CheckFunction( 1, 1, 'あいう', 'あいう123GHI', 1, 7); CheckFunction( 1, 1, 'あいう', 'あいう123GHI', 1, 6); CheckFunction( 1, 1, 'あいう', 'あいう123GHI', 1, 5); CheckFunction( 1, 1, 'あいう', 'あいう123GHI', 1, 4); CheckFunction( 1, 1, 'あいう', 'あいう123GHI', 1, 3); CheckFunction( 0, 0, 'あいう', 'あいう123GHI', 1, 2); CheckFunction( 0, 0, 'あいう', 'あいう123GHI', 1, 1); CheckFunction( 0, 0, 'あいう', 'あいう123GHI', 2, 6); CheckFunction( 4, 4, '123', 'あいう123GHI', 1, 11); CheckFunction( 4, 4, '123', 'あいう123GHI', 1, 10); CheckFunction( 4, 4, '123', 'あいう123GHI', 1, 9); CheckFunction( 4, 4, '123', 'あいう123GHI', 4, 7); CheckFunction( 4, 4, '123', 'あいう123GHI', 3, 6); CheckFunction( 4, 4, '123', 'あいう123GHI', 2, 6); CheckFunction( 4, 4, '123', 'あいう123GHI', 4, 8); CheckFunction( 4, 4, '123', 'あいう123GHI', 3, 5); CheckFunction( 4, 4, '123', 'あいう123GHI', 3, 4); CheckFunction( 0, 0, '123', 'あいう123GHI', 3, 3); CheckFunction( 0, 0, '123', 'あいう123GHI', 3, 2); CheckFunction( 4, 4, '123', 'あいう123GHI', 4, 5); CheckFunction( 4, 4, '123', 'あいう123GHI', 4, 4); CheckFunction( 4, 4, '123', 'あいう123GHI', 4, 3); CheckFunction( 0, 0, '123', 'あいう123GHI', 4, 2); CheckFunction( 0, 0, '123', 'あいう123GHI', 5, 8); CheckFunction( 0, 0, '123', 'あいう123GHI', 5, 7); CheckFunction( 0, 0, '123', 'あいう123GHI', 5, 6); // CheckFunction( 7, 7, '123', 'あいう123GHI', 7, 6); // CheckFunction( 0, 0, '123', 'あいう123GHI', 7, 5); // CheckFunction( 0, 0, '123', 'あいう123GHI', 8, 8); // CheckFunction( 0, 0, '123', 'あいう123GHI', 0, 12); // // CheckFunction( 1, 1, 'あいう', 'あいう123GHI', 1, MaxInt); // Check( 1, PosForward('あいう', 'あいう123GHI', 1) ); // Check( 1, PosForward('あいう', 'あいう123GHI') ); // Check( 1, PosBackward('あいう', 'あいう123GHI', 1) ); // Check( 1, PosBackward('あいう', 'あいう123GHI') ); // // CheckFunction( 0, 0, 'あいう', 'あいう123GHI', 2, MaxInt); // Check( 0, PosForward('あいう', 'あいう123GHI', 2) ); // Check( 0, PosBackward('あいう', 'あいう123GHI', 2) ); // // CheckFunction( 7, 7, '123', 'あいう123GHI', 1, MaxInt); // Check( 7, PosForward('123', 'あいう123GHI') ); // Check( 7, PosBackward('123', 'あいう123GHI') ); // // CheckFunction( 7, 7, '123', 'あいう123GHI', 6, MaxInt); // CheckFunction( 7, 7, '123', 'あいう123GHI', 7, MaxInt); // CheckFunction( 0, 0, '123', 'あいう123GHI', 8, MaxInt); // CheckFunction( 0, 0, '123', 'あいう123GHI', 0, MaxInt); //// // // CheckFunction( 1, 1, 'ABC', 'ABCDEFABCDEF', 1, 3); // CheckFunction( 1, 7, 'ABC', 'ABCDEFABCDEF', 1, MaxInt); // CheckFunction( 1, 7, 'ABC', 'ABCDEFABCDEF', 1, 9); // CheckFunction( 1, 1, 'ABC', 'ABCDEFABCDEF', 1, 8); // CheckFunction( 7, 7, 'ABC', 'ABCDEFABCDEF', 2, 8); // CheckFunction( 0, 0, 'ABC', 'ABCDEFABCDEF', 2, 7); // // CheckFunction( 1, 1, 'あいう', 'あいう123あいう123', 1, 6); // CheckFunction( 1,13, 'あいう', 'あいう123あいう123', 1, MaxInt); // CheckFunction( 1,13, 'あいう', 'あいう123あいう123', 1, 18); // CheckFunction( 1, 1, 'あいう', 'あいう123あいう123', 1, 17); // CheckFunction(13,13, 'あいう', 'あいう123あいう123', 2, 17); // CheckFunction( 0, 0, 'あいう', 'あいう123あいう123', 2, 16); end; procedure testRangeWidePosForwardBackward; procedure CheckFunction(ForwardSearchIndex, BackwardSearchIndex: Integer; const SubStr, S: WideString; RangeStart, RangeCount: Integer); begin Check( ForwardSearchIndex, PosForward(SubStr, S, ccCaseSensitive, RangeStart, RangeCount)); Check( BackwardSearchIndex, PosBackward(SubStr, S, ccCaseSensitive, RangeStart, RangeCount)); end; begin CheckFunction( 1, 1, 'ABC', 'ABCDEFGHI', 1, 3); CheckFunction( 0, 0, 'ABC', 'ABCDEFGHI', 1, 2); CheckFunction( 1, 1, 'ABC', 'ABCDEFGHI', 1, 4); CheckFunction( 0, 0, 'ABC', 'ABCDEFGHI', 2, 4); CheckFunction( 4, 4, 'DEF', 'ABCDEFGHI', 1, 6); CheckFunction( 0, 0, 'DEF', 'ABCDEFGHI', 1, 5); CheckFunction( 4, 4, 'DEF', 'ABCDEFGHI', 3, 6); CheckFunction( 4, 4, 'DEF', 'ABCDEFGHI', 4, 3); CheckFunction( 0, 0, 'DEF', 'ABCDEFGHI', 4, 2); CheckFunction( 0, 0, 'DEF', 'ABCDEFGHI', 5, 5); CheckFunction( 0, 0, 'DEF', 'ABCDEFGHI', 0, 6); CheckFunction( 1, 1, 'ABC', 'ABCDEFGHI', 1, MaxInt); Check( 1, PosForward('ABC', 'ABCDEFGHI', ccCaseSensitive, 1) ); Check( 1, PosForward('ABC', 'ABCDEFGHI') ); Check( 1, PosBackward('ABC', 'ABCDEFGHI', ccCaseSensitive, 1) ); Check( 1, PosBackward('ABC', 'ABCDEFGHI') ); CheckFunction( 0, 0, 'ABC', 'ABCDEFGHI', 2, MaxInt); Check( 0, PosForward('ABC', 'ABCDEFGHI', ccCaseSensitive, 2) ); Check( 0, PosBackward('ABC', 'ABCDEFGHI', ccCaseSensitive, 2) ); CheckFunction( 4, 4, 'DEF', 'ABCDEFGHI', 1, MaxInt); Check( 4, PosForward('DEF', 'ABCDEFGHI') ); Check( 4, PosBackward('DEF', 'ABCDEFGHI') ); CheckFunction( 4, 4, 'DEF', 'ABCDEFGHI', 3, MaxInt); CheckFunction( 4, 4, 'DEF', 'ABCDEFGHI', 4, MaxInt); CheckFunction( 0, 0, 'DEF', 'ABCDEFGHI', 5, MaxInt); CheckFunction( 0, 0, 'DEF', 'ABCDEFGHI', 0, MaxInt); // CheckFunction( 1, 1, 'あいう', 'あいう123GHI', 1, 3); CheckFunction( 0, 0, 'あいう', 'あいう123GHI', 1, 2); CheckFunction( 1, 1, 'あいう', 'あいう123GHI', 1, 4); CheckFunction( 0, 0, 'あいう', 'あいう123GHI', 2, 3); CheckFunction( 4, 4, '123', 'あいう123GHI', 1, 6); CheckFunction( 0, 0, '123', 'あいう123GHI', 1, 5); CheckFunction( 4, 4, '123', 'あいう123GHI', 4, 6); CheckFunction( 4, 4, '123', 'あいう123GHI', 4, 3); CheckFunction( 0, 0, '123', 'あいう123GHI', 4, 2); CheckFunction( 0, 0, '123', 'あいう123GHI', 5, 4); CheckFunction( 0, 0, '123', 'あいう123GHI', 0, 6); CheckFunction( 1, 1, 'あいう', 'あいう123GHI', 1, MaxInt); Check( 1, PosForward('あいう', 'あいう123GHI', 1) ); Check( 1, PosForward('あいう', 'あいう123GHI') ); Check( 1, PosBackward('あいう', 'あいう123GHI', 1) ); Check( 1, PosBackward('あいう', 'あいう123GHI') ); CheckFunction( 0, 0, 'あいう', 'あいう123GHI', 2, MaxInt); Check( 0, PosForward('あいう', 'あいう123GHI', 2) ); Check( 0, PosBackward('あいう', 'あいう123GHI', 2) ); CheckFunction( 4, 4, '123', 'あいう123GHI', 1, MaxInt); Check( 4, PosForward('123', 'あいう123GHI') ); Check( 4, PosBackward('123', 'あいう123GHI') ); CheckFunction( 4, 4, '123', 'あいう123GHI', 3, MaxInt); CheckFunction( 4, 4, '123', 'あいう123GHI', 4, MaxInt); CheckFunction( 0, 0, '123', 'あいう123GHI', 5, MaxInt); CheckFunction( 0, 0, '123', 'あいう123GHI', 0, MaxInt); // CheckFunction( 1, 1, 'ABC', 'ABCDEFABCDEF', 1, 3); CheckFunction( 1, 7, 'ABC', 'ABCDEFABCDEF', 1, MaxInt); CheckFunction( 1, 7, 'ABC', 'ABCDEFABCDEF', 1, 9); CheckFunction( 1, 1, 'ABC', 'ABCDEFABCDEF', 1, 8); CheckFunction( 7, 7, 'ABC', 'ABCDEFABCDEF', 2, 8); CheckFunction( 0, 0, 'ABC', 'ABCDEFABCDEF', 2, 7); CheckFunction( 1, 1, 'あいう', 'あいう123あいう123', 1, 3); CheckFunction( 1, 7, 'あいう', 'あいう123あいう123', 1, MaxInt); CheckFunction( 1, 7, 'あいう', 'あいう123あいう123', 1, 9); CheckFunction( 1, 1, 'あいう', 'あいう123あいう123', 1, 8); CheckFunction( 7, 7, 'あいう', 'あいう123あいう123', 2, 8); CheckFunction( 0, 0, 'あいう', 'あいう123あいう123', 2, 7); CheckFunction( 4, 4, '゚Д゚', 'ミ,,゚Д゚彡', 1, 7); CheckFunction(1,1, 'リンゴ', 'リンゴ', 1, 3); CheckFunction(0,0, 'リンゴ', 'リンゴ', 1, 3); //これは一致しない CheckFunction(1,1, 'リ', 'リンコ', 1, 3); CheckFunction(0,0, 'リ', 'リンコ', 1, 3); //これもだめ CheckFunction(0,0, 'リ', 'リンコ', 1, 3); //これもだめ CheckFunction(0,0, '゚', 'リンコ゚', 1, 3); CheckFunction(4,4, '゚', 'リンコ゚', 1, 4); CheckFunction(4,8, '゚', 'リンコ゚リンコ゚', 1, 8); CheckFunction(4,4, '゚', 'リンコ゚リンコ゚', 1, 7); CheckFunction(8,8, '゚', 'リンコ゚リンコ゚', 5, 4); end; end.