mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-04 09:44:31 +00:00 
			
		
		
		
	- reimplement 'winhl' in terms of highlight namespaces - check for EOF in screen tests (to indicate a likely crash)
		
			
				
	
	
		
			299 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			299 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
local helpers = require('test.functional.helpers')(after_each)
 | 
						|
local Screen = require('test.functional.ui.screen')
 | 
						|
 | 
						|
local clear, insert = helpers.clear, helpers.insert
 | 
						|
local command = helpers.command
 | 
						|
local meths = helpers.meths
 | 
						|
local iswin = helpers.iswin
 | 
						|
local testprg = helpers.testprg
 | 
						|
local thelpers = require('test.functional.terminal.helpers')
 | 
						|
 | 
						|
describe('ext_hlstate detailed highlights', function()
 | 
						|
  local screen
 | 
						|
 | 
						|
  before_each(function()
 | 
						|
    clear()
 | 
						|
    command('syntax on')
 | 
						|
    command('hi VertSplit gui=reverse')
 | 
						|
    screen = Screen.new(40, 8)
 | 
						|
    screen:attach({ext_hlstate=true})
 | 
						|
  end)
 | 
						|
 | 
						|
  after_each(function()
 | 
						|
    screen:detach()
 | 
						|
  end)
 | 
						|
 | 
						|
 | 
						|
  it('work with combined UI and syntax highlights', function()
 | 
						|
    insert([[
 | 
						|
      these are some lines
 | 
						|
      with colorful text]])
 | 
						|
    meths.buf_add_highlight(0, -1, "String", 0 , 10, 14)
 | 
						|
    meths.buf_add_highlight(0, -1, "Statement", 1 , 5, -1)
 | 
						|
    command("/th co")
 | 
						|
 | 
						|
    screen:expect([[
 | 
						|
      these are {1:some} lines                    |
 | 
						|
      ^wi{2:th }{4:co}{3:lorful text}                      |
 | 
						|
      {5:~                                       }|
 | 
						|
      {5:~                                       }|
 | 
						|
      {5:~                                       }|
 | 
						|
      {5:~                                       }|
 | 
						|
      {5:~                                       }|
 | 
						|
      {8:search hit BOTTOM, continuing at TOP}{7:    }|
 | 
						|
    ]], {
 | 
						|
    [1] = {{foreground = Screen.colors.Magenta},
 | 
						|
           {{hi_name = "Constant", kind = "syntax"}}},
 | 
						|
    [2] = {{background = Screen.colors.Yellow},
 | 
						|
           {{hi_name = "Search", ui_name = "Search", kind = "ui"}}},
 | 
						|
    [3] = {{bold = true, foreground = Screen.colors.Brown},
 | 
						|
           {{hi_name = "Statement", kind = "syntax"}}},
 | 
						|
    [4] = {{bold = true, background = Screen.colors.Yellow, foreground = Screen.colors.Brown}, {3, 2}},
 | 
						|
    [5] = {{bold = true, foreground = Screen.colors.Blue1},
 | 
						|
           {{hi_name = "NonText", ui_name = "EndOfBuffer", kind = "ui"}}},
 | 
						|
    [6] = {{foreground = Screen.colors.Red},
 | 
						|
           {{hi_name = "WarningMsg", ui_name = "WarningMsg", kind = "ui"}}},
 | 
						|
    [7] = {{}, {{hi_name = "MsgArea", ui_name = "MsgArea", kind = "ui"}}},
 | 
						|
    [8] = {{foreground = Screen.colors.Red}, {7, 6}},
 | 
						|
    })
 | 
						|
  end)
 | 
						|
 | 
						|
  it('work with cleared UI highlights', function()
 | 
						|
    screen:set_default_attr_ids({
 | 
						|
      [1] = {{}, {{hi_name = "Normal", ui_name = "WinSeparator", kind = "ui"}}},
 | 
						|
      [2] = {{bold = true, foreground = Screen.colors.Blue1},
 | 
						|
             {{hi_name = "NonText", ui_name = "EndOfBuffer", kind = "ui"}}},
 | 
						|
      [3] = {{bold = true, reverse = true},
 | 
						|
            {{hi_name = "StatusLine", ui_name = "StatusLine", kind = "ui"}}} ,
 | 
						|
      [4] = {{reverse = true},
 | 
						|
            {{hi_name = "StatusLineNC", ui_name = "StatusLineNC" , kind = "ui"}}},
 | 
						|
      [5] = {{}, {{hi_name = "StatusLine", ui_name = "StatusLine", kind = "ui"}}},
 | 
						|
      [6] = {{}, {{hi_name = "StatusLineNC", ui_name = "StatusLineNC", kind = "ui"}}},
 | 
						|
      [7] = {{}, {{hi_name = "MsgArea", ui_name = "MsgArea", kind = "ui"}}},
 | 
						|
    })
 | 
						|
    command("hi clear VertSplit")
 | 
						|
    command("vsplit")
 | 
						|
 | 
						|
    screen:expect([[
 | 
						|
      ^                    {1:│}                   |
 | 
						|
      {2:~                   }{1:│}{2:~                  }|
 | 
						|
      {2:~                   }{1:│}{2:~                  }|
 | 
						|
      {2:~                   }{1:│}{2:~                  }|
 | 
						|
      {2:~                   }{1:│}{2:~                  }|
 | 
						|
      {2:~                   }{1:│}{2:~                  }|
 | 
						|
      {3:[No Name]            }{4:[No Name]          }|
 | 
						|
      {7:                                        }|
 | 
						|
    ]])
 | 
						|
 | 
						|
    command("hi clear StatusLine | hi clear StatuslineNC")
 | 
						|
    screen:expect([[
 | 
						|
      ^                    {1:│}                   |
 | 
						|
      {2:~                   }{1:│}{2:~                  }|
 | 
						|
      {2:~                   }{1:│}{2:~                  }|
 | 
						|
      {2:~                   }{1:│}{2:~                  }|
 | 
						|
      {2:~                   }{1:│}{2:~                  }|
 | 
						|
      {2:~                   }{1:│}{2:~                  }|
 | 
						|
      {5:[No Name]            }{6:[No Name]          }|
 | 
						|
      {7:                                        }|
 | 
						|
    ]])
 | 
						|
 | 
						|
    -- redrawing is done even if visible highlights didn't change
 | 
						|
    command("wincmd w")
 | 
						|
    screen:expect([[
 | 
						|
                         {1:│}^                    |
 | 
						|
      {2:~                  }{1:│}{2:~                   }|
 | 
						|
      {2:~                  }{1:│}{2:~                   }|
 | 
						|
      {2:~                  }{1:│}{2:~                   }|
 | 
						|
      {2:~                  }{1:│}{2:~                   }|
 | 
						|
      {2:~                  }{1:│}{2:~                   }|
 | 
						|
      {6:[No Name]           }{5:[No Name]           }|
 | 
						|
      {7:                                        }|
 | 
						|
    ]])
 | 
						|
 | 
						|
  end)
 | 
						|
 | 
						|
  it("work with window-local highlights", function()
 | 
						|
    screen:set_default_attr_ids({
 | 
						|
        [1] = {{foreground = Screen.colors.Brown}, {{hi_name = "LineNr", ui_name = "LineNr", kind = "ui"}}},
 | 
						|
        [2] = {{bold = true, foreground = Screen.colors.Blue1}, {{hi_name = "NonText", ui_name = "EndOfBuffer", kind = "ui"}}},
 | 
						|
        [3] = {{bold = true, reverse = true}, {{hi_name = "StatusLine", ui_name = "StatusLine", kind = "ui"}}},
 | 
						|
        [4] = {{reverse = true}, {{hi_name = "StatusLineNC", ui_name = "StatusLineNC", kind = "ui"}}},
 | 
						|
        [5] = {{background = Screen.colors.Red, foreground = Screen.colors.Grey100}, {{hi_name = "ErrorMsg", ui_name = "LineNr", kind = "ui"}}},
 | 
						|
        [6] = {{bold = true, reverse = true}, {{hi_name = "Normal", ui_name = "Normal", kind = "ui"}}},
 | 
						|
        [7] = {{foreground = Screen.colors.Brown, bold = true, reverse = true}, {6, 1}},
 | 
						|
        [8] = {{foreground = Screen.colors.Blue1, bold = true, reverse = true}, {6, 14}},
 | 
						|
        [9] = {{bold = true, foreground = Screen.colors.Brown}, {{hi_name = "NormalNC", ui_name = "NormalNC", kind = "ui"}}},
 | 
						|
        [10] = {{bold = true, foreground = Screen.colors.Brown}, {9, 1}},
 | 
						|
        [11] = {{bold = true, foreground = Screen.colors.Blue1}, {9, 14}},
 | 
						|
        [12] = {{}, {{hi_name = "MsgArea", ui_name = "MsgArea", kind = "ui"}}},
 | 
						|
        [13] = {{background = Screen.colors.Red1, foreground = Screen.colors.Gray100}, {{ui_name = "LineNr", kind = "ui", hi_name = "LineNr"}}};
 | 
						|
        [14] = {{bold = true, foreground = Screen.colors.Blue}, {{ui_name = "EndOfBuffer", kind = "ui", hi_name = "EndOfBuffer"}}};
 | 
						|
    })
 | 
						|
 | 
						|
    command("set number")
 | 
						|
    command("split")
 | 
						|
    -- NormalNC is not applied if not set, to avoid spurious redraws
 | 
						|
    screen:expect([[
 | 
						|
      {1:  1 }^                                    |
 | 
						|
      {2:~                                       }|
 | 
						|
      {2:~                                       }|
 | 
						|
      {3:[No Name]                               }|
 | 
						|
      {1:  1 }                                    |
 | 
						|
      {2:~                                       }|
 | 
						|
      {4:[No Name]                               }|
 | 
						|
      {12:                                        }|
 | 
						|
    ]])
 | 
						|
 | 
						|
    command("set winhl=LineNr:ErrorMsg")
 | 
						|
    screen:expect{grid=[[
 | 
						|
      {13:  1 }^                                    |
 | 
						|
      {14:~                                       }|
 | 
						|
      {14:~                                       }|
 | 
						|
      {3:[No Name]                               }|
 | 
						|
      {1:  1 }                                    |
 | 
						|
      {2:~                                       }|
 | 
						|
      {4:[No Name]                               }|
 | 
						|
      {12:                                        }|
 | 
						|
    ]]}
 | 
						|
 | 
						|
    command("set winhl=Normal:MsgSeparator,NormalNC:Statement")
 | 
						|
    screen:expect([[
 | 
						|
      {7:  1 }{6:^                                    }|
 | 
						|
      {8:~                                       }|
 | 
						|
      {8:~                                       }|
 | 
						|
      {3:[No Name]                               }|
 | 
						|
      {1:  1 }                                    |
 | 
						|
      {2:~                                       }|
 | 
						|
      {4:[No Name]                               }|
 | 
						|
      {12:                                        }|
 | 
						|
    ]])
 | 
						|
 | 
						|
    command("wincmd w")
 | 
						|
    screen:expect([[
 | 
						|
      {10:  1 }{9:                                    }|
 | 
						|
      {11:~                                       }|
 | 
						|
      {11:~                                       }|
 | 
						|
      {4:[No Name]                               }|
 | 
						|
      {1:  1 }^                                    |
 | 
						|
      {2:~                                       }|
 | 
						|
      {3:[No Name]                               }|
 | 
						|
      {12:                                        }|
 | 
						|
    ]])
 | 
						|
  end)
 | 
						|
 | 
						|
  it("work with :terminal", function()
 | 
						|
    if helpers.pending_win32(pending) then return end
 | 
						|
 | 
						|
    screen:set_default_attr_ids({
 | 
						|
      [1] = {{}, {{hi_name = "TermCursorNC", ui_name = "TermCursorNC", kind = "ui"}}},
 | 
						|
      [2] = {{foreground = tonumber('0x00ccff'), fg_indexed=true}, {{kind = "term"}}},
 | 
						|
      [3] = {{bold = true, foreground = tonumber('0x00ccff'), fg_indexed=true}, {{kind = "term"}}},
 | 
						|
      [4] = {{foreground = tonumber('0x00ccff'), fg_indexed=true}, {2, 1}},
 | 
						|
      [5] = {{foreground = tonumber('0x40ffff'), fg_indexed=true}, {{kind = "term"}}},
 | 
						|
      [6] = {{foreground = tonumber('0x40ffff'), fg_indexed=true}, {5, 1}},
 | 
						|
      [7] = {{}, {{hi_name = "MsgArea", ui_name = "MsgArea", kind = "ui"}}},
 | 
						|
    })
 | 
						|
    command(("enew | call termopen(['%s'])"):format(testprg('tty-test')))
 | 
						|
    screen:expect([[
 | 
						|
      ^tty ready                               |
 | 
						|
      {1: }                                       |
 | 
						|
                                              |
 | 
						|
                                              |
 | 
						|
                                              |
 | 
						|
                                              |
 | 
						|
                                              |
 | 
						|
      {7:                                        }|
 | 
						|
    ]])
 | 
						|
 | 
						|
    thelpers.feed_data('x ')
 | 
						|
    thelpers.set_fg(45)
 | 
						|
    thelpers.feed_data('y ')
 | 
						|
    thelpers.set_bold()
 | 
						|
    thelpers.feed_data('z\n')
 | 
						|
    -- TODO(bfredl): check if this distinction makes sense
 | 
						|
    if iswin() then
 | 
						|
      screen:expect([[
 | 
						|
        ^tty ready                               |
 | 
						|
        x {5:y z}                                   |
 | 
						|
        {1: }                                       |
 | 
						|
                                                |
 | 
						|
                                                |
 | 
						|
                                                |
 | 
						|
                                                |
 | 
						|
        {7:                                        }|
 | 
						|
      ]])
 | 
						|
    else
 | 
						|
      screen:expect([[
 | 
						|
        ^tty ready                               |
 | 
						|
        x {2:y }{3:z}                                   |
 | 
						|
        {1: }                                       |
 | 
						|
                                                |
 | 
						|
                                                |
 | 
						|
                                                |
 | 
						|
                                                |
 | 
						|
        {7:                                        }|
 | 
						|
      ]])
 | 
						|
    end
 | 
						|
 | 
						|
    thelpers.feed_termcode("[A")
 | 
						|
    thelpers.feed_termcode("[2C")
 | 
						|
    if iswin() then
 | 
						|
      screen:expect([[
 | 
						|
        ^tty ready                               |
 | 
						|
        x {6:y}{5: z}                                   |
 | 
						|
                                                |
 | 
						|
                                                |
 | 
						|
                                                |
 | 
						|
                                                |
 | 
						|
                                                |
 | 
						|
        {7:                                        }|
 | 
						|
      ]])
 | 
						|
    else
 | 
						|
      screen:expect([[
 | 
						|
        ^tty ready                               |
 | 
						|
        x {4:y}{2: }{3:z}                                   |
 | 
						|
                                                |
 | 
						|
                                                |
 | 
						|
                                                |
 | 
						|
                                                |
 | 
						|
                                                |
 | 
						|
        {7:                                        }|
 | 
						|
      ]])
 | 
						|
    end
 | 
						|
  end)
 | 
						|
 | 
						|
  it("can use independent cterm and rgb colors", function()
 | 
						|
    -- tell test module to save all attributes (doesn't change nvim options)
 | 
						|
    screen:set_rgb_cterm(true)
 | 
						|
 | 
						|
    screen:set_default_attr_ids({
 | 
						|
        [1] = {{bold = true, foreground = Screen.colors.Blue1}, {foreground = 12}, {{hi_name = "NonText", ui_name = "EndOfBuffer", kind = "ui"}}},
 | 
						|
        [2] = {{reverse = true, foreground = Screen.colors.Red}, {foreground = 10, italic=true}, {{hi_name = "NonText", ui_name = "EndOfBuffer", kind = "ui"}}},
 | 
						|
        [3] = {{}, {}, {{hi_name = "MsgArea", ui_name = "MsgArea", kind = "ui"}}},
 | 
						|
    })
 | 
						|
    screen:expect([[
 | 
						|
      ^                                        |
 | 
						|
      {1:~                                       }|
 | 
						|
      {1:~                                       }|
 | 
						|
      {1:~                                       }|
 | 
						|
      {1:~                                       }|
 | 
						|
      {1:~                                       }|
 | 
						|
      {1:~                                       }|
 | 
						|
      {3:                                        }|
 | 
						|
    ]])
 | 
						|
 | 
						|
    command("hi NonText guifg=Red gui=reverse ctermfg=Green cterm=italic")
 | 
						|
    screen:expect([[
 | 
						|
      ^                                        |
 | 
						|
      {2:~                                       }|
 | 
						|
      {2:~                                       }|
 | 
						|
      {2:~                                       }|
 | 
						|
      {2:~                                       }|
 | 
						|
      {2:~                                       }|
 | 
						|
      {2:~                                       }|
 | 
						|
      {3:                                        }|
 | 
						|
    ]])
 | 
						|
 | 
						|
  end)
 | 
						|
end)
 |