## Unreleased ## 1.3.1 ## Other Notes - `bit-set` updated from 0.5.0 to 0.5.2 to ensure minimum compatible version with bit-vec 0.6 ## 1.3.0 ### Breaking Changes - The minimum supported Rust version has been increased to 1.64.0. ### New Features - Adds Arbitrary impl for PathBuf - Permit use of (?-u) in byte-regex strategies, allowing non-utf-8 bytes to be generated ### Book - Various small fixes -- typos, formatting - Removal of custom theme - Add book page for Tips and Best Practices ### Other Notes - `regex-syntax` version 0.7 is now used. - Print a seed to stderr for a failed test even when a regressions file is already present. - Fixed a performance issue with `VarBitSet::saturated` that can slow down `VecStrategy` - Remove use of rust feature `core_intrinsics` - Remove no longer needed "break-dead-code" feature - Disable `clippy::arc_with_non_send_sync` - Remove dependency on `byteorder` ## 1.2.0 ### Breaking Changes - `PROPTEST_` environment variables now take precedence over tests' non-default configuration. ### Bug Fixes - Don't implement Arbitrary for NonZeroU128 and NonZeroI128 on wasm targets where u128 and i128 Arbitrary impls don't exist ### New Features ### Other Notes - Minimal failing input is now printed using debug pretty-printing - Made public `VarBitSet`, `SizeRange` read-only methods and num sampling functions in preparation for release of a `proptest-state-machine` crate. - Removed dependency on `quick_error` - Start publishing MSRV ## 1.1.0 ### Bug Fixes - Sampling from large ranges of floats such as `(0f32)..` no longer panics with newer versions of the `rand` crate - [dependencies.x86] was bumped to latest current version. x86 crate does was on a very old version 0.33.0 which used a removed macro from rust. - The calculation for the arbitrary impl of Layout was using a max_size that was too large and overflowing Layout. This has been fixed. - Test for arbitrary AllocError was referring to AllocErr which does not exist, this was fixed. - NoneError has been removed from rust so it was subsequently removed from proptest. It was blocking compilation. evidence: https://github.com/rust-lang/rust/issues/85614 - `try_reserve` is stable so removed from unstable features - `try_trait` has been changed to `try_trait_v2` so that was adjusted in `Cargo.toml`. - `prop_assert_ne!` now uses fully qualified `prop_assert_eq!` - Persisted tests are not counted against the number of cases to run ### New Features - Add `Arbitrary` impls for arrays of all sizes using const generics - Add `Arbitrary` impls for `core::num::NonZero*` - Adds ability to disable failure persistence via env var `PROPTEST_DISABLE_FAILURE_PERSISTENCE` ### Other Notes - `proptest` no longer depends on the `quick-error` crate. ## 1.0.0 ### Breaking Changes - The minimum supported Rust version has been increased to 1.50.0. - The version of the `rand` crate has been increased to 0.8. - Due to changes in the `getrandom` crate, if you wish to use proptest on the `wasm32-unknown-unknown` target, you must manually add a dependency on that crate and enable a feature that will allow it to work. Refer to the `getrandom` crate documentation for more information. ### Bug Fixes - `prop_shuffle()` can now produce all permutations. ### New Features - Tuple strategies up to 12 elements are now supported, for parity with the blanket implementations that `std` provides. ## 0.10.1 ### New Features - Added `RngAlgorithm::Recorder` and supporting APIs which allow capturing random data generated as part of generating a value or running a test. ## 0.10.0 ### Breaking Changes - The version of the `rand` crate has been increased to 0.7. - The `proptest!` macro no longer accepts function bodies which implicitly return a value (which would then be discarded). - The `TupleUnion` implementation in `proptest` 0.9 has been removed and replaced with `LazyTupleUnion`. `prop_oneof!` is unaffected and continues to be the recommended way to build a union of strategies. ### New Features - Enabling the `hardware-rng` optional dependency (disabled by default) allows obtaining non-deterministic random seeds even in `no_std` environments provided the architecture is x86 or AMD64. - Added missing `?Sized` bound to `B` on the implementation of `Arbitrary` for `std::borrow::Cow<'_, B>`. ### Bug Fixes - `prop_assert!` and `prop_assume!` should now be usable in `no_std` environments. ### Other Notes - `rusty_fork` has been bumped to 0.3.0, which adds support for a number of [new test flags](https://github.com/AltSysrq/rusty-fork/blob/master/CHANGELOG.md#improvements) when running forked tests. - The `PassThrough` RNG algorithm now returns 0 instead of panicking when it runs out of entropy. ## 0.9.6 ### Bug Fixes - Fixed [#186](https://github.com/proptest-rs/proptest/issues/186), a Rust future-compatibility issue. ## 0.9.5 ### Bug Fixes - Fixed a Rust future-compatibility issue (https://github.com/rust-lang/rust/pull/65819). ### New Additions ## 0.9.4 ### Bug Fixes - The `unstable` feature one again works against the latest nightly. ### Performance Improvements - Unions and the `prop_oneof!` combinator now generate value trees lazily. In previous versions of `proptest`, if a value tree for a union variant was generated, so would value trees for earlier variants -- as a result, union value tree generation was linear in the number of variants. In `proptest` 0.9.4 and above, value trees are only generated for union variants that are picked. Union value tree generation is now independent of the number of variants. ### Deprecations - `TupleUnion` has been deprecated, and its implementation will be replaced by `LazyTupleUnion`'s in 0.10.0. ### Other Notes - The return type of `prop_oneof!` has changed from `TupleUnion` to `LazyTupleUnion`. `prop_oneof!`'s return type is documented to not be stable, and that continues to be the case. - Shrinking is now limited to four times as many iterations as configured number of test cases by default. - `prop_assert_eq!` and `prop_assert_ne!` produce output more similar to the `assert_eq!` and `assert_ne!` macros. This should also make it easier to visually parse out the source location in the resulting messages. ## 0.9.3 This is a minor release to correct some packaging errors. The license files are now included in the files published to crates.io, and some unneeded files are now excluded. ## 0.9.2 ### New Additions - Closures generated by `prop_compose!` are now `move`. This is not expected to cause any breakage since there is no way to successfully use a borrowing closure with that macro. - There is now **highly experimental** support for building on Web Assembly. Refer to [the Proptest book](https://altsysrq.github.io/proptest-book/proptest/wasm.html) for build instructions. ### Other Notes - Using proptest with the default `std` feature enabled, the `spin` crate is no longer brought in as a dependency. - Using proptest with the `std` feature disabled, neither `spin` nor `lazy_static` are brought in as dependencies. ## 0.9.1 ### New RNG Algorithm Starting in this version, the default RNG algorithm has been changed from XorShift to ChaCha since it produces higher-quality randomness. This may make test case generation a bit slower but it avoids certain pathological cases that the old generator had. The old algorithm is still supported, and is used automatically when reading old failure persistence files. Note that this change also affects the internal representation of RNG seeds, which affects the `FailurePersistence` trait which previously only supported the seed representation for XorShift. This release maintains source compatibility with 0.9.0 by providing defaults for the new methods which delegate (when possible) to the old ones, but be aware that custom failure persistence implementations using the old API will not function when using an RNG other than XorShift. To keep using the old algorithm, you can set the environment variable `PROPTEST_RNG_ALGORITHM` to `xs` or set `Config.rng_algorithm` to `RngAlgorithm::XorShift` in code. Besides ChaCha, this version also adds a `PassThrough` RNG "algorithm" which makes it possible to use an external source of entropy with Proptest. ### New Additions - `TestRng` instances can be created with the `from_seed` function. - `TestRunner` instances can be created with user-provided `TestRng`s. - `TestRunner` now has a `deterministic()` constructor which uses the same RNG every time, to facilitate doing statistical tests on strategy outputs. - There is now a work-around for a [compiler bug](https://github.com/rust-lang/rust/issues/52478) which prevents building with `-C link-dead-code`. Please see this issue for details: https://github.com/proptest-rs/proptest/issues/124 ### Deprecations - The `load_persisted_failures` and `save_persisted_failure` methods on the `FailurePersistence` trait have been deprecated and will be removed in 0.10.0. ## 0.9.0 ### Breaking Changes - The minimum Rust version has been increased to 1.32.0. - The version of the `rand` crate has been increased to 0.6. - The `ValueFor` type alias (deprecated in 0.8.0) has been removed. Replace `ValueFor` with `S::Value` or `::Value` as necessary. - `From` implementations converting a `SizeRange` back to various std types have been removed since they were of limited utility and had unclear or incorrect conversion properties. - Many optional elements (such as trailing commas or function visibility modifiers) in certain macros could be specified more than once. The macros now accept at most one occurrence. - Visibility modifiers inside `prop_compose` must no longer be enclosed in brackets. Unless other modifiers (e.g., `unsafe`) are also in use, simply removing the brackets is sufficient. ### New Additions - Rust 2018 style macro imports are now supported. - In a Rust 2018 crate, all the macros can be brought into scope with `import proptest::prelude::*;`. - The proptest macros now accept trailing commas in more locations. - Visibility modifiers can now be passed to `prop_compose!` without enclosing them in brackets. Unfortunately, the old way could not continue to be supported due to the way the `vis` macro matcher works. ### Nightly-only breakage - The `nightly` feature, which was formerly required for using proptest with `#[no_std]`, has been removed. References to the feature can simply be deleted. - When using the `unstable` feature and setting `default-features = false`, the `AtomicI64` and `AtomicU64` types are not supported unless the `atomic64bit` feature is enabled. This supports `no_std` usage on platforms which do not support atomic 64-bit operations. ### Other Notes - Generated strings are now much more likely to contain right-to-left override characters. - Most of the crate-level documentation has been relocated to the [Proptest Book](https://altsysrq.github.io/proptest-book/proptest/index.html). ## 0.8.7 ### New Additions - Add `max_shrink_iters` and `max_shrink_time` options to test configuration to allow capping the resources expended on shrinking test cases. - Add `verbose` option to make proptest give details about what is happening as the test executes. - When a failure is saved to the persistence file, the message now also includes the seed that was saved so that it can manually be added to the appropriate file should the test have run somewhere where the updated file is not accessible (for example, on a CI system). ### Bug Fixes - `any::()` now generates random values centred on the UNIX epoch rather than always producing the current time. ### Other Notes - When using forking, proptest will now detect conditions which cause the child process to crash without running any tests, and will fail quickly instead of respawning child processes. ## 0.8.6 ### New Additions - `Vec where S: Strategy` is now itself a `Strategy` for producing fixed-size `Vec`s whose values are derived from the respective strategies. - It is now possible to configure the test runner to cache test results to avoid spending time running identical tests. See `Config.result_cache`. - Add `sample::Index`, a type for generating indices into runtime-sized slices and vectors. - Add `sample::Selector`, a type for picking items out of dynamically-created iterables. ### Bug Fixes - Fix panic when using `sample::subsequence` with an empty vector. - Fix panic when using `sample::subsequence` with a size equal to the size of the input vector. - Fix sampled bitset strategies on integers not allowing to generate exactly the same number of bits as the integer is wide. ### Other Notes - Passing empty size ranges to functions requiring a non-empty size range now panic with an explicit message immediately rather than causing an arithmetic error when generating input values. - There were a few cases where proptest would accept a `SizeRange` with an inclusive maximum value of `usize::MAX`. Size ranges are now always clamped to `usize::MAX - 1`. ## 0.8.5 ### Bug Fixes - Fix build when nightly features are enabled. ## 0.8.4 ### Bug Fixes - Nightly and no_std support work against latest nightly once again. ### New Additions - Added `bits::bool_vec` for generating `Vec` as a bit set. ### Nightly-only breakage - `impl Arbitrary for CollectionAllocErr` is temporarily removed pending it being available outside the `alloc` crate again. - `bits::bitset` is no longer available without the `bit-set` feature (enabled by default), which is [not compatible with `#[no_std]` environments](https://github.com/contain-rs/bit-vec/pull/51). ## 0.8.3 ### Bug Fixes - Fix that regex-based string generation could transpose the order of a literal and a non-literal component. ## 0.8.2 ### New Additions - Macros which previously accepted `pattern in strategy` syntax to specify arguments now also accept `pattern: type` syntax as shorthand for `pattern in any::()`. - Closure-style `proptest!` invocation no longer requires the body to use block syntax. - Closure-style `proptest!` invocation now accepts custom configurations. ## 0.8.1 ### New Additions - `proptest!` now has form that accepts a closure. See the documentation for the macro for more details. ### Bug Fixes - Fix spurious warning about corrupt regression files. The files were not corrupt but the parser was failing to handle the blank line at the end. - The `multiplex_alloc!` and `multiplex_core!` macros which were unintentionally exported in 0.8.0 are no longer exported. This is not considered a breaking change since they were not supposed to be accessible, and in any case would not have expanded into valid code in most other crates. ## 0.8.0 ### New Additions - A combinator `.prop_filter_map` has been added to `Strategy`. It is similar to `.filter_map` for `Iterator` in that it is the combination of `.prop_filter` and `.prop_map`. - `i128` and `u128` are now supported without any feature flags and on stable. - More implementations of `Arbitrary` are supported for `alloc` + `no_std` users. - `size_range` now accepts inclusive ranges of form `low..=high` and `..=high`. Thus, you can construct a `vec` strategy as: `vec(elt_strategy, low..=high)` and `vec(elt_strategy, ..=high)`. This also applies to other functions accepting `Into`. - `..= high` is now a valid strategy. Please note that `..= 1` will naturally include numbers lower than `0` for sized types. - `low..=high` is also a valid strategy. - `Arbitrary` is implemented for `RangeInclusive`, `RangeToInclusive`, and `DecodeUtf16` on stable. - Bitset strategies and `subsequence` now accept all range syntaxes. ### Bug Fixes - Fix a race condition where a test failing due to running ever so slightly over the set timeout could cause the test harness to converge to the incorrect failing value, a non-failing value, or panic. ### Deprecations - The type alias `ValueFor` is now deprecated and will be removed in version 0.9. You should just use `S::Value` instead. ### Breaking changes - A minimum version of 1.27 of Rust is now required. - `regex-syntax` version 0.6 is now used. - `rand` version 0.5 is now used. - As a consequence, the `FailurePersistence` trait will now use `[u8; 16]` seeds instead of `[u32; 4]`. However, the stored failure persistence files using the default `FileFailurePersistence` will still use `[u32; 4]` so your old failure persistence files should still work. - The RNG used by proptest has been changed to a PRNG `TestRng` which proptest exposes. This is currently a simple new-type wrapper around `XorShiftRng`. In the future, this will give us more freedom to make changes without breakage. - The feature flag `i128_support` has been removed. The features it added are now always supported. - The associated type `Value` of `Strategy` has been renamed to `Tree`. A new associated type `Value` has been added to `Strategy` which always refers to the same type as `::Value` for some strategy `S`. This change allows you to write `-> impl Strategy` for functions returning a `Strategy` generating `T`s. This is more ergonomic to use than `-> impl Strategy>`. - The method `new_value` in `Strategy` has been renamed to `new_tree` to mirror the renaming of `Value` to `Tree`. - As a consequence change, the associated type `ValueTree` has been removed from `Arbitrary`. - The methods `run` and `run_one` on `TestRunner` now takes a function-under-test that accepts the generated type by value instead of by reference instead. This means that you don't need to write `ref value in my_strategy` and can write `value in my_strategy` instead even if `typeof(value)` doesn't implement `Copy`. This is also a step in the direction of allowing strategies to generate references when generic associated types (GATs) land. However, `ref value in my_strategy` will still be accepted, so not a lot of breakage should come of this if you've used `proptest! { .. }`. - `prop_compose!` no longer applies `.boxed()` to the strategy produced. Therefore, `-> BoxedStrategy` is no longer the correct type. The new return type is `-> impl Strategy`. If you want the old behaviour, you can use `.boxed()` yourself. - `Arbitrary` for `SizeRange` changed its associated type to use `RangeInclusive`. Same applies for `CString`. - Many APIs now use `impl Trait` in argument position, which could affect code using turbofishes to specify types explicitly. - `char` APIs which formerly represented a range as `(start, end)` now require `start..=end`. ### Nightly-only breakage - As `std::io::{Chars, CharsError}` have been deprecated on nightly, their `Arbitrary` implementations have been removed. ## 0.7.2 ### Bug Fixes - Fix that `bool` would not shrink correctly, leading to hangs when tests taking `bool` parameters would fail in certain circumstances. ## 0.7.1 ### New Additions - It is now possible to run test cases in sub-processes. This allows using proptest to test functions which may cause the test process to terminate abruptly, such as by calling `abort()` or even suffering a segmentation fault. This requires the "fork" feature, enabled by default. - Added support for setting a timeout which applies on a per-test-case (i.e., single input rather than the whole test) basis. This allows using proptest to find inputs which cause code to get stuck in infinite loops or exhibit other pathological performance behaviour. This requires the "timeout" feature (and transitively, the "fork" feature), enabled by default. See also [the documentation](README.md#forking-and-timeouts) for these features. ### Bug Fixes - Fix that failure persistence file would be written to the incorrect location in projects using workspaces. See [#24](https://github.com/proptest-rs/proptest/issues/24) for more details and instructions on how to migrate any persistence files that had been written to the wrong location. - Fix a case where `any::()` or `any::()` could panic on Windows. ### Nightly-only breakage - Support for the `hashmap_core` crate is removed pending https://github.com/Amanieu/hashmap_core/issues/3. ## 0.7.0 ### Potential Breaking Changes - The persistence system has been refactored to allow for non-file-system based persistence. `FailurePersistence` is now a trait, and the prior file-based enum which fulfilled that purpose is now called `FileFailurePersistence` and implements the generic trait. The default behavior has not changed. - Reflecting the change to persistence, `Config.failure_persistence` is now of type `Option>`. - The `source_file` used as an optional reference point to the location of the calling test is now tracked on the `Config` struct rather than the `TestRunner`. ### New Additions - Experimental support on nightly for working in `#![no_std]` environments has been added. To use it, one must disable the default-features for proptest and use the new "alloc" and "nightly" features. Currently access to a heap allocator is still required. ## 0.6.0 ### Potential Breaking Changes - There is a small change of breakage if you've relied on `Recursive` using an `Arc>` as `Recursive` now internally uses `BoxedStrategy` instead as well as expecting a `Fn(BoxedStrategy) -> R` instead of `Fn(Arc>) -> R`. In addition, the type of recursive strategies has changed from `Recursive, F>` to just `Recursive`. ### Minor changes - Reduced indirections and heap allocations inside `Recursive` somewhat. - `BoxedStrategy` and `SBoxedStrategy` now use `Arc` internally instead of using `Box`. While this has marginal overhead, it also reduces the overhead in `Recursive`. The upside to this change is also that you can very cheaply clone strategies. - `Filter` is marginally faster. ### Bug Fixes - Removed `impl Arbitrary for LocalKeyState` since `LocalKeyState` no longer exists in the nightly compiler. - Unstable features compile on latest nightly again. ## 0.5.1 ### New Additions - `proptest::strategy::Union` and `proptest::strategy::TupleUnion` now work with weighted strategies even if the sum of the weights overflows a `u32`. - Added `SIGNALING_NAN` strategy to generate signalling NaNs if supported by the platform. Note that this is _not_ included in `ANY`. ### Bug Fixes - Fixed values produced via `prop_recursive()` not shrinking from the recursive to the non-recursive case. - Fix that `QUIET_NAN` would generate signalling NaNs on most platforms on Rust 1.24.0 and later. ## 0.5.0 ### Potential Breaking Changes - There is a small chance of breakage if you've relied on the constraints put on type inference by the closure in `leaf.prop_recursive(..)` having a fixed output type. The output type is now any strategy that generates the same type as `leaf`. This change is intended to make working with recursive types a bit easier as you no longer have to use `.boxed()` inside the closure you pass to `.prop_recursive(..)`. - There is a small chance of breakage wrt. type inference due to the introduction of `SizeRange`. - There is a small chance of breakage wrt. type inference due to the introduction of `Probability`. - `BoxedStrategy` and `SBoxedStrategy` are now newtypes instead of being type aliases. You will only experience breaking changes if you've directly used `.boxed()` and not `(S)BoxedStrategy` but rather `Box>>>`. The probability of breakage is very small, but still possible. The benefit of this change is that calling `.boxed()` or `.sboxed()` twice only boxes once. This can happen in situations where you have functions `Strategy -> BoxedStrategy` or with code generation. - `proptest::char::ANY` has been removed. Any remaining uses must be replaced by `proptest::char::any()`. - `proptest::strategy::Singleton` has been removed. Any remaining uses must be replaced by `proptest::strategy::Just`. ### New Additions - Proptest now has an `Arbitrary` trait in `proptest::arbitrary` and re-exported in the `proptest::prelude`. `Arbitrary` has also been `impl`emented for most of the standard library. The trait provides a mechanism to define a canonical `Strategy` for a given type just like `Arbitrary` in Haskell's QuickCheck. Deriving for this trait will also be provided soon in the crate `proptest_derive`. To use the canonical strategy for a certain type `T`, you can simply use `any::()`. This is the major new addition of this release. - The `any_with`, `arbitrary`, `arbitrary_with` free functions in the module `proptest::arbitrary`. - The `ArbitraryF1` and `ArbitraryF2` traits in `proptest::arbitrary::functor`. These are "higher order" `Arbitrary` traits that correspond to the `Arbitrary1` and `Arbitrary2` type classes in Haskell's QuickCheck. They are mainly provided to support a common set of container-like types in custom deriving self-recursive types in `proptest_derive`. More on this later releases. - The strategies in `proptest::option` and `proptest::result` now accept a type `Probability` which is a wrapper around `f64`. Conversions from types such as `f64` are provided to make the interface ergonomic to use. Users may also use the `proptest::option::prob` function to explicitly construct the type. - The strategies in `proptest::collections` now accept a type `SizeRange` which is a wrapper around `Range`. Conversions from types such as `usize` and `Range` are provided to make the interface ergonomic to use. Users may also use the `proptest::collections::size_bounds` function to explicitly construct the type. - A `.prop_map_into()` operation on all strategies that map using `Into`. This is a clearer and cheaper operation than using `.prop_map(OutputType::from)`. - A nonshrinking `LazyJust` strategy that can be used instead of `Just` when you have non-`Clone` types. - Anything that can be coerced to `fn() -> T` where `T: Debug` is a `Strategy` where `ValueFor T> == T`. This is intended to make it easier to reuse proptest for unit tests with manual input space partition where `fn() -> T` provides fixtures. ### Minor changes - Relaxed the constraints of `btree_map` removing `'static`. - Reduced the heap allocation inside `Recursive` somewhat. ## 0.4.2 ### Bug Fixes - The `unstable` feature now works again. ## 0.4.1 ### New Additions - The `proptest::num::f32` and `proptest::num::f64` modules now have additional constants (e.g., `POSITIVE`, `SUBNORMAL`, `INFINITE`) which can be used to generate subsets of the floating-point domain by class and sign. ### Bug Fixes - `proptest::num::f32::ANY` and `proptest::num::f64::ANY` now actually produce arbitrary values. Previously, they had the same effect as `0.0..1.0`. While this fix is a very substantial change in behaviour, it was not considered a breaking change since (a) the new behaviour is consistent with the documentation and expectations, (b) it's quite unlikely anyone was depending on the old behaviour since anyone who wanted that range would have written it out, and (c) Proptest isn't generally a transitive dependency so the chance of this update happening "by surprise" is low. ## 0.4.0 ### Deprecations and Potential Breaking Changes - `proptest::char::ANY` replaced with `proptest::char::any()`. `proptest::char::ANY` is present but deprecated, and will be removed in proptest 0.5.0. - Instead of returning `-> Result`, strategies are expected to return `-> Result` instead. `Reason` reduces the amount of heap allocations, especially for `.prop_filter(..)` where you may now also pass in `&'static str`. You will only experience breaks if you've written your own strategy types or if you've used `TestCaseError::Reject` or `TestCaseError::Fail` explicitly. - Update of externally-visible crate `rand` to `0.4.2`. ### New Additions - Added `proptest::test_runner::Reason` which allows you to avoid heap allocation in some places and may be used to make the API richer in the future without incurring more breaking changes. - Added a type alias `proptest::strategy::NewTree` where `S: Strategy` defined as: `type NewTree = Result<::Value, Rejection>`. ## 0.3.4 ### Bug Fixes - Cases where `file!()` returns a relative path, such as on Windows, are now handled more reasonably. See [#24](https://github.com/proptest-rs/proptest/issues/24) for more details and instructions on how to migrate any persistence files that had been written to the wrong location. ## 0.3.3 Boxing Day Special ### New Additions - Added support for `i128` and `u128`. Since this is an unstable feature in Rust, this is hidden behind the feature `unstable` which you have to explicitly opt into in your `Cargo.toml` file. - Failing case persistence. By default, when a test fails, Proptest will now save the seed for the failing test to a file, and later runs will test the persisted failing cases before generating new ones. - Added `UniformArrayStrategy` and helper functions to simplify generating homogeneous arrays with non-`Copy` inner strategies. - Trait `rand::Rng` and struct `rand::XorShiftRng` are now included in `proptest::prelude`. ### Bug Fixes - Fix a case where certain combinations of strategies, like two `prop_shuffle()`s in close proximity, could result in low-quality randomness. ## 0.3.2 ### New Additions - Added `SampledBitSetStrategy` to generate bit sets based on size distribution. - Added `Strategy::sboxed()` and `SBoxedStrategy` to make `Send + Sync` boxed strategies. - `RegexGeneratorStrategy` is now `Send` and `Sync`. - Added a type alias `ValueFor` where `S: Strategy`. This is a shorter way to refer to: `<::Value as ValueTree>::Value`. - Added a type alias `type W = (u32, T)` for a weighted strategy `T` in the context of union strategies. - `TestRunner` now implements `Default`. - Added `Config::with_cases(number_of_cases: u32) -> Config` for simpler construction of a `Config` that only differs by the number of test cases. - All default fields of `Config` can now be overridden by setting environment variables. See the docs of that struct for more details. - Bumped dependency `rand = "0.3.18"`. - Added `proptest::sample::subsequence` which returns a strategy generating subsequences, of the source `Vec`, with a size within the given `Range`. - Added `proptest::sample::select` which returns a strategy selecting exactly one value from another collection. - Added `prop_perturb` strategy combinator. - Added `strategy::check_strategy_sanity()` function to do sanity checks on the shrinking implementation of a strategy. - Added `prop_shuffle` strategy combinator. - Added `strategy::Fuse` adaptor. ### Bug Fixes - Fix bug where `Vec`, array and tuple shrinking could corrupt the state of their inner values, for example leading to out-of-range integers. - Fix bug where `Flatten` (a.k.a. the `prop_flat_map` combinator) could fail to converge to a failing test case during shrinking. - Fix `TupleUnion` sometimes panicking during shrinking if there were more than two choices. ## 0.3.1 ### New Additions - Added `CharStrategy::new_borrowed`. ## 0.3.0 ### New Additions - `Union` now supports weighting via `Union::new_weighted`. Corresponding syntax to specify weights is also available in `prop_oneof!`. - Added `TupleUnion`, which works like `Union` but permits doing static dispatch even with heterogeneous delegate strategies. - `prop_oneof!` is smarter about how it combines the input strategies. - Added `option` module to generate weighted or unweighted `Option` types. - Added `result` module to generate weighted or unweighted `Result` types. - All `bits` submodules now have a `masked` function to create a strategy for generating subsets of an arbitrary bitmask. ### Potential Breaking Changes - `Union::new` now has a generic argument type which could impact type inference. - The concrete types produced by `prop_oneof!` have changed. - API functions which used to return `BoxedStrategy` now return a specific type. - `BitSetStrategy` is no longer `Copy` for non-`Copy` types `T` nor `Debug` for non-`Debug` types `T`. - `BitSetLike::max` has been renamed to `BitSetLike::len`. ## 0.2.1 ### New Additions - Added `prop_assert!` macro family to assert without panicking, for quieter test failure modes. - New `prelude` module for easier importing of important things. - Renamed `Singleton` to `Just`. (The old name is still available.) - Failure messages produced by `proptest!` are now much more readable. - Added in-depth tutorial. ## 0.2.0 ### Breaking Changes - `Strategy` now requires `std::fmt::Debug`. ### New Additions - `Strategy` now has a family of `prop_flat_map()` combinators for producing dynamic and higher-order strategies. - `Strategy` has a `prop_recursive()` combinator which allows generating recursive structures. - Added `proptest::bool::weighted()` to pull booleans from a weighted distribution. - New `prop_oneof!` macro makes it easier to select from one of several strategies. - New `prop_compose!` macro to simplify writing most types of custom strategies. ## 0.1.1 ### New Additions Add `strategy::NoShrink`, `Strategy::no_shrink()`.