// Copyright 2017-2018 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, FileAccess.Read)) { return ReadDataFromStream(stream); } } } }