PropertyParserTests.cs 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. using System;
  2. using Avalonia.Data.Core;
  3. using Avalonia.Markup.Parsers;
  4. using Avalonia.Markup.Xaml.Parsers;
  5. using Avalonia.Utilities;
  6. using Xunit;
  7. namespace Avalonia.Markup.Xaml.UnitTests.Parsers
  8. {
  9. public class PropertyParserTests
  10. {
  11. [Fact]
  12. public void Parses_Name()
  13. {
  14. var target = new PropertyParser();
  15. var reader = new CharacterReader("Foo".AsSpan());
  16. var (ns, owner, name) = PropertyParser.Parse(reader);
  17. Assert.Null(ns);
  18. Assert.Null(owner);
  19. Assert.Equal("Foo", name);
  20. }
  21. [Fact]
  22. public void Parses_Owner_And_Name()
  23. {
  24. var target = new PropertyParser();
  25. var reader = new CharacterReader("Foo.Bar".AsSpan());
  26. var (ns, owner, name) = PropertyParser.Parse(reader);
  27. Assert.Null(ns);
  28. Assert.Equal("Foo", owner);
  29. Assert.Equal("Bar", name);
  30. }
  31. [Fact]
  32. public void Parses_Namespace_Owner_And_Name()
  33. {
  34. var target = new PropertyParser();
  35. var reader = new CharacterReader("foo:Bar.Baz".AsSpan());
  36. var (ns, owner, name) = PropertyParser.Parse(reader);
  37. Assert.Equal("foo", ns);
  38. Assert.Equal("Bar", owner);
  39. Assert.Equal("Baz", name);
  40. }
  41. [Fact]
  42. public void Parses_Owner_And_Name_With_Parentheses()
  43. {
  44. var target = new PropertyParser();
  45. var reader = new CharacterReader("(Foo.Bar)".AsSpan());
  46. var (ns, owner, name) = PropertyParser.Parse(reader);
  47. Assert.Null(ns);
  48. Assert.Equal("Foo", owner);
  49. Assert.Equal("Bar", name);
  50. }
  51. [Fact]
  52. public void Parses_Namespace_Owner_And_Name_With_Parentheses()
  53. {
  54. var target = new PropertyParser();
  55. var reader = new CharacterReader("(foo:Bar.Baz)".AsSpan());
  56. var (ns, owner, name) = PropertyParser.Parse(reader);
  57. Assert.Equal("foo", ns);
  58. Assert.Equal("Bar", owner);
  59. Assert.Equal("Baz", name);
  60. }
  61. [Fact]
  62. public void Fails_With_Empty_String()
  63. {
  64. var target = new PropertyParser();
  65. var ex = Assert.Throws<ExpressionParseException>(() => PropertyParser.Parse(new CharacterReader(ReadOnlySpan<char>.Empty)));
  66. Assert.Equal(0, ex.Column);
  67. Assert.Equal("Expected property name.", ex.Message);
  68. }
  69. [Fact]
  70. public void Fails_With_Only_Whitespace()
  71. {
  72. var target = new PropertyParser();
  73. var ex = Assert.Throws<ExpressionParseException>(() => PropertyParser.Parse(new CharacterReader(" ".AsSpan())));
  74. Assert.Equal(0, ex.Column);
  75. Assert.Equal("Unexpected ' '.", ex.Message);
  76. }
  77. [Fact]
  78. public void Fails_With_Leading_Whitespace()
  79. {
  80. var target = new PropertyParser();
  81. var ex = Assert.Throws<ExpressionParseException>(() => PropertyParser.Parse(new CharacterReader(" Foo".AsSpan())));
  82. Assert.Equal(0, ex.Column);
  83. Assert.Equal("Unexpected ' '.", ex.Message);
  84. }
  85. [Fact]
  86. public void Fails_With_Trailing_Whitespace()
  87. {
  88. var target = new PropertyParser();
  89. var ex = Assert.Throws<ExpressionParseException>(() => PropertyParser.Parse(new CharacterReader("Foo ".AsSpan())));
  90. Assert.Equal(3, ex.Column);
  91. Assert.Equal("Unexpected ' '.", ex.Message);
  92. }
  93. [Fact]
  94. public void Fails_With_Invalid_Property_Name()
  95. {
  96. var target = new PropertyParser();
  97. var ex = Assert.Throws<ExpressionParseException>(() => PropertyParser.Parse(new CharacterReader("123".AsSpan())));
  98. Assert.Equal(0, ex.Column);
  99. Assert.Equal("Unexpected '1'.", ex.Message);
  100. }
  101. [Fact]
  102. public void Fails_With_Trailing_Junk()
  103. {
  104. var target = new PropertyParser();
  105. var ex = Assert.Throws<ExpressionParseException>(() => PropertyParser.Parse(new CharacterReader("Foo%".AsSpan())));
  106. Assert.Equal(3, ex.Column);
  107. Assert.Equal("Unexpected '%'.", ex.Message);
  108. }
  109. [Fact]
  110. public void Fails_With_Invalid_Property_Name_After_Owner()
  111. {
  112. var target = new PropertyParser();
  113. var ex = Assert.Throws<ExpressionParseException>(() => PropertyParser.Parse(new CharacterReader("Foo.123".AsSpan())));
  114. Assert.Equal(4, ex.Column);
  115. Assert.Equal("Unexpected '1'.", ex.Message);
  116. }
  117. [Fact]
  118. public void Fails_With_Whitespace_Between_Owner_And_Name()
  119. {
  120. var target = new PropertyParser();
  121. var ex = Assert.Throws<ExpressionParseException>(() => PropertyParser.Parse(new CharacterReader("Foo. Bar".AsSpan())));
  122. Assert.Equal(4, ex.Column);
  123. Assert.Equal("Unexpected ' '.", ex.Message);
  124. }
  125. [Fact]
  126. public void Fails_With_Too_Many_Segments()
  127. {
  128. var target = new PropertyParser();
  129. var ex = Assert.Throws<ExpressionParseException>(() => PropertyParser.Parse(new CharacterReader("Foo.Bar.Baz".AsSpan())));
  130. Assert.Equal(8, ex.Column);
  131. Assert.Equal("Unexpected '.'.", ex.Message);
  132. }
  133. [Fact]
  134. public void Fails_With_Too_Many_Namespaces()
  135. {
  136. var target = new PropertyParser();
  137. var ex = Assert.Throws<ExpressionParseException>(() => PropertyParser.Parse(new CharacterReader("foo:bar:Baz".AsSpan())));
  138. Assert.Equal(8, ex.Column);
  139. Assert.Equal("Unexpected ':'.", ex.Message);
  140. }
  141. [Fact]
  142. public void Fails_With_Parens_But_No_Owner()
  143. {
  144. var target = new PropertyParser();
  145. var ex = Assert.Throws<ExpressionParseException>(() => PropertyParser.Parse(new CharacterReader("(Foo)".AsSpan())));
  146. Assert.Equal(1, ex.Column);
  147. Assert.Equal("Expected property owner.", ex.Message);
  148. }
  149. [Fact]
  150. public void Fails_With_Parens_And_Namespace_But_No_Owner()
  151. {
  152. var target = new PropertyParser();
  153. var ex = Assert.Throws<ExpressionParseException>(() => PropertyParser.Parse(new CharacterReader("(foo:Bar)".AsSpan())));
  154. Assert.Equal(1, ex.Column);
  155. Assert.Equal("Expected property owner.", ex.Message);
  156. }
  157. [Fact]
  158. public void Fails_With_Missing_Close_Parens()
  159. {
  160. var target = new PropertyParser();
  161. var ex = Assert.Throws<ExpressionParseException>(() => PropertyParser.Parse(new CharacterReader("(Foo.Bar".AsSpan())));
  162. Assert.Equal(8, ex.Column);
  163. Assert.Equal("Expected ')'.", ex.Message);
  164. }
  165. [Fact]
  166. public void Fails_With_Unexpected_Close_Parens()
  167. {
  168. var target = new PropertyParser();
  169. var ex = Assert.Throws<ExpressionParseException>(() => PropertyParser.Parse(new CharacterReader("Foo.Bar)".AsSpan())));
  170. Assert.Equal(7, ex.Column);
  171. Assert.Equal("Unexpected ')'.", ex.Message);
  172. }
  173. }
  174. }