patch 8.0.0255: setpos() does not use the buffer argument for all marks

Problem:    When calling setpos() with a buffer argument it often is ignored.
            (Matthew Malcomson)
Solution:   Make the buffer argument work for all marks local to a buffer.
            (neovim #5713)  Add more tests.
diff --git a/src/testdir/test_marks.vim b/src/testdir/test_marks.vim
index d00b1dd..18a0c71 100644
--- a/src/testdir/test_marks.vim
+++ b/src/testdir/test_marks.vim
@@ -24,3 +24,47 @@
   call assert_equal("XXX 123 123", getline(3))
   enew!
 endfunction
+
+func Test_setpos()
+  new one
+  let onebuf = bufnr('%')
+  let onewin = win_getid()
+  call setline(1, ['aaa', 'bbb', 'ccc'])
+  new two
+  let twobuf = bufnr('%')
+  let twowin = win_getid()
+  call setline(1, ['aaa', 'bbb', 'ccc'])
+
+  " for the cursor the buffer number is ignored
+  call setpos(".", [0, 2, 1, 0])
+  call assert_equal([0, 2, 1, 0], getpos("."))
+  call setpos(".", [onebuf, 3, 3, 0])
+  call assert_equal([0, 3, 3, 0], getpos("."))
+
+  call setpos("''", [0, 1, 3, 0])
+  call assert_equal([0, 1, 3, 0], getpos("''"))
+  call setpos("''", [onebuf, 2, 2, 0])
+  call assert_equal([0, 2, 2, 0], getpos("''"))
+
+  " buffer-local marks
+  for mark in ["'a", "'\"", "'[", "']", "'<", "'>"]
+    call win_gotoid(twowin)
+    call setpos(mark, [0, 2, 1, 0])
+    call assert_equal([0, 2, 1, 0], getpos(mark), "for mark " . mark)
+    call setpos(mark, [onebuf, 1, 3, 0])
+    call win_gotoid(onewin)
+    call assert_equal([0, 1, 3, 0], getpos(mark), "for mark " . mark)
+  endfor
+
+  " global marks
+  call win_gotoid(twowin)
+  call setpos("'N", [0, 2, 1, 0])
+  call assert_equal([twobuf, 2, 1, 0], getpos("'N"))
+  call setpos("'N", [onebuf, 1, 3, 0])
+  call assert_equal([onebuf, 1, 3, 0], getpos("'N"))
+
+  call win_gotoid(onewin)
+  bwipe!
+  call win_gotoid(twowin)
+  bwipe!
+endfunc