Skip to content

Add edge cases to Gen.choose[BigInt] #993

Description

@DirkToewe

The following property test should clearly fail:

object ScalaCheckCheck extends Properties("Gen.choose[BigInt]"):

  override def overrideParameters( params: Parameters ): Parameters
    = params.withMinSuccessfulTests(1_000_000)

  property("covers all bit lengths") = forAll(
    Gen.choose[BigInt](0, BigInt(1) << 64)
  )( _.bitLength > 32 )

end ScalaCheckCheck

But since Gen.choose[BigInt] samples uniformly, the chances of the test above (correctly) failing are less than 3 in 10_000.
The documentation does not mandate that Gen.choose[BigInt] samples uniformly, so I propose adding the following edge cases and sampling methods to Choose[BigInt]:

  1. {0, ±1, ±2, ± Byte.MaxValue ± 1, ± Short.MaxValue ± 1, ...} (provided they are in range)
  2. Randomly chosen small primes or probable primes
  3. Products of 2 or 3 small/probable primes
  4. Random Powers of 2
  5. "Sparse" BigInt values with uniformly random bitLength and uniformly random number of 1-bits

If these additions are acceptable, I would be willing to work on an according PR.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions