From 1ffbd3598abafd0cc63fe6e4c5c6346cd5a1b784 Mon Sep 17 00:00:00 2001
From: Barrett Ruth
Date: Fri, 24 Jul 2026 16:54:49 -0700
Subject: [PATCH] test(zip): cover difficult member names
---
test/functional/fixtures/zip/browser.zip | Bin 1143 -> 4084 bytes
test/functional/plugin/zip_spec.lua | 60 +++++++++++++++++++++--
2 files changed, 56 insertions(+), 4 deletions(-)
diff --git a/test/functional/fixtures/zip/browser.zip b/test/functional/fixtures/zip/browser.zip
index 24e271642219e06a04dbc3ec23ab9fb0e501e2de..58288753e6088be43f07ee7df091221772ee9825 100644
GIT binary patch
literal 4084
zcmWIWW@Zs#fB;1Z1tr-T7#Py>b5c@^^l>ZVLnz8iEiOq-K~tN;IK_&Gfq?;p#W2*S
zW#**nl~j~Kv?`ROR+Mm|+SMwXRLaG`zyQMh2>nI*`6VEYAR3#t7>PDPka7^_WME*(
z%*#tH(yPiWfZ9}$SecWbn1W{6&u@1fK{`N~mw|ynPftI!I61KZ>_!Mn0lUsa%e0pZ
zGB7ZJFi590|NsHgZ!44pPHWo(vX+0kd~R3n4^%FTAq`cmx>6<1#RDB%KGD_K(PhFAg$1-
z1%;qqR$^IVa!z7#u>y#zP+beRl7r!P>yH>vieLf}3=9lx3=9l;iMgr8`pgV48z8ET
z3ojm&VPIg8VqjnZB`Jui;)2BFR0R+lh;eE#Us`g5a
zhfHXunZ6Gwm1SUHkY-?D5QW=WQl77%05-B1-8jwj;Q?SXb+2JF?`zOPHjv9C7#J9Y
z;N~ghq$Z|h=B1+<7I4DT*XQIJ@9Wr1I#<{|ALJ@Y1_lOUxJe~NiJ3W>dFcvhMrmkz
zojG&zjCc42Y-TC#*I>mAv!ul2?3m)5#NrGz!#uov&h=@Y^VB(q)im|>iHGGF7#Kh%
zf^r)u)Qk0tGxO4OQq>Df^C9UGIS$U9@jmYvs;_fa-xF&rWZwupfoWn&erZxpsuDI6
zJx=QTp7IRU!fE1(SB;M_<25BeCnvE;1>|6KFP}Vr(o-ksB(8Mg#jaT)&%nR{GE*EL
z8=w#@$xO~pz-FSC&pEx5KIi;!ro9saA=;QRT%4MlX^q7^4ZpKzx17V}z9;WoG%?L8
z$Sg>$!DiM89gnp*{Tj((oPwE#6LSmHuo&fWMmOLzE?0dsP}>R$F_6m;xvLc%8ir4zMfO((z<}6IPH}sCgnOF)v*aWE`4l9$sg>!_VMy+r!wMmoUxB
zNG#4!#$wh951n%XI75HsE_p{#ZUA9KjwnbiN>0ryQN?1MhKH^fn^EXzq2l1LURqu|
z&`PD({IRn@sSFfmplSkSLa}~vNn()}njbavJasNz!WLFny3TLI^j~3VYH>+sex5zL
zIXb?&dMD4E-;A{^N-|Or!Za&7sVFfyJGCSh&8!YTEia#Qe!87l^ZKUf<)xT@(@nuF
zhA#Lbmq3h6BFv!j9#lbKHX%Twpvvm6BZvj9bppI`YXVhJAf*sZs)$M-Qg`d4>qT#3
zK=d*&G%yBY=!G>n(9J+^W+2R%h%f_GH-Z8bT{C)P1EKi@a?=A{8+vO4q3s`f+XG!I
zdUFGz)q;_M0j2SQt`)ttfzVpQh-iDD>q2jHAapHZWMF`|K#;XzYjYs9-DZS0F2TVH
zYJnhhL)sG{)yS<55Fe5##F=1i5Oh80Z4ihaP-3u!>j5_(;4Kn#6VTfo2ot*DCZM%K
z(2YQEY9Nfb4L1V0;eoCny@7$yugVPbI7)K^-2n7f1;T(rxB;LV64Ay$HvzpRfiPh|
z+ywM?1-cpNZ3l!If-Ep^ptmH@%|LH0Ak0WcG6SXUfNlhO0|8;gX1Eccz(8p(pc{hT
zB0w0z&IVI@2
z&?|X_5teMQKtQST(G5Va*%1b`!VN&F=g|#7ug(z$T!b5dUb&;2fnJ3p%ur;9`2t>{
zqiaU5yAhgG;hIrua&!aGD{O=T8{r0^RNv?Zpx4p}1OCDdfY;dp-mIYh8iPE8Ji}ae
L1_nn^2a^E+N)GLQ
delta 33
mcmew&|D9ulB-3VR4lgDVRyGC(1_mw$E(R|q1_p5^5Dx%=g9N|;
diff --git a/test/functional/plugin/zip_spec.lua b/test/functional/plugin/zip_spec.lua
index 1b2023083b..5e969bc4f9 100644
--- a/test/functional/plugin/zip_spec.lua
+++ b/test/functional/plugin/zip_spec.lua
@@ -136,10 +136,15 @@ describe('nvim.zip', function()
edit(archive)
- eq(
- { 'folder/', 'inner.zip', '../escape.txt', '/absolute.txt', 'crlf.txt', 'noeol.txt' },
- lines()
- )
+ eq({
+ 'folder/',
+ 'inner.zip',
+ '../escape.txt',
+ '/absolute.txt',
+ 'crlf.txt',
+ 'noeol.txt',
+ 'names/',
+ }, lines())
eq('zip', api.nvim_get_option_value('filetype', { buf = 0 }))
eq(true, exec_capture('syntax list zipDirectory'):find('zipDirectory', 1, true) ~= nil)
@@ -271,6 +276,53 @@ describe('nvim.zip', function()
end
end)
+ it('lists and opens entries with difficult names', function()
+ t.skip(t.is_os('win'), 'N/A: Windows filenames cannot contain these characters')
+ local archive = vim.fs.joinpath(root, 'browser.zip')
+ copy_fixture(vim.fs.joinpath(fixtures, 'browser.zip'), archive)
+ clear_zip()
+
+ local names = {
+ 'space name.txt',
+ 'two spaces.txt',
+ ' leading.txt',
+ 'trailing .txt',
+ [[back\slash.txt]],
+ [[single'quote.txt]],
+ 'double"quote.txt',
+ 'dollar$name.txt',
+ 'backtick`name.txt',
+ 'semi;name.txt',
+ 'pipe|name.txt',
+ 'amp&name.txt',
+ 'paren(name).txt',
+ 'bang!name.txt',
+ 'hash#name.txt',
+ 'percent%name.txt',
+ 'star*.txt',
+ 'question?.txt',
+ '[bracket].txt',
+ '-dash.txt',
+ }
+
+ edit(archive)
+ api.nvim_win_set_cursor(0, { line_of('names/'), 0 })
+ feed('')
+ poke_eventloop()
+ eq(names, lines())
+
+ api.nvim_win_set_cursor(0, { line_of('star*.txt'), 0 })
+ feed('')
+ poke_eventloop()
+ eq(('zipfile://%s::names/star*.txt'):format(archive), api.nvim_buf_get_name(0))
+ eq({ 'content of star*.txt' }, lines())
+
+ for _, name in ipairs(names) do
+ edit(('zipfile://%s::names/%s'):format(archive, name))
+ eq({ 'content of ' .. name }, lines())
+ end
+ end)
+
it('keeps a leading dash in a path from becoming a backend option', function()
local archive = vim.fs.joinpath(root, 'poc.zip')
copy_fixture(vim.fs.joinpath(old_samples, 'poc.zip'), archive)