private async Task <string> ExecuteServerSide(string testName, string templateFile, string dataFile)
        {
            var cacheProvider  = new NullCacheProvider();
            var namingRule     = new NamingRule();
            var handlerFactory = new NullRenderingHelperHandlerFactory();

            var templateInfo = new FileTemplateInfo(testName, PathInfo.Create(templateFile), new FileSystem());

            var   viewEngine = new VeilViewEngine(cacheProvider, handlerFactory, namingRule);
            IView view       = await viewEngine.CreateViewAsync(templateInfo).ConfigureAwait(false);

            if (view == null)
            {
                Assert.Fail("Could not create view from file'{0}'.", templateFile);
            }

            object model;

            using (var reader = new StreamReader(dataFile))
            {
                model = new JsonSerializer().Deserialize(reader, typeof(Dictionary <string, object>));
            }

            this.TestContext.BeginTimer("Server");
            var builder = new StringBuilder();

            using (var writer = new StringWriterDelayed(builder))
            {
                view.Render(model, new RenderingContext(writer));
            }
            var resultString = builder.ToString();

            this.TestContext.EndTimer("Server");
            return(resultString);
        }
        private string ExecuteClientSide(string testName, string templateFile, string dataFile)
        {
            var namingRule     = new NamingRule();
            var handlerFactory = new NullRenderingHelperHandlerFactory();

            var clientGenerator = new ClientTemplateGenerator(handlerFactory, new MemberLocatorFromNamingRule(namingRule));
            var generator       = new JavascriptClientTemplateGenerator("repo", clientGenerator);

            var templateInfo = new FileTemplateInfo(testName, PathInfo.Create(templateFile), new FileSystem());
            var view         = generator.Generate(templateInfo);

            Dictionary <string, object> model;

            using (var reader = new StreamReader(dataFile))
            {
                model = (Dictionary <string, object>) new JavaScriptSerializer().Deserialize(reader.ReadToEnd(), typeof(Dictionary <string, object>));
            }

            CleanupModel(model);

            this.TestContext.BeginTimer("JS Rendering");
            var result = JavascriptClientTest.ExecuteJavascript(view, model, testName);

            this.TestContext.EndTimer("JS Rendering");

            return(result);
        }
        private async Task <string> ExecuteServerSideStrongModel(string testName, string templateFile, string dataFile)
        {
            var cacheProvider  = new NullCacheProvider();
            var namingRule     = new NamingRule();
            var handlerFactory = new NullRenderingHelperHandlerFactory();

            var templateInfo = new FileTemplateInfo(testName, PathInfo.Create(templateFile), new FileSystem());

            var schemaProvider = new HandlebarsViewSchemaProvider(handlerFactory, new MemberLocatorFromNamingRule(namingRule));

            var generator = new JsonSchemaCodeGenerator(namingRule);
            var schema    = await schemaProvider.GetSchemaFromTemplateAsync(templateInfo).ConfigureAwait(false);

            schema.Title = "Model";
            var modelType = generator.Compile(schema);

            var viewEngine = new VeilViewEngine(cacheProvider, handlerFactory, namingRule);
            var view       = await viewEngine.CreateViewAsync(templateInfo, modelType).ConfigureAwait(false);

            if (view == null)
            {
                Assert.Fail("Could not create view from file '{0}'.", templateFile);
            }

            object model;

            using (var reader = new JsonTextReader(new StreamReader(dataFile)))
            {
                model = JsonSerializer.Create().Deserialize(reader, modelType);
            }

            this.TestContext.BeginTimer("ServerStrong");
            var builder = new StringBuilder();

            using (var writer = new StringWriterDelayed(builder))
            {
                view.Render(model, new RenderingContext(writer));
            }
            var resultString = builder.ToString();

            this.TestContext.EndTimer("ServerStrong");
            return(resultString);
        }