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