2021-10-12 02:45:38 +02:00
|
|
|
# testParser.py
|
|
|
|
# -------------
|
|
|
|
# Licensing Information: You are free to use or extend these projects for
|
|
|
|
# educational purposes provided that (1) you do not distribute or publish
|
|
|
|
# solutions, (2) you retain this notice, and (3) you provide clear
|
|
|
|
# attribution to UC Berkeley, including a link to http://ai.berkeley.edu.
|
|
|
|
#
|
|
|
|
# Attribution Information: The Pacman AI projects were developed at UC Berkeley.
|
|
|
|
# The core projects and autograders were primarily created by John DeNero
|
|
|
|
# (denero@cs.berkeley.edu) and Dan Klein (klein@cs.berkeley.edu).
|
|
|
|
# Student side autograding was added by Brad Miller, Nick Hay, and
|
|
|
|
# Pieter Abbeel (pabbeel@cs.berkeley.edu).
|
|
|
|
|
|
|
|
|
|
|
|
import re
|
|
|
|
import sys
|
|
|
|
|
|
|
|
class TestParser(object):
|
|
|
|
|
|
|
|
def __init__(self, path):
|
|
|
|
# save the path to the test file
|
|
|
|
self.path = path
|
|
|
|
|
|
|
|
def removeComments(self, rawlines):
|
|
|
|
# remove any portion of a line following a '#' symbol
|
|
|
|
fixed_lines = []
|
|
|
|
for l in rawlines:
|
|
|
|
idx = l.find('#')
|
|
|
|
if idx == -1:
|
|
|
|
fixed_lines.append(l)
|
|
|
|
else:
|
|
|
|
fixed_lines.append(l[0:idx])
|
|
|
|
return '\n'.join(fixed_lines)
|
|
|
|
|
|
|
|
def parse(self):
|
|
|
|
# read in the test case and remove comments
|
|
|
|
test = {}
|
|
|
|
with open(self.path) as handle:
|
|
|
|
raw_lines = handle.read().split('\n')
|
|
|
|
|
|
|
|
test_text = self.removeComments(raw_lines)
|
|
|
|
test['__raw_lines__'] = raw_lines
|
|
|
|
test['path'] = self.path
|
|
|
|
test['__emit__'] = []
|
|
|
|
lines = test_text.split('\n')
|
|
|
|
i = 0
|
|
|
|
# read a property in each loop cycle
|
|
|
|
while(i < len(lines)):
|
|
|
|
# skip blank lines
|
|
|
|
if re.match('\A\s*\Z', lines[i]):
|
|
|
|
test['__emit__'].append(("raw", raw_lines[i]))
|
|
|
|
i += 1
|
|
|
|
continue
|
|
|
|
m = re.match('\A([^"]*?):\s*"([^"]*)"\s*\Z', lines[i])
|
|
|
|
if m:
|
|
|
|
test[m.group(1)] = m.group(2)
|
|
|
|
test['__emit__'].append(("oneline", m.group(1)))
|
|
|
|
i += 1
|
|
|
|
continue
|
|
|
|
m = re.match('\A([^"]*?):\s*"""\s*\Z', lines[i])
|
|
|
|
if m:
|
|
|
|
msg = []
|
|
|
|
i += 1
|
|
|
|
while(not re.match('\A\s*"""\s*\Z', lines[i])):
|
|
|
|
msg.append(raw_lines[i])
|
|
|
|
i += 1
|
|
|
|
test[m.group(1)] = '\n'.join(msg)
|
|
|
|
test['__emit__'].append(("multiline", m.group(1)))
|
|
|
|
i += 1
|
|
|
|
continue
|
2021-10-12 03:01:31 +02:00
|
|
|
print('error parsing test file: %s' % self.path)
|
2021-10-12 02:45:38 +02:00
|
|
|
sys.exit(1)
|
|
|
|
return test
|
|
|
|
|
|
|
|
|
|
|
|
def emitTestDict(testDict, handle):
|
|
|
|
for kind, data in testDict['__emit__']:
|
|
|
|
if kind == "raw":
|
|
|
|
handle.write(data + "\n")
|
|
|
|
elif kind == "oneline":
|
|
|
|
handle.write('%s: "%s"\n' % (data, testDict[data]))
|
|
|
|
elif kind == "multiline":
|
|
|
|
handle.write('%s: """\n%s\n"""\n' % (data, testDict[data]))
|
|
|
|
else:
|
|
|
|
raise Exception("Bad __emit__")
|