Skip to content

Commit

Permalink
Implement quickcheck::Arbitrary for Weekday
Browse files Browse the repository at this point in the history
  • Loading branch information
emlun committed Oct 25, 2020
1 parent bc43ce2 commit adefde0
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 0 deletions.
26 changes: 26 additions & 0 deletions src/quickcheck.rs
Expand Up @@ -6,6 +6,7 @@ use crate::{
time_mod::Time,
utc_offset::UtcOffset,
util::days_in_year,
weekday::Weekday,
};
use quickcheck::{Arbitrary, Gen};
use rand::Rng;
Expand Down Expand Up @@ -183,3 +184,28 @@ impl Arbitrary for OffsetDateTime {
Box::new(shrunk_datetime.chain(shrunk_offset))
}
}

impl Arbitrary for Weekday {
fn arbitrary<G>(g: &mut G) -> Self
where
G: Gen,
{
use Weekday::*;
match g.gen_range(0, max(1, min(7, g.size()))) {
0 => Monday,
1 => Tuesday,
2 => Wednesday,
3 => Thursday,
4 => Friday,
5 => Saturday,
_ => Sunday,
}
}

fn shrink(&self) -> Box<dyn Iterator<Item = Self>> {
match self {
Self::Monday => Box::new(std::iter::empty()),
_ => Box::new(std::iter::once(self.previous())),
}
}
}
25 changes: 25 additions & 0 deletions time-quickcheck-tests/tests/quickcheck.rs
Expand Up @@ -12,6 +12,7 @@ use time::OffsetDateTime;
use time::PrimitiveDateTime;
use time::Time;
use time::UtcOffset;
use time::Weekday;

/// Returns a statically seeded generator to ensure tests are deterministic
fn make_generator(size: usize) -> StdGen<StdRng> {
Expand Down Expand Up @@ -280,3 +281,27 @@ fn arbitrary_offset_date_time_respects_generator_size() {
test_generator_size!(OffsetDateTime, offset().as_seconds().abs(), 1000);
test_generator_size!(OffsetDateTime, offset().as_seconds().abs(), 100_000);
}

quickcheck! {
fn weekday_supports_arbitrary(w: Weekday) -> bool {
w.iso_weekday_number() >= 1 && w.iso_weekday_number() <= 7
}

fn weekday_can_shrink(w: Weekday) -> bool {
match w {
Weekday::Monday => w.shrink().next() == None,
_ => w.shrink().next() == Some(w.previous())
}
}
}

#[test]
fn arbitrary_weekday_respects_generator_size() {
test_generator_size!(Weekday, iso_weekday_number() min=1, 1);
test_generator_size!(Weekday, iso_weekday_number() min=1, 2);
test_generator_size!(Weekday, iso_weekday_number() min=1, 3);
test_generator_size!(Weekday, iso_weekday_number() min=1, 4);
test_generator_size!(Weekday, iso_weekday_number() min=1, 5);
test_generator_size!(Weekday, iso_weekday_number() min=1, 6);
test_generator_size!(Weekday, iso_weekday_number() min=1, 7);
}

0 comments on commit adefde0

Please sign in to comment.