annotate src/main/java/fj/test/Property.java @ 0:fe80c1edf1be

add getLoop
author tatsuki
date Fri, 20 Mar 2015 21:04:03 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1 package fj.test;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
2
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
3 import static fj.Function.curry;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
4 import static fj.Function.compose2;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
5 import static fj.P.p;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
6
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
7 import fj.*;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
8
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
9 import static fj.P2.__2;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
10 import fj.data.List;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
11 import fj.data.Option;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
12 import static fj.data.Option.none;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
13 import fj.data.Stream;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
14 import static fj.test.Arg.arg;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
15 import static fj.test.CheckResult.exhausted;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
16 import static fj.test.CheckResult.falsified;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
17 import static fj.test.CheckResult.genException;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
18 import static fj.test.CheckResult.passed;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
19 import static fj.test.CheckResult.propException;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
20 import static fj.test.CheckResult.proven;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
21 import static fj.test.Result.noResult;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
22 import static java.lang.Math.round;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
23
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
24 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
25 * Represents an algebraic property about a program that may be {@link #check(Rand, int, int, int,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
26 * int) checked} for its truth value. For example, it is true that "for all integers (call it x) and
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
27 * for all integers (call it y), then x + y is equivalent to y + x". This statement is a (algebraic)
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
28 * property, proposition or theorem that, when checked, will at least (depending on arguments) fail
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
29 * to be falsified — since there does not exist a counter-example to this statement.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
30 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
31 * @version %build.number%
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
32 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
33 public final class Property {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
34 private final F<Integer, F<Rand, Result>> f;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
35
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
36 private Property(final F<Integer, F<Rand, Result>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
37 this.f = f;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
38 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
39
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
40 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
41 * Returns the result of applying the given size and random generator.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
42 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
43 * @param i The size to use to obtain a result.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
44 * @param r The random generator to use to obtain a result.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
45 * @return The result of applying the given size and random generator.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
46 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
47 public Result prop(final int i, final Rand r) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
48 return f.f(i).f(r);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
49 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
50
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
51 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
52 * Returns a generator of results from this property.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
53 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
54 * @return A generator of results from this property.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
55 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
56 public Gen<Result> gen() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
57 return Gen.gen(new F<Integer, F<Rand, Result>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
58 public F<Rand, Result> f(final Integer i) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
59 return new F<Rand, Result>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
60 public Result f(final Rand r) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
61 return f.f(i).f(r);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
62 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
63 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
64 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
65 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
66 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
67
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
68 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
69 * Performs a conjunction of this property with the given property.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
70 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
71 * @param p The property to perform the conjunction with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
72 * @return A conjunction of this property with the given property.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
73 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
74 public Property and(final Property p) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
75 return fromGen(gen().bind(p.gen(), new F<Result, F<Result, Result>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
76 public F<Result, Result> f(final Result res1) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
77 return new F<Result, Result>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
78 public Result f(final Result res2) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
79 return res1.isException() || res1.isFalsified() ? res1 : res2.isException() || res2.isFalsified() ? res2 : res1.isProven() || res1.isUnfalsified() ? res2 : res2.isProven() || res2.isUnfalsified() ? res1 : noResult();
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
80 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
81 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
82 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
83 }));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
84 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
85
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
86 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
87 * Performs a disjunction of this property with the given property.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
88 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
89 * @param p The property to perform the disjunction with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
90 * @return A disjunction of this property with the given property.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
91 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
92 public Property or(final Property p) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
93 return fromGen(gen().bind(p.gen(), new F<Result, F<Result, Result>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
94 public F<Result, Result> f(final Result res1) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
95 return new F<Result, Result>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
96 public Result f(final Result res2) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
97 return res1.isException() || res1.isFalsified() ? res1 : res2.isException() || res2.isFalsified() ? res2 : res1.isProven() || res1.isUnfalsified() ? res1 : res2.isProven() || res2.isUnfalsified() ? res2 : noResult();
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
98 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
99 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
100 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
101 }));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
102 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
103
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
104 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
105 * Performs a sequence of this property with the given property. The returned property holds if
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
106 * and only if this property and the given property also hold. If one property does not hold, but
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
107 * the other does, then the returned property will produce the same result and the property that
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
108 * holds.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
109 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
110 * @param p The property to sequence this property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
111 * @return A sequence of this property with the given property.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
112 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
113 public Property sequence(final Property p) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
114 return fromGen(gen().bind(p.gen(), new F<Result, F<Result, Result>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
115 public F<Result, Result> f(final Result res1) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
116 return new F<Result, Result>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
117 public Result f(final Result res2) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
118 return res1.isException() || res1.isProven() || res1.isUnfalsified() ? res1 : res2.isException() || res2.isProven() || res2.isUnfalsified() ? res2 : res1.isFalsified() ? res2 : res2.isFalsified() ? res1 : noResult();
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
119 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
120 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
121 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
122 }));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
123 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
124
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
125 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
126 * Checks this property using the given arguments and produces a result.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
127 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
128 * @param r The random generator to use for checking.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
129 * @param minSuccessful The minimum number of successful tests before a result is reached.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
130 * @param maxDiscarded The maximum number of tests discarded because they did not satisfy
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
131 * pre-conditions (i.e. {@link #implies(boolean, P1)}).
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
132 * @param minSize The minimum size to use for checking.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
133 * @param maxSize The maximum size to use for checking.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
134 * @return A result after checking this property.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
135 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
136 @SuppressWarnings({"ThrowableResultOfMethodCallIgnored"})
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
137 public CheckResult check(final Rand r,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
138 final int minSuccessful,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
139 final int maxDiscarded,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
140 final int minSize,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
141 final int maxSize) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
142 int s = 0;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
143 int d = 0;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
144 float sz = minSize;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
145 CheckResult res;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
146
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
147 while (true) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
148 final float size = s == 0 && d == 0 ? minSize : sz + (maxSize - sz) / (minSuccessful - s);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
149 try {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
150 final Result x = f.f(round(size)).f(r);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
151 if (x.isNoResult())
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
152 if (d + 1 >= maxDiscarded) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
153 res = exhausted(s, d + 1);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
154 break;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
155 } else {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
156 sz = size;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
157 d++;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
158 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
159 else if (x.isProven()) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
160 res = proven(x.args().some(), s + 1, d);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
161 break;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
162 } else if (x.isUnfalsified())
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
163 if (s + 1 >= minSuccessful) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
164 res = passed(s + 1, d);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
165 break;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
166 } else {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
167 sz = size;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
168 s++;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
169 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
170 else if (x.isFalsified()) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
171 res = falsified(x.args().some(), s, d);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
172 break;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
173 } else if (x.isException()) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
174 res = propException(x.args().some(), x.exception().some(), s, d);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
175 break;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
176 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
177 } catch (final Throwable t) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
178 res = genException(t, s, d);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
179 break;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
180 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
181 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
182
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
183 return res;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
184 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
185
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
186 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
187 * Checks this property using a {@link Rand#Rand(F, F) standard random generator} and the given
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
188 * arguments to produce a result.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
189 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
190 * @param minSuccessful The minimum number of successful tests before a result is reached.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
191 * @param maxDiscarded The maximum number of tests discarded because they did not satisfy
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
192 * pre-conditions (i.e. {@link #implies(boolean, P1)}).
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
193 * @param minSize The minimum size to use for checking.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
194 * @param maxSize The maximum size to use for checking.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
195 * @return A result after checking this property.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
196 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
197 public CheckResult check(final int minSuccessful,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
198 final int maxDiscarded,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
199 final int minSize,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
200 final int maxSize) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
201 return check(Rand.standard, minSuccessful, maxDiscarded, minSize, maxSize);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
202 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
203
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
204 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
205 * Checks this property using the given random generator, 100 minimum successful checks, 500
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
206 * maximum discarded tests, minimum size of 0, maximum size of 100.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
207 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
208 * @param r The random generator.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
209 * @return A result after checking this property.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
210 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
211 public CheckResult check(final Rand r) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
212 return check(r, 100, 500, 0, 100);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
213 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
214
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
215 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
216 * Checks this property using the given random generator, 100 minimum successful checks, 500
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
217 * maximum discarded tests, the given minimum size and the given maximum size.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
218 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
219 * @param r The random generator.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
220 * @param minSize The minimum size to use for checking.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
221 * @param maxSize The maximum size to use for checking.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
222 * @return A result after checking this property.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
223 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
224 public CheckResult check(final Rand r, final int minSize, final int maxSize) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
225 return check(r, 100, 500, minSize, maxSize);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
226 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
227
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
228 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
229 * Checks this property using a {@link Rand#Rand(F, F) standard random generator}, 100 minimum
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
230 * successful checks, 500 maximum discarded tests and the given arguments to produce a result.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
231 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
232 * @param minSize The minimum size to use for checking.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
233 * @param maxSize The maximum size to use for checking.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
234 * @return A result after checking this property.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
235 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
236 public CheckResult check(final int minSize,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
237 final int maxSize) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
238 return check(100, 500, minSize, maxSize);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
239 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
240
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
241 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
242 * Checks this property using a {@link Rand#Rand(F, F) standard random generator}, 100 minimum
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
243 * successful checks, 500 maximum discarded tests, minimum size of 0, maximum size of 100.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
244 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
245 * @return A result after checking this property.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
246 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
247 public CheckResult check() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
248 return check(0, 100);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
249 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
250
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
251 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
252 * Checks this property using a {@link Rand#Rand(F, F) standard random generator}, the given minimum
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
253 * successful checks, 500 maximum discarded tests, minimum size of 0, maximum size of 100.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
254 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
255 * @param minSuccessful The minimum number of successful tests before a result is reached.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
256 * @return A result after checking this property.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
257 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
258 public CheckResult minSuccessful(final int minSuccessful) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
259 return check(minSuccessful, 500, 0, 100);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
260 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
261
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
262 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
263 * Checks this property using the given random generator, the given minimum
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
264 * successful checks, 500 maximum discarded tests, minimum size of 0, maximum size of 100.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
265 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
266 * @param r The random generator.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
267 * @param minSuccessful The minimum number of successful tests before a result is reached.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
268 * @return A result after checking this property.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
269 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
270 public CheckResult minSuccessful(final Rand r, final int minSuccessful) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
271 return check(r, minSuccessful, 500, 0, 100);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
272 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
273
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
274 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
275 * Checks this property using a {@link Rand#Rand(F, F) standard random generator}, 100 minimum
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
276 * successful checks, the given maximum discarded tests, minimum size of 0, maximum size of 100.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
277 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
278 * @param maxDiscarded The maximum number of tests discarded because they did not satisfy
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
279 * pre-conditions (i.e. {@link #implies(boolean, P1)}).
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
280 * @return A result after checking this property.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
281 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
282 public CheckResult maxDiscarded(final int maxDiscarded) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
283 return check(100, maxDiscarded, 0, 100);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
284 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
285
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
286 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
287 * Checks this property using a the given random generator}, 100 minimum
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
288 * successful checks, the given maximum discarded tests, minimum size of 0, maximum size of 100.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
289 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
290 * @param r The random generator.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
291 * @param maxDiscarded The maximum number of tests discarded because they did not satisfy
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
292 * pre-conditions (i.e. {@link #implies(boolean, P1)}).
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
293 * @return A result after checking this property.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
294 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
295 public CheckResult maxDiscarded(final Rand r, final int maxDiscarded) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
296 return check(r, 100, maxDiscarded, 0, 100);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
297 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
298
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
299 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
300 * Checks this property using a {@link Rand#Rand(F, F) standard random generator}, 100 minimum
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
301 * successful checks, 500 maximum discarded tests, the given minimum size, maximum size of 100.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
302 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
303 * @param minSize The minimum size to use for checking.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
304 * @return A result after checking this property.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
305 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
306 public CheckResult minSize(final int minSize) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
307 return check(100, 500, minSize, 100);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
308 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
309
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
310 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
311 * Checks this property using the given random generator, 100 minimum
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
312 * successful checks, 500 maximum discarded tests, the given minimum size, maximum size of 100.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
313 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
314 * @param r The random generator.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
315 * @param minSize The minimum size to use for checking.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
316 * @return A result after checking this property.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
317 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
318 public CheckResult minSize(final Rand r, final int minSize) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
319 return check(r, 100, 500, minSize, 100);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
320 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
321
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
322 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
323 * Checks this property using a {@link Rand#Rand(F, F) standard random generator}, 100 minimum
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
324 * successful checks, 500 maximum discarded tests, minimum size of 0, the given maximum size.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
325 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
326 * @param maxSize The maximum size to use for checking.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
327 * @return A result after checking this property.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
328 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
329 public CheckResult maxSize(final int maxSize) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
330 return check(100, 500, 0, maxSize);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
331 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
332
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
333 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
334 * Checks this property using the given random generator, 100 minimum
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
335 * successful checks, 500 maximum discarded tests, minimum size of 0, the given maximum size.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
336 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
337 * @param r The random generator.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
338 * @param maxSize The maximum size to use for checking.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
339 * @return A result after checking this property.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
340 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
341 public CheckResult maxSize(final Rand r, final int maxSize) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
342 return check(r, 100, 500, 0, maxSize);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
343 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
344
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
345 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
346 * Returns a property that produces a result only if the given condition satisfies. The result
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
347 * will be taken from the given property.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
348 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
349 * @param b The condition that, if satisfied, produces the given property.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
350 * @param p The property to return if the condition satisfies.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
351 * @return A property that produces a result only if the given condition satisfies.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
352 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
353 public static Property implies(final boolean b, final P1<Property> p) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
354 return b ? p._1() : new Property(new F<Integer, F<Rand, Result>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
355 public F<Rand, Result> f(final Integer i) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
356 return new F<Rand, Result>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
357 public Result f(final Rand r) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
358 return noResult();
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
359 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
360 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
361 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
362 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
363 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
364
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
365 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
366 * Returns a property from the given function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
367 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
368 * @param f The function to construct the returned property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
369 * @return A property from the given function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
370 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
371 public static Property prop(final F<Integer, F<Rand, Result>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
372 return new Property(f);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
373 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
374
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
375 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
376 * Returns a property that always has the given result.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
377 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
378 * @param r The result of the returned property.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
379 * @return A property that always has the given result.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
380 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
381 public static Property prop(final Result r) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
382 return new Property(new F<Integer, F<Rand, Result>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
383 public F<Rand, Result> f(final Integer integer) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
384 return new F<Rand, Result>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
385 public Result f(final Rand x) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
386 return r;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
387 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
388 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
389 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
390 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
391 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
392
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
393 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
394 * Returns a property that is either proven (the given condition satsifies) or falsified
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
395 * otherwise.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
396 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
397 * @param b The condition that, if satisfied, returns a property that is proven; otherwise, the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
398 * property is falsified.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
399 * @return A property that is either proven (the given condition satsifies) or falsified
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
400 * otherwise.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
401 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
402 public static Property prop(final boolean b) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
403 return b ? prop(Result.proven(List.<Arg<?>>nil())) : prop(Result.falsified(List.<Arg<?>>nil()));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
404 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
405
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
406 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
407 * Constructs a property from a generator of results.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
408 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
409 * @param g The generator of results to constructor a property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
410 * @return A property from a generator of results.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
411 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
412 public static Property fromGen(final Gen<Result> g) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
413 return prop(new F<Integer, F<Rand, Result>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
414 public F<Rand, Result> f(final Integer i) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
415 return new F<Rand, Result>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
416 public Result f(final Rand r) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
417 return g.gen(i, r);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
418 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
419 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
420 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
421 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
422 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
423
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
424 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
425 * Returns a property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
426 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
427 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
428 * @param g The generator to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
429 * @param shrink The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
430 * @param f The function to produce properties with results.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
431 * @return A property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
432 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
433 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
434 public static <A> Property forall(final Gen<A> g, final Shrink<A> shrink, final F<A, P1<Property>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
435 return prop(new F<Integer, F<Rand, Result>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
436 public F<Rand, Result> f(final Integer i) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
437 return new F<Rand, Result>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
438 public Result f(final Rand r) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
439 final class Util {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
440 @SuppressWarnings({"IfMayBeConditional"})
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
441 Option<P2<A, Result>> first(final Stream<A> as, final int shrinks) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
442 final Stream<Option<P2<A, Result>>> results = as.map(new F<A, Option<P2<A, Result>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
443 public Option<P2<A, Result>> f(final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
444 final Result result = exception(f.f(a)).prop(i, r);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
445
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
446 return result.toOption().map(new F<Result, P2<A, Result>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
447 public P2<A, Result> f(final Result result) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
448 return p(a, result.provenAsUnfalsified().addArg(arg(a, shrinks)));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
449 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
450 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
451 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
452 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
453
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
454 if (results.isEmpty())
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
455 return none();
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
456 else return results.find(new F<Option<P2<A, Result>>, Boolean>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
457 public Boolean f(final Option<P2<A, Result>> o) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
458 return failed(o);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
459 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
460 }).orSome(new P1<Option<P2<A, Result>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
461 public Option<P2<A, Result>> _1() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
462 return results.head();
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
463 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
464 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
465 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
466
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
467 public boolean failed(final Option<P2<A, Result>> o) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
468 return o.isSome() && o.some()._2().failed();
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
469 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
470 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
471
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
472 final Util u = new Util();
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
473
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
474 Option<P2<A, Result>> x = u.first(Stream.single(g.gen(i, r)), 0);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
475 final F<P2<A, Result>, Result> __2 = __2();
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
476 if (u.failed(x)) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
477 Option<Result> or;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
478 int shrinks = 0;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
479
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
480 do {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
481 shrinks++;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
482 or = x.map(__2);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
483 x = u.first(shrink.shrink(x.some()._1()), shrinks);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
484 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
485 while (u.failed(x));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
486
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
487 return noResult(or);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
488 } else
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
489 return noResult(x.map(__2));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
490 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
491 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
492 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
493 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
494 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
495
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
496 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
497 * Returns a property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
498 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
499 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
500 * @param aa The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
501 * @param sa The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
502 * @param f The function to produce properties with results.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
503 * @return A property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
504 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
505 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
506 public static <A> Property propertyP(final Arbitrary<A> aa, final Shrink<A> sa, final F<A, P1<Property>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
507 return forall(aa.gen, sa, f);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
508 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
509
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
510 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
511 * Returns a property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
512 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
513 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
514 * @param aa The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
515 * @param sa The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
516 * @param f The function to produce properties with results.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
517 * @return A property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
518 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
519 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
520 public static <A> Property property(final Arbitrary<A> aa, final Shrink<A> sa, final F<A, Property> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
521 return propertyP(aa, sa, P1.curry(f));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
522 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
523
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
524 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
525 * Returns a property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
526 * application of its arguments. No shrinking occurs upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
527 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
528 * @param aa The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
529 * @param f The function to produce properties with results.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
530 * @return A property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
531 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
532 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
533 public static <A> Property propertyP(final Arbitrary<A> aa, final F<A, P1<Property>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
534 return propertyP(aa, Shrink.<A>empty(), f);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
535 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
536
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
537 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
538 * Returns a property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
539 * application of its arguments. No shrinking occurs upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
540 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
541 * @param aa The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
542 * @param f The function to produce properties with results.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
543 * @return A property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
544 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
545 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
546 public static <A> Property property(final Arbitrary<A> aa, final F<A, Property> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
547 return propertyP(aa, P1.curry(f));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
548 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
549
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
550
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
551 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
552 * Returns a property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
553 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
554 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
555 * @param aa The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
556 * @param ab The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
557 * @param sa The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
558 * @param sb The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
559 * @param f The function to produce properties with results.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
560 * @return A property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
561 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
562 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
563 public static <A, B> Property propertyP(final Arbitrary<A> aa, final Arbitrary<B> ab, final Shrink<A> sa, final Shrink<B> sb, final F<A, F<B, P1<Property>>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
564 return property(aa, sa, new F<A, Property>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
565 public Property f(final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
566 return propertyP(ab, sb, new F<B, P1<Property>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
567 public P1<Property> f(final B b) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
568 return f.f(a).f(b);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
569 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
570 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
571 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
572 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
573 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
574
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
575 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
576 * Returns a property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
577 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
578 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
579 * @param aa The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
580 * @param ab The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
581 * @param sa The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
582 * @param sb The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
583 * @param f The function to produce properties with results.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
584 * @return A property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
585 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
586 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
587 public static <A, B> Property property(final Arbitrary<A> aa, final Arbitrary<B> ab, final Shrink<A> sa, final Shrink<B> sb, final F<A, F<B, Property>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
588 return propertyP(aa, ab, sa, sb, compose2(P.<Property>p1(), f));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
589 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
590
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
591 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
592 * Returns a property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
593 * application of its arguments. No shrinking occurs upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
594 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
595 * @param aa The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
596 * @param ab The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
597 * @param f The function to produce properties with results.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
598 * @return A property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
599 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
600 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
601 public static <A, B> Property propertyP(final Arbitrary<A> aa, final Arbitrary<B> ab, final F<A, F<B, P1<Property>>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
602 return property(aa, new F<A, Property>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
603 public Property f(final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
604 return propertyP(ab, new F<B, P1<Property>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
605 public P1<Property> f(final B b) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
606 return f.f(a).f(b);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
607 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
608 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
609 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
610 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
611 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
612
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
613 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
614 * Returns a property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
615 * application of its arguments. No shrinking occurs upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
616 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
617 * @param aa The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
618 * @param ab The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
619 * @param f The function to produce properties with results.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
620 * @return A property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
621 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
622 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
623 public static <A, B> Property property(final Arbitrary<A> aa, final Arbitrary<B> ab, final F<A, F<B, Property>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
624 return propertyP(aa, ab, compose2(P.<Property>p1(), f));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
625 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
626
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
627 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
628 * Returns a property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
629 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
630 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
631 * @param aa The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
632 * @param ab The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
633 * @param sa The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
634 * @param sb The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
635 * @param f The function to produce properties with results.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
636 * @return A property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
637 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
638 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
639 public static <A, B> Property propertyP(final Arbitrary<A> aa, final Arbitrary<B> ab, final Shrink<A> sa, final Shrink<B> sb, final F2<A, B, P1<Property>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
640 return propertyP(aa, ab, sa, sb, curry(f));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
641 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
642
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
643 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
644 * Returns a property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
645 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
646 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
647 * @param aa The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
648 * @param ab The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
649 * @param sa The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
650 * @param sb The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
651 * @param f The function to produce properties with results.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
652 * @return A property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
653 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
654 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
655 public static <A, B> Property property(final Arbitrary<A> aa, final Arbitrary<B> ab, final Shrink<A> sa, final Shrink<B> sb, final F2<A, B, Property> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
656 return propertyP(aa, ab, sa, sb, compose2(P.<Property>p1(), curry(f)));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
657 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
658
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
659 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
660 * Returns a property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
661 * application of its arguments. No shrinking occurs upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
662 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
663 * @param aa The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
664 * @param ab The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
665 * @param f The function to produce properties with results.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
666 * @return A property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
667 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
668 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
669 public static <A, B> Property propertyP(final Arbitrary<A> aa, final Arbitrary<B> ab, final F2<A, B, P1<Property>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
670 return propertyP(aa, ab, curry(f));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
671 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
672
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
673 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
674 * Returns a property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
675 * application of its arguments. No shrinking occurs upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
676 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
677 * @param aa The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
678 * @param ab The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
679 * @param f The function to produce properties with results.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
680 * @return A property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
681 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
682 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
683 public static <A, B> Property property(final Arbitrary<A> aa, final Arbitrary<B> ab, final F2<A, B, Property> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
684 return propertyP(aa, ab, compose2(P.<Property>p1(), curry(f)));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
685 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
686
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
687 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
688 * Returns a property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
689 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
690 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
691 * @param aa The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
692 * @param ab The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
693 * @param ac The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
694 * @param sa The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
695 * @param sb The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
696 * @param sc The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
697 * @param f The function to produce properties with results.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
698 * @return A property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
699 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
700 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
701 public static <A, B, C> Property property(final Arbitrary<A> aa,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
702 final Arbitrary<B> ab,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
703 final Arbitrary<C> ac,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
704 final Shrink<A> sa,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
705 final Shrink<B> sb,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
706 final Shrink<C> sc,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
707 final F<A, F<B, F<C, Property>>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
708 return property(aa, ab, sa, sb, new F<A, F<B, Property>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
709 public F<B, Property> f(final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
710 return new F<B, Property>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
711 public Property f(final B b) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
712 return property(ac, sc, new F<C, Property>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
713 public Property f(final C c) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
714 return f.f(a).f(b).f(c);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
715 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
716 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
717 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
718 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
719 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
720 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
721 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
722
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
723 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
724 * Returns a property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
725 * application of its arguments. No shrinking occurs upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
726 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
727 * @param aa The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
728 * @param ab The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
729 * @param ac The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
730 * @param f The function to produce properties with results.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
731 * @return A property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
732 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
733 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
734 public static <A, B, C> Property property(final Arbitrary<A> aa,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
735 final Arbitrary<B> ab,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
736 final Arbitrary<C> ac,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
737 final F<A, F<B, F<C, Property>>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
738 return property(aa, ab, new F<A, F<B, Property>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
739 public F<B, Property> f(final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
740 return new F<B, Property>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
741 public Property f(final B b) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
742 return property(ac, new F<C, Property>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
743 public Property f(final C c) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
744 return f.f(a).f(b).f(c);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
745 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
746 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
747 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
748 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
749 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
750 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
751 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
752
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
753 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
754 * Returns a property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
755 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
756 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
757 * @param aa The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
758 * @param ab The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
759 * @param ac The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
760 * @param sa The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
761 * @param sb The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
762 * @param sc The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
763 * @param f The function to produce properties with results.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
764 * @return A property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
765 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
766 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
767 public static <A, B, C> Property property(final Arbitrary<A> aa,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
768 final Arbitrary<B> ab,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
769 final Arbitrary<C> ac,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
770 final Shrink<A> sa,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
771 final Shrink<B> sb,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
772 final Shrink<C> sc,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
773 final F3<A, B, C, Property> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
774 return property(aa, ab, ac, sa, sb, sc, curry(f));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
775 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
776
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
777 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
778 * Returns a property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
779 * application of its arguments. No shrinking occurs upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
780 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
781 * @param aa The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
782 * @param ab The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
783 * @param ac The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
784 * @param f The function to produce properties with results.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
785 * @return A property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
786 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
787 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
788 public static <A, B, C> Property property(final Arbitrary<A> aa,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
789 final Arbitrary<B> ab,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
790 final Arbitrary<C> ac,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
791 final F3<A, B, C, Property> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
792 return property(aa, ab, ac, curry(f));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
793 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
794
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
795 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
796 * Returns a property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
797 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
798 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
799 * @param aa The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
800 * @param ab The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
801 * @param ac The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
802 * @param ad The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
803 * @param sa The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
804 * @param sb The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
805 * @param sc The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
806 * @param sd The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
807 * @param f The function to produce properties with results.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
808 * @return A property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
809 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
810 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
811 public static <A, B, C, D> Property property(final Arbitrary<A> aa,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
812 final Arbitrary<B> ab,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
813 final Arbitrary<C> ac,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
814 final Arbitrary<D> ad,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
815 final Shrink<A> sa,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
816 final Shrink<B> sb,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
817 final Shrink<C> sc,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
818 final Shrink<D> sd,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
819 final F<A, F<B, F<C, F<D, Property>>>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
820 return property(aa, ab, ac, sa, sb, sc, new F<A, F<B, F<C, Property>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
821 public F<B, F<C, Property>> f(final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
822 return new F<B, F<C, Property>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
823 public F<C, Property> f(final B b) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
824 return new F<C, Property>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
825 public Property f(final C c) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
826 return property(ad, sd, new F<D, Property>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
827 public Property f(final D d) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
828 return f.f(a).f(b).f(c).f(d);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
829 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
830 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
831 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
832 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
833 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
834 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
835 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
836 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
837 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
838
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
839 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
840 * Returns a property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
841 * application of its arguments. No shrinking occurs upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
842 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
843 * @param aa The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
844 * @param ab The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
845 * @param ac The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
846 * @param ad The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
847 * @param f The function to produce properties with results.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
848 * @return A property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
849 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
850 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
851 public static <A, B, C, D> Property property(final Arbitrary<A> aa,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
852 final Arbitrary<B> ab,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
853 final Arbitrary<C> ac,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
854 final Arbitrary<D> ad,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
855 final F<A, F<B, F<C, F<D, Property>>>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
856 return property(aa, ab, ac, new F<A, F<B, F<C, Property>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
857 public F<B, F<C, Property>> f(final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
858 return new F<B, F<C, Property>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
859 public F<C, Property> f(final B b) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
860 return new F<C, Property>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
861 public Property f(final C c) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
862 return property(ad, new F<D, Property>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
863 public Property f(final D d) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
864 return f.f(a).f(b).f(c).f(d);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
865 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
866 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
867 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
868 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
869 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
870 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
871 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
872 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
873 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
874
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
875 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
876 * Returns a property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
877 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
878 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
879 * @param aa The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
880 * @param ab The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
881 * @param ac The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
882 * @param ad The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
883 * @param sa The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
884 * @param sb The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
885 * @param sc The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
886 * @param sd The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
887 * @param f The function to produce properties with results.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
888 * @return A property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
889 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
890 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
891 public static <A, B, C, D> Property property(final Arbitrary<A> aa,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
892 final Arbitrary<B> ab,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
893 final Arbitrary<C> ac,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
894 final Arbitrary<D> ad,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
895 final Shrink<A> sa,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
896 final Shrink<B> sb,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
897 final Shrink<C> sc,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
898 final Shrink<D> sd,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
899 final F4<A, B, C, D, Property> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
900 return property(aa, ab, ac, ad, sa, sb, sc, sd, curry(f));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
901 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
902
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
903 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
904 * Returns a property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
905 * application of its arguments. No shrinking occurs upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
906 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
907 * @param aa The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
908 * @param ab The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
909 * @param ac The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
910 * @param ad The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
911 * @param f The function to produce properties with results.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
912 * @return A property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
913 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
914 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
915 public static <A, B, C, D> Property property(final Arbitrary<A> aa,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
916 final Arbitrary<B> ab,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
917 final Arbitrary<C> ac,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
918 final Arbitrary<D> ad,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
919 final F4<A, B, C, D, Property> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
920 return property(aa, ab, ac, ad, curry(f));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
921 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
922
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
923 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
924 * Returns a property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
925 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
926 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
927 * @param aa The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
928 * @param ab The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
929 * @param ac The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
930 * @param ad The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
931 * @param ae The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
932 * @param sa The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
933 * @param sb The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
934 * @param sc The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
935 * @param sd The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
936 * @param se The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
937 * @param f The function to produce properties with results.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
938 * @return A property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
939 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
940 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
941 public static <A, B, C, D, E> Property property(final Arbitrary<A> aa,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
942 final Arbitrary<B> ab,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
943 final Arbitrary<C> ac,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
944 final Arbitrary<D> ad,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
945 final Arbitrary<E> ae,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
946 final Shrink<A> sa,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
947 final Shrink<B> sb,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
948 final Shrink<C> sc,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
949 final Shrink<D> sd,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
950 final Shrink<E> se,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
951 final F<A, F<B, F<C, F<D, F<E, Property>>>>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
952 return property(aa, ab, ac, ad, sa, sb, sc, sd, new F<A, F<B, F<C, F<D, Property>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
953 public F<B, F<C, F<D, Property>>> f(final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
954 return new F<B, F<C, F<D, Property>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
955 public F<C, F<D, Property>> f(final B b) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
956 return new F<C, F<D, Property>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
957 public F<D, Property> f(final C c) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
958 return new F<D, Property>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
959 public Property f(final D d) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
960 return property(ae, se, new F<E, Property>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
961 public Property f(final E e) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
962 return f.f(a).f(b).f(c).f(d).f(e);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
963 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
964 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
965 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
966 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
967 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
968 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
969 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
970 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
971 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
972 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
973 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
974
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
975 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
976 * Returns a property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
977 * application of its arguments. No shrinking occurs upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
978 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
979 * @param aa The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
980 * @param ab The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
981 * @param ac The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
982 * @param ad The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
983 * @param ae The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
984 * @param f The function to produce properties with results.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
985 * @return A property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
986 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
987 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
988 public static <A, B, C, D, E> Property property(final Arbitrary<A> aa,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
989 final Arbitrary<B> ab,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
990 final Arbitrary<C> ac,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
991 final Arbitrary<D> ad,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
992 final Arbitrary<E> ae,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
993 final F<A, F<B, F<C, F<D, F<E, Property>>>>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
994 return property(aa, ab, ac, ad, new F<A, F<B, F<C, F<D, Property>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
995 public F<B, F<C, F<D, Property>>> f(final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
996 return new F<B, F<C, F<D, Property>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
997 public F<C, F<D, Property>> f(final B b) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
998 return new F<C, F<D, Property>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
999 public F<D, Property> f(final C c) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1000 return new F<D, Property>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1001 public Property f(final D d) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1002 return property(ae, new F<E, Property>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1003 public Property f(final E e) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1004 return f.f(a).f(b).f(c).f(d).f(e);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1005 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1006 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1007 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1008 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1009 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1010 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1011 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1012 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1013 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1014 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1015 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1016
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1017 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1018 * Returns a property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1019 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1020 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1021 * @param aa The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1022 * @param ab The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1023 * @param ac The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1024 * @param ad The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1025 * @param ae The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1026 * @param sa The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1027 * @param sb The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1028 * @param sc The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1029 * @param sd The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1030 * @param se The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1031 * @param f The function to produce properties with results.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1032 * @return A property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1033 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1034 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1035 public static <A, B, C, D, E> Property property(final Arbitrary<A> aa,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1036 final Arbitrary<B> ab,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1037 final Arbitrary<C> ac,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1038 final Arbitrary<D> ad,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1039 final Arbitrary<E> ae,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1040 final Shrink<A> sa,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1041 final Shrink<B> sb,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1042 final Shrink<C> sc,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1043 final Shrink<D> sd,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1044 final Shrink<E> se,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1045 final F5<A, B, C, D, E, Property> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1046 return property(aa, ab, ac, ad, ae, sa, sb, sc, sd, se, curry(f));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1047 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1048
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1049 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1050 * Returns a property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1051 * application of its arguments. No shrinking occurs upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1052 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1053 * @param aa The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1054 * @param ab The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1055 * @param ac The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1056 * @param ad The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1057 * @param ae The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1058 * @param f The function to produce properties with results.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1059 * @return A property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1060 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1061 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1062 public static <A, B, C, D, E> Property property(final Arbitrary<A> aa,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1063 final Arbitrary<B> ab,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1064 final Arbitrary<C> ac,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1065 final Arbitrary<D> ad,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1066 final Arbitrary<E> ae,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1067 final F5<A, B, C, D, E, Property> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1068 return property(aa, ab, ac, ad, ae, curry(f));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1069 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1070
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1071 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1072 * Returns a property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1073 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1074 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1075 * @param aa The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1076 * @param ab The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1077 * @param ac The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1078 * @param ad The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1079 * @param ae The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1080 * @param af The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1081 * @param sa The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1082 * @param sb The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1083 * @param sc The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1084 * @param sd The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1085 * @param se The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1086 * @param sf The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1087 * @param f The function to produce properties with results.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1088 * @return A property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1089 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1090 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1091 public static <A, B, C, D, E, F$> Property property(final Arbitrary<A> aa,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1092 final Arbitrary<B> ab,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1093 final Arbitrary<C> ac,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1094 final Arbitrary<D> ad,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1095 final Arbitrary<E> ae,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1096 final Arbitrary<F$> af,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1097 final Shrink<A> sa,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1098 final Shrink<B> sb,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1099 final Shrink<C> sc,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1100 final Shrink<D> sd,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1101 final Shrink<E> se,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1102 final Shrink<F$> sf,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1103 final F<A, F<B, F<C, F<D, F<E, F<F$, Property>>>>>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1104 return property(aa, ab, ac, ad, ae, sa, sb, sc, sd, se, new F<A, F<B, F<C, F<D, F<E, Property>>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1105 public F<B, F<C, F<D, F<E, Property>>>> f(final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1106 return new F<B, F<C, F<D, F<E, Property>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1107 public F<C, F<D, F<E, Property>>> f(final B b) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1108 return new F<C, F<D, F<E, Property>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1109 public F<D, F<E, Property>> f(final C c) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1110 return new F<D, F<E, Property>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1111 public F<E, Property> f(final D d) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1112 return new F<E, Property>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1113 public Property f(final E e) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1114 return property(af, sf, new F<F$, Property>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1115 public Property f(final F$ f$) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1116 return f.f(a).f(b).f(c).f(d).f(e).f(f$);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1117 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1118 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1119 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1120 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1121 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1122 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1123 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1124 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1125 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1126 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1127 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1128 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1129 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1130
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1131 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1132 * Returns a property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1133 * application of its arguments. No shrinking occurs upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1134 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1135 * @param aa The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1136 * @param ab The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1137 * @param ac The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1138 * @param ad The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1139 * @param ae The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1140 * @param af The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1141 * @param f The function to produce properties with results.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1142 * @return A property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1143 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1144 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1145 public static <A, B, C, D, E, F$> Property property(final Arbitrary<A> aa,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1146 final Arbitrary<B> ab,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1147 final Arbitrary<C> ac,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1148 final Arbitrary<D> ad,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1149 final Arbitrary<E> ae,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1150 final Arbitrary<F$> af,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1151 final F<A, F<B, F<C, F<D, F<E, F<F$, Property>>>>>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1152 return property(aa, ab, ac, ad, ae, new F<A, F<B, F<C, F<D, F<E, Property>>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1153 public F<B, F<C, F<D, F<E, Property>>>> f(final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1154 return new F<B, F<C, F<D, F<E, Property>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1155 public F<C, F<D, F<E, Property>>> f(final B b) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1156 return new F<C, F<D, F<E, Property>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1157 public F<D, F<E, Property>> f(final C c) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1158 return new F<D, F<E, Property>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1159 public F<E, Property> f(final D d) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1160 return new F<E, Property>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1161 public Property f(final E e) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1162 return property(af, new F<F$, Property>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1163 public Property f(final F$ f$) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1164 return f.f(a).f(b).f(c).f(d).f(e).f(f$);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1165 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1166 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1167 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1168 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1169 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1170 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1171 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1172 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1173 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1174 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1175 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1176 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1177 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1178
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1179 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1180 * Returns a property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1181 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1182 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1183 * @param aa The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1184 * @param ab The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1185 * @param ac The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1186 * @param ad The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1187 * @param ae The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1188 * @param af The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1189 * @param sa The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1190 * @param sb The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1191 * @param sc The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1192 * @param sd The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1193 * @param se The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1194 * @param sf The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1195 * @param f The function to produce properties with results.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1196 * @return A property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1197 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1198 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1199 public static <A, B, C, D, E, F$> Property property(final Arbitrary<A> aa,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1200 final Arbitrary<B> ab,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1201 final Arbitrary<C> ac,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1202 final Arbitrary<D> ad,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1203 final Arbitrary<E> ae,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1204 final Arbitrary<F$> af,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1205 final Shrink<A> sa,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1206 final Shrink<B> sb,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1207 final Shrink<C> sc,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1208 final Shrink<D> sd,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1209 final Shrink<E> se,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1210 final Shrink<F$> sf,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1211 final F6<A, B, C, D, E, F$, Property> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1212 return property(aa, ab, ac, ad, ae, af, sa, sb, sc, sd, se, sf, curry(f));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1213 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1214
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1215 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1216 * Returns a property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1217 * application of its arguments. No shrinking occurs upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1218 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1219 * @param aa The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1220 * @param ab The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1221 * @param ac The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1222 * @param ad The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1223 * @param ae The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1224 * @param af The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1225 * @param f The function to produce properties with results.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1226 * @return A property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1227 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1228 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1229 public static <A, B, C, D, E, F$> Property property(final Arbitrary<A> aa,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1230 final Arbitrary<B> ab,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1231 final Arbitrary<C> ac,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1232 final Arbitrary<D> ad,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1233 final Arbitrary<E> ae,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1234 final Arbitrary<F$> af,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1235 final F6<A, B, C, D, E, F$, Property> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1236 return property(aa, ab, ac, ad, ae, af, curry(f));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1237 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1238
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1239 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1240 * Returns a property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1241 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1242 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1243 * @param aa The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1244 * @param ab The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1245 * @param ac The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1246 * @param ad The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1247 * @param ae The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1248 * @param af The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1249 * @param ag The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1250 * @param sa The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1251 * @param sb The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1252 * @param sc The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1253 * @param sd The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1254 * @param se The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1255 * @param sf The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1256 * @param sg The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1257 * @param f The function to produce properties with results.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1258 * @return A property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1259 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1260 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1261 public static <A, B, C, D, E, F$, G> Property property(final Arbitrary<A> aa,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1262 final Arbitrary<B> ab,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1263 final Arbitrary<C> ac,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1264 final Arbitrary<D> ad,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1265 final Arbitrary<E> ae,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1266 final Arbitrary<F$> af,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1267 final Arbitrary<G> ag,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1268 final Shrink<A> sa,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1269 final Shrink<B> sb,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1270 final Shrink<C> sc,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1271 final Shrink<D> sd,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1272 final Shrink<E> se,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1273 final Shrink<F$> sf,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1274 final Shrink<G> sg,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1275 final F<A, F<B, F<C, F<D, F<E, F<F$, F<G, Property>>>>>>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1276 return property(aa, ab, ac, ad, ae, af, sa, sb, sc, sd, se, sf, new F<A, F<B, F<C, F<D, F<E, F<F$, Property>>>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1277 public F<B, F<C, F<D, F<E, F<F$, Property>>>>> f(final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1278 return new F<B, F<C, F<D, F<E, F<F$, Property>>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1279 public F<C, F<D, F<E, F<F$, Property>>>> f(final B b) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1280 return new F<C, F<D, F<E, F<F$, Property>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1281 public F<D, F<E, F<F$, Property>>> f(final C c) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1282 return new F<D, F<E, F<F$, Property>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1283 public F<E, F<F$, Property>> f(final D d) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1284 return new F<E, F<F$, Property>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1285 public F<F$, Property> f(final E e) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1286 return new F<F$, Property>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1287 public Property f(final F$ f$) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1288 return property(ag, sg, new F<G, Property>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1289 public Property f(final G g) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1290 return f.f(a).f(b).f(c).f(d).f(e).f(f$).f(g);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1291 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1292 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1293 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1294 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1295 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1296 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1297 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1298 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1299 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1300 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1301 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1302 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1303 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1304 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1305 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1306
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1307 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1308 * Returns a property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1309 * application of its arguments. No shrinking occurs upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1310 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1311 * @param aa The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1312 * @param ab The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1313 * @param ac The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1314 * @param ad The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1315 * @param ae The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1316 * @param af The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1317 * @param ag The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1318 * @param f The function to produce properties with results.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1319 * @return A property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1320 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1321 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1322 public static <A, B, C, D, E, F$, G> Property property(final Arbitrary<A> aa,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1323 final Arbitrary<B> ab,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1324 final Arbitrary<C> ac,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1325 final Arbitrary<D> ad,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1326 final Arbitrary<E> ae,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1327 final Arbitrary<F$> af,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1328 final Arbitrary<G> ag,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1329 final F<A, F<B, F<C, F<D, F<E, F<F$, F<G, Property>>>>>>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1330 return property(aa, ab, ac, ad, ae, af, new F<A, F<B, F<C, F<D, F<E, F<F$, Property>>>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1331 public F<B, F<C, F<D, F<E, F<F$, Property>>>>> f(final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1332 return new F<B, F<C, F<D, F<E, F<F$, Property>>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1333 public F<C, F<D, F<E, F<F$, Property>>>> f(final B b) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1334 return new F<C, F<D, F<E, F<F$, Property>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1335 public F<D, F<E, F<F$, Property>>> f(final C c) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1336 return new F<D, F<E, F<F$, Property>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1337 public F<E, F<F$, Property>> f(final D d) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1338 return new F<E, F<F$, Property>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1339 public F<F$, Property> f(final E e) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1340 return new F<F$, Property>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1341 public Property f(final F$ f$) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1342 return property(ag, new F<G, Property>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1343 public Property f(final G g) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1344 return f.f(a).f(b).f(c).f(d).f(e).f(f$).f(g);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1345 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1346 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1347 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1348 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1349 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1350 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1351 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1352 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1353 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1354 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1355 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1356 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1357 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1358 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1359 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1360
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1361 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1362 * Returns a property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1363 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1364 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1365 * @param aa The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1366 * @param ab The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1367 * @param ac The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1368 * @param ad The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1369 * @param ae The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1370 * @param af The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1371 * @param ag The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1372 * @param sa The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1373 * @param sb The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1374 * @param sc The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1375 * @param sd The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1376 * @param se The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1377 * @param sf The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1378 * @param sg The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1379 * @param f The function to produce properties with results.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1380 * @return A property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1381 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1382 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1383 public static <A, B, C, D, E, F$, G> Property property(final Arbitrary<A> aa,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1384 final Arbitrary<B> ab,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1385 final Arbitrary<C> ac,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1386 final Arbitrary<D> ad,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1387 final Arbitrary<E> ae,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1388 final Arbitrary<F$> af,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1389 final Arbitrary<G> ag,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1390 final Shrink<A> sa,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1391 final Shrink<B> sb,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1392 final Shrink<C> sc,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1393 final Shrink<D> sd,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1394 final Shrink<E> se,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1395 final Shrink<F$> sf,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1396 final Shrink<G> sg,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1397 final F7<A, B, C, D, E, F$, G, Property> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1398 return property(aa, ab, ac, ad, ae, af, ag, sa, sb, sc, sd, se, sf, sg, curry(f));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1399 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1400
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1401 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1402 * Returns a property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1403 * application of its arguments. No shrinking occurs upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1404 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1405 * @param aa The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1406 * @param ab The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1407 * @param ac The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1408 * @param ad The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1409 * @param ae The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1410 * @param af The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1411 * @param ag The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1412 * @param f The function to produce properties with results.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1413 * @return A property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1414 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1415 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1416 public static <A, B, C, D, E, F$, G> Property property(final Arbitrary<A> aa,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1417 final Arbitrary<B> ab,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1418 final Arbitrary<C> ac,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1419 final Arbitrary<D> ad,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1420 final Arbitrary<E> ae,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1421 final Arbitrary<F$> af,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1422 final Arbitrary<G> ag,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1423 final F7<A, B, C, D, E, F$, G, Property> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1424 return property(aa, ab, ac, ad, ae, af, ag, curry(f));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1425 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1426
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1427 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1428 * Returns a property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1429 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1430 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1431 * @param aa The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1432 * @param ab The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1433 * @param ac The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1434 * @param ad The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1435 * @param ae The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1436 * @param af The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1437 * @param ag The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1438 * @param ah The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1439 * @param sa The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1440 * @param sb The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1441 * @param sc The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1442 * @param sd The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1443 * @param se The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1444 * @param sf The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1445 * @param sg The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1446 * @param sh The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1447 * @param f The function to produce properties with results.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1448 * @return A property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1449 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1450 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1451 public static <A, B, C, D, E, F$, G, H> Property property(final Arbitrary<A> aa,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1452 final Arbitrary<B> ab,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1453 final Arbitrary<C> ac,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1454 final Arbitrary<D> ad,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1455 final Arbitrary<E> ae,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1456 final Arbitrary<F$> af,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1457 final Arbitrary<G> ag,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1458 final Arbitrary<H> ah,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1459 final Shrink<A> sa,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1460 final Shrink<B> sb,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1461 final Shrink<C> sc,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1462 final Shrink<D> sd,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1463 final Shrink<E> se,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1464 final Shrink<F$> sf,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1465 final Shrink<G> sg,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1466 final Shrink<H> sh,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1467 final F<A, F<B, F<C, F<D, F<E, F<F$, F<G, F<H, Property>>>>>>>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1468 return property(aa, ab, ac, ad, ae, af, ag, sa, sb, sc, sd, se, sf, sg, new F<A, F<B, F<C, F<D, F<E, F<F$, F<G, Property>>>>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1469 public F<B, F<C, F<D, F<E, F<F$, F<G, Property>>>>>> f(final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1470 return new F<B, F<C, F<D, F<E, F<F$, F<G, Property>>>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1471 public F<C, F<D, F<E, F<F$, F<G, Property>>>>> f(final B b) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1472 return new F<C, F<D, F<E, F<F$, F<G, Property>>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1473 public F<D, F<E, F<F$, F<G, Property>>>> f(final C c) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1474 return new F<D, F<E, F<F$, F<G, Property>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1475 public F<E, F<F$, F<G, Property>>> f(final D d) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1476 return new F<E, F<F$, F<G, Property>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1477 public F<F$, F<G, Property>> f(final E e) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1478 return new F<F$, F<G, Property>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1479 public F<G, Property> f(final F$ f$) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1480 return new F<G, Property>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1481 public Property f(final G g) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1482 return property(ah, sh, new F<H, Property>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1483 public Property f(final H h) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1484 return f.f(a).f(b).f(c).f(d).f(e).f(f$).f(g).f(h);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1485 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1486 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1487 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1488 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1489 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1490 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1491 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1492 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1493 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1494 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1495 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1496 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1497 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1498 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1499 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1500 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1501 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1502
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1503 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1504 * Returns a property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1505 * application of its arguments. No shrinking occurs upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1506 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1507 * @param aa The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1508 * @param ab The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1509 * @param ac The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1510 * @param ad The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1511 * @param ae The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1512 * @param af The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1513 * @param ag The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1514 * @param ah The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1515 * @param f The function to produce properties with results.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1516 * @return A property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1517 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1518 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1519 public static <A, B, C, D, E, F$, G, H> Property property(final Arbitrary<A> aa,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1520 final Arbitrary<B> ab,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1521 final Arbitrary<C> ac,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1522 final Arbitrary<D> ad,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1523 final Arbitrary<E> ae,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1524 final Arbitrary<F$> af,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1525 final Arbitrary<G> ag,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1526 final Arbitrary<H> ah,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1527 final F<A, F<B, F<C, F<D, F<E, F<F$, F<G, F<H, Property>>>>>>>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1528 return property(aa, ab, ac, ad, ae, af, ag, new F<A, F<B, F<C, F<D, F<E, F<F$, F<G, Property>>>>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1529 public F<B, F<C, F<D, F<E, F<F$, F<G, Property>>>>>> f(final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1530 return new F<B, F<C, F<D, F<E, F<F$, F<G, Property>>>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1531 public F<C, F<D, F<E, F<F$, F<G, Property>>>>> f(final B b) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1532 return new F<C, F<D, F<E, F<F$, F<G, Property>>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1533 public F<D, F<E, F<F$, F<G, Property>>>> f(final C c) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1534 return new F<D, F<E, F<F$, F<G, Property>>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1535 public F<E, F<F$, F<G, Property>>> f(final D d) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1536 return new F<E, F<F$, F<G, Property>>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1537 public F<F$, F<G, Property>> f(final E e) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1538 return new F<F$, F<G, Property>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1539 public F<G, Property> f(final F$ f$) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1540 return new F<G, Property>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1541 public Property f(final G g) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1542 return property(ah, new F<H, Property>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1543 public Property f(final H h) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1544 return f.f(a).f(b).f(c).f(d).f(e).f(f$).f(g).f(h);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1545 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1546 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1547 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1548 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1549 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1550 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1551 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1552 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1553 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1554 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1555 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1556 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1557 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1558 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1559 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1560 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1561 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1562
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1563 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1564 * Returns a property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1565 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1566 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1567 * @param aa The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1568 * @param ab The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1569 * @param ac The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1570 * @param ad The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1571 * @param ae The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1572 * @param af The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1573 * @param ag The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1574 * @param ah The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1575 * @param sa The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1576 * @param sb The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1577 * @param sc The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1578 * @param sd The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1579 * @param se The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1580 * @param sf The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1581 * @param sg The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1582 * @param sh The shrink strategy to use upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1583 * @param f The function to produce properties with results.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1584 * @return A property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1585 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1586 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1587 public static <A, B, C, D, E, F$, G, H> Property property(final Arbitrary<A> aa,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1588 final Arbitrary<B> ab,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1589 final Arbitrary<C> ac,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1590 final Arbitrary<D> ad,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1591 final Arbitrary<E> ae,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1592 final Arbitrary<F$> af,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1593 final Arbitrary<G> ag,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1594 final Arbitrary<H> ah,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1595 final Shrink<A> sa,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1596 final Shrink<B> sb,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1597 final Shrink<C> sc,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1598 final Shrink<D> sd,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1599 final Shrink<E> se,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1600 final Shrink<F$> sf,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1601 final Shrink<G> sg,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1602 final Shrink<H> sh,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1603 final F8<A, B, C, D, E, F$, G, H, Property> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1604 return property(aa, ab, ac, ad, ae, af, ag, ah, sa, sb, sc, sd, se, sf, sg, sh, curry(f));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1605 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1606
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1607 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1608 * Returns a property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1609 * application of its arguments. No shrinking occurs upon falsification.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1610 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1611 * @param aa The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1612 * @param ab The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1613 * @param ac The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1614 * @param ad The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1615 * @param ae The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1616 * @param af The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1617 * @param ag The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1618 * @param ah The arbitrrary to produces values from to produce the property with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1619 * @param f The function to produce properties with results.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1620 * @return A property where its result is derived from universal quantification across the
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1621 * application of its arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1622 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1623 public static <A, B, C, D, E, F$, G, H> Property property(final Arbitrary<A> aa,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1624 final Arbitrary<B> ab,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1625 final Arbitrary<C> ac,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1626 final Arbitrary<D> ad,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1627 final Arbitrary<E> ae,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1628 final Arbitrary<F$> af,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1629 final Arbitrary<G> ag,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1630 final Arbitrary<H> ah,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1631 final F8<A, B, C, D, E, F$, G, H, Property> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1632 return property(aa, ab, ac, ad, ae, af, ag, ah, curry(f));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1633 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1634
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1635 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1636 * Returns a property that has a result of exception, if the evaluation of the given property
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1637 * throws an exception; otherwise, the given property is returned.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1638 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1639 * @param p A property to evaluate to check for an exception.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1640 * @return A property that has a result of exception, if the evaluation of the given property
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1641 * throws an exception; otherwise, the given property is returned.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1642 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1643 public static Property exception(final P1<Property> p) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1644 try {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1645 return p._1();
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1646 } catch (final Throwable t) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1647 return new Property(new F<Integer, F<Rand, Result>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1648 public F<Rand, Result> f(final Integer i) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1649 return new F<Rand, Result>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1650 public Result f(final Rand r) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1651 return Result.exception(List.<Arg<?>>nil(), t);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1652 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1653 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1654 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1655 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1656 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1657 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1658
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1659
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1660
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1661 }