1*600f14f4SXin Li /* test_libFLAC - Unit tester for libFLAC
2*600f14f4SXin Li * Copyright (C) 2014-2023 Xiph.Org Foundation
3*600f14f4SXin Li *
4*600f14f4SXin Li * This program is free software; you can redistribute it and/or
5*600f14f4SXin Li * modify it under the terms of the GNU General Public License
6*600f14f4SXin Li * as published by the Free Software Foundation; either version 2
7*600f14f4SXin Li * of the License, or (at your option) any later version.
8*600f14f4SXin Li *
9*600f14f4SXin Li * This program is distributed in the hope that it will be useful,
10*600f14f4SXin Li * but WITHOUT ANY WARRANTY; without even the implied warranty of
11*600f14f4SXin Li * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12*600f14f4SXin Li * GNU General Public License for more details.
13*600f14f4SXin Li *
14*600f14f4SXin Li * You should have received a copy of the GNU General Public License along
15*600f14f4SXin Li * with this program; if not, write to the Free Software Foundation, Inc.,
16*600f14f4SXin Li * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17*600f14f4SXin Li */
18*600f14f4SXin Li
19*600f14f4SXin Li #ifdef HAVE_CONFIG_H
20*600f14f4SXin Li # include <config.h>
21*600f14f4SXin Li #endif
22*600f14f4SXin Li
23*600f14f4SXin Li #include <stdio.h>
24*600f14f4SXin Li #include <string.h>
25*600f14f4SXin Li
26*600f14f4SXin Li #include "share/compat.h"
27*600f14f4SXin Li #include "FLAC/assert.h"
28*600f14f4SXin Li #include "share/endswap.h"
29*600f14f4SXin Li #include "private/md5.h"
30*600f14f4SXin Li #include "endswap.h"
31*600f14f4SXin Li
32*600f14f4SXin Li
test_endswap(void)33*600f14f4SXin Li FLAC__bool test_endswap(void)
34*600f14f4SXin Li {
35*600f14f4SXin Li int16_t i16 = 0x1234;
36*600f14f4SXin Li uint16_t u16 = 0xabcd;
37*600f14f4SXin Li int32_t i32 = 0x12345678;
38*600f14f4SXin Li uint32_t u32 = 0xabcdef01;
39*600f14f4SXin Li
40*600f14f4SXin Li union {
41*600f14f4SXin Li uint8_t bytes[4];
42*600f14f4SXin Li uint16_t u16;
43*600f14f4SXin Li uint32_t u32;
44*600f14f4SXin Li } data;
45*600f14f4SXin Li
46*600f14f4SXin Li printf("\n+++ libFLAC unit test: endswap (%s endian host)\n\n", CPU_IS_BIG_ENDIAN ? "big" : "little");
47*600f14f4SXin Li
48*600f14f4SXin Li printf("testing ENDSWAP_16 on int16_t ... ");
49*600f14f4SXin Li if (((int16_t) ENDSWAP_16(i16)) == i16) {
50*600f14f4SXin Li printf("\nFAILED, ENDSWAP_16(0x%04x) -> 0x%04x == 0x%04x\n", i16, ENDSWAP_16(i16), i16);
51*600f14f4SXin Li return false;
52*600f14f4SXin Li }
53*600f14f4SXin Li if (((int16_t) ENDSWAP_16(ENDSWAP_16(i16))) != i16) {
54*600f14f4SXin Li printf("\nFAILED, ENDSWAP_16(ENDSWAP_16(0x%04x)) -> 0x%04x != 0x%04x\n", i16, ENDSWAP_16(ENDSWAP_16(i16)), i16);
55*600f14f4SXin Li return false;
56*600f14f4SXin Li }
57*600f14f4SXin Li puts("OK");
58*600f14f4SXin Li
59*600f14f4SXin Li printf("testing ENDSWAP_16 on uint16_t ... ");
60*600f14f4SXin Li if (((uint16_t) ENDSWAP_16(u16)) == u16) {
61*600f14f4SXin Li printf("\nFAILED, ENDSWAP_16(0x%04x) -> 0x%04x == 0x%04x\n", u16, ENDSWAP_16(u16), u16);
62*600f14f4SXin Li return false;
63*600f14f4SXin Li }
64*600f14f4SXin Li if (((uint16_t) ENDSWAP_16(ENDSWAP_16(u16))) != u16) {
65*600f14f4SXin Li printf("\nFAILED, ENDSWAP_16(ENDSWAP_16(0x%04x)) -> 0x%04x != 0x%04x\n", u16, ENDSWAP_16(ENDSWAP_16(u16)), u16);
66*600f14f4SXin Li return false;
67*600f14f4SXin Li }
68*600f14f4SXin Li puts("OK");
69*600f14f4SXin Li
70*600f14f4SXin Li printf("testing ENDSWAP_32 on int32_t ... ");
71*600f14f4SXin Li if (((int32_t) ENDSWAP_32 (i32)) == i32) {
72*600f14f4SXin Li printf("\nFAILED, ENDSWAP_32(0x%08x) -> 0x%08x == 0x%08x\n", i32, (uint32_t) ENDSWAP_32 (i32), i32);
73*600f14f4SXin Li return false;
74*600f14f4SXin Li }
75*600f14f4SXin Li if (((int32_t) ENDSWAP_32 (ENDSWAP_32 (i32))) != i32) {
76*600f14f4SXin Li printf("\nFAILED, ENDSWAP_32(ENDSWAP_32(0x%08x)) -> 0x%08x != 0x%08x\n", i32, (uint32_t) ENDSWAP_32(ENDSWAP_32 (i32)), i32);
77*600f14f4SXin Li return false;
78*600f14f4SXin Li }
79*600f14f4SXin Li puts("OK");
80*600f14f4SXin Li
81*600f14f4SXin Li printf("testing ENDSWAP_32 on uint32_t ... ");
82*600f14f4SXin Li if (((uint32_t) ENDSWAP_32(u32)) == u32) {
83*600f14f4SXin Li printf("\nFAILED, ENDSWAP_32(0x%08x) -> 0x%08x == 0x%08x\n", u32, (uint32_t) ENDSWAP_32(u32), u32);
84*600f14f4SXin Li return false;
85*600f14f4SXin Li }
86*600f14f4SXin Li if (((uint32_t) ENDSWAP_32 (ENDSWAP_32(u32))) != u32) {
87*600f14f4SXin Li printf("\nFAILED, ENDSWAP_32(ENDSWAP_32(0x%08x)) -> 0x%08x != 0%08x\n", u32, (uint32_t) ENDSWAP_32(ENDSWAP_32(u32)), u32);
88*600f14f4SXin Li return false;
89*600f14f4SXin Li }
90*600f14f4SXin Li puts("OK");
91*600f14f4SXin Li
92*600f14f4SXin Li printf("testing H2LE_16 on uint16_t ... ");
93*600f14f4SXin Li data.u16 = H2LE_16(0x1234);
94*600f14f4SXin Li if (data.bytes [0] != 0x34 || data.bytes [1] != 0x12) {
95*600f14f4SXin Li printf("\nFAILED, H2LE_16(0x%04x) -> { 0x%02x, 0x%02x }\n", data.u16, data.bytes [0] & 0xff, data.bytes [1] & 0xff);
96*600f14f4SXin Li return false;
97*600f14f4SXin Li }
98*600f14f4SXin Li puts("OK");
99*600f14f4SXin Li
100*600f14f4SXin Li printf("testing H2LE_32 on uint32_t ... ");
101*600f14f4SXin Li data.u32 = H2LE_32(0x12345678);
102*600f14f4SXin Li if (data.bytes [0] != 0x78 || data.bytes [1] != 0x56 || data.bytes [2] != 0x34 || data.bytes [3] != 0x12) {
103*600f14f4SXin Li printf("\nFAILED, H2LE_32(0x%08x) -> { 0x%02x, 0x%02x, 0x%02x, 0x%02x }\n",
104*600f14f4SXin Li data.u32, data.bytes [0] & 0xff, data.bytes [1] & 0xff, data.bytes [2] & 0xff, data.bytes [3] & 0xff);
105*600f14f4SXin Li return false;
106*600f14f4SXin Li }
107*600f14f4SXin Li puts("OK");
108*600f14f4SXin Li
109*600f14f4SXin Li printf("\nPASSED!\n");
110*600f14f4SXin Li return true;
111*600f14f4SXin Li }
112