rippled
Loading...
Searching...
No Matches
scope_test.cpp
1//------------------------------------------------------------------------------
2/*
3 This file is part of rippled: https://github0.com/ripple/rippled
4 Copyright (c) 2021 Ripple Inc.
5
6 Permission to use, copy, modify, and/or distribute this software for any
7 purpose with or without fee is hereby granted, provided that the above
8 copyright notice and this permission notice appear in all copies.
9
10 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17*/
18//==============================================================================
19
20#include <xrpl/basics/scope.h>
21#include <xrpl/beast/unit_test.h>
22
23namespace ripple {
24namespace test {
25
27{
28 void
30 {
31 // scope_exit always executes the functor on destruction,
32 // unless release() is called
33 int i = 0;
34 {
35 scope_exit x{[&i]() { i = 1; }};
36 }
37 BEAST_EXPECT(i == 1);
38 {
39 scope_exit x{[&i]() { i = 2; }};
40 x.release();
41 }
42 BEAST_EXPECT(i == 1);
43 {
44 scope_exit x{[&i]() { i += 2; }};
45 auto x2 = std::move(x);
46 }
47 BEAST_EXPECT(i == 3);
48 {
49 scope_exit x{[&i]() { i = 4; }};
50 x.release();
51 auto x2 = std::move(x);
52 }
53 BEAST_EXPECT(i == 3);
54 {
55 try
56 {
57 scope_exit x{[&i]() { i = 5; }};
58 throw 1;
59 }
60 catch (...)
61 {
62 }
63 }
64 BEAST_EXPECT(i == 5);
65 {
66 try
67 {
68 scope_exit x{[&i]() { i = 6; }};
69 x.release();
70 throw 1;
71 }
72 catch (...)
73 {
74 }
75 }
76 BEAST_EXPECT(i == 5);
77 }
78
79 void
81 {
82 // scope_fail executes the functor on destruction only
83 // if an exception is unwinding, unless release() is called
84 int i = 0;
85 {
86 scope_fail x{[&i]() { i = 1; }};
87 }
88 BEAST_EXPECT(i == 0);
89 {
90 scope_fail x{[&i]() { i = 2; }};
91 x.release();
92 }
93 BEAST_EXPECT(i == 0);
94 {
95 scope_fail x{[&i]() { i = 3; }};
96 auto x2 = std::move(x);
97 }
98 BEAST_EXPECT(i == 0);
99 {
100 scope_fail x{[&i]() { i = 4; }};
101 x.release();
102 auto x2 = std::move(x);
103 }
104 BEAST_EXPECT(i == 0);
105 {
106 try
107 {
108 scope_fail x{[&i]() { i = 5; }};
109 throw 1;
110 }
111 catch (...)
112 {
113 }
114 }
115 BEAST_EXPECT(i == 5);
116 {
117 try
118 {
119 scope_fail x{[&i]() { i = 6; }};
120 x.release();
121 throw 1;
122 }
123 catch (...)
124 {
125 }
126 }
127 BEAST_EXPECT(i == 5);
128 }
129
130 void
132 {
133 // scope_success executes the functor on destruction only
134 // if an exception is not unwinding, unless release() is called
135 int i = 0;
136 {
137 scope_success x{[&i]() { i = 1; }};
138 }
139 BEAST_EXPECT(i == 1);
140 {
141 scope_success x{[&i]() { i = 2; }};
142 x.release();
143 }
144 BEAST_EXPECT(i == 1);
145 {
146 scope_success x{[&i]() { i += 2; }};
147 auto x2 = std::move(x);
148 }
149 BEAST_EXPECT(i == 3);
150 {
151 scope_success x{[&i]() { i = 4; }};
152 x.release();
153 auto x2 = std::move(x);
154 }
155 BEAST_EXPECT(i == 3);
156 {
157 try
158 {
159 scope_success x{[&i]() { i = 5; }};
160 throw 1;
161 }
162 catch (...)
163 {
164 }
165 }
166 BEAST_EXPECT(i == 3);
167 {
168 try
169 {
170 scope_success x{[&i]() { i = 6; }};
171 x.release();
172 throw 1;
173 }
174 catch (...)
175 {
176 }
177 }
178 BEAST_EXPECT(i == 3);
179 }
180
181 void
182 run() override
183 {
187 }
188};
189
190BEAST_DEFINE_TESTSUITE(scope, ripple_basics, ripple);
191
192} // namespace test
193} // namespace ripple
A testsuite class.
Definition: suite.h:55
void release() noexcept
Definition: scope.h:83
void release() noexcept
Definition: scope.h:134
void release() noexcept
Definition: scope.h:183
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: algorithm.h:26
void run() override
Runs the suite.
Definition: scope_test.cpp:182