123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 |
- // Copyright (c) The Avalonia Project. All rights reserved.
- // Licensed under the MIT license. See licence.md file in the project root for full license information.
- using System.Collections.Generic;
- using System.Linq;
- using Avalonia.Data.Core;
- using Xunit;
- namespace Avalonia.Base.UnitTests.Data.Core
- {
- public class ExpressionNodeBuilderTests
- {
- [Fact]
- public void Should_Build_Single_Property()
- {
- var result = ToList(ExpressionNodeBuilder.Build("Foo"));
- AssertIsProperty(result[0], "Foo");
- }
- [Fact]
- public void Should_Build_Underscored_Property()
- {
- var result = ToList(ExpressionNodeBuilder.Build("_Foo"));
- AssertIsProperty(result[0], "_Foo");
- }
- [Fact]
- public void Should_Build_Property_With_Digits()
- {
- var result = ToList(ExpressionNodeBuilder.Build("F0o"));
- AssertIsProperty(result[0], "F0o");
- }
- [Fact]
- public void Should_Build_Property_Chain()
- {
- var result = ToList(ExpressionNodeBuilder.Build("Foo.Bar.Baz"));
- Assert.Equal(3, result.Count);
- AssertIsProperty(result[0], "Foo");
- AssertIsProperty(result[1], "Bar");
- AssertIsProperty(result[2], "Baz");
- }
- [Fact]
- public void Should_Build_Negated_Property_Chain()
- {
- var result = ToList(ExpressionNodeBuilder.Build("!Foo.Bar.Baz"));
- Assert.Equal(4, result.Count);
- Assert.IsType<LogicalNotNode>(result[0]);
- AssertIsProperty(result[1], "Foo");
- AssertIsProperty(result[2], "Bar");
- AssertIsProperty(result[3], "Baz");
- }
- [Fact]
- public void Should_Build_Double_Negated_Property_Chain()
- {
- var result = ToList(ExpressionNodeBuilder.Build("!!Foo.Bar.Baz"));
- Assert.Equal(5, result.Count);
- Assert.IsType<LogicalNotNode>(result[0]);
- Assert.IsType<LogicalNotNode>(result[1]);
- AssertIsProperty(result[2], "Foo");
- AssertIsProperty(result[3], "Bar");
- AssertIsProperty(result[4], "Baz");
- }
- [Fact]
- public void Should_Build_Indexed_Property()
- {
- var result = ToList(ExpressionNodeBuilder.Build("Foo[15]"));
- Assert.Equal(2, result.Count);
- AssertIsProperty(result[0], "Foo");
- AssertIsIndexer(result[1], "15");
- Assert.IsType<IndexerNode>(result[1]);
- }
- [Fact]
- public void Should_Build_Indexed_Property_StringIndex()
- {
- var result = ToList(ExpressionNodeBuilder.Build("Foo[Key]"));
- Assert.Equal(2, result.Count);
- AssertIsProperty(result[0], "Foo");
- AssertIsIndexer(result[1], "Key");
- Assert.IsType<IndexerNode>(result[1]);
- }
- [Fact]
- public void Should_Build_Multiple_Indexed_Property()
- {
- var result = ToList(ExpressionNodeBuilder.Build("Foo[15,6]"));
- Assert.Equal(2, result.Count);
- AssertIsProperty(result[0], "Foo");
- AssertIsIndexer(result[1], "15", "6");
- }
- [Fact]
- public void Should_Build_Multiple_Indexed_Property_With_Space()
- {
- var result = ToList(ExpressionNodeBuilder.Build("Foo[5, 16]"));
- Assert.Equal(2, result.Count);
- AssertIsProperty(result[0], "Foo");
- AssertIsIndexer(result[1], "5", "16");
- }
- [Fact]
- public void Should_Build_Consecutive_Indexers()
- {
- var result = ToList(ExpressionNodeBuilder.Build("Foo[15][16]"));
- Assert.Equal(3, result.Count);
- AssertIsProperty(result[0], "Foo");
- AssertIsIndexer(result[1], "15");
- AssertIsIndexer(result[2], "16");
- }
- [Fact]
- public void Should_Build_Indexed_Property_In_Chain()
- {
- var result = ToList(ExpressionNodeBuilder.Build("Foo.Bar[5, 6].Baz"));
- Assert.Equal(4, result.Count);
- AssertIsProperty(result[0], "Foo");
- AssertIsProperty(result[1], "Bar");
- AssertIsIndexer(result[2], "5", "6");
- AssertIsProperty(result[3], "Baz");
- }
- private void AssertIsProperty(ExpressionNode node, string name)
- {
- Assert.IsType<PropertyAccessorNode>(node);
- var p = (PropertyAccessorNode)node;
- Assert.Equal(name, p.PropertyName);
- }
- private void AssertIsIndexer(ExpressionNode node, params string[] args)
- {
- Assert.IsType<IndexerNode>(node);
- var e = (IndexerNode)node;
- Assert.Equal(e.Arguments.ToArray(), args);
- }
- private List<ExpressionNode> ToList(ExpressionNode node)
- {
- var result = new List<ExpressionNode>();
-
- while (node != null)
- {
- result.Add(node);
- node = node.Next;
- }
- return result;
- }
- }
- }
|