From 38cd7416e80b44bbd38e4b34c41834f48313d2be Mon Sep 17 00:00:00 2001
From: Ben Jackson <puremourning@gmail.com>
Date: Tue, 20 Oct 2020 12:15:49 +0100
Subject: [PATCH] Add way to backup/restore setting in tests

Added youcompleteme#test#setup#PushGlobal and PopGlobal, used in SetUp
and TearDown fixtures for individual test funcitons.
---
 test/completion.common.vim                    | 16 +++++-----
 .../lib/autoload/youcompleteme/test/setup.vim | 31 +++++++++++++++++++
 test/signature_help.test.vim                  | 20 ++++++------
 3 files changed, 50 insertions(+), 17 deletions(-)

diff --git a/test/completion.common.vim b/test/completion.common.vim
index fbee8ad2..e3c770e0 100644
--- a/test/completion.common.vim
+++ b/test/completion.common.vim
@@ -149,11 +149,11 @@ function! Test_Enter_Delete_Chars_Updates_Filter()
 endfunction
 
 function! SetUp_Test_Compl_No_Filetype()
-  let g:ycm_filetype_whitelist = {
+  call youcompleteme#test#setup#PushGlobal( 'ycm_filetype_whitelist', {
         \ '*': 1,
         \ 'ycm_nofiletype': 1
-        \ }
-  silent! call remove( g:ycm_filetype_blacklist, 'ycm_nofiletype' )
+        \ } )
+  call youcompleteme#test#setup#PushGlobal( 'ycm_filetype_blacklist', {} )
 endfunction
 
 function! Test_Compl_No_Filetype()
@@ -190,8 +190,8 @@ function! Test_Compl_No_Filetype()
 endfunction
 
 function! TearDown_Test_Compl_No_Filetype()
-  call remove( g:ycm_filetype_whitelist, 'ycm_nofiletype' )
-  let g:ycm_filetype_blacklist[ 'ycm_nofiletype' ] = 1
+  call youcompleteme#test#setup#PopGlobal( 'ycm_filetype_whitelist' )
+  call youcompleteme#test#setup#PopGlobal( 'ycm_filetype_blacklist' )
 endfunction
 
 function! Test_Compl_No_Filetype_Blacklisted()
@@ -232,9 +232,9 @@ function! OmniFuncTester( findstart, query )
 endfunction
 
 function! SetUp_Test_OmniComplete_Filter()
-  let g:ycm_semantic_triggers = {
+  call youcompleteme#test#setup#PushGlobal( 'ycm_semantic_triggers', {
         \ 'omnifunc_test': [ ':', '.' ]
-        \ }
+        \ } )
 endfunction
 
 function! Test_OmniComplete_Filter()
@@ -279,7 +279,7 @@ function! Test_OmniComplete_Filter()
 endfunction
 
 function! TearDown_Test_OmniComplete_Filter()
-  unlet g:ycm_semantic_triggers
+  call youcompleteme#test#setup#PopGlobal( 'ycm_semantic_triggers' )
 endfunction
 
 function! Test_OmniComplete_Force()
diff --git a/test/lib/autoload/youcompleteme/test/setup.vim b/test/lib/autoload/youcompleteme/test/setup.vim
index a4737edf..20a35554 100644
--- a/test/lib/autoload/youcompleteme/test/setup.vim
+++ b/test/lib/autoload/youcompleteme/test/setup.vim
@@ -63,3 +63,34 @@ function! youcompleteme#test#setup#OpenFile( f, kwargs ) abort
 
   " FIXME: We need a much more robust way to wait for the server to be ready
 endfunction
+
+let s:g_stack = {}
+
+function! youcompleteme#test#setup#PushGlobal( name, value )
+  if !has_key( s:g_stack, a:name )
+    let s:g_stack[ a:name ] = []
+  endif
+
+  let old_value = get( g:, a:name, v:null )
+  call add( s:g_stack[ a:name ], old_value )
+  call extend( g:, { a:name: a:value  } )
+
+  return old_value
+endfunction
+
+function! youcompleteme#test#setup#PopGlobal( name )
+  if !has_key( s:g_stack, a:name ) || len( s:g_stack[ a:name ] ) == 0
+    return v:null
+  endif
+
+  let old_value = s:g_stack[ a:name ][ -1 ]
+  call remove( s:g_stack[ a:name ], -1 )
+
+  if old_value is v:null
+    silent! call remove( g:, a:name )
+  else
+    call extend( g:, { a:name: old_value  } )
+  endif
+
+  return old_value
+endfunction
diff --git a/test/signature_help.test.vim b/test/signature_help.test.vim
index eac08998..a80663a9 100644
--- a/test/signature_help.test.vim
+++ b/test/signature_help.test.vim
@@ -574,7 +574,8 @@ endfunction
 
 function! SetUp_Test_Semantic_Completion_Popup_With_Sig_Help()
   set signcolumn=no
-  let g:ycm_add_preview_to_completeopt = 'popup'
+  call youcompleteme#test#setup#PushGlobal( 'ycm_add_preview_to_completeopt',
+                                          \ 'popup' )
 endfunction
 
 function! Test_Semantic_Completion_Popup_With_Sig_Help()
@@ -664,17 +665,18 @@ endfunction
 
 function! TearDown_Test_Semantic_Completion_Popup_With_Sig_Help()
   set signcolumn&
-  unlet! g:ycm_add_preview_to_completeopt
+  call youcompleteme#test#setup#PopGlobal( 'ycm_add_preview_to_completeopt' )
 endfunction
 
 function! SetUp_Test_Semantic_Completion_Popup_With_Sig_Help_EmptyBuf()
   set signcolumn=no
-  let g:ycm_filetype_whitelist = {
+  call youcompleteme#test#setup#PushGlobal( 'ycm_filetype_whitelist', {
         \ '*': 1,
         \ 'ycm_nofiletype': 1
-        \ }
-  silent! call remove( g:ycm_filetype_blacklist, 'ycm_nofiletype' )
-  let g:ycm_add_preview_to_completeopt = 'popup'
+        \ } )
+  call youcompleteme#test#setup#PushGlobal( 'ycm_filetype_blacklist', {} )
+  call youcompleteme#test#setup#PushGlobal( 'ycm_add_preview_to_completeopt',
+                                          \ 'popup' )
 endfunction
 
 function! Test_Semantic_Completion_Popup_With_Sig_Help_EmptyBuf()
@@ -775,7 +777,7 @@ endfunction
 
 function! TearDown_Test_Semantic_Completion_Popup_With_Sig_Help_EmptyBuf()
   set signcolumn&
-  unlet! g:ycm_add_preview_to_completeopt
-  call remove( g:ycm_filetype_whitelist, 'ycm_nofiletype' )
-  let g:ycm_filetype_blacklist[ 'ycm_nofiletype' ] = 1
+  call youcompleteme#test#setup#PopGlobal( 'ycm_filetype_whitelist' )
+  call youcompleteme#test#setup#PopGlobal( 'ycm_filetype_blacklist' )
+  call youcompleteme#test#setup#PopGlobal( 'ycm_add_preview_to_completeopt' )
 endfunction
-- 
2.29.1

