blob: 1cc0d3f716813a3eabbae52dda81a7edf08e6abf [file] [log] [blame]
Bram Moolenaardc2f73a2018-11-25 04:03:09 +01001" Runs all the indent tests for which there is no .out file.
2"
3" Current directory must be runtime/indent.
Bram Moolenaarc0fe4972018-10-25 16:53:19 +02004
5set nocp
6filetype indent on
7set nowrapscan
8
9au! SwapExists * call HandleSwapExists()
10func HandleSwapExists()
11 " Ignore finding a swap file for the test input and output, the user might be
12 " editing them and that's OK.
13 if expand('<afile>') =~ '.*\.\(in\|out\|fail\|ok\)'
14 let v:swapchoice = 'e'
15 endif
16endfunc
17
18for fname in glob('testdir/*.in', 1, 1)
19 let root = substitute(fname, '\.in', '', '')
20
21 " Execute the test if the .out file does not exist of when the .in file is
22 " newer.
23 let in_time = getftime(fname)
24 let out_time = getftime(root . '.out')
25 if out_time < 0 || in_time > out_time
26 call delete(root . '.fail')
27 call delete(root . '.out')
28
29 set sw& ts& filetype=
30 exe 'split ' . fname
31
32 let did_some = 0
33 let failed = 0
34 let end = 1
35 while 1
36 " Indent all the lines between "START_INDENT" and "END_INDENT"
37 exe end
38 let start = search('\<START_INDENT\>')
39 let end = search('\<END_INDENT\>')
40 if start <= 0 || end <= 0 || end <= start
41 if did_some == 0
42 call append(0, 'ERROR: START_INDENT and/or END_INDENT not found')
43 let failed = 1
44 endif
45 break
46 else
47 let did_some = 1
48
49 " Execute all commands marked with INDENT_EXE and find any pattern.
50 let lnum = start
51 let pattern = ''
52 let at = ''
53 while 1
54 exe lnum + 1
55 let lnum_exe = search('\<INDENT_EXE\>')
56 exe lnum + 1
57 let indent_at = search('\<INDENT_\(AT\|NEXT\|PREV\)\>')
58 if lnum_exe > 0 && lnum_exe < end && (indent_at <= 0 || lnum_exe < indent_at)
59 exe substitute(getline(lnum_exe), '.*INDENT_EXE', '', '')
60 let lnum = lnum_exe
61 let start = lnum
62 elseif indent_at > 0 && indent_at < end
63 if pattern != ''
64 call append(indent_at, 'ERROR: duplicate pattern')
65 let failed = 1
66 break
67 endif
68 let text = getline(indent_at)
69 let pattern = substitute(text, '.*INDENT_\S*\s*', '', '')
70 let at = substitute(text, '.*INDENT_\(\S*\).*', '\1', '')
71 let lnum = indent_at
72 let start = lnum
73 else
74 break
75 endif
76 endwhile
77
78 exe start + 1
79 if pattern == ''
80 exe 'normal =' . (end - 1) . 'G'
81 else
82 let lnum = search(pattern)
83 if lnum <= 0
84 call append(indent_at, 'ERROR: pattern not found: ' . pattern)
85 let failed = 1
86 break
87 endif
88 if at == 'AT'
89 exe lnum
90 elseif at == 'NEXT'
91 exe lnum + 1
92 else
93 exe lnum - 1
94 endif
95 normal ==
96 endif
97 endif
98 endwhile
99
100 if !failed
101 " Check the resulting text equals the .ok file.
102 if getline(1, '$') != readfile(root . '.ok')
103 let failed = 1
104 endif
105 endif
106
107 if failed
108 exe 'write ' . root . '.fail'
109 echoerr 'Test ' . fname . ' FAILED!'
110 sleep 2
111 else
112 exe 'write ' . root . '.out'
113 endif
114
115 quit! " close the indented file
116 endif
117endfor
118
119qall!