ExpressionNodeBuilderTests.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. // Copyright (c) The Avalonia Project. All rights reserved.
  2. // Licensed under the MIT license. See licence.md file in the project root for full license information.
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using Avalonia.Data.Core;
  6. using Xunit;
  7. namespace Avalonia.Base.UnitTests.Data.Core
  8. {
  9. public class ExpressionNodeBuilderTests
  10. {
  11. [Fact]
  12. public void Should_Build_Single_Property()
  13. {
  14. var result = ToList(ExpressionNodeBuilder.Build("Foo"));
  15. AssertIsProperty(result[0], "Foo");
  16. }
  17. [Fact]
  18. public void Should_Build_Underscored_Property()
  19. {
  20. var result = ToList(ExpressionNodeBuilder.Build("_Foo"));
  21. AssertIsProperty(result[0], "_Foo");
  22. }
  23. [Fact]
  24. public void Should_Build_Property_With_Digits()
  25. {
  26. var result = ToList(ExpressionNodeBuilder.Build("F0o"));
  27. AssertIsProperty(result[0], "F0o");
  28. }
  29. [Fact]
  30. public void Should_Build_Property_Chain()
  31. {
  32. var result = ToList(ExpressionNodeBuilder.Build("Foo.Bar.Baz"));
  33. Assert.Equal(3, result.Count);
  34. AssertIsProperty(result[0], "Foo");
  35. AssertIsProperty(result[1], "Bar");
  36. AssertIsProperty(result[2], "Baz");
  37. }
  38. [Fact]
  39. public void Should_Build_Negated_Property_Chain()
  40. {
  41. var result = ToList(ExpressionNodeBuilder.Build("!Foo.Bar.Baz"));
  42. Assert.Equal(4, result.Count);
  43. Assert.IsType<LogicalNotNode>(result[0]);
  44. AssertIsProperty(result[1], "Foo");
  45. AssertIsProperty(result[2], "Bar");
  46. AssertIsProperty(result[3], "Baz");
  47. }
  48. [Fact]
  49. public void Should_Build_Double_Negated_Property_Chain()
  50. {
  51. var result = ToList(ExpressionNodeBuilder.Build("!!Foo.Bar.Baz"));
  52. Assert.Equal(5, result.Count);
  53. Assert.IsType<LogicalNotNode>(result[0]);
  54. Assert.IsType<LogicalNotNode>(result[1]);
  55. AssertIsProperty(result[2], "Foo");
  56. AssertIsProperty(result[3], "Bar");
  57. AssertIsProperty(result[4], "Baz");
  58. }
  59. [Fact]
  60. public void Should_Build_Indexed_Property()
  61. {
  62. var result = ToList(ExpressionNodeBuilder.Build("Foo[15]"));
  63. Assert.Equal(2, result.Count);
  64. AssertIsProperty(result[0], "Foo");
  65. AssertIsIndexer(result[1], "15");
  66. Assert.IsType<IndexerNode>(result[1]);
  67. }
  68. [Fact]
  69. public void Should_Build_Indexed_Property_StringIndex()
  70. {
  71. var result = ToList(ExpressionNodeBuilder.Build("Foo[Key]"));
  72. Assert.Equal(2, result.Count);
  73. AssertIsProperty(result[0], "Foo");
  74. AssertIsIndexer(result[1], "Key");
  75. Assert.IsType<IndexerNode>(result[1]);
  76. }
  77. [Fact]
  78. public void Should_Build_Multiple_Indexed_Property()
  79. {
  80. var result = ToList(ExpressionNodeBuilder.Build("Foo[15,6]"));
  81. Assert.Equal(2, result.Count);
  82. AssertIsProperty(result[0], "Foo");
  83. AssertIsIndexer(result[1], "15", "6");
  84. }
  85. [Fact]
  86. public void Should_Build_Multiple_Indexed_Property_With_Space()
  87. {
  88. var result = ToList(ExpressionNodeBuilder.Build("Foo[5, 16]"));
  89. Assert.Equal(2, result.Count);
  90. AssertIsProperty(result[0], "Foo");
  91. AssertIsIndexer(result[1], "5", "16");
  92. }
  93. [Fact]
  94. public void Should_Build_Consecutive_Indexers()
  95. {
  96. var result = ToList(ExpressionNodeBuilder.Build("Foo[15][16]"));
  97. Assert.Equal(3, result.Count);
  98. AssertIsProperty(result[0], "Foo");
  99. AssertIsIndexer(result[1], "15");
  100. AssertIsIndexer(result[2], "16");
  101. }
  102. [Fact]
  103. public void Should_Build_Indexed_Property_In_Chain()
  104. {
  105. var result = ToList(ExpressionNodeBuilder.Build("Foo.Bar[5, 6].Baz"));
  106. Assert.Equal(4, result.Count);
  107. AssertIsProperty(result[0], "Foo");
  108. AssertIsProperty(result[1], "Bar");
  109. AssertIsIndexer(result[2], "5", "6");
  110. AssertIsProperty(result[3], "Baz");
  111. }
  112. private void AssertIsProperty(ExpressionNode node, string name)
  113. {
  114. Assert.IsType<PropertyAccessorNode>(node);
  115. var p = (PropertyAccessorNode)node;
  116. Assert.Equal(name, p.PropertyName);
  117. }
  118. private void AssertIsIndexer(ExpressionNode node, params string[] args)
  119. {
  120. Assert.IsType<IndexerNode>(node);
  121. var e = (IndexerNode)node;
  122. Assert.Equal(e.Arguments.ToArray(), args);
  123. }
  124. private List<ExpressionNode> ToList(ExpressionNode node)
  125. {
  126. var result = new List<ExpressionNode>();
  127. while (node != null)
  128. {
  129. result.Add(node);
  130. node = node.Next;
  131. }
  132. return result;
  133. }
  134. }
  135. }