From a86aa81b4fa6a31fd38d47c39d3106cdd60ba7d3 Mon Sep 17 00:00:00 2001 From: Petr Machata Date: Wed, 13 Nov 2013 00:11:24 +0100 Subject: Add a test case for wide character functions --- testsuite/ltrace.minor/Makefile.am | 2 +- testsuite/ltrace.minor/wchar.exp | 214 +++++++++++++++++++++++++++++++++++++ 2 files changed, 215 insertions(+), 1 deletion(-) create mode 100644 testsuite/ltrace.minor/wchar.exp (limited to 'testsuite') diff --git a/testsuite/ltrace.minor/Makefile.am b/testsuite/ltrace.minor/Makefile.am index b0f94a1..1ff1e4e 100644 --- a/testsuite/ltrace.minor/Makefile.am +++ b/testsuite/ltrace.minor/Makefile.am @@ -22,7 +22,7 @@ EXTRA_DIST = attach-process.exp count-record.c count-record.exp \ time-record.c time-record-T.exp time-record-tt.exp \ time-record-ttt.exp trace-clone.c trace-clone.exp \ trace-exec.exp trace-fork.c trace-fork.exp \ - trace-irelative.exp + trace-irelative.exp wchar.exp CLEANFILES = *.o *.so *.log *.sum *.ltrace setval.tmp attach-process \ count-record demangle print-instruction-pointer time-record-T \ diff --git a/testsuite/ltrace.minor/wchar.exp b/testsuite/ltrace.minor/wchar.exp new file mode 100644 index 0000000..1200f9f --- /dev/null +++ b/testsuite/ltrace.minor/wchar.exp @@ -0,0 +1,214 @@ +# This file is part of ltrace. +# Copyright (C) 2013 Petr Machata, Red Hat Inc. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version. +# +# 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. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA + +set bin [ltraceCompile {} [ltraceSource c { + #include + #include + #include + #include + #include + #include + #include + #include + #include + + int main(int argc, char *argv[]) + { + setlocale(LC_ALL, ""); + + FILE *rd_stream, *wr_stream, *wr_stream_2; + { + int fds[2]; + pipe (fds); + rd_stream = fdopen (fds[0], "r"); + wr_stream = fdopen (fds[1], "w"); + wr_stream_2 = fdopen (fds[1], "w"); + } + + wcslen(L"Вот это да!"); + + fprintf(wr_stream_2, "something %s\n", "something"); + fprintf(wr_stream_2, "something %ls\n", L"что-то"); + + fputwc(L'Ф', wr_stream); + putwc(L'Д', wr_stream); + fflush(wr_stream); + fgetwc(rd_stream); + ungetwc(getwc(rd_stream), rd_stream); + + fputws(L"Что-то.\n", wr_stream); + fflush(wr_stream); + wchar_t wbuf[64]; + fgetws(wbuf, 64, rd_stream); + + fwprintf(wr_stream, L"Какое-то %ls %s.\n", L"что-то", "something"); + swprintf(wbuf, 64, L"zwölf große %ls %zd", L"Boxkämpfe", wcslen(wbuf)); + + int i = iswalnum(L'1'); + assert(!!i); + i = iswalpha(L'A'); + assert(!!i); + i = iswcntrl(L'\t'); + assert(!!i); + i = iswdigit(L'1'); + assert(!!i); + i = iswgraph(L'='); + assert(!!i); + i = iswlower(L'ц'); + assert(!!i); + i = iswupper(L'Ц'); + assert(!!i); + i = iswprint(L'☻'); + assert(!!i); + i = iswpunct(L'•'); + assert(!!i); + i = iswspace(L'\t'); + assert(!!i); + i = iswxdigit(L'A'); + assert(!!i); + + i = mbrlen("что", sizeof "что", NULL); + assert(i == 2); + wchar_t wc; + i = mbrtowc(&wc, "что", sizeof "что", NULL); + + const char *str = "что"; + i = mbsrtowcs(wbuf, &str, 64, NULL); + assert(i >= 0); + + i = towlower(towupper(L'ы')) == L'ы'; + assert(!!i); + + char buf[64] = {}; + wctomb(buf, L'ư'); + wcrtomb(buf, L'ơ', NULL); + + wbuf[0] = 0; + i = wcscmp(wcschr(wcsncat(wcscat(wbuf, L"žluťoučký "), + L"kůň", 64), L'ů'), L"ůň"); + assert(i == 0); + i = wcsncmp(wbuf, L"žluťák", 4); + assert(i == 0); + + i = wcscoll(wcscpy(wbuf, L"/ˈɪŋɡlɪʃ/"), L"/dɔɪ̯ʧ/"); + assert(i != 0); + i = wcsspn(wbuf, L"/"); + assert(i == 1); + i = wcscspn(wbuf, L"ˈ"); + assert(i == 1); + *wcsrchr(wcspbrk(wbuf, L"ɪ"), L'ɪ') = L'i'; + + struct timeval tv; + gettimeofday(&tv, NULL); + struct tm *tm = gmtime(&tv.tv_sec); + wbuf[0] = L'\0'; + wcsftime(wbuf, 64, L"«%F • %T»", tm); + { const wchar_t *ptr = wbuf; wcsrtombs(buf, &ptr, 64, NULL); } + { wchar_t *ptr = NULL; wcstod(wcsstr(wbuf, L"•") + 2, &ptr); } + wcsncpy(wbuf, L"1234•", 64); + { wchar_t *ptr = NULL; wcstof(wbuf, &ptr); } + { wchar_t *ptr = NULL; wcstold(wbuf, &ptr); } + { wchar_t *ptr = NULL; wcstol(wbuf, &ptr, 10); } + { wchar_t *ptr = NULL; wcstoll(wbuf, &ptr, 10); } + { wchar_t *ptr = NULL; wcstoul(wbuf, &ptr, 10); } + { wchar_t *ptr = NULL; wcstoull(wbuf, &ptr, 10); } + i = wmemcmp(wmemchr(wbuf, L'•', 64), L"•", 2); + assert(i == 0); + + i = wcswidth(L"你好") + wcwidth(L'你') + wctob(L'1');; + assert(i == 6 + '1'); + + i = iswctype(L'Ш', wctype("alpha")); + assert(!!i); + + wmemcpy(wbuf, L"Dobrý den", 6); + wmemmove(wbuf, L" ", 2); + { wchar_t *ptr = NULL; wmemset(wcstok(wbuf, L" ", &ptr), L'я', 5); } + + return 0; + } +}]] + +ltraceMatch [ltraceRun -F $srcdir/../etc/ -- $bin] { + {{^fprintf\(.*, "something %s\\n", "something"\)} == 1} + {{^fprintf\(.*, "something %ls\\n", "что-то"\)} == 1} + {{^fputwc\('Ф', .*\).*= 'Ф'} == 1} + {{^putwc\('Д', .*\).*= 'Д'} == 1} + {{^fgetwc\(.*\).*= 'Ф'} == 1} + {{^getwc\(.*\).*= 'Д'} == 1} + {{^ungetwc\('Д', .*\).*= 'Д'} == 1} + {{^fputws\("Что-то.\\n", .*\)} == 1} + {{^fgetws\("ДЧто-то.\\n", 64, .*\).*= "ДЧто-то.\\n"} == 1} + {{^fwprintf\(.*, "Какое-то %ls %s.\\n", "что-то", "something"\).*= 27} == 1} + {{^wcslen\("ДЧто-то.\\n"\).*= 9} == 1} + {{^swprintf\("zwölf große Boxkämpfe 9", 64, "zwölf große %ls %zd", "Boxkämpfe", 9\).*= 23} == 1} + {{^iswalnum\('1'\).*= 8} == 1} + {{^iswalpha\('A'\).*= 1024} == 1} + {{^iswcntrl\('\\t'\).*= 2} == 1} + {{^iswdigit\('1'\).*= 1} == 1} + {{^iswgraph\('='\).*= 32768} == 1} + {{^iswlower\('ц'\).*= 1} == 1} + {{^iswupper\('Ц'\).*= 1} == 1} + {{^iswprint\('☻'\).*= 1} == 1} + {{^iswpunct\('•'\).*= 1} == 1} + {{^iswspace\('\\t'\).*= 8192} == 1} + {{^iswxdigit\('A'\).*= 4096} == 1} + {{^mbrtowc\('ч', ".*", 7, nil\)} == 1} + {{^mbsrtowcs\("что", nil, 64, nil\).*= 3} == 1} + {{^towupper\('ы'\).*= 'Ы'} == 1} + {{^towlower\('Ы'\).*= 'ы'} == 1} + {{^wctomb\(".*", 'ư'\)} == 1} + {{^wcrtomb\(".*", 'ơ', nil\)} == 1} + {{^wcscat\("", "žluťoučký "\).*= "žluťoučký "} == 1} + {{^wcsncat\("žluťoučký ", "kůň", 64\).*= "žluťoučký kůň"} == 1} + {{^wcschr\("žluťoučký kůň", 'ů'\).*= "ůň"} == 1} + {{^wcscmp\("ůň", "ůň"\).*= 0} == 1} + {{^wcsncmp\("žluť", "žluť", 4\).*= 0} == 1} + {{^wcscpy\(.*, "/ˈɪŋɡlɪʃ/"\).*= .*} == 1} + {{^wcscoll\("/ˈɪŋɡlɪʃ/", "/dɔɪ̯ʧ/"\).*= 10} == 1} + {{^wcsspn\("/ˈɪŋɡlɪʃ/", "/"\).*= 1} == 1} + {{^wcscspn\("/ˈɪŋɡlɪʃ/", "ˈ"\).*= 1} == 1} + {{^wcspbrk\("/ˈɪŋɡlɪʃ/", "ɪ"\).*= "ɪŋɡlɪʃ/"} == 1} + {{^wcsrchr\("ɪŋɡlɪʃ/", 'ɪ'\).*= "ɪʃ/"} == 1} + {{^gettimeofday\(.*, nil\).*= 0} == 1} + {{^gmtime\(.*\).*= .*} == 1} + {{^wcsftime\("«.* • .*»", 64, "«%F • %T»", .*\)} == 1} + {{^wcsrtombs\(".*", nil, 64, nil\)} == 1} + {{^wcsstr\("«.* • .*»", "•"\).*= "• .*»"} == 1} + {{^wcstod\(".*»", ".*»"\).*= [0-9]+} == 1} + {{^wcsncpy\(.*, "1234•", 64\).*= .*} == 1} + {{^wcstof\("1234•", "•"\).*= 1234} == 1} + {{^wcstold\("1234•", "•"\).*= 1234} == 1} + {{^wcstol\("1234•", "•", 10\).*= 1234} == 1} + {{^wcstoll\("1234•", "•", 10\).*= 1234} == 1} + {{^wcstoul\("1234•", "•", 10\).*= 1234} == 1} + {{^wcstoull\("1234•", "•", 10\).*= 1234} == 1} + {{^wmemchr\("1234•", '•', 64\).*= "•"} == 1} + {{^wmemcmp\("•", "•", 2\).*= 0} == 1} + {{^wcswidth\("你好", .*\).*= 4} == 1} + {{^wcwidth\('你'\).*= 2} == 1} + {{^wctob\('1'\).*= 49} == 1} + {{^wctype\("alpha"\).*= .*} == 1} + {{^iswctype\('Ш', .*\).*= 1} == 1} + {{^wmemcpy\(.*, "Dobrý ", 6\).*= "Dobrý "} == 1} + {{^wmemmove\(.*, " ", 2\).*= " "} == 1} + {{^wcstok\(" brý ", " ", ""\).*= "brý"} == 1} + {{^wmemset\(.*, 'я', 5\).*= "яяяяя"} == 1} +} + +ltraceDone -- cgit v1.2.3