Skip to content

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 a ref 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);