1// SPDX-License-Identifier: GPL-2.0-only
2/* Unit tests for IIO formatting functions
3 *
4 * Copyright (c) 2020 Lars-Peter Clausen <lars@metafoo.de>
5 */
6
7#include <kunit/test.h>
8#include <linux/iio/iio.h>
9
10#define IIO_TEST_FORMAT_EXPECT_EQ(_test, _buf, _ret, _val) do { \
11		KUNIT_EXPECT_EQ(_test, strlen(_buf), _ret); \
12		KUNIT_EXPECT_STREQ(_test, (_buf), (_val)); \
13	} while (0)
14
15static void iio_test_iio_format_value_integer(struct kunit *test)
16{
17	char *buf;
18	int val;
19	int ret;
20
21	buf = kunit_kmalloc(test, PAGE_SIZE, GFP_KERNEL);
22	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf);
23
24	val = 42;
25	ret = iio_format_value(buf, IIO_VAL_INT, 1, &val);
26	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "42\n");
27
28	val = -23;
29	ret = iio_format_value(buf, IIO_VAL_INT, 1, &val);
30	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-23\n");
31
32	val = 0;
33	ret = iio_format_value(buf, IIO_VAL_INT, 1, &val);
34	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "0\n");
35
36	val = INT_MAX;
37	ret = iio_format_value(buf, IIO_VAL_INT, 1, &val);
38	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "2147483647\n");
39
40	val = INT_MIN;
41	ret = iio_format_value(buf, IIO_VAL_INT, 1, &val);
42	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-2147483648\n");
43}
44
45static void iio_test_iio_format_value_fixedpoint(struct kunit *test)
46{
47	int values[2];
48	char *buf;
49	int ret;
50
51	buf = kunit_kmalloc(test, PAGE_SIZE, GFP_KERNEL);
52	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf);
53
54	/* positive >= 1 */
55	values[0] = 1;
56	values[1] = 10;
57
58	ret = iio_format_value(buf, IIO_VAL_INT_PLUS_MICRO, ARRAY_SIZE(values), values);
59	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "1.000010\n");
60
61	ret = iio_format_value(buf, IIO_VAL_INT_PLUS_MICRO_DB, ARRAY_SIZE(values), values);
62	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "1.000010 dB\n");
63
64	ret = iio_format_value(buf, IIO_VAL_INT_PLUS_NANO, ARRAY_SIZE(values), values);
65	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "1.000000010\n");
66
67	/* positive < 1 */
68	values[0] = 0;
69	values[1] = 12;
70
71	ret = iio_format_value(buf, IIO_VAL_INT_PLUS_MICRO, ARRAY_SIZE(values), values);
72	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "0.000012\n");
73
74	ret = iio_format_value(buf, IIO_VAL_INT_PLUS_MICRO_DB, ARRAY_SIZE(values), values);
75	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "0.000012 dB\n");
76
77	ret = iio_format_value(buf, IIO_VAL_INT_PLUS_NANO, ARRAY_SIZE(values), values);
78	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "0.000000012\n");
79
80	/* negative <= -1 */
81	values[0] = -1;
82	values[1] = 10;
83
84	ret = iio_format_value(buf, IIO_VAL_INT_PLUS_MICRO, ARRAY_SIZE(values), values);
85	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-1.000010\n");
86
87	ret = iio_format_value(buf, IIO_VAL_INT_PLUS_MICRO_DB, ARRAY_SIZE(values), values);
88	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-1.000010 dB\n");
89
90	ret = iio_format_value(buf, IIO_VAL_INT_PLUS_NANO, ARRAY_SIZE(values), values);
91	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-1.000000010\n");
92
93	/* negative > -1 */
94	values[0] = 0;
95	values[1] = -123;
96	ret = iio_format_value(buf, IIO_VAL_INT_PLUS_MICRO, ARRAY_SIZE(values), values);
97	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-0.000123\n");
98
99	ret = iio_format_value(buf, IIO_VAL_INT_PLUS_MICRO_DB, ARRAY_SIZE(values), values);
100	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-0.000123 dB\n");
101
102	ret = iio_format_value(buf, IIO_VAL_INT_PLUS_NANO, ARRAY_SIZE(values), values);
103	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-0.000000123\n");
104}
105
106static void iio_test_iio_format_value_fractional(struct kunit *test)
107{
108	int values[2];
109	char *buf;
110	int ret;
111
112	buf = kunit_kmalloc(test, PAGE_SIZE, GFP_KERNEL);
113	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf);
114
115	/* positive < 1 */
116	values[0] = 1;
117	values[1] = 10;
118	ret = iio_format_value(buf, IIO_VAL_FRACTIONAL, ARRAY_SIZE(values), values);
119	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "0.100000000\n");
120
121	/* positive >= 1 */
122	values[0] = 100;
123	values[1] = 3;
124	ret = iio_format_value(buf, IIO_VAL_FRACTIONAL, ARRAY_SIZE(values), values);
125	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "33.333333333\n");
126
127	/* negative > -1 */
128	values[0] = -1;
129	values[1] = 1000000000;
130	ret = iio_format_value(buf, IIO_VAL_FRACTIONAL, ARRAY_SIZE(values), values);
131	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-0.000000001\n");
132
133	/* negative <= -1 */
134	values[0] = -200;
135	values[1] = 3;
136	ret = iio_format_value(buf, IIO_VAL_FRACTIONAL, ARRAY_SIZE(values), values);
137	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-66.666666666\n");
138
139	/* Zero */
140	values[0] = 0;
141	values[1] = -10;
142	ret = iio_format_value(buf, IIO_VAL_FRACTIONAL, ARRAY_SIZE(values), values);
143	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "0.000000000\n");
144}
145
146static void iio_test_iio_format_value_fractional_log2(struct kunit *test)
147{
148	int values[2];
149	char *buf;
150	int ret;
151
152	buf = kunit_kmalloc(test, PAGE_SIZE, GFP_KERNEL);
153	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf);
154
155	/* positive < 1 */
156	values[0] = 123;
157	values[1] = 10;
158	ret = iio_format_value(buf, IIO_VAL_FRACTIONAL_LOG2, ARRAY_SIZE(values), values);
159	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "0.120117187\n");
160
161	/* positive >= 1 */
162	values[0] = 1234567;
163	values[1] = 10;
164	ret = iio_format_value(buf, IIO_VAL_FRACTIONAL_LOG2, ARRAY_SIZE(values), values);
165	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "1205.631835937\n");
166
167	/* negative > -1 */
168	values[0] = -123;
169	values[1] = 10;
170	ret = iio_format_value(buf, IIO_VAL_FRACTIONAL_LOG2, ARRAY_SIZE(values), values);
171	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-0.120117187\n");
172
173	/* negative <= -1 */
174	values[0] = -1234567;
175	values[1] = 10;
176	ret = iio_format_value(buf, IIO_VAL_FRACTIONAL_LOG2, ARRAY_SIZE(values), values);
177	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-1205.631835937\n");
178
179	/* Zero */
180	values[0] = 0;
181	values[1] = 10;
182	ret = iio_format_value(buf, IIO_VAL_FRACTIONAL_LOG2, ARRAY_SIZE(values), values);
183	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "0.000000000\n");
184}
185
186static void iio_test_iio_format_value_multiple(struct kunit *test)
187{
188	int values[] = {1, -2, 3, -4, 5};
189	char *buf;
190	int ret;
191
192	buf = kunit_kmalloc(test, PAGE_SIZE, GFP_KERNEL);
193	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf);
194
195	ret = iio_format_value(buf, IIO_VAL_INT_MULTIPLE,
196			       ARRAY_SIZE(values), values);
197	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "1 -2 3 -4 5 \n");
198}
199
200static void iio_test_iio_format_value_integer_64(struct kunit *test)
201{
202	int values[2];
203	s64 value;
204	char *buf;
205	int ret;
206
207	buf = kunit_kmalloc(test, PAGE_SIZE, GFP_KERNEL);
208	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf);
209
210	value = 24;
211	values[0] = lower_32_bits(value);
212	values[1] = upper_32_bits(value);
213	ret = iio_format_value(buf, IIO_VAL_INT_64, ARRAY_SIZE(values), values);
214	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "24\n");
215
216	value = -24;
217	values[0] = lower_32_bits(value);
218	values[1] = upper_32_bits(value);
219	ret = iio_format_value(buf, IIO_VAL_INT_64, ARRAY_SIZE(values), values);
220	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-24\n");
221
222	value = 0;
223	values[0] = lower_32_bits(value);
224	values[1] = upper_32_bits(value);
225	ret = iio_format_value(buf, IIO_VAL_INT_64, ARRAY_SIZE(values), values);
226	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "0\n");
227
228	value = UINT_MAX;
229	values[0] = lower_32_bits(value);
230	values[1] = upper_32_bits(value);
231	ret = iio_format_value(buf, IIO_VAL_INT_64, ARRAY_SIZE(values), values);
232	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "4294967295\n");
233
234	value = -((s64)UINT_MAX);
235	values[0] = lower_32_bits(value);
236	values[1] = upper_32_bits(value);
237	ret = iio_format_value(buf, IIO_VAL_INT_64, ARRAY_SIZE(values), values);
238	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-4294967295\n");
239
240	value = LLONG_MAX;
241	values[0] = lower_32_bits(value);
242	values[1] = upper_32_bits(value);
243	ret = iio_format_value(buf, IIO_VAL_INT_64, ARRAY_SIZE(values), values);
244	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "9223372036854775807\n");
245
246	value = LLONG_MIN;
247	values[0] = lower_32_bits(value);
248	values[1] = upper_32_bits(value);
249	ret = iio_format_value(buf, IIO_VAL_INT_64, ARRAY_SIZE(values), values);
250	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-9223372036854775808\n");
251}
252
253static struct kunit_case iio_format_test_cases[] = {
254		KUNIT_CASE(iio_test_iio_format_value_integer),
255		KUNIT_CASE(iio_test_iio_format_value_fixedpoint),
256		KUNIT_CASE(iio_test_iio_format_value_fractional),
257		KUNIT_CASE(iio_test_iio_format_value_fractional_log2),
258		KUNIT_CASE(iio_test_iio_format_value_multiple),
259		KUNIT_CASE(iio_test_iio_format_value_integer_64),
260		{}
261};
262
263static struct kunit_suite iio_format_test_suite = {
264	.name = "iio-format",
265	.test_cases = iio_format_test_cases,
266};
267kunit_test_suite(iio_format_test_suite);
268
269MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");
270MODULE_DESCRIPTION("Test IIO formatting functions");
271MODULE_LICENSE("GPL v2");
272