// $Id$
// 
// Copyright 2007-2008 Cisco Systems Inc.
// 
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy
// of the License at
//  
//     http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations
// under the License.

using System;
using System.Collections.Generic;
using System.Text;
using etch.tests.types.Test1;
using NUnit.Framework;
using Etch.Msg;
using Etch.Support;
using Etch.Transport;


namespace etch.tests
{
    [TestFixture]
    public class TestTest1DotCsharp
    {
        [TestFixtureSetUp]
        public void First()
        {
            Console.WriteLine();
            Console.Write( "TestTest" );
        }


        [Test]
	    public void const_booleans()  
	    {
		    Assert.IsFalse( ConstsTest1.BOOL1 );
		    Assert.IsTrue( ConstsTest1.BOOL2 );
	    }
    	
	    [Test]
	    public void const_bytes()  
	    {
		    Assert.AreEqual( sbyte.MinValue, ConstsTest1.BYTE1 );
		    Assert.AreEqual( (sbyte) -1, ConstsTest1.BYTE2 );
		    Assert.AreEqual( (sbyte) 0, ConstsTest1.BYTE3 );
		    Assert.AreEqual( (sbyte) 1, ConstsTest1.BYTE4 );
		    Assert.AreEqual( sbyte.MaxValue, ConstsTest1.BYTE5 );
	    }
    	
	    [Test]
	    public void const_shorts()  
	    {
            
		    Assert.AreEqual( short.MinValue, ConstsTest1.SHORT1 );
		    Assert.AreEqual( (short) -1, ConstsTest1.SHORT2 );
		    Assert.AreEqual( (short) 0, ConstsTest1.SHORT3 );
		    Assert.AreEqual( (short) 1, ConstsTest1.SHORT4 );
		    Assert.AreEqual( short.MaxValue, ConstsTest1.SHORT5 );
	    }
    	
	    [Test]
	    public void const_ints()  
	    {
            Assert.AreEqual(int.MinValue, ConstsTest1.INT1);
            Assert.AreEqual(-1, ConstsTest1.INT2);
            Assert.AreEqual(0, ConstsTest1.INT3);
            Assert.AreEqual(1, ConstsTest1.INT4);
            Assert.AreEqual(int.MaxValue, ConstsTest1.INT5);
	    }
    	
	    [Test]
	    public void const_longs()  
	    {
            Assert.AreEqual(long.MinValue, ConstsTest1.LONG1);
            Assert.AreEqual((long)-1, ConstsTest1.LONG2);
            Assert.AreEqual((long)0, ConstsTest1.LONG3);
            Assert.AreEqual((long)1, ConstsTest1.LONG4);
            Assert.AreEqual(long.MaxValue, ConstsTest1.LONG5);
	    }
    	
	    [Test]
	    public void const_floats()  
	    {
            Assert.AreEqual(1.4e-45f, ConstsTest1.FLOAT1);
            Assert.AreEqual((float)-1, ConstsTest1.FLOAT2);
            Assert.AreEqual((float)0, ConstsTest1.FLOAT3);
            Assert.AreEqual((float)1, ConstsTest1.FLOAT4);
            Assert.AreEqual(3.4028235e38f, ConstsTest1.FLOAT5);
	    }
    	
	    [Test]
	    public void const_doubles()  
	    {
            Assert.AreEqual(4.9e-324, ConstsTest1.DOUBLE1);
            Assert.AreEqual((double)-1, ConstsTest1.DOUBLE2);
            Assert.AreEqual((double)0, ConstsTest1.DOUBLE3);
            Assert.AreEqual((double)1, ConstsTest1.DOUBLE4);
            Assert.AreEqual(1.7976931348623157e308, ConstsTest1.DOUBLE5);
	    }
    	
	    [Test]
	    public void const_strings()  
	    {
            Assert.AreEqual("", ConstsTest1.STRING1);
            Assert.AreEqual("a", ConstsTest1.STRING2);
            Assert.AreEqual("abc", ConstsTest1.STRING3);
            Assert.AreEqual("a\tb\tc\r\n", ConstsTest1.STRING4);
            Assert.AreEqual("x x", ConstsTest1.STRING5);
            Assert.AreEqual("x\u00bfx", ConstsTest1.STRING6);
            Assert.AreEqual("x\u03a9x", ConstsTest1.STRING7);
            Assert.AreEqual("x\\x", ConstsTest1.STRING8);
            Assert.AreEqual("x'x", ConstsTest1.STRING9);
            Assert.AreEqual("x\"x", ConstsTest1.STRING10);
	    }
    	
	    [Test]
	    public void enum_E1()  
	    {
            //Assert.AreEqual( 3, E1.values().Length );
		    Assert.IsNotNull( E1.A );
		    Assert.IsNotNull( E1.B );
		    Assert.IsNotNull( E1.C );
            //Assert.AreEqual( E1.A, E1.valueOf( "A" ) );
            //Assert.AreEqual( E1.B, E1.valueOf( "B" ) );
            //Assert.AreEqual( E1.C, E1.valueOf( "C" ) );
            //Assert.AreEqual( 0, E1.A.ordinal() );
            //Assert.AreEqual( 1, E1.B.ordinal() );
            //Assert.AreEqual( 2, E1.C.ordinal() );
	    }
    	
	    [Test]
	    public void struct_S1()  
	    {
		    S1 s = new S1( 1, 2, 3 );
		    Assert.AreEqual( 1, s.x );
		    Assert.AreEqual( 2, s.y );
		    Assert.AreEqual( 3, s.z );
    		
		    s = new S1( null, null, null );
		    Assert.IsNull( s.x );
		    Assert.IsNull( s.y );
		    Assert.IsNull( s.z );
    		
		    s = new S1();
		    Assert.IsNull( s.x );
		    Assert.IsNull( s.y );
		    Assert.IsNull( s.z );
    		
		    s.x = 4;
		    s.y = 5;
		    s.z = 6;
    		
		    Assert.AreEqual( 4, s.x );
		    Assert.AreEqual( 5, s.y );
		    Assert.AreEqual( 6, s.z );
    		
		    s.x = null;
		    Assert.IsNull( s.x );
    		
		    s.x = 7;
		    Assert.AreEqual( 7, s.x );
	    }
    	
	    [Test]
	    public void except_Excp1()  
	    {
		    Excp1 e = new Excp1( "foo", 23 );
		    Assert.AreEqual( "foo", e.msg );
		    Assert.AreEqual( 23, e.code );
    		
		    e = new Excp1( null, null );
		    Assert.IsNull( e.msg );
		    Assert.IsNull( e.code );
    		
		    e = new Excp1();
		    Assert.IsNull( e.msg );
		    Assert.IsNull( e.code );
    		
		    e.msg = "bar";
		    e.code = 24;
    		
		    Assert.AreEqual( "bar", e.msg );
		    Assert.AreEqual( 24, e.code );
    		
		    e.msg = null;
		    e.code = null;
    		
		    Assert.IsNull( e.msg );
		    Assert.IsNull( e.code );

            //Throwable t = e;
            //Assert.IsTrue( t is Exception );
            //Assert.IsFalse( t is RuntimeException );
	    }
    	
	    [Test]
	    public void except_Excp2()  
	    {
		    Excp2 e = new Excp2();

		    Exception t = e;
		    Assert.IsTrue( t is Exception );
		    //Assert.IsTrue( t is RuntimeException );
	    }
    	
	    [Test]
	    public void except_Excp3()  
	    {
		    Excp3 e = new Excp3();

            Exception t = e;
            Assert.IsTrue( t is Exception );
            //Assert.IsTrue( t is RuntimeException );
	    }
    	
	    [Test]
	    public void except_Excp4()  
	    {
		    Excp4 e = new Excp4();

		    Exception t = e;
		    Assert.IsTrue( t is Exception );
		    //Assert.IsFalse( t is Exception );
	    }
    	
	    [Test]
	    public void method_nothing()  
	    {
		    test.nothing();
	    }
    	
	    [Test]
	    public void method_incr1()  
	    {
		    Assert.AreEqual( 2, test.incr( 1 ) );
	    }
    	
	    [Test]
	    public void method_incr2()  
	    {
		    Assert.AreEqual( 3, test.incr( 2 ) );
	    }
    	
	    [Test]
	    public void method_incr3()  
	    {
		    Assert.AreEqual( -1, test.incr( -2 ) );
	    }
    	
	    [Test]
	    public void method_sub1()  
	    {
		    Assert.AreEqual( 5, test.sub( 7, 2 ) );
	    }
    	
	    [Test]
	    public void method_sub2()  
	    {
		    Assert.AreEqual( 8, test.sub( 23, 15 ) );
	    }
    	
	    [Test]
	    public void method_sub3()  
	    {
		    Assert.AreEqual( -5, test.sub( 2, 7 ) );
	    }
    	
	    [Test]
	    public void method_sum()  
	    {
		    Assert.AreEqual( 24, test.sum( new int[] { 1, 2, 3, 7, 11 } ) );
	    }
    	
	    [Test]
	    public void method_trans1()  
	    {
		    Assert.AreEqual( 2, test.trans( E1.A, 5 ) ); // divide by 2
	    }
    	
	    [Test]
	    public void method_trans2()  
	    {
		    Assert.AreEqual( 10, test.trans( E1.B, 5 ) ); // mul by 2
	    }
    	
	    [Test]
	    public void method_trans3()  
	    {
		    Assert.AreEqual( 12, test.trans( E1.C, 5 ) ); // add 7
	    }
    	
	    [Test]
	    public void method_dist1()  
	    {
		    Assert.AreEqual( Math.Sqrt( 3 ), test.dist( new S1( 1, 1, 1 ), new S1( 0, 0, 0 ) ) );
	    }
    	
	    [Test]
	    public void method_dist2()  
	    {
		    Assert.AreEqual( Math.Sqrt( 35 ), test.dist( new S1( 1, 2, 3 ), new S1( 6, 5, 4 ) ) );
	    }
    	
	    [Test]
	    public void method_dist3()  
	    {
		    Assert.AreEqual( Math.Sqrt( 56 ), test.dist( new S1( 1, 2, 3 ), new S1( -1, -2, -3 ) ) );
	    }
    	
	    [Test]
	    public void method_fill1()  
	    {
		    int[] x = test.fill( 0, 1 );
		    Assert.AreEqual( 0, x.Length );
		    foreach (int i in x)
			    Assert.AreEqual( 1, i );
	    }
    	
	    [Test]
	    public void method_fill2()  
	    {
		    int[] x = test.fill( 1, 2 );
		    Assert.AreEqual( 1, x.Length );
		    foreach (int i in x)
			    Assert.AreEqual( 2, i );
	    }
    	
	    [Test]
	    public void method_fill3()  
	    {
		    int[] x = test.fill( 2, 3 );
		    Assert.AreEqual( 2, x.Length );
		    foreach (int i in x)
			    Assert.AreEqual( 3, i );
	    }
    	
	    [Test]
	    public void method_blow1()  
	    {
		    try
		    {
			    test.blow( "foo", 2 );
                Assert.IsTrue( false, "blow did not throw" );
		    }
		    catch( Excp1 e )
		    {
			    Assert.AreEqual( "foo", e.msg );
			    Assert.AreEqual( 2, e.code );
		    }
	    }
    	
	    [Test]
	    public void method_blow2()  
	    {
		    try
		    {
			    test.blow( "bar", 3 );
                Assert.IsTrue( false, "blow did not throw" );
		    }
		    catch( Excp1 e )
		    {
			    Assert.AreEqual( "bar", e.msg );
			    Assert.AreEqual( 3, e.code );
		    }
	    }
    	
	    [Test]
	    public void method_beets1()  
	    {
		    Assert.AreEqual( 5, test.beets( E1.A ) );
	    }
    	
	    [Test]
	    public void method_beets2()  
	    {
		    try
		    {
			    test.beets( E1.B );
                Assert.IsTrue( false, "beets did not throw" );
		    }
		    catch ( Excp3 )
		    {
			    Assert.IsTrue( true );
		    }
	    }
    	
	    [Test]
	    public void method_beets3()  
	    {
		    try
		    {
			    test.beets( E1.C );
			    Assert.IsTrue(false, "beets did not throw" );
		    }
		    catch ( Excp4 )
		    {
			    Assert.IsTrue( true );
		    }
	    }
    	
        //[Test]
        //public void method_beets4()  
        //{
        //    Assert.IsNull( test.beets( null ) );
        //}

     
	 
	    //
        //Verify that an object can be passed as a parameter in a stuct.
        //
        [Test]
	    public void struct_S3() 
	    {
		    testS3Helper( "bool", ConstsTest1.BOOL2 );
            testS3Helper( "byte", ConstsTest1.BYTE5 );
            testS3Helper( "short", ConstsTest1.SHORT5 );
            testS3Helper("int", ConstsTest1.INT5);
            testS3Helper("long", ConstsTest1.LONG5);
            testS3Helper("float", ConstsTest1.FLOAT5);
            testS3Helper("double", ConstsTest1.DOUBLE5);
            testS3Helper("string", ConstsTest1.STRING3);		
	    }
    	
	    /*
	     * Verify that an array of objects can be passed as a parameter 
	     * in a stuct.
	     */
	    [Test]
	    public void struct_S4() 
	    {		
		    int sz = 10;
    		
		    testS4Helper(sz, "boolean", ConstsTest1.BOOL2 );
		    testS4Helper(sz, "byte", ConstsTest1.BYTE5 );
		    testS4Helper(sz, "short", ConstsTest1.SHORT5 );
            testS4Helper(sz, "int", ConstsTest1.INT5);
            testS4Helper(sz, "long", ConstsTest1.LONG5);
            testS4Helper(sz, "float", ConstsTest1.FLOAT5);
            testS4Helper(sz, "double", ConstsTest1.DOUBLE5);
            testS4Helper(sz, "string", ConstsTest1.STRING3);		

	    }
    	
	    // Verify that an object can be passed as a parameter in an
	    // exception
	    [Test]
	    public void except_Excp5() 
	    {
		    int code = 500;
		    String msg = "Excp5";

            testExcp5Helper(msg, code, ConstsTest1.BOOL1);
		    testExcp5Helper (msg, code, ConstsTest1.BYTE5);
		    testExcp5Helper (msg, code, ConstsTest1.SHORT5);
            testExcp5Helper(msg, code, ConstsTest1.INT5);
            testExcp5Helper(msg, code, ConstsTest1.LONG5);
            testExcp5Helper(msg, code, ConstsTest1.FLOAT5);
            testExcp5Helper(msg, code, ConstsTest1.DOUBLE5);
            testExcp5Helper(msg, code, ConstsTest1.STRING3);		
	    }
    	
	    [Test]
	    public void except_Excp6() 
	    {
		    int sz = 10;
		    int code = 500;
		    String msg = "Excp6";

            testExcp6Helper(sz, msg, code, ConstsTest1.BOOL1);
		    testExcp6Helper( sz, msg, code, ConstsTest1.BYTE5 );
		    testExcp6Helper( sz, msg, code, ConstsTest1.SHORT5 );
            testExcp6Helper(sz, msg, code, ConstsTest1.INT5);
            testExcp6Helper(sz, msg, code, ConstsTest1.LONG5);
            testExcp6Helper(sz, msg, code, ConstsTest1.FLOAT5);
            testExcp6Helper(sz, msg, code, ConstsTest1.DOUBLE5);
            testExcp6Helper(sz, msg, code, ConstsTest1.STRING3);		
	    }
    	
	    [Test]
	    public void method_throwExcp5() 
	    {
		    String msg = "throwExcp5";
		    int code = 500;

            method_throwExcp5Helper(msg, code, ConstsTest1.BOOL1);
		    method_throwExcp5Helper( msg, code, ConstsTest1.BYTE5 );
		    method_throwExcp5Helper( msg, code, ConstsTest1.SHORT5 );
            method_throwExcp5Helper(msg, code, ConstsTest1.INT5);
            method_throwExcp5Helper(msg, code, ConstsTest1.LONG5);
            method_throwExcp5Helper(msg, code, ConstsTest1.FLOAT5);
            method_throwExcp5Helper(msg, code, ConstsTest1.DOUBLE5);
            method_throwExcp5Helper(msg, code, ConstsTest1.STRING3);		
	    }
    	
	    [Test]
	    public void method_throwExcp6() 
	    {
		    String msg = "throwExcp6";
		    int code = 500;
		    int sz = 10;

            method_throwExcp6Helper(sz, msg, code, ConstsTest1.BOOL1);
		    method_throwExcp6Helper( sz, msg, code, ConstsTest1.BYTE5 );
		    method_throwExcp6Helper( sz, msg, code, ConstsTest1.SHORT5 );
            method_throwExcp6Helper(sz, msg, code, ConstsTest1.INT5);
            method_throwExcp6Helper(sz, msg, code, ConstsTest1.LONG5);
            method_throwExcp6Helper(sz, msg, code, ConstsTest1.FLOAT5);
            method_throwExcp6Helper(sz, msg, code, ConstsTest1.DOUBLE5);
            method_throwExcp6Helper(sz, msg, code, ConstsTest1.STRING3);		

	    }

        #region Helper methods

        private void testS3Helper( string type, object value )
	    {
		    S3 s = new S3( type, value );
		    Assert.AreEqual( type, s.tipe );
		    Assert.AreEqual( value, s.x );
    		
		    s = new S3( null, null );
            Assert.IsNull(s.tipe);
		    Assert.IsNull( s.x );
    		
		    s = new S3();
		    Assert.IsNull( s.tipe );
		    Assert.IsNull( s.x );
    		
		    s.tipe = type;
		    s.x = value;	
		    Assert.AreEqual( type, s.tipe );
		    Assert.AreEqual( value, s.x );
    		
		    s.x = null;
		    Assert.IsNull( s.x );
    		
		    s.x = value;
		    Assert.AreEqual( value, s.x );
	    }

        public void testS4Helper( int sz, string type, object value )
        {
            object[] myObject = test.fillObject( sz, value );
            S4 s = new S4( type, myObject );
            Assert.AreEqual( type, s.tipe );
            Assert.AreEqual( sz, myObject.Length );

            for ( int i = 0; i < myObject.Length; i++ )
                Assert.AreEqual( value, myObject[ i ] );
        }


        private void testExcp5Helper( String msg, int code, Object value )
	    {
		    Excp5 e = new Excp5( msg, code, value );
		    Assert.AreEqual( msg, e.msg );
		    Assert.AreEqual( code, e.code );
		    Assert.AreEqual( value, e.x);
    		
		    e = new Excp5( null, null, null );
		    Assert.IsNull( e.msg );
		    Assert.IsNull( e.code );
		    Assert.IsNull( e.x);

		    e = new Excp5();
		    Assert.IsNull( e.msg );
		    Assert.IsNull( e.code );
		    Assert.IsNull( e.x );
    		
		    e.msg = msg;
		    e.code = code;
		    e.x = value;
    		
		    Assert.AreEqual( msg, e.msg );
		    Assert.AreEqual( code, e.code );
		    Assert.AreEqual( value, e.x );
    		
		    e.msg = null;
		    e.code = null;
		    e.x = null;
    		
		    Assert.IsNull( e.msg );
		    Assert.IsNull( e.code );
		    Assert.IsNull( e.x );		

		    //Throwable t = e;
		    Assert.IsTrue( e is Exception );
		    //assertFalse( t instanceof RuntimeException );
	    }

        private void testExcp6Helper( int sz, String msg, int code, Object value )
        {
	        Object[] myObject = test.fillObject( sz, value );
    		
	        Excp6 e = new Excp6( msg, code, myObject );
	        Assert.AreEqual( msg, e.msg );
	        Assert.AreEqual( code, e.code );

	        for ( int i = 0; i < myObject.Length; i++ ) 
	        {
		        Assert.AreEqual( value, myObject[i] );
	        }
    		
	        e = new Excp6( null, null, null );
	        Assert.IsNull( e.msg );
	        Assert.IsNull( e.code );
	        Assert.IsNull( e.x );

	        e = new Excp6();
	        Assert.IsNull( e.msg );
	        Assert.IsNull( e.code );
	        Assert.IsNull( e.x );
    		
	        e.msg = msg;
	        e.code = code;
	        e.x = myObject;
    		
	        Assert.AreEqual( msg, e.msg );
	        Assert.AreEqual( code, e.code );
    		
	        for ( int i = 0; i < myObject.Length ; i++ ) 
	        {
		        Assert.AreEqual( value, myObject[i] );
	        }
    		
	        e.msg = null;
	        e.code = null;
	        e.x = null;
    		
	        Assert.IsNull( e.msg );
	        Assert.IsNull( e.code );
	        Assert.IsNull( e.x );		


	        //Exception t = e;
	        Assert.IsTrue( e is Exception );
	        // assertFalse( t is RuntimeException );
        }

        private void method_throwExcp5Helper( String msg, int code, Object value )
        {
            try
            {
                test.throwExcp5( msg, code, value );
                Assert.Fail( "throwExcp5 did not throw" );
            }
            catch ( Excp5 e )
            {
                Assert.AreEqual( msg, e.msg );
                Assert.AreEqual( code, e.code );
                Assert.AreEqual( value, e.x );
            }
        }

        private void method_throwExcp6Helper( int sz, String msg, int code, Object value )
        {
            Object[] myObject = test.fillObject( sz, value );

            try
            {
                test.throwExcp6( msg, code, myObject );
                Assert.Fail( "throwExcp5 did not throw" );
            }
            catch ( Excp6 e )
            {
                Assert.AreEqual( msg, e.msg );
                Assert.AreEqual( code, e.code );

                for ( int i = 0; i < myObject.Length; i++ )
                {
                    Assert.AreEqual( value, e.x[ i ] );
                }
            }
        }

        private void method_fillObjectHelper( int sz, Object value )
        {
            Object[] myObject = test.fillObject( sz, value );

            for ( int i = 0; i < myObject.Length; i++ )
            {
                Assert.AreEqual( value, myObject[ i ] );
            }
        }

        #endregion

        private Test1 test = new FakeTest1();
    }
}
