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

namespace MonoTests.System.Windows {

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

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

		[Test]
		public void ConvertFromString ()
		{
			var serializer = new SizeValueSerializer ();
			object obj = serializer.ConvertFromString ("3,4", null);
			Assert.AreEqual (typeof (Size), obj.GetType ());
			Assert.AreEqual (new Size (3, 4), obj);
		}

		[Test]
		public void RoundTripConvert()
		{
			var serializer = new SizeValueSerializer ();
			var size = new Size (1.234, 5.678);
			var obj = serializer.ConvertFromString (serializer.ConvertToString (size, null), null);
			Assert.AreEqual (size, obj);
		}

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

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

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

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

}