public void Ctor_Void_Success()
		{
			EnumValuesConstraint c = new EnumValuesConstraint();
			Assert.AreEqual(Constraint.EnumValuesConstraintName, c.Name);
			Assert.AreEqual(ParameterDataType.None, c.UnderlyingDataType);
			Assert.IsNull(c.UnderlyingType);
			Assert.IsFalse(c.HasFlags);
			Assert.IsNull(c.EnumValues);
		}
		public void Ctor_FlagValues_Success()
		{
			EnumValuesConstraint c = new EnumValuesConstraint(ParameterDataType.Int32, true, CreateFlagValues());
			Assert.AreEqual(Constraint.EnumValuesConstraintName, c.Name);
			Assert.AreEqual(ParameterDataType.Int32, c.UnderlyingDataType);
			Assert.AreEqual(typeof(int), c.UnderlyingType);
			Assert.IsTrue(c.HasFlags);
			Assert.IsNotNull(c.EnumValues);
			Assert.AreEqual(8, c.EnumValues.Count);
		}
		public void Validate_NotConfigured_Error()
		{
			CustomAssert.ThrowsException<ConstraintConfigurationException>(() =>
			{
				EnumValuesConstraint c = new EnumValuesConstraint();
				IEnumerable<ParameterValidationResult> result = c.Validate(System.UriKind.Absolute, ParameterDataType.Enum, Constants.MemberName);
			});
		}
		public void Validate_ValueNotConvertible_Error()
		{
			CustomAssert.ThrowsException<CodedArgumentException>(() =>
			{
				EnumValuesConstraint c = new EnumValuesConstraint(ParameterDataType.Int32, false, CreateValues());
				IEnumerable<ParameterValidationResult> result = c.Validate(long.MaxValue, ParameterDataType.Enum, Constants.MemberName);
			});
		}
		public void Validate_DifferentType_Success()
		{
			EnumValuesConstraint c = new EnumValuesConstraint(ParameterDataType.Int32, false, CreateValues());
			IEnumerable<ParameterValidationResult> result = c.Validate((byte)2, ParameterDataType.Enum, Constants.MemberName);
			Assert.IsNotNull(result);
			Assert.IsFalse(result.GetEnumerator().MoveNext());
		}
		public void Validate_InvFlags_Success()
		{
			EnumValuesConstraint c = new EnumValuesConstraint(ParameterDataType.Int32, true, CreateFlagValues());
			IEnumerable<ParameterValidationResult> result = c.Validate(System.IO.FileAttributes.Device | System.IO.FileAttributes.ReparsePoint, ParameterDataType.Enum, Constants.MemberName);
			Assert.IsNotNull(result);
			Assert.IsTrue(result.GetEnumerator().MoveNext());
		}
		public void SetParameters_InvHexValue_Error()
		{
			CustomAssert.ThrowsException<ConstraintConfigurationException>(() =>
			{
				EnumValuesConstraint c = new EnumValuesConstraint();
				c.SetParametersInternal(new string[] { "Int32", "RelativeOrAbsolute=0xnarf", "Absolute=2", "Relative=3" }, ParameterDataType.Enum);
			});
		}
		public void Ctor_ChangedType_Success()
		{
			EnumValuesConstraint c = new EnumValuesConstraint(ParameterDataType.Int64, false, CreateValues());
			Assert.AreEqual(Constraint.EnumValuesConstraintName, c.Name);
			Assert.AreEqual(ParameterDataType.Int64, c.UnderlyingDataType);
			Assert.AreEqual(typeof(long), c.UnderlyingType);
			Assert.IsFalse(c.HasFlags);
			Assert.IsNotNull(c.EnumValues); // To trigger retrieval of already resolved type
			Assert.AreEqual(3, c.EnumValues.Count);
		}
		public void SetParameters_FlagsHex_Success()
		{
			EnumValuesConstraint c = new EnumValuesConstraint();
			c.SetParametersInternal(new string[] { "Int32", "Flags", "ReadOnly=0x01", "Hidden=0x02", "System=0x04" }, ParameterDataType.Enum);
			Assert.AreEqual(ParameterDataType.Int32, c.UnderlyingDataType);
			Assert.AreEqual(typeof(int), c.UnderlyingType);
			Assert.IsTrue(c.HasFlags);
			Assert.IsNotNull(c.EnumValues);
			Assert.AreEqual(3, c.EnumValues.Count);
			Assert.AreEqual(4, c.EnumValues["System"]);
		}
		public void SetParameters_TooFewParams_Error()
		{
			CustomAssert.ThrowsException<ConstraintConfigurationException>(() =>
			{
				EnumValuesConstraint c = new EnumValuesConstraint();
				c.SetParametersInternal(new string[] { "Int32" }, ParameterDataType.Enum);
			});

			CustomAssert.ThrowsException<ConstraintConfigurationException>(() =>
			{
				EnumValuesConstraint c = new EnumValuesConstraint();
				c.SetParametersInternal(new string[] { "Int32", "Flags" }, ParameterDataType.Enum);
			});
		}
		public void SetParameters_Success()
		{
			EnumValuesConstraint c = new EnumValuesConstraint();
			c.SetParametersInternal(new string[] { "Int32", "RelativeOrAbsolute=1", "Absolute=2", "Relative=3" }, ParameterDataType.Enum);
			Assert.AreEqual(ParameterDataType.Int32, c.UnderlyingDataType);
			Assert.AreEqual(typeof(int), c.UnderlyingType);
			Assert.IsFalse(c.HasFlags);
			Assert.IsNotNull(c.EnumValues);
			Assert.AreEqual(3, c.EnumValues.Count);
		}
		public void ToString_Success()
		{
			EnumValuesConstraint c = new EnumValuesConstraint(ParameterDataType.Int32, false, CreateValues());
			Assert.AreEqual("[Values(Int32,RelativeOrAbsolute=1,Absolute=2,Relative=3)]", c.ToString());
			c = new EnumValuesConstraint(ParameterDataType.Int32, true, CreateFlagValues());
			StringAssert.StartsWith(c.ToString(), "[Values(Int32,Flags,ReadOnly=1,Hidden=2,System=4");
		}
		public void Ctor_SerializationInfo_Success()
		{
			EnumValuesConstraint c = new EnumValuesConstraint(ParameterDataType.Int32, false, CreateValues());
			System.IO.MemoryStream Buffer = SerializationHelper.Serialize(c);
			EnumValuesConstraint c2 = SerializationHelper.Deserialize<EnumValuesConstraint>(Buffer);

			Assert.AreEqual(Constraint.EnumValuesConstraintName, c2.Name);
			Assert.AreEqual(ParameterDataType.Int32, c2.UnderlyingDataType);
			Assert.AreEqual(typeof(int), c2.UnderlyingType);
			Assert.IsFalse(c2.HasFlags);
			Assert.IsNotNull(c2.EnumValues); // To trigger retrieval of already resolved type
			Assert.AreEqual(3, c2.EnumValues.Count);
		}
		public void Ctor_InvalidType_Error()
		{
			CustomAssert.ThrowsException<CodedArgumentOutOfRangeException>(() =>
			{
				EnumValuesConstraint c = new EnumValuesConstraint(ParameterDataType.String, false, CreateValues());
			});
		}
		public void SetParameters_InvHexTooLarge_Error()
		{
			CustomAssert.ThrowsException<ConstraintConfigurationException>(() =>
			{
				EnumValuesConstraint c = new EnumValuesConstraint();
				c.SetParametersInternal(new string[] { "Byte", "Flags", "RelativeOrAbsolute=0x1000", "Absolute=0x2000", "Relative=0x4000" }, ParameterDataType.Enum);
			});
		}
		public void Ctor_ValuesNull_Error()
		{
			CustomAssert.ThrowsException<CodedArgumentNullException>(() =>
			{
				EnumValuesConstraint c = new EnumValuesConstraint(ParameterDataType.Int32, false, null);
			});
		}
		public void Ctor_ValuesNotConvertable_Error()
		{
			CustomAssert.ThrowsException<CodedArgumentException>(() =>
			{
				Dictionary<string, object> Values = new Dictionary<string, object>();
				Values.Add("RelativeOrAbsolute", 1000);
				Values.Add("Absolute", 2000);
				Values.Add("Relative", 3000);
				EnumValuesConstraint c = new EnumValuesConstraint(ParameterDataType.Byte, false, Values);
			});
		}