@@ -40,6 +40,16 @@ local function to_text(lines)
4040 return table.concat (lines , " \n " ) .. " \n "
4141end
4242
43+ local function test_source (label , lines )
44+ return {
45+ label = label ,
46+ path = label ,
47+ lines = lines ,
48+ text = to_text (lines ),
49+ filetype = " " ,
50+ }
51+ end
52+
4353local function assert_eq (a , b , msg )
4454 if a ~= b then
4555 error ((msg or " assertion failed" ) .. string.format (" \n Expected: %s\n Actual: %s" , tostring (b ), tostring (a )))
@@ -63,6 +73,109 @@ assert_eq(config.ui.scroll_debounce_ms, 16, "Viewport scroll rerenders should de
6373assert_eq (config .merge .result_initial_content , " base" , " Merge result should initialize from the base by default" )
6474assert_eq (config .merge .keys .accept_local , " >>" , " Merge accept-local key should default to >>" )
6575
76+ do
77+ local original_showtabline = vim .o .showtabline
78+ for _ , value in ipairs ({ 0 , 1 , 2 }) do
79+ vim .o .showtabline = value
80+ local session = assert ((Session .start ({
81+ left = test_source (" tabline-left.txt" , { " one" }),
82+ right = test_source (" tabline-right.txt" , { " two" }),
83+ }, config , {})))
84+ assert_eq (vim .o .showtabline , value ,
85+ " Starting a diff session should not mutate global showtabline=" .. tostring (value ))
86+ session :close ()
87+ assert_eq (vim .o .showtabline , value ,
88+ " Closing a diff session should preserve global showtabline=" .. tostring (value ))
89+ end
90+ vim .o .showtabline = original_showtabline
91+ end
92+
93+ do
94+ local original_list = vim .o .list
95+ local original_listchars = vim .o .listchars
96+ vim .o .list = true
97+ vim .o .listchars = " trail:·"
98+
99+ local function win_list (win )
100+ return vim .api .nvim_get_option_value (" list" , { scope = " local" , win = win })
101+ end
102+
103+ local session = assert ((Session .start ({
104+ left = test_source (" list-left.txt" , { " one " }),
105+ right = test_source (" list-right.txt" , { " two " }),
106+ }, config , {
107+ panel = true ,
108+ queue = { entries = {} },
109+ })))
110+ assert_eq (win_list (session .left_win ), true ,
111+ " Diff source panes should retain user list rendering" )
112+ assert_eq (win_list (session .right_win ), true ,
113+ " Diff target panes should retain user list rendering" )
114+ for _ , win in ipairs ({
115+ session .left_overview_win ,
116+ session .left_num_win ,
117+ session .connector_win ,
118+ session .right_num_win ,
119+ session .right_overview_win ,
120+ session .left_header_win ,
121+ session .center_header_win ,
122+ session .right_header_win ,
123+ session .panel and session .panel .nav_win ,
124+ session .panel and session .panel .commit_win ,
125+ }) do
126+ if win then
127+ assert_eq (win_list (win ), false ,
128+ " Diff visual chrome panes should suppress listchars" )
129+ end
130+ end
131+ session :close ()
132+
133+ local merge_session = assert ((merge_mod .start ({
134+ root = root ,
135+ path = " merge-list.txt" ,
136+ base_lines = { " base " },
137+ local_lines = { " local " },
138+ remote_lines = { " remote " },
139+ result_lines = { " base " },
140+ conflicts = {},
141+ non_conflicting = {},
142+ local_hunks = {},
143+ remote_hunks = {},
144+ }, config , {
145+ panel = true ,
146+ queue = { entries = {} },
147+ })))
148+ assert_eq (win_list (merge_session .local_win ), true ,
149+ " Merge local pane should retain user list rendering" )
150+ assert_eq (win_list (merge_session .result_win ), true ,
151+ " Merge result pane should retain user list rendering" )
152+ assert_eq (win_list (merge_session .remote_win ), true ,
153+ " Merge remote pane should retain user list rendering" )
154+ for _ , win in ipairs ({
155+ merge_session .local_num_win ,
156+ merge_session .local_result_connector_win ,
157+ merge_session .result_left_num_win ,
158+ merge_session .result_right_num_win ,
159+ merge_session .result_remote_connector_win ,
160+ merge_session .remote_num_win ,
161+ merge_session .local_header_win ,
162+ merge_session .result_header_win ,
163+ merge_session .remote_header_win ,
164+ merge_session .panel and merge_session .panel .nav_win ,
165+ merge_session .panel and merge_session .panel .commit_win ,
166+ }) do
167+ if win then
168+ assert_eq (win_list (win ), false ,
169+ " Merge visual chrome panes should suppress listchars" )
170+ end
171+ end
172+ pcall (vim .api .nvim_set_option_value , " modified" , false , { buf = merge_session .result_buf })
173+ merge_session :close ()
174+
175+ vim .o .list = original_list
176+ vim .o .listchars = original_listchars
177+ end
178+
66179local function get_hl (name )
67180 return vim .api .nvim_get_hl (0 , { name = name , link = false })
68181end
0 commit comments