1 /* Test of uN_cmp() functions.
2    Copyright (C) 2008-2014 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 Simon Josefsson and Bruno Haible <bruno@clisp.org>, 2010.  */
18 
19 static void
test_cmp(void)20 test_cmp (void)
21 {
22   /* Test equal / not equal distinction.  */
23   ASSERT (U_CMP (zerosize_ptr (), zerosize_ptr (), 0) == 0);
24   {
25     static const UNIT input1[] = { 'f', 'o', 'o', 0 };
26     static const UNIT input2[] = { 'f', 'o', 'o', 'b', 'a', 'r', 0 };
27     ASSERT (U_CMP (input1, input2, 2) == 0);
28     ASSERT (U_CMP (input1, input2, 3) == 0);
29     ASSERT (U_CMP (input1, input2, 4) != 0);
30   }
31   {
32     static const UNIT input1[] = { 'f', 'o', 'o', 0 };
33     static const UNIT input2[] = { 'b', 'a', 'r', 0 };
34     ASSERT (U_CMP (input1, input2, 1) != 0);
35     ASSERT (U_CMP (input1, input2, 3) != 0);
36   }
37 
38   /* Test less / equal / greater distinction.  */
39   {
40     static const UNIT input1[] = { 'f', 'o', 'o', 0 };
41     static const UNIT input2[] = { 'm', 'o', 'o', 0 };
42     ASSERT (U_CMP (input1, input2, 4) < 0);
43     ASSERT (U_CMP (input2, input1, 4) > 0);
44   }
45   {
46     static const UNIT input1[] = { 'o', 'o', 'm', 'p', 'h', 0 };
47     static const UNIT input2[] = { 'o', 'o', 'p', 's', 0 };
48     ASSERT (U_CMP (input1, input2, 3) < 0);
49     ASSERT (U_CMP (input2, input1, 3) > 0);
50   }
51   {
52     static const UNIT input1[] = { 'f', 'o', 'o', 0 };
53     static const UNIT input2[] = { 'f', 'o', 'o', 'b', 'a', 'r', 0 };
54     ASSERT (U_CMP (input1, input2, 4) < 0);
55     ASSERT (U_CMP (input2, input1, 4) > 0);
56   }
57 
58   /* Some old versions of memcmp were not 8-bit clean.  */
59   {
60     static const UNIT input1[] = { 0x40 };
61     static const UNIT input2[] = { 0xC2 };
62     ASSERT (U_CMP (input1, input2, 1) < 0);
63     ASSERT (U_CMP (input2, input1, 1) > 0);
64   }
65   {
66     static const UNIT input1[] = { 0xC2 };
67     static const UNIT input2[] = { 0xC3 };
68     ASSERT (U_CMP (input1, input2, 1) < 0);
69     ASSERT (U_CMP (input2, input1, 1) > 0);
70   }
71 
72   /* The Next x86 OpenStep bug shows up only when comparing 16 bytes
73      or more and with at least one buffer not starting on a 4-byte boundary.
74      William Lewis provided this test program.   */
75   {
76     UNIT foo[21];
77     UNIT bar[21];
78     int i;
79     for (i = 0; i < 4; i++)
80       {
81         UNIT *a = foo + i;
82         UNIT *b = bar + i;
83         int j;
84         for (j = 0; j < 8; j++)
85           a[j] = '-';
86         a[8] = '0';
87         for (j = 9; j < 16; j++)
88           a[j] = '1';
89         for (j = 0; j < 8; j++)
90           b[j] = '-';
91         b[8] = '1';
92         for (j = 9; j < 16; j++)
93           b[j] = '0';
94         ASSERT (U_CMP (a, b, 16) < 0);
95       }
96   }
97 }
98