summaryrefslogtreecommitdiffstats
path: root/testParser.py
diff options
context:
space:
mode:
Diffstat (limited to 'testParser.py')
-rw-r--r--testParser.py85
1 files changed, 85 insertions, 0 deletions
diff --git a/testParser.py b/testParser.py
new file mode 100644
index 0000000..ceedeaf
--- /dev/null
+++ b/testParser.py
@@ -0,0 +1,85 @@
+# 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
+ print 'error parsing test file: %s' % self.path
+ 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__")