Re: [PATCH v4 2/5] t: move reftable/tree_test.c to the unit testing framework
- From
Justin Tobler <jltobler@gmail.com>
- Date
- Jul 18, 2024, 15:26 UTC
- Message-ID
- <zjaj4aqjp6aa2vevgmhrrxegaum4nvv26kq3olru5z26bqd33l@4mgzgenvib4q>
- In-Reply-To
- <CAOLa=ZRGV1-3cDxgJd9zENTCEPqz04AFwWmkQnYwj5Cbg=EmfA@mail.gmail.com>
On 24/07/18 01:10AM, Karthik Nayak wrote:
Show 56 quoted lines
> Chandra Pratap <chandrapratap3519@gmail.com> writes:
>
> > On Thu, 18 Jul 2024 at 03:45, Justin Tobler <jltobler@gmail.com> wrote:
> >>
> >> On 24/07/17 08:00PM, Chandra Pratap wrote:
>
> >> The `i = (i * 7) % 11;` is used to deterministically generate numbers
> >> 1-10 in a psuedo-random fashion. These numbers are used as memory
> >> offsets to be inserted into the tree. I suspect the psuedo-randomness is
> >> useful keys should be ordered when inserted into the tree and that is
> >> later validated as part of the in-order traversal that is performed.
> >
> > That's right, the randomness of the insertion order is helpful in validating
> > that the tree-functions 'tree_search()' and 'infix_walk()' work according
> > to their defined behaviour.
> >
> >> While rather compact, I find the test setup here to rather difficult to
> >> parse. It might be a good idea to either provide comments explaining
> >> this test setup or consider refactoring it. Honestly, I'd personally
> >> perfer the tree setup be done more explicitly as I think it would make
> >> understanding the test much easier.
> >
> > This probably ties in with the comments by Patrick on the previous iteration
> > of this patch, that using 'tree_search()' to insert tree nodes leads to
> > confusion. Solving that would require efforts outside the scope of this
> > patch series though, so I'm more inclined towards providing comments
> > and other ways of simplifying this subroutine.
>
> Agreed that refactoring `tree_search()` probably is out of scope here.
> But rewriting the test is definitely something we can do.
>
> Perhaps:
>
> static void t_tree(void)
> {
> struct tree_node *root = NULL;
> int values[11] = {7, 5, 2, 3, 10, 4, 6, 9, 8, 1};
> struct tree_node *nodes[11] = { 0 };
> size_t i = 1;
> struct curry c = { 0 };
>
> // Insert values to the tree by passing '1' as the last argument.
> for (i = 1; i < ARRAY_SIZE(values); i++) {
> nodes[i] = tree_search(&values[i], &root, &t_compare, 1);
> }
>
> for (i = 1; i < ARRAY_SIZE(nodes); i++) {
> check_pointer_eq(values[i], nodes[i]->key);
> check_pointer_eq(nodes[i], tree_search(values + i, &root, &t_compare, 0));
> }
>
> infix_walk(root, check_increasing, &c);
> tree_free(root);
> }
>
> Wouldn't this have the same effect while making it much easier to read?Personally, I quite like this approach. It's more up front with what its doing and ultimately accoplishes the same thing.