LCOV - GNU Libidn - lib/gltests/test-striconv.c

LCOV - code coverage report
Current view: top level - lib/gltests - test-striconv.c (source / functions) Hit Total Coverage
Test: GNU Libidn Lines: 61 61 100.0 %
Date: 2020年07月22日 17:53:13 Functions: 1 1 100.0 %
Legend: Lines: hit not hit

 Line data Source code
 1  : /* Test of character set conversion.
 2  : Copyright (C) 2007-2020 Free Software Foundation, Inc.
 3  : 
 4  : This program is free software: you can redistribute it and/or modify
 5  : it under the terms of the GNU General Public License as published by
 6  : the Free Software Foundation; either version 3 of the License, or
 7  : (at your option) any later version.
 8  : 
 9  : This program is distributed in the hope that it will be useful,
 10  : but WITHOUT ANY WARRANTY; without even the implied warranty of
 11  : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 12  : GNU General Public License for more details.
 13  : 
 14  : You should have received a copy of the GNU General Public License
 15  : along with this program. If not, see <https://www.gnu.org/licenses/>. */
 16  : 
 17  : /* Written by Bruno Haible <bruno@clisp.org>, 2007. */
 18  : 
 19  : #include <config.h>
 20  : 
 21  : #include "striconv.h"
 22  : 
 23  : #if HAVE_ICONV
 24  : # include <iconv.h>
 25  : #endif
 26  : 
 27  : #include <errno.h>
 28  : #include <stdlib.h>
 29  : #include <string.h>
 30  : 
 31  : #include "macros.h"
 32  : 
 33  : int
 34  1 : main ()
 35  : {
 36  : #if HAVE_ICONV
 37  : /* Assume that iconv() supports at least the encodings ASCII, ISO-8859-1,
 38  : and UTF-8. */
 39  1 : iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1");
 40  1 : iconv_t cd_utf8_to_88591 = iconv_open ("ISO-8859-1", "UTF-8");
 41  : 
 42  1 : ASSERT (cd_88591_to_utf8 != (iconv_t)(-1));
 43  1 : ASSERT (cd_utf8_to_88591 != (iconv_t)(-1));
 44  : 
 45  : /* ------------------------- Test mem_cd_iconv() ------------------------- */
 46  : 
 47  : /* Test conversion from ISO-8859-1 to UTF-8 with no errors. */
 48  : {
 49  : static const char input[] = "304円rger mit b366円sen B374円bchen ohne Augenma337円";
 50  : static const char expected[] = "303円204円rger mit b303円266円sen B303円274円bchen ohne Augenma303円237円";
 51  1 : char *result = NULL;
 52  1 : size_t length = 0;
 53  1 : int retval = mem_cd_iconv (input, strlen (input), cd_88591_to_utf8,
 54  : &result, &length);
 55  1 : ASSERT (retval == 0);
 56  1 : ASSERT (length == strlen (expected));
 57  1 : ASSERT (result != NULL && memcmp (result, expected, strlen (expected)) == 0);
 58  1 : free (result);
 59  : }
 60  : 
 61  : /* Test conversion from UTF-8 to ISO-8859-1 with no errors. */
 62  : {
 63  : static const char input[] = "303円204円rger mit b303円266円sen B303円274円bchen ohne Augenma303円237円";
 64  : static const char expected[] = "304円rger mit b366円sen B374円bchen ohne Augenma337円";
 65  1 : char *result = NULL;
 66  1 : size_t length = 0;
 67  1 : int retval = mem_cd_iconv (input, strlen (input), cd_utf8_to_88591,
 68  : &result, &length);
 69  1 : ASSERT (retval == 0);
 70  1 : ASSERT (length == strlen (expected));
 71  1 : ASSERT (result != NULL && memcmp (result, expected, strlen (expected)) == 0);
 72  1 : free (result);
 73  : }
 74  : 
 75  : /* Test conversion from UTF-8 to ISO-8859-1 with EILSEQ. */
 76  : {
 77  : static const char input[] = "342円202円254円"; /* EURO SIGN */
 78  1 : char *result = NULL;
 79  1 : size_t length = 0;
 80  1 : int retval = mem_cd_iconv (input, strlen (input), cd_utf8_to_88591,
 81  : &result, &length);
 82  1 : ASSERT (retval == -1 && errno == EILSEQ);
 83  1 : ASSERT (result == NULL);
 84  : }
 85  : 
 86  : /* Test conversion from UTF-8 to ISO-8859-1 with EINVAL. */
 87  : {
 88  : static const char input[] = "342円";
 89  1 : char *result = NULL;
 90  1 : size_t length = 0;
 91  1 : int retval = mem_cd_iconv (input, strlen (input), cd_utf8_to_88591,
 92  : &result, &length);
 93  1 : ASSERT (retval == 0);
 94  1 : ASSERT (length == 0);
 95  1 : free (result);
 96  : }
 97  : 
 98  : /* ------------------------- Test str_cd_iconv() ------------------------- */
 99  : 
 100  : /* Test conversion from ISO-8859-1 to UTF-8 with no errors. */
 101  : {
 102  : static const char input[] = "304円rger mit b366円sen B374円bchen ohne Augenma337円";
 103  : static const char expected[] = "303円204円rger mit b303円266円sen B303円274円bchen ohne Augenma303円237円";
 104  1 : char *result = str_cd_iconv (input, cd_88591_to_utf8);
 105  1 : ASSERT (result != NULL);
 106  1 : ASSERT (strcmp (result, expected) == 0);
 107  1 : free (result);
 108  : }
 109  : 
 110  : /* Test conversion from UTF-8 to ISO-8859-1 with no errors. */
 111  : {
 112  : static const char input[] = "303円204円rger mit b303円266円sen B303円274円bchen ohne Augenma303円237円";
 113  : static const char expected[] = "304円rger mit b366円sen B374円bchen ohne Augenma337円";
 114  1 : char *result = str_cd_iconv (input, cd_utf8_to_88591);
 115  1 : ASSERT (result != NULL);
 116  1 : ASSERT (strcmp (result, expected) == 0);
 117  1 : free (result);
 118  : }
 119  : 
 120  : /* Test conversion from UTF-8 to ISO-8859-1 with EILSEQ. */
 121  : {
 122  : static const char input[] = "Costs: 27 342円202円254円"; /* EURO SIGN */
 123  1 : char *result = str_cd_iconv (input, cd_utf8_to_88591);
 124  1 : ASSERT (result == NULL && errno == EILSEQ);
 125  : }
 126  : 
 127  : /* Test conversion from UTF-8 to ISO-8859-1 with EINVAL. */
 128  : {
 129  : static const char input[] = "342円";
 130  1 : char *result = str_cd_iconv (input, cd_utf8_to_88591);
 131  1 : ASSERT (result != NULL);
 132  1 : ASSERT (strcmp (result, "") == 0);
 133  1 : free (result);
 134  : }
 135  : 
 136  1 : iconv_close (cd_88591_to_utf8);
 137  1 : iconv_close (cd_utf8_to_88591);
 138  : 
 139  : /* -------------------------- Test str_iconv() -------------------------- */
 140  : 
 141  : /* Test conversion from ISO-8859-1 to UTF-8 with no errors. */
 142  : {
 143  : static const char input[] = "304円rger mit b366円sen B374円bchen ohne Augenma337円";
 144  : static const char expected[] = "303円204円rger mit b303円266円sen B303円274円bchen ohne Augenma303円237円";
 145  1 : char *result = str_iconv (input, "ISO-8859-1", "UTF-8");
 146  1 : ASSERT (result != NULL);
 147  1 : ASSERT (strcmp (result, expected) == 0);
 148  1 : free (result);
 149  : }
 150  : 
 151  : /* Test conversion from UTF-8 to ISO-8859-1 with no errors. */
 152  : {
 153  : static const char input[] = "303円204円rger mit b303円266円sen B303円274円bchen ohne Augenma303円237円";
 154  : static const char expected[] = "304円rger mit b366円sen B374円bchen ohne Augenma337円";
 155  1 : char *result = str_iconv (input, "UTF-8", "ISO-8859-1");
 156  1 : ASSERT (result != NULL);
 157  1 : ASSERT (strcmp (result, expected) == 0);
 158  1 : free (result);
 159  : }
 160  : 
 161  : /* Test conversion from UTF-8 to ISO-8859-1 with EILSEQ. */
 162  : {
 163  : static const char input[] = "Costs: 27 342円202円254円"; /* EURO SIGN */
 164  1 : char *result = str_iconv (input, "UTF-8", "ISO-8859-1");
 165  1 : ASSERT (result == NULL && errno == EILSEQ);
 166  : }
 167  : 
 168  : /* Test conversion from UTF-8 to ISO-8859-1 with EINVAL. */
 169  : {
 170  : static const char input[] = "342円";
 171  1 : char *result = str_iconv (input, "UTF-8", "ISO-8859-1");
 172  1 : ASSERT (result != NULL);
 173  1 : ASSERT (strcmp (result, "") == 0);
 174  1 : free (result);
 175  : }
 176  : 
 177  : #endif
 178  : 
 179  1 : return 0;
 180  : }

Generated by: LCOV version 1.13

AltStyle によって変換されたページ (->オリジナル) /