From f76234700febab324f6a4b0eb3cdf449fc732c51 Mon Sep 17 00:00:00 2001 From: Ekaitz Zarraga Date: Fri, 15 Aug 2025 01:13:54 +0200 Subject: test: piece-table-internals: Add test and pass it Fixes the optimization that avoids adding a new piece when the addition happens in the end of the buffer. Fixes leaks produced in piece_table_optimize --- tests/piece-table-internals.c | 66 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 tests/piece-table-internals.c (limited to 'tests') diff --git a/tests/piece-table-internals.c b/tests/piece-table-internals.c new file mode 100644 index 0000000..d59da17 --- /dev/null +++ b/tests/piece-table-internals.c @@ -0,0 +1,66 @@ +#include +#include +#include +#include "../src/piece-table-internals.h" + +size_t +count_pieces (piece_table *pt) +{ + size_t count; + piece *p; + for (count = 0, p = pt->sentinel->next; p != pt->sentinel; p = p->next) + count++; + return count; +} + +int +main () +{ + char tmp[100]; + size_t expected_count; + piece_table *pt = piece_table_create_from ("0123456789", 10); + /** Inserting **/ + /* Should add pieces... */ + expected_count = 1; + if (count_pieces (pt) != expected_count) return 10; + + piece_table_insert (pt, 10, "abcdefgh", 8); + expected_count++; + if (count_pieces (pt) != expected_count) return 11; + + /* ... but not always **/ + piece_table_insert (pt, 18, "abcdefgh", 8); + if (count_pieces (pt) != expected_count) return 12; + + + /** Deleting **/ + piece_table_delete (pt, 23, 3); + if (count_pieces (pt) != expected_count) return 20; + + piece_table_delete (pt, 13, 4); + expected_count++; + if (count_pieces (pt) != expected_count) return 21; + + piece_table_delete (pt, 0, 10); + expected_count--; + if (count_pieces (pt) != expected_count) return 22; + + + /** Result **/ + piece_table_to_string (pt, tmp, 99); + if (strcmp (tmp, "abchabcde")) + return 30; + + /** Optimize **/ + piece_table_optimize (pt); + expected_count = 1; + if (count_pieces (pt) != expected_count) return 40; + + /** Result **/ + piece_table_to_string (pt, tmp, 99); + if (strcmp (tmp, "abchabcde")) + return 50; + + piece_table_destroy (pt); + return 0; +} -- cgit v1.2.3