package sbt

	import org.scalacheck._
	import Prop._

object KeyTest extends Properties("AttributeKey")
{
	property("equality") = {
		compare(AttributeKey[Int]("test"), AttributeKey[Int]("test"), true) &&
		compare(AttributeKey[Int]("test"), AttributeKey[Int]("test", "description"), true) &&
		compare(AttributeKey[Int]("test", "a"), AttributeKey[Int]("test", "b"), true) &&
		compare(AttributeKey[Int]("test"), AttributeKey[Int]("tests"), false) &&
		compare(AttributeKey[Int]("test"), AttributeKey[Double]("test"), false) &&
		compare(AttributeKey[java.lang.Integer]("test"), AttributeKey[Int]("test"), false) &&
		compare(AttributeKey[Map[Int, String]]("test"), AttributeKey[Map[Int, String]]("test"), true) &&
		compare(AttributeKey[Map[Int, String]]("test"), AttributeKey[Map[Int, _]]("test"), false)
	}

	def compare(a: AttributeKey[_], b: AttributeKey[_], same: Boolean) =
		("a.label: " + a.label) |:
		("a.manifest: " + a.manifest) |:
		("b.label: " + b.label) |:
		("b.manifest: " + b.manifest) |:
		("expected equal? " + same) |:
		compare0(a, b, same)

	def compare0(a: AttributeKey[_], b: AttributeKey[_], same: Boolean) =
		if(same)
		{
			("equality" |: (a == b)) &&
			("hash" |: (a.hashCode == b.hashCode))
		}
		else
			("equality" |: (a != b))
}