public void Can_get_data_from_all_assets_with_debugging_enabled()
        {
            // Arrange
            var builder = new AssetBuilder();
            var a1 = builder.Path("f/1.js").Data("abc123").Build();
            var a2 = builder.Path("f/2.js").Data("def456").Build();
            var a3 = builder.Path("f/3.js").Data("ghi789").Build();

            var p = this.CreatePackage(new[] { a1, a2, a3 }, isDebugging: true);

            // Act
            var d = p.GetAllData();

            // Assert
            Assert.AreEqual("$abc123-f/1.js$\r\n$def456-f/2.js$\r\n$ghi789-f/3.js$\r\n", d);
        }
        public void Should_add_templates_to_keyed_by_stripping_the_file_extension()
        {
            // Arrange
            var builder = new AssetBuilder();
            var a1 = builder.Path("tmpl/A.jst").Data("<h1 />").Build();
            var a2 = builder.Path("views/B.jst").Data("<h2 />").Build();

            var config = new TemplateConfiguration("JST", "tmpl", "jst");
            var tmpl = this.CreateTemplateAsset(config, a1, a2);

            // Act
            var data = tmpl.GetData();

            // Assert
            Assert.IsTrue(data.Contains("ns[\"tmpl/A\"] = lazyTemplate('<h1 />');"));
            Assert.IsTrue(data.Contains("ns[\"views/B\"] = lazyTemplate('<h2 />');"));
        }
        public void Can_use_custom_name_casing()
        {
            // Arrange
            var builder = new AssetBuilder();
            var a1 = builder.Path("tMpL/A.jst").Data("<h1 />").Build();
            var a2 = builder.Path("VIEWS/b.jst").Data("<h2 />").Build();

            var config = new TemplateConfiguration("JST", "tmpl", "jst");
            config.NameCasing = p => p.ToLower();
            var tmpl = this.CreateTemplateAsset(config, a1, a2);

            // Act
            var data = tmpl.GetData();

            // Assert
            Assert.IsTrue(data.Contains("ns[\"tmpl/a\"] = lazyTemplate('<h1 />');"));
            Assert.IsTrue(data.Contains("ns[\"views/b\"] = lazyTemplate('<h2 />');"));
        }
        public void Should_escape_single_quotes_for_asset_data()
        {
            // Arrange
            var builder = new AssetBuilder();
            var a1 = builder.Path("a.jst").Data("<a href='#' />").Build();
            var a2 = builder.Path("b.jst").Data("<a href=\\'#\\' />").Build();
            var a3 = builder.Path("c.jst").Data("<a href=\"#\" />").Build();

            var config = new TemplateConfiguration("JST", "tmpl", "jst");
            var tmpl = this.CreateTemplateAsset(config, a1, a2, a3);

            // Act
            var data = tmpl.GetData();

            // Assert
            Assert.IsTrue(data.Contains("ns[\"a\"] = lazyTemplate('<a href=\\'#\\' />');"));
            Assert.IsTrue(data.Contains("ns[\"b\"] = lazyTemplate('<a href=\\\\'#\\\\' />');"));
            Assert.IsTrue(data.Contains("ns[\"c\"] = lazyTemplate('<a href=\"#\" />');"));
        }
        public void Should_remove_common_prefixes()
        {
            // Arrange
            var builder = new AssetBuilder();
            var a1 = builder.Path("tmpl/a.jst").Data("<h1 />").Build();
            var a2 = builder.Path("tmpl/b.jst").Data("<h1 />").Build();
            var a3 = builder.Path("tmpl/c.jst").Data("<h1 />").Build();
            var a4 = builder.Path("tmpl/test/d.jst").Data("<h1 />").Build();

            var config = new TemplateConfiguration("JST", "tmpl", "jst");
            var tmpl = this.CreateTemplateAsset(config, a1, a2, a3, a4);

            // Act
            var data = tmpl.GetData();

            // Assert
            Assert.IsTrue(data.Contains("ns[\"a\"] = lazyTemplate('<h1 />');"));
            Assert.IsTrue(data.Contains("ns[\"b\"] = lazyTemplate('<h1 />');"));
            Assert.IsTrue(data.Contains("ns[\"c\"] = lazyTemplate('<h1 />');"));
            Assert.IsTrue(data.Contains("ns[\"test/d\"] = lazyTemplate('<h1 />');"));
        }
        public void Should_aggregate_template_assets()
        {
            // Arrange
            var builder = new AssetBuilder();
            var a1 = builder.Path("content/scripts/1.js").Build();
            var a2 = builder.Path("content/scripts/2.js").Build();
            var a3 = builder.Path("content/tmpl/1.jst").Build();
            var a4 = builder.Path("content/tmpl/2.jst").Build();

            // Act
            var package = this.CreatePackage(new List<IAsset>() { a1, a2, a3, a4 }, "jst");

            // Assert
            Assert.AreEqual(3, package.Assets.Count());
            Assert.AreEqual("content/scripts/1.js", package.Assets.First().Path);
            Assert.AreEqual("content/scripts/2.js", package.Assets.Skip(1).First().Path);

            var tmplAsset = package.Assets.Skip(2).First();
            Assert.IsTrue(tmplAsset.Path.StartsWith("templates/"));
            Assert.IsTrue(tmplAsset.Path.EndsWith(".js"));
            Assert.IsInstanceOfType(tmplAsset, typeof(TemplateAsset));
        }
        public void Can_get_data_from_individual_asset()
        {
            Action<bool> getAssetDataTest = (bool isDebugging) =>
            {
                // Arrange
                var builder = new AssetBuilder();
                var a1 = builder.Path("content/1.js").Data("abc123").Build();
                var a2 = builder.Path("ContenT/2.js").Data("def456").Build();

                var p = this.CreatePackage(new[] { a1, a2 }, isDebugging);

                // Act/Assert
                Assert.AreEqual("$abc123-content/1.js$", p.GetAssetData("content/1.js"));
                Assert.AreEqual("$def456-ContenT/2.js$", p.GetAssetData("cONTENt/2.js"));
                Assert.IsNull(p.GetAssetData("non-existant-path/3.js"));
            };

            // Should return same results when debugging is enabled/disabled.
            // Only preprocessing should execute.
            getAssetDataTest(false);
            getAssetDataTest(true);
        }
        public void Should_replace_line_breaks_with_new_line_characters()
        {
            // Arrange
            var builder = new AssetBuilder();
            var a1 = builder.Path("a.jst").Data(@"<h1>
            </h1>").Build();
            var a2 = builder.Path("b.jst").Data(@"<h1>
            </h1>").Build();

            var config = new TemplateConfiguration("JST", "tmpl", "jst");
            var tmpl = this.CreateTemplateAsset(config, a1, a2);

            // Act
            var data = tmpl.GetData();

            // Assert
            Assert.IsTrue(data.Contains("ns[\"a\"] = lazyTemplate('<h1>\\n</h1>');"));
            // Preserve whitespace.
            Assert.IsTrue(data.Contains("ns[\"b\"] = lazyTemplate('<h1>\\n    </h1>');"));
        }