summaryrefslogtreecommitdiff
path: root/test/GenerateTests.py
blob: 1301bcd0b505be5c9f61af10c6f5af8e5ed047d7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#!/usr/bin/env python3

# This script confirms both that the register report "adds up", and that its
# final balance is the same as what the balance report shows.

import argparse
import pathlib
import sys
import os
import re

from difflib import ndiff

multiproc = False
try:
    from multiprocessing import Pool
    multiproc = True
except:
    pass

from LedgerHarness import LedgerHarness

parser = argparse.ArgumentParser(prog='GenerateTests', parents=[LedgerHarness.parser()])
parser.add_argument('-j', '--jobs', type=int, default=1)
parser.add_argument('tests', type=pathlib.Path)
parser.add_argument('beg_range', nargs='?', type=int, default=1)
parser.add_argument('end_range', nargs='?', type=int, default=20)
args = parser.parse_args()
multiproc &= (args.jobs >= 1)
harness = LedgerHarness(args.ledger, args.sourcepath, args.verify, args.gmalloc, args.python)

if not os.path.isdir(args.tests) and not os.path.isfile(args.tests):
    print(f'{args.tests} is not a directory or file (cwd: {os.getcwd()})'
          , file=sys.stderr)
    sys.exit(1)

#def normalize(line):
#    match = re.match("((\s*)([A-Za-z]+)?(\s*)([-0-9.]+)(\s*)([A-Za-z]+)?)(  (.+))?$", line)
#    if match:
#        if match.group(3):
#            prefix = match.group(3) + " " + match.group(5)
#            if match.group(8):
#                return prefix + match.group(8)
#            return prefix
#        elif match.group(7):
#            prefix = match.group(7) + " " + match.group(5)
#            if match.group(8):
#                return prefix + match.group(8)
#            return prefix
#    return line

def generation_test(seed):
    p_gen = harness.run('$ledger --seed=%d generate' % seed)

    cout = harness.read(p_gen.stdout)

    if not harness.wait(p_gen, msg=("Generation for seed %d failed:" % seed)):
        return False

    p_print = harness.run('$ledger --actual -f - print')
    p_print.stdin.write(cout)
    p_print.stdin.close()
    p_print_out = p_print.stdout.read()

    if not harness.wait(p_print, msg=("Print for seed %d failed:" % seed)):
        return False

    #p_cerr_bal = Popen("%s --args-only -f - bal" % ledger, shell=True,
    #                   stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)
    #p_cerr_bal.stdin.write(cerr)
    #p_cerr_bal.stdin.close()
    #
    #cerr_lines = [normalize(line) for line in p_cerr_bal.stdout.readlines()]
    #
    #if p_cerr_bal.wait() != 0:
    #    print("Stderr balance for seed %d failed due to error:" % seed)
    #    print(p_cerr_bal.stderr.read())
    #    del p_cerr_bal
    #    return False
    #del p_cerr_bal

    p_cout_bal = harness.run('$ledger -f - bal')
    p_cout_bal.stdin.write(cout)
    p_cout_bal.stdin.close()

    cout_lines = harness.readlines(p_cout_bal.stdout)
    if len(cout_lines) == 0:
      return False
    #norm_cout_lines = [normalize(line) for line in cout_lines]

    if not harness.wait(p_cout_bal, msg=("Stdout balance for seed %d failed:" % seed)):
        return False

    p_print_bal = harness.run('$ledger -f - bal')
    p_print_bal.stdin.write(p_print_out)
    p_print_bal.stdin.close()

    print_lines = harness.readlines(p_print_bal.stdout)
    if len(print_lines) == 0:
      return False

    if not harness.wait(p_print_bal, msg=("Print balance for seed %d failed:" % seed)):
        return False

    success = True
    #printed = False
    #for line in ndiff(cerr_lines, norm_cout_lines, charjunk=None):
    #    if line[:2] == "  ":
    #        continue
    #    if not printed:
    #        if success: print()
    #        print("Generation failure in output from seed %d (cerr vs. cout):" % seed)
    #        if success: failed += 1
    #        success = False
    #        printed = True
    #    print(" ", line)

    printed = False
    for line in ndiff(cout_lines, print_lines, charjunk=None):
        if line[:2] == "  ":
            continue
        if not printed:
            if success: print()
            print("Generation failure in output from seed %d (cout vs. print):" % seed)
            success = False
            printed = True
        print(" ", line)

    return success

def run_gen_test(i):
    if generation_test(i):
        harness.success()
    else:
        harness.failure()
    return harness.failed

if multiproc:
    pool = Pool(args.jobs*2)
else:
    pool = None

if pool:
    pool.map(run_gen_test, range(args.beg_range, args.end_range))
else:
    for i in range(args.beg_range, args.end_range):
        run_gen_test(i)

if pool:
    pool.close()
    pool.join()

harness.exit()