Skip to content

Commit

Permalink
Внедрение пакета System.IO.Abstractions (#12)
Browse files Browse the repository at this point in the history
* внедрение абстракций I/O для возможности unit-тестирования

* remove unused

* тесты

* coverage

* new version
  • Loading branch information
Stepami authored Sep 16, 2022
1 parent c133543 commit 1e1f958
Show file tree
Hide file tree
Showing 10 changed files with 131 additions and 20 deletions.
5 changes: 5 additions & 0 deletions Interpreter.Tests/MockExtensions.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using Interpreter.Lib.BackEnd;
using Interpreter.Lib.BackEnd.Instructions;
using Microsoft.Extensions.Options;
using Moq;

namespace Interpreter.Tests
Expand All @@ -13,5 +14,9 @@ public static Mock<Halt> Trackable(this Mock<Halt> halt)
halt.Setup(x => x.End()).Returns(true);
return halt;
}

public static IOptions<CommandLineSettings> ToOptions
(this Mock<CommandLineSettings> commandLineSettings) =>
Options.Create(commandLineSettings.Object);
}
}
11 changes: 5 additions & 6 deletions Interpreter.Tests/Unit/Infrastructure/ExecutorTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
using Interpreter.Services.Executor.Impl;
using Interpreter.Services.Parsing;
using Interpreter.Tests.Stubs;
using Microsoft.Extensions.Options;
using Moq;
using Xunit;

Expand Down Expand Up @@ -38,7 +37,7 @@ public void ExecuteGoesOkTest()
_parsingService.Setup(x => x.Parse(It.IsAny<string>()))
.Returns(ast.Object);

var executor = new Executor(_parsingService.Object, Options.Create(_settings.Object));
var executor = new Executor(_parsingService.Object, _settings.ToOptions());
Assert.Null(Record.Exception(() => executor.Execute()));
}

Expand All @@ -52,7 +51,7 @@ public void SemanticExceptionCaughtTest()
_parsingService.Setup(x => x.Parse(It.IsAny<string>()))
.Returns(ast.Object);

var executor = new Executor(_parsingService.Object, Options.Create(_settings.Object));
var executor = new Executor(_parsingService.Object, _settings.ToOptions());
Assert.Null(Record.Exception(() => executor.Execute()));
}

Expand All @@ -62,7 +61,7 @@ public void LexerExceptionCaughtTest()
_parsingService.Setup(x => x.Parse(It.IsAny<string>()))
.Throws<LexerException>();

var executor = new Executor(_parsingService.Object, Options.Create(_settings.Object));
var executor = new Executor(_parsingService.Object, _settings.ToOptions());
Assert.Null(Record.Exception(() => executor.Execute()));
}

Expand All @@ -72,7 +71,7 @@ public void ParserExceptionCaughtTest()
_parsingService.Setup(x => x.Parse(It.IsAny<string>()))
.Throws<ParserException>();

var executor = new Executor(_parsingService.Object, Options.Create(_settings.Object));
var executor = new Executor(_parsingService.Object, _settings.ToOptions());
Assert.Null(Record.Exception(() => executor.Execute()));
}

Expand All @@ -90,7 +89,7 @@ public void InternalInterpreterErrorCaughtTest()
_parsingService.Setup(x => x.Parse(It.IsAny<string>()))
.Returns(ast.Object);

var executor = new Executor(_parsingService.Object, Options.Create(_settings.Object));
var executor = new Executor(_parsingService.Object, _settings.ToOptions());
Assert.Null(Record.Exception(() => executor.Execute()));
}
}
Expand Down
96 changes: 96 additions & 0 deletions Interpreter.Tests/Unit/Infrastructure/LoggingEntitiesTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
using System.Collections.Generic;
using System.IO.Abstractions;
using System.Linq;
using Interpreter.Lib.BackEnd.Instructions;
using Interpreter.Lib.FrontEnd.GetTokens;
using Interpreter.Lib.FrontEnd.GetTokens.Data;
using Interpreter.Lib.FrontEnd.TopDownParse;
using Interpreter.Lib.IR.Ast;
using Interpreter.Services.Providers.Impl.LexerProvider;
using Interpreter.Services.Providers.Impl.ParserProvider;
using Moq;
using Xunit;

namespace Interpreter.Tests.Unit.Infrastructure
{
public class LoggingEntitiesTests
{
private readonly Mock<IFile> _file;
private readonly Mock<IFileSystem> _fileSystem;

public LoggingEntitiesTests()
{
_file = new Mock<IFile>();

_fileSystem = new Mock<IFileSystem>();
_fileSystem.Setup(x => x.File)
.Returns(_file.Object);
}

[Fact]
public void CorrectFileNameProducedByLexerTest()
{
var lexer = new Mock<ILexer>();
lexer.Setup(x => x.GetTokens(It.IsAny<string>()))
.Returns(new List<Token>());
lexer.Setup(x => x.ToString())
.Returns("lexer");

_file.Setup(x => x.WriteAllText(
It.IsAny<string>(), It.IsAny<string>()
)).Verifiable();

var loggingLexer = new LoggingLexer(lexer.Object, "file", _fileSystem.Object);
loggingLexer.GetTokens("");

_file.Verify(x => x.WriteAllText(
It.Is<string>(p => p == "file.tokens"), It.Is<string>(c => c == "lexer")
), Times.Once());
}

[Fact]
public void CorrectTreeWrittenAndLoggingTreeProducedTest()
{
var ast = new Mock<IAbstractSyntaxTree>();
ast.Setup(x => x.ToString())
.Returns("digraph ast { }");

var parser = new Mock<IParser>();
parser.Setup(x => x.TopDownParse(It.IsAny<string>()))
.Returns(ast.Object);

_file.Setup(x => x.WriteAllText(
It.IsAny<string>(), It.IsAny<string>()
)).Verifiable();

var loggingParser = new LoggingParser(parser.Object, "file", _fileSystem.Object);
var parsed = loggingParser.TopDownParse("");

_file.Verify(x => x.WriteAllText(
It.Is<string>(p => p == "ast.dot"),
It.Is<string>(c => c == "digraph ast { }")
), Times.Once());
Assert.IsType<LoggingAbstractSyntaxTree>(parsed);
}

[Fact]
public void CorrectFileNameProducedByTreeTest()
{
var ast = new Mock<IAbstractSyntaxTree>();
ast.Setup(x => x.GetInstructions())
.Returns(new List<Instruction> { new Halt(0) });

_file.Setup(x => x.WriteAllLines(
It.IsAny<string>(), It.IsAny<IEnumerable<string>>()
)).Verifiable();

var loggingTree = new LoggingAbstractSyntaxTree(ast.Object, "file", _fileSystem.Object);
loggingTree.GetInstructions();

_file.Verify(x => x.WriteAllLines(
It.Is<string>(p => p == "file.tac"),
It.Is<IEnumerable<string>>(c => c.SequenceEqual(new[] { "0: End" }))
), Times.Once());
}
}
}
3 changes: 2 additions & 1 deletion Interpreter/Interpreter.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<Version>1.1.2</Version>
<Version>1.1.3</Version>
</PropertyGroup>

<ItemGroup>
Expand All @@ -15,6 +15,7 @@
<PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="11.0.0" />
<PackageReference Include="CommandLineParser" Version="2.9.1" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.0" />
<PackageReference Include="System.IO.Abstractions" Version="17.2.1" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
using System.IO.Abstractions;
using AutoMapper;
using Interpreter.Lib.FrontEnd.GetTokens;
using Interpreter.Lib.FrontEnd.GetTokens.Data;
Expand All @@ -23,7 +24,7 @@ public ILexer CreateLexer()
var domain = _mapper.Map<StructureModel, Structure>(_settings.StructureModel);
var lexer = new Lexer(domain);
return _settings.Dump
? new LoggingLexer(lexer, _settings.GetInputFileName())
? new LoggingLexer(lexer, _settings.GetInputFileName(), new FileSystem())
: lexer;
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System.Collections.Generic;
using System.IO;
using System.Diagnostics.CodeAnalysis;
using System.IO.Abstractions;
using Interpreter.Lib.FrontEnd.GetTokens;
using Interpreter.Lib.FrontEnd.GetTokens.Data;

Expand All @@ -9,19 +10,22 @@ public class LoggingLexer : ILexer
{
private readonly ILexer _lexer;
private readonly string _fileName;
private readonly IFileSystem _fileSystem;

public LoggingLexer(ILexer lexer, string fileName)
public LoggingLexer(ILexer lexer, string fileName, IFileSystem fileSystem)
{
_lexer = lexer;
_fileName = fileName;
_fileSystem = fileSystem;
}

[ExcludeFromCodeCoverage]
public Structure Structure => _lexer.Structure;

public List<Token> GetTokens(string text)
{
var tokens = _lexer.GetTokens(text);
File.WriteAllText(
_fileSystem.File.WriteAllText(
$"{_fileName}.tokens",
_lexer.ToString()
);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
using System.Collections.Generic;
using System.IO;
using System.IO.Abstractions;
using System.Linq;
using Interpreter.Lib.BackEnd.Instructions;
using Interpreter.Lib.IR.Ast;
Expand All @@ -10,17 +10,19 @@ public class LoggingAbstractSyntaxTree : IAbstractSyntaxTree
{
private readonly IAbstractSyntaxTree _ast;
private readonly string _fileName;
private readonly IFileSystem _fileSystem;

public LoggingAbstractSyntaxTree(IAbstractSyntaxTree ast, string fileName)
public LoggingAbstractSyntaxTree(IAbstractSyntaxTree ast, string fileName, IFileSystem fileSystem)
{
_ast = ast;
_fileName = fileName;
_fileSystem = fileSystem;
}

public List<Instruction> GetInstructions()
{
var instructions = _ast.GetInstructions();
File.WriteAllLines(
_fileSystem.File.WriteAllLines(
$"{_fileName}.tac",
instructions.OrderBy(i => i).Select(i => i.ToString())
);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using System.IO;
using System.IO.Abstractions;
using Interpreter.Lib.FrontEnd.TopDownParse;
using Interpreter.Lib.IR.Ast;

Expand All @@ -8,19 +8,21 @@ public class LoggingParser : IParser
{
private readonly IParser _parser;
private readonly string _fileName;
private readonly IFileSystem _fileSystem;

public LoggingParser(IParser parser, string fileName)
public LoggingParser(IParser parser, string fileName, IFileSystem fileSystem)
{
_parser = parser;
_fileName = fileName;
_fileSystem = fileSystem;
}

public IAbstractSyntaxTree TopDownParse(string text)
{
var ast = _parser.TopDownParse(text);
var astDot = ast.ToString();
File.WriteAllText("ast.dot", astDot);
return new LoggingAbstractSyntaxTree(ast, _fileName);
_fileSystem.File.WriteAllText("ast.dot", astDot);
return new LoggingAbstractSyntaxTree(ast, _fileName, _fileSystem);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
using System.IO.Abstractions;
using Interpreter.Lib.FrontEnd.TopDownParse;
using Parser = Interpreter.Lib.FrontEnd.TopDownParse.Impl.Parser;
using Microsoft.Extensions.Options;
Expand All @@ -20,7 +21,7 @@ public IParser CreateParser()
var lexer = _lexerProvider.CreateLexer();
var parser = new Parser(lexer);
return _settings.Dump
? new LoggingParser(parser, _settings.GetInputFileName())
? new LoggingParser(parser, _settings.GetInputFileName(), new FileSystem())
: parser;
}
}
Expand Down
2 changes: 1 addition & 1 deletion Readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,7 @@ let s = v2d as string
### Запуск

```
Interpreter 1.1.2
Interpreter 1.1.3
Copyright (C) 2022 Interpreter
USAGE:
Simple interpretation call:
Expand Down

0 comments on commit 1e1f958

Please sign in to comment.