public void DeserializeCoverageObject_NonCanonicalReferences_MergeCoverage()
        {
            var testContext = new TestContext
            {
                TestFileSettings = new ChutzpahTestSettingsFile
                {
                    Compile = new BatchCompileConfiguration
                    {
                        UseSourceMaps = false,
                    }
                }.InheritFromDefault(),
                ReferencedFiles = new[]
                {
                    new ReferencedFile
                    {
                        Path = @"X:\file1.ts", GeneratedFilePath = @"X:\file1.js"
                    },

                    new ReferencedFile
                    {
                        Path = @"X:\1\..\file1.ts", GeneratedFilePath = @"X:\1\..\file1.js"
                    },
                }
            };
            var lineExecutions = new Dictionary <string, int?[]>
            {
                { @"X:\file1.js", new int?[] { null, null, 4, 4 } },
                { @"X:\1\..\file1.js", new int?[] { 1, 2, null, null } }
            };

            var underTest = new TestableCoverageEngine(lineExecutions);
            var coverage  = underTest.ClassUnderTest.DeserializeCoverageObject("the json", testContext);

            Assert.Equal(1, coverage.CoveragePercentage, 2);
        }
        public void DeserializeCoverageObject_UsesLineCoverageMapper_IfSettingsEnabledAndMapPathNotNull()
        {
            var testContext = GetContext();

            var underTest = new TestableCoverageEngine(GetLineExecutions());

            underTest.ClassUnderTest.DeserializeCoverageObject("the json", testContext);

            underTest.Mock <ILineCoverageMapper>().Verify(x => x.GetOriginalFileLineExecutionCounts(It.IsAny <int?[]>(), It.IsAny <int>(), It.IsAny <string>()), Times.Once());
        }
        public void DeserializeCoverageObject_CallsLineCoverageMapper_WithAppropriateArguments()
        {
            var testContext  = GetContext();
            var coverageDict = GetLineExecutions();
            var underTest    = new TestableCoverageEngine(coverageDict);

            underTest.ClassUnderTest.DeserializeCoverageObject("the json", testContext);

            var file = testContext.ReferencedFiles.Single(x => x.Path == @"X:\file1.ts");

            underTest.Mock <ILineCoverageMapper>().Verify(x => x.GetOriginalFileLineExecutionCounts(coverageDict[file.GeneratedFilePath], 1, file.SourceMapFilePath), Times.Once());
        }
        public void DeserializeCoverageObject_SkipsLineCoverageMapper_IfSettingsDisabled()
        {
            var testContext = GetContext();

            testContext.TestFileSettings.Compile.UseSourceMaps = false;

            var underTest = new TestableCoverageEngine(GetLineExecutions());

            underTest.ClassUnderTest.DeserializeCoverageObject("the json", testContext);

            underTest.Mock <ILineCoverageMapper>().Verify(x => x.GetOriginalFileLineExecutionCounts(It.IsAny <int?[]>(), It.IsAny <int>(), It.IsAny <string>()), Times.Never());
        }
        public void DeserializeCoverageObject_SkipsLineCoverageMapper_IfMapPathNull()
        {
            var testContext = GetContext();

            foreach (var file in testContext.ReferencedFiles)
            {
                file.SourceMapFilePath = null;
            }

            var underTest = new TestableCoverageEngine(GetLineExecutions());

            underTest.ClassUnderTest.DeserializeCoverageObject("the json", testContext);

            underTest.Mock <ILineCoverageMapper>().Verify(x => x.GetOriginalFileLineExecutionCounts(It.IsAny <int?[]>(), It.IsAny <int>(), It.IsAny <string>()), Times.Never());
        }
        public void DeserializeCoverageObject_UsesOriginalSource_WhenSourceMapsEnabled()
        {
            var testContext  = GetContext();
            var coverageDict = GetLineExecutions();
            var mapperOutput = new int?[] { 1, null };
            var underTest    = new TestableCoverageEngine(coverageDict, mapperOutput);
            var file         = testContext.ReferencedFiles.Single(x => x.Path == @"X:\file1.ts");

            var result = underTest.ClassUnderTest.DeserializeCoverageObject("the json", testContext);

            Assert.True(result.ContainsKey(@"X:\file1.ts"));
            Assert.Same(mapperOutput, result[@"X:\file1.ts"].LineExecutionCounts);
            Assert.True(result[@"X:\file1.ts"].SourceLines.All(x => x == "typescript"));
            Assert.Equal(@"X:\file1.ts", result[@"X:\file1.ts"].FilePath);
        }
        public void DeserializeCoverageObject_UsesGeneratedSource_IfNoOriginalSourceAvailable()
        {
            var testContext  = GetContext();
            var coverageDict = GetLineExecutions();

            // Add in a file we didn't know about
            coverageDict[@"X:\file3.js"] = new int?[0];

            var mapperOutput = new int?[] { 1, null };
            var underTest    = new TestableCoverageEngine(coverageDict, mapperOutput);
            var file         = testContext.ReferencedFiles.Single(x => x.Path == @"X:\file1.ts");

            var result = underTest.ClassUnderTest.DeserializeCoverageObject("the json", testContext);

            Assert.True(result.ContainsKey(@"X:\file3.js"));
        }