A flexible framework for generating randomized test cases with input/output validation, designed for competitive programming and algorithmic testing.
Project description
Easy Random Test Case Generator Framework
A flexible framework for generating randomized test cases with input/output validation, designed for competitive programming and algorithmic testing.
Features
- Type-safe generators for all basic data types and structures
- Automatic test validation with
BadTestExceptionhandling - Customizable I/O formatting for any problem format
- Sample test integration alongside generated cases
- Extensible architecture for custom generators
Installation
pip install contest-helper
Quick Start
from contest_helper import *
# 1. Define your solution with validation
def word_count(text: str) -> int:
if len(text) > 1000:
raise BadTestException("Input too long")
return len(text.split())
# 2. Configure generator
generator = Generator(
solution=word_count,
tests_generator=RandomSentence(min_length=1, max_length=20),
tests_count=10,
input_parser=lambda lines: ' '.join(lines),
input_printer=lambda text: [text],
output_printer=lambda count: [str(count)]
)
# 3. Generate tests
generator.run()
Core Components
Value Generators
| Generator | Description | Example |
|---|---|---|
Value |
Basic value wrapper | Value(5) |
Lambda |
Custom generator functions | Lambda(lambda: datetime.now()) |
RandomValue |
Random value from sequence | RandomValue(['red', 'green', 'blue']) |
RandomNumber |
Numeric ranges | RandomNumber(1, 100) |
RandomWord |
Random strings | RandomWord() |
RandomSentence |
Natural language-like text | RandomSentence() |
RandomList |
Random sequences | RandomList(gen, 5) |
RandomSet |
Random sequences | RandomSet(gen, 5) |
RandomDict |
Key-value pairs | RandomDict(kgen, vgen, 3) |
Test Validation
def solution(input_data):
# Validate input before processing
if is_invalid(input_data):
raise BadTestException("Validation failed")
# Normal processing...
I/O Configuration
Generator(
input_parser=lambda lines: parse_custom_format(lines),
input_printer=lambda obj: format_as_text(obj),
output_printer=lambda result: [str(result)]
)
Advanced Usage
Dynamic Test Generation
dynamic_gen = RandomDict(
key_generator=RandomWord(),
value_generator=RandomList(
RandomNumber(1, 100),
length=RandomNumber(2, 5)
),
length=RandomNumber(3, 10)
)
Custom Generators
class RandomGraph(Value[Dict]):
def __init__(self, node_count: Value[int]):
self.node_count = node_count
def __call__(self) -> Dict:
nodes = [f"node{i}" for i in range(self.node_count())]
return {
n: random.sample(nodes, k=random.randint(1, len(nodes)))
for n in nodes
}
Directory Structure
Generated tests follow this structure:
tests/
├── sample01 # Sample input
├── sample01.a # Sample output
├── 01 # Generated test input
├── 01.a # Generated test output
└── ...
Best Practices
- Validation: Always validate inputs in your solution function
- Descriptive Messages: Provide clear
BadTestExceptionmessages - Generator Composition: Build complex types from simple generators
- Test Diversity: Configure generators to produce edge cases
- Performance: Avoid expensive operations in validation
License
MIT License - Free for commercial and personal use
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file contest_helper-0.1-py3-none-any.whl.
File metadata
- Download URL: contest_helper-0.1-py3-none-any.whl
- Upload date:
- Size: 12.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
de790197cb022e3fb91d1e351dcb4c629c616876c89605e88a9c90b0260e3de1
|
|
| MD5 |
dc49500a3d995052fba9e25abfb0ac45
|
|
| BLAKE2b-256 |
4a80bd7e894a4d61bee7c1b7cec8b21a63c1ddaabd213e126c18bf5ae6128fa8
|