-- Tests for 'undolevel' setting being global-local

local helpers = require('test.functional.helpers')
local feed, insert, source = helpers.feed, helpers.insert, helpers.source
local clear, execute, expect = helpers.clear, helpers.execute, helpers.expect

describe('undolevel', function()
  setup(clear)

  it('is working', function()
    source([[
      set ul=5
      fu! FillBuffer()
        for i in range(1,13)
          put=i
          exe "setg ul=" . &g:ul
        endfor
      endfu
      fu! UndoLevel()
        redir @z 
          setglobal undolevels? 
          echon ' global' 
          setlocal undolevels? 
          echon ' local' 
        redir end
        $put z
      endfu

      0put ='ONE: expecting global undolevels: 5, local undolevels: -123456 (default)'
      call FillBuffer()
      setlocal undolevels<
      earlier 10
      call UndoLevel()
      set ff=unix
      %yank A
      %delete

      0put ='TWO: expecting global undolevels: 5, local undolevels: 2 (first) then 10 (afterwards)'
      setlocal ul=2
      call FillBuffer()
      earlier 10
      call UndoLevel()
      setlocal ul=10
      call UndoLevel()
      set ff=unix
      %yank A
      %delete
      setlocal undolevels<
      redir @A
        echo "global value shouldn't be changed and still be 5!" 
        echo 'ONE: expecting global undolevels: 5, local undolevels: -123456 (default)'
        setglobal undolevels? 
        echon ' global' 
        setlocal undolevels? 
        echon ' local' 
        echo "" 
      redir end

      setglobal ul=50
      1put ='global value should be changed to 50'
      2put ='THREE: expecting global undolevels: 50, local undolevels: -123456 (default)'
      call UndoLevel()
      set ff=unix
      %yank A
      %delete
      setglobal lispwords=foo,bar,baz
      setlocal lispwords-=foo 
      setlocal lispwords+=quux
      redir @A
        echo "Testing 'lispwords' local value" 
        setglobal lispwords? 
        setlocal lispwords? 
        echo &lispwords 
        echo ''
      redir end
      setlocal lispwords<
      redir @A
        echo "Testing 'lispwords' value reset" 
        setglobal lispwords? 
        setlocal lispwords? 
        echo &lispwords
      redir end

      0put a
      $d
    ]])

    -- Assert buffer contents.
    expect([[
      ONE: expecting global undolevels: 5, local undolevels: -123456 (default)
      1
      2
      3
      4
      5
      6
      7
      
      
        undolevels=5 global
        undolevels=-123456 local
      TWO: expecting global undolevels: 5, local undolevels: 2 (first) then 10 (afterwards)
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      
      
        undolevels=5 global
        undolevels=2 local
      
        undolevels=5 global
        undolevels=10 local
      
      global value shouldn't be changed and still be 5!
      ONE: expecting global undolevels: 5, local undolevels: -123456 (default)
        undolevels=5 global
        undolevels=-123456 local
      
      global value should be changed to 50
      THREE: expecting global undolevels: 50, local undolevels: -123456 (default)
      
        undolevels=50 global
        undolevels=-123456 local
      
      Testing 'lispwords' local value
        lispwords=foo,bar,baz
        lispwords=bar,baz,quux
      bar,baz,quux
      
      Testing 'lispwords' value reset
        lispwords=foo,bar,baz
        lispwords=foo,bar,baz
      foo,bar,baz]])
  end)
end)
