summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2017-01-15 15:22:33 +0100
committerBram Moolenaar <Bram@vim.org>2017-01-15 15:22:33 +0100
commit296b1f28ca9cedeb55872f306808b2214b519ce7 (patch)
tree44a42e553892239ae8183f53d09d68b110e43aac
parent9506cad7a1a6e52a613f356de969cbd980815777 (diff)
patch 8.0.0189: profile commands are not testedv8.0.0189
Problem: There are no tests for the :profile command. Solution: Add tests. (Dominique Pelle, closes #1383)
-rw-r--r--src/Makefile1
-rw-r--r--src/testdir/Make_all.mak1
-rw-r--r--src/testdir/test_profile.vim135
-rw-r--r--src/version.c2
4 files changed, 139 insertions, 0 deletions
diff --git a/src/Makefile b/src/Makefile
index db70672864..38ca4cd16e 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -2147,6 +2147,7 @@ test_arglist \
test_partial \
test_perl \
test_popup \
+ test_profile \
test_quickfix \
test_regexp_latin \
test_regexp_utf8 \
diff --git a/src/testdir/Make_all.mak b/src/testdir/Make_all.mak
index 956d321eab..5b9c5724c3 100644
--- a/src/testdir/Make_all.mak
+++ b/src/testdir/Make_all.mak
@@ -175,6 +175,7 @@ NEW_TESTS = test_arglist.res \
test_normal.res \
test_packadd.res \
test_perl.res \
+ test_profile.res \
test_quickfix.res \
test_ruby.res \
test_search.res \
diff --git a/src/testdir/test_profile.vim b/src/testdir/test_profile.vim
new file mode 100644
index 0000000000..36c05683d5
--- /dev/null
+++ b/src/testdir/test_profile.vim
@@ -0,0 +1,135 @@
+" Test Vim profiler
+if !has('profile')
+ finish
+endif
+
+func Test_profile_func()
+ if !has('unix')
+ return
+ endif
+ let lines = [
+ \ "func! Foo1()",
+ \ "endfunc",
+ \ "func! Foo2()",
+ \ " let count = 100",
+ \ " while count > 0",
+ \ " let count = count - 1",
+ \ " endwhile",
+ \ "endfunc",
+ \ "func! Foo3()",
+ \ "endfunc",
+ \ "func! Bar()",
+ \ "endfunc",
+ \ "call Foo1()",
+ \ "call Foo1()",
+ \ "profile pause",
+ \ "call Foo1()",
+ \ "profile continue",
+ \ "call Foo2()",
+ \ "call Foo3()",
+ \ "call Bar()",
+ \ "if !v:profiling",
+ \ " delfunc Foo2",
+ \ "endif",
+ \ "delfunc Foo3",
+ \ ]
+
+ call writefile(lines, 'Xprofile_func.vim')
+ let a = system(v:progpath
+ \ . " -u NONE -i NONE --noplugin"
+ \ . " -c 'profile start Xprofile_func.log'"
+ \ . " -c 'profile func Foo*'"
+ \ . " -c 'so Xprofile_func.vim'"
+ \ . " -c 'qall!'")
+ let lines = readfile('Xprofile_func.log')
+
+ call assert_equal(28, len(lines))
+
+ call assert_equal('FUNCTION Foo1()', lines[0])
+ call assert_equal('Called 2 times', lines[1])
+ call assert_equal('FUNCTION Foo2()', lines[7])
+ call assert_equal('Called 1 time', lines[8])
+
+ " - Foo1() is called 3 times but should be reported as called twice
+ " since one call is in between "profile pause" .. "profile continue".
+ " - Foo2() should come before Foo1() since Foo1() does much more work.\
+ " - Foo3() is not reported because function is deleted.
+ " - Unlike Foo3(), Foo2() should not be deleted since there is a check
+ " for v:profiling.
+ " - Bar() is not reported since it does not match "profile func Foo*".
+ call assert_equal('FUNCTIONS SORTED ON TOTAL TIME', lines[18])
+ call assert_equal('count total (s) self (s) function', lines[19])
+ call assert_match('^\s*1\s\+\d\+\.\d\+\s\+Foo2()$', lines[20])
+ call assert_match('^\s*2\s\+\d\+\.\d\+\s\+Foo1()$', lines[21])
+ call assert_equal('', lines[22])
+ call assert_equal('FUNCTIONS SORTED ON SELF TIME', lines[23])
+ call assert_equal('count total (s) self (s) function', lines[24])
+ call assert_match('^\s*1\s\+\d\+\.\d\+\s\+Foo2()$', lines[25])
+ call assert_match('^\s*2\s\+\d\+\.\d\+\s\+Foo1()$', lines[26])
+ call assert_equal('', lines[27])
+
+ call delete('Xprofile_func.vim')
+ call delete('Xprofile_func.log')
+endfunc
+
+func Test_profile_file()
+ if !has('unix')
+ return
+ endif
+ let lines = [
+ \ 'func! Foo()',
+ \ 'endfunc',
+ \ 'for i in range(10)',
+ \ ' " a comment',
+ \ ' call Foo()',
+ \ 'endfor',
+ \ 'call Foo()',
+ \ ]
+
+ call writefile(lines, 'Xprofile_file.vim')
+ let a = system(v:progpath
+ \ . " -u NONE -i NONE --noplugin"
+ \ . " -c 'profile start Xprofile_file.log'"
+ \ . " -c 'profile file Xprofile_file.vim'"
+ \ . " -c 'so Xprofile_file.vim'"
+ \ . " -c 'so Xprofile_file.vim'"
+ \ . " -c 'qall!'")
+
+ let lines = readfile('Xprofile_file.log')
+
+ call assert_equal(14, len(lines))
+
+ call assert_match('^SCRIPT .*Xprofile_file.vim$', lines[0])
+ call assert_equal('Sourced 2 times', lines[1])
+ call assert_match('^Total time:\s\+\d\+\.\d\+$', lines[2])
+ call assert_match('^ Self time:\s\+\d\+\.\d\+$', lines[3])
+ call assert_equal('', lines[4])
+ call assert_equal('count total (s) self (s)', lines[5])
+ call assert_equal(' func! Foo()', lines[6])
+ call assert_equal(' endfunc', lines[7])
+ " Loop iterates 10 times. Since script runs twice, body executes 20 times.
+ " First line of loop executes one more time than body to detect end of loop.
+ call assert_match('^\s*22\s\+\d\+\.\d\+\s\+for i in range(10)$', lines[8])
+ call assert_equal(' " a comment', lines[9])
+ call assert_match('^\s*20\s\+\d\+\.\d\+\s\+\d\+\.\d\+\s\+call Foo()$', lines[10])
+ call assert_match('^\s*20\s\+\d\+\.\d\+\s\+endfor$', lines[11])
+ call assert_match('^\s*2\s\+\d\+\.\d\+\s\+\d\+\.\d\+\s\+call Foo()$', lines[12])
+ call assert_equal('', lines[13])
+
+ call delete('Xprofile_file.vim')
+ call delete('Xprofile_file.log')
+endfunc
+
+func Test_profile_completion()
+ call feedkeys(":profile \<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_equal('"profile continue file func pause start', @:)
+
+ call feedkeys(":profile start test_prof\<C-A>\<C-B>\"\<CR>", 'tx')
+ call assert_match('^"profile start.* test_profile\.vim', @:)
+endfunc
+
+func Test_profile_errors()
+ call assert_fails("profile func Foo", 'E750:')
+ call assert_fails("profile pause", 'E750:')
+ call assert_fails("profile continue", 'E750:')
+endfunc
diff --git a/src/version.c b/src/version.c
index 8cb6cb8a2b..368a984e3b 100644
--- a/src/version.c
+++ b/src/version.c
@@ -765,6 +765,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 189,
+/**/
188,
/**/
187,