patch 8.1.1270: cannot see current match position

Problem:    Cannot see current match position.
Solution:   Show "3/44" when using the "n" command and "S" is not in
            'shortmess'. (Christian Brabandt, closes #4317)
diff --git a/src/testdir/Make_all.mak b/src/testdir/Make_all.mak
index 4510169..25c8fee 100644
--- a/src/testdir/Make_all.mak
+++ b/src/testdir/Make_all.mak
@@ -219,6 +219,7 @@
 	test_scroll_opt \
 	test_scrollbind \
 	test_search \
+	test_search_stat \
 	test_searchpos \
 	test_set \
 	test_sha256 \
@@ -388,6 +389,7 @@
 	test_scriptnames.res \
 	test_scrollbind.res \
 	test_search.res \
+	test_search_stat.res \
 	test_shortpathname.res \
 	test_signals.res \
 	test_signs.res \
diff --git a/src/testdir/test_search_stat.vim b/src/testdir/test_search_stat.vim
new file mode 100644
index 0000000..37e2fda
--- /dev/null
+++ b/src/testdir/test_search_stat.vim
@@ -0,0 +1,108 @@
+" Tests for search_stats, when "S" is not in 'shortmess'
+"
+" This test is fragile, it might not work interactively, but it works when run
+" as test!
+
+func! Test_search_stat()
+  new
+  set shortmess-=S
+  call append(0, repeat(['foobar', 'foo', 'fooooobar', 'foba', 'foobar'], 10))
+
+  " 1) match at second line
+  call cursor(1, 1)
+  let @/ = 'fo*\(bar\?\)\?'
+  let g:a = execute(':unsilent :norm! n')
+  let stat = '\[2/50\]'
+  let pat = escape(@/, '()*?'). '\s\+'
+  call assert_match(pat .. stat, g:a)
+
+  " 2) Match at last line
+  call cursor(line('$')-2, 1)
+  let g:a = execute(':unsilent :norm! n')
+  let stat = '\[50/50\]'
+  call assert_match(pat .. stat, g:a)
+
+  " 3) No search stat
+  set shortmess+=S
+  call cursor(1, 1)
+  let stat = '\[2/50\]'
+  let g:a = execute(':unsilent :norm! n')
+  call assert_notmatch(pat .. stat, g:a)
+  set shortmess-=S
+
+  " 4) Many matches
+  call cursor(line('$')-2, 1)
+  let @/ = '.'
+  let pat = escape(@/, '()*?'). '\s\+'
+  let g:a = execute(':unsilent :norm! n')
+  let stat = '\[>99/>99\]'
+  call assert_match(pat .. stat, g:a)
+
+  " 5) Many matches
+  call cursor(1, 1)
+  let g:a = execute(':unsilent :norm! n')
+  let stat = '\[2/>99\]'
+  call assert_match(pat .. stat, g:a)
+
+  " 6) right-left
+  if exists("+rightleft")
+    set rl
+    call cursor(1,1)
+    let @/ = 'foobar'
+    let pat = 'raboof/\s\+'
+    let g:a = execute(':unsilent :norm! n')
+    let stat = '\[20/2\]'
+    call assert_match(pat .. stat, g:a)
+    set norl
+  endif
+
+  " 7) right-left bottom
+  if exists("+rightleft")
+    set rl
+    call cursor('$',1)
+    let pat = 'raboof?\s\+'
+    let g:a = execute(':unsilent :norm! N')
+    let stat = '\[20/20\]'
+    call assert_match(pat .. stat, g:a)
+    set norl
+  endif
+
+  " 8) right-left back at top
+  if exists("+rightleft")
+    set rl
+    call cursor('$',1)
+    let pat = 'raboof/\s\+'
+    let g:a = execute(':unsilent :norm! n')
+    let stat = '\[20/1\]'
+    call assert_match(pat .. stat, g:a)
+    call assert_match('search hit BOTTOM, continuing at TOP', g:a)
+    set norl
+  endif
+
+  " 9) normal, back at top
+  call cursor(1,1)
+  let @/ = 'foobar'
+  let pat = '?foobar\s\+'
+  let g:a = execute(':unsilent :norm! N')
+  let stat = '\[20/20\]'
+  call assert_match(pat .. stat, g:a)
+  call assert_match('search hit TOP, continuing at BOTTOM', g:a)
+
+  " 10) normal, no match
+  call cursor(1,1)
+  let @/ = 'zzzzzz'
+  let g:a = ''
+  try
+    let g:a = execute(':unsilent :norm! n')
+  catch /^Vim\%((\a\+)\)\=:E486/
+    let stat = ''
+    " error message is not redir'ed to g:a, it is empty
+    call assert_true(empty(g:a))
+  catch
+    call assert_false(1)
+  endtry
+
+  " close the window
+  set shortmess+=S
+  bwipe!
+endfunc