RewriteTests rewrites the given test file with the given tests to have the new results. This is a utility to avoid having to tediously update tests after implementing some parser / engine functionality.
(t *testing.T, tests []QueryParses, file string)
| 143 | // RewriteTests rewrites the given test file with the given tests to have the new results. This is a utility to avoid |
| 144 | // having to tediously update tests after implementing some parser / engine functionality. |
| 145 | func RewriteTests(t *testing.T, tests []QueryParses, file string) { |
| 146 | newPath := file + ".new" |
| 147 | f, err := os.Open(file) |
| 148 | require.NoError(t, err) |
| 149 | fNew, err := os.Create(newPath) |
| 150 | require.NoError(t, err) |
| 151 | |
| 152 | abs, err := filepath.Abs(newPath) |
| 153 | require.NoError(t, err) |
| 154 | fmt.Println("Rewriting tests to", abs) |
| 155 | |
| 156 | bufferedReader := bufio.NewReader(f) |
| 157 | bufferedWriter := bufio.NewWriter(fNew) |
| 158 | |
| 159 | // copy the source file until we find the first test statement |
| 160 | var line []byte |
| 161 | for { |
| 162 | line, _, err = bufferedReader.ReadLine() |
| 163 | if err == io.EOF { |
| 164 | break |
| 165 | } else { |
| 166 | require.NoError(t, err) |
| 167 | } |
| 168 | |
| 169 | if testStatementRegex.Match(line) { |
| 170 | break |
| 171 | } |
| 172 | |
| 173 | _, err = bufferedWriter.Write(line) |
| 174 | require.NoError(t, err) |
| 175 | _, err = bufferedWriter.Write([]byte("\n")) |
| 176 | require.NoError(t, err) |
| 177 | } |
| 178 | |
| 179 | for _, test := range tests { |
| 180 | t.Run(test.String(), func(t *testing.T) { |
| 181 | statements, err := parser.Parse(test.String()) |
| 182 | if !test.ShouldParse() { |
| 183 | if err == nil && len(statements) > 0 { |
| 184 | line = testStatementRegex.ReplaceAll(line, []byte("${1}Parses(")) |
| 185 | } |
| 186 | } |
| 187 | |
| 188 | for _, statement := range statements { |
| 189 | vitessAST, err := func() (vitessAST sqlparser.Statement, err error) { |
| 190 | defer func() { |
| 191 | if recoverVal := recover(); recoverVal != nil { |
| 192 | vitessAST = nil |
| 193 | } |
| 194 | }() |
| 195 | return ast.Convert(statement) |
| 196 | }() |
| 197 | |
| 198 | if err != nil { |
| 199 | line = testStatementRegex.ReplaceAll(line, []byte("${1}Parses(")) |
| 200 | } |
| 201 | |
| 202 | if !test.ShouldConvert() { |
no test coverage detected