git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: Ghanshyam Thakkar <shyamthakkar001@gmail.com>
Cc: git@vger.kernel.org,  Christian Couder <chriscool@tuxfamily.org>,
	Kaartic Sivaraam <kaartic.sivaraam@gmail.com>
Subject: Re: [GSoC][PATCH] t/: migrate helper/test-example-decorate to the unit testing framework
Date: Wed, 29 May 2024 14:41:46 -0700	[thread overview]
Message-ID: <xmqq8qzsuwh1.fsf@gitster.g> (raw)
In-Reply-To: <20240528125837.31090-1-shyamthakkar001@gmail.com> (Ghanshyam Thakkar's message of "Tue, 28 May 2024 18:28:25 +0530")

Ghanshyam Thakkar <shyamthakkar001@gmail.com> writes:

> +struct test_vars {
> +	struct object *one, *two, *three;
> +	struct decoration n;
> +	int decoration_a, decoration_b;
> +};
> +
> +static void t_add(struct test_vars *vars)
> +{
> +	void *ret = add_decoration(&vars->n, vars->one, &vars->decoration_a);
> +
> +	if (!check(ret == NULL))
> +		test_msg("when adding a brand-new object, NULL should be returned");
> +	ret = add_decoration(&vars->n, vars->two, NULL);
> +	if (!check(ret == NULL))
> +		test_msg("when adding a brand-new object, NULL should be returned");
> +}
> +
> +static void t_readd(struct test_vars *vars)
> +{
> +	void *ret = add_decoration(&vars->n, vars->one, NULL);
> +
> +	if (!check(ret == &vars->decoration_a))
> +		test_msg("when readding an already existing object, existing decoration should be returned");
> +	ret = add_decoration(&vars->n, vars->two, &vars->decoration_b);
> +	if (!check(ret == NULL))
> +		test_msg("when readding an already existing object, existing decoration should be returned");
> +}
> +
> +static void t_lookup(struct test_vars *vars)
> +{
> +	void *ret = lookup_decoration(&vars->n, vars->one);
> +
> +	if (!check(ret == NULL))
> +		test_msg("lookup should return added declaration");
> +	ret = lookup_decoration(&vars->n, vars->two);
> +	if (!check(ret == &vars->decoration_b))
> +		test_msg("lookup should return added declaration");
> +	ret = lookup_decoration(&vars->n, vars->three);
> +	if (!check(ret == NULL))
> +		test_msg("lookup for unknown object should return NULL");
> +}
> +
> +static void t_loop(struct test_vars *vars)
> +{
> +	int i, objects_noticed = 0;
> +
> +	for (i = 0; i < vars->n.size; i++) {
> +		if (vars->n.entries[i].base)
> +			objects_noticed++;
> +	}
> +	if (!check_int(objects_noticed, ==, 2))
> +		test_msg("should have 2 objects");
> +}
> +
> +int cmd_main(int argc UNUSED, const char **argv UNUSED)
> +{
> +	struct object_id one_oid = { { 1 } }, two_oid = { { 2 } }, three_oid = { { 3 } };
> +	struct test_vars vars = { 0 };
> +
> +	vars.one = lookup_unknown_object(the_repository, &one_oid);
> +	vars.two = lookup_unknown_object(the_repository, &two_oid);
> +	vars.three = lookup_unknown_object(the_repository, &three_oid);
> +
> +	TEST(t_add(&vars),
> +	     "Add 2 objects, one with a non-NULL decoration and one with a NULL decoration.");
> +	TEST(t_readd(&vars),
> +	     "When re-adding an already existing object, the old decoration is returned.");
> +	TEST(t_lookup(&vars),
> +	     "Lookup returns the added declarations, or NULL if the object was never added.");
> +	TEST(t_loop(&vars), "The user can also loop through all entries.");

These tests as a whole look like a faithful copy of the original
done by cmd__example_decorate().

I do not understand the criteria used to split them into the four
separate helper functions.  It is not like they can be reused or
reordered---for example, t_readd() must be done after t_add() has
been done.

What benefit are you trying to get out of these split?  IOW, what
are we gaining by having four separate helper functions, instead of
testing all of these same things in a single helper function t_all
with something like

	TEST(t_all(&vars), "Do all decorate tests.");

in cmd_main()?  If there is a concrete benefit of having larger
number of smaller tests, would it make the result even better if we
split t_add() further into t_add_one() that adds one with deco_a and
t_add_two() that adds two with NULL?  The other helpers can of
course be further split into individual pieces the same way.  What
ere the criteria used to decide where to stop and use these four?

Thanks.




  reply	other threads:[~2024-05-29 21:41 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-05-28 12:58 [GSoC][PATCH] t/: migrate helper/test-example-decorate to the unit testing framework Ghanshyam Thakkar
2024-05-29 21:41 ` Junio C Hamano [this message]
2024-05-30  6:55   ` Christian Couder
2024-05-30  8:39     ` Ghanshyam Thakkar
2024-05-30 15:54       ` Junio C Hamano
2024-06-03 17:51         ` Ghanshyam Thakkar
2024-06-03 18:53         ` Josh Steadmon
2024-06-03 21:09           ` Ghanshyam Thakkar

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=xmqq8qzsuwh1.fsf@gitster.g \
    --to=gitster@pobox.com \
    --cc=chriscool@tuxfamily.org \
    --cc=git@vger.kernel.org \
    --cc=kaartic.sivaraam@gmail.com \
    --cc=shyamthakkar001@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).