Snaipe / Criterion

A cross-platform C and C++ unit testing framework for the 21st century
MIT License
2.05k stars 182 forks source link

How to use std::cin or getline with criterion ? #546

Open P4r4dis opened 5 months ago

P4r4dis commented 5 months ago

Hello, im trying to use std::cin or getline in my code but i have some issues like symply when std::cin or getline() is called, the program runs in a void. there must be things I haven't understood or that I'm not doing correctly, can you help me please? Ex:

Test(test, cin)
{
    std::string command;

    while (command != "exit")
    {
        std::cin >> command; // I write "exit" (without ""). ISSUE -> ctrl + C for leave
        std::cout << "result: " << command << std::endl; // line never call
    }
}

Thank you

P4r4dis commented 5 months ago

Im just seeing there is an example in sample/redirect.cc:

char rot13_char(char c)
{
    return std::isalpha(c) ? (c - 'a' + 13) % 26 + 'a' : c;
}

void rot13_io(void)
{
    std::string s;

    std::getline(std::cin, s);
    for (size_t i = 0; i < s.length(); ++i)
        s[i] = rot13_char(s[i]);
    std::cout << s << std::flush;
}

Test(redirect, rot13, .init = cr_redirect_stdout) {
    auto &f_cin = criterion::get_redirected_cin();

    f_cin << "the quick brown fox jumps over the lazy dog";
    f_cin.close();

    rot13_io();

    cr_assert_stdout_eq_str("gur dhvpx oebja sbk whzcf bire gur ynml qbt");
}

I understand the approach. But is there any way to use std::cin for an "user" can enter a string of their choice and not simulate an user with a predefined string ?