annotate Constraints/ArrayContainsConstraint.cs @ 2:405baf327de2

Re #46: Add NUnit helper methods * Improve additional information message * Improve handling of mis-matched length arrays
author IBBoard <dev@ibboard.co.uk>
date Sat, 21 Aug 2010 14:53:48 +0000
parents 4dad6872ca5a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
1 // This file (Contain.cs) is a part of the IBBoard.NUnit project and is copyright 2010 IBBoard
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
2 //
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
3 // The file and the library/program it is in are licensed and distributed, without warranty, under the GNU LGPL, either version 3 of the License or (at your option) any later version. Please see COPYING for more information and the full license.
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
4 using System;
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
5 using NUnit.Framework.Constraints;
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
6 using NUnit.Framework;
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
7 namespace IBBoard.NUnit.Constraints
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
8 {
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
9 /// <summary>
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
10 /// Requires a list of objects to appear in a given order from the start of an array
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
11 /// </summary>
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
12 public class ArrayContainsConstraint<T> : Constraint
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
13 {
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
14 private static readonly int NOT_FOUND = -1;
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
15 private T[] containedObjs;
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
16 private int idx = NOT_FOUND;
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
17
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
18 public ArrayContainsConstraint(params T[] containedObjects)
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
19 {
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
20 containedObjs = containedObjects;
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
21 }
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
22
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
23 public override bool Matches(object actual)
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
24 {
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
25 this.actual = actual;
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
26
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
27 if (!(actual is Array))
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
28 {
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
29 throw new ArgumentException("The actual value must be an array");
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
30 }
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
31
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
32 return DoMatch((object[])this.actual);
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
33 }
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
34
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
35 private bool DoMatch(object[] array)
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
36 {
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
37 bool isMatch = true;
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
38 idx = NOT_FOUND;
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
39
2
405baf327de2 Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents: 1
diff changeset
40 int max = Math.Min(array.Length, containedObjs.Length);
405baf327de2 Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents: 1
diff changeset
41
405baf327de2 Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents: 1
diff changeset
42 for (int i = 0; i < max; i++)
405baf327de2 Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents: 1
diff changeset
43 {
405baf327de2 Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents: 1
diff changeset
44 if (!EqualityChecker.AreEqual(containedObjs[i], array[i]))
405baf327de2 Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents: 1
diff changeset
45 {
405baf327de2 Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents: 1
diff changeset
46 isMatch = false;
405baf327de2 Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents: 1
diff changeset
47 idx = i;
405baf327de2 Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents: 1
diff changeset
48 break;
405baf327de2 Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents: 1
diff changeset
49 }
405baf327de2 Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents: 1
diff changeset
50 }
405baf327de2 Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents: 1
diff changeset
51
405baf327de2 Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents: 1
diff changeset
52 if (isMatch && containedObjs.Length != array.Length)
1
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
53 {
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
54 isMatch = false;
2
405baf327de2 Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents: 1
diff changeset
55 idx = max;
1
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
56 }
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
57
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
58 return isMatch;
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
59 }
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
60
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
61 public override void WriteDescriptionTo(MessageWriter writer)
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
62 {
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
63 if (containedObjs.Length == 0)
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
64 {
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
65 writer.Write("Empty array");
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
66 }
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
67 else if (idx == NOT_FOUND)
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
68 {
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
69 writer.WriteExpectedValue(containedObjs[0]);
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
70 }
2
405baf327de2 Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents: 1
diff changeset
71 else if (idx >= containedObjs.Length)
405baf327de2 Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents: 1
diff changeset
72 {
405baf327de2 Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents: 1
diff changeset
73 writer.Write("End of array");
405baf327de2 Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents: 1
diff changeset
74 }
1
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
75 else
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
76 {
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
77 writer.WriteExpectedValue(containedObjs[idx]);
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
78 }
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
79 }
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
80
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
81 public override void WriteActualValueTo(MessageWriter writer)
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
82 {
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
83 object[] actualArray = ((object[])actual);
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
84
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
85 if (actualArray.Length == 0)
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
86 {
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
87 writer.Write("Empty array");
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
88 }
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
89 else if (idx == NOT_FOUND)
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
90 {
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
91 writer.WriteActualValue(actualArray[0]);
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
92 }
2
405baf327de2 Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents: 1
diff changeset
93 else if (idx >= actualArray.Length)
405baf327de2 Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents: 1
diff changeset
94 {
405baf327de2 Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents: 1
diff changeset
95 writer.Write("End of array");
405baf327de2 Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents: 1
diff changeset
96 }
1
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
97 else
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
98 {
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
99 writer.WriteActualValue(actualArray[idx]);
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
100 }
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
101 }
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
102
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
103 public override void WriteMessageTo(MessageWriter writer)
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
104 {
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
105 base.WriteMessageTo(writer);
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
106
2
405baf327de2 Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents: 1
diff changeset
107 if (idx >= containedObjs.Length)
405baf327de2 Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents: 1
diff changeset
108 {
405baf327de2 Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents: 1
diff changeset
109 writer.WriteMessageLine("Unexpected value at index {0}", idx);
405baf327de2 Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents: 1
diff changeset
110 }
405baf327de2 Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents: 1
diff changeset
111 else if (idx >= ((object[])actual).Length)
1
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
112 {
2
405baf327de2 Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents: 1
diff changeset
113 writer.WriteMessageLine("Expected value at index {0}", idx);
405baf327de2 Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents: 1
diff changeset
114 }
405baf327de2 Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents: 1
diff changeset
115 else if (idx != NOT_FOUND)
405baf327de2 Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents: 1
diff changeset
116 {
405baf327de2 Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents: 1
diff changeset
117 writer.WriteMessageLine("Incorrect value at index {0}", idx);
1
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
118 }
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
119 }
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
120 }
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
121 }
4dad6872ca5a Re #46: Add NUnit helper methods
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
122