A lightweight test helper package
0

Configure Feed

Select the types of activity you want to include in your feed.

Fix a different utf-8 bug!

Tom Fleet (Apr 9, 2026, 5:25 PM +0100) 193c7faa b71319a4

+24
+8
internal/diff/chardiff_test.go
··· 90 90 added: []byte("0"), 91 91 wantHasChanged: true, 92 92 }, 93 + { 94 + // Regression: identical invalid UTF-8 bytes must produce all-unchanged segments. 95 + // \x80 is a bare continuation byte — invalid UTF-8 on its own. 96 + name: "identical invalid UTF-8", 97 + removed: []byte("\x80"), 98 + added: []byte("\x80"), 99 + wantAllUnchanged: true, 100 + }, 93 101 } 94 102 95 103 for _, tt := range tests {
+13
internal/diff/chars.go
··· 1 1 package diff 2 2 3 3 import ( 4 + "bytes" 4 5 "unicode/utf8" 5 6 ) 6 7 ··· 21 22 // Strips and restores trailing \n before diffing. 22 23 // If either side exceeds 500 runes, returns a single-segment fallback (whole-line). 23 24 func CharDiff(removed, added []byte) InlineChange { 25 + // Identical inputs: short-circuit before any UTF-8 handling. This also 26 + // covers identical invalid UTF-8, where fallback would wrongly return 27 + // Changed:true segments. 28 + if bytes.Equal(removed, added) { 29 + seg := Segment{Text: append([]byte(nil), removed...), Changed: false} 30 + 31 + return InlineChange{ 32 + Removed: []Segment{seg}, 33 + Added: []Segment{{Text: append([]byte(nil), added...), Changed: false}}, 34 + } 35 + } 36 + 24 37 // Strip trailing newline, remember whether each side had one. 25 38 removedNL := len(removed) > 0 && removed[len(removed)-1] == '\n' 26 39 addedNL := len(added) > 0 && added[len(added)-1] == '\n'
+3
internal/diff/testdata/fuzz/FuzzCharDiff/10ab2b7964808a78
··· 1 + go test fuzz v1 2 + []byte("\x80") 3 + []byte("\x80")