public void TestWriteServerDependenciesAvailable_Works() { CodeBuilder cb = new CodeBuilder(); var tpl = new Template(); tpl.ClassName = "TestClass"; var m1 = mocks.StrictMock<IMember>(); var m2 = mocks.StrictMock<IMember>(); Expect.Call(() => m1.WriteCode(tpl, MemberCodePoint.ServerConstructor, cb)).Do((Action<ITemplate, MemberCodePoint, CodeBuilder>)((_, __, x) => x.AppendLine("[a]"))); Expect.Call(() => m2.WriteCode(tpl, MemberCodePoint.ServerConstructor, cb)).Do((Action<ITemplate, MemberCodePoint, CodeBuilder>)((_, __, x) => x.AppendLine("[b]"))); mocks.ReplayAll(); string expected = "public void DependenciesAvailable() {" + Environment.NewLine + " [a]" + Environment.NewLine + " [b]" + Environment.NewLine + " Constructed();" + Environment.NewLine + "}" + Environment.NewLine; Template.WriteServerDependenciesAvailable(cb, tpl, new List<IMember>() { m1, m2 }); Assert.AreEqual(expected, cb.ToString()); Assert.AreEqual(0, cb.IndentLevel); mocks.VerifyAll(); }
public ITemplate Process(XmlNode node) { if (node == null) throw Utils.ArgumentNullException("node"); ITemplate result = new Template(); Utils.DoForEachChild(node, delegate(XmlNode child) { ActualProcess(child, true, result, result.MainRenderFunction); }); return result; }
public void TestWriteClientConstructor_Works() { CodeBuilder cb = new CodeBuilder(); var tpl = new Template(); tpl.ClassName = "TestClass"; mocks.ReplayAll(); string expected = "[Obsolete(@\"" + Template.DoNotCallConstructorMessage.Replace("\"", "\"\"") + "\")]" + Environment.NewLine + "public TestClass(object config) {" + Environment.NewLine + " __cfg = (!Script.IsUndefined(config) ? JsDictionary.GetDictionary(config) : null);" + Environment.NewLine + "}" + Environment.NewLine; Template.WriteClientConstructor(cb, tpl); Assert.AreEqual(expected, cb.ToString()); Assert.AreEqual(0, cb.IndentLevel); mocks.VerifyAll(); }
public void TestWriteServerConstructor_Works() { CodeBuilder cb = new CodeBuilder(); var tpl = new Template(); tpl.ClassName = "TestClass"; var m1 = mocks.StrictMock<IMember>(); var m2 = mocks.StrictMock<IMember>(); mocks.ReplayAll(); string expected = "[Obsolete(@\"" + Template.DoNotCallConstructorMessage.Replace("\"", "\"\"") + "\")]" + Environment.NewLine + "public TestClass() {" + Environment.NewLine + "}" + Environment.NewLine; Template.WriteServerConstructor(cb, tpl); Assert.AreEqual(expected, cb.ToString()); Assert.AreEqual(0, cb.IndentLevel); mocks.VerifyAll(); }
private void TestWriteClientDependenciesAvailable_Works(bool enableClientCreate) { CodeBuilder cb = new CodeBuilder(); var tpl = new Template(); tpl.ClassName = "TestClass"; tpl.EnableClientCreate = enableClientCreate; var m1 = mocks.StrictMock<IMember>(); var m2 = mocks.StrictMock<IMember>(); if (enableClientCreate) { Expect.Call(() => m1.WriteCode(tpl, MemberCodePoint.ClientConstructor, cb)).Do((Action<ITemplate, MemberCodePoint, CodeBuilder>)((_, __, x) => x.AppendLine("m1 = f1();"))); Expect.Call(() => m2.WriteCode(tpl, MemberCodePoint.ClientConstructor, cb)).Do((Action<ITemplate, MemberCodePoint, CodeBuilder>)((_, __, x) => x.AppendLine("m2 = g1();"))); } Expect.Call(() => m1.WriteCode(tpl, MemberCodePoint.TransferConstructor, cb)).Do((Action<ITemplate, MemberCodePoint, CodeBuilder>)((_, __, x) => x.AppendLine("m1 = f2();"))); Expect.Call(() => m2.WriteCode(tpl, MemberCodePoint.TransferConstructor, cb)).Do((Action<ITemplate, MemberCodePoint, CodeBuilder>)((_, __, x) => x.AppendLine("m2 = g2();"))); mocks.ReplayAll(); string expected = "public void DependenciesAvailable() {" + Environment.NewLine + " if (__cfg != null) {" + Environment.NewLine + " this.id = (string)__cfg[\"id\"];" + Environment.NewLine + " m1 = f2();" + Environment.NewLine + " m2 = g2();" + Environment.NewLine + " Constructed();" + Environment.NewLine + " AttachSelf();" + Environment.NewLine + " }" + Environment.NewLine + " else {" + Environment.NewLine + (enableClientCreate ? " this.position = PositionHelper.NotPositioned;" + Environment.NewLine + " m1 = f1();" + Environment.NewLine + " m2 = g1();" + Environment.NewLine + " Constructed();" + Environment.NewLine : " throw new Exception(\"This control must be created server-side\");" + Environment.NewLine ) + " }" + Environment.NewLine + "}" + Environment.NewLine; Template.WriteClientDependenciesAvailable(cb, tpl, new List<IMember>() { m1, m2 }); Assert.AreEqual(expected, cb.ToString()); Assert.AreEqual(0, cb.IndentLevel); mocks.VerifyAll(); }
public void TestInstantiate() { var tpl = new Template(); IInstantiatedTemplateControl ctl = null; var m1 = mocks.StrictMock<IMember>(); var m2 = mocks.StrictMock<IMember>(); var container = mocks.StrictMock<IContainer>(); Expect.Call(m1.Name).Return("m1").Repeat.Any(); Expect.Call(m2.Name).Return("m2").Repeat.Any(); Expect.Call(m1.Dependencies).Return(new string[] { }); Expect.Call(m2.Dependencies).Return(new string[] { "m1" }); Expect.Call(() => m1.Instantiate(null, null, container)).IgnoreArguments().Constraints(Is.Same(tpl), Is.NotNull(), Is.Same(container)).Do((Action<ITemplate, IInstantiatedTemplateControl, IContainer>)((_, c, __) => { ctl = c; } )); Expect.Call(() => m2.Instantiate(null, null, container)).IgnoreArguments().Constraints(Is.Same(tpl), Is.Matching((IInstantiatedTemplateControl x) => object.ReferenceEquals(x, ctl)), Is.Same(container)); tpl.MainRenderFunction.AddFragment(new LiteralFragment("X")); mocks.ReplayAll(); tpl.AddMember(m1); tpl.AddMember(m2); var actual = tpl.Instantiate(container); Assert.AreSame(ctl, actual); actual.Id = "SomeId"; Assert.AreEqual("X", actual.Html); mocks.VerifyAll(); }
public void TestWriteGetConfig() { CodeBuilder cb = new CodeBuilder(); var tpl = new Template(); var m1 = mocks.StrictMock<IMember>(); var m2 = mocks.StrictMock<IMember>(); Expect.Call(() => m1.WriteCode(tpl, MemberCodePoint.ConfigObjectInit, cb)).Do((Action<ITemplate, MemberCodePoint, CodeBuilder>)((_, __, x) => x.AppendLine("[a]"))); Expect.Call(() => m2.WriteCode(tpl, MemberCodePoint.ConfigObjectInit, cb)).Do((Action<ITemplate, MemberCodePoint, CodeBuilder>)((_, __, x) => x.AppendLine("[b]"))); mocks.ReplayAll(); string expected = "public object ConfigObject {" + Environment.NewLine + " get {" + Environment.NewLine + " Dictionary<string, object> __cfg = new Dictionary<string, object>();" + Environment.NewLine + " __cfg[\"id\"] = id;" + Environment.NewLine + " [a]" + Environment.NewLine + " [b]" + Environment.NewLine + " return __cfg;" + Environment.NewLine + " }" + Environment.NewLine + "}" + Environment.NewLine; new Template().WriteGetConfig(cb, tpl, new List<IMember>() { m1, m2 }); Assert.AreEqual(expected, cb.ToString()); Assert.AreEqual(0, cb.IndentLevel); mocks.VerifyAll(); }
private void TestWriteClientCode_Works(bool withNamespace, bool enableClientCreate, bool generateImplementationsAsOverride) { CodeBuilder cb = new CodeBuilder(); var tpl = new Template(); tpl.ClassName = "TestClass"; tpl.Nmspace = withNamespace ? "TestNamespace" : null; tpl.EnableClientCreate = enableClientCreate; tpl.AddClientUsingDirective("AddedNamespace.Client"); tpl.AddServerUsingDirective("AddedNamespace.Server"); tpl.GenerateImplementationsAsOverrides = generateImplementationsAsOverride; var m1 = mocks.StrictMock<IMember>(); var m2 = mocks.StrictMock<IMember>(); Expect.Call(m1.Name).Return("m1").Repeat.Any(); Expect.Call(m2.Name).Return("m2").Repeat.Any(); Expect.Call(m1.Dependencies).Return(new string[] { }); Expect.Call(m2.Dependencies).Return(new string[] { "m1" }); Expect.Call(() => m1.WriteCode(tpl, MemberCodePoint.ClientDefinition, cb)).Do((Action<ITemplate, MemberCodePoint, CodeBuilder>)((_, __, x) => x.AppendLine("[a]"))); Expect.Call(() => m2.WriteCode(tpl, MemberCodePoint.ClientDefinition, cb)).Do((Action<ITemplate, MemberCodePoint, CodeBuilder>)((_, __, x) => x.AppendLine("[b]"))); if (enableClientCreate) { Expect.Call(() => m1.WriteCode(tpl, MemberCodePoint.ClientConstructor, cb)); Expect.Call(() => m2.WriteCode(tpl, MemberCodePoint.ClientConstructor, cb)); Expect.Call(() => m1.WriteCode(tpl, MemberCodePoint.Attach, cb)); Expect.Call(() => m2.WriteCode(tpl, MemberCodePoint.Attach, cb)); } Expect.Call(() => m1.WriteCode(tpl, MemberCodePoint.TransferConstructor, cb)); Expect.Call(() => m2.WriteCode(tpl, MemberCodePoint.TransferConstructor, cb)); Expect.Call(() => m1.WriteCode(tpl, MemberCodePoint.ClientIdChanging, cb)); Expect.Call(() => m2.WriteCode(tpl, MemberCodePoint.ClientIdChanging, cb)); Expect.Call(() => m1.WriteCode(tpl, MemberCodePoint.AttachSelf, cb)); Expect.Call(() => m2.WriteCode(tpl, MemberCodePoint.AttachSelf, cb)); mocks.ReplayAll(); string maybeOverride = generateImplementationsAsOverride ? "override " : ""; string p = (withNamespace ? "\t" : ""); string expected = "using System;" + Environment.NewLine + "using System.Collections;" + Environment.NewLine + "using System.Collections.Generic;" + Environment.NewLine + "using System.Html;" + Environment.NewLine + "using Saltarelle;" + Environment.NewLine + "using Saltarelle.Ioc;" + Environment.NewLine + "using AddedNamespace.Client;" + Environment.NewLine + Environment.NewLine + (withNamespace ? "namespace TestNamespace {" + Environment.NewLine : "") + p + "public partial class TestClass : IControl, INotifyCreated" + (enableClientCreate ? ", IClientCreateControl" : "") + " {" + Environment.NewLine + p + " partial void Constructed();" + Environment.NewLine + p + " partial void Attached();" + Environment.NewLine + Environment.NewLine + p + " private Dictionary<string, IControl> controls = new Dictionary<string, IControl>();" + Environment.NewLine + p + " private JsDictionary __cfg;" + Environment.NewLine + Environment.NewLine + p + " private Position position;" + Environment.NewLine + p + " public " + maybeOverride + "Position Position {" + Environment.NewLine + p + " get { return isAttached ? PositionHelper.GetPosition(GetElement()) : position; }" + Environment.NewLine + p + " set {" + Environment.NewLine + p + " position = value;" + Environment.NewLine + p + " if (isAttached)" + Environment.NewLine + p + " PositionHelper.ApplyPosition(GetElement(), value);" + Environment.NewLine + p + " }" + Environment.NewLine + p + " }" + Environment.NewLine + Environment.NewLine + p + " private bool isAttached = false;" + Environment.NewLine + p + " public " + maybeOverride + "Element GetElement() { return isAttached ? Document.GetElementById(id) : null; }" + Environment.NewLine + Environment.NewLine + p + " private string id;" + Environment.NewLine + p + " public " + maybeOverride + "string Id {" + Environment.NewLine + p + " get { return id; }" + Environment.NewLine + p + " set {" + Environment.NewLine + p + " foreach (var kvp in controls)" + Environment.NewLine + p + " kvp.Value.Id = value + \"_\" + kvp.Key;" + Environment.NewLine + p + " if (isAttached)" + Environment.NewLine + p + " GetElement().ID = value;" + Environment.NewLine + p + " this.id = value;" + Environment.NewLine + p + " }" + Environment.NewLine + p + " }" + Environment.NewLine + Environment.NewLine + (enableClientCreate ? p + " private string GetHtml() {" + Environment.NewLine + p + " StringBuilder sb = new StringBuilder();" + Environment.NewLine + p + " return sb.ToString();" + Environment.NewLine + p + " }" + Environment.NewLine + Environment.NewLine : "") + p + " [a]" + Environment.NewLine + p + " [b]" + Environment.NewLine + p + " private void AttachSelf() {" + Environment.NewLine + p + " this.isAttached = true;" + Environment.NewLine + p + " Attached();" + Environment.NewLine + p + " }" + Environment.NewLine + Environment.NewLine + (enableClientCreate ? p + " public void Attach() {" + Environment.NewLine + p + " if (Script.IsNullOrEmpty(id) || isAttached) throw new Exception(\"Must set id before attach and can only attach once.\");" + Environment.NewLine + p + " AttachSelf();" + Environment.NewLine + p + " }" + Environment.NewLine + Environment.NewLine + p + " public " + maybeOverride + "string Html {" + Environment.NewLine + p + " get {" + Environment.NewLine + p + " if (string.IsNullOrEmpty(id))" + Environment.NewLine + p + " throw new InvalidOperationException(\"Must assign Id before rendering.\");" + Environment.NewLine + p + " return GetHtml();" + Environment.NewLine + p + " }" + Environment.NewLine + p + " }" + Environment.NewLine + Environment.NewLine + p + " [AlternateSignature]" + Environment.NewLine + p + " public TestClass() {}" + Environment.NewLine : "") + p + " [Obsolete(@\"" + Template.DoNotCallConstructorMessage.Replace("\"", "\"\"") + "\")]" + Environment.NewLine + p + " public TestClass(object config) {" + Environment.NewLine + p + " __cfg = (!Script.IsUndefined(config) ? JsDictionary.GetDictionary(config) : null);" + Environment.NewLine + p + " }" + Environment.NewLine + Environment.NewLine + p + " public void DependenciesAvailable() {" + Environment.NewLine + p + " if (__cfg != null) {" + Environment.NewLine + p + " this.id = (string)__cfg[\"id\"];" + Environment.NewLine + p + " Constructed();" + Environment.NewLine + p + " AttachSelf();" + Environment.NewLine + p + " }" + Environment.NewLine + p + " else {" + Environment.NewLine + (enableClientCreate ? p + " this.position = PositionHelper.NotPositioned;" + Environment.NewLine + p + " Constructed();" + Environment.NewLine : p + " throw new Exception(\"This control must be created server-side\");" + Environment.NewLine ) + p + " }" + Environment.NewLine + p + " }" + Environment.NewLine + p + "}" + Environment.NewLine + (withNamespace ? "}" + Environment.NewLine : ""); tpl.AddMember(m1); tpl.AddMember(m2); tpl.WriteClientCode(cb); Assert.AreEqual(expected, cb.ToString()); Assert.AreEqual(0, cb.IndentLevel); mocks.VerifyAll(); }
private void TestWriteServerCode_Works(bool withNamespace, bool enableClientCreate, bool generateImplementationsAsOverride) { CodeBuilder cb = new CodeBuilder(); var tpl = new Template(); tpl.ClassName = "TestClass"; tpl.Nmspace = withNamespace ? "TestNamespace" : null; tpl.EnableClientCreate = enableClientCreate; tpl.AddClientUsingDirective("AddedNamespace.Client"); tpl.AddServerUsingDirective("AddedNamespace.Server"); tpl.GenerateImplementationsAsOverrides = generateImplementationsAsOverride; var m1 = mocks.StrictMock<IMember>(); var m2 = mocks.StrictMock<IMember>(); Expect.Call(m1.Name).Return("m1").Repeat.Any(); Expect.Call(m2.Name).Return("m2").Repeat.Any(); Expect.Call(m1.Dependencies).Return(new string[] { }); Expect.Call(m2.Dependencies).Return(new string[] { "m1" }); Expect.Call(() => m1.WriteCode(tpl, MemberCodePoint.ServerIdChanging, cb)); Expect.Call(() => m2.WriteCode(tpl, MemberCodePoint.ServerIdChanging, cb)); Expect.Call(() => m1.WriteCode(tpl, MemberCodePoint.ConfigObjectInit, cb)); Expect.Call(() => m2.WriteCode(tpl, MemberCodePoint.ConfigObjectInit, cb)); Expect.Call(() => m1.WriteCode(tpl, MemberCodePoint.ServerDefinition, cb)).Do((Action<ITemplate, MemberCodePoint, CodeBuilder>)((_, __, x) => x.AppendLine("[a]"))); Expect.Call(() => m2.WriteCode(tpl, MemberCodePoint.ServerDefinition, cb)).Do((Action<ITemplate, MemberCodePoint, CodeBuilder>)((_, __, x) => x.AppendLine("[b]"))); Expect.Call(() => m1.WriteCode(tpl, MemberCodePoint.ServerConstructor, cb)); Expect.Call(() => m2.WriteCode(tpl, MemberCodePoint.ServerConstructor, cb)); mocks.ReplayAll(); string maybeOverride = generateImplementationsAsOverride ? "override " : ""; string p = (withNamespace ? "\t" : ""); string expected = "using System;" + Environment.NewLine + "using System.Collections.Generic;" + Environment.NewLine + "using System.Text;" + Environment.NewLine + "using Saltarelle;" + Environment.NewLine + "using Saltarelle.Ioc;" + Environment.NewLine + "using AddedNamespace.Server;" + Environment.NewLine + Environment.NewLine + (withNamespace ? "namespace TestNamespace {" + Environment.NewLine : "") + p + "public partial class TestClass : IControl, INotifyCreated" + (enableClientCreate ? ", IClientCreateControl" : "") + " {" + Environment.NewLine + p + " partial void Constructed();" + Environment.NewLine + Environment.NewLine + p + " private Dictionary<string, IControl> controls = new Dictionary<string, IControl>();" + Environment.NewLine + Environment.NewLine + p + " private Position position = PositionHelper.NotPositioned;" + Environment.NewLine + p + " public " + maybeOverride + "Position Position { get { return position; } set { position = value; } }" + Environment.NewLine + Environment.NewLine + p + " private string id;" + Environment.NewLine + p + " public " + maybeOverride + "string Id {" + Environment.NewLine + p + " get { return id; }" + Environment.NewLine + p + " set {" + Environment.NewLine + p + " foreach (var kvp in controls)" + Environment.NewLine + p + " kvp.Value.Id = value + \"_\" + kvp.Key;" + Environment.NewLine + p + " this.id = value;" + Environment.NewLine + p + " }" + Environment.NewLine + p + " }" + Environment.NewLine + Environment.NewLine + p + " public " + maybeOverride + "object ConfigObject {" + Environment.NewLine + p + " get {" + Environment.NewLine + p + " Dictionary<string, object> __cfg = new Dictionary<string, object>();" + Environment.NewLine + p + " __cfg[\"id\"] = id;" + Environment.NewLine + p + " return __cfg;" + Environment.NewLine + p + " }" + Environment.NewLine + p + " }" + Environment.NewLine + Environment.NewLine + p + " private string GetHtml() {" + Environment.NewLine + p + " StringBuilder sb = new StringBuilder();" + Environment.NewLine + p + " return sb.ToString();" + Environment.NewLine + p + " }" + Environment.NewLine + Environment.NewLine + p + " [a]" + Environment.NewLine + p + " [b]" + Environment.NewLine + p + " public " + maybeOverride + "string Html {" + Environment.NewLine + p + " get {" + Environment.NewLine + p + " if (string.IsNullOrEmpty(id))" + Environment.NewLine + p + " throw new InvalidOperationException(\"Must assign Id before rendering.\");" + Environment.NewLine + p + " return GetHtml();" + Environment.NewLine + p + " }" + Environment.NewLine + p + " }" + Environment.NewLine + Environment.NewLine + p + " [Obsolete(@\"" + Template.DoNotCallConstructorMessage.Replace("\"", "\"\"") + "\")]" + Environment.NewLine + p + " public TestClass() {" + Environment.NewLine + p + " }" + Environment.NewLine + Environment.NewLine + p + " public void DependenciesAvailable() {" + Environment.NewLine + p + " Constructed();" + Environment.NewLine + p + " }" + Environment.NewLine + p + "}" + Environment.NewLine + (withNamespace ? "}" + Environment.NewLine : ""); tpl.AddMember(m1); tpl.AddMember(m2); tpl.WriteServerCode(cb); Assert.AreEqual(expected, cb.ToString()); Assert.AreEqual(0, cb.IndentLevel); mocks.VerifyAll(); }
public void TestWriteClientIdProperty_Works() { CodeBuilder cb = new CodeBuilder(); var tpl = new Template(); tpl.ClassName = "TestClass"; var m1 = mocks.StrictMock<IMember>(); var m2 = mocks.StrictMock<IMember>(); Expect.Call(() => m1.WriteCode(tpl, MemberCodePoint.ClientIdChanging, cb)).Do((Action<ITemplate, MemberCodePoint, CodeBuilder>)((_, __, x) => x.AppendLine("[a]"))); Expect.Call(() => m2.WriteCode(tpl, MemberCodePoint.ClientIdChanging, cb)).Do((Action<ITemplate, MemberCodePoint, CodeBuilder>)((_, __, x) => x.AppendLine("[b]"))); mocks.ReplayAll(); string expected = "private string id;" + Environment.NewLine + "public string Id {" + Environment.NewLine + " get { return id; }" + Environment.NewLine + " set {" + Environment.NewLine + " foreach (var kvp in controls)" + Environment.NewLine + " kvp.Value.Id = value + \"_\" + kvp.Key;" + Environment.NewLine + " [a]" + Environment.NewLine + " [b]" + Environment.NewLine + " if (isAttached)" + Environment.NewLine + " GetElement().ID = value;" + Environment.NewLine + " this.id = value;" + Environment.NewLine + " }" + Environment.NewLine + "}" + Environment.NewLine; new Template().WriteClientIdProperty(cb, tpl, new List<IMember>() { m1, m2 }); Assert.AreEqual(expected, cb.ToString()); Assert.AreEqual(0, cb.IndentLevel); mocks.VerifyAll(); }
public void TestWriteAttachSelf_Works() { CodeBuilder cb = new CodeBuilder(); var tpl = new Template(); var m1 = mocks.StrictMock<IMember>(); var m2 = mocks.StrictMock<IMember>(); Expect.Call(() => m1.WriteCode(tpl, MemberCodePoint.AttachSelf, cb)).Do((Action<ITemplate, MemberCodePoint, CodeBuilder>)((_, __, x) => x.AppendLine("[a]"))); Expect.Call(() => m2.WriteCode(tpl, MemberCodePoint.AttachSelf, cb)).Do((Action<ITemplate, MemberCodePoint, CodeBuilder>)((_, __, x) => x.AppendLine("[b]"))); mocks.ReplayAll(); string expected = "private void AttachSelf() {" + Environment.NewLine + " [a]" + Environment.NewLine + " [b]" + Environment.NewLine + " this.isAttached = true;" + Environment.NewLine + " Attached();" + Environment.NewLine + "}" + Environment.NewLine; Template.WriteAttachSelf(cb, tpl, new List<IMember>() { m1, m2 }); Assert.AreEqual(expected, cb.ToString()); Assert.AreEqual(0, cb.IndentLevel); mocks.VerifyAll(); }
public void TestWriteAttach_Works() { CodeBuilder cb = new CodeBuilder(); var tpl = new Template(); var m1 = mocks.StrictMock<IMember>(); var m2 = mocks.StrictMock<IMember>(); Expect.Call(() => m1.WriteCode(tpl, MemberCodePoint.Attach, cb)).Do((Action<ITemplate, MemberCodePoint, CodeBuilder>)((_, __, x) => x.AppendLine("[a]"))); Expect.Call(() => m2.WriteCode(tpl, MemberCodePoint.Attach, cb)).Do((Action<ITemplate, MemberCodePoint, CodeBuilder>)((_, __, x) => x.AppendLine("[b]"))); mocks.ReplayAll(); string expected = "public void Attach() {" + Environment.NewLine + " if (Script.IsNullOrEmpty(id) || isAttached) throw new Exception(\"Must set id before attach and can only attach once.\");" + Environment.NewLine + " [a]" + Environment.NewLine + " [b]" + Environment.NewLine + " AttachSelf();" + Environment.NewLine + "}" + Environment.NewLine; Template.WriteAttach(cb, tpl, new List<IMember>() { m1, m2 }); Assert.AreEqual(expected, cb.ToString()); Assert.AreEqual(0, cb.IndentLevel); mocks.VerifyAll(); }