Merge pull request #704 from jgagnon/master
[mono.git] / mcs / nunit24 / NUnitFramework / framework / Constraints / PrefixConstraints.cs
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
6 \r
7 using System;\r
8 using System.Collections;\r
9 \r
10 namespace NUnit.Framework.Constraints\r
11 {\r
12         #region PrefixConstraint\r
13         /// <summary>\r
14         /// Abstract base class used for prefixes\r
15         /// </summary>\r
16         public abstract class PrefixConstraint : Constraint\r
17         {\r
18                 /// <summary>\r
19                 /// The base constraint\r
20                 /// </summary>\r
21                 protected Constraint baseConstraint;\r
22 \r
23                 /// <summary>\r
24                 /// Construct given a base constraint\r
25                 /// </summary>\r
26                 /// <param name="baseConstraint"></param>\r
27                 protected PrefixConstraint( Constraint baseConstraint )\r
28                 {\r
29                         this.baseConstraint = baseConstraint;\r
30                 }\r
31 \r
32                 /// <summary>\r
33                 /// Set all modifiers applied to the prefix into\r
34                 /// the base constraint before matching\r
35                 /// </summary>\r
36                 protected void PassModifiersToBase()\r
37                 {\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
48                 }\r
49         }\r
50         #endregion\r
51 \r
52         #region NotConstraint\r
53     /// <summary>\r
54         /// NotConstraint negates the effect of some other constraint\r
55         /// </summary>\r
56         public class NotConstraint : PrefixConstraint\r
57         {\r
58                 /// <summary>\r
59                 /// Initializes a new instance of the <see cref="T:NotConstraint"/> class.\r
60                 /// </summary>\r
61                 /// <param name="baseConstraint">The base constraint to be negated.</param>\r
62                 public NotConstraint(Constraint baseConstraint)\r
63                         : base( baseConstraint ) { }\r
64 \r
65                 /// <summary>\r
66                 /// Test whether the constraint is satisfied by a given value\r
67                 /// </summary>\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
71                 {\r
72                         this.actual = actual;\r
73                         this.PassModifiersToBase();\r
74                         return !baseConstraint.Matches(actual);\r
75                 }\r
76 \r
77                 /// <summary>\r
78                 /// Write the constraint description to a MessageWriter\r
79                 /// </summary>\r
80                 /// <param name="writer">The writer on which the description is displayed</param>\r
81                 public override void WriteDescriptionTo( MessageWriter writer )\r
82                 {\r
83                         writer.WritePredicate( "not" );\r
84                         baseConstraint.WriteDescriptionTo( writer );\r
85                 }\r
86 \r
87                 /// <summary>\r
88                 /// Write the actual value for a failing constraint test to a MessageWriter.\r
89                 /// </summary>\r
90                 /// <param name="writer">The writer on which the actual value is displayed</param>\r
91                 public override void WriteActualValueTo(MessageWriter writer)\r
92                 {\r
93                         baseConstraint.WriteActualValueTo (writer);\r
94                 }\r
95         }\r
96         #endregion\r
97 \r
98         #region AllItemsConstraint\r
99         /// <summary>\r
100         /// AllItemsConstraint applies another constraint to each\r
101         /// item in a collection, succeeding if they all succeed.\r
102         /// </summary>\r
103         public class AllItemsConstraint : PrefixConstraint\r
104         {\r
105                 /// <summary>\r
106                 /// Construct an AllItemsConstraint on top of an existing constraint\r
107                 /// </summary>\r
108                 /// <param name="itemConstraint"></param>\r
109                 public AllItemsConstraint(Constraint itemConstraint)\r
110                         : base( itemConstraint ) { }\r
111 \r
112                 /// <summary>\r
113                 /// Apply the item constraint to each item in the collection,\r
114                 /// failing if any item fails.\r
115                 /// </summary>\r
116                 /// <param name="actual"></param>\r
117                 /// <returns></returns>\r
118                 public override bool Matches(object actual)\r
119                 {\r
120                         this.actual = actual;\r
121 \r
122                         PassModifiersToBase();\r
123 \r
124                         if ( !(actual is ICollection) )\r
125                                 throw new ArgumentException( "The actual value must be a collection", "actual" );\r
126 \r
127                         foreach(object item in (ICollection)actual)\r
128                                 if (!baseConstraint.Matches(item))\r
129                                         return false;\r
130 \r
131                         return true;\r
132                 }\r
133 \r
134                 /// <summary>\r
135                 /// Write a description of this constraint to a MessageWriter\r
136                 /// </summary>\r
137                 /// <param name="writer"></param>\r
138                 public override void WriteDescriptionTo(MessageWriter writer)\r
139                 {\r
140                         writer.WritePredicate("all items");\r
141                         baseConstraint.WriteDescriptionTo(writer);\r
142                 }\r
143         }\r
144         #endregion\r
145 \r
146         #region SomeItemsConstraint\r
147         /// <summary>\r
148         /// SomeItemsConstraint applies another constraint to each\r
149         /// item in a collection, succeeding if any of them succeeds.\r
150         /// </summary>\r
151         public class SomeItemsConstraint : PrefixConstraint\r
152         {\r
153                 /// <summary>\r
154                 /// Construct a SomeItemsConstraint on top of an existing constraint\r
155                 /// </summary>\r
156                 /// <param name="itemConstraint"></param>\r
157                 public SomeItemsConstraint(Constraint itemConstraint)\r
158                         : base( itemConstraint ) { }\r
159 \r
160                 /// <summary>\r
161                 /// Apply the item constraint to each item in the collection,\r
162                 /// failing if any item fails.\r
163                 /// </summary>\r
164                 /// <param name="actual"></param>\r
165                 /// <returns></returns>\r
166                 public override bool Matches(object actual)\r
167                 {\r
168                         this.actual = actual;\r
169 \r
170                         PassModifiersToBase();\r
171 \r
172                         if ( !(actual is ICollection) )\r
173                                 throw new ArgumentException( "The actual value must be a collection", "actual" );\r
174 \r
175                         foreach(object item in (ICollection)actual)\r
176                                 if (baseConstraint.Matches(item))\r
177                                         return true;\r
178 \r
179                         return false;\r
180                 }\r
181 \r
182                 /// <summary>\r
183                 /// Write a description of this constraint to a MessageWriter\r
184                 /// </summary>\r
185                 /// <param name="writer"></param>\r
186                 public override void WriteDescriptionTo(MessageWriter writer)\r
187                 {\r
188                         writer.WritePredicate("some item");\r
189                         baseConstraint.WriteDescriptionTo(writer);\r
190                 }\r
191         }\r
192         #endregion\r
193 \r
194         #region NoItemConstraint\r
195         /// <summary>\r
196         /// SomeItemsConstraint applies another constraint to each\r
197         /// item in a collection, succeeding if any of them succeeds.\r
198         /// </summary>\r
199         public class NoItemConstraint : PrefixConstraint\r
200         {\r
201                 /// <summary>\r
202                 /// Construct a SomeItemsConstraint on top of an existing constraint\r
203                 /// </summary>\r
204                 /// <param name="itemConstraint"></param>\r
205                 public NoItemConstraint(Constraint itemConstraint)\r
206                         : base( itemConstraint ) { }\r
207 \r
208                 /// <summary>\r
209                 /// Apply the item constraint to each item in the collection,\r
210                 /// failing if any item fails.\r
211                 /// </summary>\r
212                 /// <param name="actual"></param>\r
213                 /// <returns></returns>\r
214                 public override bool Matches(object actual)\r
215                 {\r
216                         this.actual = actual;\r
217 \r
218                         PassModifiersToBase();\r
219 \r
220                         if ( !(actual is ICollection) )\r
221                                 throw new ArgumentException( "The actual value must be a collection", "actual" );\r
222 \r
223                         foreach(object item in (ICollection)actual)\r
224                                 if (baseConstraint.Matches(item))\r
225                                         return false;\r
226 \r
227                         return true;\r
228                 }\r
229 \r
230                 /// <summary>\r
231                 /// Write a description of this constraint to a MessageWriter\r
232                 /// </summary>\r
233                 /// <param name="writer"></param>\r
234                 public override void WriteDescriptionTo(MessageWriter writer)\r
235                 {\r
236                         writer.WritePredicate("no item");\r
237                         baseConstraint.WriteDescriptionTo(writer);\r
238                 }\r
239         }\r
240         #endregion\r
241 }