1 /*
2 * Copyright 2022 Google LLC
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8 #include "include/core/SkSpan.h"
9 #include "tests/Test.h"
10
11 #include <array>
12 #include <cstddef>
13 #include <cstdint>
14 #include <vector>
15
DEF_TEST(SkSpanBasicTemplateGuide,reporter)16 DEF_TEST(SkSpanBasicTemplateGuide, reporter) {
17 // Test constness preservation for SkSpan.
18 {
19 std::vector<int> v = {{1, 2, 3, 4, 5}};
20 auto s = SkSpan(v);
21 REPORTER_ASSERT(reporter, s[3] == 4);
22 s[3] = 100;
23 REPORTER_ASSERT(reporter, s[3] == 100);
24 }
25
26 {
27 std::vector<int> t = {{1, 2, 3, 4, 5}};
28 const std::vector<int>& v = t;
29 auto s = SkSpan(v);
30 //s[3] = 100; // Should fail to compile
31 REPORTER_ASSERT(reporter, s[3] == 4);
32 REPORTER_ASSERT(reporter, t[3] == 4);
33 t[3] = 100;
34 REPORTER_ASSERT(reporter, s[3] == 100);
35 }
36
37 {
38 std::array<int, 5> v = {{1, 2, 3, 4, 5}};
39 auto s = SkSpan(v); // {1, 2, 3, 4, 5}
40 REPORTER_ASSERT(reporter, s[3] == 4);
41 s[3] = 100; // {1, 2, 3, 100, 5}
42 REPORTER_ASSERT(reporter, s[3] == 100);
43 auto s1 = s.subspan(1,3); // {2, 3, 100}
44 REPORTER_ASSERT(reporter, s1.size() == 3);
45 REPORTER_ASSERT(reporter, s1.front() == 2);
46 REPORTER_ASSERT(reporter, s1.back() == 100);
47 auto s2 = s.subspan(2); // {3, 100, 5}
48 REPORTER_ASSERT(reporter, s2.size() == 3);
49 REPORTER_ASSERT(reporter, s2.front() == 3);
50 REPORTER_ASSERT(reporter, s2.back() == 5);
51 }
52
53 {
54 std::array<int, 5> t = {{1, 2, 3, 4, 5}};
55 const std::array<int, 5>& v = t;
56 auto s = SkSpan(v);
57 //s[3] = 100; // Should fail to compile
58 REPORTER_ASSERT(reporter, s[3] == 4);
59 REPORTER_ASSERT(reporter, t[3] == 4);
60 t[3] = 100;
61 REPORTER_ASSERT(reporter, s[3] == 100);
62 }
63
64 {
65 std::vector<int> v;
66 auto s = SkSpan(v);
67 REPORTER_ASSERT(reporter, s.empty());
68 }
69
70 auto routine = [&](SkSpan<const int> a) {
71 REPORTER_ASSERT(reporter, a.size() == 4);
72 };
73 routine({1,2,3,4});
74 }
75
test_span_parameter(SkSpan<const int> s)76 static bool test_span_parameter(SkSpan<const int> s) {
77 return s[0] == 1 && s[1] == 2 && s[2] == 3;
78 }
79
DEF_TEST(SkSpanDeduceParam,reporter)80 DEF_TEST(SkSpanDeduceParam, reporter) {
81 {
82 std::vector<int> v = {{1, 2, 3}};
83 REPORTER_ASSERT(reporter, test_span_parameter(v));
84 }
85
86 {
87 int v[]{1, 2, 3};
88 REPORTER_ASSERT(reporter, test_span_parameter(v));
89 }
90
91 {
92 test_span_parameter({1, 2, 3});
93 REPORTER_ASSERT(reporter, test_span_parameter({1, 2, 3}));
94 }
95
96 {
97 int v[]{1, 2, 3};
98 auto s = SkSpan(v);
99 REPORTER_ASSERT(reporter, test_span_parameter(s));
100 }
101 }
102
DEF_TEST(SkSpanDeduceSize,reporter)103 DEF_TEST(SkSpanDeduceSize, reporter) {
104 int d[] = {1, 2, 3, 4, 5};
105 {
106 int s = std::size(d);
107 SkSpan span = SkSpan{d, s};
108 REPORTER_ASSERT(reporter, span.size() == std::size(d));
109 }
110 {
111 uint32_t s = std::size(d);
112 SkSpan span = SkSpan{d, s};
113 REPORTER_ASSERT(reporter, span.size() == std::size(d));
114 }
115 {
116 size_t s = std::size(d);
117 SkSpan span = SkSpan{d, s};
118 REPORTER_ASSERT(reporter, span.size() == std::size(d));
119 }
120 {
121 struct C {
122 int* data() { return nullptr; }
123 int size() const { return 0; }
124 };
125
126 C c;
127 SkSpan span = SkSpan(c);
128 REPORTER_ASSERT(reporter, span.size() == 0);
129 }
130 }
131