public void NoPageDirective_NothingWrong() { var compilationInfo = new TemplateCompilationInfo("name"); compilationInfo.OriginalLines = ToInputLines(@""); var step = new ExtractPageDirectiveStep(); step.Execute(compilationInfo); Assert.That(compilationInfo.OriginalLines[0].Processed, Is.False); Assert.That(compilationInfo.PageDirective, Is.Null); }
public void TwoPageDirectives_Throws() { var compilationInfo = new TemplateCompilationInfo("name"); compilationInfo.OriginalLines = ToInputLines( @"<%@Page Language=""C#""%>", @"<%@Page Language=""C#""%>"); var step = new ExtractPageDirectiveStep(); Assert.Throws<Exception>(() => step.Execute(compilationInfo) ); }
public void PageDirectivewithInheritsAttribute_BaseClassIsSet() { var compilationInfo = new TemplateCompilationInfo("name"); compilationInfo.OriginalLines = ToInputLines(@"<%@Page Language=""C#"" Inherits=""Foo""%>"); var step = new ExtractPageDirectiveStep(); step.Execute(compilationInfo); Assert.That(compilationInfo.OriginalLines[0].Processed, Is.True); Assert.That(compilationInfo.PageDirective, Is.Not.Null); Assert.That(compilationInfo.PageDirective.LineNo, Is.EqualTo(1)); Assert.That(compilationInfo.PageDirective.BaseClass, Is.EqualTo("Foo")); }
public void DummyPageDirective_FoundAndProcessed() { var compilationInfo = new TemplateCompilationInfo("name"); compilationInfo.OriginalLines = ToInputLines(@"<%@Page Language=""C#""%>"); var step = new ExtractPageDirectiveStep(); step.Execute(compilationInfo); Assert.That(compilationInfo.OriginalLines[0].Processed, Is.True); Assert.That(compilationInfo.PageDirective, Is.Not.Null); Assert.That(compilationInfo.PageDirective.LineNo, Is.EqualTo(1)); Assert.That(compilationInfo.PageDirective.BaseClass, Is.Null); }
public void MultipleDirectives_Processed() { var compilationInfo = new TemplateCompilationInfo("name"); compilationInfo.OriginalLines = ToInputLines( @"<%@ Import Namespace=""Larry.Bird.Is.The.Best.Forward.In.History""%>", @"<%@ Import Namespace=""Tom.Chambres.Is.Not""%>"); var step = new ImportDirectivesStep(); step.Execute(compilationInfo); Assert.That(compilationInfo.UsingDirectives.Count, Is.EqualTo(2)); Assert.That(compilationInfo.OriginalLines[0].Processed, Is.True); Assert.That(compilationInfo.UsingDirectives[0].OriginalLineNo, Is.EqualTo(1)); Assert.That(compilationInfo.UsingDirectives[0].Using, Is.EqualTo("Larry.Bird.Is.The.Best.Forward.In.History")); Assert.That(compilationInfo.OriginalLines[1].Processed, Is.True); Assert.That(compilationInfo.UsingDirectives[1].OriginalLineNo, Is.EqualTo(2)); Assert.That(compilationInfo.UsingDirectives[1].Using, Is.EqualTo("Tom.Chambres.Is.Not")); }
public void NoDirective_NothingHappened() { var compilationInfo = new TemplateCompilationInfo("name"); compilationInfo.OriginalLines = ToInputLines(@"bla"); var step = new ImportDirectivesStep(); step.Execute(compilationInfo); Assert.That(compilationInfo.UsingDirectives.Count, Is.EqualTo(0)); Assert.That(compilationInfo.OriginalLines[0].Processed, Is.False); }
public override Type Compile(string name, string content) { var templateInfo = new TemplateCompilationInfo(name); var contentLines = content.Split(new[] {Environment.NewLine}, StringSplitOptions.None); templateInfo.OriginalLines = new TemplateCompilationInfo.InputLine[contentLines.Length]; for (var lineNumber = 1; lineNumber <= contentLines.Length; ++lineNumber) { templateInfo.OriginalLines[lineNumber - 1] = new TemplateCompilationInfo.InputLine { Content = contentLines[lineNumber - 1], LineNumber = lineNumber }; } string structure = @"#line hidden {4} #line hidden public class {0} : #line {5} {2} #line hidden {{ protected override string Name {{ get {{ return ""{3}""; }} }} public override void Render() {{ {1} }} }} "; new ExtractPageDirectiveStep().Execute(templateInfo); new DetermineBaseClassStep().Execute(templateInfo); new ImportDirectivesStep().Execute(templateInfo); var usingBlock = string.Empty; if (templateInfo.UsingDirectives.Count>0) usingBlock = templateInfo.UsingDirectives .Select(d => "#line " + d.OriginalLineNo + Environment.NewLine + "using " + d.Using + ";") .Aggregate((u1, u2) => u1 + Environment.NewLine + u2); var baseClass = templateInfo.CustomBaseClass ?? DefaultBaseClass; var baseClassLine = templateInfo.CustomBaseClass != null ? templateInfo.PageDirective.LineNo.ToString() : "hidden"; var className = GetClassName(templateInfo.Name); new ProcessBlocksStep().Execute(templateInfo); var renderBody = templateInfo.Blocks.Select(b => b.GetCode()).Aggregate((b1, b2) => b1 + Environment.NewLine + b2); var generatedClass = string.Format(structure, className, renderBody, baseClass, name, usingBlock, baseClassLine); var codeProvider = GetCodeProvider(); var parameters = new CompilerParameters(); parameters.GenerateInMemory = true; parameters.GenerateExecutable = false; parameters.ReferencedAssemblies.Add("System.dll"); parameters.ReferencedAssemblies.Add("System.Core.dll"); foreach (var assembly in _engine.ReferencesAssemblies) parameters.ReferencedAssemblies.Add(assembly); var result = codeProvider.CompileAssemblyFromSource(parameters, generatedClass); if (result.Errors.Count > 0) { var messages = result.Errors.Cast<CompilerError>().Select(err => err.ToString()); var message = messages.Aggregate("Could not compile "+name,(a, b) => a + Environment.NewLine + b); throw new Exception(message); } return result.CompiledAssembly.GetType(className); }