public void EqualsShouldReturnExpectedResult()
        {
            var command = new Command<string>( Console.WriteLine );
            var target = new HierarchicalItem<string>( "test", command );
            var child = new HierarchicalItem<string>( "test", command );

            target.Add( child );

            Assert.True( target == new HierarchicalItem<string>( "test", command ) );
            Assert.True( target != new HierarchicalItem<string>( "test1", command ) );
            Assert.True( target.Equals( new HierarchicalItem<string>( "test", command ) ) );
            Assert.False( target.Equals( new HierarchicalItem<string>( "test1", command ) ) );
            Assert.True( target.Equals( (object) new HierarchicalItem<string>( "test", command ) ) );
            Assert.False( target.Equals( (object) new HierarchicalItem<string>( "test1", command ) ) );

            Assert.False( child == target );
            Assert.True( child != target );
            Assert.False( child.Equals( target ) );
            Assert.False( child.Equals( (object) target ) );

            var comparer = StringComparer.OrdinalIgnoreCase;
            target = new HierarchicalItem<string>( "test", command, comparer );

            Assert.True( target == new HierarchicalItem<string>( "TEST", command, comparer ) );
            Assert.True( target != new HierarchicalItem<string>( "TEST1", command, comparer ) );
            Assert.True( target.Equals( new HierarchicalItem<string>( "TEST", command, comparer ) ) );
            Assert.False( target.Equals( new HierarchicalItem<string>( "TEST1", command, comparer ) ) );
            Assert.True( target.Equals( (object) new HierarchicalItem<string>( "TEST", command, comparer ) ) );
            Assert.False( target.Equals( (object) new HierarchicalItem<string>( "TEST1", command, comparer ) ) );
        }
        public void WhenValueAndDepthOfTwoItemsAreUnequalTheyShouldYieldDifferentHashCodes()
        {
            var comparer = new DynamicComparer<Tuple<int, string>>( tuple => tuple.Item1.GetHashCode() );
            var command = new Command<string>( Console.WriteLine );
            var item1 = new HierarchicalItem<Tuple<int, string>>( new Tuple<int, string>( 2, "0" ), command, comparer );
            item1.Add( new HierarchicalItem<Tuple<int, string>>( new Tuple<int, string>( 1, "1" ), command, comparer ) );
            var item2 = new HierarchicalItem<Tuple<int, string>>( new Tuple<int, string>( 0, "2" ), command, comparer );
            item1[0].Add( item2 );

            Assert.NotEqual( item1.Depth, item2.Depth );
            Assert.NotEqual( item1.GetHashCode(), item2.GetHashCode() );
        }
 public void ParentPropertyShouldReturnCorrectObject()
 {
     var command = new Command<string>( Console.WriteLine );
     var target = new HierarchicalItem<string>( "test", command );
     Assert.Null( target.Parent );
     target.Add( new HierarchicalItem<string>( "1", command ) );
     Assert.Equal( target, target[0].Parent );
     target[0].Add( new HierarchicalItem<string>( "2", command ) );
     Assert.Equal( target[0], target[0][0].Parent );
     target[0][0].Add( new HierarchicalItem<string>( "3", command ) );
     Assert.Equal( target[0][0], target[0][0][0].Parent );
 }
        public void TwoItemsWithTheSameValueAtDifferentDepthsShouldYieldDifferentHashCodes()
        {
            var comparer = new DynamicComparer<Tuple<int, string>>( tuple => tuple.Item1.GetHashCode() );
            var command = new Command<string>( Console.WriteLine );
            var item1 = new HierarchicalItem<Tuple<int, string>>( new Tuple<int, string>( 1, "0" ), command, comparer );
            item1.Add( new HierarchicalItem<Tuple<int, string>>( new Tuple<int, string>( 1, "1" ), command, comparer ) );
            var item2 = new HierarchicalItem<Tuple<int, string>>( new Tuple<int, string>( 1, "2" ), command, comparer );
            item1[0].Add( item2 );

            Assert.Equal( item1.Value.Item1, item2.Value.Item1 );
            Assert.NotEqual( item1.Depth, item2.Depth );
            Assert.NotEqual( item1.GetHashCode(), item2.GetHashCode() );
        }
 public void DepthPropertyShouldReturnCorrectLevel()
 {
     var command = new Command<string>( Console.WriteLine );
     var target = new HierarchicalItem<string>( "test", command );
     Assert.Equal( 0, target.Depth );
     target.Add( new HierarchicalItem<string>( "1", command ) );
     Assert.Equal( 1, target[0].Depth );
     target[0].Add( new HierarchicalItem<string>( "2", command ) );
     Assert.Equal( 2, target[0][0].Depth );
     target[0][0].Add( new HierarchicalItem<string>( "3", command ) );
     Assert.Equal( 3, target[0][0][0].Depth );
 }