Add a test case for wide character functions
authorPetr Machata <pmachata@redhat.com>
Tue, 12 Nov 2013 23:11:24 +0000 (00:11 +0100)
committerChanho Park <chanho61.park@samsung.com>
Fri, 22 Aug 2014 11:38:24 +0000 (20:38 +0900)
testsuite/ltrace.minor/Makefile.am
testsuite/ltrace.minor/wchar.exp [new file with mode: 0644]

index b0f94a1..1ff1e4e 100644 (file)
@@ -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 (file)
index 0000000..1200f9f
--- /dev/null
@@ -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 <sys/time.h>
+    #include <assert.h>
+    #include <locale.h>
+    #include <stdio.h>
+    #include <stdlib.h>
+    #include <string.h>
+    #include <time.h>
+    #include <wchar.h>
+    #include <wctype.h>
+
+    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