public void GivenTwoAssetsWhereADependsOnBByDifferentlyCasedFilename_WhenSorted_ThenBIsBeforeAInBundle()
        {
            var bundle = new TestableBundle("~/test");
            var assetA = new Mock<IAsset>();
            assetA.SetupGet(a => a.SourceFile.FullPath).Returns("~/test/a.js");
            assetA.SetupGet(a => a.References)
                  .Returns(new[] { new AssetReference("~/TEST/B.js", assetA.Object, 1, AssetReferenceType.SameBundle) });
            var assetB = new Mock<IAsset>();
            assetB.SetupGet(a => a.SourceFile.FullPath).Returns("~/test/b.js");
            bundle.Assets.Add(assetA.Object);
            bundle.Assets.Add(assetB.Object);

            var sorter = new SortAssetsByDependency();
            sorter.Process(bundle, new CassetteSettings());

            bundle.Assets[0].ShouldBeSameAs(assetB.Object);
            bundle.Assets[1].ShouldBeSameAs(assetA.Object);
        }
        public void GivenTwoAssetsWhereADependsOnBByDifferentlyCasedFilename_WhenSorted_ThenBIsBeforeAInModule()
        {
            var module = new Module("~/test");
            var assetA = new Mock<IAsset>();
            assetA.SetupGet(a => a.SourceFilename).Returns("~/test/a.js");
            assetA.SetupGet(a => a.References)
                  .Returns(new[] { new AssetReference("~/TEST/B.js", assetA.Object, 1, AssetReferenceType.SameModule) });
            var assetB = new Mock<IAsset>();
            assetB.SetupGet(a => a.SourceFilename).Returns("~/test/b.js");
            module.Assets.Add(assetA.Object);
            module.Assets.Add(assetB.Object);

            var sorter = new SortAssetsByDependency();
            sorter.Process(module, Mock.Of<ICassetteApplication>());

            module.Assets[0].ShouldBeSameAs(assetB.Object);
            module.Assets[1].ShouldBeSameAs(assetA.Object);
        }
        public void GivenAssetWithCircularReferences_WhenProcess_ThenExceptionThrown()
        {
            var module = new Module("~/test");
            var assetA = new Mock<IAsset>();
            assetA.SetupGet(a => a.SourceFilename).Returns("~/test/a.js");
            assetA.SetupGet(a => a.References)
                  .Returns(new[] { new AssetReference("~/test/b.js", assetA.Object, 1, AssetReferenceType.SameModule) });
            var assetB = new Mock<IAsset>();
            assetB.SetupGet(a => a.SourceFilename).Returns("~/test/b.js");
            assetB.SetupGet(a => a.References)
                  .Returns(new[] { new AssetReference("~/test/a.js", assetB.Object, 1, AssetReferenceType.SameModule) });

            module.AddAssets(new[] { assetA.Object, assetB.Object }, preSorted: false);

            var sorter = new SortAssetsByDependency();
            Assert.Throws<InvalidOperationException>(
                () => sorter.Process(module, Mock.Of<ICassetteApplication>())
            );
        }
        public void GivenAssetWithCircularReferences_WhenProcess_ThenExceptionThrown()
        {
            var bundle = new TestableBundle("~/test");
            var assetA = new Mock<IAsset>();
            assetA.SetupGet(a => a.SourceFile.FullPath).Returns("~/test/a.js");
            assetA.SetupGet(a => a.References)
                  .Returns(new[] { new AssetReference("~/test/b.js", assetA.Object, 1, AssetReferenceType.SameBundle) });
            var assetB = new Mock<IAsset>();
            assetB.SetupGet(a => a.SourceFile.FullPath).Returns("~/test/b.js");
            assetB.SetupGet(a => a.References)
                  .Returns(new[] { new AssetReference("~/test/a.js", assetB.Object, 1, AssetReferenceType.SameBundle) });

            bundle.Assets.Add(assetA.Object);
            bundle.Assets.Add(assetB.Object);

            var sorter = new SortAssetsByDependency();
            Assert.Throws<InvalidOperationException>(
                () => sorter.Process(bundle, new CassetteSettings())
            );
        }
        public void WhenBundleHasSortedAssets_ThenProcessDoesNotReorderAssets()
        {
            var bundle = new TestableBundle("~/test");
            var assetA = new Mock<IAsset>();
            assetA.SetupGet(a => a.SourceFile.FullPath).Returns("~/test/a.js");
            assetA.SetupGet(a => a.References)
                  .Returns(new[] { new AssetReference("~/TEST/B.js", assetA.Object, 1, AssetReferenceType.SameBundle) });
            var assetB = new Mock<IAsset>();
            assetB.SetupGet(a => a.SourceFile.FullPath).Returns("~/test/b.js");
            bundle.Assets.Add(assetA.Object);
            bundle.Assets.Add(assetB.Object);
            bundle.IsSorted = true;

            var sorter = new SortAssetsByDependency();
            sorter.Process(bundle, new CassetteSettings());

            bundle.Assets[0].ShouldBeSameAs(assetA.Object);
            bundle.Assets[1].ShouldBeSameAs(assetB.Object);
        }
        public void WhenModuleHasSortedAssets_ThenProcessDoesNotReorderAssets()
        {
            var module = new Module("~/test");
            var assetA = new Mock<IAsset>();
            assetA.SetupGet(a => a.SourceFilename).Returns("~/test/a.js");
            assetA.SetupGet(a => a.References)
                  .Returns(new[] { new AssetReference("~/TEST/B.js", assetA.Object, 1, AssetReferenceType.SameModule) });
            var assetB = new Mock<IAsset>();
            assetB.SetupGet(a => a.SourceFilename).Returns("~/test/b.js");
            module.AddAssets(new[] {assetA.Object, assetB.Object}, preSorted: true);

            var sorter = new SortAssetsByDependency();
            sorter.Process(module, Mock.Of<ICassetteApplication>());

            module.Assets[0].ShouldBeSameAs(assetA.Object);
            module.Assets[1].ShouldBeSameAs(assetB.Object);
        }