Skip to main content

Introduction

TCFrame is a C++ framework for generating test cases of competitive programming problems. This framework helps problem writers prepare test cases in a structured manner and ensures that the generated test cases are valid according to the specified constraints.

Example high-level usage:

  1. Specify input/output variables.

    int A, B;
    int sum;
  2. Specify input/output formats, using a rich set of format macros.

    void InputFormat() {
    LINE(A, B); // A line containing space-separated A and B
    }
    void OutputFormat() {
    LINE(sum);
    }
  3. Specify the grading configuration.

    void GradingConfig() {
    TimeLimit(2);
    MemoryLimit(64);
    }
  4. Specify the constraints. Subtasks are supported.

    void Constraints() {
    CONS(1 <= A && A <= 1000);
    CONS(1 <= B && B <= 1000);
    }
  5. Specify the sample test cases.

    void SampleTestCase1() {
    Input({
    "2 8"
    });
    Output({
    "10"
    });
    }
    void SampleTestCase2() {
    Input({
    "42 100"
    });
    Output({
    "142"
    });
    }
  6. Specify the official test cases. Simple random number generator is available.

    void TestCases() {
    CASE(A = 1, B = 1);
    CASE(A = 77, B = 99);
    CASE(A = rnd.nextInt(1, 1000), B = rnd.nextInt(1, 1000));
    }
  7. Write and compile the official solution to this problem, using any programming language you wish. Of course, it is the infamous A+B problem.

    #include <iostream>
    using namespace std;

    int main() {
    int A, B;
    cin >> A >> B;
    cout << (A + B) << endl;
    }
  8. Run the generator. Actual test cases (.in and .out files) will be generated. Profit!

  9. If you ever specified an invalid test case, such as CASE(A = 0, B = 1), you will get a nice error message:

    sum_4: FAILED
    Description: A = 0, B = 1
    Reasons:
    * Does not satisfy constraints, on:
    - 1 <= A && A <= 1000

Features​

TCFrame supports:

  • Batch and interactive problems.
  • ICPC-style problems and IOI-style problems with subtasks and points.
  • Multiple test cases per file.
  • Local grading against the generated test cases, with time and memory limits.
  • Simple random number generation helper.

Requirements​

TCFrame requires:

  • Linux/OS X. Windows is not supported.
  • GCC which supports C++17.

Motivations​

Why do we need test case generators?

  • Writing test cases manually is error-prone and time-consuming.
  • To enable distributing the test cases as a single, small generator file. No need to send 20 MB of testcases.zip over email anymore.
  • During problem development, constraints often change. Using a generator, we can easily amend the constraints and rerun the generator when needed.

Why do we need a framework for that?

  • Not everyone knows how to write a good test cases generator.
  • To avoid writing repetitive and boring tasks. For example: creating test case files with correct suffixes (foo_1.in, foo_1.out), running the official solution against the test case input files, etc.
  • To have a consistent format for generators, so that problem writers in a contest can better collaborate in writing test case generators.

Credits​

TCFrame is based on a paper submitted to IOI conference in 2015: Introducing tcframe: A Simple and Robust Test Cases Generation Framework, written by Ashar Fuadi.

TCFrame was mainly inspired from testlib, written by Mike Mirzayanov et al.

License​

TCFrame is released under MIT license.

Source code can be found on https://github.com/ia-toki/tcframe.