ledger/test/CheckTests.py
Alexis Hildebrandt 01252035cd [doc] Add CheckTests to ctest
to check whether all available ledger options documented
and are being tested.

Signed-off-by: Alexis Hildebrandt <afh@surryhill.net>
2015-01-15 14:53:16 +01:00

136 lines
4.3 KiB
Python
Executable file

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import print_function
import sys
import re
import os
import argparse
from os.path import *
from subprocess import Popen, PIPE
class CheckTests (object):
def __init__(self, args):
self.ledger = os.path.abspath(args.ledger)
self.source = os.path.abspath(args.source)
self.missing_baseline_tests = set()
self.missing_texi_options = set()
self.unknown_texi_options = set()
self.missing_man_options = set()
self.unknown_man_options = set()
self.untested_options = [
'anon',
'args-only',
'cache',
'debug',
'download',
'file',
'force-color',
'force-pager',
'full-help',
'help',
'help-calc',
'help-comm',
'help-disp',
'import',
'init-file',
'no-color',
'options',
'price-db',
'price-exp',
'revalued-total',
'script',
'seed',
'trace',
'verbose',
'verify',
'version'
]
self.known_alternates = [
'cost',
'first',
'import',
'last',
'leeway',
'period-sort'
]
def find_options(self, pattern, filename):
regex = re.compile(pattern)
return {match.group(1) for match in {regex.match(line) for line in open(filename)} if match}
def main(self):
man_options = self.find_options('\.It Fl \\\\-([-A-Za-z]+)',
join(self.source, 'doc', 'ledger.1'))
texi_options = self.find_options('@item --([-A-Za-z]+).*@c option',
join(self.source, 'doc', 'ledger3.texi'))
pipe = Popen('%s --debug option.names parse true' % self.ledger,
shell=True, stdout=PIPE, stderr=PIPE)
regex = re.compile('\[DEBUG\] Option: (.*)')
for line in filter(regex.search, [line.decode() for line in pipe.stderr]):
match = regex.search(line)
option = match.group(1)
option = re.sub('_', '-', option)
option = re.sub('-$', '', option)
if option not in self.untested_options and \
not exists(join(self.source, 'test', 'baseline',
'opt-%s.test' % option)):
self.missing_baseline_tests.add(option)
if option not in man_options:
self.missing_man_options.add(option)
else:
man_options.remove(option)
if option not in texi_options:
self.missing_texi_options.add(option)
else:
texi_options.remove(option)
self.unknown_man_options = [option for option in man_options if option not in self.known_alternates]
self.unknown_texi_options = [option for option in texi_options if option not in self.known_alternates]
sep = "\n --"
if len(self.missing_baseline_tests):
print("Missing Baseline test for:%s%s\n" % (sep, sep.join(sorted(list(self.missing_baseline_tests)))))
if len(self.missing_man_options):
print("Missing man page entries for:%s%s\n" % (sep, sep.join(sorted(list(self.missing_man_options)))))
if len(self.missing_texi_options):
print("Missing texi entries for:%s%s\n" % (sep, sep.join(sorted(list(self.missing_texi_options)))))
if len(self.unknown_man_options):
print("Man page entry for unknown options:%s%s" % (sep, sep.join(sorted(list(self.unknown_man_options)))))
if len(self.unknown_texi_options):
print("Texi entry for unknown option:%s%s" % (sep, sep.join(sorted(list(self.unknown_texi_options)))))
errors = len(self.missing_baseline_tests) + len(self.missing_man_options) + len(self.missing_baseline_tests)
return errors
if __name__ == "__main__":
def getargs():
parser = argparse.ArgumentParser(prog='CheckTests', description='Check that ledger options are tested and documented', prefix_chars='-')
parser.add_argument('-l', '--ledger',
dest='ledger',
type=str,
action='store',
required=True,
help='the path to the ledger executable to test with')
parser.add_argument('-s', '--source',
dest='source',
type=str,
action='store',
required=True,
help='the path to the top level ledger source directory')
return parser.parse_args()
args = getargs()
script = CheckTests(args)
status = script.main()
sys.exit(status)