Update to support new negative format
diff --git a/src/_monkeyYaml.py b/src/_monkeyYaml.py
index 69da349..bc6d128 100644
--- a/src/_monkeyYaml.py
+++ b/src/_monkeyYaml.py
@@ -15,12 +15,17 @@
mYamlStringValue = re.compile(r"^('|\").*\1$")
def load(str):
+ return myReadDict(str.splitlines())[1]
+
+def myReadDict(lines, indent=""):
dict = None
key = None
emptyLines = 0
- lines = str.splitlines()
while lines:
+ if not lines[0].startswith(indent):
+ break
+
line = lines.pop(0)
if myIsAllSpaces(line):
emptyLines += 1
@@ -32,7 +37,7 @@
dict = {}
key = result.group(1).strip()
value = result.group(2).strip()
- (lines, value) = myReadValue(lines, value)
+ (lines, value) = myReadValue(lines, value, indent)
dict[key] = value
else:
if dict and key and key in dict:
@@ -41,9 +46,9 @@
else:
raise Exception("monkeyYaml is confused at " + line)
emptyLines = 0
- return dict
+ return lines, dict
-def myReadValue(lines, value):
+def myReadValue(lines, value, indent):
if value == ">" or value == "|":
(lines, value) = myMultiline(lines, value == "|")
value = value + "\n"
@@ -51,9 +56,11 @@
if lines and not value:
if myMaybeList(lines[0]):
return myMultilineList(lines, value)
- return myMultiline(lines, False)
- else:
- return lines, myReadOneLine(value)
+ indentMatch = re.match("(" + indent + r"\s+)", lines[0])
+ if indentMatch:
+ if ":" in lines[0]:
+ return myReadDict(lines, indentMatch.group(1))
+ return myMultiline(lines, False)
return lines, myReadOneLine(value)
def myMaybeList(value):
diff --git a/src/test262.py b/src/test262.py
index d5a5aa1..c92e5bf 100755
--- a/src/test262.py
+++ b/src/test262.py
@@ -146,7 +146,7 @@
if self.HasUnexpectedOutcome():
if self.case.IsNegative():
print "=== %s was expected to fail in %s, but didn't ===" % (name, mode)
- print "--- expected error: %s ---\n" % self.case.GetNegative()
+ print "--- expected error: %s ---\n" % self.case.GetNegativeType()
else:
if long_format:
print "=== %s failed in %s ===" % (name, mode)
@@ -246,11 +246,21 @@
self.validate()
def NegativeMatch(self, stderr):
- neg = re.compile(self.GetNegative())
+ neg = re.compile(self.GetNegativeType())
return re.search(neg, stderr)
def GetNegative(self):
- return self.testRecord['negative']
+ if not self.IsNegative():
+ return None
+ return self.testRecord["negative"]
+
+ def GetNegativeType(self):
+ negative = self.GetNegative()
+ return negative and negative["type"]
+
+ def GetNegativePhase(self):
+ negative = self.GetNegative()
+ return negative and negative["phase"]
def GetName(self):
return path.join(*self.name)
@@ -304,6 +314,10 @@
self.GetAdditionalIncludes() + \
self.test + '\n'
+ if self.GetNegativePhase() == "early":
+ source = ("throw 'Expected an early error, but code was executed.';\n" +
+ source)
+
if self.strict_mode:
source = '"use strict";\nvar strict_mode = true;\n' + source
else:
@@ -363,6 +377,10 @@
def validate(self):
flags = self.testRecord.get("flags")
+ phase = self.GetNegativePhase()
+
+ if phase not in [None, "early", "runtime"]:
+ raise TypeError("Invalid value for negative phase: " + phase)
if not flags:
return
@@ -578,7 +596,7 @@
if result.HasUnexpectedOutcome():
if result.case.IsNegative():
self.logf.write("=== %s was expected to fail in %s, but didn't === \n" % (name, mode))
- self.logf.write("--- expected error: %s ---\n" % result.case.GetNegative())
+ self.logf.write("--- expected error: %s ---\n" % result.case.GetNegativeType())
result.WriteOutput(self.logf)
else:
self.logf.write("=== %s failed in %s === \n" % (name, mode))
diff --git a/test/fixtures/negative.js b/test/fixtures/negative.js
new file mode 100644
index 0000000..f772b2e
--- /dev/null
+++ b/test/fixtures/negative.js
@@ -0,0 +1,11 @@
+// fake copyright comment
+/*---
+info: >
+ Sample test info
+description: Sample test description
+negative:
+ phase: early
+ type: SyntaxError
+---*/
+
+???
diff --git a/test/test_monkeyYaml.py b/test/test_monkeyYaml.py
index eb1b64e..428e45b 100644
--- a/test/test_monkeyYaml.py
+++ b/test/test_monkeyYaml.py
@@ -185,5 +185,26 @@
"""
self.assertEqual(monkeyYaml.load(y), yaml.load(y))
+ def test_nested_1(self):
+ y = """
+es61d: 19.1.2.1
+negative:
+ stage: early
+ type: ReferenceError
+description: foo
+"""
+ self.assertEqual(monkeyYaml.load(y), yaml.load(y))
+
+ def test_nested_2(self):
+ y = """
+es61d: 19.1.2.1
+first:
+ second_a:
+ third: 1
+ second_b: 3
+description: foo
+"""
+ self.assertEqual(monkeyYaml.load(y), yaml.load(y))
+
if __name__ == '__main__':
unittest.main()
diff --git a/test/test_parseTestRecord.py b/test/test_parseTestRecord.py
index 422b5af..36576b5 100644
--- a/test/test_parseTestRecord.py
+++ b/test/test_parseTestRecord.py
@@ -171,7 +171,13 @@
""", record['test'])
+ def test_negative(self):
+ name = 'fixtures/negative.js'
+ contents = slurpFile(name)
+ record = parseTestRecord(contents, name)
+ self.assertEqual('early', record['negative']['phase'])
+ self.assertEqual('SyntaxError', record['negative']['type'])
if __name__ == '__main__':
unittest.main()