public void ConcatenateIndexFilesTestConfigFileChanges()
        {
            var indexPropertiesConfig = PathHelper.ResolveConfigFile("IndexPropertiesConfig.yml");
            var dateString            = "20160726";

            // get the default config file
            var defaultConfigFile = PathHelper.ResolveConfigFile("SpectrogramFalseColourConfig.yml");
            var config            = Yaml.Deserialize <LdSpectrogramConfig>(defaultConfigFile);

            // make changes to config file as required for test
            config.ColorMap1 = "BGN-ENT-PMN";
            config.ColorMap2 = "ACI-RNG-EVN";

            // write new config
            var testConfig = this.TestOutputDirectory.CombineFile("SpectrogramFalseColourConfig.yml");

            Yaml.Serialize(testConfig, config);

            var arguments = new ConcatenateIndexFiles.Arguments
            {
                InputDataDirectories = new[] { indonesiaIndicesDirectory },
                OutputDirectory      = this.TestOutputDirectory,
                DirectoryFilter      = "*.wav",
                FileStemName         = "Test2_Indonesia",
                StartDate            = new DateTimeOffset(2016, 07, 26, 0, 0, 0, TimeSpan.Zero),
                EndDate = new DateTimeOffset(2016, 07, 27, 0, 0, 0, TimeSpan.Zero),
                IndexPropertiesConfig        = indexPropertiesConfig.FullName,
                FalseColourSpectrogramConfig = testConfig.FullName,
                ConcatenateEverythingYouCanLayYourHandsOn = false, // 24 hour blocks only
                TimeSpanOffsetHint = TimeSpan.FromHours(8),
                DrawImages         = true,

                // following two lines can be used to add in a recognizer score track
                EventDataDirectories = null,
                EventFilePattern     = null,
            };

            ConcatenateIndexFiles.Execute(arguments);

            // Make sure files that match our config file are actually created!
            var outputDataDir = this.TestOutputDirectory.Combine(arguments.FileStemName, dateString);
            var prefix        = arguments.FileStemName + "_" + dateString + "__";

            Assert.That.FileExists(outputDataDir.CombineFile(prefix + "Towsey.Acoustic.Indices.csv"));
            Assert.That.FileNotExists(outputDataDir.CombineFile(prefix + "SummaryIndex.csv"));

            var imageFileInfo1 = outputDataDir.CombineFile(prefix + "BGN-ENT-PMN.png");

            Assert.IsTrue(imageFileInfo1.Exists);

            var imageFileInfo2 = outputDataDir.CombineFile(prefix + "ACI-RNG-EVN.png");

            Assert.IsTrue(imageFileInfo2.Exists);
        }
        public void ConcatenateEverythingYouCanLayYourHandsOn()
        {
            // top level directory
            var indexPropertiesConfig = PathHelper.ResolveConfigFile("IndexPropertiesConfig.yml");
            var dateString            = "20160725";

            // get the default config file
            var testConfig = PathHelper.ResolveConfigFile("SpectrogramFalseColourConfig.yml");

            var arguments = new ConcatenateIndexFiles.Arguments
            {
                InputDataDirectories = new[] { indonesiaIndicesDirectory },
                OutputDirectory      = this.TestOutputDirectory,
                DirectoryFilter      = "*.wav",
                FileStemName         = "Test1_Indonesia",
                StartDate            = new DateTimeOffset(2016, 07, 25, 0, 0, 0, TimeSpan.Zero),
                EndDate = new DateTimeOffset(2016, 07, 25, 0, 0, 0, TimeSpan.Zero),
                IndexPropertiesConfig        = indexPropertiesConfig.FullName,
                FalseColourSpectrogramConfig = testConfig.FullName,
                ColorMap1 = LDSpectrogramRGB.DefaultColorMap1,
                ColorMap2 = "BGN-PMN-EVN",
                ConcatenateEverythingYouCanLayYourHandsOn = true, // join everything found
                TimeSpanOffsetHint = TimeSpan.FromHours(8),
                DrawImages         = true,

                // following two lines can be used to add in a recognizer score track
                EventDataDirectories = null,
                EventFilePattern     = null,
            };

            ConcatenateIndexFiles.Execute(arguments);

            // Do TESTS on the 2Maps image
            // Compare image files - check that image dimensions are correct
            var outputDataDir = this.TestOutputDirectory.Combine(arguments.FileStemName, dateString);
            var prefix        = arguments.FileStemName + "__";

            var imageFileInfo = outputDataDir.CombineFile(prefix + "2Maps.png");

            Assert.IsTrue(imageFileInfo.Exists);

            Assert.That.FileExists(outputDataDir.CombineFile(prefix + "Towsey.Acoustic.Indices.csv"));
            Assert.That.FileNotExists(outputDataDir.CombineFile(prefix + "SummaryIndex.csv"));

            var actualImage = Image.Load <Rgb24>(imageFileInfo.FullName);

            Assert.That.ImageIsSize(722, 632, actualImage);
            Assert.That.PixelIsColor(new Point(100, 100), Color.FromRgb(211, 211, 211), actualImage);
            Assert.That.PixelIsColor(new Point(200, 125), Color.FromRgb(60, 44, 203), actualImage);
            Assert.That.PixelIsColor(new Point(675, 600), Color.FromRgb(255, 105, 180), actualImage);
        }
        public void ConcatenateIndexFilesTest24Hour()
        {
            // top level directory
            var indexPropertiesConfig = PathHelper.ResolveConfigFile("IndexPropertiesConfig.yml");
            var dateString            = "20160726";

            // get the default config file
            var testConfig = PathHelper.ResolveConfigFile("SpectrogramFalseColourConfig.yml");

            var arguments = new ConcatenateIndexFiles.Arguments
            {
                InputDataDirectories = new[] { indonesiaIndicesDirectory },
                OutputDirectory      = this.outputDirectory,
                DirectoryFilter      = "*.wav",
                FileStemName         = "Test2_Indonesia",
                StartDate            = new DateTimeOffset(2016, 07, 26, 0, 0, 0, TimeSpan.Zero),
                EndDate = new DateTimeOffset(2016, 07, 27, 0, 0, 0, TimeSpan.Zero),
                IndexPropertiesConfig        = indexPropertiesConfig.FullName,
                FalseColourSpectrogramConfig = testConfig.FullName,
                ColorMap1 = LDSpectrogramRGB.DefaultColorMap1,
                ColorMap2 = "BGN-PMN-EVN",
                ConcatenateEverythingYouCanLayYourHandsOn = false, // 24 hour blocks only
                TimeSpanOffsetHint = TimeSpan.FromHours(8),
                DrawImages         = true,

                // following two lines can be used to add in a recognizer score track
                EventDataDirectories = null,
                EventFilePattern     = null,
            };

            ConcatenateIndexFiles.Execute(arguments);

            // Do TESTS on the 2Maps image
            // Compare image files - check that image dimensions are correct
            var outputDataDir = this.outputDirectory.Combine(arguments.FileStemName, dateString);
            var prefix        = arguments.FileStemName + "_" + dateString + "__";

            var imageFileInfo = outputDataDir.CombineFile(prefix + "2Maps.png");

            Assert.IsTrue(imageFileInfo.Exists);

            Assert.That.FileExists(outputDataDir.CombineFile(prefix + "Towsey.Acoustic.Indices.csv"));
            Assert.That.FileNotExists(outputDataDir.CombineFile(prefix + "SummaryIndex.csv"));

            var actualImage = ImageTools.ReadImage2Bitmap(imageFileInfo.FullName);

            // we expect only the second half (past midnight) of the image to be rendered
            Assert.That.ImageIsSize(512, 632, actualImage);
            Assert.That.PixelIsColor(new Point(105, 154), Color.FromArgb(34, 30, 126), actualImage);
            Assert.That.PixelIsColor(new Point(100, 160), Color.FromArgb(8, 28, 64), actualImage);
        }
        public void SampledDataConcatModeTests(ConcatMode gapRendering, int[] expectedWidths)
        {
            const string ark01 = "Ark01";

            var arguments = new ConcatenateIndexFiles.Arguments
            {
                InputDataDirectories = new[] { newZealandArk01IndicesDirectory },
                OutputDirectory      = this.TestOutputDirectory,
                DirectoryFilter      = "*.wav",
                FileStemName         = ark01,
                StartDate            = null,
                EndDate = null,
                IndexPropertiesConfig        = PathHelper.ResolveConfigFile("IndexPropertiesConfig.yml").FullName,
                FalseColourSpectrogramConfig = PathHelper.ResolveConfigFile("SpectrogramFalseColourConfig.yml").FullName,
                ColorMap1 = null,
                ColorMap2 = null,
                ConcatenateEverythingYouCanLayYourHandsOn = false,
                GapRendering       = gapRendering,
                TimeSpanOffsetHint = TimeSpan.FromHours(12),
                DrawImages         = true,
            };

            ConcatenateIndexFiles.Execute(arguments);

            var dateStrings = new[] { "20161209", "20161210", "20161211" }.Zip(expectedWidths, ValueTuple.Create);

            foreach (var(dateString, expectedWidth) in dateStrings)
            {
                var prefix = Path.Combine(this.TestOutputDirectory.FullName, ark01, dateString, ark01 + "_" + dateString + "__");

                Assert.That.PathExists(prefix + "Towsey.Acoustic.Indices.csv");
                Assert.That.PathNotExists(prefix + "SummaryIndex.csv");

                var imagePath = prefix + "2Maps.png";
                Assert.That.FileExists(imagePath);

                var actualImage = Image.Load <Rgb24>(imagePath);
                Assert.That.ImageIsSize(expectedWidth, 632, actualImage);

                // target region for each image: 40, 254, 20,20
                switch (gapRendering)
                {
                case ConcatMode.TimedGaps:
                    // for timed gap, first column has content, other 19 don't and should be gray (missing data)
                    Assert.That.ImageRegionIsColor(
                        new Rectangle(40 + 1, 254, 20 - 1, 20),
                        Color.LightGray,
                        actualImage,
                        0.001);
                    break;

                case ConcatMode.NoGaps:
                    // There should basically be no pattern here
                    var histogram = ImageTools.GetColorHistogramNormalized(
                        actualImage,
                        new Rectangle(40, 254, 20, 20));

                    // should not have empty space
                    var hasGray = histogram.TryGetValue(Color.LightGray, out var grayPercentage);
                    Assert.IsTrue(!hasGray || grayPercentage < 0.01);

                    // the rest of the values should be well distributed (not a perfect test)
                    Assert.That.ImageColorsWellDistributed(
                        actualImage,
                        allowedError: 0.1,
                        colorHistogram: histogram);

                    break;

                case ConcatMode.EchoGaps:
                    // The first column should be repeated 19 times
                    Assert.That.ImageRegionIsRepeatedHorizontally(
                        new Rectangle(40, 254, 1, 20),
                        19,
                        1,
                        actualImage);
                    break;

                default:
                    throw new ArgumentOutOfRangeException(nameof(gapRendering), gapRendering, null);
                }
            }
        }
        public void ConcatenateIndexFilesTest24HourWithoutDateRange()
        {
            var indexPropertiesConfig = PathHelper.ResolveConfigFile("IndexPropertiesConfig.yml");

            // get the default config file
            var testConfig = PathHelper.ResolveConfigFile("SpectrogramFalseColourConfig.yml");

            var arguments = new ConcatenateIndexFiles.Arguments
            {
                InputDataDirectories = new[] { indonesiaIndicesDirectory },
                OutputDirectory      = this.TestOutputDirectory,
                DirectoryFilter      = "*.wav",
                FileStemName         = "Test3_Indonesia",
                StartDate            = null,
                EndDate = null,
                IndexPropertiesConfig        = indexPropertiesConfig.FullName,
                FalseColourSpectrogramConfig = testConfig.FullName,
                ColorMap1 = LDSpectrogramRGB.DefaultColorMap1,
                ColorMap2 = "BGN-PMN-EVN",
                ConcatenateEverythingYouCanLayYourHandsOn = false, // 24 hour blocks only
                TimeSpanOffsetHint = TimeSpan.FromHours(8),
                DrawImages         = true,

                // following two lines can be used to add in a recognizer score track
                EventDataDirectories = null,
                EventFilePattern     = null,
            };

            ConcatenateIndexFiles.Execute(arguments);

            // There should be two sets of output images one for each partial day.
            // IMAGE 1: Compare image files - check that image exists and dimensions are correct
            var dateString1    = "20160725";
            var outputDataDir1 = this.TestOutputDirectory.Combine(arguments.FileStemName, dateString1);
            var prefix1        = arguments.FileStemName + "_" + dateString1 + "__";

            var image1FileInfo = outputDataDir1.CombineFile(prefix1 + "2Maps.png");

            Assert.IsTrue(image1FileInfo.Exists);

            Assert.That.FileExists(outputDataDir1.CombineFile(prefix1 + "Towsey.Acoustic.Indices.csv"));
            Assert.That.FileNotExists(outputDataDir1.CombineFile(prefix1 + "SummaryIndex.csv"));

            var actualImage1 = Image.Load <Rgb24>(image1FileInfo.FullName);

            Assert.That.ImageIsSize(210, 632, actualImage1);
            Assert.That.PixelIsColor(new Point(100, 100), Color.FromRgb(211, 211, 211), actualImage1);
            Assert.That.PixelIsColor(new Point(50, 50), Color.FromRgb(86, 27, 8), actualImage1);

            // IMAGE 2: Compare image files - check that image exists and dimensions are correct
            var dateString2    = "20160726";
            var outputDataDir2 = this.TestOutputDirectory.Combine(arguments.FileStemName, dateString2);
            var prefix2        = arguments.FileStemName + "_" + dateString2 + "__";

            var image2FileInfo = outputDataDir2.CombineFile(prefix2 + "2Maps.png");

            Assert.IsTrue(image2FileInfo.Exists);

            Assert.That.FileExists(outputDataDir2.CombineFile(prefix2 + "Towsey.Acoustic.Indices.csv"));
            Assert.That.FileNotExists(outputDataDir2.CombineFile(prefix2 + "SummaryIndex.csv"));

            var actualImage2 = Image.Load <Rgb24>(image2FileInfo.FullName);

            Assert.That.ImageIsSize(512, 632, actualImage2);
            Assert.That.PixelIsColor(new Point(50, 124), Color.FromRgb(70, 37, 255), actualImage2);
            Assert.That.PixelIsColor(new Point(460, 600), Color.FromRgb(255, 105, 180), actualImage2);
        }