Skip to content

Commit bb16e50

Browse files
authored
Merge pull request #74970 from swiftlang/susmonteiro/cxx-span-class-tests
[cxx-interop] Add tests for std::span inside struct
2 parents 9580b21 + f75a2f5 commit bb16e50

File tree

2 files changed

+79
-0
lines changed

2 files changed

+79
-0
lines changed

test/Interop/Cxx/stdlib/Inputs/std-span.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,16 @@ static std::string sarray[]{"", "ab", "abc"};
1313
static Span ispan = {iarray};
1414
static SpanOfString sspan = {sarray};
1515

16+
struct SpanBox {
17+
std::span<const int> ispan;
18+
std::span<const std::string> sspan;
19+
};
20+
1621
inline Span initSpan() {
1722
const int a[]{1, 2, 3};
1823
return Span(a);
1924
}
2025

26+
inline struct SpanBox getStructSpanBox() { return {iarray, sarray}; }
27+
2128
#endif // TEST_INTEROP_CXX_STDLIB_INPUTS_STD_SPAN_H

test/Interop/Cxx/stdlib/use-std-span.swift

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,4 +270,76 @@ StdSpanTestSuite.test("Initialize Array from SpanOfString") {
270270
expectEqual(arr, newArr)
271271
}
272272

273+
StdSpanTestSuite.test("Span inside C++ struct") {
274+
let spb = getStructSpanBox()
275+
expectEqual(spb.ispan.size(), 3)
276+
expectFalse(spb.ispan.empty())
277+
expectEqual(spb.sspan.size(), 3)
278+
expectFalse(spb.sspan.empty())
279+
280+
var icount: Int32 = 1
281+
for e in spb.ispan {
282+
expectEqual(e, icount)
283+
icount += 1
284+
}
285+
286+
var scount = 0
287+
for e in spb.sspan {
288+
scount += e.length();
289+
}
290+
291+
let imapResult = spb.ispan.map { $0 + 5 }
292+
expectEqual(imapResult, [6, 7, 8])
293+
294+
let smapResult = spb.sspan.map { $0.length() }
295+
expectEqual(smapResult, [0, 2, 3])
296+
297+
let ifilterResult = spb.ispan.filter { $0 > 2 }
298+
expectEqual(ifilterResult.count, 1)
299+
expectEqual(ifilterResult, [3])
300+
301+
let sfilterResult = spb.sspan.filter { $0.length() > 1}
302+
expectEqual(sfilterResult.count, 2)
303+
expectEqual(sfilterResult, ["ab", "abc"])
304+
}
305+
306+
StdSpanTestSuite.test("Span inside Swift struct") {
307+
struct SpanBox {
308+
var ispan: Span
309+
var sspan: SpanOfString
310+
}
311+
312+
let spb = SpanBox(ispan: ispan, sspan: sspan)
313+
expectEqual(spb.ispan.size(), 3)
314+
expectFalse(spb.ispan.empty())
315+
expectEqual(spb.sspan.size(), 3)
316+
expectFalse(spb.sspan.empty())
317+
318+
var icount: Int32 = 1
319+
for e in spb.ispan {
320+
expectEqual(e, icount)
321+
icount += 1
322+
}
323+
324+
var scount = 0
325+
for e in spb.sspan {
326+
scount += e.length();
327+
}
328+
329+
let imapResult = spb.ispan.map { $0 + 5 }
330+
expectEqual(imapResult, [6, 7, 8])
331+
332+
let smapResult = spb.sspan.map { $0.length() }
333+
expectEqual(smapResult, [0, 2, 3])
334+
335+
let ifilterResult = spb.ispan.filter { $0 > 2 }
336+
expectEqual(ifilterResult.count, 1)
337+
expectEqual(ifilterResult, [3])
338+
339+
let sfilterResult = spb.sspan.filter { $0.length() > 1}
340+
expectEqual(sfilterResult.count, 2)
341+
expectEqual(sfilterResult, ["ab", "abc"])
342+
}
343+
344+
273345
runAllTests()

0 commit comments

Comments
 (0)