-
Notifications
You must be signed in to change notification settings - Fork 0
/
AcceptanceTestsBase.cs
138 lines (123 loc) · 4.92 KB
/
AcceptanceTestsBase.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
using System.Collections.Generic;
using System.IO;
using System.Linq;
using musicsheetvideo;
using musicsheetvideo.Command.FfprobeVideoLengthCommand;
using musicsheetvideo.Configuration;
using musicsheetvideo.Configuration.FromAudio;
using musicsheetvideo.PdfConverter;
using musicsheetvideo.Timestamp;
using musicsheetvideo.VideoProducer;
using NUnit.Framework;
using test.Stubs;
namespace test.AcceptanceTests;
[TestFixture]
[Category("integration")]
[Category("acceptance")]
public abstract class AcceptanceTestsBase
{
private Frame _lastFrame;
protected const string BasePath = "/home/fernando/Documents/github/musicsheetvideo/test/AcceptanceTests/";
protected readonly string DefaultImagePath;
protected readonly IProgressNotification Logger;
protected IMusicSheetVideoConfiguration Configuration;
protected AcceptanceTestsBase()
{
DefaultImagePath = Path.Combine(BasePath, "Data/default-image.jpg");
Logger = new NunitProgressNotification();
var zeroTick = new Tick(0, 0, 0);
_lastFrame = new Frame(new Interval(zeroTick, zeroTick), -1);
Configuration = FromAudioConfigurationBuilder.OneConfiguration().Build();
}
protected void StartTest(
IMusicSheetVideoConfiguration configuration,
IPdfConverter pdfConverter,
IFrameProcessor frameProcessor,
IVideoMaker videoMaker,
List<Frame> frames
)
{
Logger.NotifyProgress($"Running test case \"{GetType().Name}\"");
frames.Sort();
_lastFrame = frames.Last();
Configuration = configuration;
DeleteGeneratedFiles();
var app = new MusicSheetVideo(pdfConverter, frameProcessor, videoMaker, new NullProgressNotification());
app.MakeVideo(frames, Configuration);
AssertImagesWereCreatedCorrectly();
AssertFfmpegInputFileWasCreatedCorrectly();
AssertSlideshowWasCorrectlyProduced();
Logger.NotifyProgress("Done!\n");
}
private void DeleteGeneratedFiles()
{
if (File.Exists(Configuration.SlideshowInputPath))
{
File.Delete(Configuration.SlideshowInputPath);
}
if (Directory.Exists(Configuration.OutputPath))
{
foreach (var video in Directory.GetFiles(Configuration.OutputPath, "*.mp4", SearchOption.AllDirectories))
{
// video input name pattern used in integration tests
if (!video.Contains("input.mp4"))
{
File.Delete(video);
}
}
}
if (Directory.Exists(Configuration.ImagesDirectoryPath))
{
foreach (var image in Directory.GetFiles(Configuration.ImagesDirectoryPath, "*",
SearchOption.AllDirectories))
{
File.Delete(image);
}
}
}
private void AssertImagesWereCreatedCorrectly()
{
Assert.True(Directory.Exists(Configuration.ImagesDirectoryPath));
var images = Directory.GetFiles(Configuration.ImagesDirectoryPath, "*", SearchOption.AllDirectories);
Assert.AreEqual(NumberOfExpectedImages(), images.Length);
var imagesNames = images.Select(x => x.Split("/").Last()).ToArray();
foreach (var fileName in ImagesNamesConvertedFromPdf())
{
Assert.True(imagesNames.Contains(fileName), $"could not find image \"{fileName}\"");
}
}
private void AssertFfmpegInputFileWasCreatedCorrectly()
{
var ffmpegInput = Path.Combine(Configuration.OutputPath, "input.txt");
Assert.True(File.Exists(ffmpegInput));
var content = string.Empty;
try
{
using var sr = new StreamReader(ffmpegInput);
content = sr.ReadToEnd();
}
catch (IOException ex)
{
Assert.Fail("Output bash script file could not be read: " + ex.Message);
}
var lines = content.Split("\n");
AnalyseInputFile(lines);
}
private void AssertSlideshowWasCorrectlyProduced()
{
var output = Directory.GetFiles(Configuration.OutputPath, "*.mp4", SearchOption.TopDirectoryOnly);
var expectedNumberOfMp4Files = 2;
Assert.That(output.Length, Is.AtLeast(expectedNumberOfMp4Files), $"at least {expectedNumberOfMp4Files} *.mp4 were expected, but {output.Length} were found");
AssertSlideshowDurationIsCoerent();
}
private void AssertSlideshowDurationIsCoerent()
{
var input = new FfprobeVideoLengthCommandInput(Configuration.SlideshowOutputPath);
var command = new FfprobeVideoLengthCommand(input, new NullProgressNotification());
decimal.TryParse(command.Do(), out var lengthDecimal);
Assert.GreaterOrEqual(lengthDecimal, _lastFrame.EndSecond);
}
protected abstract IEnumerable<string> ImagesNamesConvertedFromPdf();
protected abstract int NumberOfExpectedImages();
protected abstract void AnalyseInputFile(string[] lines);
}