// Copyright 2017 Alexander Luzgarev
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace MatFileHandler.Tests
{
///
/// Abstract factory of test data.
///
/// Type of test data.
public abstract class AbstractTestDataFactory
{
///
/// Initializes a new instance of the class.
///
/// Directory with test files.
/// A convention used to filter test files.
protected AbstractTestDataFactory(string dataDirectory, ITestFilenameConvention testFilenameConvention)
{
DataDirectory = dataDirectory;
TestFilenameConvention = testFilenameConvention;
}
private string DataDirectory { get; }
private ITestFilenameConvention TestFilenameConvention { get; }
///
/// Get test data set by name.
///
/// Name of the data set.
/// Test data.
public TTestData this[string dataSet] =>
ReadTestData(FixPath(TestFilenameConvention.ConvertTestNameToFilename(dataSet)));
///
/// Get a sequence of all test data sets in the factory.
///
/// A sequence of data sets.
public IEnumerable GetAllTestData()
{
var files = Directory.EnumerateFiles(DataDirectory).Where(TestFilenameConvention.FilterFile);
foreach (var filename in files)
{
yield return ReadTestData(filename);
}
}
///
/// Read test data from a stream.
///
/// Input stream.
/// Test data.
protected abstract TTestData ReadDataFromStream(Stream stream);
private string FixPath(string filename) => Path.Combine(DataDirectory, filename);
private TTestData ReadTestData(string filename)
{
using (var stream = new FileStream(filename, FileMode.Open))
{
return ReadDataFromStream(stream);
}
}
}
}