bdiff-torture.py
108 lines
| 2.1 KiB
| text/x-python
|
PythonLexer
/ contrib / bdiff-torture.py
Matt Mackall
|
r29012 | # Randomized torture test generation for bdiff | ||
from __future__ import absolute_import, print_function | ||||
Yuya Nishihara
|
r29209 | import random | ||
import sys | ||||
Matt Mackall
|
r29012 | from mercurial import ( | ||
Yuya Nishihara
|
r32201 | mdiff, | ||
Gregory Szorc
|
r43279 | pycompat, | ||
Matt Mackall
|
r29012 | ) | ||
Augie Fackler
|
r43346 | |||
Matt Mackall
|
r29012 | def reducetest(a, b): | ||
tries = 0 | ||||
reductions = 0 | ||||
print("reducing...") | ||||
while tries < 1000: | ||||
Augie Fackler
|
r43346 | a2 = ( | ||
"\n".join(l for l in a.splitlines() if random.randint(0, 100) > 0) | ||||
+ "\n" | ||||
) | ||||
b2 = ( | ||||
"\n".join(l for l in b.splitlines() if random.randint(0, 100) > 0) | ||||
+ "\n" | ||||
) | ||||
Matt Mackall
|
r29012 | if a2 == a and b2 == b: | ||
continue | ||||
if a2 == b2: | ||||
continue | ||||
tries += 1 | ||||
try: | ||||
test1(a, b) | ||||
Martin von Zweigbergk
|
r41401 | except Exception: | ||
Matt Mackall
|
r29012 | reductions += 1 | ||
tries = 0 | ||||
a = a2 | ||||
b = b2 | ||||
Augie Fackler
|
r43346 | print("reduced:", reductions, len(a) + len(b), repr(a), repr(b)) | ||
Matt Mackall
|
r29012 | try: | ||
test1(a, b) | ||||
except Exception as inst: | ||||
print("failed:", inst) | ||||
sys.exit(0) | ||||
Augie Fackler
|
r43346 | |||
Matt Mackall
|
r29012 | def test1(a, b): | ||
Yuya Nishihara
|
r32201 | d = mdiff.textdiff(a, b) | ||
Matt Mackall
|
r29012 | if not d: | ||
raise ValueError("empty") | ||||
Yuya Nishihara
|
r32202 | c = mdiff.patches(a, [d]) | ||
Matt Mackall
|
r29012 | if c != b: | ||
raise ValueError("bad") | ||||
Augie Fackler
|
r43346 | |||
Matt Mackall
|
r29012 | def testwrap(a, b): | ||
try: | ||||
test1(a, b) | ||||
return | ||||
except Exception as inst: | ||||
Pulkit Goyal
|
r43123 | print("exception:", inst) | ||
Matt Mackall
|
r29012 | reducetest(a, b) | ||
Augie Fackler
|
r43346 | |||
Matt Mackall
|
r29012 | def test(a, b): | ||
testwrap(a, b) | ||||
testwrap(b, a) | ||||
Augie Fackler
|
r43346 | |||
Matt Mackall
|
r29012 | def rndtest(size, noise): | ||
a = [] | ||||
src = " aaaaaaaabbbbccd" | ||||
Gregory Szorc
|
r43279 | for x in pycompat.xrange(size): | ||
Matt Mackall
|
r29012 | a.append(src[random.randint(0, len(src) - 1)]) | ||
while True: | ||||
b = [c for c in a if random.randint(0, 99) > noise] | ||||
b2 = [] | ||||
for c in b: | ||||
b2.append(c) | ||||
while random.randint(0, 99) < noise: | ||||
b2.append(src[random.randint(0, len(src) - 1)]) | ||||
if b2 != a: | ||||
break | ||||
a = "\n".join(a) + "\n" | ||||
b = "\n".join(b2) + "\n" | ||||
test(a, b) | ||||
Augie Fackler
|
r43346 | |||
Matt Mackall
|
r29012 | maxvol = 10000 | ||
startsize = 2 | ||||
while True: | ||||
size = startsize | ||||
count = 0 | ||||
while size < maxvol: | ||||
print(size) | ||||
volume = 0 | ||||
while volume < maxvol: | ||||
rndtest(size, 2) | ||||
volume += size | ||||
count += 2 | ||||
size *= 2 | ||||
maxvol *= 4 | ||||
startsize *= 4 | ||||