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, size: 1, vals: &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, size: 1, vals: &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, size: 1, vals: &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, size: 1, vals: &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, size: 1, vals: &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), vals: 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), vals: 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), vals: 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), vals: 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), vals: 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), vals: 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), vals: 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), vals: 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), vals: 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), vals: 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), vals: 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), vals: 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), vals: 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), vals: 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), vals: 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), vals: 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), vals: 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), vals: 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), vals: 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), vals: 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), vals: 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), vals: 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), vals: 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), vals: 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), vals: 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), vals: 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), vals: 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), vals: 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), vals: 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), vals: 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

source code of linux/drivers/iio/test/iio-test-format.c