Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] feat: introduce ArbitraryInRange #192

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

sivizius
Copy link
Contributor

This PR introduces the trait ArbitraryInRange, which allows limiting the range of possible values for some types. The intention is to use this trait in an not-yet-implemented [arbitrary(range(min = …, max = …))] field-attribute. A separate trait is necessary, because 1. not all types can be meaningful used as ranges, 2. I like to use #[arbitrary(range(min = 23, max = 42))] on Option<u8>.

However, there are certainly some implementations missing, so still WIP.

@sivizius sivizius marked this pull request as draft August 23, 2024 16:01
@yancyribbens
Copy link

I'd like to see this get added as well. I've tested impl<'a> ArbitraryInRange<'a> and it worked.

@yancyribbens
Copy link

Actually, the trait ArbitraryInRange doesn't appear to be working as intended. For example, I would expect the following test to pass?

#[test]On branch add-test-to-in-range
fn arbitrary_in_range_for_integers() {Changes not staged for commit:
    let x = [1, 2, 3, 4];(use "git add <file>..." to update what will be committed)
    let mut u = Unstructured::new(&x);(use "git restore <file>..." to discard changes in working directory)
    let result_one = i32::arbitrary_in_range(&mut u, &(0..=10));                                                                                                           │        modified:   src/tests.rslet y = [1, 2, 3];Untracked files:
    let mut u = Unstructured::new(&y);(use "git add <file>..." to include in what will be committed)
    let result_two = i32::arbitrary_in_range(&mut u, &(0..=10));                                                                                                           │        src/.tests.rs.swp
                                                                                                                                                                           │        tags
    assert_ne!(result_one, result_two);}

The result is always 0 (the first value in the range) no matter what u is given.

@sivizius sivizius force-pushed the introduce-arbitrary-in-range-trait branch from c28e5fa to d97bd18 Compare September 21, 2024 18:29
@sivizius
Copy link
Contributor Author

The result is always 0 (the first value in the range) no matter what u is given.

In src/foreign/core/num.rs in macro impl_arbitrary_for_integers, I wrote:

let minimum = map_bound(range.start_bound(), |x| *x as Self);
let maximum = map_bound(range.start_bound(), |x| *x as Self);
u.int_in_range((minimum, maximum))

Note the second start_bound and the absence of end_bound m)

@yancyribbens
Copy link

Thanks, that makes sense. Will give it a test when I can.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants