blob: 388d17d9a95b6c9632290a2e51c69a11ff1769ac [file] [log] [blame]
Brian Silvermana6f7ce02018-07-07 15:04:00 -07001///////////////////////////////////////////////////////////////////////////////
2//
3// Copyright (c) 2015 Microsoft Corporation. All rights reserved.
4//
5// This code is licensed under the MIT License (MIT).
6//
7// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
8// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
9// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
10// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
11// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
12// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
13// THE SOFTWARE.
14//
15///////////////////////////////////////////////////////////////////////////////
16
17#include <catch/catch.hpp> // for AssertionHandler, StringRef, CHECK, CHE...
18
19#include <gsl/gsl_algorithm> // for copy
20#include <gsl/span> // for span
21
22#include <array> // for array
23#include <cstddef> // for size_t
24
25namespace gsl {
26struct fail_fast;
27} // namespace gsl
28
29using namespace std;
30using namespace gsl;
31
32TEST_CASE("same_type")
33{
34 // dynamic source and destination span
35 {
36 std::array<int, 5> src{1, 2, 3, 4, 5};
37 std::array<int, 10> dst{};
38
39 span<int> src_span(src);
40 span<int> dst_span(dst);
41
42 copy(src_span, dst_span);
43 copy(src_span, dst_span.subspan(src_span.size()));
44
45 for (std::size_t i = 0; i < src.size(); ++i) {
46 CHECK(dst[i] == src[i]);
47 CHECK(dst[i + src.size()] == src[i]);
48 }
49 }
50
51 // static source and dynamic destination span
52 {
53 std::array<int, 5> src{1, 2, 3, 4, 5};
54 std::array<int, 10> dst{};
55
56 span<int, 5> src_span(src);
57 span<int> dst_span(dst);
58
59 copy(src_span, dst_span);
60 copy(src_span, dst_span.subspan(src_span.size()));
61
62 for (std::size_t i = 0; i < src.size(); ++i) {
63 CHECK(dst[i] == src[i]);
64 CHECK(dst[i + src.size()] == src[i]);
65 }
66 }
67
68 // dynamic source and static destination span
69 {
70 std::array<int, 5> src{1, 2, 3, 4, 5};
71 std::array<int, 10> dst{};
72
73 span<int> src_span(src);
74 span<int, 10> dst_span(dst);
75
76 copy(src_span, dst_span);
77 copy(src_span, dst_span.subspan(src_span.size()));
78
79 for (std::size_t i = 0; i < src.size(); ++i) {
80 CHECK(dst[i] == src[i]);
81 CHECK(dst[i + src.size()] == src[i]);
82 }
83 }
84
85 // static source and destination span
86 {
87 std::array<int, 5> src{1, 2, 3, 4, 5};
88 std::array<int, 10> dst{};
89
90 span<int, 5> src_span(src);
91 span<int, 10> dst_span(dst);
92
93 copy(src_span, dst_span);
94 copy(src_span, dst_span.subspan(src_span.size()));
95
96 for (std::size_t i = 0; i < src.size(); ++i) {
97 CHECK(dst[i] == src[i]);
98 CHECK(dst[i + src.size()] == src[i]);
99 }
100 }
101}
102
103TEST_CASE("compatible_type")
104{
105 // dynamic source and destination span
106 {
107 std::array<short, 5> src{1, 2, 3, 4, 5};
108 std::array<int, 10> dst{};
109
110 span<short> src_span(src);
111 span<int> dst_span(dst);
112
113 copy(src_span, dst_span);
114 copy(src_span, dst_span.subspan(src_span.size()));
115
116 for (std::size_t i = 0; i < src.size(); ++i) {
117 CHECK(dst[i] == src[i]);
118 CHECK(dst[i + src.size()] == src[i]);
119 }
120 }
121
122 // static source and dynamic destination span
123 {
124 std::array<short, 5> src{1, 2, 3, 4, 5};
125 std::array<int, 10> dst{};
126
127 span<short, 5> src_span(src);
128 span<int> dst_span(dst);
129
130 copy(src_span, dst_span);
131 copy(src_span, dst_span.subspan(src_span.size()));
132
133 for (std::size_t i = 0; i < src.size(); ++i) {
134 CHECK(dst[i] == src[i]);
135 CHECK(dst[i + src.size()] == src[i]);
136 }
137 }
138
139 // dynamic source and static destination span
140 {
141 std::array<short, 5> src{1, 2, 3, 4, 5};
142 std::array<int, 10> dst{};
143
144 span<short> src_span(src);
145 span<int, 10> dst_span(dst);
146
147 copy(src_span, dst_span);
148 copy(src_span, dst_span.subspan(src_span.size()));
149
150 for (std::size_t i = 0; i < src.size(); ++i) {
151 CHECK(dst[i] == src[i]);
152 CHECK(dst[i + src.size()] == src[i]);
153 }
154 }
155
156 // static source and destination span
157 {
158 std::array<short, 5> src{1, 2, 3, 4, 5};
159 std::array<int, 10> dst{};
160
161 span<short, 5> src_span(src);
162 span<int, 10> dst_span(dst);
163
164 copy(src_span, dst_span);
165 copy(src_span, dst_span.subspan(src_span.size()));
166
167 for (std::size_t i = 0; i < src.size(); ++i) {
168 CHECK(dst[i] == src[i]);
169 CHECK(dst[i + src.size()] == src[i]);
170 }
171 }
172}
173
174#ifdef CONFIRM_COMPILATION_ERRORS
175TEST_CASE("incompatible_type")
176{
177 std::array<int, 4> src{1, 2, 3, 4};
178 std::array<int*, 12> dst{};
179
180 span<int> src_span_dyn(src);
181 span<int, 4> src_span_static(src);
182 span<int*> dst_span_dyn(dst);
183 span<int*, 4> dst_span_static(dst);
184
185 // every line should produce a compilation error
186 copy(src_span_dyn, dst_span_dyn);
187 copy(src_span_dyn, dst_span_static);
188 copy(src_span_static, dst_span_dyn);
189 copy(src_span_static, dst_span_static);
190}
191#endif
192
193TEST_CASE("small_destination_span")
194{
195 std::array<int, 12> src{1, 2, 3, 4};
196 std::array<int, 4> dst{};
197
198 span<int> src_span_dyn(src);
199 span<int, 12> src_span_static(src);
200 span<int> dst_span_dyn(dst);
201 span<int, 4> dst_span_static(dst);
202
203 CHECK_THROWS_AS(copy(src_span_dyn, dst_span_dyn), fail_fast);
204 CHECK_THROWS_AS(copy(src_span_dyn, dst_span_static), fail_fast);
205 CHECK_THROWS_AS(copy(src_span_static, dst_span_dyn), fail_fast);
206
207#ifdef CONFIRM_COMPILATION_ERRORS
208 copy(src_span_static, dst_span_static);
209#endif
210}