private static PatternNode ParseAndValidate(string pattern)
        {
            var parser     = new PatternParser();
            var errorsSink = new PatternCompilerErrorsSink();

            parser.TryParse(pattern, errorsSink, out var parsedPattern).Should().BeTrue();
            errorsSink.Errors.Should().HaveCount(0);
            errorsSink.HasErrors.Should().BeFalse();
            parsedPattern.Should().NotBeNull();
            return(parsedPattern !);
        }
        private void Validate(string pattern)
        {
            var parser     = new PatternParser();
            var errorsSink = new PatternCompilerErrorsSink();

            parser.TryParse(pattern, errorsSink, out var parsedPattern).Should().BeTrue();
            parsedPattern.Should().NotBeNull();
            errorsSink.HasErrors.Should().BeFalse();

            validator.Validate(parsedPattern !, errorsSink).Should().BeTrue();
            errorsSink.HasErrors.Should().BeFalse();
        }
        private void Validate(string pattern, string errorContainsText)
        {
            var parser     = new PatternParser();
            var errorsSink = new PatternCompilerErrorsSink();

            parser.TryParse(pattern, errorsSink, out var parsedPattern).Should().BeTrue();
            parsedPattern.Should().NotBeNull();
            errorsSink.HasErrors.Should().BeFalse();

            validator.Validate(parsedPattern !, errorsSink).Should().BeFalse();
            errorsSink.HasErrors.Should().BeTrue();
            errorsSink.Errors.Any(e => e.Message.ContainsOrdinalIgnoreCase(errorContainsText)).Should().BeTrue();
        }
        private static void ParseAndValidate(
            string pattern,
            int count,
            string messageContains,
            int?location = null)
        {
            var parser     = new PatternParser();
            var errorsSink = new PatternCompilerErrorsSink();

            parser.TryParse(pattern, errorsSink, out var parsedPattern).Should().BeFalse();

            parsedPattern.Should().BeNull();
            errorsSink.HasErrors.Should().BeTrue();
            errorsSink.Errors.Should().HaveCount(count);
            var error = errorsSink.Errors[0];

            error.Location.Should().Be(location);
            error.Message.Should().Contain(messageContains);
        }