1/* Test of Unicode compliance of compatibility decomposition of UTF-32 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#if GNULIB_TEST_UNINORM_U32_NORMALIZE
22
23#include "uninorm.h"
24
25#include <stdlib.h>
26
27#include "unistr.h"
28#include "progname.h"
29#include "test-u32-normalize-big.h"
30
31static int
32check (const uint32_t *c1, size_t c1_length,
33       const uint32_t *c2, size_t c2_length,
34       const uint32_t *c3, size_t c3_length,
35       const uint32_t *c4, size_t c4_length,
36       const uint32_t *c5, size_t c5_length)
37{
38  /* Check c5 == NFKD(c1) == NFKD(c2) == NFKD(c3) == NFKD(c4) == NFKD(c5).  */
39  {
40    size_t length;
41    uint32_t *result;
42
43    result = u32_normalize (UNINORM_NFKD, c1, c1_length, NULL, &length);
44    if (!(result != NULL
45          && length == c5_length
46          && u32_cmp (result, c5, c5_length) == 0))
47      return 1;
48    free (result);
49  }
50  {
51    size_t length;
52    uint32_t *result;
53
54    result = u32_normalize (UNINORM_NFKD, c2, c2_length, NULL, &length);
55    if (!(result != NULL
56          && length == c5_length
57          && u32_cmp (result, c5, c5_length) == 0))
58      return 2;
59    free (result);
60  }
61  {
62    size_t length;
63    uint32_t *result;
64
65    result = u32_normalize (UNINORM_NFKD, c3, c3_length, NULL, &length);
66    if (!(result != NULL
67          && length == c5_length
68          && u32_cmp (result, c5, c5_length) == 0))
69      return 3;
70    free (result);
71  }
72  {
73    size_t length;
74    uint32_t *result;
75
76    result = u32_normalize (UNINORM_NFKD, c4, c4_length, NULL, &length);
77    if (!(result != NULL
78          && length == c5_length
79          && u32_cmp (result, c5, c5_length) == 0))
80      return 4;
81    free (result);
82  }
83  {
84    size_t length;
85    uint32_t *result;
86
87    result = u32_normalize (UNINORM_NFKD, c5, c5_length, NULL, &length);
88    if (!(result != NULL
89          && length == c5_length
90          && u32_cmp (result, c5, c5_length) == 0))
91      return 5;
92    free (result);
93  }
94  return 0;
95}
96
97int
98main (int argc, char *argv[])
99{
100  struct normalization_test_file file;
101
102  set_program_name (argv[0]);
103  read_normalization_test_file (argv[1], &file);
104
105  test_specific (&file, check);
106  test_other (&file, UNINORM_NFKD);
107
108  return 0;
109}
110
111#else
112
113#include <stdio.h>
114
115int
116main ()
117{
118  fprintf (stderr, "Skipping test: uninorm/u32-normalize module not included.\n");
119  return 77;
120}
121
122#endif
123