Skip to content

Commit d2b6561

Browse files
committed
#53 - Автоматизированный тест
1 parent 26badaa commit d2b6561

File tree

4 files changed

+62
-3
lines changed

4 files changed

+62
-3
lines changed

tests/Directory.Packages.props

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
<Project>
22
<ItemGroup>
33
<PackageVersion Include="AutoFixture" Version="4.18.1" />
4+
<PackageVersion Include="AutoFixture.AutoNSubstitute" Version="4.18.1" />
5+
<PackageVersion Include="AutoFixture.Xunit2" Version="4.18.1" />
46
<PackageVersion Include="coverlet.collector" Version="6.0.4">
57
<PrivateAssets>all</PrivateAssets>
68
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
@@ -9,12 +11,14 @@
911
<PrivateAssets>all</PrivateAssets>
1012
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
1113
</PackageVersion>
14+
<PackageVersion Include="Fare" Version="2.2.1" />
1215
<PackageVersion Include="FluentAssertions" Version="7.1.0" />
1316
<PackageVersion Include="MartinCostello.Logging.XUnit" Version="0.5.1" />
1417
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.13.0" />
1518
<PackageVersion Include="Microsoft.Extensions.Diagnostics.Testing" Version="9.2.0" />
1619
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.13.0" />
1720
<PackageVersion Include="NSubstitute" Version="5.3.0" />
21+
<PackageVersion Include="PolymorphicContracts.AutoFixture" Version="2.0.0" />
1822
<PackageVersion Include="xunit" Version="2.9.3" />
1923
<PackageVersion Include="Xunit.DependencyInjection" Version="9.9.0" />
2024
<PackageVersion Include="xunit.runner.visualstudio" Version="3.0.2">

tests/HydraScript.UnitTests/Domain/FrontEnd/RegexLexerTests.cs

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
using System.ComponentModel.DataAnnotations;
2+
using System.Text.RegularExpressions;
3+
using AutoFixture.Xunit2;
14
using HydraScript.Domain.FrontEnd.Lexer;
25
using HydraScript.Domain.FrontEnd.Lexer.Impl;
36
using HydraScript.Domain.FrontEnd.Lexer.TokenTypes;
@@ -13,7 +16,7 @@ public class RegexLexerTests
1316

1417
[Theory]
1518
[ClassData(typeof(LexerSuccessData))]
16-
public void LexerDoesNotThrowTest(string text) =>
19+
public void LexerDoesNotThrowTest(string text) =>
1720
Assert.Null(Record.Exception(() => _regexLexer.GetTokens(text)));
1821

1922
[Theory]
@@ -31,13 +34,13 @@ public void LexerToStringCorrectTest()
3134
}
3235

3336
[Fact]
34-
public void EmptyTextTest() =>
37+
public void EmptyTextTest() =>
3538
Assert.NotEmpty(_regexLexer.GetTokens(""));
3639

3740
[Fact]
3841
public void GetTokensSkipIgnorableTypesTest()
3942
{
40-
const string text = @"let x = 1 // int";
43+
const string text = "let x = 1 // int";
4144
var tokens = _regexLexer.GetTokens(text);
4245
Assert.DoesNotContain(_regexLexer.Structure.FindByTag("Comment"), tokens.Select(x => x.Type));
4346
}
@@ -49,4 +52,32 @@ public void GetTokens_KeywordInsideIdent_Ident(string input)
4952
var token = tokens.First();
5053
token.Type.Should().Be(new TokenType("Ident"));
5154
}
55+
56+
[Theory, AutoData]
57+
public void GetTokens_MockedRegex_ValidOutput([MinLength(10), MaxLength(25)] TokenInput[] tokenInputs)
58+
{
59+
var patterns = TokenInput.Pattern.Split('|');
60+
61+
var structure = Substitute.For<IStructure>();
62+
var lexer = new RegexLexer(structure, new TextCoordinateSystemComputer());
63+
structure.Regex.ReturnsForAnyArgs(
64+
new Regex(string.Join('|', patterns.Select((x, i) => $"(?<TYPE{i}>{x})"))));
65+
var tokenTypes = Enumerable.Range(0, patterns.Length)
66+
.Select(x => new TokenType($"TYPE{x}"))
67+
.ToList();
68+
69+
// ReSharper disable once GenericEnumeratorNotDisposed
70+
structure.GetEnumerator()
71+
.ReturnsForAnyArgs(_ => tokenTypes.GetEnumerator());
72+
73+
var tokens = lexer.GetTokens(
74+
tokenInputs.Aggregate(
75+
TokenInput.AdditiveIdentity,
76+
(x, y) => x + y).Value);
77+
for (var i = 0; i < tokenInputs.Length; i++)
78+
{
79+
tokens[i].Value.Should().BeEquivalentTo(tokenInputs[i].Value);
80+
tokens[i].Type.Should().BeOneOf(tokenTypes);
81+
}
82+
}
5283
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using System.ComponentModel.DataAnnotations;
2+
using System.Diagnostics.CodeAnalysis;
3+
using System.Numerics;
4+
5+
namespace HydraScript.UnitTests.Domain.FrontEnd;
6+
7+
public record TokenInput(
8+
[property: RegularExpression(TokenInput.Pattern)]
9+
string Value) :
10+
IAdditiveIdentity<TokenInput, TokenInput>,
11+
IAdditionOperators<TokenInput, TokenInput, TokenInput>
12+
{
13+
[StringSyntax(StringSyntaxAttribute.Regex)]
14+
public const string Pattern = "[a-zA-Z]+|[0-9]+|[+]{2}";
15+
16+
public static TokenInput operator +(TokenInput left, TokenInput right) =>
17+
new(left.Value + " " + right.Value);
18+
19+
public static TokenInput AdditiveIdentity { get; } = new(string.Empty);
20+
}

tests/HydraScript.UnitTests/HydraScript.UnitTests.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<ItemGroup>
4+
<PackageReference Include="AutoFixture.AutoNSubstitute" />
5+
<PackageReference Include="AutoFixture.Xunit2" />
6+
<PackageReference Include="Fare" />
47
<PackageReference Include="FluentAssertions" />
8+
<PackageReference Include="PolymorphicContracts.AutoFixture" />
59
</ItemGroup>
610

711
<ItemGroup>

0 commit comments

Comments
 (0)