public override void DoValidate( object objectToValidate, object currentTarget, string key, ValidationResults validationResults)
{
if (objectToValidate is ICollection)
{
if (((( ICollection)objectToValidate).Count != 0) == Negated)
{
LogValidationResult(validationResults, MessageTemplate, currentTarget, key);
}
}
else
{
//throw new ApplicationException("Object type not supported by validator.");
LogValidationResult(validationResults, "Object is not a collection.", currentTarget, key);
}
I've also changed testing console app to a number of MSTest TestMethods.
#region Namespace Imports
using System;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Linq;
using Microsoft.Practices.EnterpriseLibrary.Validation;
using Microsoft.SDC.Common.Validation;
using Microsoft.SDC.Common.Web.WCF;
using Microsoft.VisualStudio.TestTools.UnitTesting;
#endregion
namespace MSCommon.Validation
{
// I have defined an Order class
// containing an Items property for this. There are four possible cases we can test:
//- Collection is empty, Negated property is false
//- Collection is non-empty, Negated property is false
//- Collection is non-empty, Negated property is true
//- Collection is empty, Negated property is true
[ TestClass]
public class CollectionNotEmptyValidatorTests
{
[ TestMethod(), CITest ]
public void InvalidTest_CollectionIsEmpty()
{
// Invalid test - collection is empty
var order = NewEmptyOrder();
CollectionNotEmptyValidator validator = new CollectionNotEmptyValidator ();
ValidationResults results = validator.Validate(order.Items);
Assert.IsTrue(!results.IsValid);
Debug.WriteLine(results.First().Message);
// Output: The collection must not be empty.
}
[ TestMethod(), CITest ]
public void ValidTest_CollectionIsEmpty()
{
// Valid test - collection has items
var order = NewEmptyOrder();
order.Items.Add( new Order. OrderItem());
CollectionNotEmptyValidator validator = new CollectionNotEmptyValidator ();
ValidationResults results = validator.Validate(order.Items);
Assert.IsTrue(results.IsValid);
Debug.WriteLine( "Valid test");
}
[ TestMethod(), CITest ]
public void NegatedTest_CollectionHasItems()
{
// Invalid test - collection has items (Negated)
var order = NewEmptyOrder();
order.Items.Add( new Order. OrderItem());
CollectionNotEmptyValidator validator = new CollectionNotEmptyValidator (true );
ValidationResults results = validator.Validate(order.Items);
Assert.IsTrue(!results.IsValid);
Debug.WriteLine(results.First().Message);
// Output: The collection must be empty.
}
[ TestMethod(), CITest ]
public void NegatedTest_CollectionIsEmpty()
{
// Invalid test - collection has items (Negated)
var order = NewEmptyOrder();
order.Items.Add( new Order. OrderItem());
CollectionNotEmptyValidator validator = new CollectionNotEmptyValidator (true );
ValidationResults results = validator.Validate(order.Items);
Assert.IsTrue(!results.IsValid);
Debug.WriteLine(results.First().Message);
// Output: The collection must be empty.
}
private static Order NewEmptyOrder()
{
Order order = new Order();
order.Items = new Collection<Order .OrderItem >();
return order;
}
#region Example Classes for tests
public class Order
{
[ CollectionNotEmptyValidator()]
public Collection<OrderItem > Items { get; set; }
public bool ValidateItems()
{
return Items.Count > 0;
}
public class OrderItem
{
}
}
#endregion //Example Classes for tests
}
}
I am planning to create derived ContainValidator.