Skip to content

Commit a30de4c

Browse files
Fix XMLEventReader does not handle ' properly
* Upgrade junit-interface to 0.11 & Fixes #72
1 parent 6b0d4ee commit a30de4c

File tree

4 files changed

+47
-13
lines changed

4 files changed

+47
-13
lines changed

build.sbt

+3-1
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,12 @@ OsgiKeys.exportPackage := Seq(s"scala.xml.*;version=${version.value}")
3030

3131
libraryDependencies += "junit" % "junit" % "4.11" % "test"
3232

33-
libraryDependencies += "com.novocode" % "junit-interface" % "0.10" % "test"
33+
libraryDependencies += "com.novocode" % "junit-interface" % "0.11" % "test"
3434

3535
//// testing:
3636
// used in CompilerErrors test
3737
libraryDependencies += ("org.scala-lang" % "scala-compiler" % scalaVersion.value % "test").exclude("org.scala-lang.modules", s"scala-xml*")
3838

3939
mimaPreviousVersion := Some("1.0.1")
40+
41+
testOptions += Tests.Argument(TestFrameworks.JUnit, "-q", "-v")

src/main/scala/scala/xml/Utility.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ object Utility extends AnyRef with parsing.TokenTests {
9393
* For reasons unclear escape and unescape are a long ways from
9494
* being logical inverses.
9595
*/
96-
val pairs = Map(
96+
private val pairs = Map(
9797
"lt" -> '<',
9898
"gt" -> '>',
9999
"amp" -> '&',

src/main/scala/scala/xml/parsing/MarkupParser.scala

+7-6
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ package parsing
1212

1313
import scala.io.Source
1414
import scala.xml.dtd._
15-
import Utility.Escapes.{ pairs => unescape }
15+
import Utility.Escapes.unescMap
1616

1717
/**
1818
* An XML parser.
@@ -470,11 +470,12 @@ trait MarkupParser extends MarkupParserCommon with TokenTests {
470470
case _ => // EntityRef
471471
val n = xName
472472
xToken(';')
473-
474-
if (unescape contains n) {
475-
handle.entityRef(tmppos, n)
476-
ts &+ unescape(n)
477-
} else push(n)
473+
unescMap.get(n) match {
474+
case None => push(n)
475+
case Some(theChar) =>
476+
handle.entityRef(tmppos, n)
477+
ts &+ theChar
478+
}
478479
}
479480
case _ => // text content
480481
appendText(tmppos, ts, xText)

src/test/scala/scala/xml/pull/XMLEventReaderTest.scala

+36-5
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,7 @@
11
package scala.xml.pull
22

33
import org.junit.Test
4-
import org.junit.Ignore
5-
import org.junit.runner.RunWith
6-
import org.junit.runners.JUnit4
74
import org.junit.Assert.assertTrue
8-
import org.junit.Assert.assertFalse
9-
import org.junit.Assert.assertEquals
105

116
import scala.io.Source
127

@@ -58,4 +53,40 @@ class XMLEventReaderTest {
5853
while(er.hasNext) er.next()
5954
er.stop()
6055
}
56+
57+
@Test
58+
def entityRefTest: Unit = {
59+
val source = Source.fromString("<text>&quot;&apos;&lt;&gt;&amp;</text>")
60+
val er = new XMLEventReader(source)
61+
62+
assertTrue(er.next match {
63+
case EvElemStart(_, "text", _, _) => true
64+
case _ => false
65+
})
66+
assertTrue(er.next match {
67+
case EvEntityRef("quot") => true
68+
case e => false
69+
})
70+
assertTrue(er.next match {
71+
case EvEntityRef("apos") => true
72+
case _ => false
73+
})
74+
assertTrue(er.next match {
75+
case EvEntityRef("lt") => true
76+
case _ => false
77+
})
78+
assertTrue(er.next match {
79+
case EvEntityRef("gt") => true
80+
case _ => false
81+
})
82+
assertTrue(er.next match {
83+
case EvEntityRef("amp") => true
84+
case _ => false
85+
})
86+
assertTrue(er.next match {
87+
case EvElemEnd(_, "text") => true
88+
case _ => false
89+
})
90+
assert(er.isEmpty)
91+
}
6192
}

0 commit comments

Comments
 (0)