1 // ****************************************************************
\r
2 // Copyright 2007, Charlie Poole
\r
3 // This is free software licensed under the NUnit license. You may
\r
4 // obtain a copy of the license at http://nunit.org/?p=license&r=2.4
\r
5 // ****************************************************************
\r
8 using System.Collections;
\r
10 namespace NUnit.Framework.Constraints
\r
12 #region PrefixConstraint
\r
14 /// Abstract base class used for prefixes
\r
16 public abstract class PrefixConstraint : Constraint
\r
19 /// The base constraint
\r
21 protected Constraint baseConstraint;
\r
24 /// Construct given a base constraint
\r
26 /// <param name="baseConstraint"></param>
\r
27 protected PrefixConstraint( Constraint baseConstraint )
\r
29 this.baseConstraint = baseConstraint;
\r
33 /// Set all modifiers applied to the prefix into
\r
34 /// the base constraint before matching
\r
36 protected void PassModifiersToBase()
\r
38 if ( this.caseInsensitive )
\r
39 baseConstraint = baseConstraint.IgnoreCase;
\r
40 if (!this.clipStrings)
\r
41 baseConstraint = baseConstraint.NoClip;
\r
42 if ( this.tolerance != null )
\r
43 baseConstraint = baseConstraint.Within( tolerance );
\r
44 if ( this.compareAsCollection )
\r
45 baseConstraint = baseConstraint.AsCollection;
\r
46 if ( this.compareWith != null )
\r
47 baseConstraint = baseConstraint.Comparer( compareWith );
\r
52 #region NotConstraint
\r
54 /// NotConstraint negates the effect of some other constraint
\r
56 public class NotConstraint : PrefixConstraint
\r
59 /// Initializes a new instance of the <see cref="T:NotConstraint"/> class.
\r
61 /// <param name="baseConstraint">The base constraint to be negated.</param>
\r
62 public NotConstraint(Constraint baseConstraint)
\r
63 : base( baseConstraint ) { }
\r
66 /// Test whether the constraint is satisfied by a given value
\r
68 /// <param name="actual">The value to be tested</param>
\r
69 /// <returns>True for if the base constraint fails, false if it succeeds</returns>
\r
70 public override bool Matches(object actual)
\r
72 this.actual = actual;
\r
73 this.PassModifiersToBase();
\r
74 return !baseConstraint.Matches(actual);
\r
78 /// Write the constraint description to a MessageWriter
\r
80 /// <param name="writer">The writer on which the description is displayed</param>
\r
81 public override void WriteDescriptionTo( MessageWriter writer )
\r
83 writer.WritePredicate( "not" );
\r
84 baseConstraint.WriteDescriptionTo( writer );
\r
88 /// Write the actual value for a failing constraint test to a MessageWriter.
\r
90 /// <param name="writer">The writer on which the actual value is displayed</param>
\r
91 public override void WriteActualValueTo(MessageWriter writer)
\r
93 baseConstraint.WriteActualValueTo (writer);
\r
98 #region AllItemsConstraint
\r
100 /// AllItemsConstraint applies another constraint to each
\r
101 /// item in a collection, succeeding if they all succeed.
\r
103 public class AllItemsConstraint : PrefixConstraint
\r
106 /// Construct an AllItemsConstraint on top of an existing constraint
\r
108 /// <param name="itemConstraint"></param>
\r
109 public AllItemsConstraint(Constraint itemConstraint)
\r
110 : base( itemConstraint ) { }
\r
113 /// Apply the item constraint to each item in the collection,
\r
114 /// failing if any item fails.
\r
116 /// <param name="actual"></param>
\r
117 /// <returns></returns>
\r
118 public override bool Matches(object actual)
\r
120 this.actual = actual;
\r
122 PassModifiersToBase();
\r
124 if ( !(actual is ICollection) )
\r
125 throw new ArgumentException( "The actual value must be a collection", "actual" );
\r
127 foreach(object item in (ICollection)actual)
\r
128 if (!baseConstraint.Matches(item))
\r
135 /// Write a description of this constraint to a MessageWriter
\r
137 /// <param name="writer"></param>
\r
138 public override void WriteDescriptionTo(MessageWriter writer)
\r
140 writer.WritePredicate("all items");
\r
141 baseConstraint.WriteDescriptionTo(writer);
\r
146 #region SomeItemsConstraint
\r
148 /// SomeItemsConstraint applies another constraint to each
\r
149 /// item in a collection, succeeding if any of them succeeds.
\r
151 public class SomeItemsConstraint : PrefixConstraint
\r
154 /// Construct a SomeItemsConstraint on top of an existing constraint
\r
156 /// <param name="itemConstraint"></param>
\r
157 public SomeItemsConstraint(Constraint itemConstraint)
\r
158 : base( itemConstraint ) { }
\r
161 /// Apply the item constraint to each item in the collection,
\r
162 /// failing if any item fails.
\r
164 /// <param name="actual"></param>
\r
165 /// <returns></returns>
\r
166 public override bool Matches(object actual)
\r
168 this.actual = actual;
\r
170 PassModifiersToBase();
\r
172 if ( !(actual is ICollection) )
\r
173 throw new ArgumentException( "The actual value must be a collection", "actual" );
\r
175 foreach(object item in (ICollection)actual)
\r
176 if (baseConstraint.Matches(item))
\r
183 /// Write a description of this constraint to a MessageWriter
\r
185 /// <param name="writer"></param>
\r
186 public override void WriteDescriptionTo(MessageWriter writer)
\r
188 writer.WritePredicate("some item");
\r
189 baseConstraint.WriteDescriptionTo(writer);
\r
194 #region NoItemConstraint
\r
196 /// SomeItemsConstraint applies another constraint to each
\r
197 /// item in a collection, succeeding if any of them succeeds.
\r
199 public class NoItemConstraint : PrefixConstraint
\r
202 /// Construct a SomeItemsConstraint on top of an existing constraint
\r
204 /// <param name="itemConstraint"></param>
\r
205 public NoItemConstraint(Constraint itemConstraint)
\r
206 : base( itemConstraint ) { }
\r
209 /// Apply the item constraint to each item in the collection,
\r
210 /// failing if any item fails.
\r
212 /// <param name="actual"></param>
\r
213 /// <returns></returns>
\r
214 public override bool Matches(object actual)
\r
216 this.actual = actual;
\r
218 PassModifiersToBase();
\r
220 if ( !(actual is ICollection) )
\r
221 throw new ArgumentException( "The actual value must be a collection", "actual" );
\r
223 foreach(object item in (ICollection)actual)
\r
224 if (baseConstraint.Matches(item))
\r
231 /// Write a description of this constraint to a MessageWriter
\r
233 /// <param name="writer"></param>
\r
234 public override void WriteDescriptionTo(MessageWriter writer)
\r
236 writer.WritePredicate("no item");
\r
237 baseConstraint.WriteDescriptionTo(writer);
\r