Spans
ReadOnlySpanAssertions<T> is a ref struct that provides zero-allocation assertions for Span<T> and ReadOnlySpan<T>.
Call .Should() on a span to get a ReadOnlySpanAssertions<T>:
Span<int> span = [1, 2, 3];
span.Should().SequenceEqual(1, 2, 3);
ReadOnlySpan<char> chars = "hello".AsSpan();
chars.Should().NotBeEmpty();
Note: Because
ReadOnlySpanAssertions<T>is aref struct, it cannot be stored in a field or captured in a lambda. Create the span and call.Should()within the same stack frame.
Empty
Span<int> empty = [];
empty.Should().BeEmpty();
Span<int> nonEmpty = [1, 2, 3];
nonEmpty.Should().NotBeEmpty();
Sequence Equality
Ordering is strict by default.
Span<int> span = [1, 2, 3];
span.Should().SequenceEqual(1, 2, 3); // passes
span.Should().SequenceEqual(3, 2, 1); // fails — wrong order
span.Should().NotSequenceEqual(4, 5, 6);
With a custom IEqualityComparer<T>:
Span<string> span = ["hello", "world"];
span.Should().SequenceEqual(["HELLO", "WORLD"], StringComparer.OrdinalIgnoreCase);
With a predicate:
span.Should().SequenceEqual(["HELLO", "WORLD"],
(a, b) => string.Equals(a, b, StringComparison.OrdinalIgnoreCase));
See SequenceEqual and NotSequenceEqual.
Comparing Against an Enumerable
Spans can also be compared against an IEnumerable<T>:
Span<int> span = [1, 2, 3];
IEnumerable<int> expected = Enumerable.Range(1, 3);
span.Should().SequenceEqual(expected);
span.Should().SequenceEqual(expected, EqualityComparer<int>.Default);
Chaining
Chainable methods return a ReadOnlySpanAssertionsChain<T>:
Span<int> span = [1, 2, 3];
span.Should().NotBeEmpty().And.SequenceEqual(1, 2, 3);