using System;

namespace Tests
{
	class Nullable
	{

		[Test]
		public static void TestPrimitives()
		{
			float? fn = 9.0f;
			int? intn = 100;
			int? intn2 = null;

			let fn2 = fn + intn;
			Test.Assert(fn2 == 109);

			let fn3 = fn + intn2;
			Test.Assert(fn3 == null);

			int i = intn ?? 200;
			Test.Assert(i == 100);

			i = intn2 ?? (int16)200;
			Test.Assert(i == 200);

			i = 300;
			Test.Assert(intn.TryGetValue(ref i));
			Test.Assert(i == 100);

			Test.Assert(!intn2.TryGetValue(ref i));
			Test.Assert(i == 100);
		}

		[Test]
		public static void TestOperators()
		{
			int? iNull = null;
			bool? bNull = null;

			Test.Assert(!(iNull == 0));
			Test.Assert(!(iNull <= 0));
			Test.Assert(!(iNull >= 0));

			Test.Assert(!(bNull == false));
			Test.Assert(!(bNull == true));
			Test.Assert(bNull != true);
			Test.Assert(bNull != false);

			iNull = 100;
			bNull = false;

			Test.Assert(iNull >= 50);
			Test.Assert(!(iNull >= 150));
			Test.Assert(iNull < 150);
			Test.Assert(!(iNull < 50));
			Test.Assert(iNull == 100);
			Test.Assert(iNull != 99);
			Test.Assert(!(iNull != 100));
		}
	}
}
