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