1/* Test of u32_prev() function. 2 Copyright (C) 2010 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 <http://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 25static int 26check (const uint32_t *input, size_t input_length, ucs4_t *puc) 27{ 28 ucs4_t uc; 29 30 /* Test recognition when at the beginning of the string. */ 31 if (u32_prev (&uc, input + input_length, input) != input) 32 return 1; 33 34 /* Test recognition when preceded by a 1-unit character. */ 35 { 36 uint32_t buf[100]; 37 uint32_t *ptr; 38 size_t i; 39 ucs4_t uc1; 40 41 ptr = buf; 42 *ptr++ = 0x1D51E; 43 for (i = 0; i < input_length; i++) 44 ptr[i] = input[i]; 45 46 if (u32_prev (&uc1, ptr + input_length, buf) != ptr) 47 return 2; 48 if (uc1 != uc) 49 return 3; 50 } 51 52 *puc = uc; 53 return 0; 54} 55 56static int 57check_invalid (const uint32_t *input, size_t input_length) 58{ 59#if CONFIG_UNICODE_SAFETY 60 ucs4_t uc; 61 62 /* Test recognition when at the beginning of the string. */ 63 uc = 0xBADFACE; 64 if (u32_prev (&uc, input + input_length, input) != NULL) 65 return 1; 66 if (uc != 0xBADFACE) 67 return 2; 68 69 /* Test recognition when preceded by a 1-unit character. */ 70 { 71 uint32_t buf[100]; 72 uint32_t *ptr; 73 size_t i; 74 75 ptr = buf; 76 *ptr++ = 0x1D51E; 77 for (i = 0; i < input_length; i++) 78 ptr[i] = input[i]; 79 80 uc = 0xBADFACE; 81 if (u32_prev (&uc, ptr + input_length, buf) != NULL) 82 return 3; 83 if (uc != 0xBADFACE) 84 return 4; 85 } 86#endif 87 88 return 0; 89} 90 91int 92main () 93{ 94 ucs4_t uc; 95 96 /* Test ISO 646 unit input. */ 97 { 98 ucs4_t c; 99 uint32_t buf[1]; 100 101 for (c = 0; c < 0x80; c++) 102 { 103 buf[0] = c; 104 uc = 0xBADFACE; 105 ASSERT (check (buf, 1, &uc) == 0); 106 ASSERT (uc == c); 107 } 108 } 109 110 /* Test BMP unit input. */ 111 { 112 static const uint32_t input[] = { 0x20AC }; 113 uc = 0xBADFACE; 114 ASSERT (check (input, SIZEOF (input), &uc) == 0); 115 ASSERT (uc == 0x20AC); 116 } 117 118 /* Test non-BMP unit input. */ 119 { 120 static const uint32_t input[] = { 0x1D51F }; 121 uc = 0xBADFACE; 122 ASSERT (check (input, SIZEOF (input), &uc) == 0); 123 ASSERT (uc == 0x1D51F); 124 } 125 126 /* Test incomplete/invalid 1-unit input. */ 127 { 128 static const uint32_t input[] = { 0x340000 }; 129 ASSERT (check_invalid (input, SIZEOF (input)) == 0); 130 } 131 132 return 0; 133} 134