iio-test-format.c 8.4 KB

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