import expressions
import utility_mill
from test import support
################################################################################
def hard_test():
while True:
test = generate_test()
with support.captured_stdout() as out:
try:
expressions.run(test, {})
except Exception as err:
print(err.args[0])
val = out.getvalue()[:-1]
try:
out = utility_mill.run_latest('Expression_Evaluator', INPUT=test)
except:
pass
else:
print('PASS' if val == out else 'FAIL')
################################################################################
def soft_test():
# test once a minute (softer)
import time
# we use some smart variables
FAIL = 5
NAME = 'Expression_Evaluator'
# enter the main program code
while True:
version = get_version(FAIL, NAME)
for minute in range(60):
test = generate_test()
with support.captured_stdout() as out:
try:
expressions.run(test, {})
except Exception as err:
print(err.args[0])
val = out.getvalue()[:-1]
out = get_results(FAIL, NAME, version, INPUT=test)
print('PASS' if val == out else 'FAIL')
time.sleep(60)
def get_version(fail, name):
for attempt in range(fail):
try:
return utility_mill.get_version(name)
except:
pass
raise SystemExit(1)
def get_results(fail, name, version, **query):
for attempt in range(fail):
try:
return utility_mill.get_results(name, version, query)
except:
pass
raise SystemExit(2)
################################################################################
import random
SR = random.SystemRandom()
LIB = '!"#$%&\'()*+,-./0123456789:<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'
OP = '=', '+', '-', '*', '/', '//', '\\', '%', '**', '^', 'and', '&&', '&', 'or', '||', '|', '==', '!=', '>', '<', '>=', '=>', '<=', '=<'
MAX = 5
################################################################################
def generate_test():
variables = set()
required_lines = SR.randint(0, MAX)
lines = []
while len(lines) != required_lines:
create_line(lines, variables)
return '\n'.join(lines)
def create_line(lines, variables):
required_expressions = SR.randint(0, MAX)
expressions = []
while len(expressions) != required_expressions:
create_expression(expressions, variables)
lines.append(';'.join(expressions))
def create_expression(expressions, variables):
choice = SR.choice(['assign', 'comment', 'empty', 'print'])
if choice == 'assign':
tokens = create_assign(variables)
variables.add('_')
elif choice == 'comment':
tokens = create_comment()
elif choice == 'empty':
tokens = []
else:
tokens = pad(create_evaluation(variables))
variables.add('_')
expressions.append(''.join(tokens))
def create_assign(variables):
required_variables = SR.randint(1, MAX)
new_variables = []
while len(new_variables) != required_variables:
create_variable(new_variables)
tokens = []
for variable in new_variables:
tokens.append(variable)
tokens.append('=')
evaluation = create_evaluation(variables)
variables.update(new_variables)
tokens.extend(evaluation)
padded_tokens = pad(tokens)
return padded_tokens
def create_variable(new_variables):
required_length = SR.randint(1, MAX)
variable = ''
while not valid_variable(variable):
variable = []
while len(variable) != required_length:
variable.append(SR.choice(LIB))
variable = ''.join(variable)
new_variables.append(variable)
def valid_variable(variable):
if not variable:
return False
if variable[0] == '#':
return False
try:
float(variable)
return False
except:
pass
if variable in OP:
return False
return True
def create_evaluation(variables):
required_tokens = SR.randint(1, MAX)
tokens = []
while len(tokens) != required_tokens:
if SR.randint(0, 1):
tokens.append(repr(SR.randint(1, 10)))
elif variables:
tokens.append(SR.choice(list(variables)))
token_list = []
for token in tokens:
token_list.append(token)
token_list.append(SR.choice(OP[1:]))
return token_list[:-1]
def pad(tokens):
token_list = []
for token in tokens:
token_list.append(token)
token_list.append(create_whitespace())
return token_list[:-1]
def create_whitespace():
required_length = SR.randint(1, MAX)
whitespace = []
while len(whitespace) != required_length:
if SR.randint(0, 1):
whitespace.append(' ')
else:
whitespace.append('\t')
return ''.join(whitespace)
def create_comment():
required_length = SR.randint(1, MAX)
tokens = ['#']
while len(tokens) != required_length:
create_variable(tokens)
padded_tokens = pad(tokens)
return padded_tokens
################################################################################
if __name__ == '__main__':
soft_test()