// **************************************************************** // Copyright 2007, Charlie Poole // This is free software licensed under the NUnit license. You may // obtain a copy of the license at http://nunit.org/?p=license&r=2.4 // **************************************************************** using System; using System.Collections; using System.Reflection; namespace NUnit.Framework.Constraints { /// /// Summary description for PropertyConstraint. /// public class PropertyConstraint : PrefixConstraint { private string name; private object propValue; private bool propertyExists; /// /// Initializes a new instance of the class. /// /// The name. /// The constraint to apply to the property. public PropertyConstraint( string name, Constraint baseConstraint ) : base( baseConstraint ) { this.name = name; } /// /// Test whether the constraint is satisfied by a given value /// /// The value to be tested /// True for success, false for failure public override bool Matches(object actual) { this.actual = actual; // TODO: Should be argument exception? if ( actual == null ) return false; PropertyInfo property = actual.GetType().GetProperty( name, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance ); this.propertyExists = property != null; if ( !propertyExists ) return false; if ( baseConstraint == null ) return true; propValue = property.GetValue( actual, null ); return baseConstraint.Matches( propValue ); } /// /// Write the constraint description to a MessageWriter /// /// The writer on which the description is displayed public override void WriteDescriptionTo(MessageWriter writer) { writer.WritePredicate( "Property \"" + name + "\"" ); if ( baseConstraint != null ) baseConstraint.WriteDescriptionTo( writer ); } /// /// Write the actual value for a failing constraint test to a /// MessageWriter. The default implementation simply writes /// the raw value of actual, leaving it to the writer to /// perform any formatting. /// /// The writer on which the actual value is displayed public override void WriteActualValueTo(MessageWriter writer) { if ( propertyExists ) writer.WriteActualValue( propValue ); else writer.WriteActualValue( actual.GetType() ); } } }