public void Equals_ComparedToObjectOfDifferentTypeThatCanBeCoercedIntoArrayInt_ReturnsTrue()
        {
            // Arrange
            var value1 = new SexpArrayInt(new[] { 2, -5, SexpArrayInt.Na });
            var value2 = new double[] { 2.0d, -5.0d, Convert.ToDouble(SexpArrayInt.Na) };
            var value3 = new List <int> {
                2, -5, SexpArrayInt.Na
            };
            var value4 = new SexpArrayDouble(new List <double> {
                2, -5, SexpArrayInt.Na
            });

            // Act & Assert

            // ReSharper disable RedundantCast
            Assert.True(value1.Equals(value2));
            Assert.True(value1.Equals(( object )value2));

            Assert.True(value1.Equals(value3));
            Assert.True(value1.Equals(( object )value3));

            Assert.True(value1.Equals(value4));
            Assert.True(value1.Equals(( object )value4));
            // ReSharper restore RedundantCast
        }
        public void Various_IntTests()
        {
            // note: this test was ported from RserveCLI.  Not in the typical Arrange/Act/Assert format

            var zero = new SexpArrayInt(0);
            var one  = new SexpArrayInt(1);
            var na   = new SexpArrayInt(SexpArrayInt.Na);

            // ReSharper disable EqualExpressionComparison
            Assert.True(zero.Equals(zero));
            Assert.True(one.Equals(one));
            Assert.True(na.Equals(na));

            // ReSharper restore EqualExpressionComparison
            Assert.True(!zero.Equals(one));
            Assert.True(!zero.Equals(na));
            Assert.True(!one.Equals(na));
            Assert.True(zero.Equals(0));
            Assert.True(one.Equals(1));
            Assert.True(na.IsNa);
            Assert.True(zero.AsInt == 0);
            Assert.True(one.AsInt == 1);

            foreach (var a in new Sexp[] { zero, one, na })
            {
                Assert.True(!a.Equals(new SexpNull()));
            }
        }
        public void Equals_ComparedToObjectWithDifferentValuesReadFromR_ReturnsFalse()
        {
            using (var service = new Rservice())
            {
                // Arrange
                var value1A = service.RConnection["matrix( as.integer( c( NA , 2 , 3 , -4 , -5 , 6 ) ) , ncol = 3 , byrow = TRUE )"];
                var value1B = new SexpArrayInt(new[] { SexpArrayInt.Na, -4, 2, -5, 3, 6 });

                var value2A = service.RConnection["as.integer( c( -4 , -2 , -1 ) )"];
                var value2B = new SexpArrayInt(new[] { -4, -2, -1 });

                var value3A = service.RConnection["as.integer( -9 )"];
                var value3B = new SexpArrayInt(-9);

                var value4A = service.RConnection["integer()"];
                var value4B = new SexpArrayInt();

                // Act & Assert
                Assert.False(value3B.Equals(value2A));
                Assert.False(value2A.Equals(value4A));
                Assert.False(value3B.Equals(value2B));
                Assert.False(value4A.Equals(value1B));
                Assert.False(value3B.Equals(value1A));
                Assert.False(value4A.Equals(value3A));
                Assert.False(value1A.Equals(value2B));
                Assert.False(value2A.Equals(value3A));
                Assert.False(value3A.Equals(value1A));
                Assert.False(value1B.Equals(value4B));
            }
        }
        public void AsInts_SexpConstructedUsingConstructorOrMake_ReturnsSameSetOfInts()
        {
            // Arrange
            var values1 = new int[1, 1] {
                { 2 }
            };
            var values2 = new int[3, 4] {
                { 8, 2, 7, SexpArrayInt.Na }, { 0, -9, 5, -2 }, { 1, -4, -3, -8 }
            };
            const int values3 = -5;
            var       values4 = new List <int> {
                4, 5, 6
            };

            // Act
            Sexp sexp1 = Sexp.Make(values1);
            Sexp sexp2 = Sexp.Make(values2);
            Sexp sexp3 = new SexpArrayInt(values3);
            Sexp sexp4 = new SexpArrayInt(values4);
            Sexp sexp5 = new SexpArrayInt();

            // Assert
            Assert.Equal(new[] { 2 }, sexp1.AsInts);
            Assert.Equal(new[] { 8, 0, 1, 2, -9, -4, 7, 5, -3, SexpArrayInt.Na, -2, -8 }, sexp2.AsInts);
            Assert.Equal(new[] { -5 }, sexp3.AsInts);
            Assert.Equal(new[] { 4, 5, 6 }, sexp4.AsInts);
            Assert.Equal(new int[] { }, sexp5.AsInts);
        }
        public void IsNa_NaValueInConstructor_ReturnTrue()
        {
            // Arrange
            var sexp1 = new SexpArrayInt(SexpArrayInt.Na);
            var sexp2 = new SexpArrayInt(new[] { SexpArrayInt.Na });

            // Act & Assert
            Assert.True(sexp1.IsNa);
            Assert.True(sexp2.IsNa);
        }
        public void IsNa_NotNa_ReturnFalse()
        {
            // Arrange
            var sexp1 = new SexpArrayInt(3);
            var sexp2 = new SexpArrayInt(new[] { -8 });

            // Act & Assert
            Assert.False(sexp1.IsNa);
            Assert.False(sexp2.IsNa);
        }
        public void IsNa_SexpContainsZeroOrMultipleValues_ThrowsNotSupportedException()
        {
            // Arrange
            var sexp1 = new SexpArrayInt();
            var sexp2 = new SexpArrayInt(new int[] { });
            var sexp3 = new SexpArrayInt(new[] { SexpArrayInt.Na, 4 });
            var sexp4 = new SexpArrayInt(new[] { 4, -9 });

            // Act & Assert
            Assert.Throws <NotSupportedException>(() => sexp1.IsNa);
            Assert.Throws <NotSupportedException>(() => sexp2.IsNa);
            Assert.Throws <NotSupportedException>(() => sexp3.IsNa);
            Assert.Throws <NotSupportedException>(() => sexp4.IsNa);
        }
        public void Equals_ComparedToSameReferencedObject_ReturnsTrue()
        {
            // Arrange
            var value1 = new SexpArrayInt();
            var value2 = new SexpArrayInt(new[] { 2, SexpArrayInt.Na, -4 });
            var value3 = new SexpArrayInt(-6);

            // Act & Assert
            Assert.True(value1.Equals(value1));
            Assert.True(value1.Equals(( object )value1));
            Assert.True(value2.Equals(value2));
            Assert.True(value2.Equals(( object )value2));
            Assert.True(value3.Equals(value3));
            Assert.True(value3.Equals(( object )value3));
        }
        public void Equals_ComparedToObjectOfDifferentType_ReturnsFalse()
        {
            // Arrange
            var value1 = new SexpArrayDouble(new[] { 2.3, double.NaN, 4 });
            var value2 = new SexpArrayBool(true);
            var value3 = new SexpArrayInt(new[] { 1, 3 });

            // Act & Assert

            // ReSharper disable RedundantCast
            Assert.False(value1.Equals(value2));
            Assert.False(value1.Equals(( object )value2));
            Assert.False(value1.Equals(value3));
            Assert.False(value1.Equals(( object )value3));
            // ReSharper restore RedundantCast
        }
        public void Equals_ComparedToNull_ReturnsFalse()
        {
            // Arrange
            var value1 = new SexpArrayInt();
            var value2 = new SexpArrayInt(new[] { SexpArrayInt.Na, -5, 4 });
            var value3 = new SexpArrayInt(6);

            // Act & Assert
            // ReSharper disable RedundantCast
            Assert.False(value1.Equals(( SexpArrayInt )null));
            Assert.False(value1.Equals(( object )null));
            Assert.False(value2.Equals(( SexpArrayInt )null));
            Assert.False(value2.Equals(( object )null));
            Assert.False(value3.Equals(( SexpArrayInt )null));
            Assert.False(value3.Equals(( object )null));
            // ReSharper restore RedundantCast
        }
        public void Equals_ComparedToObjectWithSameValues_ReturnsTrue()
        {
            // Arrange
            var value1A = new SexpArrayInt();
            var value1B = new SexpArrayInt();
            var value2A = new SexpArrayInt(new[] { 1, SexpArrayInt.Na, -3 });
            var value2B = new SexpArrayInt(new[] { 1, SexpArrayInt.Na, -3 });
            var value3A = new SexpArrayInt(1);
            var value3B = new SexpArrayInt(1);
            var value4A = new SexpArrayInt(new[] { -8 });
            var value4B = new SexpArrayInt(-8);

            // Act & Assert
            Assert.True(value1A.Equals(value1B));
            Assert.True(value2A.Equals(value2B));
            Assert.True(value3A.Equals(value3B));
            Assert.True(value4A.Equals(value4B));
        }
        public void Equals_ComparedToObjectWithDifferentValues_ReturnsFalse()
        {
            // Arrange
            var value1 = new SexpArrayInt();
            var value2 = new SexpArrayInt(-7);
            var value3 = new SexpArrayInt(new[] { -1, -6, -3 });
            var value4 = new SexpArrayInt(new[] { SexpArrayInt.Na, -6, -3 });

            // Act & Assert
            Assert.False(value1.Equals(value2));
            Assert.False(value1.Equals(value3));
            Assert.False(value1.Equals(value4));
            Assert.False(value2.Equals(value1));
            Assert.False(value2.Equals(value3));
            Assert.False(value2.Equals(value4));
            Assert.False(value3.Equals(value1));
            Assert.False(value3.Equals(value2));
            Assert.False(value3.Equals(value4));
            Assert.False(value4.Equals(value1));
            Assert.False(value4.Equals(value2));
            Assert.False(value4.Equals(value3));
        }
        public void Equals_ComparedToObjectOfDifferentTypeThatCanBeCoercedIntoArrayDouble_ReturnsTrue()
        {
            // Arrange
            var value1 = new SexpArrayDouble(new[] { 4d, -2d, -3d });
            var value2 = new List <double> {
                4, -2, -3
            };
            var value3 = new int[] { 4, -2, -3 };
            var value4 = new SexpArrayInt(new int[] { 4, -2, -3 });

            // Act & Assert

            // ReSharper disable RedundantCast
            Assert.True(value1.Equals(value2));
            Assert.True(value1.Equals(( object )value2));

            Assert.True(value1.Equals(value3));
            Assert.True(value1.Equals(( object )value3));

            Assert.True(value1.Equals(value4));
            Assert.True(value1.Equals(( object )value4));
            // ReSharper restore RedundantCast
        }
        public void Equals_ComparedToObjectOfDifferentTypeThatCanBeCoercedIntoArrayInt_ReturnsTrue()
        {
            // Arrange
            var value1 = new SexpArrayInt( new[] { 2 , -5 , SexpArrayInt.Na } );
            var value2 = new double[] { 2.0d , -5.0d , Convert.ToDouble( SexpArrayInt.Na ) };
            var value3 = new List<int> { 2 , -5 , SexpArrayInt.Na };
            var value4 = new SexpArrayDouble( new List<double> { 2 , -5 , SexpArrayInt.Na } );

            // Act & Assert

            // ReSharper disable RedundantCast
            Assert.True( value1.Equals( value2 ) );
            Assert.True( value1.Equals( ( object )value2 ) );

            Assert.True( value1.Equals( value3 ) );
            Assert.True( value1.Equals( ( object )value3 ) );

            Assert.True( value1.Equals( value4 ) );
            Assert.True( value1.Equals( ( object )value4 ) );
            // ReSharper restore RedundantCast
        }
        public void Equals_ComparedToObjectWithDifferentValues_ReturnsFalse()
        {
            // Arrange
            var value1 = new SexpArrayInt();
            var value2 = new SexpArrayInt( -7 );
            var value3 = new SexpArrayInt( new[] { -1 , -6 , -3 } );
            var value4 = new SexpArrayInt( new[] { SexpArrayInt.Na , -6 , -3 } );

            // Act & Assert
            Assert.False( value1.Equals( value2 ) );
            Assert.False( value1.Equals( value3 ) );
            Assert.False( value1.Equals( value4 ) );
            Assert.False( value2.Equals( value1 ) );
            Assert.False( value2.Equals( value3 ) );
            Assert.False( value2.Equals( value4 ) );
            Assert.False( value3.Equals( value1 ) );
            Assert.False( value3.Equals( value2 ) );
            Assert.False( value3.Equals( value4 ) );
            Assert.False( value4.Equals( value1 ) );
            Assert.False( value4.Equals( value2 ) );
            Assert.False( value4.Equals( value3 ) );
        }
        public void Equals_ComparedToObjectWithSameValuesReadFromR_ReturnsFalse()
        {
            using ( var service = new Rservice() )
            {
                // Arrange
                var value1A = service.RConnection[ "matrix( as.integer( c( 1 , 2 , 3 , -4 , -5 , NA ) ) , ncol = 3 , byrow = TRUE )" ];
                var value1B = new SexpArrayInt( new[] { 1 , -4 , 2 , -5 , 3 , SexpArrayInt.Na } );

                var value2A = service.RConnection[ "as.integer( c( -4 , -2 , -1 ) )" ];
                var value2B = new SexpArrayInt( new[] { -4 , -2 , -1 } );

                var value3A = service.RConnection[ "as.integer( -9 )" ];
                var value3B = new SexpArrayInt( -9 );

                var value4A = service.RConnection[ "integer()" ];
                var value4B = new SexpArrayInt();

                // Act & Assert
                Assert.True( value1A.Equals( value1B ) );
                Assert.True( value1B.Equals( value1A ) );
                Assert.True( value2A.Equals( value2B ) );
                Assert.True( value2B.Equals( value2A ) );
                Assert.True( value3A.Equals( value3B ) );
                Assert.True( value3B.Equals( value3A ) );
                Assert.True( value4A.Equals( value4B ) );
                Assert.True( value4B.Equals( value4A ) );
            }
        }
        public void Equals_ComparedToObjectWithSameValues_ReturnsTrue()
        {
            // Arrange
            var value1A = new SexpArrayInt();
            var value1B = new SexpArrayInt();
            var value2A = new SexpArrayInt( new[] { 1 , SexpArrayInt.Na , -3 } );
            var value2B = new SexpArrayInt( new[] { 1 , SexpArrayInt.Na , -3 } );
            var value3A = new SexpArrayInt( 1 );
            var value3B = new SexpArrayInt( 1 );
            var value4A = new SexpArrayInt( new[] { -8 } );
            var value4B = new SexpArrayInt( -8 );

            // Act & Assert
            Assert.True( value1A.Equals( value1B ) );
            Assert.True( value2A.Equals( value2B ) );
            Assert.True( value3A.Equals( value3B ) );
            Assert.True( value4A.Equals( value4B ) );
        }
        public void Equals_ComparedToSameReferencedObject_ReturnsTrue()
        {
            // Arrange
            var value1 = new SexpArrayInt();
            var value2 = new SexpArrayInt( new[] { 2 , SexpArrayInt.Na , -4 } );
            var value3 = new SexpArrayInt( -6 );

            // Act & Assert
            Assert.True( value1.Equals( value1 ) );
            Assert.True( value1.Equals( ( object )value1 ) );
            Assert.True( value2.Equals( value2 ) );
            Assert.True( value2.Equals( ( object )value2 ) );
            Assert.True( value3.Equals( value3 ) );
            Assert.True( value3.Equals( ( object )value3 ) );
        }
        public void IsNa_NaValueInConstructor_ReturnTrue()
        {
            // Arrange
            var sexp1 = new SexpArrayInt( SexpArrayInt.Na );
            var sexp2 = new SexpArrayInt( new[] { SexpArrayInt.Na } );

            // Act & Assert
            Assert.True( sexp1.IsNa );
            Assert.True( sexp2.IsNa );
        }
        public void IsNa_NotNa_ReturnFalse()
        {
            // Arrange
            var sexp1 = new SexpArrayInt( 3 );
            var sexp2 = new SexpArrayInt( new[] { -8 } );

            // Act & Assert
            Assert.False( sexp1.IsNa );
            Assert.False( sexp2.IsNa );
        }
        public void IsNa_SexpContainsZeroOrMultipleValues_ThrowsNotSupportedException()
        {
            // Arrange
            var sexp1 = new SexpArrayInt();
            var sexp2 = new SexpArrayInt( new int[] { } );
            var sexp3 = new SexpArrayInt( new[] { SexpArrayInt.Na , 4 } );
            var sexp4 = new SexpArrayInt( new[] { 4 , -9 } );

            // Act & Assert
            Assert.Throws<NotSupportedException>( () => sexp1.IsNa );
            Assert.Throws<NotSupportedException>( () => sexp2.IsNa );
            Assert.Throws<NotSupportedException>( () => sexp3.IsNa );
            Assert.Throws<NotSupportedException>( () => sexp4.IsNa );
        }
        public void Equals_ComparedToNull_ReturnsFalse()
        {
            // Arrange
            var value1 = new SexpArrayInt();
            var value2 = new SexpArrayInt( new[] { SexpArrayInt.Na , -5 , 4 } );
            var value3 = new SexpArrayInt( 6 );

            // Act & Assert
            // ReSharper disable RedundantCast
            Assert.False( value1.Equals( ( SexpArrayInt )null ) );
            Assert.False( value1.Equals( ( object )null ) );
            Assert.False( value2.Equals( ( SexpArrayInt )null ) );
            Assert.False( value2.Equals( ( object )null ) );
            Assert.False( value3.Equals( ( SexpArrayInt )null ) );
            Assert.False( value3.Equals( ( object )null ) );
            // ReSharper restore RedundantCast
        }
        public void Equals_ComparedToObjectOfDifferentTypeThatCanBeCoercedIntoArrayDouble_ReturnsTrue()
        {
            // Arrange
            var value1 = new SexpArrayDouble( new[] { 4d , -2d , -3d } );
            var value2 = new List<double> { 4 , -2 , -3 };
            var value3 = new int[] { 4 , -2 , -3 };
            var value4 = new SexpArrayInt( new int[] { 4 , -2 , -3 } );

            // Act & Assert

            // ReSharper disable RedundantCast
            Assert.True( value1.Equals( value2 ) );
            Assert.True( value1.Equals( ( object )value2 ) );

            Assert.True( value1.Equals( value3 ) );
            Assert.True( value1.Equals( ( object )value3 ) );

            Assert.True( value1.Equals( value4 ) );
            Assert.True( value1.Equals( ( object )value4 ) );
            // ReSharper restore RedundantCast
        }
        public void Various_IntTests()
        {
            // note: this test was ported from RserveCLI.  Not in the typical Arrange/Act/Assert format

            var zero = new SexpArrayInt( 0 );
            var one = new SexpArrayInt( 1 );
            var na = new SexpArrayInt( SexpArrayInt.Na );

            // ReSharper disable EqualExpressionComparison
            Assert.True( zero.Equals( zero ) );
            Assert.True( one.Equals( one ) );
            Assert.True( na.Equals( na ) );

            // ReSharper restore EqualExpressionComparison
            Assert.True( !zero.Equals( one ) );
            Assert.True( !zero.Equals( na ) );
            Assert.True( !one.Equals( na ) );
            Assert.True( zero.Equals( 0 ) );
            Assert.True( one.Equals( 1 ) );
            Assert.True( na.IsNa );
            Assert.True( zero.AsInt == 0 );
            Assert.True( one.AsInt == 1 );

            foreach ( var a in new Sexp[] { zero , one , na } )
            {
                Assert.True( !a.Equals( new SexpNull() ) );
            }
        }
        public void Equals_ComparedToObjectOfDifferentType_ReturnsFalse()
        {
            // Arrange
            var value1 = new SexpArrayDouble( new[] { 2.3 , double.NaN , 4 } );
            var value2 = new SexpArrayBool( true );
            var value3 = new SexpArrayInt( new[] { 1 , 3 } );

            // Act & Assert

            // ReSharper disable RedundantCast
            Assert.False( value1.Equals( value2 ) );
            Assert.False( value1.Equals( ( object )value2 ) );
            Assert.False( value1.Equals( value3 ) );
            Assert.False( value1.Equals( ( object )value3 ) );
            // ReSharper restore RedundantCast
        }
        public void AsInts_SexpConstructedUsingConstructorOrMake_ReturnsSameSetOfInts()
        {
            // Arrange
            var values1 = new int[ 1 , 1 ] { { 2 } };
            var values2 = new int[ 3 , 4 ] { { 8 , 2 , 7 , SexpArrayInt.Na } , { 0 , -9 , 5 , -2 } , { 1 , -4 , -3 , -8 } };
            const int values3 = -5;
            var values4 = new List<int> { 4 , 5 , 6 };

            // Act
            Sexp sexp1 = Sexp.Make( values1 );
            Sexp sexp2 = Sexp.Make( values2 );
            Sexp sexp3 = new SexpArrayInt( values3 );
            Sexp sexp4 = new SexpArrayInt( values4 );
            Sexp sexp5 = new SexpArrayInt();

            // Assert
            Assert.Equal( new[] { 2 } , sexp1.AsInts );
            Assert.Equal( new[] { 8 , 0 , 1 , 2 , -9 , -4 , 7 , 5 , -3 , SexpArrayInt.Na , -2 , -8 } , sexp2.AsInts );
            Assert.Equal( new[] { -5 } , sexp3.AsInts );
            Assert.Equal( new[] { 4 , 5 , 6 } , sexp4.AsInts );
            Assert.Equal( new int[] { } , sexp5.AsInts );
        }