Skip to content

Commit 9e70768

Browse files
authored
Merge pull request #277 from bakeemawaytoys/Issue_276
2 parents 9e5b6ad + 0330824 commit 9e70768

File tree

1 file changed

+23
-24
lines changed

1 file changed

+23
-24
lines changed

quickcheck/src/main/java/fj/test/Shrink.java

Lines changed: 23 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@
3939
import static fj.data.Stream.nil;
4040

4141
import static java.lang.System.arraycopy;
42+
import static java.math.BigInteger.ZERO;
43+
4244
import java.math.BigDecimal;
4345
import java.math.BigInteger;
4446
import java.sql.Time;
@@ -354,7 +356,7 @@ public static <A> Shrink<ArrayList<A>> shrinkArrayList(final Shrink<A> sa) {
354356
* A shrink strategy for enum maps.
355357
*
356358
* @param sk The shrink strategy for keys.
357-
* @param sv The shrink stratgey for values.
359+
* @param sv The shrink strategy for values.
358360
* @return A shrink strategy for enum maps.
359361
*/
360362
public static <K extends Enum<K>, V> Shrink<EnumMap<K, V>> shrinkEnumMap(final Shrink<K> sk, final Shrink<V> sv) {
@@ -385,7 +387,7 @@ public static <A extends Enum<A>> Shrink<EnumSet<A>> shrinkEnumSet(final Shrink<
385387
* A shrink strategy for hash maps.
386388
*
387389
* @param sk The shrink strategy for keys.
388-
* @param sv The shrink stratgey for values.
390+
* @param sv The shrink strategy for values.
389391
* @return A shrink strategy for hash maps.
390392
*/
391393
public static <K, V> Shrink<HashMap<K, V>> shrinkHashMap(final Shrink<K> sk, final Shrink<V> sv) {
@@ -406,7 +408,7 @@ public static <A> Shrink<HashSet<A>> shrinkHashSet(final Shrink<A> sa) {
406408
* A shrink strategy for hash tables.
407409
*
408410
* @param sk The shrink strategy for keys.
409-
* @param sv The shrink stratgey for values.
411+
* @param sv The shrink strategy for values.
410412
* @return A shrink strategy for hash tables.
411413
*/
412414
@SuppressWarnings("UseOfObsoleteCollectionType")
@@ -430,7 +432,7 @@ public static <K, V> Shrink<Hashtable<K, V>> shrinkHashtable(final Shrink<K> sk,
430432
* A shrink strategy for identity hash maps.
431433
*
432434
* @param sk The shrink strategy for keys.
433-
* @param sv The shrink stratgey for values.
435+
* @param sv The shrink strategy for values.
434436
* @return A shrink strategy for identity hash maps.
435437
*/
436438
public static <K, V> Shrink<IdentityHashMap<K, V>> shrinkIdentityHashMap(final Shrink<K> sk, final Shrink<V> sv) {
@@ -441,7 +443,7 @@ public static <K, V> Shrink<IdentityHashMap<K, V>> shrinkIdentityHashMap(final S
441443
* A shrink strategy for linked hash maps.
442444
*
443445
* @param sk The shrink strategy for keys.
444-
* @param sv The shrink stratgey for values.
446+
* @param sv The shrink strategy for values.
445447
* @return A shrink strategy for linked hash maps.
446448
*/
447449
public static <K, V> Shrink<LinkedHashMap<K, V>> shrinkLinkedHashMap(final Shrink<K> sk, final Shrink<V> sv) {
@@ -514,7 +516,7 @@ public static <A> Shrink<Stack<A>> shrinkStack(final Shrink<A> sa) {
514516
* A shrink strategy for tree maps.
515517
*
516518
* @param sk The shrink strategy for keys.
517-
* @param sv The shrink stratgey for values.
519+
* @param sv The shrink strategy for values.
518520
* @return A shrink strategy for tree maps.
519521
*/
520522
public static <K, V> Shrink<TreeMap<K, V>> shrinkTreeMap(final Shrink<K> sk, final Shrink<V> sv) {
@@ -545,7 +547,7 @@ public static <A> Shrink<Vector<A>> shrinkVector(final Shrink<A> sa) {
545547
* A shrink strategy for weak hash maps.
546548
*
547549
* @param sk The shrink strategy for keys.
548-
* @param sv The shrink stratgey for values.
550+
* @param sv The shrink strategy for values.
549551
* @return A shrink strategy for weak hash maps.
550552
*/
551553
public static <K, V> Shrink<WeakHashMap<K, V>> shrinkWeakHashMap(final Shrink<K> sk, final Shrink<V> sv) {
@@ -570,7 +572,7 @@ public static <A> Shrink<ArrayBlockingQueue<A>> shrinkArrayBlockingQueue(final S
570572
* A shrink strategy for concurrent hash maps.
571573
*
572574
* @param sk The shrink strategy for keys.
573-
* @param sv The shrink stratgey for values.
575+
* @param sv The shrink strategy for values.
574576
* @return A shrink strategy for concurrent hash maps.
575577
*/
576578
public static <K, V> Shrink<ConcurrentHashMap<K, V>> shrinkConcurrentHashMap(final Shrink<K> sk, final Shrink<V> sv) {
@@ -676,23 +678,20 @@ public static <A> Shrink<SynchronousQueue<A>> shrinkSynchronousQueue(final Shrin
676678
/**
677679
* A shrink strategy for big integers.
678680
*/
679-
public static final Shrink<BigInteger> shrinkBigInteger =
680-
shrinkP2(shrinkByte, shrinkArray(shrinkByte)).map(bs -> {
681-
final byte[] x = new byte[bs._2().length() + 1];
682-
683-
for (int i = 0; i < bs._2().array().length; i++) {
684-
x[i] = bs._2().get(i);
685-
}
686-
687-
x[bs._2().length()] = bs._1();
681+
public static final Shrink<BigInteger> shrinkBigInteger = shrink(i -> {
682+
final Equal<BigInteger> eq = Equal.bigintEqual;
683+
final BigInteger two = BigInteger.valueOf(2L);
684+
if (eq.eq(i, ZERO)) {
685+
return nil();
686+
} else {
687+
final Stream<BigInteger> is = cons(ZERO,
688+
() -> iterate(x -> x.divide(two), i)
689+
.takeWhile(x2 -> eq.notEq(x2, ZERO))
690+
.map(i::subtract));
688691

689-
return new BigInteger(x);
690-
}, i -> {
691-
final byte[] b = i.toByteArray();
692-
final Byte[] x = new Byte[b.length - 1];
693-
arraycopy(b, 0, x, 0, b.length - 1);
694-
return p(b[0], array(x));
695-
});
692+
return Ord.bigintOrd.isLessThan(i, ZERO) ? cons(i.negate(), () -> is) : is;
693+
}
694+
});
696695

697696
/**
698697
* A shrink strategy for big decimals.

0 commit comments

Comments
 (0)