using System;
using System.Windows;
using System.Windows.Converters;
using NUnit.Framework;

namespace MonoTests.System.Windows {

	[TestFixture]
	public class RectValueSerializerTest
	{
		[Test]
		public void CanConvertFromString ()
		{
			var serializer = new RectValueSerializer ();
			Assert.IsTrue (serializer.CanConvertFromString ("", null));
		}

		[Test]
		public void CanConvertToString ()
		{
			var serializer = new RectValueSerializer ();
			Assert.IsTrue (serializer.CanConvertToString (new Rect (0, 0, 0, 0), null));
			Assert.IsFalse (serializer.CanConvertToString ("", null));
		}

		[Test]
		public void ConvertFromString ()
		{
			var serializer = new RectValueSerializer ();
			object obj = serializer.ConvertFromString ("3.14,4.15,5.16,6.17", null);
			Assert.AreEqual (typeof (Rect), obj.GetType ());
			Assert.AreEqual (new Rect (3.14, 4.15, 5.16, 6.17), obj);
		}

		[Test]
		public void RoundTripConvert()
		{ 
			var serializer = new RectValueSerializer ();
			var rect = new Rect (1.234, 2.678, 3.123, 4.567);
			var obj = serializer.ConvertFromString (serializer.ConvertToString (rect, null), null);
			Assert.AreEqual (rect, obj);
		}

		[Test]
		[ExpectedException (typeof (FormatException))]
		public void ConvertFromStringShouldThrowExceptionWhenStringHasInvalidFormat ()
		{
			var serializer = new RectValueSerializer ();
			serializer.ConvertFromString ("a,b,c,d", null);
		}

		[Test]
		[ExpectedException (typeof (NotSupportedException))]
		public void ConvertFromStringShouldThrowExceptionWhenStringIsNull ()
		{
			var serializer = new RectValueSerializer ();
			serializer.ConvertFromString (null, null);
		}

		[Test]
		[ExpectedException (typeof (NotSupportedException))]
		public void ConvertToStringShouldThrowExceptionWhenInvalidType ()
		{
			var serializer = new RectValueSerializer ();
			serializer.ConvertToString (10, null);
		}

		[Test]
		[ExpectedException (typeof (ArgumentException))]
		public void ConvertToStringShouldThrowExceptionWhenHeightOrWidthIsNegative ()
		{
			var serializer = new RectValueSerializer ();
			var result = serializer.ConvertFromString ("1,2,-1,-2", null);
		}
	}

}