1 | /* |
2 | * JTiger Unit Testing Framework for J2SE 1.5 |
3 | * Copyright (C) 2005 Tony Morris |
4 | * |
5 | * This software is licenced under the |
6 | * Common Public Licence version 1.0 |
7 | * http://www.opensource.org/licenses/cpl1.0.php |
8 | * |
9 | * You received a copy of this licence with this software. |
10 | */ |
11 | package org.jtiger.assertion; |
12 | |
13 | final class EqualsMethodContractTesterFactory |
14 | { |
15 | private EqualsMethodContractTesterFactory() |
16 | { |
17 | |
18 | } |
19 | |
20 | static EqualsMethodContractTester newEqualsMethodContractTester(final ObjectFactory<?> factory) throws NullPointerException |
21 | { |
22 | if(factory == null) |
23 | { |
24 | throw new NullPointerException(); |
25 | } |
26 | |
27 | return new EqualsMethodContractTesterImpl(factory); |
28 | } |
29 | |
30 | private static final class EqualsMethodContractTesterImpl implements EqualsMethodContractTester |
31 | { |
32 | private final ObjectFactory<?> factory; |
33 | |
34 | EqualsMethodContractTesterImpl(final ObjectFactory<?> factory) |
35 | { |
36 | this.factory = factory; |
37 | } |
38 | |
39 | public boolean isUnequalToNull() |
40 | { |
41 | final Object x = factory.newInstanceX(); |
42 | final Object y = factory.newInstanceY(); |
43 | |
44 | return x != null && !x.equals(null) && y != null && !y.equals(null); |
45 | } |
46 | |
47 | public boolean isConsistentAcrossInvocations() |
48 | { |
49 | for (int i = 0; i < 20; ++i) |
50 | { |
51 | if(!isUnequalToNull()) |
52 | { |
53 | return false; |
54 | } |
55 | |
56 | if(!isReflexive()) |
57 | { |
58 | return false; |
59 | } |
60 | |
61 | if(!isSymmetric()) |
62 | { |
63 | return false; |
64 | } |
65 | |
66 | if(!isTransitive()) |
67 | { |
68 | return false; |
69 | } |
70 | |
71 | if(!isUnequalToUnequalInstance()) |
72 | { |
73 | return false; |
74 | } |
75 | } |
76 | |
77 | return true; |
78 | } |
79 | |
80 | public boolean isReflexive() |
81 | { |
82 | final Object x = factory.newInstanceX(); |
83 | final Object y = factory.newInstanceY(); |
84 | |
85 | return x.equals(x) && y.equals(y); |
86 | } |
87 | |
88 | public boolean isSymmetric() |
89 | { |
90 | final Object x1 = factory.newInstanceX(); |
91 | final Object x2 = factory.newInstanceX(); |
92 | final Object y1 = factory.newInstanceY(); |
93 | final Object y2 = factory.newInstanceY(); |
94 | |
95 | return x1.equals(x2) && x2.equals(x1) && y1.equals(y2) && y2.equals(y1); |
96 | } |
97 | |
98 | public boolean isTransitive() |
99 | { |
100 | final Object x1 = factory.newInstanceX(); |
101 | final Object x2 = factory.newInstanceX(); |
102 | final Object x3 = factory.newInstanceX(); |
103 | final Object y1 = factory.newInstanceY(); |
104 | final Object y2 = factory.newInstanceY(); |
105 | final Object y3 = factory.newInstanceY(); |
106 | |
107 | return x1.equals(x2) && x2.equals(x3) && x1.equals(x3) && |
108 | y1.equals(y2) && y2.equals(y3) && y1.equals(y3); |
109 | } |
110 | |
111 | public boolean isUnequalToUnequalInstance() |
112 | { |
113 | final Object x = factory.newInstanceX(); |
114 | final Object y = factory.newInstanceY(); |
115 | |
116 | return !x.equals(y) && !y.equals(x); |
117 | } |
118 | |
119 | public boolean isUnequalToArbitraryType() |
120 | { |
121 | final Object x = factory.newInstanceX(); |
122 | final Object y = factory.newInstanceY(); |
123 | |
124 | final class ArbitraryType |
125 | { |
126 | private ArbitraryType() |
127 | { |
128 | |
129 | } |
130 | } |
131 | |
132 | return !x.equals(new ArbitraryType()) && !y.equals(new ArbitraryType()); |
133 | } |
134 | |
135 | public boolean fillsContract() |
136 | { |
137 | return (isUnequalToNull() |
138 | && isConsistentAcrossInvocations() |
139 | && isReflexive() |
140 | && isSymmetric() |
141 | && isTransitive() |
142 | && isUnequalToArbitraryType() |
143 | && isUnequalToUnequalInstance()); |
144 | } |
145 | } |
146 | } |