Blame


1 87c31341 2020-10-11 neels #include <stdio.h>
2 87c31341 2020-10-11 neels #include <stdint.h>
3 87c31341 2020-10-11 neels #include <string.h>
4 87c31341 2020-10-11 neels #include <stdbool.h>
5 87c31341 2020-10-11 neels #include <stdlib.h>
6 87c31341 2020-10-11 neels
7 87c31341 2020-10-11 neels #include <arraylist.h>
8 87c31341 2020-10-11 neels #include <diff_main.h>
9 87c31341 2020-10-11 neels
10 87c31341 2020-10-11 neels #include <diff_internal.h>
11 87c31341 2020-10-11 neels #include <diff_debug.h>
12 87c31341 2020-10-11 neels
13 87c31341 2020-10-11 neels void test_minus_after_plus(void)
14 87c31341 2020-10-11 neels {
15 87c31341 2020-10-11 neels struct diff_result *result = malloc(sizeof(struct diff_result));
16 c16dde50 2020-10-22 stsp struct diff_data d_left, d_right;
17 87c31341 2020-10-11 neels char *left_data = "a\nb\nc\nd\ne\nm\nn\n";
18 87c31341 2020-10-11 neels char *right_data = "a\nb\nj\nk\nl\nm\nn\n";
19 87c31341 2020-10-11 neels int i;
20 87c31341 2020-10-11 neels
21 87c31341 2020-10-11 neels printf("\n--- %s()\n", __func__);
22 87c31341 2020-10-11 neels
23 c16dde50 2020-10-22 stsp d_left = (struct diff_data){
24 c16dde50 2020-10-22 stsp .data = left_data,
25 c16dde50 2020-10-22 stsp .len = strlen(left_data),
26 ede78929 2020-11-06 neels .root = &d_left,
27 c16dde50 2020-10-22 stsp };
28 c16dde50 2020-10-22 stsp d_right = (struct diff_data){
29 c16dde50 2020-10-22 stsp .data = right_data,
30 c16dde50 2020-10-22 stsp .len = strlen(right_data),
31 ede78929 2020-11-06 neels .root = &d_right,
32 c16dde50 2020-10-22 stsp };
33 87c31341 2020-10-11 neels *result = (struct diff_result) {
34 c16dde50 2020-10-22 stsp .left = &d_left,
35 c16dde50 2020-10-22 stsp .right = &d_right,
36 87c31341 2020-10-11 neels };
37 87c31341 2020-10-11 neels
38 c16dde50 2020-10-22 stsp diff_atomize_text_by_line(NULL, result->left);
39 c16dde50 2020-10-22 stsp diff_atomize_text_by_line(NULL, result->right);
40 87c31341 2020-10-11 neels
41 87c31341 2020-10-11 neels struct diff_state state = {
42 87c31341 2020-10-11 neels .result = result,
43 87c31341 2020-10-11 neels .recursion_depth_left = 32,
44 87c31341 2020-10-11 neels };
45 c16dde50 2020-10-22 stsp diff_data_init_subsection(&state.left, result->left,
46 c16dde50 2020-10-22 stsp result->left->atoms.head,
47 c16dde50 2020-10-22 stsp result->left->atoms.len);
48 c16dde50 2020-10-22 stsp diff_data_init_subsection(&state.right, result->right,
49 c16dde50 2020-10-22 stsp result->right->atoms.head,
50 c16dde50 2020-10-22 stsp result->right->atoms.len);
51 87c31341 2020-10-11 neels
52 87c31341 2020-10-11 neels /* "same" section */
53 87c31341 2020-10-11 neels diff_state_add_chunk(&state, true,
54 87c31341 2020-10-11 neels &state.left.atoms.head[0], 2,
55 87c31341 2020-10-11 neels &state.right.atoms.head[0], 2);
56 87c31341 2020-10-11 neels
57 87c31341 2020-10-11 neels /* "plus" section */
58 87c31341 2020-10-11 neels diff_state_add_chunk(&state, true,
59 87c31341 2020-10-11 neels &state.left.atoms.head[2], 0,
60 87c31341 2020-10-11 neels &state.right.atoms.head[2], 3);
61 87c31341 2020-10-11 neels
62 87c31341 2020-10-11 neels /* "minus" section */
63 87c31341 2020-10-11 neels diff_state_add_chunk(&state, true,
64 87c31341 2020-10-11 neels &state.left.atoms.head[2], 3,
65 87c31341 2020-10-11 neels &state.right.atoms.head[5], 0);
66 87c31341 2020-10-11 neels
67 87c31341 2020-10-11 neels /* "same" section */
68 87c31341 2020-10-11 neels diff_state_add_chunk(&state, true,
69 87c31341 2020-10-11 neels &state.left.atoms.head[5], 2,
70 87c31341 2020-10-11 neels &state.right.atoms.head[5], 2);
71 87c31341 2020-10-11 neels
72 87c31341 2020-10-11 neels for (i = 0; i < result->chunks.len; i++) {
73 87c31341 2020-10-11 neels struct diff_chunk *c = &result->chunks.head[i];
74 87c31341 2020-10-11 neels enum diff_chunk_type t = diff_chunk_type(c);
75 87c31341 2020-10-11 neels
76 6fc23bd0 2020-10-16 stsp printf("[%d] %s lines L%d R%d @L %lld @R %lld\n",
77 87c31341 2020-10-11 neels i, (t == CHUNK_MINUS ? "minus" :
78 87c31341 2020-10-11 neels (t == CHUNK_PLUS ? "plus" :
79 87c31341 2020-10-11 neels (t == CHUNK_SAME ? "same" : "?"))),
80 87c31341 2020-10-11 neels c->left_count,
81 87c31341 2020-10-11 neels c->right_count,
82 ede78929 2020-11-06 neels (long long)(c->left_start ? diff_atom_root_idx(result->left, c->left_start) : -1LL),
83 ede78929 2020-11-06 neels (long long)(c->right_start ? diff_atom_root_idx(result->right, c->right_start) : -1LL));
84 87c31341 2020-10-11 neels }
85 87c31341 2020-10-11 neels
86 87c31341 2020-10-11 neels diff_result_free(result);
87 c16dde50 2020-10-22 stsp diff_data_free(&d_left);
88 c16dde50 2020-10-22 stsp diff_data_free(&d_right);
89 87c31341 2020-10-11 neels }
90 87c31341 2020-10-11 neels
91 87c31341 2020-10-11 neels void test_plus_after_plus(void)
92 87c31341 2020-10-11 neels {
93 87c31341 2020-10-11 neels struct diff_result *result = malloc(sizeof(struct diff_result));
94 c16dde50 2020-10-22 stsp struct diff_data d_left, d_right;
95 87c31341 2020-10-11 neels char *left_data = "a\nb\nc\nd\ne\nm\nn\n";
96 87c31341 2020-10-11 neels char *right_data = "a\nb\nj\nk\nl\nm\nn\n";
97 87c31341 2020-10-11 neels struct diff_chunk *c;
98 87c31341 2020-10-11 neels
99 87c31341 2020-10-11 neels printf("\n--- %s()\n", __func__);
100 87c31341 2020-10-11 neels
101 c16dde50 2020-10-22 stsp d_left = (struct diff_data){
102 c16dde50 2020-10-22 stsp .data = left_data,
103 c16dde50 2020-10-22 stsp .len = strlen(left_data),
104 ede78929 2020-11-06 neels .root = &d_left,
105 c16dde50 2020-10-22 stsp };
106 c16dde50 2020-10-22 stsp d_right = (struct diff_data){
107 c16dde50 2020-10-22 stsp .data = right_data,
108 c16dde50 2020-10-22 stsp .len = strlen(right_data),
109 ede78929 2020-11-06 neels .root = &d_right,
110 c16dde50 2020-10-22 stsp };
111 87c31341 2020-10-11 neels *result = (struct diff_result) {
112 c16dde50 2020-10-22 stsp .left = &d_left,
113 c16dde50 2020-10-22 stsp .right = &d_right,
114 87c31341 2020-10-11 neels };
115 87c31341 2020-10-11 neels
116 c16dde50 2020-10-22 stsp diff_atomize_text_by_line(NULL, result->left);
117 c16dde50 2020-10-22 stsp diff_atomize_text_by_line(NULL, result->right);
118 87c31341 2020-10-11 neels
119 87c31341 2020-10-11 neels struct diff_state state = {
120 87c31341 2020-10-11 neels .result = result,
121 87c31341 2020-10-11 neels .recursion_depth_left = 32,
122 87c31341 2020-10-11 neels };
123 c16dde50 2020-10-22 stsp diff_data_init_subsection(&state.left, result->left,
124 c16dde50 2020-10-22 stsp result->left->atoms.head,
125 c16dde50 2020-10-22 stsp result->left->atoms.len);
126 c16dde50 2020-10-22 stsp diff_data_init_subsection(&state.right, result->right,
127 c16dde50 2020-10-22 stsp result->right->atoms.head,
128 c16dde50 2020-10-22 stsp result->right->atoms.len);
129 87c31341 2020-10-11 neels
130 87c31341 2020-10-11 neels /* "same" section */
131 87c31341 2020-10-11 neels diff_state_add_chunk(&state, true,
132 87c31341 2020-10-11 neels &state.left.atoms.head[0], 2,
133 87c31341 2020-10-11 neels &state.right.atoms.head[0], 2);
134 87c31341 2020-10-11 neels
135 87c31341 2020-10-11 neels /* "minus" section */
136 87c31341 2020-10-11 neels diff_state_add_chunk(&state, true,
137 87c31341 2020-10-11 neels &state.left.atoms.head[2], 3,
138 87c31341 2020-10-11 neels &state.right.atoms.head[2], 0);
139 87c31341 2020-10-11 neels
140 87c31341 2020-10-11 neels /* "plus" section */
141 87c31341 2020-10-11 neels diff_state_add_chunk(&state, true,
142 87c31341 2020-10-11 neels &state.left.atoms.head[5], 0,
143 87c31341 2020-10-11 neels &state.right.atoms.head[2], 1);
144 87c31341 2020-10-11 neels /* "plus" section */
145 87c31341 2020-10-11 neels diff_state_add_chunk(&state, true,
146 87c31341 2020-10-11 neels &state.left.atoms.head[5], 0,
147 87c31341 2020-10-11 neels &state.right.atoms.head[3], 2);
148 87c31341 2020-10-11 neels
149 87c31341 2020-10-11 neels /* "same" section */
150 87c31341 2020-10-11 neels diff_state_add_chunk(&state, true,
151 87c31341 2020-10-11 neels &state.left.atoms.head[5], 2,
152 87c31341 2020-10-11 neels &state.right.atoms.head[5], 2);
153 87c31341 2020-10-11 neels
154 87c31341 2020-10-11 neels ARRAYLIST_FOREACH(c, result->chunks) {
155 87c31341 2020-10-11 neels enum diff_chunk_type t = diff_chunk_type(c);
156 87c31341 2020-10-11 neels
157 37f62f5d 2020-10-16 stsp printf("[%lu] %s lines L%d R%d @L %lld @R %lld\n",
158 37f62f5d 2020-10-16 stsp (unsigned long)ARRAYLIST_IDX(c, result->chunks),
159 87c31341 2020-10-11 neels (t == CHUNK_MINUS ? "minus" :
160 87c31341 2020-10-11 neels (t == CHUNK_PLUS ? "plus" :
161 87c31341 2020-10-11 neels (t == CHUNK_SAME ? "same" : "?"))),
162 87c31341 2020-10-11 neels c->left_count,
163 87c31341 2020-10-11 neels c->right_count,
164 ede78929 2020-11-06 neels (long long)(c->left_start ? diff_atom_root_idx(result->left, c->left_start) : -1LL),
165 ede78929 2020-11-06 neels (long long)(c->right_start ? diff_atom_root_idx(result->right, c->right_start) : -1LL));
166 87c31341 2020-10-11 neels }
167 87c31341 2020-10-11 neels
168 87c31341 2020-10-11 neels diff_result_free(result);
169 c16dde50 2020-10-22 stsp diff_data_free(&d_left);
170 c16dde50 2020-10-22 stsp diff_data_free(&d_right);
171 87c31341 2020-10-11 neels }
172 87c31341 2020-10-11 neels
173 87c31341 2020-10-11 neels int main(void)
174 87c31341 2020-10-11 neels {
175 87c31341 2020-10-11 neels test_minus_after_plus();
176 87c31341 2020-10-11 neels test_plus_after_plus();
177 87c31341 2020-10-11 neels return 0;
178 87c31341 2020-10-11 neels }