aboutsummaryrefslogtreecommitdiff
path: root/test/old/testdir/test_codestyle.vim
blob: 6d728972e9b27faa3fc16a390b32831d2ba0e486 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
" Test for checking the source code style.

func s:ReportError(fname, lnum, msg)
  if a:lnum > 0
    call assert_report(a:fname .. ' line ' .. a:lnum .. ': ' .. a:msg)
  endif
endfunc

func s:PerformCheck(fname, pattern, msg, skip)
  let prev_lnum = 1
  let lnum = 1
  while (lnum > 0)
    call cursor(lnum, 1)
    let lnum = search(a:pattern, 'W', 0, 0, a:skip)
    if (prev_lnum == lnum)
      break
    endif
    let prev_lnum = lnum
    if (lnum > 0)
      call s:ReportError(a:fname, lnum, a:msg)
    endif
  endwhile
endfunc

func Test_test_files()
  for fname in glob('*.vim', 0, 1)
    let g:ignoreSwapExists = 'e'
    exe 'edit ' .. fname

    " some files intentionally have misplaced white space
    if fname =~ 'test_cindent.vim' || fname =~ 'test_join.vim'
      continue
    endif

    " skip files that are known to have a space before a tab
    if fname !~ 'test_comments.vim'
          \ && fname !~ 'test_listchars.vim'
          \ && fname !~ 'test_visual.vim'
      call cursor(1, 1)
      let skip = 'getline(".") =~ "codestyle: ignore"'
      let lnum = search(fname =~ "test_regexp_latin" ? '[^á] \t' : ' \t', 'W', 0, 0, skip)
      call s:ReportError('testdir/' .. fname, lnum, 'space before Tab')
    endif

    " skip files that are known to have trailing white space
    if fname !~ 'test_cmdline.vim'
          \ && fname !~ 'test_let.vim'
          \ && fname !~ 'test_tagjump.vim'
          \ && fname !~ 'test_vim9_cmd.vim'
      call cursor(1, 1)
      let lnum = search(
            \ fname =~ 'test_vim9_assign.vim' ? '[^=]\s$'
            \ : fname =~ 'test_vim9_class.vim' ? '[^)]\s$'
            \ : fname =~ 'test_vim9_script.vim' ? '[^,:3]\s$'
            \ : fname =~ 'test_visual.vim' ? '[^/]\s$'
            \ : '[^\\]\s$')
      call s:ReportError('testdir/' .. fname, lnum, 'trailing white space')
    endif
  endfor

  bwipe!
endfunc

func Test_help_files()
  set nowrapscan

  for fpath in glob('../../../runtime/doc/*.txt', 0, 1)
    let g:ignoreSwapExists = 'e'
    exe 'edit ' .. fpath

    let fname = fnamemodify(fpath, ":t")

    " todo.txt is for developers, it's not need a strictly check
    " version*.txt is a history and large size, so it's not checked
    if fname == 'todo.txt' || fname =~ 'version.*\.txt'
      continue
    endif

    " Check for mixed tabs and spaces
    call cursor(1, 1)
    while 1
      let lnum = search('[^/] \t')
      if fname == 'visual.txt' && getline(lnum) =~ "STRING  \tjkl"
            \ || fname == 'usr_27.txt' && getline(lnum) =~ "\[^\? \t\]"
        continue
      endif
      call s:ReportError(fpath, lnum, 'space before tab')
      if lnum == 0
        break
      endif
    endwhile

    " Check for unnecessary whitespace at the end of a line
    call cursor(1, 1)
    while 1
      let lnum = search('\%([^/~\\]\|^\)\s\+$')
      " skip line that are known to have trailing white space
      if fname == 'map.txt' && getline(lnum) =~ "unmap @@ $"
            \ || fname == 'usr_12.txt' && getline(lnum) =~ "^\t/ \t$"
            \ || fname == 'usr_41.txt' && getline(lnum) =~ "map <F4> o#include  $"
            \ || fname == 'change.txt' && getline(lnum) =~ "foobar bla $"
        continue
      endif
      call s:ReportError('testdir' .. fpath, lnum, 'trailing white space')
      if lnum == 0
        break
      endif
    endwhile


  endfor

  set wrapscan&vim
  bwipe!
endfunc


func Test_runtime_wrong_shellescape()
  " Check that shellescape() is called with the {special} argument (a second,
  " non-zero argument) when its result is used in a ":!" ex command.
  " This could cause code injection!
  let pattern = '\<shellescape(\%([^,()]\|([^()]*)\)\+)'

  let q = "['" .. '"]'
  let bang_exe = '\<\%(exe\%[cute]\|sil\%[ent]\)\>.*' .. q .. '[^"' .. "']*!"

  let skip = 'getline(".") !~ ' .. string(bang_exe)
        \ .. ' || getline(".") =~ ' .. string('\<system\%(list\)\=(')
        \ .. ' || getline(".") =~ ' .. string('^\s*"')

  for fpath in glob('../../../runtime/**/*.vim', 0, 1)
    let g:ignoreSwapExists = 'e'
    exe 'edit ' .. fpath
    call s:PerformCheck(fpath, pattern,
          \ 'shellescape() without {special} flag used in ":!" command', skip)
  endfor

  :%bwipe!
endfunc

" vim: shiftwidth=2 sts=2 expandtab