• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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