public void OptimizeTest(bool hasSegmentHours)
        {
            var file = new Mock <IFileSystem>();
            var log  = new Mock <ILogWrapper>();
            var q    = new Queue <string>();

            file.Setup(f => f.File.ReadAllText(It.IsAny <string>())).Returns((string path) =>
            {
                string filename = System.IO.Path.GetFileName(path);
                if (hasSegmentHours && filename == "dynasty.json")
                {
                    filename = filename.Replace(".json", "_segments.json");
                }

                return(System.IO.File.ReadAllText(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, filename.Replace(".json", "_test.json"))));
            });

            file.Setup(f => f.File.WriteAllText(It.IsAny <string>(), It.IsAny <string>())).Callback((string path, string contents) =>
            {
                System.IO.File.WriteAllText(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, path), contents);
            });

            List <string> actual = new List <string>();

            log.Setup(l => l.Result(It.IsAny <string>())).Callback <string>(m => { actual.Add(m); });

            OptimizerInitializerTests.SetEntryAssembly(Assembly.GetCallingAssembly());

            var unit = new Dynasty(file.Object, log.Object, new MockGeneManagerFactory());

            unit.Optimize();

            Assert.IsTrue(actual.ElementAt(1).StartsWith(GeneManager.Termination));
            Assert.IsTrue(actual.ElementAt(2).StartsWith("Algorithm:"));
            Assert.IsTrue(actual.ElementAt(3).StartsWith("take:"));
            if (hasSegmentHours)
            {
                Assert.AreEqual(actual.First(), "For period: 01/02/2016 00:00:00 01/02/2016 23:59:59");
                Assert.AreEqual(actual.ElementAt(4), "For period: 02/02/2016 00:00:00 03/02/2016 23:59:59");
                Assert.AreEqual(actual.ElementAt(8), "For period: 04/02/2016 00:00:00 06/02/2016 23:59:59");
                Assert.AreEqual(actual.ElementAt(12), "For period: 07/02/2016 00:00:00 07/02/2016 23:59:59");
            }
            else
            {
                Assert.AreEqual(actual.First(), "For period: 01/02/2016 00:00:00 10/02/2016 23:59:59");
                Assert.AreEqual(actual.ElementAt(4), "For period: 11/02/2016 00:00:00 20/02/2016 23:59:59");
                Assert.AreEqual(actual.ElementAt(8), "For period: 21/02/2016 00:00:00 01/03/2016 23:59:59");
            }
        }
        public void OptimizeTest()
        {
            var process = new Mock <IProcessWrapper>();
            var file    = new Mock <IFileSystem>();
            var log     = new Mock <ILogWrapper>();
            var q       = new Queue <string>();

            file.Setup(f => f.File.ReadAllText(It.IsAny <string>())).Returns((string path) =>
            {
                return(System.IO.File.ReadAllText(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, path)));
            });
            file.Setup(f => f.File.WriteAllText(It.IsAny <string>(), It.IsAny <string>())).Callback((string path, string contents) =>
            {
                q.Enqueue("utyvoiuhpoih[j[09u875");
                q.Enqueue(GeneManager.Termination);
                q.Enqueue("Algorithm: Name, Generation: 987, Fitness: 100, sharpe: 1.23");
                q.Enqueue("take: 1.1, fast: 12, slow: 123.456");
                q.Enqueue(null);

                System.IO.File.WriteAllText(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, path), contents);
            });

            process.Setup(p => p.Start(It.IsAny <ProcessStartInfo>()));
            process.Setup(p => p.Kill()).Verifiable();
            process.Setup(p => p.ReadLine()).Returns(() => { return(q.Dequeue()); });

            List <string> actual = new List <string>();

            log.Setup(l => l.Info(It.IsAny <string>())).Callback <string>(m => { actual.Add(m); });

            var unit = new Dynasty(file.Object, process.Object, log.Object);

            unit.Optimize();

            process.Verify();

            Assert.IsTrue(actual.First().StartsWith("For period"));
            Assert.IsTrue(actual.ElementAt(1).StartsWith(GeneManager.Termination));
            Assert.IsTrue(actual.ElementAt(2).StartsWith("Algorithm:"));
            Assert.IsTrue(actual.ElementAt(3).StartsWith("take:"));
        }