source: mainline/uspace/lib/cpp/include/__bits/test/test.hpp@ 57264ac3

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 57264ac3 was b57a3ee, checked in by Dzejrou <dzejrou@…>, 7 years ago

cpp: refactored the library layout, everything from the impl directory was moved to the bits directory for the sake of consistency, updated copyright notices and include guards

  • Property mode set to 100644
File size: 5.6 KB
Line 
1/*
2 * Copyright (c) 2018 Jaroslav Jindrak
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
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#ifndef LIBCPP_BITS_TEST
30#define LIBCPP_BITS_TEST
31
32#include <utility>
33#include <iterator>
34#include <type_traits>
35
36namespace std::test
37{
38 class test_suite
39 {
40 public:
41 virtual bool run(bool) = 0;
42 virtual const char* name() = 0;
43
44 virtual ~test_suite() = default;
45
46 unsigned int get_failed() const noexcept;
47
48 unsigned int get_succeeded() const noexcept;
49
50 protected:
51 void report(bool, const char*);
52 void start();
53 bool end();
54
55 unsigned int failed_{};
56 unsigned int succeeded_{};
57 bool ok_{true};
58 bool report_{true};
59
60 void test(const char* tname, bool expr)
61 {
62 test_eq(tname, expr, true);
63 }
64
65 template<class... Args>
66 void test_eq(const char* tname, Args&&... args)
67 {
68 if (!assert_eq(std::forward<Args>(args)...))
69 {
70 report(false, tname);
71 ++failed_;
72 ok_ = false;
73 }
74 else
75 {
76 report(true, tname);
77 ++succeeded_;
78 }
79 }
80
81 template<class T, class U>
82 bool assert_eq(const T& lhs, const U& rhs)
83 {
84 return lhs == rhs;
85 }
86
87 template<class Iterator1, class Iterator2>
88 bool assert_eq(Iterator1 first1, Iterator1 last1,
89 Iterator2 first2, Iterator2 last2)
90 {
91 auto len1 = std::distance(first1, last1);
92 auto len2 = std::distance(first2, last2);
93
94 using common_t = std::common_type_t<decltype(len1), decltype(len2)>;
95 auto len1_common = static_cast<common_t>(len1);
96 auto len2_common = static_cast<common_t>(len2);
97
98 if (len1_common != len2_common)
99 return false;
100
101 while (first1 != last1)
102 {
103 if (*first1++ != *first2++)
104 return false;
105 }
106
107 return true;
108 }
109
110 template<class Iterator, class Container>
111 void test_contains(const char* tname, Iterator first,
112 Iterator last, const Container& cont)
113 {
114 if (!assert_contains(first, last, cont))
115 {
116 report(false, tname);
117 ++failed_;
118 ok_ = false;
119 }
120 else
121 {
122 report(true, tname);
123 ++succeeded_;
124 }
125 }
126
127 template<class Iterator1, class Iterator2, class Container>
128 void test_contains_multi(const char* tname, Iterator1 first1,
129 Iterator1 last1, Iterator2 first2,
130 const Container& cont)
131 {
132 if (!assert_contains_multi(first1, last1, first2, cont))
133 {
134 report(false, tname);
135 ++failed_;
136 ok_ = false;
137 }
138 else
139 {
140 report(true, tname);
141 ++succeeded_;
142 }
143 }
144
145 template<class Iterator, class Container>
146 bool assert_contains(Iterator first, Iterator last, const Container& cont)
147 {
148 while (first != last)
149 {
150 if (cont.find(*first++) == cont.end())
151 return false;
152 }
153
154 return true;
155 }
156
157 template<class Iterator1, class Iterator2, class Container>
158 bool assert_contains_multi(Iterator1 first1, Iterator1 last1,
159 Iterator2 first2, const Container& cont)
160 {
161 while (first1 != last1)
162 {
163 if (cont.count(*first1++) != *first2++)
164 return false;
165 }
166
167 return true;
168 }
169 };
170}
171
172#endif
Note: See TracBrowser for help on using the repository browser.