xref: /aosp_15_r20/external/openthread/tests/unit/test_macros.cpp (revision cfb92d1480a9e65faed56933e9c12405f45898b4)
1 /*
2  *  Copyright (c) 2020, The OpenThread Authors.
3  *  All rights reserved.
4  *
5  *  Redistribution and use in source and binary forms, with or without
6  *  modification, are permitted provided that the following conditions are met:
7  *  1. Redistributions of source code must retain the above copyright
8  *     notice, this list of conditions and the following disclaimer.
9  *  2. Redistributions in binary form must reproduce the above copyright
10  *     notice, this list of conditions and the following disclaimer in the
11  *     documentation and/or other materials provided with the distribution.
12  *  3. Neither the name of the copyright holder nor the
13  *     names of its contributors may be used to endorse or promote products
14  *     derived from this software without specific prior written permission.
15  *
16  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17  *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20  *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21  *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22  *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23  *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24  *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25  *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26  *  POSSIBILITY OF SUCH DAMAGE.
27  */
28 
29 #include "test_platform.h"
30 
31 #include "common/arg_macros.hpp"
32 
33 namespace ot {
34 
NumberOfArgs(void)35 static constexpr uint8_t NumberOfArgs(void) { return 0; }
36 
NumberOfArgs(uint8_t)37 static constexpr uint8_t NumberOfArgs(uint8_t) { return 1; }
38 
NumberOfArgs(uint8_t,uint8_t)39 static constexpr uint8_t NumberOfArgs(uint8_t, uint8_t) { return 2; }
40 
NumberOfArgs(uint8_t,uint8_t,uint8_t)41 static constexpr uint8_t NumberOfArgs(uint8_t, uint8_t, uint8_t) { return 3; }
42 
NumberOfArgs(uint8_t,uint8_t,uint8_t,uint8_t)43 static constexpr uint8_t NumberOfArgs(uint8_t, uint8_t, uint8_t, uint8_t) { return 4; }
44 
NumberOfArgs(uint8_t,uint8_t,uint8_t,uint8_t,uint8_t)45 static constexpr uint8_t NumberOfArgs(uint8_t, uint8_t, uint8_t, uint8_t, uint8_t) { return 5; }
46 
NumberOfArgs(uint8_t,uint8_t,uint8_t,uint8_t,uint8_t,uint8_t)47 static constexpr uint8_t NumberOfArgs(uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t) { return 6; }
48 
NumberOfArgs(uint8_t,uint8_t,uint8_t,uint8_t,uint8_t,uint8_t,uint8_t)49 static constexpr uint8_t NumberOfArgs(uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t) { return 7; }
50 
Sum(int aFirst)51 int Sum(int aFirst) { return aFirst; }
52 
Sum(int aFirst,Args...aArgs)53 template <typename... Args> int Sum(int aFirst, Args... aArgs) { return aFirst + Sum(aArgs...); }
54 
TestMacros(void)55 void TestMacros(void)
56 {
57     // Verify `OT_FIRST_ARG()` macro.
58 
59     VerifyOrQuit(OT_FIRST_ARG(1) == 1);
60     VerifyOrQuit(OT_FIRST_ARG(1, 2, 3) == 1);
61     VerifyOrQuit(OT_FIRST_ARG(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12) == 1);
62 
63     // Verify `OT_REST_ARGS()` macro.
64 
65     VerifyOrQuit(NumberOfArgs(OT_REST_ARGS(1)) == 0);
66 
67     VerifyOrQuit(NumberOfArgs(0 OT_REST_ARGS(1)) == 1);
68     VerifyOrQuit(NumberOfArgs(0 OT_REST_ARGS(1, 2)) == 2);
69     VerifyOrQuit(NumberOfArgs(0 OT_REST_ARGS(1, 2, 3)) == 3);
70     VerifyOrQuit(NumberOfArgs(0 OT_REST_ARGS(1, 2, 3, 4)) == 4);
71     VerifyOrQuit(NumberOfArgs(0 OT_REST_ARGS(1, 2, 3, 4, 5)) == 5);
72     VerifyOrQuit(NumberOfArgs(0 OT_REST_ARGS(1, 2, 3, 4, 5, 6)) == 6);
73     VerifyOrQuit(NumberOfArgs(0 OT_REST_ARGS(1, 2, 3, 4, 5, 6, 7)) == 7);
74 
75     VerifyOrQuit(Sum(100 OT_REST_ARGS(1)) == 100);
76     VerifyOrQuit(Sum(100 OT_REST_ARGS(1, 2)) == 102);
77     VerifyOrQuit(Sum(100 OT_REST_ARGS(1, 2, 3)) == 105);
78     VerifyOrQuit(Sum(100 OT_REST_ARGS(1, 2, 3, 4)) == 109);
79     VerifyOrQuit(Sum(100 OT_REST_ARGS(1, 2, 3, 4, 5)) == 114);
80     VerifyOrQuit(Sum(100 OT_REST_ARGS(1, 2, 3, 4, 5, 6)) == 120);
81     VerifyOrQuit(Sum(100 OT_REST_ARGS(1, 2, 3, 4, 5, 6, 7)) == 127);
82 
83     // Verify `OT_SECOND_ARG()` macro.
84 
85     VerifyOrQuit(NumberOfArgs(OT_SECOND_ARG(1)) == 0);
86     VerifyOrQuit(NumberOfArgs(OT_SECOND_ARG(1, 2)) == 1);
87 
88     VerifyOrQuit(OT_SECOND_ARG(1, 2) == 2);
89 }
90 
TestVerifyOrExitSuccessNoAction(void)91 void TestVerifyOrExitSuccessNoAction(void)
92 {
93     bool reachedEnd = false;
94 
95     VerifyOrExit(true);
96     reachedEnd = true;
97 
98 exit:
99     VerifyOrQuit(reachedEnd, "VerifyOrExit() failed");
100 }
101 
TestVerifyOrExitFailureNoAction(void)102 void TestVerifyOrExitFailureNoAction(void)
103 {
104     bool reachedEnd = false;
105 
106     VerifyOrExit(false);
107     reachedEnd = true;
108 
109 exit:
110     VerifyOrQuit(!reachedEnd, "VerifyOrExit() failed");
111 }
112 
TestVerifyOrExitSuccessWithAction(void)113 void TestVerifyOrExitSuccessWithAction(void)
114 {
115     bool didAction  = false;
116     bool reachedEnd = false;
117 
118     VerifyOrExit(true, didAction = true);
119     reachedEnd = true;
120 
121 exit:
122     VerifyOrQuit(reachedEnd && !didAction, "VerifyOrExit() failed");
123 }
124 
TestVerifyOrExitFailureWithAction(void)125 void TestVerifyOrExitFailureWithAction(void)
126 {
127     bool didAction  = false;
128     bool reachedEnd = false;
129 
130     VerifyOrExit(false, didAction = true);
131     reachedEnd = true;
132 
133 exit:
134     VerifyOrQuit(!reachedEnd && didAction, "VerifyOrExit() failed");
135 }
136 
137 } // namespace ot
138 
main(void)139 int main(void)
140 {
141     ot::TestMacros();
142     ot::TestVerifyOrExitSuccessNoAction();
143     ot::TestVerifyOrExitFailureNoAction();
144     ot::TestVerifyOrExitSuccessWithAction();
145     ot::TestVerifyOrExitFailureWithAction();
146     printf("All tests passed\n");
147     return 0;
148 }
149