/UnitTest.WolfGenerator/Writer/CodeWriterUnitTest.cs

http://wolfgenerator.codeplex.com · C# · 357 lines · 286 code · 51 blank · 20 comment · 6 complexity · 420db9cf38104507b372748bca88848b MD5 · raw file

  1. /*******************************************************
  2. *
  3. * Created by: Alexander Puzynia aka WerWolf
  4. * Created: 21.02.2009 17:40
  5. *
  6. * File: CodeWriterUnitTest.cs
  7. * Remarks:
  8. *
  9. * History:
  10. * 21.02.2009 17:40 - Create Wireframe
  11. * 21.02.2009 17:51 - Finish SimpleCodeWriterTest
  12. * 21.02.2009 17:56 - Finish ComplexCodeWriterTest
  13. * 21.02.2009 18:40 - Finish InnerAppendCodeWriterTest
  14. * 21.02.2009 18:44 - Add some code optimization
  15. * 23.02.2009 00:17 - Finish MultyLineTest
  16. * 23.02.2009 00:44 - Finish CodeWriterExceptionTest.
  17. * 23.02.2009 23:26 - Finish SpaceAppendTypeTest & CloneAppendTypeTest.
  18. * 21.04.2012 23:16 - [*] Migrate to [NUnit].
  19. *
  20. *******************************************************/
  21. using System;
  22. using System.Collections.Generic;
  23. using System.Text;
  24. using NUnit.Framework;
  25. using WolfGenerator.Core.Writer;
  26. using System.Linq;
  27. using WolfGenerator.Core.Writer.Exception;
  28. namespace UnitTest.WolfGenerator.Writer
  29. {
  30. [TestFixture]
  31. public class CodeWriterUnitTest
  32. {
  33. private class CodeWriterHelper
  34. {
  35. public readonly int indent;
  36. public readonly string[] texts;
  37. public CodeWriterHelper( int indent, params string[] texts )
  38. {
  39. this.indent = indent;
  40. this.texts = texts;
  41. }
  42. }
  43. private class CodeWriterHelperHierarchy
  44. {
  45. public readonly IEnumerable<CodeWriterHelper> startHelpers;
  46. public readonly IEnumerable<CodeWriterHelperHierarchy> innerItems;
  47. public readonly IEnumerable<CodeWriterHelper> endHelpers;
  48. public CodeWriterHelperHierarchy( IEnumerable<CodeWriterHelper> startHelpers, IEnumerable<CodeWriterHelper> endHelpers, params CodeWriterHelperHierarchy[] innerItems )
  49. {
  50. this.startHelpers = startHelpers ?? new CodeWriterHelper[0];
  51. this.innerItems = innerItems ?? new CodeWriterHelperHierarchy[0];
  52. this.endHelpers = endHelpers ?? new CodeWriterHelper[0];
  53. }
  54. }
  55. [Test]
  56. public void SimpleCodeWriterTest()
  57. {
  58. var lines = new[]
  59. {
  60. new CodeWriterHelper( 1, "namespace Test" ),
  61. new CodeWriterHelper( 1, "{" ),
  62. new CodeWriterHelper( 2, "public class A" ),
  63. new CodeWriterHelper( 2, "{" ),
  64. new CodeWriterHelper( 3, "public void MethodA() {}" ),
  65. new CodeWriterHelper( 2, "}" ),
  66. new CodeWriterHelper( 1, "}" ),
  67. };
  68. var expectedText = BuildText( lines );
  69. var codeWriter = GetCodeWriter( lines );
  70. Assert.AreEqual( expectedText, codeWriter.ToString() );
  71. }
  72. [Test]
  73. public void ?omplexCodeWriterTest()
  74. {
  75. var lines = new[]
  76. {
  77. new CodeWriterHelper( 1, "namespace Test" ),
  78. new CodeWriterHelper( 1, "{" ),
  79. new CodeWriterHelper( 2, "public", " class", " A" ),
  80. new CodeWriterHelper( 2, "{" ),
  81. new CodeWriterHelper( 3, "public void MethodA() {}" ),
  82. new CodeWriterHelper( 2, "}" ),
  83. new CodeWriterHelper( 1, "}" ),
  84. };
  85. var expectedText = BuildText( lines );
  86. var codeWriter = GetCodeWriter( lines );
  87. Assert.That( codeWriter.ToString(), Is.EqualTo( expectedText ) );
  88. }
  89. [Test]
  90. public void InnerAppendCodeWriterTest()
  91. {
  92. var linesStart = new[]
  93. {
  94. new CodeWriterHelper( 0, "namespace Test" ),
  95. new CodeWriterHelper( 0, "{" ),
  96. new CodeWriterHelper( 1, "public class Main" ),
  97. new CodeWriterHelper( 1, "{" ),
  98. };
  99. var linesEnd = new[]
  100. {
  101. new CodeWriterHelper( 1, "}" ),
  102. new CodeWriterHelper( 0, "}" ),
  103. };
  104. var lines1 = new[]
  105. {
  106. new CodeWriterHelper( 1, "public void Method1()" ),
  107. new CodeWriterHelper( 1, "{" ),
  108. new CodeWriterHelper( 1, "}" ),
  109. };
  110. var lines2 = new[]
  111. {
  112. new CodeWriterHelper( 1, "public void Method2( int value )" ),
  113. new CodeWriterHelper( 1, "{" ),
  114. new CodeWriterHelper( 1, "}" ),
  115. };
  116. var mainCodeWriter = GetCodeWriter( linesStart );
  117. mainCodeWriter.Append( GetCodeWriter( lines1 ) );
  118. mainCodeWriter.AppendLine();
  119. mainCodeWriter.Append( GetCodeWriter( lines2 ) );
  120. mainCodeWriter.AppendLine();
  121. AppendCodeWriter( mainCodeWriter, linesEnd );
  122. var hierarchy = new CodeWriterHelperHierarchy( linesStart, linesEnd, new CodeWriterHelperHierarchy( lines1, lines2 ) );
  123. var expectedText = BuildText( hierarchy );
  124. var actualText = mainCodeWriter.ToString();
  125. Assert.That( actualText, Is.EqualTo( expectedText ) );
  126. }
  127. [Test]
  128. public void MultyLineTest()
  129. {
  130. var lines = new[]
  131. {
  132. new CodeWriterHelper( 0, "namespace Test" ),
  133. new CodeWriterHelper( 0, "{" ),
  134. new CodeWriterHelper( 1, "public class Main\r\n{\r\n}" ),
  135. new CodeWriterHelper( 0, "}" ),
  136. };
  137. var codeWriter = GetCodeWriter( lines );
  138. var expectedText = BuildText( lines );
  139. var actualText = codeWriter.ToString();
  140. Assert.That( actualText, Is.EqualTo( expectedText ) );
  141. }
  142. [Test]
  143. public void PrivateTest()
  144. {
  145. var codeWriter = new CodeWriter();
  146. dynamic codeWriterAccessor = new AccessPrivateWrapper( codeWriter );
  147. Assert.IsNull( codeWriterAccessor.lastLine, "After initialize CodeWriter lastLine must be null" );
  148. Assert.IsNotNull( codeWriterAccessor.Lines, "Lines must be not null" );
  149. Assert.AreEqual( 0, codeWriterAccessor.Lines.Count, "Lines must be empty" );
  150. codeWriter.Append( "Test" );
  151. Assert.That( codeWriterAccessor.lastLine, Is.Not.Null, "After Append text lastLine must be not null" );
  152. Assert.That( codeWriter.Lines, Is.Not.Null.And.Count.EqualTo( 1 ),
  153. "After first Append text code write must consist from one line" );
  154. codeWriter.AppendLine( "Text" );
  155. Assert.That( (object)codeWriterAccessor.lastLine, Is.Null, "After initialize CodeWriter lastLine must be null" );
  156. Assert.That( codeWriter.Lines, Is.Not.Null.And.Count.EqualTo( 1 ),
  157. "After first Append text code write must consist from one line" );
  158. codeWriterAccessor.InnerAppend( "Text", false );
  159. Assert.That( codeWriterAccessor.lastLine, Is.Not.Null, "After Append text lastLine must be not null" );
  160. Assert.That( codeWriter.Lines, Is.Not.Null.And.Count.EqualTo( 2 ), "CodeWrite must consist from two line" );
  161. codeWriterAccessor.InnerAppend( "Text", true );
  162. Assert.That( (object)codeWriterAccessor.lastLine, Is.Null, "After Append text lastLine must be null" );
  163. Assert.That( codeWriter.Lines, Is.Not.Null.And.Count.EqualTo( 2 ), "CodeWrite must consist from two line" );
  164. codeWriter.AppendText( "new\r\nline" );
  165. Assert.That( codeWriterAccessor.lastLine, Is.Not.Null, "Appended text not finish last line, but CodeWriter finish it" );
  166. Assert.That( codeWriter.Lines, Is.Not.Null.And.Count.EqualTo( 4 ), "CodeWrite must consist from four line" );
  167. codeWriter.AppendText( "new\r\nlines\r\n" );
  168. Assert.That( (object)codeWriterAccessor.lastLine, Is.Null, "Appended text finish last line, but CodeWriter doesn't" );
  169. Assert.That( codeWriter.Lines, Is.Not.Null.And.Count.EqualTo( 5 ), "CodeWrite must consist from five line" );
  170. }
  171. [Test]
  172. [ExpectedException(typeof(MultyLineException))]
  173. public void CodeWriterExceptionTest()
  174. {
  175. var codeWriter = new CodeWriter();
  176. codeWriter.Append( "new\r\nline" );
  177. }
  178. [Test]
  179. public void CloneAppendTypeTest()
  180. {
  181. var codeWriter = new CodeWriter();
  182. var lines = new[]
  183. {
  184. "private int val;",
  185. "private string val;"
  186. };
  187. var commentText = "// ";
  188. codeWriter.Append( commentText );
  189. codeWriter.AppendType = AppendType.CloneLastLine;
  190. foreach (var line in lines)
  191. {
  192. codeWriter.AppendLine( line );
  193. }
  194. codeWriter.AppendType = AppendType.EmptyLastLine;
  195. var expectedText = string.Join( "\r\n", lines.Select( s => commentText + s ).ToArray() );
  196. var actualText = codeWriter.ToString();
  197. Assert.AreEqual( expectedText, actualText );
  198. }
  199. [Test]
  200. public void SpaceAppendTypeTest()
  201. {
  202. var codeWriter = new CodeWriter();
  203. var lines = new[]
  204. {
  205. "int val",
  206. "string val1",
  207. "object val2",
  208. "decimal val3",
  209. };
  210. var startLineText = "Constructor( ";
  211. var endLineText = " )";
  212. codeWriter.Append( startLineText );
  213. codeWriter.AppendType = AppendType.SpaceLastLine;
  214. for (var i = 0; i < lines.Length; i++)
  215. {
  216. var line = lines[i];
  217. codeWriter.Append( line );
  218. if (i < lines.Length - 1) codeWriter.AppendLine( "," );
  219. }
  220. codeWriter.AppendLine( endLineText );
  221. codeWriter.AppendType = AppendType.EmptyLastLine;
  222. var expectedText = startLineText +
  223. string.Join( ",\r\n", lines.Select(
  224. ( s, i ) =>
  225. (i > 0
  226. ? new string( ' ', startLineText.Length )
  227. : "") + s ).ToArray() ) +
  228. endLineText;
  229. var actualText = codeWriter.ToString();
  230. Assert.AreEqual( expectedText, actualText );
  231. }
  232. private static string BuildText( IEnumerable<CodeWriterHelper> lines )
  233. {
  234. var builder = new StringBuilder();
  235. var count = lines.Count();
  236. var i = 0;
  237. foreach (var line in lines)
  238. {
  239. var indentLine = new string( '\t', line.indent );
  240. builder.Append( indentLine );
  241. foreach (var text in line.texts)
  242. {
  243. if (!text.Contains( "\r\n" ))
  244. {
  245. builder.Append( text );
  246. }
  247. else
  248. {
  249. var textItems = text.Split( new[] { "\r\n" }, StringSplitOptions.None );
  250. for (var j = 0; j < textItems.Length; j++)
  251. {
  252. var s = textItems[j];
  253. if (j < textItems.Length - 1)
  254. {
  255. builder.AppendLine( s );
  256. builder.Append( indentLine );
  257. }
  258. else
  259. {
  260. builder.Append( s );
  261. }
  262. }
  263. }
  264. }
  265. if (i < count - 1) builder.AppendLine();
  266. i++;
  267. }
  268. return builder.ToString();
  269. }
  270. private static string BuildText( CodeWriterHelperHierarchy hierarchy )
  271. {
  272. var list = new List<CodeWriterHelper>();
  273. AppendHierarchy( 0, list, hierarchy );
  274. return BuildText( list );
  275. }
  276. private static void AppendHierarchy( int startIndent, ICollection<CodeWriterHelper> list, CodeWriterHelperHierarchy hierarchy )
  277. {
  278. var lastIndent = 0;
  279. foreach (var helper in hierarchy.startHelpers)
  280. {
  281. list.Add( new CodeWriterHelper( startIndent + helper.indent, helper.texts ) );
  282. lastIndent = helper.indent;
  283. }
  284. foreach (var item in hierarchy.innerItems)
  285. AppendHierarchy( lastIndent, list, item );
  286. foreach (var helper in hierarchy.endHelpers)
  287. list.Add( new CodeWriterHelper( startIndent + helper.indent, helper.texts ) );
  288. }
  289. private static CodeWriter GetCodeWriter( IEnumerable<CodeWriterHelper> lines )
  290. {
  291. var codeWriter = new CodeWriter();
  292. AppendCodeWriter( codeWriter, lines );
  293. return codeWriter;
  294. }
  295. private static void AppendCodeWriter( CodeWriter codeWriter, IEnumerable<CodeWriterHelper> lines )
  296. {
  297. foreach (var line in lines)
  298. {
  299. codeWriter.Indent = line.indent;
  300. foreach (var text in line.texts)
  301. codeWriter.AppendText( text );
  302. codeWriter.AppendLine();
  303. }
  304. }
  305. }
  306. }