<commit_before>﻿using System;
using System.Linq;
using ChainingAssertion;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Parsec;
using static Parsec.Parser;
using static Parsec.Text;

namespace ParsecSharpTest
{
    [TestClass]
    public class ParserTest
    {
        const string _abcdEFGH = "abcdEFGH";

        const string _123456 = "123456";

        [TestMethod]
        public void AnyTest()
        {
            // 全ての値にマッチするパーサを作成します。
            // このパーサは入力が終端の場合にのみ失敗します。

            var parser = Any();

            var source = _abcdEFGH;
            parser.Parse(source).CaseOf(
                fail => Assert.Fail(fail.ToString()),
                success => success.Value.Is('a'));
        }

        [TestMethod]
        public void EndOfInputTest()
        {
            // 入力の終端にマッチするパーサを作成します。

            var parser = EndOfInput();

            var source = string.Empty;
            parser.Parse(source).CaseOf(
                fail => Assert.Fail(fail.ToString()),
                success => success.Value.Is(Unit.Instance));
        }

        [TestMethod]
        public void OneOfTest()
        {
            // 指定したシーケンスに値が含まれている場合に成功するパーサを作成します。

            var parser = OneOf("6789abcde");

            var source = _abcdEFGH;
            parser.Parse(source).CaseOf(
                fail => Assert.Fail(fail.ToString()),
                success => success.Value.Is('a'));

            var source2 = _123456;
            parser.Parse(source2).CaseOf(
                fail => { },
                success => Assert.Fail(success.ToString()));

            // IEnumerable<char>を取るオーバーロード。
            var parser2 = OneOf("6789abcde".AsEnumerable());
            parser2.Parse(source).CaseOf(
                fail => Assert.Fail(fail.ToString()),
                success => success.Value.Is('a'));

            parser2.Parse(source2).CaseOf(
                fail => { },
                success => Assert.Fail(success.ToString()));
        }

        [TestMethod]
        public void NoneOfTest()
        {
            // 指定したシーケンスに値が含まれていない場合に成功するパーサを作成します。

            var parser = NoneOf("dcba987");

            var source = _abcdEFGH;
            parser.Parse(source).CaseOf(
                fail => fail.ToString().Is("Parser Fail (Line: 1, Column: 1): Unexpected \"a\""),
                success => Assert.Fail(success.ToString()));

            var source2 = _123456;
            parser.Parse(source2).CaseOf(
                fail => Assert.Fail(fail.ToString()),
                success => success.Value.Is('1'));
        }

        [TestMethod]
        public void SkipTest()
        {
            // 数を指定してスキップするパーサを作成します。

            var parser = Skip(3).Right(Any());

            var source = _abcdEFGH;
            parser.Parse(source).CaseOf(
                fail => Assert.Fail(fail.ToString()),
                success => success.Value.Is('d'));

            var parser2 = Skip(8).Right(EndOfInput());
            parser2.Parse(source).CaseOf(
                fail => Assert.Fail(fail.ToString()),
                success => { });

            var parser3 = Skip(9);
            parser3.Parse(source).CaseOf(
                fail => { },
                success => Assert.Fail(success.Value.ToString()));
        }

        [TestMethod]
        public void PureTest()
        {
            // 成功したという結果を返すパーサを作成します。<commit_msg>add one comment<commit_after>﻿using System;
using System.Linq;
using ChainingAssertion;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Parsec;
using static Parsec.Parser;
using static Parsec.Text;

namespace ParsecSharpTest
{
    [TestClass]
    public class ParserTest
    {
        const string _abcdEFGH = "abcdEFGH";

        const string _123456 = "123456";

        [TestMethod]
        public void AnyTest()
        {
            // 全ての値にマッチするパーサを作成します。
            // このパーサは入力が終端の場合にのみ失敗します。

            var parser = Any();

            var source = _abcdEFGH;
            parser.Parse(source).CaseOf(
                fail => Assert.Fail(fail.ToString()),
                success => success.Value.Is('a'));
        }

        [TestMethod]
        public void EndOfInputTest()
        {
            // 入力の終端にマッチするパーサを作成します。

            var parser = EndOfInput();

            var source = string.Empty;
            parser.Parse(source).CaseOf(
                fail => Assert.Fail(fail.ToString()),
                success => success.Value.Is(Unit.Instance));
        }

        [TestMethod]
        public void OneOfTest()
        {
            // 指定したシーケンスに値が含まれている場合に成功するパーサを作成します。

            var parser = OneOf("6789abcde");

            var source = _abcdEFGH;
            parser.Parse(source).CaseOf(
                fail => Assert.Fail(fail.ToString()),
                success => success.Value.Is('a'));

            var source2 = _123456;
            parser.Parse(source2).CaseOf(
                fail => { },
                success => Assert.Fail(success.ToString()));

            // IEnumerable<char>を取るオーバーロード。
            var parser2 = OneOf("6789abcde".AsEnumerable());
            parser2.Parse(source).CaseOf(
                fail => Assert.Fail(fail.ToString()),
                success => success.Value.Is('a'));

            parser2.Parse(source2).CaseOf(
                fail => { },
                success => Assert.Fail(success.ToString()));
        }

        [TestMethod]
        public void NoneOfTest()
        {
            // 指定したシーケンスに値が含まれていない場合に成功するパーサを作成します。

            var parser = NoneOf("dcba987");

            var source = _abcdEFGH;
            parser.Parse(source).CaseOf(
                fail => fail.ToString().Is("Parser Fail (Line: 1, Column: 1): Unexpected \"a\""),
                success => Assert.Fail(success.ToString()));

            var source2 = _123456;
            parser.Parse(source2).CaseOf(
                fail => Assert.Fail(fail.ToString()),
                success => success.Value.Is('1'));
        }

        [TestMethod]
        public void SkipTest()
        {
            // 数を指定してスキップするパーサを作成します。

            var parser = Skip(3).Right(Any());

            var source = _abcdEFGH;
            parser.Parse(source).CaseOf(
                fail => Assert.Fail(fail.ToString()),
                success => success.Value.Is('d'));

            var parser2 = Skip(8).Right(EndOfInput());
            parser2.Parse(source).CaseOf(
                fail => Assert.Fail(fail.ToString()),
                success => { });

            // 指定数スキップできない場合は失敗します。
            var parser3 = Skip(9);
            parser3.Parse(source).CaseOf(
                fail => { },
                success => Assert.Fail(success.ToString()));
        }

        [TestMethod]
        public void PureTest()
        {
            // 成功したという結果を返すパーサを作成します。
{'fraction_non_alphanumeric': 0.12246696035242291, 'fraction_numerical': 0.015565345080763583, 'mean_word_length': 1.570188679245283, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 49, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '2986438', 'n_tokens_mistral': 2203, 'n_tokens_neox': 2010, 'n_words': 332}