1/* Test of normalization insensitive comparison of UTF-8 strings. 2 Copyright (C) 2009, 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>, 2009. */ 18 19#include <config.h> 20 21#include "uninorm.h" 22 23#include "macros.h" 24 25#include "test-u8-normcmp.h" 26 27static void 28test_nonascii (int (*my_normcmp) (const uint8_t *, size_t, const uint8_t *, size_t, uninorm_t, int *)) 29{ 30 /* Normalization effects. */ 31 { 32 static const uint8_t input1[] = { 'H', 0xC3, 0xB6, 'h', 'l', 'e' }; 33 static const uint8_t input2[] = { 'H', 'o', 0xCC, 0x88, 'h', 'l', 'e' }; 34 static const uint8_t input3[] = { 'H', 0xC3, 0xB6, 'h', 'l', 'e', 'n' }; 35 static const uint8_t input4[] = { 'H', 'o', 0xCC, 0x88, 'h', 'l', 'e', 'n' }; 36 static const uint8_t input5[] = { 'H', 'u', 'r', 'z' }; 37 int cmp; 38 39 ASSERT (my_normcmp (input1, SIZEOF (input1), input2, SIZEOF (input2), UNINORM_NFD, &cmp) == 0); 40 ASSERT (cmp == 0); 41 42 ASSERT (my_normcmp (input2, SIZEOF (input2), input1, SIZEOF (input1), UNINORM_NFD, &cmp) == 0); 43 ASSERT (cmp == 0); 44 45 ASSERT (my_normcmp (input3, SIZEOF (input3), input4, SIZEOF (input4), UNINORM_NFD, &cmp) == 0); 46 ASSERT (cmp == 0); 47 48 ASSERT (my_normcmp (input4, SIZEOF (input4), input3, SIZEOF (input3), UNINORM_NFD, &cmp) == 0); 49 ASSERT (cmp == 0); 50 51 ASSERT (my_normcmp (input2, SIZEOF (input2), input3, SIZEOF (input3), UNINORM_NFD, &cmp) == 0); 52 ASSERT (cmp == -1); 53 54 ASSERT (my_normcmp (input1, SIZEOF (input1), input4, SIZEOF (input4), UNINORM_NFD, &cmp) == 0); 55 ASSERT (cmp == -1); 56 57 ASSERT (my_normcmp (input1, SIZEOF (input1), input5, SIZEOF (input5), UNINORM_NFD, &cmp) == 0); 58 ASSERT (cmp == -1); 59 60 ASSERT (my_normcmp (input2, SIZEOF (input2), input5, SIZEOF (input5), UNINORM_NFD, &cmp) == 0); 61 ASSERT (cmp == -1); 62 } 63 { /* LATIN CAPITAL LETTER A WITH DIAERESIS */ 64 static const uint8_t input1[] = { 0xC3, 0x84 }; 65 static const uint8_t input2[] = { 0x41, 0xCC, 0x88 }; 66 int cmp; 67 68 ASSERT (my_normcmp (input1, SIZEOF (input1), input2, SIZEOF (input2), UNINORM_NFD, &cmp) == 0); 69 ASSERT (cmp == 0); 70 } 71 { /* LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON */ 72 static const uint8_t input1[] = { 0xC7, 0x9E }; 73 static const uint8_t input2[] = { 0x41, 0xCC, 0x88, 0xCC, 0x84 }; 74 int cmp; 75 76 ASSERT (my_normcmp (input1, SIZEOF (input1), input2, SIZEOF (input2), UNINORM_NFD, &cmp) == 0); 77 ASSERT (cmp == 0); 78 } 79 { /* GREEK DIALYTIKA AND PERISPOMENI */ 80 static const uint8_t input1[] = { 0xE1, 0xBF, 0x81 }; 81 static const uint8_t input2[] = { 0xC2, 0xA8, 0xCD, 0x82 }; 82 int cmp; 83 84 ASSERT (my_normcmp (input1, SIZEOF (input1), input2, SIZEOF (input2), UNINORM_NFD, &cmp) == 0); 85 ASSERT (cmp == 0); 86 } 87 { /* HANGUL SYLLABLE GEUL */ 88 static const uint8_t input1[] = { 0xEA, 0xB8, 0x80 }; 89 static const uint8_t input2[] = { 0xEA, 0xB7, 0xB8, 0xE1, 0x86, 0xAF }; 90 static const uint8_t input3[] = { 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xB3, 0xE1, 0x86, 0xAF }; 91 int cmp; 92 93 ASSERT (my_normcmp (input1, SIZEOF (input1), input2, SIZEOF (input2), UNINORM_NFD, &cmp) == 0); 94 ASSERT (cmp == 0); 95 96 ASSERT (my_normcmp (input1, SIZEOF (input1), input3, SIZEOF (input3), UNINORM_NFD, &cmp) == 0); 97 ASSERT (cmp == 0); 98 } 99 { /* HANGUL SYLLABLE GEU */ 100 static const uint8_t input1[] = { 0xEA, 0xB7, 0xB8 }; 101 static const uint8_t input2[] = { 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xB3 }; 102 int cmp; 103 104 ASSERT (my_normcmp (input1, SIZEOF (input1), input2, SIZEOF (input2), UNINORM_NFD, &cmp) == 0); 105 ASSERT (cmp == 0); 106 } 107} 108 109int 110main () 111{ 112 test_ascii (u8_normcmp, UNINORM_NFD); 113 test_nonascii (u8_normcmp); 114 115 return 0; 116} 117