public void ConfigurationManager_GetHtmlTransformersSection_HtmlTransformers_ShouldDependOnLocations()
        {
            string physicalDirectoryPath = AppDomain.CurrentDomain.BaseDirectory;
            IFileTransfer fileTransfer = new FileTransfer(new FileSystem(), physicalDirectoryPath, physicalDirectoryPath);
            fileTransfer.AddFile(string.Format(CultureInfo.InvariantCulture, @"{0}\Configuration\Test-configurations\HtmlTransformersSectionTest.DifferentLocations.Web.config", AppDomain.CurrentDomain.BaseDirectory), Path.Combine(physicalDirectoryPath, "Web.config"));

            SimulatedVirtualPathProvider simulatedVirtualPathProvider = new SimulatedVirtualPathProvider();
            simulatedVirtualPathProvider.VirtualFiles.CreateWithDefaultWebFormContentAndAddFile("/Default.aspx");
            simulatedVirtualPathProvider.VirtualFiles.CreateWithDefaultWebFormContentAndAddFile("/FiveItemsUsingAddAndRemove/Default.aspx");
            simulatedVirtualPathProvider.VirtualFiles.CreateWithDefaultWebFormContentAndAddFile("/NoItemsUsingClear/Default.aspx");
            simulatedVirtualPathProvider.VirtualFiles.CreateWithDefaultWebFormContentAndAddFile("/ThreeItemsUsingRemove/Default.aspx");
            simulatedVirtualPathProvider.VirtualFiles.CreateWithDefaultWebFormContentAndAddFile("/ThreeItemsUsingRemove/TwoItemsUsingAddAndRemove/Default.aspx");
            simulatedVirtualPathProvider.VirtualFiles.CreateWithDefaultWebFormContentAndAddFile("/ThreeItemsUsingRemove/TwoItemsUsingAddAndRemove/NoItemsUsingRemove/Default.aspx");

            using(VirtualApplicationHostProxy virtualApplicationHostProxy = new VirtualApplicationHostProxyFactory().Create(fileTransfer, simulatedVirtualPathProvider))
            {
                virtualApplicationHostProxy.AnyApplicationEvent += delegate(HttpApplicationEvent httpApplicationEvent)
                {
                    if(httpApplicationEvent != HttpApplicationEvent.PostRequestHandlerExecute)
                        return;

                    HttpRequest httpRequest = HttpContext.Current.Request;
                    HtmlTransformerElementCollection htmlTransformers = ((HtmlTransformersSection) ConfigurationManager.GetSection("hansKindberg.web/htmlTransformers")).HtmlTransformers;

                    if(httpRequest.RawUrl == "/Default.aspx")
                    {
                        Assert.AreEqual(5, htmlTransformers.Count);

                        Assert.AreEqual("One", htmlTransformers[0].Name);
                        Assert.AreEqual(typeof(HtmlTransformer), htmlTransformers[0].Type);

                        Assert.AreEqual("Two", htmlTransformers[1].Name);
                        Assert.AreEqual(typeof(HtmlTransformer), htmlTransformers[0].Type);

                        Assert.AreEqual("Three", htmlTransformers[2].Name);
                        Assert.AreEqual(typeof(HtmlTransformer), htmlTransformers[0].Type);

                        Assert.AreEqual("Four", htmlTransformers[3].Name);
                        Assert.AreEqual(typeof(HtmlTransformer), htmlTransformers[0].Type);

                        Assert.AreEqual("Five", htmlTransformers[4].Name);
                        Assert.AreEqual(typeof(HtmlTransformer), htmlTransformers[0].Type);

                        return;
                    }

                    if(httpRequest.RawUrl == "/FiveItemsUsingAddAndRemove/Default.aspx")
                    {
                        Assert.AreEqual(5, htmlTransformers.Count);

                        Assert.AreEqual("One", htmlTransformers[0].Name);
                        Assert.AreEqual(typeof(HtmlTransformer), htmlTransformers[0].Type);

                        Assert.AreEqual("Two", htmlTransformers[1].Name);
                        Assert.AreEqual(typeof(HtmlTransformer), htmlTransformers[0].Type);

                        Assert.AreEqual("Three", htmlTransformers[2].Name);
                        Assert.AreEqual(typeof(HtmlTransformer), htmlTransformers[0].Type);

                        Assert.AreEqual("Six", htmlTransformers[3].Name);
                        Assert.AreEqual(typeof(HtmlTransformer), htmlTransformers[0].Type);

                        Assert.AreEqual("Seven", htmlTransformers[4].Name);
                        Assert.AreEqual(typeof(HtmlTransformer), htmlTransformers[0].Type);

                        return;
                    }

                    if(httpRequest.RawUrl == "/NoItemsUsingClear/Default.aspx")
                    {
                        Assert.AreEqual(0, htmlTransformers.Count);

                        return;
                    }

                    if(httpRequest.RawUrl == "/ThreeItemsUsingRemove/Default.aspx")
                    {
                        Assert.AreEqual(3, htmlTransformers.Count);

                        Assert.AreEqual("One", htmlTransformers[0].Name);
                        Assert.AreEqual(typeof(HtmlTransformer), htmlTransformers[0].Type);

                        Assert.AreEqual("Two", htmlTransformers[1].Name);
                        Assert.AreEqual(typeof(HtmlTransformer), htmlTransformers[0].Type);

                        Assert.AreEqual("Three", htmlTransformers[2].Name);
                        Assert.AreEqual(typeof(HtmlTransformer), htmlTransformers[0].Type);

                        return;
                    }

                    if(httpRequest.RawUrl == "/ThreeItemsUsingRemove/TwoItemsUsingAddAndRemove/Default.aspx")
                    {
                        Assert.AreEqual(2, htmlTransformers.Count);

                        Assert.AreEqual("Four", htmlTransformers[0].Name);
                        Assert.AreEqual(typeof(HtmlTransformer), htmlTransformers[0].Type);

                        Assert.AreEqual("Five", htmlTransformers[1].Name);
                        Assert.AreEqual(typeof(HtmlTransformer), htmlTransformers[0].Type);

                        return;
                    }

                    if(httpRequest.RawUrl == "/ThreeItemsUsingRemove/TwoItemsUsingAddAndRemove/NoItemsUsingRemove/Default.aspx")
                    {
                        Assert.AreEqual(0, htmlTransformers.Count);

                        return;
                    }

                    throw new InvalidOperationException("There is an error in the test.");
                };

                virtualApplicationHostProxy.Run(browsingSession =>
                {
                    RequestResult requestResult = browsingSession.ProcessRequest("/Default.aspx");

                    Exception exception = requestResult.LastException;
                    if(exception != null)
                    {
                        if(exception is UnitTestAssertException)
                            throw exception;

                        Assert.Fail("{0}: {1}", requestResult.LastException.GetType(), requestResult.LastException.Message);
                    }

                    requestResult = browsingSession.ProcessRequest("/FiveItemsUsingAddAndRemove/Default.aspx");

                    exception = requestResult.LastException;
                    if(exception != null)
                    {
                        if(exception is UnitTestAssertException)
                            throw exception;

                        Assert.Fail("{0}: {1}", requestResult.LastException.GetType(), requestResult.LastException.Message);
                    }

                    requestResult = browsingSession.ProcessRequest("/NoItemsUsingClear/Default.aspx");

                    exception = requestResult.LastException;
                    if(exception != null)
                    {
                        if(exception is UnitTestAssertException)
                            throw exception;

                        Assert.Fail("{0}: {1}", requestResult.LastException.GetType(), requestResult.LastException.Message);
                    }

                    requestResult = browsingSession.ProcessRequest("/ThreeItemsUsingRemove/Default.aspx");

                    exception = requestResult.LastException;
                    if(exception != null)
                    {
                        if(exception is UnitTestAssertException)
                            throw exception;

                        Assert.Fail("{0}: {1}", requestResult.LastException.GetType(), requestResult.LastException.Message);
                    }

                    requestResult = browsingSession.ProcessRequest("/ThreeItemsUsingRemove/TwoItemsUsingAddAndRemove/Default.aspx");

                    exception = requestResult.LastException;
                    if(exception != null)
                    {
                        if(exception is UnitTestAssertException)
                            throw exception;

                        Assert.Fail("{0}: {1}", requestResult.LastException.GetType(), requestResult.LastException.Message);
                    }

                    requestResult = browsingSession.ProcessRequest("/ThreeItemsUsingRemove/TwoItemsUsingAddAndRemove/NoItemsUsingRemove/Default.aspx");

                    exception = requestResult.LastException;
                    if(exception != null)
                    {
                        if(exception is UnitTestAssertException)
                            throw exception;

                        Assert.Fail("{0}: {1}", requestResult.LastException.GetType(), requestResult.LastException.Message);
                    }
                });
            }
        }