fostr/bin/extract_tests.xsh
Glen Whitney cc89ad1e93 Add OCaml code generation (#24)
Also start using nailgun to speed up code generation.

  Resolves #6.

Co-authored-by: Glen Whitney <glen@studioinfinity.org>
Reviewed-on: glen/fostr#24
Co-Authored-By: Glen Whitney <glen@nobody@nowhere.net>
Co-Committed-By: Glen Whitney <glen@nobody@nowhere.net>
2021-03-01 20:40:35 +00:00

42 lines
1.2 KiB
Plaintext

#!/usr/bin/env xonsh
import re
#### Set Parameters
# Should be a list of Path objects:
TEST_LIST = pg`tests/*.spt`
# Should be the top-level directory for all extracted tests:
# (there will be one subdirectory per item in TEST_LIST)
DESTINATION = 'tests/extracted'
# Extension for extracted files:
EXT = 'fos'
# Extension for expectations:
EXP = 'expect'
for path in TEST_LIST:
destdir = pf"{DESTINATION}/{path.stem}"
mkdir -p @(destdir)
chmod ugo+rwx @(destdir)
contents = path.read_text()
tests = re.split(r'test\s*(.+?)\s*\[\[.*?\n', contents)[1:]
testit = iter(tests)
for name, details in zip(testit, testit):
pfm = re.search(r'\n\s*\]\][\s\S]*?parse\s*fails', details)
if pfm: continue # skip examples that don't parse
ntfm = re.search(r'\n\s*\]\].*?don.t.test', details)
if ntfm: continue # explicit skip
em = re.search(r'\n\]\]', details)
if not em: continue
example = details[:em.start()+1].replace('[[','').replace(']]','')
expath = destdir / f"{name}.{EXT}"
expath.write_text(example)
echo Wrote @(expath)
xm = re.search(r'/\*\*\s+writes.*?\n([\s\S]*?)\*\*/', details[em.end():])
if xm:
xpath = destdir / f"{name}.{EXP}"
xpath.write_text(xm[1])
echo " ...and" @(xpath)