Software /
code /
prosody
Annotate
tools/test_mutants.sh.lua @ 13256:53708752cc5d
Merge 0.12->trunk
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Wed, 30 Aug 2023 11:09:12 +0200 |
parent | 12765:132a3c7b25fa |
rev | line source |
---|---|
12765
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
1 #!/bin/bash |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
2 |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
3 POLYGLOT=1--[===[ |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
4 |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
5 set -o pipefail |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
6 |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
7 if [[ "$#" == "0" ]]; then |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
8 echo "Lua mutation testing tool" |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
9 echo |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
10 echo "Usage:" |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
11 echo " $BASH_SOURCE MODULE_NAME SPEC_FILE" |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
12 echo |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
13 echo "Requires 'lua', 'ltokenp' and 'busted' in PATH" |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
14 exit 1; |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
15 fi |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
16 |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
17 MOD_NAME="$1" |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
18 MOD_FILE="$(lua "$BASH_SOURCE" resolve "$MOD_NAME")" |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
19 |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
20 if [[ "$MOD_FILE" == "" || ! -f "$MOD_FILE" ]]; then |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
21 echo "EE: Failed to locate module '$MOD_NAME' ($MOD_FILE)"; |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
22 exit 1; |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
23 fi |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
24 |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
25 SPEC_FILE="$2" |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
26 |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
27 if [[ "$SPEC_FILE" == "" ]]; then |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
28 SPEC_FILE="spec/${MOD_NAME/./_}_spec.lua" |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
29 fi |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
30 |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
31 if [[ "$SPEC_FILE" == "" || ! -f "$SPEC_FILE" ]]; then |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
32 echo "EE: Failed to find test spec file ($SPEC_FILE)" |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
33 exit 1; |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
34 fi |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
35 |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
36 if ! busted "$SPEC_FILE"; then |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
37 echo "EE: Tests fail on original source. Fix it"\!; |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
38 exit 1; |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
39 fi |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
40 |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
41 export MUTANT_N=0 |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
42 LIVING_MUTANTS=0 |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
43 |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
44 FILE_PREFIX="${MOD_FILE%.*}.mutant-" |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
45 FILE_SUFFIX=".${MOD_FILE##*.}" |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
46 |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
47 gen_mutant () { |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
48 echo "Generating mutant $2 to $3..." |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
49 ltokenp -s "$BASH_SOURCE" "$1" > "$3" |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
50 return "$?" |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
51 } |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
52 |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
53 # $1 = MOD_NAME, $2 = MUTANT_N, $3 = SPEC_FILE |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
54 test_mutant () { |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
55 ( |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
56 ulimit -m 131072 # 128MB |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
57 ulimit -t 16 # 16s |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
58 ulimit -f 32768 # 128MB (?) |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
59 exec busted --helper="$BASH_SOURCE" -Xhelper mutate="$1":"$2" "$3" |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
60 ) >/dev/null |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
61 return "$?"; |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
62 } |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
63 |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
64 MUTANT_FILE="${FILE_PREFIX}${MUTANT_N}${FILE_SUFFIX}" |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
65 |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
66 gen_mutant "$MOD_FILE" "$MUTANT_N" "$MUTANT_FILE" |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
67 while [[ "$?" == "0" ]]; do |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
68 if ! test_mutant "$MOD_NAME" "$MUTANT_N" "$SPEC_FILE"; then |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
69 echo "Tests successfully killed mutant $MUTANT_N"; |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
70 rm "$MUTANT_FILE"; |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
71 else |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
72 echo "Mutant $MUTANT_N lives on"\! |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
73 LIVING_MUTANTS=$((LIVING_MUTANTS+1)) |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
74 fi |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
75 MUTANT_N=$((MUTANT_N+1)) |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
76 MUTANT_FILE="${FILE_PREFIX}${MUTANT_N}${FILE_SUFFIX}" |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
77 gen_mutant "$MOD_FILE" "$MUTANT_N" "$MUTANT_FILE" |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
78 done |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
79 |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
80 if [[ "$?" != "2" ]]; then |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
81 echo "Failed: $?" |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
82 exit "$?"; |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
83 fi |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
84 |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
85 MUTANT_SCORE="$(lua -e "print(('%0.2f'):format((1-($LIVING_MUTANTS/$MUTANT_N))*100))")" |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
86 if test -f mutant-scores.txt; then |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
87 echo "$MOD_NAME $MUTANT_SCORE" >> mutant-scores.txt |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
88 fi |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
89 echo "$MOD_NAME: All $MUTANT_N mutants generated, $LIVING_MUTANTS survived (score: $MUTANT_SCORE%)" |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
90 rm "$MUTANT_FILE"; # Last file is always unmodified |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
91 exit 0; |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
92 ]===] |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
93 |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
94 -- busted helper that runs mutations |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
95 if arg then |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
96 if arg[1] == "resolve" then |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
97 local filename = package.searchpath(assert(arg[2], "no module name given"), package.path); |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
98 if filename then |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
99 print(filename); |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
100 end |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
101 os.exit(filename and 0 or 1); |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
102 end |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
103 local mutants = {}; |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
104 |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
105 for i = 1, #arg do |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
106 local opt = arg[i]; |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
107 print("LOAD", i, opt) |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
108 local module_name, mutant_n = opt:match("^mutate=([^:]+):(%d+)"); |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
109 if module_name then |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
110 mutants[module_name] = tonumber(mutant_n); |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
111 end |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
112 end |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
113 |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
114 local orig_lua_searcher = package.searchers[2]; |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
115 |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
116 local function mutant_searcher(module_name) |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
117 local mutant_n = mutants[module_name]; |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
118 if not mutant_n then |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
119 return orig_lua_searcher(module_name); |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
120 end |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
121 local base_file, err = package.searchpath(module_name, package.path); |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
122 if not base_file then |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
123 return base_file, err; |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
124 end |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
125 local mutant_file = base_file:gsub("%.lua$", (".mutant-%d.lua"):format(mutant_n)); |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
126 return loadfile(mutant_file), mutant_file; |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
127 end |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
128 |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
129 if next(mutants) then |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
130 table.insert(package.searchers, 1, mutant_searcher); |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
131 end |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
132 end |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
133 |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
134 -- filter for ltokenp to mutate scripts |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
135 do |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
136 local last_output = {}; |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
137 local function emit(...) |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
138 last_output = {...}; |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
139 io.write(...) |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
140 io.write(" ") |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
141 return true; |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
142 end |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
143 |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
144 local did_mutate = false; |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
145 local count = -1; |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
146 local threshold = tonumber(os.getenv("MUTANT_N")) or 0; |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
147 local function should_mutate() |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
148 count = count + 1; |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
149 return count == threshold; |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
150 end |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
151 |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
152 local function mutate(name, value) |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
153 if name == "if" then |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
154 -- Bypass conditionals |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
155 if should_mutate() then |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
156 return emit("if true or"); |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
157 elseif should_mutate() then |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
158 return emit("if false and"); |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
159 end |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
160 elseif name == "<integer>" then |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
161 -- Introduce off-by-one errors |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
162 if should_mutate() then |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
163 return emit(("%d"):format(tonumber(value)+1)); |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
164 elseif should_mutate() then |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
165 return emit(("%d"):format(tonumber(value)-1)); |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
166 end |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
167 elseif name == "and" then |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
168 if should_mutate() then |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
169 return emit("or"); |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
170 end |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
171 elseif name == "or" then |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
172 if should_mutate() then |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
173 return emit("and"); |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
174 end |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
175 end |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
176 end |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
177 |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
178 local current_line_n, current_line_input, current_line_output = 0, {}, {}; |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
179 function FILTER(line_n,token,name,value) |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
180 if current_line_n ~= line_n then -- Finished a line, moving to the next? |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
181 if did_mutate and did_mutate.line == current_line_n then |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
182 -- The line we finished was mutated. Store the original and modified outputs. |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
183 did_mutate.line_original_src = table.concat(current_line_input, " "); |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
184 did_mutate.line_modified_src = table.concat(current_line_output, " "); |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
185 end |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
186 current_line_input = {}; |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
187 current_line_output = {}; |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
188 end |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
189 current_line_n = line_n; |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
190 if name == "<file>" then return; end |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
191 if name == "<eof>" then |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
192 if not did_mutate then |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
193 return os.exit(2); |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
194 else |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
195 emit(("\n-- Mutated line %d (changed '%s' to '%s'):\n"):format(did_mutate.line, did_mutate.original, did_mutate.modified)) |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
196 emit( ("-- Original: %s\n"):format(did_mutate.line_original_src)) |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
197 emit( ("-- Modified: %s\n"):format(did_mutate.line_modified_src)); |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
198 return; |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
199 end |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
200 end |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
201 if name == "<string>" then |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
202 value = string.format("%q",value); |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
203 end |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
204 if mutate(name, value) then |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
205 did_mutate = { |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
206 original = value; |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
207 modified = table.concat(last_output); |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
208 line = line_n; |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
209 }; |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
210 else |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
211 emit(value); |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
212 end |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
213 table.insert(current_line_input, value); |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
214 table.insert(current_line_output, table.concat(last_output)); |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
215 end |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
216 end |
132a3c7b25fa
tools: Add initial mutation testing script
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
217 |