using System; using UnitTestSharp; namespace Vellum.Generator.UnitTests { public class CodeWriterTests : TestFixture { public class NewLineTests : TestFixture { public void WritesABlankLineEvenWhenIndented() { var code = new CodeWriter(); code.Indent(); code.NewLine(); CheckEqual("\r\n", code.ToString()); } } public class AddLineTests : TestFixture { public void WritesTheContentWithACarriageReturnLineFeed() { var code = new CodeWriter(); code.AddLine("int x;"); CheckEqual("int x;\r\n", code.ToString()); } public void EmptyContent_WritesABlankLineEvenWhenIndented() { var code = new CodeWriter(); code.Indent(); code.AddLine(""); CheckEqual("\r\n", code.ToString()); } public void Indented_PrefixesFourSpacesPerLevel() { var code = new CodeWriter(); code.Indent(); code.Indent(); code.AddLine("int x;"); CheckEqual(" int x;\r\n", code.ToString()); } } public class IndentTests : TestFixture { public void AffectsOnlyTheLinesAfterIt() { var code = new CodeWriter(); code.AddLine("before"); code.Indent(); code.AddLine("after"); CheckEqual("before\r\n after\r\n", code.ToString()); } } public class DedentTests : TestFixture { public void UndoesOneIndent() { var code = new CodeWriter(); code.Indent(); code.Indent(); code.Dedent(); code.AddLine("x"); CheckEqual(" x\r\n", code.ToString()); } public void WithoutAnIndent_Throws() { var code = new CodeWriter(); CheckThrow(typeof(InvalidOperationException)); code.Dedent(); } } public class OpenNewBlockTests : TestFixture { public void WithoutAHeader_WritesABraceAndIndents() { var code = new CodeWriter(); code.OpenNewBlock(); code.AddLine("x"); CheckEqual("{\r\n x\r\n", code.ToString()); } public void WithAHeader_WritesItAboveTheBrace() { var code = new CodeWriter(); code.OpenNewBlock("class A"); code.AddLine("x"); CheckEqual("class A\r\n{\r\n x\r\n", code.ToString()); } public void Nested_IndentsEachLevel() { var code = new CodeWriter(); code.OpenNewBlock("class A"); code.OpenNewBlock("void B()"); code.AddLine("x"); CheckEqual("class A\r\n{\r\n void B()\r\n {\r\n x\r\n", code.ToString()); } } public class CloseBlockTests : TestFixture { public void DedentsThenWritesTheClosingBrace() { var code = new CodeWriter(); code.OpenNewBlock("class A"); code.CloseBlock(); code.AddLine("after"); CheckEqual("class A\r\n{\r\n}\r\nafter\r\n", code.ToString()); } public void Nested_ClosesInnermostFirst() { var code = new CodeWriter(); code.OpenNewBlock("class A"); code.OpenNewBlock("void B()"); code.CloseBlock(); code.CloseBlock(); CheckEqual("class A\r\n{\r\n void B()\r\n {\r\n }\r\n}\r\n", code.ToString()); } public void WithoutAnOpenBlock_Throws() { var code = new CodeWriter(); CheckThrow(typeof(InvalidOperationException)); code.CloseBlock(); } } public class ToStringTests : TestFixture { public void NothingWritten_IsEmpty() { CheckEqual("", new CodeWriter().ToString()); } } } }