public void FillingOfImportedLessFilePathsIsCorrect()
        {
            // Arrange
            var virtualFileSystemMock = new Mock<IVirtualFileSystemWrapper>();
            var encoding = Encoding.Default;

            string mixinsLessAssetVirtualPath = UrlHelpers.Combine(STYLES_DIRECTORY_VIRTUAL_PATH, "Mixins.less");
            virtualFileSystemMock
                .Setup(fs => fs.FileExists(mixinsLessAssetVirtualPath))
                .Returns(true)
                ;
            virtualFileSystemMock
                .Setup(fs => fs.GetFileTextContent(mixinsLessAssetVirtualPath))
                .Returns(@"// Border Radius
            .border-radius(@radius) {
              -webkit-border-radius: @radius;
             -moz-border-radius: @radius;
              border-radius: @radius;
            }")
                ;

            string selectorsLessAssetVirtualPath = UrlHelpers.Combine(STYLES_DIRECTORY_VIRTUAL_PATH, "Selectors.less");
            virtualFileSystemMock
                .Setup(fs => fs.FileExists(selectorsLessAssetVirtualPath))
                .Returns(true)
                ;
            virtualFileSystemMock
                .Setup(fs => fs.GetFileTextContent(selectorsLessAssetVirtualPath))
                .Returns(@"// Visible
            .visible
            {
            display: block;
            }")
                ;

            string testLessImportLessAssetVirtualPath = UrlHelpers.Combine(STYLES_DIRECTORY_VIRTUAL_PATH,
                "TestLessImport.less");
            virtualFileSystemMock
                .Setup(fs => fs.FileExists(testLessImportLessAssetVirtualPath))
                .Returns(true)
                ;
            virtualFileSystemMock
                .Setup(fs => fs.GetFileTextContent(testLessImportLessAssetVirtualPath))
                .Returns(@"@alt-bg-color: #143352;

            .translators #less
            {
            background-color: @alt-bg-color;
            }

            .icon-headphone
            {
            display: inline;
            background-image: data-uri('headphone.gif');
            }

            .icon-google-plus
            {
            display: inline;
            background-image: data-uri('google-plus.svg');
            }

            @import (multiple) url(		""TestLessImport.Sub1.less""	);
            .singleline-comment { content: ""//"" } .triple-slash-directive { content: '///' } @import 'TestLessImport.Sub2';
            /*@import 'TestLessImport.Sub3.less';
            @import 'TestLessImport.Sub4.less';*/
            // @import ""TestLessImport.Sub5.less"";
            // Obsolete import //@import ""TestLessImport.Sub6.less"";
            .icon-bean { background-image: url(http://taritsyn.files.wordpress.com/2013/08/bean.png); } //@import ""TestLessImport.Sub7.less"";
            // @import ""TestLessImport.Sub8.less""; @import ""TestLessImport.Sub9.less"";
            ")
                ;

            string headphoneGifAssetVirtualPath = UrlHelpers.Combine(STYLES_DIRECTORY_VIRTUAL_PATH, "headphone.gif");
            virtualFileSystemMock
                .Setup(fs => fs.FileExists(headphoneGifAssetVirtualPath))
                .Returns(true)
                ;
            virtualFileSystemMock
                .Setup(fs => fs.IsTextFile(headphoneGifAssetVirtualPath, 256, out encoding))
                .Returns(false)
                ;
            virtualFileSystemMock
                .Setup(fs => fs.GetFileBinaryContent(headphoneGifAssetVirtualPath))
                .Returns(new byte[0])
                ;

            string googlePlusSvgAssetVirtualPath = UrlHelpers.Combine(STYLES_DIRECTORY_VIRTUAL_PATH, "google-plus.svg");
            virtualFileSystemMock
                .Setup(fs => fs.FileExists(googlePlusSvgAssetVirtualPath))
                .Returns(true)
                ;
            virtualFileSystemMock
                .Setup(fs => fs.IsTextFile(googlePlusSvgAssetVirtualPath, 256, out encoding))
                .Returns(true)
                ;
            virtualFileSystemMock
                .Setup(fs => fs.GetFileTextContent(googlePlusSvgAssetVirtualPath))
                .Returns(string.Empty)
                ;

            string testLessImportSub1LessAssetVirtualPath = UrlHelpers.Combine(STYLES_DIRECTORY_VIRTUAL_PATH,
                "TestLessImport.Sub1.less");
            virtualFileSystemMock
                .Setup(fs => fs.FileExists(testLessImportSub1LessAssetVirtualPath))
                .Returns(true)
                ;
            virtualFileSystemMock
                .Setup(fs => fs.GetFileTextContent(testLessImportSub1LessAssetVirtualPath))
                .Returns(@"@import url(http://fonts.googleapis.com/css?family=Limelight&subset=latin,latin-ext);

            @border-color: #143352;

            .translators #less
            {
            border-color: @border-color;
            }

            .icon-network
            {
            display: inline;
            background-image: data-uri('image/png;base64', ""@network.png"");
            }

            @import url(""TagIcon.css"");")
                ;

            string networkPngAssetVirtualPath = UrlHelpers.Combine(STYLES_DIRECTORY_VIRTUAL_PATH, "@network.png");
            virtualFileSystemMock
                .Setup(fs => fs.FileExists(networkPngAssetVirtualPath))
                .Returns(true)
                ;
            virtualFileSystemMock
                .Setup(fs => fs.IsTextFile(networkPngAssetVirtualPath, 256, out encoding))
                .Returns(false)
                ;
            virtualFileSystemMock
                .Setup(fs => fs.GetFileBinaryContent(networkPngAssetVirtualPath))
                .Returns(new byte[0])
                ;

            string tagIconCssAssetVirtualPath = UrlHelpers.Combine(STYLES_DIRECTORY_VIRTUAL_PATH, "TagIcon.css");
            virtualFileSystemMock
                .Setup(fs => fs.FileExists(tagIconCssAssetVirtualPath))
                .Returns(true)
                ;
            virtualFileSystemMock
                .Setup(fs => fs.GetFileTextContent(tagIconCssAssetVirtualPath))
                .Returns(@".icon-tag
            {
            display: inline;
            background-image: url(tag.png) !important;
            }")
                ;

            string testLessImportSub2LessAssetVirtualPath = UrlHelpers.Combine(STYLES_DIRECTORY_VIRTUAL_PATH,
                "TestLessImport.Sub2.less");
            virtualFileSystemMock
                .Setup(fs => fs.FileExists(testLessImportSub2LessAssetVirtualPath))
                .Returns(true)
                ;
            virtualFileSystemMock
                .Setup(fs => fs.GetFileTextContent(testLessImportSub2LessAssetVirtualPath))
                .Returns(@"@import 'http://fonts.googleapis.com/css?family=Limelight&subset=latin,latin-ext';
            @import (css) ""UsbFlashDriveIcon"";
            @import (less) ""ValidationIcon.css"";
            @import (inline) ""MicroformatsIcon.css"";
            @import (inline, css) 'NodeIcon.less';
            @import (css) ""OpenIdIcon.less"";
            @import (optional) ""PrinterIcon.less"";
            @import (optional) ""NonExistentIcon.less"";")
                ;

            string usbFlashDriveIconCssAssetVirtualPath = UrlHelpers.Combine(STYLES_DIRECTORY_VIRTUAL_PATH,
                "UsbFlashDriveIcon.css");
            virtualFileSystemMock
                .Setup(fs => fs.FileExists(usbFlashDriveIconCssAssetVirtualPath))
                .Returns(true)
                ;
            virtualFileSystemMock
                .Setup(fs => fs.GetFileTextContent(usbFlashDriveIconCssAssetVirtualPath))
                .Returns(@".icon-usb-flash-drive
            {
            display: inline;
            background-image: ""usb-flash-drive.png"" !important;
            }")
                ;

            string validationIconCssAssetVirtualPath = UrlHelpers.Combine(STYLES_DIRECTORY_VIRTUAL_PATH,
                "ValidationIcon.css");
            virtualFileSystemMock
                .Setup(fs => fs.FileExists(validationIconCssAssetVirtualPath))
                .Returns(true)
                ;
            virtualFileSystemMock
                .Setup(fs => fs.GetFileTextContent(validationIconCssAssetVirtualPath))
                .Returns(@".icon-validation
            {
            display: inline;
            background-image: url('validation.png') !important;
            }")
                ;

            string microformatsIconCssAssetVirtualPath = UrlHelpers.Combine(STYLES_DIRECTORY_VIRTUAL_PATH,
                "MicroformatsIcon.css");
            virtualFileSystemMock
                .Setup(fs => fs.FileExists(microformatsIconCssAssetVirtualPath))
                .Returns(true)
                ;
            virtualFileSystemMock
                .Setup(fs => fs.GetFileTextContent(microformatsIconCssAssetVirtualPath))
                .Returns(@".icon-microformats
            {
            display: inline;
            background-image: url(microformats.png) !important;
            }")
                ;

            string nodeIconLessAssetVirtualPath = UrlHelpers.Combine(STYLES_DIRECTORY_VIRTUAL_PATH,
                "NodeIcon.less");
            virtualFileSystemMock
                .Setup(fs => fs.FileExists(nodeIconLessAssetVirtualPath))
                .Returns(true)
                ;
            virtualFileSystemMock
                .Setup(fs => fs.GetFileTextContent(nodeIconLessAssetVirtualPath))
                .Returns(@".icon-node
            {
            display: inline;
            background-image: url(node.png) !important;
            }")
                ;

            string openIdIconLessAssetVirtualPath = UrlHelpers.Combine(STYLES_DIRECTORY_VIRTUAL_PATH,
                "OpenIdIcon.less");
            virtualFileSystemMock
                .Setup(fs => fs.FileExists(openIdIconLessAssetVirtualPath))
                .Returns(true)
                ;
            virtualFileSystemMock
                .Setup(fs => fs.GetFileTextContent(openIdIconLessAssetVirtualPath))
                .Returns(@".icon-openid
            {
            display: inline;
            background-image: url(openid.png) !important;
            }")
                ;

            string printerIconLessAssetVirtualPath = UrlHelpers.Combine(STYLES_DIRECTORY_VIRTUAL_PATH,
                "PrinterIcon.less");
            virtualFileSystemMock
                .Setup(fs => fs.FileExists(printerIconLessAssetVirtualPath))
                .Returns(true)
                ;
            virtualFileSystemMock
                .Setup(fs => fs.GetFileTextContent(printerIconLessAssetVirtualPath))
                .Returns(@".icon-printer
            {
            display: inline;
            background-image: url(printer.png) !important;
            }")
                ;

            string nonExistentIconLessAssetVirtualPath = UrlHelpers.Combine(STYLES_DIRECTORY_VIRTUAL_PATH,
                "NonExistentIcon.less");
            virtualFileSystemMock
                .Setup(fs => fs.FileExists(nonExistentIconLessAssetVirtualPath))
                .Returns(false)
                ;

            Func<IJsEngine> createJsEngineInstance = () => (new Mock<IJsEngine>()).Object;
            IVirtualFileSystemWrapper virtualFileSystemWrapper = virtualFileSystemMock.Object;
            IRelativePathResolver relativePathResolver = new MockRelativePathResolver();
            var lessConfig = new LessSettings();

            var lessTranslator = new LessTranslator(createJsEngineInstance,
                virtualFileSystemWrapper, relativePathResolver, lessConfig);
            const string assetContent = @"@import (once) ""Mixins.less"";
            @import (reference) ""Selectors.less"";
            @import url(""data:text/css;base64,Ym9keSB7IGJhY2tncm91bmQtY29sb3I6IGxpbWUgIWltcG9ydGFudDsgfQ=="");

            @bg-color: #7AC0DA;
            @caption-color: #FFFFFF;
            @monitor-icon-url: ""monitor.png"";

            .translators #less
            {
            float: left;
            .visible();
            padding: 0.2em 0.5em 0.2em 0.5em;
            background-color: @bg-color;
            color: @caption-color;
            font-weight: bold;
            border: 1px solid @bg-color;
            .border-radius(5px);
            }

            .icon-monitor
            {
            display: inline;
            background-image: url(""@{monitor-icon-url}"");
            }

            @import (once) ""TestLessImport.less"";";
            string assetUrl = UrlHelpers.Combine(STYLES_DIRECTORY_URL, "TestLess.less");
            LessStylesheet stylesheet = lessTranslator.PreprocessStylesheet(assetContent, assetUrl,
                new LessImportOptions(".less"));
            var dependencies = new DependencyCollection();

            // Act
            lessTranslator.FillDependencies(assetUrl, stylesheet, dependencies);

            // Assert
            Assert.AreEqual(17, dependencies.Count);

            Dependency mixinsLessAsset = dependencies[0];
            Dependency selectorsLessAsset = dependencies[1];
            Dependency testLessImportLessAsset = dependencies[2];
            Dependency headphoneGifAsset = dependencies[3];
            Dependency googlePlusSvgAsset = dependencies[4];
            Dependency testLessImportSub1LessAsset = dependencies[5];
            Dependency networkPngAsset = dependencies[6];
            Dependency googleFontAsset = dependencies[7];
            Dependency tagIconCssAsset = dependencies[8];
            Dependency testLessImportSub2LessAsset = dependencies[9];
            Dependency usbFlashDriveIconCssAsset = dependencies[10];
            Dependency validationIconCssAsset = dependencies[11];
            Dependency microformatsIconCssAsset = dependencies[12];
            Dependency nodeIconLessAsset = dependencies[13];
            Dependency openIdIconLessAsset = dependencies[14];
            Dependency printerIconLessAsset = dependencies[15];
            Dependency nonExistentIconLessAsset = dependencies[16];

            Assert.AreEqual(mixinsLessAssetVirtualPath, mixinsLessAsset.Url);
            Assert.AreEqual(true, mixinsLessAsset.IsObservable);

            Assert.AreEqual(selectorsLessAssetVirtualPath, selectorsLessAsset.Url);
            Assert.AreEqual(true, selectorsLessAsset.IsObservable);

            Assert.AreEqual(testLessImportLessAssetVirtualPath, testLessImportLessAsset.Url);
            Assert.AreEqual(true, testLessImportLessAsset.IsObservable);

            Assert.AreEqual(headphoneGifAssetVirtualPath, headphoneGifAsset.Url);
            Assert.AreEqual(true, headphoneGifAsset.IsObservable);

            Assert.AreEqual(googlePlusSvgAssetVirtualPath, googlePlusSvgAsset.Url);
            Assert.AreEqual(true, googlePlusSvgAsset.IsObservable);

            Assert.AreEqual(testLessImportSub1LessAssetVirtualPath, testLessImportSub1LessAsset.Url);
            Assert.AreEqual(true, testLessImportSub1LessAsset.IsObservable);

            Assert.AreEqual(networkPngAssetVirtualPath, networkPngAsset.Url);
            Assert.AreEqual(true, networkPngAsset.IsObservable);

            Assert.AreEqual("http://fonts.googleapis.com/css?family=Limelight&subset=latin,latin-ext",
                googleFontAsset.Url);
            Assert.AreEqual(false, googleFontAsset.IsObservable);

            Assert.AreEqual(tagIconCssAssetVirtualPath, tagIconCssAsset.Url);
            Assert.AreEqual(false, tagIconCssAsset.IsObservable);

            Assert.AreEqual(testLessImportSub2LessAssetVirtualPath, testLessImportSub2LessAsset.Url);
            Assert.AreEqual(true, testLessImportSub2LessAsset.IsObservable);

            Assert.AreEqual(usbFlashDriveIconCssAssetVirtualPath, usbFlashDriveIconCssAsset.Url);
            Assert.AreEqual(false, usbFlashDriveIconCssAsset.IsObservable);

            Assert.AreEqual(validationIconCssAssetVirtualPath, validationIconCssAsset.Url);
            Assert.AreEqual(true, validationIconCssAsset.IsObservable);

            Assert.AreEqual(microformatsIconCssAssetVirtualPath, microformatsIconCssAsset.Url);
            Assert.AreEqual(true, microformatsIconCssAsset.IsObservable);

            Assert.AreEqual(nodeIconLessAssetVirtualPath, nodeIconLessAsset.Url);
            Assert.AreEqual(true, nodeIconLessAsset.IsObservable);

            Assert.AreEqual(openIdIconLessAssetVirtualPath, openIdIconLessAsset.Url);
            Assert.AreEqual(false, openIdIconLessAsset.IsObservable);

            Assert.AreEqual(printerIconLessAssetVirtualPath, printerIconLessAsset.Url);
            Assert.AreEqual(true, printerIconLessAsset.IsObservable);

            Assert.AreEqual(nonExistentIconLessAssetVirtualPath, nonExistentIconLessAsset.Url);
            Assert.AreEqual(true, nonExistentIconLessAsset.IsObservable);
        }
        public void FillingOfDependenciesIsCorrect()
        {
            // Arrange
            var virtualFileSystemMock = new Mock<IVirtualFileSystemWrapper>();

            string jqueryTsAssetVirtualPath = UrlHelpers.Combine(SCRIPTS_DIRECTORY_VIRTUAL_PATH,
                "jquery.d.ts");
            virtualFileSystemMock
                .Setup(fs => fs.FileExists(jqueryTsAssetVirtualPath))
                .Returns(true)
                ;
            virtualFileSystemMock
                .Setup(fs => fs.GetFileTextContent(jqueryTsAssetVirtualPath))
                .Returns("")
                ;

            string iTranslatorBadgeTsAssetVirtualPath = UrlHelpers.Combine(SCRIPTS_DIRECTORY_VIRTUAL_PATH,
                "ITranslatorBadge.d.ts");
            virtualFileSystemMock
                .Setup(fs => fs.FileExists(iTranslatorBadgeTsAssetVirtualPath))
                .Returns(true)
                ;
            virtualFileSystemMock
                .Setup(fs => fs.GetFileTextContent(iTranslatorBadgeTsAssetVirtualPath))
                .Returns(@"interface ITranslatorBadge {
            getText(): string;
            setText(text: string): void;
            show(): void;
            hide(): void;
            }")
                ;

            string translatorBadgeTsAssetVirtualPath = UrlHelpers.Combine(SCRIPTS_DIRECTORY_VIRTUAL_PATH,
                "TranslatorBadge.ts");
            virtualFileSystemMock
                .Setup(fs => fs.FileExists(translatorBadgeTsAssetVirtualPath))
                .Returns(true)
                ;
            virtualFileSystemMock
                .Setup(fs => fs.GetFileTextContent(translatorBadgeTsAssetVirtualPath))
                .Returns(@"/// <reference path=""jquery.d.ts"" />
            /*
            /// <reference path=""typings/knockout/knockout.d.ts"" />
            */
            /// <reference path=""//netdna.bootstrapcdn.com/bootstrap/3.0.0/typings/bootstrap.d.ts"" />
            /// <reference path=""ITranslatorBadge.d.ts"" />

            class TranslatorBadge implements ITranslatorBadge {
            public $badgeElem: any;
            public $linkElem: any;

            constructor (public elementId: string) {
            this.$badgeElem = jQuery(""#"" + elementId);
            this.$linkElem = this.$badgeElem.find(""A:first"");
            }

            public getText(): string {
            return this.$linkElem.text();
            }

            public setText(text: string): void {
            this.$linkElem.text(text);
            }

            public show(): void {
            this.$badgeElem.show(0);
            }

            public hide(): void {
            this.$badgeElem.hide(0);
            }
            }")
                ;

            string coloredTranslatorBadgeTsAssetVirtualPath = UrlHelpers.Combine(SCRIPTS_DIRECTORY_VIRTUAL_PATH,
                "ColoredTranslatorBadge.ts");
            virtualFileSystemMock
                .Setup(fs => fs.FileExists(coloredTranslatorBadgeTsAssetVirtualPath))
                .Returns(true)
                ;
            virtualFileSystemMock
                .Setup(fs => fs.GetFileTextContent(coloredTranslatorBadgeTsAssetVirtualPath))
                .Returns(@"/// <reference path=""jquery.d.ts"" />
            /// <reference path=""TranslatorBadge.ts"" />

            class ColoredTranslatorBadge extends TranslatorBadge {
            public getTextColor(): string {
            return this.$linkElem.css(""color"");
            }

            public setTextColor(color: string): void {
            this.$linkElem.css(""color"", color);
            }

            public getBorderColor(): string {
            return this.$badgeElem.css(""border-color"");
            }

            public setBorderColor(color: string) {
            this.$badgeElem.css(""border-color"", color);
            }
            }")
                ;

            Func<IJsEngine> createJsEngineInstance = () => (new Mock<IJsEngine>()).Object;
            IVirtualFileSystemWrapper virtualFileSystemWrapper = virtualFileSystemMock.Object;
            var relativePathResolver = new MockRelativePathResolver();
            var tsConfig = new TypeScriptSettings();

            var tsTranslator = new TypeScriptTranslator(createJsEngineInstance,
                virtualFileSystemWrapper, relativePathResolver, tsConfig);

            const string assetContent = @"/// <reference path=""ColoredTranslatorBadge.ts"" />
            var TS_BADGE_TEXT = ""TypeScript"";
            var TS_BADGE_COLOR = ""#0074C1"";

            var tsBadge = new ColoredTranslatorBadge(""ts"");
            tsBadge.setText(TS_BADGE_TEXT);
            tsBadge.setTextColor(TS_BADGE_COLOR);
            tsBadge.setBorderColor(TS_BADGE_COLOR);";
            string assetUrl = UrlHelpers.Combine(SCRIPTS_DIRECTORY_URL, "TestTypeScript.ts");
            TsScript script = tsTranslator.PreprocessScript(assetContent, assetUrl);
            var dependencies = new DependencyCollection();

            // Act
            tsTranslator.FillDependencies(assetUrl, script, dependencies);

            // Assert
            Assert.AreEqual(4, dependencies.Count);

            Dependency coloredTranslatorBadgeTsAsset = dependencies[0];
            Dependency jqueryTsAsset = dependencies[1];
            Dependency translatorBadgeTsAsset = dependencies[2];
            Dependency iTranslatorBadgeTsAsset = dependencies[3];

            Assert.AreEqual(coloredTranslatorBadgeTsAssetVirtualPath, coloredTranslatorBadgeTsAsset.Url);
            Assert.AreEqual(true, coloredTranslatorBadgeTsAsset.IsObservable);

            Assert.AreEqual(jqueryTsAssetVirtualPath, jqueryTsAsset.Url);
            Assert.AreEqual(true, jqueryTsAsset.IsObservable);

            Assert.AreEqual(translatorBadgeTsAssetVirtualPath, translatorBadgeTsAsset.Url);
            Assert.AreEqual(true, translatorBadgeTsAsset.IsObservable);

            Assert.AreEqual(iTranslatorBadgeTsAssetVirtualPath, iTranslatorBadgeTsAsset.Url);
            Assert.AreEqual(true, iTranslatorBadgeTsAsset.IsObservable);
        }