diff --git a/jvm/src/test/scala/scala/xml/XMLTest.scala b/jvm/src/test/scala/scala/xml/XMLTest.scala index 201557503..401f0e00a 100644 --- a/jvm/src/test/scala/scala/xml/XMLTest.scala +++ b/jvm/src/test/scala/scala/xml/XMLTest.scala @@ -633,7 +633,7 @@ class XMLTestJVM { import scala.xml.parsing._ @UnitTest def dontLoop: Unit = { - val xml = " " + val xml = " " val sink = new PrintStream(new ByteArrayOutputStream()) (Console withOut sink) { (Console withErr sink) { @@ -765,4 +765,65 @@ class XMLTestJVM { val formatted = pp.format(x) assertEquals(x, XML.loadString(formatted)) } + + def toSource(s: String) = new scala.io.Source { + val iter = s.iterator + override def reportError(pos: Int, msg: String, out: java.io.PrintStream = Console.err): Unit = {} + } + + @UnitTest + def xTokenTest { + val x = xml.parsing.ConstructingParser.fromSource(toSource("a"), false) + assertEquals((): Unit, x.xToken('b')) + } + + @UnitTest(expected = classOf[FatalError]) + def xCharDataFailure { + val x = xml.parsing.ConstructingParser.fromSource(toSource(""), false) + + x.xCharData + } + + @UnitTest(expected = classOf[FatalError]) + def xCommentFailure { + val x = xml.parsing.ConstructingParser.fromSource(toSource(""), false) + + x.xComment + } + + @UnitTest + def xmlProcInstrTest { + val x = xml.parsing.ConstructingParser.fromSource(toSource("aa"), false) + + assertEquals(new UnprefixedAttribute("aa", Text(""), Null), x.xmlProcInstr) + } + + @UnitTest(expected = classOf[FatalError]) + def notationDeclFailure { + val x = xml.parsing.ConstructingParser.fromSource(toSource(""), false) + + x.notationDecl + } + + @UnitTest + def pubidLiteralTest { + val x = xml.parsing.ConstructingParser.fromSource(toSource(""), false) + + assertEquals("", x.pubidLiteral) + } + + @UnitTest + def xAttributeValueTest { + val x = xml.parsing.ConstructingParser.fromSource(toSource("'"), false) + + assertEquals("", x.xAttributeValue) + } + + @UnitTest + def xEntityValueTest { + val x = xml.parsing.ConstructingParser.fromSource(toSource(""), false) + + assertEquals("", x.xEntityValue) + } + } diff --git a/shared/src/main/scala/scala/xml/parsing/MarkupParser.scala b/shared/src/main/scala/scala/xml/parsing/MarkupParser.scala index 81d5b82cc..0b2f0d567 100755 --- a/shared/src/main/scala/scala/xml/parsing/MarkupParser.scala +++ b/shared/src/main/scala/scala/xml/parsing/MarkupParser.scala @@ -397,7 +397,7 @@ trait MarkupParser extends MarkupParserCommon with TokenTests { } else sb.append(ch) nextch() } - throw truncatedError("broken comment") + truncatedError("broken comment") } /* todo: move this into the NodeBuilder class */ @@ -928,7 +928,7 @@ trait MarkupParser extends MarkupParserCommon with TokenTests { new PublicID(pubID, sysID) } else { reportSyntaxError("PUBLIC or SYSTEM expected") - scala.sys.error("died parsing notationdecl") + truncatedError("died parsing notationdecl") } xSpaceOpt() xToken('>') diff --git a/shared/src/main/scala/scala/xml/parsing/MarkupParserCommon.scala b/shared/src/main/scala/scala/xml/parsing/MarkupParserCommon.scala index a6b2ec187..00d94a4fe 100644 --- a/shared/src/main/scala/scala/xml/parsing/MarkupParserCommon.scala +++ b/shared/src/main/scala/scala/xml/parsing/MarkupParserCommon.scala @@ -19,7 +19,7 @@ import Utility.SU * All members should be accessed through those. */ private[scala] trait MarkupParserCommon extends TokenTests { - protected def unreachable = scala.sys.error("Cannot be reached.") + protected def unreachable = truncatedError("Cannot be reached.") // type HandleType // MarkupHandler, SymbolicXMLBuilder type InputType // Source, CharArrayReader @@ -62,7 +62,7 @@ private[scala] trait MarkupParserCommon extends TokenTests { val buf = new StringBuilder while (ch != endCh && !eof) { // well-formedness constraint - if (ch == '<') return errorAndResult("'<' not allowed in attrib value", "") + if (ch == '<') reportSyntaxError("'<' not allowed in attrib value") else if (ch == SU) truncatedError("") else buf append ch_returning_nextch } @@ -241,11 +241,11 @@ private[scala] trait MarkupParserCommon extends TokenTests { val head = until.head val rest = until.tail - while (true) { + while (!eof) { if (ch == head && peek(rest)) return handler(positioner(), sb.toString) else if (ch == SU || eof) - truncatedError("") // throws TruncatedXMLControl in compiler + truncatedError(s"died parsing until $until") // throws TruncatedXMLControl in compiler sb append ch nextch()