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)