Line data Source code
1 : /* Test of u8_uctomb() function. 2 : Copyright (C) 2010-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>, 2010. */ 18 : 19 : #include <config.h> 20 : 21 : #include "unistr.h" 22 : 23 : #include "macros.h" 24 : 25 : #define MAGIC 0xBA 26 : 27 : int 28 1 : main () 29 : { 30 : /* Test ISO 646 character, in particular the NUL character. */ 31 : { 32 : ucs4_t uc; 33 : 34 129 : for (uc = 0; uc < 0x80; uc++) 35 : { 36 128 : uint8_t buf[5] = { MAGIC, MAGIC, MAGIC, MAGIC, MAGIC }; 37 : int ret; 38 : 39 128 : ret = u8_uctomb (buf, uc, 0); 40 128 : ASSERT (ret == -2); 41 128 : ASSERT (buf[0] == MAGIC); 42 : 43 128 : ret = u8_uctomb (buf, uc, 1); 44 128 : ASSERT (ret == 1); 45 128 : ASSERT (buf[0] == uc); 46 128 : ASSERT (buf[1] == MAGIC); 47 : } 48 : } 49 : 50 : /* Test 2-byte character. */ 51 : { 52 1 : ucs4_t uc = 0x00D7; 53 1 : uint8_t buf[5] = { MAGIC, MAGIC, MAGIC, MAGIC, MAGIC }; 54 : int ret; 55 : 56 1 : ret = u8_uctomb (buf, uc, 0); 57 1 : ASSERT (ret == -2); 58 1 : ASSERT (buf[0] == MAGIC); 59 : 60 1 : ret = u8_uctomb (buf, uc, 1); 61 1 : ASSERT (ret == -2); 62 1 : ASSERT (buf[0] == MAGIC); 63 : 64 1 : ret = u8_uctomb (buf, uc, 2); 65 1 : ASSERT (ret == 2); 66 1 : ASSERT (buf[0] == 0xC3); 67 1 : ASSERT (buf[1] == 0x97); 68 1 : ASSERT (buf[2] == MAGIC); 69 : } 70 : 71 : /* Test 3-byte character. */ 72 : { 73 1 : ucs4_t uc = 0x20AC; 74 1 : uint8_t buf[5] = { MAGIC, MAGIC, MAGIC, MAGIC, MAGIC }; 75 : int ret; 76 : 77 1 : ret = u8_uctomb (buf, uc, 0); 78 1 : ASSERT (ret == -2); 79 1 : ASSERT (buf[0] == MAGIC); 80 : 81 1 : ret = u8_uctomb (buf, uc, 1); 82 1 : ASSERT (ret == -2); 83 1 : ASSERT (buf[0] == MAGIC); 84 : 85 1 : ret = u8_uctomb (buf, uc, 2); 86 1 : ASSERT (ret == -2); 87 1 : ASSERT (buf[0] == MAGIC); 88 1 : ASSERT (buf[1] == MAGIC); 89 : 90 1 : ret = u8_uctomb (buf, uc, 3); 91 1 : ASSERT (ret == 3); 92 1 : ASSERT (buf[0] == 0xE2); 93 1 : ASSERT (buf[1] == 0x82); 94 1 : ASSERT (buf[2] == 0xAC); 95 1 : ASSERT (buf[3] == MAGIC); 96 : } 97 : 98 : /* Test 4-byte character. */ 99 : { 100 1 : ucs4_t uc = 0x10FFFD; 101 1 : uint8_t buf[5] = { MAGIC, MAGIC, MAGIC, MAGIC, MAGIC }; 102 : int ret; 103 : 104 1 : ret = u8_uctomb (buf, uc, 0); 105 1 : ASSERT (ret == -2); 106 1 : ASSERT (buf[0] == MAGIC); 107 : 108 1 : ret = u8_uctomb (buf, uc, 1); 109 1 : ASSERT (ret == -2); 110 1 : ASSERT (buf[0] == MAGIC); 111 : 112 1 : ret = u8_uctomb (buf, uc, 2); 113 1 : ASSERT (ret == -2); 114 1 : ASSERT (buf[0] == MAGIC); 115 1 : ASSERT (buf[1] == MAGIC); 116 : 117 1 : ret = u8_uctomb (buf, uc, 3); 118 1 : ASSERT (ret == -2); 119 1 : ASSERT (buf[0] == MAGIC); 120 1 : ASSERT (buf[1] == MAGIC); 121 1 : ASSERT (buf[2] == MAGIC); 122 : 123 1 : ret = u8_uctomb (buf, uc, 4); 124 1 : ASSERT (ret == 4); 125 1 : ASSERT (buf[0] == 0xF4); 126 1 : ASSERT (buf[1] == 0x8F); 127 1 : ASSERT (buf[2] == 0xBF); 128 1 : ASSERT (buf[3] == 0xBD); 129 1 : ASSERT (buf[4] == MAGIC); 130 : } 131 : 132 : /* Test invalid characters. */ 133 : { 134 1 : ucs4_t invalid[] = { 0x110000, 0xD800, 0xDBFF, 0xDC00, 0xDFFF }; 135 1 : uint8_t buf[5] = { MAGIC, MAGIC, MAGIC, MAGIC, MAGIC }; 136 : size_t i; 137 : 138 6 : for (i = 0; i < SIZEOF (invalid); i++) 139 : { 140 5 : ucs4_t uc = invalid[i]; 141 : int n; 142 : 143 30 : for (n = 0; n <= 4; n++) 144 : { 145 25 : int ret = u8_uctomb (buf, uc, n); 146 25 : ASSERT (ret == -1); 147 25 : ASSERT (buf[0] == MAGIC); 148 25 : ASSERT (buf[1] == MAGIC); 149 25 : ASSERT (buf[2] == MAGIC); 150 25 : ASSERT (buf[3] == MAGIC); 151 25 : ASSERT (buf[4] == MAGIC); 152 : } 153 : } 154 : } 155 : 156 1 : return 0; 157 : }