patch 8.2.3628: looking terminal colors is a bit slow

Problem:    Looking terminal colors is a bit slow.
Solution:   Cache the terminal colors. (closes #9130, closes #9058)
diff --git a/src/testdir/test_terminal3.vim b/src/testdir/test_terminal3.vim
index f4cc38a..9f84615 100644
--- a/src/testdir/test_terminal3.vim
+++ b/src/testdir/test_terminal3.vim
@@ -66,6 +66,177 @@
   call assert_fails('terminal ++xyz', 'E181:')
 endfunc
 
+" Check a terminal with different colors
+func Terminal_color(group_name, highlight_cmds, highlight_opt, open_cmds)
+  CheckRunVimInTerminal
+  CheckUnix
+
+  let lines = [
+	\ 'call setline(1, range(20))',
+	\ 'func OpenTerm()',
+	\ '  set noruler',
+	\ "  call term_start('cat', #{vertical: 1, " .. a:highlight_opt .. "})",
+	\ ] + a:open_cmds + [
+	\ 'endfunc',
+	\ ] + a:highlight_cmds
+  call writefile(lines, 'XtermStart')
+  let buf = RunVimInTerminal('-S XtermStart', #{rows: 15})
+  call TermWait(buf, 100)
+  call term_sendkeys(buf, ":call OpenTerm()\<CR>")
+  call TermWait(buf, 50)
+  call term_sendkeys(buf, "hello\<CR>")
+  call VerifyScreenDump(buf, 'Test_terminal_color_' .. a:group_name, {})
+
+  call term_sendkeys(buf, "\<C-D>")
+  call TermWait(buf, 50)
+  call StopVimInTerminal(buf)
+  call delete('XtermStart')
+endfunc
+
+func Test_terminal_color_Terminal()
+  call Terminal_color("Terminal", [
+  \ "highlight Terminal ctermfg=blue ctermbg=yellow",
+  \ ], "", [])
+endfunc
+
+func Test_terminal_color_group()
+  call Terminal_color("MyTermCol", [
+  \ "highlight MyTermCol ctermfg=darkgreen ctermbg=lightblue",
+  \ ], "term_highlight: 'MyTermCol',", [])
+endfunc
+
+func Test_terminal_color_wincolor()
+  call Terminal_color("MyWinCol", [
+  \ "highlight MyWinCol ctermfg=red ctermbg=darkyellow",
+  \ ], "", [
+  \ 'set wincolor=MyWinCol',
+  \ ])
+endfunc
+
+func Test_terminal_color_group_over_Terminal()
+  call Terminal_color("MyTermCol_over_Terminal", [
+  \ "highlight Terminal ctermfg=blue ctermbg=yellow",
+  \ "highlight MyTermCol ctermfg=darkgreen ctermbg=lightblue",
+  \ ], "term_highlight: 'MyTermCol',", [])
+endfunc
+
+func Test_terminal_color_wincolor_over_group()
+  call Terminal_color("MyWinCol_over_group", [
+  \ "highlight MyTermCol ctermfg=darkgreen ctermbg=lightblue",
+  \ "highlight MyWinCol ctermfg=red ctermbg=darkyellow",
+  \ ], "term_highlight: 'MyTermCol',", [
+  \ 'set wincolor=MyWinCol',
+  \ ])
+endfunc
+
+func Test_terminal_color_wincolor_split()
+  CheckRunVimInTerminal
+  CheckUnix
+
+  let lines = [
+	\ 'call setline(1, range(20))',
+	\ 'func OpenTerm()',
+	\ '  set noruler',
+	\ "  call term_start('cat', #{vertical: 1, term_highlight: 'MyTermCol'})",
+	\ 'endfunc',
+  \ 'highlight MyTermCol ctermfg=darkgreen ctermbg=lightblue',
+  \ 'highlight MyWinCol ctermfg=red ctermbg=darkyellow',
+  \ 'highlight MyWinCol2 ctermfg=black ctermbg=blue',
+	\ ]
+  call writefile(lines, 'XtermStart')
+  let buf = RunVimInTerminal('-S XtermStart', #{rows: 15})
+  call TermWait(buf, 100)
+  call term_sendkeys(buf, ":call OpenTerm()\<CR>")
+  call TermWait(buf, 50)
+  call term_sendkeys(buf, "hello\<CR>")
+  call TermWait(buf, 50)
+
+  call term_sendkeys(buf, "\<C-W>:split\<CR>")
+  call term_sendkeys(buf, "\<C-W>:set wincolor=MyWinCol\<CR>")
+  call VerifyScreenDump(buf, 'Test_terminal_wincolor_split_MyWinCol', {})
+
+  call term_sendkeys(buf, "\<C-W>b:2sb\<CR>")
+  call term_sendkeys(buf, "\<C-W>:set wincolor=MyWinCol2\<CR>")
+  call VerifyScreenDump(buf, 'Test_terminal_wincolor_split_MyWinCol2', {})
+
+  call term_sendkeys(buf, "\<C-D>")
+  call TermWait(buf, 50)
+  call StopVimInTerminal(buf)
+  call delete('XtermStart')
+endfunc
+
+func Test_terminal_color_transp_Terminal()
+  call Terminal_color("transp_Terminal", [
+  \ "highlight Terminal ctermfg=blue",
+  \ ], "", [])
+endfunc
+
+func Test_terminal_color_transp_group()
+  call Terminal_color("transp_MyTermCol", [
+  \ "highlight MyTermCol ctermfg=darkgreen",
+  \ ], "term_highlight: 'MyTermCol',", [])
+endfunc
+
+func Test_terminal_color_transp_wincolor()
+  call Terminal_color("transp_MyWinCol", [
+  \ "highlight MyWinCol ctermfg=red",
+  \ ], "", [
+  \ 'set wincolor=MyWinCol',
+  \ ])
+endfunc
+
+func Test_terminal_color_gui_Terminal()
+  CheckFeature termguicolors
+  call Terminal_color("gui_Terminal", [
+  \ "set termguicolors",
+  \ "highlight Terminal guifg=#3344ff guibg=#b0a700",
+  \ ], "", [])
+endfunc
+
+func Test_terminal_color_gui_group()
+  CheckFeature termguicolors
+  call Terminal_color("gui_MyTermCol", [
+  \ "set termguicolors",
+  \ "highlight MyTermCol guifg=#007800 guibg=#6789ff",
+  \ ], "term_highlight: 'MyTermCol',", [])
+endfunc
+
+func Test_terminal_color_gui_wincolor()
+  CheckFeature termguicolors
+  call Terminal_color("gui_MyWinCol", [
+  \ "set termguicolors",
+  \ "highlight MyWinCol guifg=#fe1122 guibg=#818100",
+  \ ], "", [
+  \ 'set wincolor=MyWinCol',
+  \ ])
+endfunc
+
+func Test_terminal_color_gui_transp_Terminal()
+  CheckFeature termguicolors
+  call Terminal_color("gui_transp_Terminal", [
+  \ "set termguicolors",
+  \ "highlight Terminal guifg=#3344ff",
+  \ ], "", [])
+endfunc
+
+func Test_terminal_color_gui_transp_group()
+  CheckFeature termguicolors
+  call Terminal_color("gui_transp_MyTermCol", [
+  \ "set termguicolors",
+  \ "highlight MyTermCol guifg=#007800",
+  \ ], "term_highlight: 'MyTermCol',", [])
+endfunc
+
+func Test_terminal_color_gui_transp_wincolor()
+  CheckFeature termguicolors
+  call Terminal_color("gui_transp_MyWinCol", [
+  \ "set termguicolors",
+  \ "highlight MyWinCol guifg=#fe1122",
+  \ ], "", [
+  \ 'set wincolor=MyWinCol',
+  \ ])
+endfunc
+
 func Test_terminal_in_popup()
   CheckRunVimInTerminal
 
@@ -180,7 +351,7 @@
 endfunc
 
 " Check a terminal in popup window with different colors
-func Terminal_in_popup_colored(group_name, highlight_cmd, highlight_opt)
+func Terminal_in_popup_color(group_name, highlight_cmds, highlight_opt, popup_cmds, popup_opt)
   CheckRunVimInTerminal
   CheckUnix
 
@@ -189,10 +360,11 @@
 	\ 'func OpenTerm()',
 	\ "  let s:buf = term_start('cat', #{hidden: 1, "
 	\ .. a:highlight_opt .. "})",
-	\ '  let g:winid = popup_create(s:buf, #{ border: []})',
+	\ '  let g:winid = popup_create(s:buf, #{border: [], '
+  \ .. a:popup_opt .. '})',
+  \ ] + a:popup_cmds + [
 	\ 'endfunc',
-	\ a:highlight_cmd,
-	\ ]
+	\ ] + a:highlight_cmds
   call writefile(lines, 'XtermPopup')
   let buf = RunVimInTerminal('-S XtermPopup', #{rows: 15})
   call TermWait(buf, 100)
@@ -210,12 +382,140 @@
   call delete('XtermPopup')
 endfunc
 
-func Test_terminal_in_popup_colored_Terminal()
-  call Terminal_in_popup_colored("Terminal", "highlight Terminal ctermfg=blue ctermbg=yellow", "")
+func Test_terminal_in_popup_color_Terminal()
+  call Terminal_in_popup_color("Terminal", [
+  \ "highlight Terminal ctermfg=blue ctermbg=yellow",
+  \ ], "", [], "")
 endfunc
 
-func Test_terminal_in_popup_colored_group()
-  call Terminal_in_popup_colored("MyTermCol", "highlight MyTermCol ctermfg=darkgreen ctermbg=lightblue", "term_highlight: 'MyTermCol',")
+func Test_terminal_in_popup_color_group()
+  call Terminal_in_popup_color("MyTermCol", [
+  \ "highlight MyTermCol ctermfg=darkgreen ctermbg=lightblue",
+  \ ], "term_highlight: 'MyTermCol',", [], "")
+endfunc
+
+func Test_terminal_in_popup_color_wincolor()
+  call Terminal_in_popup_color("MyWinCol", [
+  \ "highlight MyWinCol ctermfg=red ctermbg=darkyellow",
+  \ ], "", [
+  \ 'call setwinvar(g:winid, "&wincolor", "MyWinCol")',
+  \ ], "")
+endfunc
+
+func Test_terminal_in_popup_color_popup_highlight()
+  call Terminal_in_popup_color("MyPopupHlCol", [
+  \ "highlight MyPopupHlCol ctermfg=cyan ctermbg=green",
+  \ ], "", [], "highlight: 'MyPopupHlCol'")
+endfunc
+
+func Test_terminal_in_popup_color_group_over_Terminal()
+  call Terminal_in_popup_color("MyTermCol_over_Terminal", [
+  \ "highlight Terminal ctermfg=blue ctermbg=yellow",
+  \ "highlight MyTermCol ctermfg=darkgreen ctermbg=lightblue",
+  \ ], "term_highlight: 'MyTermCol',", [], "")
+endfunc
+
+func Test_terminal_in_popup_color_wincolor_over_group()
+  call Terminal_in_popup_color("MyWinCol_over_group", [
+  \ "highlight MyTermCol ctermfg=darkgreen ctermbg=lightblue",
+  \ "highlight MyWinCol ctermfg=red ctermbg=darkyellow",
+  \ ], "term_highlight: 'MyTermCol',", [
+  \ 'call setwinvar(g:winid, "&wincolor", "MyWinCol")',
+  \ ], "")
+endfunc
+
+func Test_terminal_in_popup_color_transp_Terminal()
+  call Terminal_in_popup_color("transp_Terminal", [
+  \ "highlight Terminal ctermfg=blue",
+  \ ], "", [], "")
+endfunc
+
+func Test_terminal_in_popup_color_transp_group()
+  call Terminal_in_popup_color("transp_MyTermCol", [
+  \ "highlight MyTermCol ctermfg=darkgreen",
+  \ ], "term_highlight: 'MyTermCol',", [], "")
+endfunc
+
+func Test_terminal_in_popup_color_transp_wincolor()
+  call Terminal_in_popup_color("transp_MyWinCol", [
+  \ "highlight MyWinCol ctermfg=red",
+  \ ], "", [
+  \ 'call setwinvar(g:winid, "&wincolor", "MyWinCol")',
+  \ ], "")
+endfunc
+
+func Test_terminal_in_popup_color_transp_popup_highlight()
+  call Terminal_in_popup_color("transp_MyPopupHlCol", [
+  \ "highlight MyPopupHlCol ctermfg=cyan",
+  \ ], "", [], "highlight: 'MyPopupHlCol'")
+endfunc
+
+func Test_terminal_in_popup_color_gui_Terminal()
+  CheckFeature termguicolors
+  call Terminal_in_popup_color("gui_Terminal", [
+  \ "set termguicolors",
+  \ "highlight Terminal guifg=#3344ff guibg=#b0a700",
+  \ ], "", [], "")
+endfunc
+
+func Test_terminal_in_popup_color_gui_group()
+  CheckFeature termguicolors
+  call Terminal_in_popup_color("gui_MyTermCol", [
+  \ "set termguicolors",
+  \ "highlight MyTermCol guifg=#007800 guibg=#6789ff",
+  \ ], "term_highlight: 'MyTermCol',", [], "")
+endfunc
+
+func Test_terminal_in_popup_color_gui_wincolor()
+  CheckFeature termguicolors
+  call Terminal_in_popup_color("gui_MyWinCol", [
+  \ "set termguicolors",
+  \ "highlight MyWinCol guifg=#fe1122 guibg=#818100",
+  \ ], "", [
+  \ 'call setwinvar(g:winid, "&wincolor", "MyWinCol")',
+  \ ], "")
+endfunc
+
+func Test_terminal_in_popup_color_gui_popup_highlight()
+  CheckFeature termguicolors
+  call Terminal_in_popup_color("gui_MyPopupHlCol", [
+  \ "set termguicolors",
+  \ "highlight MyPopupHlCol guifg=#00e8f0 guibg=#126521",
+  \ ], "", [], "highlight: 'MyPopupHlCol'")
+endfunc
+
+func Test_terminal_in_popup_color_gui_transp_Terminal()
+  CheckFeature termguicolors
+  call Terminal_in_popup_color("gui_transp_Terminal", [
+  \ "set termguicolors",
+  \ "highlight Terminal guifg=#3344ff",
+  \ ], "", [], "")
+endfunc
+
+func Test_terminal_in_popup_color_gui_transp_group()
+  CheckFeature termguicolors
+  call Terminal_in_popup_color("gui_transp_MyTermCol", [
+  \ "set termguicolors",
+  \ "highlight MyTermCol guifg=#007800",
+  \ ], "term_highlight: 'MyTermCol',", [], "")
+endfunc
+
+func Test_terminal_in_popup_color_gui_transp_wincolor()
+  CheckFeature termguicolors
+  call Terminal_in_popup_color("gui_transp_MyWinCol", [
+  \ "set termguicolors",
+  \ "highlight MyWinCol guifg=#fe1122",
+  \ ], "", [
+  \ 'call setwinvar(g:winid, "&wincolor", "MyWinCol")',
+  \ ], "")
+endfunc
+
+func Test_terminal_in_popup_color_gui_transp_popup_highlight()
+  CheckFeature termguicolors
+  call Terminal_in_popup_color("gui_transp_MyPopupHlCol", [
+  \ "set termguicolors",
+  \ "highlight MyPopupHlCol guifg=#00e8f0",
+  \ ], "", [], "highlight: 'MyPopupHlCol'")
 endfunc
 
 func Test_double_popup_terminal()
@@ -411,7 +711,7 @@
   call TermWait(buf, 50)
   call assert_equal('yellow', readfile('Xbuf')[0])
 
-  " Test for selecting text using doubleclick
+  " Test for selecting text using double click
   call delete('Xbuf')
   call test_setmouse(1, 11)
   call term_sendkeys(buf, "\<LeftMouse>\<LeftRelease>\<LeftMouse>")
@@ -431,7 +731,7 @@
   call TermWait(buf, 50)
   call assert_equal("vim emacs sublime nano\n", readfile('Xbuf')[0])
 
-  " Test for selecting a block using qudraple click
+  " Test for selecting a block using quadruple click
   call delete('Xbuf')
   call test_setmouse(1, 11)
   call term_sendkeys(buf, "\<LeftMouse>\<LeftRelease>\<LeftMouse>\<LeftRelease>\<LeftMouse>\<LeftRelease>\<LeftMouse>")