Hi Isoken
On 28/10/2023 15:07, Isoken Ibizugbe wrote:
#include "test-lib.h"
#include "ctype.h"
static void t_digit_type(void)
{
int i;
for (i = 0; i < 256; i++)
{
if (i < '0' || i > '9')
check_int(isdigit(i), ==, 0);
else
check_int(isdigit(i), ==, 1);
}
}
I think this is correct but when you are writing tests it is important
to think about how easy they will be to debug if they fail. In this case
because there is a single test to check all the characters it will be
hard to tell which character caused the test to fail. If we restructure
the code to use a separate test for each character then we will be able
to see which characters are causing isdigit() to fail. To do that we
need a function that prints the character that we're testing. Because we
don't want to print raw control characters in the test name we need to
check if the character can be printed as is or if it needs to be printed
as an octal escape sequence. We can do that by writing a function like
static const char* char_name(int i)
{
static char buf[5];
if (i < ' ' || i >= 127)
xsnprintf(buf, sizeof(buf), "\\%03o", (unsigned int)i);
else
xsnprintf(buf, sizeof(buf), "%c", i);
return buf;
}
Then we can write a test function defines a separate test for each character
static void t_isdigit(void)
{
for (int i = 0; i < 256; i++) {
if (i < '0' || i > '9')
TEST(check(!isdigit(i)), "'%s' is not a digit",
char_name(i));
else
TEST(check(isdigit(i)), "'%s' is a digit",
char_name(i));
}
}
Note that as isdigit() returns a boolean we simplify things by using
check() rather than check_int().
Now we can easily see which character is being tested when a check fails
as the character being tested is in the test name. You would call this
function with
int cmd_main(int argc, const char** argv)
{
t_isdigit();
return test_done();
}
I think it would be helpful for you to try and build and run this test
by checking out the unit test branch from Junio's tree[1] and adding
this test. You could then try making the test fail to see what the
output for a failing test looks like.
Best Wishes
Phillip
[1] You can fetch that branch with
git fetch https://github.com/gitster/git.git
js/doc-unit-tests-with-cmake
and then create your branch with
git checkout -b isdigit-unit-tests FETCH_HEAD