/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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 NUnit.Framework;
using Apache.Qpid.Buffer;
using Apache.Qpid.Framing;

namespace Apache.Qpid.Framing.Tests
{
    [TestFixture]
    public class TestAMQType
    {

       #region LONG_STRING tests
       [Test]
       public void LONG_STRING_ReadWrite()
       {
          AMQType type = AMQType.LONG_STRING;
          ByteBuffer buffer = ByteBuffer.Allocate(0x1000);
          const string VALUE = "simple string 1";

          type.WriteToBuffer(VALUE, buffer);
          buffer.Flip();
          buffer.Rewind();
          AMQTypedValue value = AMQTypedValue.ReadFromBuffer(buffer);
          Assert.AreEqual(VALUE, value.Value);
       }
       #endregion // LONG_STRING tests

       #region UINT32 tests
       [Test]
       public void UINT32_CanGetEncodingSize()
       {
          AMQType type = AMQType.UINT32;
          Assert.AreEqual(4, type.GetEncodingSize(1234443));
       }

       [Test]
       public void UINT32_ToNativeValue()
       {
          AMQType type = AMQType.UINT32;
          Assert.AreEqual(1, type.ToNativeValue(1));
          Assert.AreEqual(1, type.ToNativeValue((short)1));
          Assert.AreEqual(1, type.ToNativeValue((byte)1));
          Assert.AreEqual(1, type.ToNativeValue("1"));

          try
          {
             Assert.AreEqual(1, type.ToNativeValue("adasdads"));
             Assert.Fail("Invalid format allowed");
          } catch ( FormatException )
          {
          }
       }

       [Test]
       public void UINT32_ReadWrite()
       {
          AMQType type = AMQType.UINT32;
          ByteBuffer buffer = ByteBuffer.Allocate(0x1000);
          const uint VALUE = 0xFFEEDDCC;

          type.WriteToBuffer(VALUE, buffer);
          buffer.Flip();
          buffer.Rewind();
          AMQTypedValue value = AMQTypedValue.ReadFromBuffer(buffer);
          Assert.AreEqual(VALUE, value.Value);
       }
       #endregion // UINT32 Tests

       #region VOID Tests
       [Test]
       public void VOID_CanGetEncodingSize()
       {
          AMQType type = AMQType.VOID;
          Assert.AreEqual(0, type.GetEncodingSize(null));
       }

       [Test]
       public void VOID_ToNativeValue()
       {
          AMQType type = AMQType.VOID;
          Assert.IsNull(type.ToNativeValue(null));

          try
          {
             type.ToNativeValue("asdasd");
             Assert.Fail("converted invalid value");
          } catch (FormatException)
          {
          }
       }

       [Test]
       public void VOID_ReadWrite()
       {
          AMQType type = AMQType.VOID;
          ByteBuffer buffer = ByteBuffer.Allocate(0x1000);

          type.WriteToBuffer(null, buffer);
          buffer.Flip();
          buffer.Rewind();
          AMQTypedValue value = AMQTypedValue.ReadFromBuffer(buffer);
          Assert.AreEqual(null, value.Value);
       }

       #endregion // VOID Tests

       #region BOOLEAN Tests
       [Test]
       public void BOOLEAN_CanGetEncodingSize()
       {
          AMQType type = AMQType.BOOLEAN;
          Assert.AreEqual(1, type.GetEncodingSize(true));
       }

       [Test]
       public void BOOLEAN_ToNativeValue()
       {
          AMQType type = AMQType.BOOLEAN;
          Assert.AreEqual(true, type.ToNativeValue(true));
          Assert.AreEqual(false, type.ToNativeValue("false"));

          try
          {
             type.ToNativeValue("asdasd");
             Assert.Fail("converted invalid value");
          } catch ( FormatException )
          {
          }
       }

       [Test]
       public void BOOLEAN_ReadWrite()
       {
          AMQType type = AMQType.BOOLEAN;
          ByteBuffer buffer = ByteBuffer.Allocate(0x1000);

          type.WriteToBuffer(true, buffer);
          buffer.Flip();
          buffer.Rewind();
          AMQTypedValue value = AMQTypedValue.ReadFromBuffer(buffer);
          Assert.AreEqual(true, value.Value);
       }
       #endregion // BOOLEAN Tests

       #region INT16 tests
       [Test]
       public void INT16_ReadWrite()
       {
          AMQType type = AMQType.INT16;
          ByteBuffer buffer = ByteBuffer.Allocate(0x1000);
          const short VALUE = -32765;

          type.WriteToBuffer(VALUE, buffer);
          buffer.Flip();
          buffer.Rewind();
          AMQTypedValue value = AMQTypedValue.ReadFromBuffer(buffer);
          Assert.AreEqual(VALUE, value.Value);
       }
       //public void UINT16_ReadWrite()
       //{
       //   AMQType type = AMQType.UINT16;
       //   ByteBuffer buffer = ByteBuffer.Allocate(0x1000);
       //   const ushort VALUE = 64321;

       //   type.WriteToBuffer(VALUE, buffer);
       //   buffer.Flip();
       //   buffer.Rewind();
       //   AMQTypedValue value = AMQTypedValue.ReadFromBuffer(buffer);
       //   Assert.AreEqual(VALUE, value.Value);
       //}
       #endregion // INT16 Tests

       #region INT32 tests
       [Test]
       public void INT32_ReadWrite()
       {
          AMQType type = AMQType.INT32;
          ByteBuffer buffer = ByteBuffer.Allocate(0x1000);
          const int VALUE = -39273563;

          type.WriteToBuffer(VALUE, buffer);
          buffer.Flip();
          buffer.Rewind();
          AMQTypedValue value = AMQTypedValue.ReadFromBuffer(buffer);
          Assert.AreEqual(VALUE, value.Value);
       }
       #endregion // INT32 Tests

       #region INT64 tests
       [Test]
       public void INT64_ReadWrite()
       {
          AMQType type = AMQType.INT64;
          ByteBuffer buffer = ByteBuffer.Allocate(0x1000);
          const long VALUE = -(2^43+1233123);

          type.WriteToBuffer(VALUE, buffer);
          buffer.Flip();
          buffer.Rewind();
          AMQTypedValue value = AMQTypedValue.ReadFromBuffer(buffer);
          Assert.AreEqual(VALUE, value.Value);
       }
       [Test]
       public void UINT64_ReadWrite()
       {
          AMQType type = AMQType.UINT64;
          ByteBuffer buffer = ByteBuffer.Allocate(0x1000);
          const ulong VALUE = (2 ^ 61 + 1233123);

          type.WriteToBuffer(VALUE, buffer);
          buffer.Flip();
          buffer.Rewind();
          AMQTypedValue value = AMQTypedValue.ReadFromBuffer(buffer);
          Assert.AreEqual(VALUE, value.Value);
       }
       #endregion // INT64 Tests

       #region FLOAT tests
       [Test]
       public void FLOAT_ReadWrite()
       {
          AMQType type = AMQType.FLOAT;
          ByteBuffer buffer = ByteBuffer.Allocate(0x1000);
          const float VALUE = 1.2345000E-035f;

          type.WriteToBuffer(VALUE, buffer);
          buffer.Flip();
          buffer.Rewind();
          AMQTypedValue value = AMQTypedValue.ReadFromBuffer(buffer);
          Assert.AreEqual(VALUE, value.Value);
       }
       #endregion // FLOAT Tests

       #region DOUBLE tests
       [Test]
       public void DOUBLE_ReadWrite()
       {
          AMQType type = AMQType.DOUBLE;
          ByteBuffer buffer = ByteBuffer.Allocate(0x1000);
          const double VALUE = 1.2345000E-045;

          type.WriteToBuffer(VALUE, buffer);
          buffer.Flip();
          buffer.Rewind();
          AMQTypedValue value = AMQTypedValue.ReadFromBuffer(buffer);
          Assert.AreEqual(VALUE, value.Value);
       }
       #endregion // FLOAT Tests
    }
}
