Changeset 110
- Timestamp:
- Apr 25, 2007, 10:26:44 AM (18 years ago)
- Location:
- trunk/NewView
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/NewView/StringUtilsUnit.pas
r106 r110 5 5 // This software is released under the GNU Public License - see readme.txt 6 6 7 // Helper functions to work with strings7 // Helper functions to work with String and AnsiString 8 8 9 9 Interface 10 10 11 11 uses 12 Classes; 12 Classes, 13 CharUtilsUnit; 13 14 14 15 const 15 StrTAB = chr(9);16 StrCR = chr(13);17 StrLF = chr(10);16 StrTAB = CharTAB; 17 StrCR = CharCR; 18 StrLF = CharLF; 18 19 StrCRLF = StrCR + StrLF; 19 20 StrSingleQuote = ''''; … … 36 37 end; 37 38 38 TYPE39 TSetOfChars = set of char;40 41 39 // prefices all occurences of one of the chars in aStringWithChars with anEscape char 42 40 // if the escapeChar itself is found, then it is doubled … … 110 108 // use double quotes if you need blanks in the strings 111 109 Procedure StrExtractStringsQuoted(Var aResult: TStrings; const aReceiver: String ); 110 111 112 // returns the position of aPart in aString 113 // case insensitive 114 Function CaseInsensitivePos(const aPart: String; const aString: String ): longint; 115 116 // -------------------- 117 // ---- AnsiString ---- 118 // -------------------- 119 120 121 // removes all occurences of char from aSetOfChars from the beginning 122 // of a String. 123 Function AnsiStrTrimLeftChars(const aReceiver: AnsiString; const aSetOfChars: TSetOfChars): AnsiString; 124 125 // removes all occurences of char from aSetOfChars from the end 126 // of a String. 127 Function AnsiStrTrimRightChars(const aReceiver: AnsiString; const aSetOfChars: TSetOfChars): AnsiString; 128 129 // removes all occurences of char from aSetOfChars from the beginning 130 // end the end of a String. 131 Function AnsiStrTrimChars(const aReceiver: AnsiString; const aSetOfChars: TSetOfChars): AnsiString; 132 133 // removes all blanks from beginning and end 134 Function AnsiStrTrim(const aReceiver: AnsiString): AnsiString; 135 136 137 112 138 113 139 Implementation … … 270 296 Function StrTrimLeftChars(const aReceiver: String; const aSetOfChars: TSetOfChars): String; 271 297 Var 272 i : Longint; 273 Begin 298 tmpLength : integer; 299 i : integer; 300 Begin 301 tmpLength := Length(aReceiver); 302 303 if 1 > tmpLength then 304 begin 305 result := aReceiver; 306 exit; 307 end; 308 274 309 i := 1; 275 310 // mem optimization 276 311 if aReceiver[i] in aSetOfChars then 277 312 begin 278 while i <= Length(aReceiver)do313 while i <= tmpLength do 279 314 begin 280 315 if aReceiver[i] in aSetOfChars then … … 294 329 Function StrTrimRightChars(const aReceiver: String; const aSetOfChars: TSetOfChars): String; 295 330 Var 296 i : Longint;331 i : integer; 297 332 Begin 298 333 i := Length(aReceiver); 334 335 if 1 > i then 336 begin 337 result := aReceiver; 338 exit; 339 end; 299 340 300 341 // mem optimization … … 319 360 Function StrTrimChars(const aReceiver: String; const aSetOfChars: TSetOfChars): String; 320 361 Var 321 i : Longint; 322 j : Longint; 362 i,j : integer; 323 363 tmpNeedCopy : boolean; 324 364 Begin 365 j := Length(aReceiver); 366 367 if 1 > j then 368 begin 369 result := aReceiver; 370 exit; 371 end; 372 325 373 tmpNeedCopy := false; 326 374 i := 1; 327 while i < Length(aReceiver)do375 while i < j do 328 376 begin 329 377 if aReceiver[i] in aSetOfChars then … … 338 386 end; 339 387 340 j := Length(aReceiver);341 388 while j >= i do 342 389 begin … … 701 748 end; 702 749 end; 750 751 752 Function CaseInsensitivePos(const aPart: String; const aString: String) : longint; 753 Var 754 EndOfPart: longword; 755 Begin 756 // Result := Pos(UpperCase(aPart), Uppercase(aString)); 757 758 // Aarons assembler version :-) 759 Asm 760 //Locals: 761 //a at [EBP+12] 762 //b at [EBP+8] 763 764 // First get and check lengths 765 MOV ESI, aPart // get address of aPart into ESI 766 MOV CL, [ESI] // get length of aPart 767 CMP CL, 0 // if aPart is empty then return null to simulate the behavior of POS 768 JE !CIP_NoMatch 769 770 MOV EDI, aString // get address of aString into EDI 771 MOV DL, [EDI] // get length of aString 772 CMP CL, DL 773 JBE !CIP_PartFitsInString 774 775 // aParta longer than aString so aPart can't be in aString 776 777 !CIP_NoMatch: 778 MOV EAX, 0 779 LEAVE 780 RETN32 8 781 782 !CIP_PartFitsInString: 783 INC ESI // skip length byte in aPart 784 INC EDI // skip length byte of aString 785 786 // get ending address of b into EDX 787 MOVZX EDX, DL // widen DL 788 ADD EDX, EDI // add start of aString 789 790 // get ending address of a into EndOfA 791 MOVZX ECX, CL // widen CL 792 ADD ECX, ESI // add start of aPart 793 MOV EndOfPart, ECX // store to EndOfPart 794 795 MOV ECX, EDI // set start of current match to start of b 796 797 // ESI: current search point in a 798 // EDI: current search point in b 799 // EDX: end of b 800 // ECX: start of current match 801 // available: eax, ebx 802 803 JMP !CIP_Loop 804 805 !CIP_LoopStart: 806 CMP EDI, EDX 807 JE !CIP_NoMatch // run out of b 808 809 MOV AL, [ESI] // get next char of a 810 INC ESI // next in a 811 812 MOV BL, [EDI] // get next char of b 813 INC EDI // next in b 814 815 // Convert chars to uppercase 816 CMP AL, 97 817 JB !CIP_Upcase1 818 CMP AL, 122 819 JA !CIP_Upcase1 820 SUB AL, 32 // convert lower to upper 821 !CIP_Upcase1: 822 823 CMP BL,97 824 JB !CIP_Upcase2 825 CMP BL,122 826 JA !CIP_Upcase2 827 SUB BL,32 // convert lower to upper 828 !CIP_Upcase2: 829 830 // Compare uppercased chars 831 CMP AL,BL 832 JE !CIP_Loop 833 834 // different. 835 836 // Back to start of match + 1 837 INC ECX // inc start of match 838 MOV EDI, ECX // back to start of match in b 839 MOV ESI, aPart // back to start of aPart 840 INC ESI // skip length 841 JMP !CIP_LoopStart 842 843 !CIP_Loop: 844 845 // same 846 CMP ESI, EndOfPart // have we reached the end of a 847 JB !CIP_LoopStart 848 849 // Match, return position 850 SUB ECX, [EBP+8] // position = ( start of match ) - ( start of b ) + 1 851 MOV EAX, ECX 852 LEAVE 853 RETN32 8 854 end; 855 end; 856 857 858 // -------------------- 859 // ---- AnsiString ---- 860 // -------------------- 861 862 863 Function AnsiStrTrimLeftChars(const aReceiver: AnsiString; const aSetOfChars: TSetOfChars): AnsiString; 864 Var 865 tmpLength : integer; 866 i : integer; 867 Begin 868 tmpLength := Length(aReceiver); 869 870 if 1 > tmpLength then 871 begin 872 result := aReceiver; 873 exit; 874 end; 875 876 i := 1; 877 // mem optimization 878 if aReceiver[i] in aSetOfChars then 879 begin 880 while i <= tmpLength do 881 begin 882 if aReceiver[i] in aSetOfChars then 883 inc(i) 884 else 885 break; 886 end; 887 result := AnsiCopy(aReceiver, i, Length(aReceiver)-i+1); 888 end 889 else 890 begin 891 result := aReceiver; 892 end; 893 end; 894 895 896 Function AnsiStrTrimRightChars(const aReceiver: AnsiString; const aSetOfChars: TSetOfChars): AnsiString; 897 Var 898 i : integer; 899 Begin 900 i := Length(aReceiver); 901 902 if 1 > i then 903 begin 904 result := aReceiver; 905 exit; 906 end; 907 908 // mem optimization 909 if aReceiver[i] in aSetOfChars then 910 begin 911 while i > 0 do 912 begin 913 if aReceiver[i] in aSetOfChars then 914 dec(i) 915 else 916 break; 917 end; 918 result := AnsiCopy(aReceiver, 1, i); 919 end 920 else 921 begin 922 result := aReceiver; 923 end; 924 end; 925 926 927 Function AnsiStrTrimChars(const aReceiver: AnsiString; const aSetOfChars: TSetOfChars): AnsiString; 928 Var 929 i,j : integer; 930 tmpNeedCopy : boolean; 931 Begin 932 tmpNeedCopy := false; 933 934 j := Length(aReceiver); 935 936 if 1 > j then 937 begin 938 result := aReceiver; 939 exit; 940 end; 941 942 i := 1; 943 while i < j do 944 begin 945 if aReceiver[i] in aSetOfChars then 946 begin 947 inc(i); 948 tmpNeedCopy := true; 949 end 950 else 951 begin 952 break; 953 end; 954 end; 955 956 while j >= i do 957 begin 958 if aReceiver[j] in aSetOfChars then 959 begin 960 dec(j); 961 tmpNeedCopy := true; 962 end 963 else 964 begin 965 break; 966 end; 967 end; 968 969 if tmpNeedCopy then 970 begin 971 result := AnsiCopy(aReceiver, i, j-i+1); 972 end 973 else 974 begin 975 result := aReceiver; 976 end; 977 end; 978 979 980 Function AnsiStrTrim(const aReceiver: AnsiString): AnsiString; 981 Begin 982 result := AnsiStrTrimChars(aReceiver, [' ']); 983 end; 984 985 703 986 END. -
trunk/NewView/unittests/StringUtilsUnitTests.pas
r106 r110 5 5 uses 6 6 Classes, 7 SysUtils, 7 8 TestAssert, 8 9 StringUtilsUnit; … … 1675 1676 // ---------------------------------------------------------- 1676 1677 1678 1679 PROCEDURE testCaseInsensitivePos_Empty; 1680 VAR 1681 tmpResult : longint; 1682 BEGIN 1683 tmpResult := CaseInsensitivePos('', ''); 1684 1685 assertEqualsInt('testCaseInsensitivePos_Empty', Pos('', ''), tmpResult); 1686 END; 1687 1688 1689 PROCEDURE testCaseInsensitivePos_EmptyPart; 1690 VAR 1691 tmpResult : longint; 1692 BEGIN 1693 tmpResult := CaseInsensitivePos('', 'abc'); 1694 1695 assertEqualsInt('testCaseInsensitivePos_EmptyPart', Pos('', 'abc'), tmpResult); 1696 END; 1697 1698 1699 PROCEDURE testCaseInsensitivePos_EmptyString; 1700 VAR 1701 tmpResult : longint; 1702 BEGIN 1703 tmpResult := CaseInsensitivePos('abc', ''); 1704 1705 assertEqualsInt('testCaseInsensitivePos_EmptyString', Pos('abc', ''), tmpResult); 1706 END; 1707 1708 1709 PROCEDURE testCaseInsensitivePos_PartLarger; 1710 VAR 1711 tmpResult : longint; 1712 BEGIN 1713 tmpResult := CaseInsensitivePos('abc', 'ab'); 1714 1715 assertEqualsInt('testCaseInsensitivePos_PartLarger', Pos('abc', 'ab'), tmpResult); 1716 END; 1717 1718 1719 PROCEDURE testCaseInsensitivePos_AtLeft; 1720 VAR 1721 tmpResult : integer; 1722 BEGIN 1723 tmpResult := CaseInsensitivePos('abCd', 'aBcDef'); 1724 1725 assertEqualsInt('testCaseInsensitivePos_AtLeft', Pos('abcd', 'abcdef'), tmpResult); 1726 END; 1727 1728 1729 PROCEDURE testCaseInsensitivePos_Middle; 1730 VAR 1731 tmpResult : integer; 1732 BEGIN 1733 tmpResult := CaseInsensitivePos('abCd', '12aBcDef'); 1734 1735 assertEqualsInt('testCaseInsensitivePos_Middle', Pos('abcd', '12abcdef'), tmpResult); 1736 END; 1737 1738 1739 PROCEDURE testCaseInsensitivePos_AtRight; 1740 VAR 1741 tmpResult : integer; 1742 BEGIN 1743 tmpResult := CaseInsensitivePos('abCd', 'efaBcD'); 1744 1745 assertEqualsInt('testCaseInsensitivePos_AtRight', Pos('abcd', 'efabcd'), tmpResult); 1746 END; 1747 1748 1749 PROCEDURE testCaseInsensitivePos; 1750 VAR 1751 tmpPart : String; 1752 tmpString : String; 1753 tmpResult,i : integer; 1754 BEGIN 1755 tmpPart := ''; 1756 tmpString := ''; 1757 1758 for i:=1 to 255 do 1759 begin 1760 tmpPart := tmpPart + char(i); 1761 tmpString := tmpString + char(i); 1762 end; 1763 1764 tmpResult := CaseInsensitivePos(tmpPart, UpperCase(tmpString)); 1765 assertEqualsInt('testCaseInsensitivePos', 1, tmpResult); 1766 1767 tmpResult := CaseInsensitivePos(UpperCase(tmpPart), tmpString); 1768 assertEqualsInt('testCaseInsensitivePos', 1, tmpResult); 1769 1770 tmpResult := CaseInsensitivePos(tmpPart, LowerCase(tmpString)); 1771 assertEqualsInt('testCaseInsensitivePos', 1, tmpResult); 1772 1773 tmpResult := CaseInsensitivePos(LowerCase(tmpPart), tmpString); 1774 assertEqualsInt('testCaseInsensitivePos', 1, tmpResult); 1775 END; 1776 1777 1778 // -------------------- 1779 // ---- AnsiString ---- 1780 // -------------------- 1781 1782 1783 PROCEDURE testAnsiTrimLeftChars_Empty; 1784 VAR 1785 tmpResult : AnsiString; 1786 tmpValue : AnsiString; 1787 BEGIN 1788 tmpValue := ''; 1789 tmpResult := AnsiStrTrimLeftChars(tmpValue, ['b', 'x']); 1790 1791 assertEqualsAnsiString('testAnsiTrimLeftChars_Empty', '', tmpResult); 1792 END; 1793 1794 1795 PROCEDURE testAnsiTrimLeftChars_RemoveAll; 1796 VAR 1797 tmpResult : AnsiString; 1798 tmpValue : AnsiString; 1799 BEGIN 1800 tmpValue := 'bxxxbx'; 1801 tmpResult := AnsiStrTrimLeftChars(tmpValue, ['b', 'x']); 1802 1803 assertEqualsAnsiString('testAnsiTrimLeftChars_RemoveAll', '', tmpResult); 1804 END; 1805 1806 1807 PROCEDURE testAnsiTrimLeftChars_OneLeft; 1808 VAR 1809 tmpResult : AnsiString; 1810 tmpValue : AnsiString; 1811 BEGIN 1812 tmpValue := 'bxy'; 1813 tmpResult := AnsiStrTrimLeftChars(tmpValue, ['b', 'x']); 1814 1815 assertEqualsAnsiString('testAnsiTrimLeftChars_OneLeft', 'y', tmpResult); 1816 END; 1817 1818 1819 PROCEDURE testAnsiTrimLeftChars_LeftOnly; 1820 VAR 1821 tmpResult : AnsiString; 1822 tmpValue : AnsiString; 1823 BEGIN 1824 tmpValue := 'bxbxxay'; 1825 tmpResult := AnsiStrTrimLeftChars(tmpValue, ['b', 'x']); 1826 1827 assertEqualsAnsiString('testAnsiTrimLeftChars_LeftOnly', 'ay', tmpResult); 1828 END; 1829 1830 1831 PROCEDURE testAnsiTrimLeftChars_CharsInside; 1832 VAR 1833 tmpResult : AnsiString; 1834 tmpValue : AnsiString; 1835 BEGIN 1836 tmpValue := 'bxabxvvx'; 1837 tmpResult := AnsiStrTrimLeftChars(tmpValue, ['b', 'x']); 1838 1839 assertEqualsAnsiString('testAnsiTrimLeftChars_CharsInside', 'abxvvx', tmpResult); 1840 END; 1841 1842 1843 PROCEDURE testAnsiTrimLeftChars_Nothing; 1844 VAR 1845 tmpResult : AnsiString; 1846 tmpValue : AnsiString; 1847 BEGIN 1848 tmpValue := 'acdef'; 1849 tmpResult := AnsiStrTrimLeftChars('acdef', ['b', 'x']); 1850 1851 assertEqualsAnsiString('testAnsiTrimLeftChars_Nothing', 'acdef', tmpResult); 1852 END; 1853 1854 1855 PROCEDURE testAnsiTrimLeftChars_ReallyLong; 1856 VAR 1857 tmpResult : AnsiString; 1858 tmpValue : AnsiString; 1859 BEGIN 1860 tmpValue := '0123456789'; 1861 tmpValue := tmpValue + tmpValue; 1862 tmpValue := tmpValue + tmpValue; 1863 tmpValue := tmpValue + tmpValue; 1864 tmpValue := tmpValue + tmpValue; 1865 tmpValue := tmpValue + tmpValue; 1866 assertEqualsInt('testAnsiTrimLeftChars_ReallyLong', 320, Length(tmpValue)); 1867 1868 tmpResult := AnsiStrTrimLeftChars(tmpValue, ['0', '1']); 1869 1870 assertEqualsInt('testAnsiTrimLeftChars_ReallyLong', 318, Length(tmpResult)); 1871 END; 1872 1873 1874 // ------------------------------------------------------------------- 1875 1876 1877 PROCEDURE testAnsiTrimRightChars_Empty; 1878 VAR 1879 tmpResult : AnsiString; 1880 tmpValue : AnsiString; 1881 BEGIN 1882 tmpValue := ''; 1883 tmpResult := AnsiStrTrimRightChars(tmpValue, ['b', 'x']); 1884 1885 assertEqualsAnsiString('testAnsiTrimRightChars_Empty', '', tmpResult); 1886 END; 1887 1888 1889 PROCEDURE testAnsiTrimRightChars_RemoveAll; 1890 VAR 1891 tmpResult : AnsiString; 1892 tmpValue : AnsiString; 1893 BEGIN 1894 tmpValue := 'bxxxbx'; 1895 tmpResult := AnsiStrTrimRightChars(tmpValue, ['b', 'x']); 1896 1897 assertEqualsAnsiString('testAnsiTrimRightChars_RemoveAll', '', tmpResult); 1898 END; 1899 1900 1901 PROCEDURE testAnsiTrimRightChars_OneLeft; 1902 VAR 1903 tmpResult : AnsiString; 1904 tmpValue : AnsiString; 1905 BEGIN 1906 tmpValue := 'ybx'; 1907 tmpResult := AnsiStrTrimRightChars(tmpValue, ['b', 'x']); 1908 1909 assertEqualsAnsiString('testAnsiTrimRightChars_OneLeft', 'y', tmpResult); 1910 END; 1911 1912 1913 PROCEDURE testAnsiTrimRightChars_RightOnly; 1914 VAR 1915 tmpResult : AnsiString; 1916 tmpValue : AnsiString; 1917 BEGIN 1918 tmpValue := 'aybxbxx'; 1919 tmpResult := AnsiStrTrimRightChars(tmpValue, ['b', 'x']); 1920 1921 assertEqualsAnsiString('testAnsiTrimRightChars_RightOnly', 'ay', tmpResult); 1922 END; 1923 1924 1925 PROCEDURE testAnsiTrimRightChars_CharsInside; 1926 VAR 1927 tmpResult : AnsiString; 1928 tmpValue : AnsiString; 1929 BEGIN 1930 tmpValue := 'abxvvxb'; 1931 tmpResult := AnsiStrTrimRightChars(tmpValue, ['b', 'x']); 1932 1933 assertEqualsAnsiString('testAnsiTrimRightChars_CharsInside', 'abxvv', tmpResult); 1934 END; 1935 1936 1937 PROCEDURE testAnsiTrimRightChars_Nothing; 1938 VAR 1939 tmpResult : AnsiString; 1940 tmpValue : AnsiString; 1941 BEGIN 1942 tmpValue := 'acdef'; 1943 tmpResult := AnsiStrTrimRightChars(tmpValue, ['b', 'x']); 1944 1945 assertEqualsAnsiString('testAnsiTrimRightChars_Nothing', 'acdef', tmpResult); 1946 END; 1947 1948 1949 PROCEDURE testAnsiTrimRightChars_ReallyLong; 1950 VAR 1951 tmpResult : AnsiString; 1952 tmpValue : AnsiString; 1953 BEGIN 1954 tmpValue := '0123456789'; 1955 tmpValue := tmpValue + tmpValue; 1956 tmpValue := tmpValue + tmpValue; 1957 tmpValue := tmpValue + tmpValue; 1958 tmpValue := tmpValue + tmpValue; 1959 tmpValue := tmpValue + tmpValue; 1960 assertEqualsInt('testAnsiTrimRightChars_ReallyLong', 320, Length(tmpValue)); 1961 1962 tmpResult := AnsiStrTrimRightChars(tmpValue, ['8', '9']); 1963 1964 assertEqualsInt('testAnsiTrimRightChars_ReallyLong', 318, Length(tmpResult)); 1965 END; 1966 1967 1968 // ------------------------------------------------------------------- 1969 1970 PROCEDURE testAnsiTrimChars_Empty; 1971 VAR 1972 tmpResult : AnsiString; 1973 tmpValue : AnsiString; 1974 BEGIN 1975 tmpValue := ''; 1976 tmpResult := AnsiStrTrimChars(tmpValue, ['b', 'x']); 1977 1978 assertEqualsAnsiString('testAnsiTrimChars_Empty', '', tmpResult); 1979 END; 1980 1981 1982 PROCEDURE testAnsiTrimChars_RemoveAll; 1983 VAR 1984 tmpResult : AnsiString; 1985 tmpValue : AnsiString; 1986 BEGIN 1987 tmpValue := 'bxxxbx'; 1988 tmpResult := AnsiStrTrimChars(tmpValue, ['b', 'x']); 1989 1990 assertEqualsAnsiString('testAnsiTrimChars_RemoveAll', '', tmpResult); 1991 END; 1992 1993 1994 PROCEDURE testAnsiTrimChars_OneLeftFromLeft; 1995 VAR 1996 tmpResult : AnsiString; 1997 tmpValue : AnsiString; 1998 BEGIN 1999 tmpValue := 'bxa'; 2000 tmpResult := AnsiStrTrimChars(tmpValue, ['b', 'x']); 2001 2002 assertEqualsAnsiString('testAnsiTrimChars_OneLeftFromLeft', 'a', tmpResult); 2003 END; 2004 2005 2006 PROCEDURE testAnsiTrimChars_OneLeftFromRight; 2007 VAR 2008 tmpResult : AnsiString; 2009 tmpValue : AnsiString; 2010 BEGIN 2011 tmpValue := 'abx'; 2012 tmpResult := AnsiStrTrimChars(tmpValue, ['b', 'x']); 2013 2014 assertEqualsAnsiString('testAnsiTrimChars_OneLeftFromRight', 'a', tmpResult); 2015 END; 2016 2017 2018 PROCEDURE testAnsiTrimChars_LeftOnly; 2019 VAR 2020 tmpResult : AnsiString; 2021 tmpValue : AnsiString; 2022 BEGIN 2023 tmpValue := 'bxbxxay'; 2024 tmpResult := AnsiStrTrimChars(tmpValue, ['b', 'x']); 2025 2026 assertEqualsAnsiString('testAnsiTrimChars_LeftOnly', 'ay', tmpResult); 2027 END; 2028 2029 2030 PROCEDURE testAnsiTrimChars_RightOnly; 2031 VAR 2032 tmpResult : AnsiString; 2033 tmpValue : AnsiString; 2034 BEGIN 2035 tmpValue := 'aybxbxx'; 2036 tmpResult := AnsiStrTrimChars(tmpValue, ['b', 'x']); 2037 2038 assertEqualsAnsiString('testAnsiTrimChars_LeftOnly', 'ay', tmpResult); 2039 END; 2040 2041 2042 PROCEDURE testAnsiTrimChars_CharsInside; 2043 VAR 2044 tmpResult : AnsiString; 2045 tmpValue : AnsiString; 2046 BEGIN 2047 tmpValue := 'bxabxvvx'; 2048 tmpResult := AnsiStrTrimChars(tmpValue, ['b', 'x']); 2049 2050 assertEqualsAnsiString('testAnsiTrimChars_CharsInside', 'abxvv', tmpResult); 2051 END; 2052 2053 2054 PROCEDURE testAnsiTrimChars_Nothing; 2055 VAR 2056 tmpResult : AnsiString; 2057 tmpValue : AnsiString; 2058 BEGIN 2059 tmpValue := 'acdef'; 2060 tmpResult := AnsiStrTrimChars(tmpValue, ['b', 'x']); 2061 2062 assertEqualsAnsiString('testAnsiTrimChars_Nothing', 'acdef', tmpResult); 2063 END; 2064 2065 2066 PROCEDURE testAnsiTrimChars_ReallyLong; 2067 VAR 2068 tmpResult : AnsiString; 2069 tmpValue : AnsiString; 2070 BEGIN 2071 tmpValue := '0123456789'; 2072 tmpValue := tmpValue + tmpValue; 2073 tmpValue := tmpValue + tmpValue; 2074 tmpValue := tmpValue + tmpValue; 2075 tmpValue := tmpValue + tmpValue; 2076 tmpValue := tmpValue + tmpValue; 2077 assertEqualsInt('testAnsiTrimChars_ReallyLong', 320, Length(tmpValue)); 2078 2079 tmpResult := AnsiStrTrimChars(tmpValue, ['8', '9', '0', '1']); 2080 2081 assertEqualsInt('testAnsiTrimChars_ReallyLong', 316, Length(tmpResult)); 2082 END; 2083 2084 2085 // ------------------------------------------------------------------- 2086 2087 2088 PROCEDURE testAnsiTrim; 2089 VAR 2090 tmpResult : String; 2091 tmpValue : AnsiString; 2092 BEGIN 2093 tmpValue := ' a bc '; 2094 tmpResult := AnsiStrTrim(tmpValue); 2095 2096 assertEqualsAnsiString('testAnsiTrim', 'a bc', tmpResult); 2097 END; 2098 2099 2100 PROCEDURE testAnsiTrim_ReallyLong; 2101 VAR 2102 tmpResult : AnsiString; 2103 tmpValue : AnsiString; 2104 BEGIN 2105 tmpValue := '0123456789'; 2106 tmpValue := tmpValue + tmpValue; 2107 tmpValue := tmpValue + tmpValue; 2108 tmpValue := tmpValue + tmpValue; 2109 tmpValue := tmpValue + tmpValue; 2110 tmpValue := tmpValue + tmpValue; 2111 tmpValue := ' ' + tmpValue + ' '; 2112 assertEqualsInt('testAnsiTrim_ReallyLong', 326, Length(tmpValue)); 2113 2114 tmpResult := AnsiStrTrim(tmpValue); 2115 2116 assertEqualsInt('testAnsiTrim_ReallyLong', 320, Length(tmpResult)); 2117 END; 2118 2119 2120 // ------------------------------------------------------------------- 1677 2121 1678 2122 … … 1836 2280 result.add(@testStrExtractStringsQuoted_ManyParts); 1837 2281 2282 result.add(@testCaseInsensitivePos_Empty); 2283 result.add(@testCaseInsensitivePos_EmptyPart); 2284 result.add(@testCaseInsensitivePos_EmptyString); 2285 result.add(@testCaseInsensitivePos_PartLarger); 2286 result.add(@testCaseInsensitivePos_AtLeft); 2287 result.add(@testCaseInsensitivePos_Middle); 2288 result.add(@testCaseInsensitivePos_AtRight); 2289 result.add(@testCaseInsensitivePos); 2290 2291 // -------------------- 2292 // ---- AnsiString ---- 2293 // -------------------- 2294 2295 2296 result.add(@testAnsiTrimLeftChars_Empty); 2297 result.add(@testAnsiTrimLeftChars_RemoveAll); 2298 result.add(@testAnsiTrimLeftChars_OneLeft); 2299 result.add(@testAnsiTrimLeftChars_LeftOnly); 2300 result.add(@testAnsiTrimLeftChars_CharsInside); 2301 result.add(@testAnsiTrimLeftChars_Nothing); 2302 result.add(@testAnsiTrimLeftChars_ReallyLong); 2303 2304 result.add(@testAnsiTrimRightChars_Empty); 2305 result.add(@testAnsiTrimRightChars_RemoveAll); 2306 result.add(@testAnsiTrimRightChars_OneLeft); 2307 result.add(@testAnsiTrimRightChars_RightOnly); 2308 result.add(@testAnsiTrimRightChars_CharsInside); 2309 result.add(@testAnsiTrimRightChars_Nothing); 2310 result.add(@testAnsiTrimRightChars_ReallyLong); 2311 2312 result.add(@testAnsiTrimChars_Empty); 2313 result.add(@testAnsiTrimChars_RemoveAll); 2314 result.add(@testAnsiTrimChars_OneLeftFromLeft); 2315 result.add(@testAnsiTrimChars_OneLeftFromRight); 2316 result.add(@testAnsiTrimChars_LeftOnly); 2317 result.add(@testAnsiTrimChars_RightOnly); 2318 result.add(@testAnsiTrimChars_CharsInside); 2319 result.add(@testAnsiTrimChars_Nothing); 2320 result.add(@testAnsiTrimChars_ReallyLong); 2321 2322 result.add(@testAnsiTrim); 2323 result.add(@testAnsiTrim_ReallyLong); 2324 2325 1838 2326 END; 1839 2327 -
trunk/NewView/unittests/testassert.pas
r68 r110 9 9 10 10 PROCEDURE assertEqualsString(aTestDescription : String; anExpectedValue : String; aRealValue : String); 11 PROCEDURE assertEqualsAnsiString(aTestDescription : String; anExpectedValue : AnsiString; aRealValue : AnsiString); 11 12 PROCEDURE assertEqualsInt(aTestDescription : String; anExpectedValue : INTEGER; aRealValue : INTEGER); 12 13 PROCEDURE assertEqualsLongWord(aTestDescription : String; anExpectedValue : LongWord; aRealValue : LongWord); … … 19 20 PROCEDURE assertEqualsString(aTestDescription : String; anExpectedValue : String; aRealValue : String); 20 21 VAR 21 tmpMessage : String; 22 tmpMessage : AnsiString; 23 BEGIN 24 if (aRealValue <> anExpectedValue) then 25 begin 26 tmpMessage := 'Failed: ' + aTestDescription + ' Expected: '''; 27 tmpMessage := tmpMessage + anExpectedValue; 28 tmpMessage := tmpMessage + ''' but it was: '''; 29 tmpMessage := tmpMessage + aRealValue; 30 tmpMessage := tmpMessage + ''''; 31 raise EAssertFailed.Create(tmpMessage); 32 end; 33 END; 34 35 36 PROCEDURE assertEqualsAnsiString(aTestDescription : String; anExpectedValue : AnsiString; aRealValue : AnsiString); 37 VAR 38 tmpMessage : AnsiString; 22 39 BEGIN 23 40 if (aRealValue <> anExpectedValue) then
Note:
See TracChangeset
for help on using the changeset viewer.