Giter Site home page Giter Site logo

Comments (4)

BurntSushi avatar BurntSushi commented on August 11, 2024

This would be pretty neat.

Exporting actual Rust code seems like it'd be difficult, so I think the more reasonable path here is exporting the arguments given to a QuickCheck property that caused it to fail. (It's already doing this to some extent, but it's not machine readable and there's no way to "run tests with these arguments.")

from quickcheck.

milibopp avatar milibopp commented on August 11, 2024

I think, a first step towards this would be to implement a function similar to quickcheck::quickcheck, which in addition takes a list of test values that must always be checked, no matter what values get generated. Then one could add failing test cases as hard-coded arguments to this function.

from quickcheck.

Eh2406 avatar Eh2406 commented on August 11, 2024

This is some pseudocode to make a wrapper that dumps failing cases to a folder. With some help it could work like Hypothesis's caching of failed test.

extern crate quickcheck;
use quickcheck::{Arbitrary, Gen};

extern crate serde;
use serde::{Serialize, Deserialize};
extern crate serde_json;

use std::error::Error;
use std::io::prelude::*;
use std::fs::File;
use std::path::Path;

#[derive(Debug, Clone)]
pub struct SavedCheck<T: Clone + Send> {
    iner: T,
}

impl<T: Arbitrary + Serialize + Deserialize> Arbitrary for SavedCheck<T> {
    fn arbitrary<G: Gen>(g: &mut G) -> Self {
        for file in Path::new("quickcheck_cache/") {
            let file = File::open(&file);
            if let Ok(t) = serde_json::from_str(&file.as_bytes()) {
                // somehow only return each one once
                return SavedCheck { iner: t };
            }
        }
        SavedCheck { iner: Arbitrary::arbitrary(g) }
    }

    fn shrink(&self) -> Box<Iterator<Item = Self>> {
        if let Ok(st) = serde_json::to_string(&self.iner) {
            // somehow pick a unique name
            let path = Path::new("quickcheck_cache/test.json");
            let display = path.display();
            let mut file = match File::create(&path) {
                Err(why) => panic!("couldn't create {}: {}", display, why.description()),
                Ok(file) => file,
            };
            match file.write_all(st.as_bytes()) {
                Err(why) => panic!("couldn't write to {}: {}", display, why.description()),
                Ok(_) => println!("successfully wrote to {}", display),
            }
        }
        Box::new(self.iner.shrink().map(|t| SavedCheck { iner: t }))
    }
}

from quickcheck.

BurntSushi avatar BurntSushi commented on August 11, 2024

It sounds like proptest can do this. I doubt I'll have the bandwidth to implement/review/maintain something like this.

from quickcheck.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.