/// <summary>
        /// Constructs a instance of Andrey Sitnik's Autoprefix CSS postprocessor
        /// </summary>
        /// <param name="createJsEngineInstance">Delegate that creates an instance of JS engine</param>
        /// <param name="virtualFileSystemWrapper">Virtual file system wrapper</param>
        /// <param name="autoprefixerConfig">Configuration settings of Andrey Sitnik's Autoprefix CSS postprocessor</param>
        public AutoprefixCssPostProcessor(Func <IJsEngine> createJsEngineInstance,
                                          IVirtualFileSystemWrapper virtualFileSystemWrapper,
                                          AutoprefixerSettings autoprefixerConfig)
        {
            _virtualFileSystemWrapper = virtualFileSystemWrapper;

            Browsers = autoprefixerConfig.Browsers
                       .Cast <BrowserConditionalExpression>()
                       .Select(b => b.ConditionalExpression)
                       .ToList()
            ;
            Cascade  = autoprefixerConfig.Cascade;
            Add      = autoprefixerConfig.Add;
            Remove   = autoprefixerConfig.Remove;
            Supports = autoprefixerConfig.Supports;
            Flexbox  = autoprefixerConfig.Flexbox;
            Grid     = autoprefixerConfig.Grid;
            IgnoreUnknownVersions = autoprefixerConfig.IgnoreUnknownVersions;
            Stats = autoprefixerConfig.Stats;

            if (createJsEngineInstance == null)
            {
                string jsEngineName = autoprefixerConfig.JsEngine.Name;
                if (string.IsNullOrWhiteSpace(jsEngineName))
                {
                    throw new ConfigurationErrorsException(
                              string.Format(CoreStrings.Configuration_JsEngineNotSpecified,
                                            "autoprefixer",
                                            @"
  * JavaScriptEngineSwitcher.Msie (only in the Chakra JsRT modes)
  * JavaScriptEngineSwitcher.V8
  * JavaScriptEngineSwitcher.ChakraCore (while it is recommended to use version 3.1.1)",
                                            "MsieJsEngine")
                              );
                }

                createJsEngineInstance = () => JsEngineSwitcher.Current.CreateEngine(jsEngineName);
            }
            _createJsEngineInstance = createJsEngineInstance;
        }
        public void FillingOfDependenciesIsCorrect()
        {
            // Arrange
            var virtualFileSystemMock = new Mock <IVirtualFileSystemWrapper>();

            string testCssAssetVirtualPath = UrlHelpers.Combine(STYLES_DIRECTORY_VIRTUAL_PATH, "Test.css");

            virtualFileSystemMock
            .Setup(fs => fs.ToAbsolutePath(testCssAssetVirtualPath))
            .Returns(testCssAssetVirtualPath)
            ;
            virtualFileSystemMock
            .Setup(fs => fs.FileExists(testCssAssetVirtualPath))
            .Returns(true)
            ;
            virtualFileSystemMock
            .Setup(fs => fs.GetFileTextContent(testCssAssetVirtualPath))
            .Returns(@":fullscreen a
{
	display: flex
}")
            ;

            const string customStatisticsFileVirtualPath = "~/App_Data/BundleTransformer/stats.json";

            virtualFileSystemMock
            .Setup(fs => fs.ToAbsolutePath(customStatisticsFileVirtualPath))
            .Returns(customStatisticsFileVirtualPath.Replace("~/", "/"))
            ;
            virtualFileSystemMock
            .Setup(fs => fs.FileExists(customStatisticsFileVirtualPath))
            .Returns(true)
            ;
            virtualFileSystemMock
            .Setup(fs => fs.GetFileTextContent(customStatisticsFileVirtualPath))
            .Returns(@"{
	""name"": ""All data of website"",
	""id"": ""90598522|undefined"",
	""type"": ""custom"",
	""source"": ""google_analytics"",
	""dataByBrowser"": {},
	""meta"": {
		""start_date"": ""2015-12-20"",
		""end_date"": ""2016-01-19""
	},
	""uid"": ""custom.90598522|undefined""
}")
            ;

            Func <IJsEngine> createJsEngineInstance =
                () => JsEngineSwitcher.Instance.CreateDefaultEngine();
            IVirtualFileSystemWrapper virtualFileSystemWrapper = virtualFileSystemMock.Object;
            var autoprefixerConfig = new AutoprefixerSettings
            {
                Stats = customStatisticsFileVirtualPath
            };

            var autoprefixCssPostProcessor = new AutoprefixCssPostProcessor(createJsEngineInstance,
                                                                            virtualFileSystemWrapper, autoprefixerConfig);
            IAsset asset = new Asset(testCssAssetVirtualPath, virtualFileSystemWrapper);

            // Act
            asset = autoprefixCssPostProcessor.PostProcess(asset);
            IList <string> dependencies = asset.VirtualPathDependencies;

            // Assert
            Assert.Equal(1, dependencies.Count);
            Assert.Equal("/App_Data/BundleTransformer/stats.json", dependencies[0]);
        }
		/// <summary>
		/// Constructs a instance of Andrey Sitnik's Autoprefix CSS-postprocessor
		/// </summary>
		/// <param name="createJsEngineInstance">Delegate that creates an instance of JavaScript engine</param>
		/// <param name="autoprefixerConfig">Configuration settings of Andrey Sitnik's Autoprefix CSS-postprocessor</param>
		public AutoprefixCssPostProcessor(Func<IJsEngine> createJsEngineInstance, AutoprefixerSettings autoprefixerConfig)
		{
			Browsers = autoprefixerConfig.Browsers
				.Cast<BrowserConditionalExpression>()
				.Select(b => b.ConditionalExpression)
				.ToList()
				;
			Cascade = autoprefixerConfig.Cascade;
			Remove = autoprefixerConfig.Remove;
			Add = autoprefixerConfig.Add;

			if (createJsEngineInstance == null)
			{
				string jsEngineName = autoprefixerConfig.JsEngine.Name;
				if (string.IsNullOrWhiteSpace(jsEngineName))
				{
					throw new ConfigurationErrorsException(
						string.Format(CoreStrings.Configuration_JsEngineNotSpecified,
							"autoprefixer",
							@"
  * JavaScriptEngineSwitcher.Msie
  * JavaScriptEngineSwitcher.V8",
							"MsieJsEngine")
					);
				}

				createJsEngineInstance = (() =>
					JsEngineSwitcher.Current.CreateJsEngineInstance(jsEngineName));
			}
			_createJsEngineInstance = createJsEngineInstance;
		}