#include #include #include #include #include #include #include #include #include void test_minus_after_plus(void) { struct diff_result *result = malloc(sizeof(struct diff_result)); 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__); *result = (struct diff_result) { .left = (struct diff_data){ .data = left_data, .len = strlen(left_data), .root = &result->left, }, .right = (struct diff_data){ .data = right_data, .len = strlen(right_data), .root = &result->right, }, }; diff_atomize_text_by_line(0, &result->left, &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 %d @R %d\n", i, (t == CHUNK_MINUS ? "minus" : (t == CHUNK_PLUS ? "plus" : (t == CHUNK_SAME ? "same" : "?"))), c->left_count, c->right_count, c->left_start ? c->left_start->pos : -1, c->right_start ? c->right_start->pos : -1); } diff_result_free(result); } void test_plus_after_plus(void) { struct diff_result *result = malloc(sizeof(struct diff_result)); 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__); *result = (struct diff_result) { .left = (struct diff_data){ .data = left_data, .len = strlen(left_data), .root = &result->left, }, .right = (struct diff_data){ .data = right_data, .len = strlen(right_data), .root = &result->right, }, }; diff_atomize_text_by_line(0, &result->left, &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("[%d] %s lines L%d R%d @L %d @R %d\n", ARRAYLIST_IDX(c, result->chunks), (t == CHUNK_MINUS ? "minus" : (t == CHUNK_PLUS ? "plus" : (t == CHUNK_SAME ? "same" : "?"))), c->left_count, c->right_count, c->left_start ? c->left_start->pos : -1, c->right_start ? c->right_start->pos : -1); } diff_result_free(result); } int main(void) { test_minus_after_plus(); test_plus_after_plus(); return 0; }