patch 8.2.0527: Vim9: function types insufficiently tested

Problem:    Vim9: function types insufficiently tested.
Solution:   Add more tests.  Fix white space check.  Add "test_vim9" target.
diff --git a/src/testdir/Make_all.mak b/src/testdir/Make_all.mak
index 8ca7831..63d97e8 100644
--- a/src/testdir/Make_all.mak
+++ b/src/testdir/Make_all.mak
@@ -43,6 +43,19 @@
 # Tests for the GUI.
 SCRIPTS_GUI =
 
+# Tests for Vim9 script.
+TEST_VIM9 = \
+	test_vim9_disassemble \
+	test_vim9_expr \
+	test_vim9_func \
+	test_vim9_script
+
+TEST_VIM9_RES = \
+	test_vim9_disassemble.res \
+	test_vim9_expr.res \
+	test_vim9_func.res \
+	test_vim9_script.res
+
 # Individual tests, including the ones part of test_alot.
 # Please keep sorted up to test_alot.
 NEW_TESTS = \
@@ -272,10 +285,7 @@
 	test_utf8 \
 	test_utf8_comparisons \
 	test_vartabs \
-	test_vim9_disassemble \
-	test_vim9_expr \
-	test_vim9_func \
-	test_vim9_script \
+	$(TEST_VIM9) \
 	test_viminfo \
 	test_vimscript \
 	test_virtualedit \
@@ -482,10 +492,7 @@
 	test_user_func.res \
 	test_usercommands.res \
 	test_vartabs.res \
-	test_vim9_disassemble.res \
-	test_vim9_expr.res \
-	test_vim9_func.res \
-	test_vim9_script.res \
+	$(TEST_VIM9_RES) \
 	test_viminfo.res \
 	test_vimscript.res \
 	test_virtualedit.res \
diff --git a/src/testdir/Makefile b/src/testdir/Makefile
index 746c849..b2eaecb 100644
--- a/src/testdir/Makefile
+++ b/src/testdir/Makefile
@@ -79,6 +79,16 @@
 		exit 1; \
 	fi
 
+# Run only tests specific for Vim9 script
+test_vim9:
+	rm -f test_vim9_*.res test.log messages
+	@MAKEFLAGS=--no-print-directory $(MAKE) -f Makefile $(TEST_VIM9_RES) VIMPROG=$(VIMPROG) XXDPROG=$(XXDPROG) SCRIPTSOURCE=$(SCRIPTSOURCE)
+	@cat messages
+	@MAKEFLAGS=--no-print-directory $(MAKE) -f Makefile report VIMPROG=$(VIMPROG) XXDPROG=$(XXDPROG) SCRIPTSOURCE=$(SCRIPTSOURCE)
+	@if test -f test.log; then \
+		exit 1; \
+	fi
+
 RM_ON_RUN = test.out X* viminfo
 RM_ON_START = tiny.vim small.vim mbyte.vim mzscheme.vim test.ok benchmark.out
 RUN_VIM = VIMRUNTIME=$(SCRIPTSOURCE) $(VALGRIND) $(VIMPROG) -f $(GUI_FLAG) -u unix.vim $(NO_INITS) -s dotest.in
diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim
index 5554b2d..fb2180f 100644
--- a/src/testdir/test_vim9_func.vim
+++ b/src/testdir/test_vim9_func.vim
@@ -373,6 +373,11 @@
   return 1234
 enddef
 
+def FuncNoArgRetString(): string
+  funcResult = 45
+  return 'text'
+enddef
+
 def FuncOneArgNoRet(arg: number)
   funcResult = arg
 enddef
@@ -382,6 +387,10 @@
   return arg
 enddef
 
+def FuncOneArgRetString(arg: string): string
+  return arg
+enddef
+
 def FuncOneArgRetAny(arg: any): any
   return arg
 enddef
@@ -415,6 +424,32 @@
   assert_equal(13, funcResult)
 enddef
 
+def Test_func_type_part()
+  let RefVoid: func: void
+  RefVoid = FuncNoArgNoRet
+  RefVoid = FuncOneArgNoRet
+  CheckDefFailure(['let RefVoid: func: void', 'RefVoid = FuncNoArgRetNumber'], 'E1013: type mismatch, expected func() but got func(): number')
+  CheckDefFailure(['let RefVoid: func: void', 'RefVoid = FuncNoArgRetString'], 'E1013: type mismatch, expected func() but got func(): string')
+
+  let RefAny: func(): any
+  RefAny = FuncNoArgRetNumber
+  RefAny = FuncNoArgRetString
+  CheckDefFailure(['let RefAny: func(): any', 'RefAny = FuncNoArgNoRet'], 'E1013: type mismatch, expected func(): any but got func()')
+  CheckDefFailure(['let RefAny: func(): any', 'RefAny = FuncOneArgNoRet'], 'E1013: type mismatch, expected func(): any but got func(number)')
+
+  let RefNr: func: number
+  RefNr = FuncNoArgRetNumber
+  RefNr = FuncOneArgRetNumber
+  CheckDefFailure(['let RefNr: func: number', 'RefNr = FuncNoArgNoRet'], 'E1013: type mismatch, expected func(): number but got func()')
+  CheckDefFailure(['let RefNr: func: number', 'RefNr = FuncNoArgRetString'], 'E1013: type mismatch, expected func(): number but got func(): string')
+
+  let RefStr: func: string
+  RefStr = FuncNoArgRetString
+  RefStr = FuncOneArgRetString
+  CheckDefFailure(['let RefStr: func: string', 'RefStr = FuncNoArgNoRet'], 'E1013: type mismatch, expected func(): string but got func()')
+  CheckDefFailure(['let RefStr: func: string', 'RefStr = FuncNoArgRetNumber'], 'E1013: type mismatch, expected func(): string but got func(): number')
+enddef
+
 def Test_func_type_fails()
   CheckDefFailure(['let ref1: func()'], 'E704:')