PageRenderTime 38ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/test/System.Web.Razor.Test/Parser/VB/VBHelperTest.cs

https://bitbucket.org/mdavid/aspnetwebstack
C# | 322 lines | 308 code | 14 blank | 0 comment | 0 complexity | 1efd301f0776abab670a46cec7339629 MD5 | raw file
  1. using System.Web.Razor.Generator;
  2. using System.Web.Razor.Parser;
  3. using System.Web.Razor.Parser.SyntaxTree;
  4. using System.Web.Razor.Resources;
  5. using System.Web.Razor.Test.Framework;
  6. using System.Web.Razor.Text;
  7. using Xunit;
  8. namespace System.Web.Razor.Test.Parser.VB
  9. {
  10. public class VBHelperTest : VBHtmlMarkupParserTestBase
  11. {
  12. [Fact]
  13. public void ParseHelperOutputsErrorButContinuesIfLParenFoundAfterHelperKeyword()
  14. {
  15. ParseDocumentTest("@Helper ()",
  16. new MarkupBlock(
  17. Factory.EmptyHtml(),
  18. new HelperBlock(new HelperCodeGenerator(new LocationTagged<string>("()", 8, 0, 8), headerComplete: true),
  19. Factory.CodeTransition(),
  20. Factory.MetaCode("Helper ").Accepts(AcceptedCharacters.None),
  21. Factory.Code("()").Hidden().AutoCompleteWith(SyntaxConstants.VB.EndHelperKeyword),
  22. new StatementBlock())),
  23. new RazorError(
  24. String.Format(
  25. RazorResources.ParseError_Unexpected_Character_At_Helper_Name_Start,
  26. String.Format(RazorResources.ErrorComponent_Character, "(")),
  27. 8, 0, 8),
  28. new RazorError(
  29. String.Format(RazorResources.ParseError_BlockNotTerminated, "Helper", "End Helper"),
  30. 1, 0, 1));
  31. }
  32. [Fact]
  33. public void ParseHelperStatementOutputsMarkerHelperHeaderSpanOnceKeywordComplete()
  34. {
  35. ParseDocumentTest("@Helper ",
  36. new MarkupBlock(
  37. Factory.EmptyHtml(),
  38. new HelperBlock(new HelperCodeGenerator(new LocationTagged<string>(String.Empty, 8, 0, 8), headerComplete: false),
  39. Factory.CodeTransition(),
  40. Factory.MetaCode("Helper ").Accepts(AcceptedCharacters.None),
  41. Factory.EmptyVB().Hidden())),
  42. new RazorError(
  43. String.Format(RazorResources.ParseError_Unexpected_Character_At_Helper_Name_Start, RazorResources.ErrorComponent_EndOfFile),
  44. 8, 0, 8));
  45. }
  46. [Fact]
  47. public void ParseHelperStatementMarksHelperSpanAsCanGrowIfMissingTrailingSpace()
  48. {
  49. ParseDocumentTest("@Helper",
  50. new MarkupBlock(
  51. Factory.EmptyHtml(),
  52. new HelperBlock(
  53. Factory.CodeTransition(),
  54. Factory.MetaCode("Helper"))),
  55. new RazorError(
  56. String.Format(RazorResources.ParseError_Unexpected_Character_At_Helper_Name_Start, RazorResources.ErrorComponent_EndOfFile),
  57. 7, 0, 7));
  58. }
  59. [Fact]
  60. public void ParseHelperStatementTerminatesEarlyIfHeaderNotComplete()
  61. {
  62. ParseDocumentTest(@"@Helper
  63. @Helper",
  64. new MarkupBlock(
  65. Factory.EmptyHtml(),
  66. new HelperBlock(
  67. Factory.CodeTransition(),
  68. Factory.MetaCode("Helper\r\n").Accepts(AcceptedCharacters.None),
  69. Factory.EmptyVB().Hidden()),
  70. new HelperBlock(
  71. Factory.CodeTransition(),
  72. Factory.MetaCode("Helper"))),
  73. designTimeParser: true,
  74. expectedErrors: new[]
  75. {
  76. new RazorError(
  77. String.Format(
  78. RazorResources.ParseError_Unexpected_Character_At_Helper_Name_Start,
  79. String.Format(RazorResources.ErrorComponent_Character, "@")),
  80. 9, 1, 0),
  81. new RazorError(
  82. String.Format(
  83. RazorResources.ParseError_Unexpected_Character_At_Helper_Name_Start,
  84. RazorResources.ErrorComponent_EndOfFile),
  85. 16, 1, 7)
  86. });
  87. }
  88. [Fact]
  89. public void ParseHelperStatementTerminatesEarlyIfHeaderNotCompleteWithSpace()
  90. {
  91. ParseDocumentTest(@"@Helper @Helper",
  92. new MarkupBlock(
  93. Factory.EmptyHtml(),
  94. new HelperBlock(new HelperCodeGenerator(new LocationTagged<string>(String.Empty, 8, 0, 8), headerComplete: false),
  95. Factory.CodeTransition(),
  96. Factory.MetaCode(@"Helper ").Accepts(AcceptedCharacters.None),
  97. Factory.EmptyVB().Hidden()),
  98. new HelperBlock(
  99. Factory.CodeTransition(),
  100. Factory.MetaCode("Helper").Accepts(AcceptedCharacters.Any))),
  101. designTimeParser: true,
  102. expectedErrors: new[]
  103. {
  104. new RazorError(
  105. String.Format(
  106. RazorResources.ParseError_Unexpected_Character_At_Helper_Name_Start,
  107. String.Format(RazorResources.ErrorComponent_Character, "@")),
  108. 8, 0, 8),
  109. new RazorError(
  110. String.Format(
  111. RazorResources.ParseError_Unexpected_Character_At_Helper_Name_Start,
  112. RazorResources.ErrorComponent_EndOfFile),
  113. 15, 0, 15)
  114. });
  115. }
  116. [Fact]
  117. public void ParseHelperStatementAllowsDifferentlyCasedEndHelperKeyword()
  118. {
  119. ParseDocumentTest(@"@Helper Foo()
  120. end helper",
  121. new MarkupBlock(
  122. Factory.EmptyHtml(),
  123. new HelperBlock(new HelperCodeGenerator(new LocationTagged<string>("Foo()", 8, 0, 8), headerComplete: true),
  124. Factory.CodeTransition(),
  125. Factory.MetaCode("Helper ").Accepts(AcceptedCharacters.None),
  126. Factory.Code("Foo()").Hidden(),
  127. new StatementBlock(
  128. Factory.Code("\r\n").AsStatement(),
  129. Factory.MetaCode("end helper").Accepts(AcceptedCharacters.None))),
  130. Factory.EmptyHtml()));
  131. }
  132. [Fact]
  133. public void ParseHelperStatementCapturesWhitespaceToEndOfLineIfHelperStatementMissingName()
  134. {
  135. ParseDocumentTest(@"@Helper
  136. ",
  137. new MarkupBlock(
  138. Factory.EmptyHtml(),
  139. new HelperBlock(new HelperCodeGenerator(new LocationTagged<string>(" ", 8, 0, 8), headerComplete: false),
  140. Factory.CodeTransition(),
  141. Factory.MetaCode("Helper ").Accepts(AcceptedCharacters.None),
  142. Factory.Code(" ").Hidden()),
  143. Factory.Markup("\r\n ")),
  144. new RazorError(
  145. String.Format(
  146. RazorResources.ParseError_Unexpected_Character_At_Helper_Name_Start,
  147. RazorResources.ErrorComponent_Newline),
  148. 30, 0, 30));
  149. }
  150. [Fact]
  151. public void ParseHelperStatementCapturesWhitespaceToEndOfLineIfHelperStatementMissingOpenParen()
  152. {
  153. ParseDocumentTest(@"@Helper Foo
  154. ",
  155. new MarkupBlock(
  156. Factory.EmptyHtml(),
  157. new HelperBlock(new HelperCodeGenerator(new LocationTagged<string>("Foo ", 8, 0, 8), headerComplete: false),
  158. Factory.CodeTransition(),
  159. Factory.MetaCode("Helper ").Accepts(AcceptedCharacters.None),
  160. Factory.Code("Foo ").Hidden()),
  161. Factory.Markup("\r\n ")),
  162. new RazorError(
  163. String.Format(RazorResources.ParseError_MissingCharAfterHelperName, "("),
  164. 15, 0, 15));
  165. }
  166. [Fact]
  167. public void ParseHelperStatementCapturesAllContentToEndOfFileIfHelperStatementMissingCloseParenInParameterList()
  168. {
  169. ParseDocumentTest(@"@Helper Foo(Foo Bar
  170. Biz
  171. Boz",
  172. new MarkupBlock(
  173. Factory.EmptyHtml(),
  174. new HelperBlock(new HelperCodeGenerator(new LocationTagged<string>("Foo(Foo Bar\r\nBiz\r\nBoz", 8, 0, 8), headerComplete: false),
  175. Factory.CodeTransition(),
  176. Factory.MetaCode("Helper ").Accepts(AcceptedCharacters.None),
  177. Factory.Code("Foo(Foo Bar\r\nBiz\r\nBoz").Hidden())),
  178. new RazorError(RazorResources.ParseError_UnterminatedHelperParameterList, 11, 0, 11));
  179. }
  180. [Fact]
  181. public void ParseHelperStatementCapturesWhitespaceToEndOfLineIfHelperStatementMissingOpenBraceAfterParameterList()
  182. {
  183. ParseDocumentTest(@"@Helper Foo(foo as String)
  184. ",
  185. new MarkupBlock(
  186. Factory.EmptyHtml(),
  187. new HelperBlock(new HelperCodeGenerator(new LocationTagged<string>("Foo(foo as String)", 8, 0, 8), headerComplete: true),
  188. Factory.CodeTransition(),
  189. Factory.MetaCode("Helper ").Accepts(AcceptedCharacters.None),
  190. Factory.Code("Foo(foo as String)")
  191. .Hidden()
  192. .AutoCompleteWith(SyntaxConstants.VB.EndHelperKeyword),
  193. new StatementBlock(
  194. Factory.Code(" \r\n").AsStatement()))),
  195. new RazorError(
  196. String.Format(RazorResources.ParseError_BlockNotTerminated, "Helper", "End Helper"),
  197. 1, 0, 1));
  198. }
  199. [Fact]
  200. public void ParseHelperStatementContinuesParsingHelperUntilEOF()
  201. {
  202. ParseDocumentTest(@"@Helper Foo(foo as String)
  203. @<p>Foo</p>",
  204. new MarkupBlock(
  205. Factory.EmptyHtml(),
  206. new HelperBlock(new HelperCodeGenerator(new LocationTagged<string>("Foo(foo as String)", 8, 0, 8), headerComplete: true),
  207. Factory.CodeTransition(),
  208. Factory.MetaCode("Helper ").Accepts(AcceptedCharacters.None),
  209. Factory.Code("Foo(foo as String)")
  210. .Hidden()
  211. .AutoCompleteWith(SyntaxConstants.VB.EndHelperKeyword),
  212. new StatementBlock(
  213. Factory.Code("\r\n").AsStatement(),
  214. new MarkupBlock(
  215. Factory.Markup(" "),
  216. Factory.MarkupTransition(),
  217. Factory.Markup("<p>Foo</p>").Accepts(AcceptedCharacters.None)),
  218. Factory.EmptyVB().AsStatement()))),
  219. new RazorError(
  220. String.Format(RazorResources.ParseError_BlockNotTerminated, "Helper", "End Helper"),
  221. 1, 0, 1));
  222. }
  223. [Fact]
  224. public void ParseHelperStatementCorrectlyParsesHelperWithEmbeddedCode()
  225. {
  226. ParseDocumentTest(@"@Helper Foo(foo as String, bar as String)
  227. @<p>@foo</p>
  228. End Helper",
  229. new MarkupBlock(
  230. Factory.EmptyHtml(),
  231. new HelperBlock(new HelperCodeGenerator(new LocationTagged<string>("Foo(foo as String, bar as String)", 8, 0, 8), headerComplete: true),
  232. Factory.CodeTransition(),
  233. Factory.MetaCode("Helper ").Accepts(AcceptedCharacters.None),
  234. Factory.Code("Foo(foo as String, bar as String)").Hidden(),
  235. new StatementBlock(
  236. Factory.Code("\r\n").AsStatement(),
  237. new MarkupBlock(
  238. Factory.Markup(" "),
  239. Factory.MarkupTransition(),
  240. Factory.Markup("<p>"),
  241. new ExpressionBlock(
  242. Factory.CodeTransition(),
  243. Factory.Code("foo")
  244. .AsImplicitExpression(VBCodeParser.DefaultKeywords)
  245. .Accepts(AcceptedCharacters.NonWhiteSpace)),
  246. Factory.Markup("</p>\r\n").Accepts(AcceptedCharacters.None)),
  247. Factory.EmptyVB().AsStatement(),
  248. Factory.MetaCode("End Helper").Accepts(AcceptedCharacters.None))),
  249. Factory.EmptyHtml()));
  250. }
  251. [Fact]
  252. public void ParseHelperStatementGivesWhitespaceAfterCloseParenToMarkup()
  253. {
  254. ParseDocumentTest(@"@Helper Foo(string foo)
  255. ",
  256. new MarkupBlock(
  257. Factory.EmptyHtml(),
  258. new HelperBlock(new HelperCodeGenerator(new LocationTagged<string>("Foo(string foo)", 8, 0, 8), headerComplete: true),
  259. Factory.CodeTransition(),
  260. Factory.MetaCode("Helper ").Accepts(AcceptedCharacters.None),
  261. Factory.Code("Foo(string foo)")
  262. .Hidden()
  263. .AutoCompleteWith(SyntaxConstants.VB.EndHelperKeyword),
  264. new StatementBlock(
  265. Factory.Code(" \r\n ").AsStatement()))),
  266. designTimeParser: true,
  267. expectedErrors:
  268. new RazorError(
  269. String.Format(
  270. RazorResources.ParseError_BlockNotTerminated,
  271. "Helper", "End Helper"),
  272. 1, 0, 1));
  273. }
  274. [Fact]
  275. public void ParseHelperAcceptsNestedHelpersButOutputsError()
  276. {
  277. ParseDocumentTest(@"@Helper Foo(string foo)
  278. @Helper Bar(string baz)
  279. End Helper
  280. End Helper",
  281. new MarkupBlock(
  282. Factory.EmptyHtml(),
  283. new HelperBlock(new HelperCodeGenerator(new LocationTagged<string>("Foo(string foo)", 8, 0, 8), headerComplete: true),
  284. Factory.CodeTransition(),
  285. Factory.MetaCode("Helper ").Accepts(AcceptedCharacters.None),
  286. Factory.Code("Foo(string foo)").Hidden(),
  287. new StatementBlock(
  288. Factory.Code("\r\n ").AsStatement(),
  289. new HelperBlock(new HelperCodeGenerator(new LocationTagged<string>("Bar(string baz)", 37, 1, 12), headerComplete: true),
  290. Factory.CodeTransition(),
  291. Factory.MetaCode("Helper ").Accepts(AcceptedCharacters.None),
  292. Factory.Code("Bar(string baz)").Hidden(),
  293. new StatementBlock(
  294. Factory.Code("\r\n ").AsStatement(),
  295. Factory.MetaCode("End Helper").Accepts(AcceptedCharacters.None))),
  296. Factory.Code("\r\n").AsStatement(),
  297. Factory.MetaCode("End Helper").Accepts(AcceptedCharacters.None))),
  298. Factory.EmptyHtml()),
  299. designTimeParser: true,
  300. expectedErrors: new[]
  301. {
  302. new RazorError(
  303. RazorResources.ParseError_Helpers_Cannot_Be_Nested,
  304. 30, 1, 5)
  305. });
  306. }
  307. }
  308. }