Skip to content

Commit 996918d

Browse files
committed
add nested-iterator tests
1 parent dafb95e commit 996918d

File tree

4 files changed

+161
-20
lines changed

4 files changed

+161
-20
lines changed

libcxx/test/std/ranges/range.adaptors/range.chunk/range.chunk.iter/compare.pass.cpp

Lines changed: 40 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,30 +10,58 @@
1010

1111
// <ranges>
1212

13-
// friend constexpr bool operator==(const iterator& x, const iterator& y)
14-
// friend constexpr bool operator<(const iterator& x, const iterator& y)
15-
// requires random_access_range<Base>;
16-
// friend constexpr bool operator>(const iterator& x, const iterator& y)
17-
// requires random_access_range<Base>;
18-
// friend constexpr bool operator<=(const iterator& x, const iterator& y)
19-
// requires random_access_range<Base>;
20-
// friend constexpr bool operator>=(const iterator& x, const iterator& y)
21-
// requires random_access_range<Base>;
22-
// friend constexpr auto operator<=>(const iterator& x, const iterator& y)
23-
// requires random_access_range<Base> &&
24-
// three_way_comparable<iterator_t<Base>>;
13+
// V models only input_range
14+
// friend constexpr bool opreator==(const outer_iterator& x, default_sentinel_t);
15+
// friend constexpr difference_type operator-(default_sentinel_t t, const outer_iterator& i)
16+
// requires sized_sentinel_for<sentinel_t<V>, iterator_t<V>>;
17+
// friend constexpr difference_type operator-(const outer_iterator& i, default_sentinel_t t)
18+
// requires sized_sentinel_for<sentinel_t<V>, iterator_t<V>>;
19+
20+
// V models forward_range
21+
// friend constexpr bool operator==(const iterator& x, const iterator& y)
22+
// friend constexpr bool operator<(const iterator& x, const iterator& y)
23+
// requires random_access_range<Base>;
24+
// friend constexpr bool operator>(const iterator& x, const iterator& y)
25+
// requires random_access_range<Base>;
26+
// friend constexpr bool operator<=(const iterator& x, const iterator& y)
27+
// requires random_access_range<Base>;
28+
// friend constexpr bool operator>=(const iterator& x, const iterator& y)
29+
// requires random_access_range<Base>;
30+
// friend constexpr auto operator<=>(const iterator& x, const iterator& y)
31+
// requires random_access_range<Base> &&
32+
// three_way_comparable<iterator_t<Base>>;
2533

2634
#include <algorithm>
2735
#include <cassert>
2836
#include <compare>
37+
#include <iterator>
2938
#include <ranges>
3039
#include <vector>
3140

3241
#include "test_range.h"
42+
#include "../types.h"
3343

3444
constexpr bool test() {
3545
std::vector<int> vector = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
3646
auto chunked = vector | std::views::chunk(3);
47+
auto input_chunked = input_span<int>(vector) | std::views::chunk(3);
48+
49+
// Test `friend constexpr bool opreator==(const outer_iterator& x, default_sentinel_t)`
50+
{
51+
auto it = input_chunked.begin();
52+
std::ranges::advance(it, 4);
53+
assert(it == std::default_sentinel);
54+
}
55+
56+
// Test `friend constexpr difference_type operator-(default_sentinel_t t, const outer_iterator& i)`
57+
{
58+
assert(input_chunked.end() - input_chunked.begin() == 4);
59+
}
60+
61+
// Test `friend constexpr difference_type operator-(const outer_iterator& i, default_sentinel_t)`
62+
{
63+
assert(input_chunked.begin() - input_chunked.end() == -4);
64+
}
3765

3866
// Test `friend constexpr bool operator==(const iterator& x, const iterator& y)`
3967
{
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
//===----------------------------------------------------------------------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
// REQUIRES: std-at-least-c++23
10+
11+
// <ranges>
12+
13+
// V models only input_range:
14+
// constexpr value_type outer_iterator::operator*() const;
15+
// constexpr inner_iterator outer_iterator::value_type::begin() const noexcept;
16+
// constexpr default_sentinel_t outer_iterator::value_type::end() const noexcept;
17+
// constexpr range_reference_v<V> inner_iterator::operator*() const;
18+
19+
// V models forward_range:
20+
// constexpr value_type iterator::operator*() const;
21+
22+
#include <algorithm>
23+
#include <cassert>
24+
#include <compare>
25+
#include <iterator>
26+
#include <ranges>
27+
#include <vector>
28+
29+
#include "test_range.h"
30+
#include "../types.h"
31+
32+
constexpr bool test() {
33+
std::vector<int> vector = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
34+
auto chunked = vector | std::views::chunk(3);
35+
auto input_chunked = input_span<int>(vector) | std::views::chunk(3);
36+
37+
// Test `constexpr value_type outer_iterator::operator*() const`
38+
{
39+
static_assert(std::ranges::input_range<decltype(*input_chunked.begin())>);
40+
}
41+
42+
// Test `constexpr inner_iterator outer_iterator::value_type::begin() const noexcept`
43+
{
44+
auto inner = *input_chunked.begin();
45+
assert(inner.begin().base() == vector.begin());
46+
static_assert(noexcept(inner.begin()));
47+
}
48+
49+
// Test `constexpr default_sentinel_t outer_iterator::value_type::end() const noexcept`
50+
{
51+
auto inner = *input_chunked.begin();
52+
[[maybe_unused]] std::same_as<std::default_sentinel_t> auto it = inner.end();
53+
static_assert(noexcept((inner.end())));
54+
}
55+
56+
// Test `constexpr range_reference_v<V> inner_iterator::operator*() const`
57+
{
58+
std::same_as<int&> decltype(auto) v = *(*chunked.begin()).begin();
59+
assert(v == 1);
60+
}
61+
62+
// Test `constexpr value_type iterator::operator*() const`
63+
{
64+
auto inner = *input_chunked.begin();
65+
assert(inner.begin().base() == vector.begin());
66+
}
67+
68+
return true;
69+
}
70+
71+
int main(int, char**) {
72+
test();
73+
static_assert(test());
74+
75+
return 0;
76+
}

libcxx/test/std/ranges/range.adaptors/range.chunk/range.chunk.iter/increment.pass.cpp

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,58 @@
1010

1111
// <ranges>
1212

13-
// constexpr iterator& operator++();
14-
// constexpr iterator operator++(int);
15-
// constexpr iterator& operator+=(difference_type)
16-
// requires random_access_range<Base>;
13+
// V models only input_range
14+
// constexpr outer_iterator& operator++();
15+
// constexpr void operator++(int);
16+
// constexpr inner_iterator& operator++();
17+
// constexpr void operator++(int);
18+
19+
// V models forward_range
20+
// constexpr iterator& operator++();
21+
// constexpr iterator operator++(int);
22+
// constexpr iterator& operator+=(difference_type)
23+
// requires random_access_range<Base>;
1724

1825
#include <algorithm>
1926
#include <cassert>
2027
#include <ranges>
2128
#include <vector>
2229

2330
#include "test_range.h"
31+
#include "../types.h"
2432

2533
constexpr bool test() {
2634
std::vector<int> vector = {1, 2, 3, 4, 5, 6, 7, 8};
2735
auto chunked = vector | std::views::chunk(2);
36+
auto input_chunked = input_span<int>(vector) | std::views::chunk(2);
37+
38+
// Test `constexpr outer_iterator& operator++();`
39+
{
40+
auto it = input_chunked.begin();
41+
assert(std::ranges::equal(*++it, std::vector{3, 4}));
42+
}
43+
44+
// Test `constexpr void operator++(int);`
45+
{
46+
auto it = input_chunked.begin();
47+
static_assert(std::same_as<decltype(it++), void>);
48+
it++;
49+
assert(std::ranges::equal(*it, std::vector{3, 4}));
50+
}
51+
52+
// Test `constexpr inner_iterator& operator++();`
53+
{
54+
auto it = (*input_chunked.begin()).begin();
55+
assert(*++it == 2);
56+
}
57+
58+
// Test `constexpr inner_iterator& operator++();`
59+
{
60+
auto it = (*input_chunked.begin()).begin();
61+
static_assert(std::same_as<decltype(it++), void>);
62+
it++;
63+
assert(*it == 2);
64+
}
2865

2966
// Test `constexpr iterator& operator++();`
3067
{

libcxx/test/std/ranges/range.adaptors/range.chunk/types.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@ struct input_span : std::span<T> {
2323
constexpr iterator() = default;
2424
constexpr iterator(std::span<T>::iterator i) : std::span<T>::iterator(i) {}
2525
constexpr auto operator*() const { return std::span<T>::iterator::operator*(); }
26-
friend constexpr auto operator+(iterator, auto) = delete;
27-
friend constexpr auto operator+(auto, iterator) = delete;
28-
friend constexpr auto operator-(iterator, auto) = delete;
29-
friend constexpr auto operator-(auto, iterator) = delete;
26+
friend constexpr auto operator+(iterator, std::span<T>::difference_type) = delete;
27+
friend constexpr auto operator+(std::span<T>::difference_type, iterator) = delete;
28+
friend constexpr auto operator-(iterator, std::span<T>::difference_type) = delete;
29+
friend constexpr auto operator-(std::span<T>::difference_type, iterator) = delete;
3030
friend constexpr iterator& operator++(iterator& self) {
3131
++static_cast<std::span<T>::iterator&>(self);
3232
return self;

0 commit comments

Comments
 (0)