Skip to content

Commit b28d3a5

Browse files
committed
- Debugging templates see PR#111
- Template save/load format changed - TemplateNamespace no longer a paratemter - Removed unused asyncs in RazorEngineTemplateBase - Unit tests
1 parent 10765a6 commit b28d3a5

15 files changed

+513
-311
lines changed

RazorEngineCore.Tests/TestCompileAndRun.cs

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -753,5 +753,128 @@ private static List<MetadataReference> GetMetadataReferences()
753753
MetadataReference.CreateFromFile(Assembly.Load(new AssemblyName("System.Runtime")).Location)
754754
};
755755
}
756+
757+
758+
759+
[TestMethod]
760+
public void TestCompileAndRun_IncludeDebuggingForTypedMode_DisabledDebugging()
761+
{
762+
string templateText = @"
763+
@inherits RazorEngineCore.RazorEngineTemplateBase<RazorEngineCore.Tests.Models.TestModel>
764+
Hello @Model.Decorator(Model.C)
765+
";
766+
767+
RazorEngine razorEngine = new RazorEngine();
768+
IRazorEngineCompiledTemplate<RazorEngineTemplateBase<TestModel>> template = razorEngine.Compile<RazorEngineTemplateBase<TestModel>>(templateText, builder =>
769+
{
770+
builder.IncludeDebuggingInfo();
771+
});
772+
773+
string actual = template.Run(instance =>
774+
{
775+
instance.Model = new TestModel
776+
{
777+
C = "Alex"
778+
};
779+
});
780+
781+
Assert.AreEqual("Hello -=Alex=-", actual.Trim());
782+
}
783+
784+
[TestMethod]
785+
public void TestCompileAndRun_IncludeDebuggingForTypedAnonymous_DisabledDebugging()
786+
{
787+
RazorEngine razorEngine = new RazorEngine();
788+
IRazorEngineCompiledTemplate template = razorEngine.Compile("<h1>Hello @Model.Name</h1>", builder =>
789+
{
790+
builder.IncludeDebuggingInfo();
791+
});
792+
793+
string actual = template.Run(new
794+
{
795+
Name = "Alex"
796+
});
797+
798+
Assert.AreEqual("<h1>Hello Alex</h1>", actual);
799+
}
800+
801+
802+
803+
804+
[TestMethod]
805+
public void TestCompileAndRun_IncludeDebuggingForTypedMode_EnabledDebugging()
806+
{
807+
string templateText = @"
808+
@inherits RazorEngineCore.RazorEngineTemplateBase<RazorEngineCore.Tests.Models.TestModel>
809+
Hello @Model.Decorator(Model.C)
810+
";
811+
812+
RazorEngine razorEngine = new RazorEngine();
813+
IRazorEngineCompiledTemplate<RazorEngineTemplateBase<TestModel>> template = razorEngine.Compile<RazorEngineTemplateBase<TestModel>>(templateText, builder =>
814+
{
815+
builder.IncludeDebuggingInfo();
816+
});
817+
818+
template.EnableDebugging();
819+
820+
string actual = template.Run(instance =>
821+
{
822+
instance.Model = new TestModel
823+
{
824+
C = "Alex"
825+
};
826+
});
827+
828+
Assert.AreEqual("Hello -=Alex=-", actual.Trim());
829+
}
830+
831+
[TestMethod]
832+
public void TestCompileAndRun_IncludeDebuggingForTypedAnonymous_EnabledDebugging()
833+
{
834+
RazorEngine razorEngine = new RazorEngine();
835+
IRazorEngineCompiledTemplate template = razorEngine.Compile("<h1>Hello @Model.Name</h1>", builder =>
836+
{
837+
builder.IncludeDebuggingInfo();
838+
});
839+
840+
template.EnableDebugging();
841+
842+
string actual = template.Run(new
843+
{
844+
Name = "Alex"
845+
});
846+
847+
Assert.AreEqual("<h1>Hello Alex</h1>", actual);
848+
}
849+
850+
[TestMethod]
851+
public void TestCompileAndRun_Typed_EnabledDebuggingThrowsException()
852+
{
853+
string templateText = @"
854+
@inherits RazorEngineCore.RazorEngineTemplateBase<RazorEngineCore.Tests.Models.TestModel>
855+
Hello @Model.Decorator(Model.C)
856+
";
857+
858+
RazorEngine razorEngine = new RazorEngine();
859+
IRazorEngineCompiledTemplate<RazorEngineTemplateBase<TestModel>> template = razorEngine.Compile<RazorEngineTemplateBase<TestModel>>(templateText);
860+
861+
Assert.ThrowsException<RazorEngineException>(() =>
862+
{
863+
template.EnableDebugging();
864+
});
865+
}
866+
867+
[TestMethod]
868+
public void TestCompileAndRun_Anonymous_EnabledDebuggingThrowsException()
869+
{
870+
RazorEngine razorEngine = new RazorEngine();
871+
IRazorEngineCompiledTemplate template = razorEngine.Compile("<h1>Hello @Model.Name</h1>");
872+
873+
Assert.ThrowsException<RazorEngineException>(() =>
874+
{
875+
template.EnableDebugging();
876+
});
877+
878+
}
756879
}
757880
}

RazorEngineCore.Tests/TestSaveLoad.cs

Lines changed: 85 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
using System.IO;
1+
using System;
2+
using System.IO;
23
using System.Threading.Tasks;
34
using Microsoft.VisualStudio.TestTools.UnitTesting;
5+
using RazorEngineCore.Tests.Models;
46

57
namespace RazorEngineCore.Tests
68
{
@@ -24,7 +26,7 @@ public void TestSaveToStream()
2426

2527
Assert.AreEqual(initialTemplateResult, loadedTemplateResult);
2628
}
27-
29+
2830
[TestMethod]
2931
public async Task TestSaveToStreamAsync()
3032
{
@@ -44,7 +46,32 @@ public async Task TestSaveToStreamAsync()
4446
}
4547

4648
[TestMethod]
47-
public void TestSaveToFile()
49+
public void TestSaveToFile_Typed()
50+
{
51+
RazorEngine razorEngine = new RazorEngine();
52+
IRazorEngineCompiledTemplate<RazorEngineTemplateBase<TestModel>> initialTemplate = razorEngine.Compile<RazorEngineTemplateBase<TestModel>>("Hello @Model.A @Model.C");
53+
54+
initialTemplate.SaveToFile("testTemplate.dll");
55+
56+
IRazorEngineCompiledTemplate<RazorEngineTemplateBase<TestModel>> loadedTemplate = RazorEngineCompiledTemplate<RazorEngineTemplateBase<TestModel>>.LoadFromFile("testTemplate.dll");
57+
58+
Action<RazorEngineTemplateBase<TestModel>> action = initializer =>
59+
{
60+
initializer.Model = new TestModel()
61+
{
62+
A = 12345,
63+
C = "Alex"
64+
};
65+
};
66+
67+
string initialTemplateResult = initialTemplate.Run(action);
68+
string loadedTemplateResult = loadedTemplate.Run(action);
69+
70+
Assert.AreEqual(initialTemplateResult, loadedTemplateResult);
71+
}
72+
73+
[TestMethod]
74+
public void TestSaveToFile_Anonymous()
4875
{
4976
RazorEngine razorEngine = new RazorEngine();
5077
IRazorEngineCompiledTemplate initialTemplate = razorEngine.Compile("Hello @Model.Name");
@@ -74,5 +101,60 @@ public async Task TestSaveToFileAsync()
74101

75102
Assert.AreEqual(initialTemplateResult, loadedTemplateResult);
76103
}
104+
105+
[TestMethod]
106+
public async Task TestSave_RazorEngineCompiledTemplateMeta_1()
107+
{
108+
RazorEngineCompiledTemplateMeta meta1 = new RazorEngineCompiledTemplateMeta()
109+
{
110+
AssemblyByteCode = new byte[] { 1, 2, 3 },
111+
TemplateFileName = "name1",
112+
TemplateNamespace = "namespace1"
113+
};
114+
115+
MemoryStream memoryStream = new MemoryStream();
116+
117+
await meta1.Write(memoryStream);
118+
memoryStream.Position = 0;
119+
120+
RazorEngineCompiledTemplateMeta meta2 = await RazorEngineCompiledTemplateMeta.Read(memoryStream);
121+
122+
CollectionAssert.AreEqual(meta1.AssemblyByteCode, meta2.AssemblyByteCode);
123+
CollectionAssert.AreEqual(meta1.PdbByteCode, meta2.PdbByteCode);
124+
Assert.AreEqual(meta1.TemplateFileName, meta2.TemplateFileName);
125+
Assert.AreEqual(meta1.TemplateNamespace, meta2.TemplateNamespace);
126+
Assert.AreEqual(meta1.GeneratedSourceCode, meta2.GeneratedSourceCode);
127+
Assert.AreEqual(meta1.TemplateSource, meta2.TemplateSource);
128+
}
129+
130+
[TestMethod]
131+
public async Task TestSave_RazorEngineCompiledTemplateMeta_2()
132+
{
133+
RazorEngineCompiledTemplateMeta meta1 = new RazorEngineCompiledTemplateMeta()
134+
{
135+
AssemblyByteCode = new byte[] { 1, 2, 3 },
136+
PdbByteCode = new byte[] { 1, 2, 3 },
137+
TemplateFileName = "111",
138+
TemplateNamespace = "222",
139+
GeneratedSourceCode = "33333",
140+
TemplateSource = "44444"
141+
142+
};
143+
144+
MemoryStream memoryStream = new MemoryStream();
145+
146+
await meta1.Write(memoryStream);
147+
memoryStream.Position = 0;
148+
149+
RazorEngineCompiledTemplateMeta meta2 = await RazorEngineCompiledTemplateMeta.Read(memoryStream);
150+
151+
152+
CollectionAssert.AreEqual(meta1.AssemblyByteCode, meta2.AssemblyByteCode);
153+
CollectionAssert.AreEqual(meta1.PdbByteCode, meta2.PdbByteCode);
154+
Assert.AreEqual(meta1.TemplateFileName, meta2.TemplateFileName);
155+
Assert.AreEqual(meta1.TemplateNamespace, meta2.TemplateNamespace);
156+
Assert.AreEqual(meta1.GeneratedSourceCode, meta2.GeneratedSourceCode);
157+
Assert.AreEqual(meta1.TemplateSource, meta2.TemplateSource);
158+
}
77159
}
78160
}

RazorEngineCore/IRazorEngineCompilationOptionsBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,6 @@ public interface IRazorEngineCompilationOptionsBuilder
1414
void AddMetadataReference(MetadataReference reference);
1515
void AddUsing(string namespaceName);
1616
void Inherits(Type type);
17-
void GeneratePdbStream(bool flag);
17+
void IncludeDebuggingInfo();
1818
}
1919
}

RazorEngineCore/IRazorEngineCompiledTemplate.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ public interface IRazorEngineCompiledTemplate
99
Task SaveToStreamAsync(Stream stream);
1010
void SaveToFile(string fileName);
1111
Task SaveToFileAsync(string fileName);
12+
void EnableDebugging(string debuggingOutputDirectory = null);
1213
string Run(object model = null);
1314
Task<string> RunAsync(object model = null);
1415
}

RazorEngineCore/IRazorEngineCompiledTemplateT.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,7 @@ public interface IRazorEngineCompiledTemplate<out T> where T : IRazorEngineTempl
1010
Task SaveToStreamAsync(Stream stream);
1111
void SaveToFile(string fileName);
1212
Task SaveToFileAsync(string fileName);
13-
void SavePdbToFile(string filename);
14-
Task SavePdbToFileAsync(string fileName);
13+
void EnableDebugging(string debuggingOutputDirectory = null);
1514
string Run(Action<T> initializer);
1615
Task<string> RunAsync(Action<T> initializer);
1716
}

RazorEngineCore/IRazorEngineTemplate.cs

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,33 +4,20 @@ namespace RazorEngineCore
44
{
55
public interface IRazorEngineTemplate
66
{
7+
78
dynamic Model { get; set; }
89
void WriteLiteral(string literal = null);
910

10-
Task WriteLiteralAsync(string literal = null);
11-
1211
void Write(object obj = null);
1312

14-
Task WriteAsync(object obj = null);
15-
1613
void BeginWriteAttribute(string name, string prefix, int prefixOffset, string suffix, int suffixOffset, int attributeValuesCount);
1714

18-
Task BeginWriteAttributeAsync(string name, string prefix, int prefixOffset, string suffix, int suffixOffset, int attributeValuesCount);
19-
2015
void WriteAttributeValue(string prefix, int prefixOffset, object value, int valueOffset, int valueLength, bool isLiteral);
2116

22-
Task WriteAttributeValueAsync(string prefix, int prefixOffset, object value, int valueOffset, int valueLength, bool isLiteral);
23-
2417
void EndWriteAttribute();
2518

26-
Task EndWriteAttributeAsync();
27-
28-
void Execute();
29-
3019
Task ExecuteAsync();
3120

3221
string Result();
33-
34-
Task<string> ResultAsync();
3522
}
3623
}

RazorEngineCore/ObjectExtenders.cs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Dynamic;
4+
using System.IO;
45
using System.Reflection;
56
using System.Runtime.CompilerServices;
67

@@ -27,8 +28,22 @@ public static bool IsAnonymous(this object obj)
2728

2829
return Attribute.IsDefined(type, typeof(CompilerGeneratedAttribute), false)
2930
&& type.IsGenericType && type.Name.Contains("AnonymousType")
30-
&& (type.Name.StartsWith("<>") || type.Name.StartsWith("VB$"))
31+
&& (type.Name.StartsWith("<>") || type.Name.StartsWith("VB$"))
3132
&& type.Attributes.HasFlag(TypeAttributes.NotPublic);
3233
}
34+
35+
public static long ReadLong(this Stream stream)
36+
{
37+
byte[] buffer = new byte[8];
38+
stream.Read(buffer, 0, 8);
39+
40+
return BitConverter.ToInt64(buffer, 0);
41+
}
42+
43+
public static void WriteLong(this Stream stream, long value)
44+
{
45+
byte[] buffer = BitConverter.GetBytes(value);
46+
stream.Write(buffer, 0, buffer.Length);
47+
}
3348
}
3449
}

0 commit comments

Comments
 (0)