aboutsummaryrefslogtreecommitdiff
path: root/contrib/libdiff/test/results_test.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/libdiff/test/results_test.c')
-rw-r--r--contrib/libdiff/test/results_test.c178
1 files changed, 178 insertions, 0 deletions
diff --git a/contrib/libdiff/test/results_test.c b/contrib/libdiff/test/results_test.c
new file mode 100644
index 000000000000..02856a39c249
--- /dev/null
+++ b/contrib/libdiff/test/results_test.c
@@ -0,0 +1,178 @@
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h>
+#include <stdbool.h>
+#include <stdlib.h>
+
+#include <arraylist.h>
+#include <diff_main.h>
+
+#include <diff_internal.h>
+#include <diff_debug.h>
+
+void test_minus_after_plus(void)
+{
+ struct diff_result *result = malloc(sizeof(struct diff_result));
+ struct diff_data d_left, d_right;
+ char *left_data = "a\nb\nc\nd\ne\nm\nn\n";
+ char *right_data = "a\nb\nj\nk\nl\nm\nn\n";
+ int i;
+
+ printf("\n--- %s()\n", __func__);
+
+ d_left = (struct diff_data){
+ .data = left_data,
+ .len = strlen(left_data),
+ .root = &d_left,
+ };
+ d_right = (struct diff_data){
+ .data = right_data,
+ .len = strlen(right_data),
+ .root = &d_right,
+ };
+ *result = (struct diff_result) {
+ .left = &d_left,
+ .right = &d_right,
+ };
+
+ diff_atomize_text_by_line(NULL, result->left);
+ diff_atomize_text_by_line(NULL, result->right);
+
+ struct diff_state state = {
+ .result = result,
+ .recursion_depth_left = 32,
+ };
+ diff_data_init_subsection(&state.left, result->left,
+ result->left->atoms.head,
+ result->left->atoms.len);
+ diff_data_init_subsection(&state.right, result->right,
+ result->right->atoms.head,
+ result->right->atoms.len);
+
+ /* "same" section */
+ diff_state_add_chunk(&state, true,
+ &state.left.atoms.head[0], 2,
+ &state.right.atoms.head[0], 2);
+
+ /* "plus" section */
+ diff_state_add_chunk(&state, true,
+ &state.left.atoms.head[2], 0,
+ &state.right.atoms.head[2], 3);
+
+ /* "minus" section */
+ diff_state_add_chunk(&state, true,
+ &state.left.atoms.head[2], 3,
+ &state.right.atoms.head[5], 0);
+
+ /* "same" section */
+ diff_state_add_chunk(&state, true,
+ &state.left.atoms.head[5], 2,
+ &state.right.atoms.head[5], 2);
+
+ for (i = 0; i < result->chunks.len; i++) {
+ struct diff_chunk *c = &result->chunks.head[i];
+ enum diff_chunk_type t = diff_chunk_type(c);
+
+ printf("[%d] %s lines L%d R%d @L %lld @R %lld\n",
+ i, (t == CHUNK_MINUS ? "minus" :
+ (t == CHUNK_PLUS ? "plus" :
+ (t == CHUNK_SAME ? "same" : "?"))),
+ c->left_count,
+ c->right_count,
+ (long long)(c->left_start ? diff_atom_root_idx(result->left, c->left_start) : -1LL),
+ (long long)(c->right_start ? diff_atom_root_idx(result->right, c->right_start) : -1LL));
+ }
+
+ diff_result_free(result);
+ diff_data_free(&d_left);
+ diff_data_free(&d_right);
+}
+
+void test_plus_after_plus(void)
+{
+ struct diff_result *result = malloc(sizeof(struct diff_result));
+ struct diff_data d_left, d_right;
+ char *left_data = "a\nb\nc\nd\ne\nm\nn\n";
+ char *right_data = "a\nb\nj\nk\nl\nm\nn\n";
+ struct diff_chunk *c;
+
+ printf("\n--- %s()\n", __func__);
+
+ d_left = (struct diff_data){
+ .data = left_data,
+ .len = strlen(left_data),
+ .root = &d_left,
+ };
+ d_right = (struct diff_data){
+ .data = right_data,
+ .len = strlen(right_data),
+ .root = &d_right,
+ };
+ *result = (struct diff_result) {
+ .left = &d_left,
+ .right = &d_right,
+ };
+
+ diff_atomize_text_by_line(NULL, result->left);
+ diff_atomize_text_by_line(NULL, result->right);
+
+ struct diff_state state = {
+ .result = result,
+ .recursion_depth_left = 32,
+ };
+ diff_data_init_subsection(&state.left, result->left,
+ result->left->atoms.head,
+ result->left->atoms.len);
+ diff_data_init_subsection(&state.right, result->right,
+ result->right->atoms.head,
+ result->right->atoms.len);
+
+ /* "same" section */
+ diff_state_add_chunk(&state, true,
+ &state.left.atoms.head[0], 2,
+ &state.right.atoms.head[0], 2);
+
+ /* "minus" section */
+ diff_state_add_chunk(&state, true,
+ &state.left.atoms.head[2], 3,
+ &state.right.atoms.head[2], 0);
+
+ /* "plus" section */
+ diff_state_add_chunk(&state, true,
+ &state.left.atoms.head[5], 0,
+ &state.right.atoms.head[2], 1);
+ /* "plus" section */
+ diff_state_add_chunk(&state, true,
+ &state.left.atoms.head[5], 0,
+ &state.right.atoms.head[3], 2);
+
+ /* "same" section */
+ diff_state_add_chunk(&state, true,
+ &state.left.atoms.head[5], 2,
+ &state.right.atoms.head[5], 2);
+
+ ARRAYLIST_FOREACH(c, result->chunks) {
+ enum diff_chunk_type t = diff_chunk_type(c);
+
+ printf("[%lu] %s lines L%d R%d @L %lld @R %lld\n",
+ (unsigned long)ARRAYLIST_IDX(c, result->chunks),
+ (t == CHUNK_MINUS ? "minus" :
+ (t == CHUNK_PLUS ? "plus" :
+ (t == CHUNK_SAME ? "same" : "?"))),
+ c->left_count,
+ c->right_count,
+ (long long)(c->left_start ? diff_atom_root_idx(result->left, c->left_start) : -1LL),
+ (long long)(c->right_start ? diff_atom_root_idx(result->right, c->right_start) : -1LL));
+ }
+
+ diff_result_free(result);
+ diff_data_free(&d_left);
+ diff_data_free(&d_right);
+}
+
+int main(void)
+{
+ test_minus_after_plus();
+ test_plus_after_plus();
+ return 0;
+}