addons/isl/src/stackEdit/__tests__/diffSplit.test.tsblame
View source
b69ab311/**
b69ab312 * Copyright (c) Meta Platforms, Inc. and affiliates.
b69ab313 *
b69ab314 * This source code is licensed under the MIT license found in the
b69ab315 * LICENSE file in the root directory of this source tree.
b69ab316 */
b69ab317
b69ab318import type {CommitRev} from '../common';
b69ab319
b69ab3110import {ABSENT_FLAG} from '../common';
b69ab3111import {applyDiffSplit, diffCommit, displayDiff} from '../diffSplit';
b69ab3112import {linearStackWithFiles} from './commitStackState.test';
b69ab3113
b69ab3114describe('diffCommit', () => {
b69ab3115 const stack = linearStackWithFiles([
b69ab3116 {'x.txt': {dataBase85: 'HHa&FWG5;0PL2'}, 'z.txt': {data: ''}},
b69ab3117 {'x.txt': {data: '1\n2\n3\n4\n'}},
b69ab3118 {'x.txt': null, 'y.txt': {copyFrom: 'x.txt', data: '3\n4\n5\n6', flags: 'x'}},
b69ab3119 {'z.txt': null},
b69ab3120 ]);
b69ab3121
b69ab3122 it('exports commit diff as json', () => {
b69ab3123 // Commit 2 includes deletion of "x.txt", and rename from "x.txt" to "y.txt".
b69ab3124 // Right now we don't "optimize" the diff to exclude the deletion.
b69ab3125 const diff = diffCommit(stack, 2 as CommitRev);
b69ab3126 expect(diff).toMatchInlineSnapshot(`
b69ab3127 {
b69ab3128 "files": [
b69ab3129 {
b69ab3130 "aFlag": "",
b69ab3131 "aPath": "x.txt",
b69ab3132 "bFlag": "a",
b69ab3133 "bPath": "x.txt",
b69ab3134 "lines": [
b69ab3135 {
b69ab3136 "a": 0,
b69ab3137 "b": null,
b69ab3138 "content": "1
b69ab3139 ",
b69ab3140 },
b69ab3141 {
b69ab3142 "a": 1,
b69ab3143 "b": null,
b69ab3144 "content": "2
b69ab3145 ",
b69ab3146 },
b69ab3147 {
b69ab3148 "a": 2,
b69ab3149 "b": null,
b69ab3150 "content": "3
b69ab3151 ",
b69ab3152 },
b69ab3153 {
b69ab3154 "a": 3,
b69ab3155 "b": null,
b69ab3156 "content": "4
b69ab3157 ",
b69ab3158 },
b69ab3159 ],
b69ab3160 },
b69ab3161 {
b69ab3162 "aFlag": "",
b69ab3163 "aPath": "x.txt",
b69ab3164 "bFlag": "x",
b69ab3165 "bPath": "y.txt",
b69ab3166 "lines": [
b69ab3167 {
b69ab3168 "a": 0,
b69ab3169 "b": null,
b69ab3170 "content": "1
b69ab3171 ",
b69ab3172 },
b69ab3173 {
b69ab3174 "a": 1,
b69ab3175 "b": null,
b69ab3176 "content": "2
b69ab3177 ",
b69ab3178 },
b69ab3179 {
b69ab3180 "a": 2,
b69ab3181 "b": 0,
b69ab3182 "content": "3
b69ab3183 ",
b69ab3184 },
b69ab3185 {
b69ab3186 "a": 3,
b69ab3187 "b": 1,
b69ab3188 "content": "4
b69ab3189 ",
b69ab3190 },
b69ab3191 {
b69ab3192 "a": null,
b69ab3193 "b": 2,
b69ab3194 "content": "5
b69ab3195 ",
b69ab3196 },
b69ab3197 {
b69ab3198 "a": null,
b69ab3199 "b": 3,
b69ab31100 "content": "6",
b69ab31101 },
b69ab31102 ],
b69ab31103 },
b69ab31104 ],
b69ab31105 "message": "Commit 2",
b69ab31106 }
b69ab31107 `);
b69ab31108 expect(displayDiff(diff)).toMatchInlineSnapshot(`
b69ab31109 "Commit 2
b69ab31110 diff a/x.txt b/x.txt
b69ab31111 deleted file mode 100644
b69ab31112 -1
b69ab31113 -2
b69ab31114 -3
b69ab31115 -4
b69ab31116 diff a/x.txt b/y.txt
b69ab31117 old mode 100644
b69ab31118 new mode 100755
b69ab31119 copy from x.txt
b69ab31120 copy to y.txt
b69ab31121 -1
b69ab31122 -2
b69ab31123 3
b69ab31124 4
b69ab31125 +5
b69ab31126 +6
b69ab31127 \\ No newline at end of file"
b69ab31128 `);
b69ab31129 });
b69ab31130
b69ab31131 it('skips binary changes', () => {
b69ab31132 // Commit 1 modifies "x.txt" from binary to text. It is skipped because the binary data.
b69ab31133 const diff = diffCommit(stack, 1 as CommitRev);
b69ab31134 expect(diff).toMatchInlineSnapshot(`
b69ab31135 {
b69ab31136 "files": [],
b69ab31137 "message": "Commit 1",
b69ab31138 }
b69ab31139 `);
b69ab31140 expect(displayDiff(diff)).toMatchInlineSnapshot(`
b69ab31141 "Commit 1
b69ab31142 "
b69ab31143 `);
b69ab31144 });
b69ab31145
b69ab31146 it('reports deletion of an empty file', () => {
b69ab31147 // Commit 3 deletes "z.txt". It should be reported despite the content diff is empty.
b69ab31148 const diff = diffCommit(stack, 3 as CommitRev);
b69ab31149 expect(diff).toMatchInlineSnapshot(`
b69ab31150 {
b69ab31151 "files": [
b69ab31152 {
b69ab31153 "aFlag": "",
b69ab31154 "aPath": "z.txt",
b69ab31155 "bFlag": "a",
b69ab31156 "bPath": "z.txt",
b69ab31157 "lines": [],
b69ab31158 },
b69ab31159 ],
b69ab31160 "message": "Commit 3",
b69ab31161 }
b69ab31162 `);
b69ab31163 expect(displayDiff(diff)).toMatchInlineSnapshot(`
b69ab31164 "Commit 3
b69ab31165 diff a/z.txt b/z.txt
b69ab31166 deleted file mode 100644
b69ab31167 "
b69ab31168 `);
b69ab31169 });
b69ab31170});
b69ab31171
b69ab31172describe('applyDiffSplit', () => {
b69ab31173 it('works in a basic case', () => {
b69ab31174 const stack = linearStackWithFiles([
b69ab31175 {'x.txt': {data: '', flags: ABSENT_FLAG}},
b69ab31176 {'x.txt': {data: '1\n2\n3\n4\n'}},
b69ab31177 {'x.txt': {data: '3\n4\n5\n6\n'}},
b69ab31178 {'x.txt': {data: '3\n4\n5\n6\n7\n'}},
b69ab31179 ]);
b69ab31180 const diff = diffCommit(stack, 2 as CommitRev);
b69ab31181 expect(diff.files[0].lines).toMatchInlineSnapshot(`
b69ab31182 [
b69ab31183 {
b69ab31184 "a": 0,
b69ab31185 "b": null,
b69ab31186 "content": "1
b69ab31187 ",
b69ab31188 },
b69ab31189 {
b69ab31190 "a": 1,
b69ab31191 "b": null,
b69ab31192 "content": "2
b69ab31193 ",
b69ab31194 },
b69ab31195 {
b69ab31196 "a": 2,
b69ab31197 "b": 0,
b69ab31198 "content": "3
b69ab31199 ",
b69ab31200 },
b69ab31201 {
b69ab31202 "a": 3,
b69ab31203 "b": 1,
b69ab31204 "content": "4
b69ab31205 ",
b69ab31206 },
b69ab31207 {
b69ab31208 "a": null,
b69ab31209 "b": 2,
b69ab31210 "content": "5
b69ab31211 ",
b69ab31212 },
b69ab31213 {
b69ab31214 "a": null,
b69ab31215 "b": 3,
b69ab31216 "content": "6
b69ab31217 ",
b69ab31218 },
b69ab31219 ]
b69ab31220 `);
b69ab31221 expect(displayDiff(diff)).toMatchInlineSnapshot(`
b69ab31222 "Commit 2
b69ab31223 diff a/x.txt b/x.txt
b69ab31224 -1
b69ab31225 -2
b69ab31226 3
b69ab31227 4
b69ab31228 +5
b69ab31229 +6
b69ab31230 "
b69ab31231 `);
b69ab31232
b69ab31233 // Pick "-2" and "+5" in the first commit, "+6" in the 2nd, and does not specify the 3rd.
b69ab31234 const newStack = applyDiffSplit(stack, 2 as CommitRev, [
b69ab31235 {message: 'Commit 2a', files: [{bPath: 'x.txt', aLines: [1], bLines: [2]}]},
b69ab31236 {message: 'Commit 2b', files: [{bPath: 'x.txt', aLines: [], bLines: [3]}]},
b69ab31237 {message: 'Commit 2c', files: []},
b69ab31238 ]);
b69ab31239 expect(
b69ab31240 [0, 1, 2, 3, 4, 5].map(i => displayDiff(diffCommit(newStack, i as CommitRev))).join('\n'),
b69ab31241 ).toMatchInlineSnapshot(`
b69ab31242 "Commit 0
b69ab31243
b69ab31244 Commit 1
b69ab31245 diff a/x.txt b/x.txt
b69ab31246 new file mode 100644
b69ab31247 +1
b69ab31248 +2
b69ab31249 +3
b69ab31250 +4
b69ab31251
b69ab31252 Commit 2a
b69ab31253 diff a/x.txt b/x.txt
b69ab31254 1
b69ab31255 -2
b69ab31256 3
b69ab31257 4
b69ab31258 +5
b69ab31259
b69ab31260 Commit 2b
b69ab31261 diff a/x.txt b/x.txt
b69ab31262 1
b69ab31263 3
b69ab31264 4
b69ab31265 5
b69ab31266 +6
b69ab31267
b69ab31268 Commit 2c
b69ab31269 diff a/x.txt b/x.txt
b69ab31270 -1
b69ab31271 3
b69ab31272 4
b69ab31273 5
b69ab31274 6
b69ab31275
b69ab31276 Commit 3
b69ab31277 diff a/x.txt b/x.txt
b69ab31278 3
b69ab31279 4
b69ab31280 5
b69ab31281 6
b69ab31282 +7
b69ab31283 "
b69ab31284 `);
b69ab31285 });
b69ab31286});