xref: /aosp_15_r20/system/media/audio_utils/tests/variadic_tests.cpp (revision b9df5ad1c9ac98a7fefaac271a55f7ae3db05414)
1*b9df5ad1SAndroid Build Coastguard Worker /*
2*b9df5ad1SAndroid Build Coastguard Worker  * Copyright 2018 The Android Open Source Project
3*b9df5ad1SAndroid Build Coastguard Worker  *
4*b9df5ad1SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*b9df5ad1SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*b9df5ad1SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*b9df5ad1SAndroid Build Coastguard Worker  *
8*b9df5ad1SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*b9df5ad1SAndroid Build Coastguard Worker  *
10*b9df5ad1SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*b9df5ad1SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*b9df5ad1SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*b9df5ad1SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*b9df5ad1SAndroid Build Coastguard Worker  * limitations under the License.
15*b9df5ad1SAndroid Build Coastguard Worker  */
16*b9df5ad1SAndroid Build Coastguard Worker 
17*b9df5ad1SAndroid Build Coastguard Worker //#define LOG_NDEBUG 0
18*b9df5ad1SAndroid Build Coastguard Worker #define LOG_TAG "audio_utils_variadic_tests"
19*b9df5ad1SAndroid Build Coastguard Worker #include <audio_utils/variadic_utils.h>
20*b9df5ad1SAndroid Build Coastguard Worker 
21*b9df5ad1SAndroid Build Coastguard Worker #include <stdio.h>
22*b9df5ad1SAndroid Build Coastguard Worker #include <gtest/gtest.h>
23*b9df5ad1SAndroid Build Coastguard Worker 
24*b9df5ad1SAndroid Build Coastguard Worker // Our near expectation is 16x the bit that doesn't fit the mantissa.
25*b9df5ad1SAndroid Build Coastguard Worker // this works so long as we add values close in exponent with each other
26*b9df5ad1SAndroid Build Coastguard Worker // realizing that errors accumulate as the sqrt of N (random walk, lln, etc).
27*b9df5ad1SAndroid Build Coastguard Worker #define TEST_EXPECT_NEAR(e, v) \
28*b9df5ad1SAndroid Build Coastguard Worker     EXPECT_NEAR((e), (v), abs((e) * std::numeric_limits<decltype(e)>::epsilon() * 8))
29*b9df5ad1SAndroid Build Coastguard Worker 
30*b9df5ad1SAndroid Build Coastguard Worker #define PRINT_AND_EXPECT_EQ(expected, expr) { \
31*b9df5ad1SAndroid Build Coastguard Worker     auto value = (expr); \
32*b9df5ad1SAndroid Build Coastguard Worker     printf("(%s): %s\n", #expr, std::to_string(value).c_str()); \
33*b9df5ad1SAndroid Build Coastguard Worker     if ((expected) == (expected)) { EXPECT_EQ((expected), (value)); } \
34*b9df5ad1SAndroid Build Coastguard Worker     EXPECT_EQ((expected) != (expected), (value) != (value)); /* nan check */\
35*b9df5ad1SAndroid Build Coastguard Worker }
36*b9df5ad1SAndroid Build Coastguard Worker 
37*b9df5ad1SAndroid Build Coastguard Worker #define PRINT_AND_EXPECT_NEAR(expected, expr) { \
38*b9df5ad1SAndroid Build Coastguard Worker     auto ref = (expected); \
39*b9df5ad1SAndroid Build Coastguard Worker     auto value = (expr); \
40*b9df5ad1SAndroid Build Coastguard Worker     printf("(%s): %s\n", #expr, std::to_string(value).c_str()); \
41*b9df5ad1SAndroid Build Coastguard Worker     TEST_EXPECT_NEAR(ref, value); \
42*b9df5ad1SAndroid Build Coastguard Worker }
43*b9df5ad1SAndroid Build Coastguard Worker 
TEST(variadic_tests,printing)44*b9df5ad1SAndroid Build Coastguard Worker TEST(variadic_tests, printing)
45*b9df5ad1SAndroid Build Coastguard Worker {
46*b9df5ad1SAndroid Build Coastguard Worker     // for operator overloading...
47*b9df5ad1SAndroid Build Coastguard Worker     using namespace android::audio_utils;
48*b9df5ad1SAndroid Build Coastguard Worker 
49*b9df5ad1SAndroid Build Coastguard Worker     // print simple, deep value
50*b9df5ad1SAndroid Build Coastguard Worker     std::cout << "std::make_tuple(1, 2, 3)= " << std::make_tuple(1, 2, 3) << "\n";
51*b9df5ad1SAndroid Build Coastguard Worker     std::cout << "std::make_pair(1, std::make_pair(0, 1))= "
52*b9df5ad1SAndroid Build Coastguard Worker               << std::make_pair(1, std::make_pair(0, 1)) << "\n";
53*b9df5ad1SAndroid Build Coastguard Worker }
54*b9df5ad1SAndroid Build Coastguard Worker 
TEST(variadic_tests,equivalence)55*b9df5ad1SAndroid Build Coastguard Worker TEST(variadic_tests, equivalence)
56*b9df5ad1SAndroid Build Coastguard Worker {
57*b9df5ad1SAndroid Build Coastguard Worker     using android::audio_utils::equivalent;
58*b9df5ad1SAndroid Build Coastguard Worker     auto deep = std::make_pair(1., std::make_pair(2, 3));
59*b9df5ad1SAndroid Build Coastguard Worker 
60*b9df5ad1SAndroid Build Coastguard Worker     EXPECT_TRUE(equivalent(deep, deep));
61*b9df5ad1SAndroid Build Coastguard Worker     EXPECT_TRUE(equivalent(std::make_pair(1, 2), std::make_tuple(1, 2)));
62*b9df5ad1SAndroid Build Coastguard Worker     EXPECT_FALSE(equivalent(std::make_pair(1, 2), std::make_pair(0, 2)));
63*b9df5ad1SAndroid Build Coastguard Worker     EXPECT_FALSE(equivalent(std::make_pair(1, 2), 1));
64*b9df5ad1SAndroid Build Coastguard Worker     EXPECT_FALSE(equivalent(0, 2));
65*b9df5ad1SAndroid Build Coastguard Worker     EXPECT_TRUE(equivalent(1, 1.));
66*b9df5ad1SAndroid Build Coastguard Worker }
67*b9df5ad1SAndroid Build Coastguard Worker 
TEST(variadic_tests,template_checks)68*b9df5ad1SAndroid Build Coastguard Worker TEST(variadic_tests, template_checks)
69*b9df5ad1SAndroid Build Coastguard Worker {
70*b9df5ad1SAndroid Build Coastguard Worker     EXPECT_FALSE(android::audio_utils::is_variadic<double>::value);
71*b9df5ad1SAndroid Build Coastguard Worker 
72*b9df5ad1SAndroid Build Coastguard Worker     using tuple_t = std::tuple<double, double>;
73*b9df5ad1SAndroid Build Coastguard Worker 
74*b9df5ad1SAndroid Build Coastguard Worker     EXPECT_TRUE(android::audio_utils::is_variadic<tuple_t>::value);
75*b9df5ad1SAndroid Build Coastguard Worker     EXPECT_TRUE(android::audio_utils::is_tuple<tuple_t>::value);
76*b9df5ad1SAndroid Build Coastguard Worker     EXPECT_FALSE(android::audio_utils::is_pair<tuple_t>::value);
77*b9df5ad1SAndroid Build Coastguard Worker     EXPECT_FALSE(android::audio_utils::is_array<tuple_t>::value);
78*b9df5ad1SAndroid Build Coastguard Worker     EXPECT_FALSE(std::is_array<tuple_t>::value);
79*b9df5ad1SAndroid Build Coastguard Worker 
80*b9df5ad1SAndroid Build Coastguard Worker     using pair_t = std::pair<double, double>;
81*b9df5ad1SAndroid Build Coastguard Worker 
82*b9df5ad1SAndroid Build Coastguard Worker     EXPECT_TRUE(android::audio_utils::is_variadic<pair_t>::value);
83*b9df5ad1SAndroid Build Coastguard Worker     EXPECT_FALSE(android::audio_utils::is_tuple<pair_t>::value);
84*b9df5ad1SAndroid Build Coastguard Worker     EXPECT_TRUE(android::audio_utils::is_pair<pair_t>::value);
85*b9df5ad1SAndroid Build Coastguard Worker     EXPECT_FALSE(android::audio_utils::is_array<pair_t>::value);
86*b9df5ad1SAndroid Build Coastguard Worker     EXPECT_FALSE(std::is_array<pair_t>::value);
87*b9df5ad1SAndroid Build Coastguard Worker 
88*b9df5ad1SAndroid Build Coastguard Worker     using array_t = std::array<double, 2>;
89*b9df5ad1SAndroid Build Coastguard Worker 
90*b9df5ad1SAndroid Build Coastguard Worker     EXPECT_TRUE(android::audio_utils::is_variadic<array_t>::value);
91*b9df5ad1SAndroid Build Coastguard Worker     EXPECT_FALSE(android::audio_utils::is_tuple<array_t>::value);
92*b9df5ad1SAndroid Build Coastguard Worker     EXPECT_FALSE(android::audio_utils::is_pair<array_t>::value);
93*b9df5ad1SAndroid Build Coastguard Worker     EXPECT_TRUE(android::audio_utils::is_array<array_t>::value);
94*b9df5ad1SAndroid Build Coastguard Worker     EXPECT_FALSE(std::is_array<array_t>::value);
95*b9df5ad1SAndroid Build Coastguard Worker 
96*b9df5ad1SAndroid Build Coastguard Worker     EXPECT_FALSE(android::audio_utils::is_iterator<char>::value);
97*b9df5ad1SAndroid Build Coastguard Worker     EXPECT_TRUE(android::audio_utils::is_iterator<char *>::value);
98*b9df5ad1SAndroid Build Coastguard Worker     EXPECT_TRUE(android::audio_utils::is_iterator<decltype(std::vector<int>{}.begin())>::value);
99*b9df5ad1SAndroid Build Coastguard Worker }
100*b9df5ad1SAndroid Build Coastguard Worker 
TEST(variadic_tests,basic_math)101*b9df5ad1SAndroid Build Coastguard Worker TEST(variadic_tests, basic_math)
102*b9df5ad1SAndroid Build Coastguard Worker {
103*b9df5ad1SAndroid Build Coastguard Worker     // for operator overloading...
104*b9df5ad1SAndroid Build Coastguard Worker     using namespace android::audio_utils;
105*b9df5ad1SAndroid Build Coastguard Worker 
106*b9df5ad1SAndroid Build Coastguard Worker     using tuple_t = std::tuple<double, double>;
107*b9df5ad1SAndroid Build Coastguard Worker     tuple_t x{1, 2};
108*b9df5ad1SAndroid Build Coastguard Worker     tuple_t y{0, 3};
109*b9df5ad1SAndroid Build Coastguard Worker     double z = 3;
110*b9df5ad1SAndroid Build Coastguard Worker 
111*b9df5ad1SAndroid Build Coastguard Worker     std::cout << "x=" << x << " y=" << y << " x+y=" << (x + y) << "\n";
112*b9df5ad1SAndroid Build Coastguard Worker     std::cout << "x=" << x << " y=" << y << " x*y=" << (x * y) << "\n";
113*b9df5ad1SAndroid Build Coastguard Worker     std::cout << "x=" << x << " z=" << z << " x+z=" << (x + z) << "\n";
114*b9df5ad1SAndroid Build Coastguard Worker     std::cout << "x=" << x << " z=" << z << " x*z=" << (x * z) << "\n";
115*b9df5ad1SAndroid Build Coastguard Worker     std::cout << "x=" << x << " y=" << y << " innerProduct(x, y)=" << innerProduct(x, y) << "\n";
116*b9df5ad1SAndroid Build Coastguard Worker     std::cout << "x=" << x << " y=" << y << " outerProduct(x, y)=" << outerProduct(x, y) << "\n";
117*b9df5ad1SAndroid Build Coastguard Worker     std::cout << "x=" << x << " sqrt(x)=" << android::audio_utils::sqrt(x) << "\n";
118*b9df5ad1SAndroid Build Coastguard Worker     std::cout << "x=" << x << " y=" << y
119*b9df5ad1SAndroid Build Coastguard Worker             << " min(x, y)" <<  android::audio_utils::min(x, y) << "\n";
120*b9df5ad1SAndroid Build Coastguard Worker 
121*b9df5ad1SAndroid Build Coastguard Worker     // check opequals mode
122*b9df5ad1SAndroid Build Coastguard Worker     std::cout << "x=" << x;
123*b9df5ad1SAndroid Build Coastguard Worker     std::cout << " x+=2" << (x += 2) << "\n";
124*b9df5ad1SAndroid Build Coastguard Worker     std::cout << "x=" << x << " y=" << y;
125*b9df5ad1SAndroid Build Coastguard Worker     std::cout << " x*=y" << (x *= y) << "\n";
126*b9df5ad1SAndroid Build Coastguard Worker 
127*b9df5ad1SAndroid Build Coastguard Worker     using pair_t = std::pair<double, double>;
128*b9df5ad1SAndroid Build Coastguard Worker     pair_t px{1, 2};
129*b9df5ad1SAndroid Build Coastguard Worker     pair_t py{0, 3};
130*b9df5ad1SAndroid Build Coastguard Worker 
131*b9df5ad1SAndroid Build Coastguard Worker     std::cout << "px=" << px << " py=" << py << " px+py=" << (px + py) << "\n";
132*b9df5ad1SAndroid Build Coastguard Worker     std::cout << "px=" << px << " py=" << py << " px*py=" << (px * py) << "\n";
133*b9df5ad1SAndroid Build Coastguard Worker     std::cout << "px=" << px << " z="  << z  << " px+z="  << (px + z) << "\n";
134*b9df5ad1SAndroid Build Coastguard Worker     std::cout << "px=" << px << " z="  << z  << " px*z="  << (px * z) << "\n";
135*b9df5ad1SAndroid Build Coastguard Worker     std::cout << "px=" << px << " py=" << py << " innerProduct(px, py)="
136*b9df5ad1SAndroid Build Coastguard Worker             << innerProduct(px, py) << "\n";
137*b9df5ad1SAndroid Build Coastguard Worker     std::cout << "px=" << px << " py=" << py << " outerProduct(px, py)="
138*b9df5ad1SAndroid Build Coastguard Worker             << outerProduct(px, py) << "\n";
139*b9df5ad1SAndroid Build Coastguard Worker 
140*b9df5ad1SAndroid Build Coastguard Worker     using array_t = std::array<double, 2>;
141*b9df5ad1SAndroid Build Coastguard Worker     array_t ax{1, 2};
142*b9df5ad1SAndroid Build Coastguard Worker     array_t ay{0, 3};
143*b9df5ad1SAndroid Build Coastguard Worker 
144*b9df5ad1SAndroid Build Coastguard Worker     std::cout << "ax=" << ax << " ay=" << ay << " ax+ay=" << (ax + ay) << "\n";
145*b9df5ad1SAndroid Build Coastguard Worker     std::cout << "ax=" << ax << " ay=" << ay << " ax*ay=" << (ax * ay) << "\n";
146*b9df5ad1SAndroid Build Coastguard Worker     std::cout << "ax=" << ax << " z="  << z  << " ax+z="  << (ax + z) << "\n";
147*b9df5ad1SAndroid Build Coastguard Worker     std::cout << "ax=" << ax << " z="  << z  << " ax*z="  << (ax * z) << "\n";
148*b9df5ad1SAndroid Build Coastguard Worker     std::cout << "ax=" << px << " ay=" << ay << " innerProduct(ax, ay)="
149*b9df5ad1SAndroid Build Coastguard Worker             << innerProduct(ax, ay) << "\n";
150*b9df5ad1SAndroid Build Coastguard Worker     std::cout << "ax=" << px << " ay=" << ay << " outerProduct(ax, ay)="
151*b9df5ad1SAndroid Build Coastguard Worker             << outerProduct(ax, ay) << "\n";
152*b9df5ad1SAndroid Build Coastguard Worker 
153*b9df5ad1SAndroid Build Coastguard Worker     // deep math
154*b9df5ad1SAndroid Build Coastguard Worker     auto deep = std::make_pair(1., std::make_pair(2, 3));
155*b9df5ad1SAndroid Build Coastguard Worker     std::cout << "deep= " << deep << "\n";
156*b9df5ad1SAndroid Build Coastguard Worker     std::cout << "deep + deep= " << deep + deep << "\n";
157*b9df5ad1SAndroid Build Coastguard Worker     std::cout << "deep + 1= " << deep + 1 << "\n";
158*b9df5ad1SAndroid Build Coastguard Worker }
159