xref: /linux/drivers/iio/test/iio-test-format.c (revision 3a2c4d55e32ad65efebdb6de44eef3bfa08bb49d)
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 
15 static 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 
45 static 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 
106 static 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 
146 static 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 
186 static 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 
200 static void iio_test_iio_format_value_integer_64(struct kunit *test)
201 {
202 	int values[2];
203 	char *buf;
204 	int ret;
205 
206 	buf = kunit_kmalloc(test, PAGE_SIZE, GFP_KERNEL);
207 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf);
208 
209 	iio_val_s64_decompose(24, &values[0], &values[1]);
210 	ret = iio_format_value(buf, IIO_VAL_INT_64, ARRAY_SIZE(values), values);
211 	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "24\n");
212 
213 	iio_val_s64_decompose(-24, &values[0], &values[1]);
214 	ret = iio_format_value(buf, IIO_VAL_INT_64, ARRAY_SIZE(values), values);
215 	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-24\n");
216 
217 	iio_val_s64_decompose(0, &values[0], &values[1]);
218 	ret = iio_format_value(buf, IIO_VAL_INT_64, ARRAY_SIZE(values), values);
219 	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "0\n");
220 
221 	iio_val_s64_decompose(UINT_MAX, &values[0], &values[1]);
222 	ret = iio_format_value(buf, IIO_VAL_INT_64, ARRAY_SIZE(values), values);
223 	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "4294967295\n");
224 
225 	iio_val_s64_decompose(-((s64)UINT_MAX), &values[0], &values[1]);
226 	ret = iio_format_value(buf, IIO_VAL_INT_64, ARRAY_SIZE(values), values);
227 	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-4294967295\n");
228 
229 	iio_val_s64_decompose(LLONG_MAX, &values[0], &values[1]);
230 	ret = iio_format_value(buf, IIO_VAL_INT_64, ARRAY_SIZE(values), values);
231 	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "9223372036854775807\n");
232 
233 	iio_val_s64_decompose(LLONG_MIN, &values[0], &values[1]);
234 	ret = iio_format_value(buf, IIO_VAL_INT_64, ARRAY_SIZE(values), values);
235 	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-9223372036854775808\n");
236 }
237 
238 static void iio_test_iio_format_value_decimal_64(struct kunit *test)
239 {
240 	int values[2];
241 	char *buf;
242 	int ret;
243 
244 	buf = kunit_kmalloc(test, PAGE_SIZE, GFP_KERNEL);
245 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf);
246 
247 	/* DECIMAL64_MILLI: positive >= 1, value 1.234 */
248 	iio_val_s64_decompose(1234, &values[0], &values[1]);
249 	ret = iio_format_value(buf, IIO_VAL_DECIMAL64_MILLI, ARRAY_SIZE(values), values);
250 	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "1.234\n");
251 
252 	/* DECIMAL64_MICRO: positive >= 1, value 3.141592 */
253 	iio_val_s64_decompose(3141592, &values[0], &values[1]);
254 	ret = iio_format_value(buf, IIO_VAL_DECIMAL64_MICRO, ARRAY_SIZE(values), values);
255 	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "3.141592\n");
256 
257 	/* DECIMAL64_MILLI: positive < 1, value 0.042 */
258 	iio_val_s64_decompose(42, &values[0], &values[1]);
259 	ret = iio_format_value(buf, IIO_VAL_DECIMAL64_MILLI, ARRAY_SIZE(values), values);
260 	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "0.042\n");
261 
262 	/* DECIMAL64_MILLI: negative <= -1, value -1.234 */
263 	iio_val_s64_decompose(-1234, &values[0], &values[1]);
264 	ret = iio_format_value(buf, IIO_VAL_DECIMAL64_MILLI, ARRAY_SIZE(values), values);
265 	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-1.234\n");
266 
267 	/* DECIMAL64_MILLI: negative > -1, value -0.123 */
268 	iio_val_s64_decompose(-123, &values[0], &values[1]);
269 	ret = iio_format_value(buf, IIO_VAL_DECIMAL64_MILLI, ARRAY_SIZE(values), values);
270 	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-0.123\n");
271 
272 	/* DECIMAL64_MILLI: zero */
273 	iio_val_s64_decompose(0, &values[0], &values[1]);
274 	ret = iio_format_value(buf, IIO_VAL_DECIMAL64_MILLI, ARRAY_SIZE(values), values);
275 	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "0.000\n");
276 
277 	/* DECIMAL64_NANO: value 1.000000001 */
278 	iio_val_s64_decompose(1000000001, &values[0], &values[1]);
279 	ret = iio_format_value(buf, IIO_VAL_DECIMAL64_NANO, ARRAY_SIZE(values), values);
280 	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "1.000000001\n");
281 
282 	/* DECIMAL64_MICRO: large value using upper 32 bits */
283 	iio_val_s64_decompose(5000000000000042LL, &values[0], &values[1]);
284 	ret = iio_format_value(buf, IIO_VAL_DECIMAL64_MICRO, ARRAY_SIZE(values), values);
285 	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "5000000000.000042\n");
286 
287 	/* limits */
288 	iio_val_s64_decompose(LLONG_MAX, &values[0], &values[1]);
289 	ret = iio_format_value(buf, IIO_VAL_DECIMAL64_PICO, ARRAY_SIZE(values), values);
290 	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "9223372.036854775807\n");
291 	ret = iio_format_value(buf, IIO_VAL_DECIMAL64_NANO, ARRAY_SIZE(values), values);
292 	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "9223372036.854775807\n");
293 	ret = iio_format_value(buf, IIO_VAL_DECIMAL64_MICRO, ARRAY_SIZE(values), values);
294 	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "9223372036854.775807\n");
295 
296 	iio_val_s64_decompose(LLONG_MIN, &values[0], &values[1]);
297 	ret = iio_format_value(buf, IIO_VAL_DECIMAL64_PICO, ARRAY_SIZE(values), values);
298 	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-9223372.036854775808\n");
299 	ret = iio_format_value(buf, IIO_VAL_DECIMAL64_NANO, ARRAY_SIZE(values), values);
300 	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-9223372036.854775808\n");
301 	ret = iio_format_value(buf, IIO_VAL_DECIMAL64_MICRO, ARRAY_SIZE(values), values);
302 	IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-9223372036854.775808\n");
303 }
304 
305 static struct kunit_case iio_format_test_cases[] = {
306 		KUNIT_CASE(iio_test_iio_format_value_integer),
307 		KUNIT_CASE(iio_test_iio_format_value_fixedpoint),
308 		KUNIT_CASE(iio_test_iio_format_value_fractional),
309 		KUNIT_CASE(iio_test_iio_format_value_fractional_log2),
310 		KUNIT_CASE(iio_test_iio_format_value_multiple),
311 		KUNIT_CASE(iio_test_iio_format_value_integer_64),
312 		KUNIT_CASE(iio_test_iio_format_value_decimal_64),
313 		{ }
314 };
315 
316 static struct kunit_suite iio_format_test_suite = {
317 	.name = "iio-format",
318 	.test_cases = iio_format_test_cases,
319 };
320 kunit_test_suite(iio_format_test_suite);
321 
322 MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");
323 MODULE_DESCRIPTION("Test IIO formatting functions");
324 MODULE_LICENSE("GPL v2");
325