Thanks to visit codestin.com
Credit goes to lib.rs

#random #test-framework #cp #generator #test-data

ezcp

A simple tool to automatically generate test cases for competitive programming problems

11 releases

Uses new Rust 2024

0.4.0 Aug 29, 2025
0.3.3 Feb 27, 2025
0.3.2 Jul 4, 2024
0.3.0 Mar 11, 2024
0.1.0 Dec 29, 2023

#231 in Compression

Custom license

150KB
3.5K SLoC

EZCP

A Rust framework to easily create tasks for competitive programming.

Features:

  • Generate test inputs and save them into files.
  • Generate correct outputs.
  • Optionally have a test input checker.
  • Make a solution checker if there are multiple valid solutions.
  • Subtask dependencies.
  • Graph generator.
  • Array generator.
  • Add a partial solution and specify which subtasks it should pass.
  • Automatically archive all test files into a zip.

Suggestions and bug reports: [email protected] You can also open a pull request.

Minimal example: (see examples/ for more complete examples)

use rand::Rng;
use std::path::PathBuf;

const SOURCE: &str = r#"
#include<iostream>
using namespace std;

int main(){
    int n;
    cin>>n;
    long long sum=0;
    int big=0;
    while(n--){
        int a;
        cin>>a;
        big=max(big,a);
        sum+=a;
    }
    cout<<sum-big/2<<"\n";
}
"#;

fn main() {
    // For the first task you get an array of even integers. 
    // You need to find the sum of all elements in the array minus the half of the maximum element.

    let mut task = ezcp::Task::new("Coupon", &PathBuf::from("coupon"));
    task.solution_source = SOURCE.to_owned();

    // Constraint: n = 1
    let mut subtask1 = ezcp::Subtask::new();
    
    // Add 5 tests, where an array is generated with length 1 and an even value between 0 and 1_000_000_000 (inclusive).
    subtask1.add_test(5, ezcp::array_generator_custom(1, 1, |rng| rng.random_range(0..=500_000_000) * 2));
    

    // No additional constraints.
    let mut subtask2 = ezcp::Subtask::new();

    // Add some random tests.
    subtask2.add_test(5, ezcp::array_generator_custom(1, 200_000, |rng| rng.random_range(0..=500_000_000) * 2));

    // Add 5 edge cases, where n is maximal.
    subtask2.add_test(5, ezcp::array_generator_custom(200_000, 200_000, |rng| rng.random_range(0..=500_000_000) * 2));

    // Add subtasks to the task.
    let subtask1 = task.add_subtask(subtask1);
    let subtask2 = task.add_subtask(subtask2);

    // Add dependencies (dependencies are only if constraints of a dependency are a subset of constraints of a subtask).
    task.add_subtask_dependency(subtask2, subtask1);
    
    // Finally, create the tests.
    task.create_tests().ok();
}

Dependencies

~7–13MB
~266K SLoC