From 1d665334756b3990eea5f219dd0e54b237f0e7fe Mon Sep 17 00:00:00 2001 From: Grzegorz Kossakowski Date: Mon, 21 Oct 2013 16:23:55 +0200 Subject: [PATCH 1/8] Exclude scala-xml from transitive dependencies of partest. As discovered here: https://github.com/scala/scala-xml/pull/6#issuecomment-26614894 we would have two different versions of scala-xml on test classpath: 1. scala-xml classes compiled from source (we are in scala-xml project) 2. scala-xml transitive dependencies of partest Duplicated classpath entries are always dangerous. I implemented a set of exclude rules that get rid of transitive dependencies of scala-xml. This fixes the problem of JUnit using wrong version of scala-xml for testing (now there's only one choice). Also, this allowed me to to enable conflictWarning again. They are very useful to warn us against dangerous situations that almost always result in broken classpath (as we just learned). --- build.sbt | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/build.sbt b/build.sbt index 8cd957ab7..0c56cd914 100644 --- a/build.sbt +++ b/build.sbt @@ -88,16 +88,34 @@ TestKeys.partestVersion := "1.0.0-RC6" // so that it can link to the compiler/lib we're using (testing) // NOTE: not sure why, but the order matters (maybe due to the binary version conflicts for xml/parser combinators pulled in for scaladoc?) libraryDependencies ++= ( - if (TestKeys.includeTestDependencies.value) - Seq("org.scala-lang.modules" %% "scala-partest-interface" % "0.2" % "test", - "org.scala-lang.modules" %% "scala-partest" % TestKeys.partestVersion.value % "test") + if (TestKeys.includeTestDependencies.value) { + /** + * Exclude all transitive dependencies of partest that include scala-.xml. + * This way we avoid having two (or more) versions of scala-xml on a classpath. + * This fixes problem described here: + * https://github.com/scala/scala-xml/pull/6#issuecomment-26614894 + * + * Note that we are using ModuleID.exclude instead of more flexible ModuleID.excludeAll + * (describe here: http://www.scala-sbt.org/release/docs/Detailed-Topics/Library-Management#exclude-transitive-dependencies) + * because only plain excludes are incorporated in generated pom.xml. There are two ways + * to address this problem: + * + * 1. Figure out how to depend on partest in non-transitive way: not include that dependency + * in generated pom.xml for scala-xml. + * 2. Declare dependencies in partest as provided so they are not includeded transitively. + * + */ + def excludeScalaXml(dep: ModuleID): ModuleID = + dep.exclude("org.scala-lang.modules", "scala-xml_2.11.0-M5"). + exclude("org.scala-lang.modules", "scala-xml_2.11.0-M4"). + exclude("org.scalacheck", "scalacheck_2.11.0-M5") + Seq("org.scala-lang.modules" % "scala-partest-interface_2.11.0-M5" % "0.2" % "test", + "org.scala-lang.modules" % "scala-partest_2.11.0-M5" % TestKeys.partestVersion.value % "test"). + map(excludeScalaXml) + } else Seq.empty ) - -// necessary for partest -- see comments in its build.sbt -conflictWarning ~= { _.copy(failOnConflict = false) } - fork in Test := true javaOptions in Test += "-Xmx1G" From 8b2e8e04d30eed12027cf00dad73dbe9e5a0ebde Mon Sep 17 00:00:00 2001 From: Grzegorz Kossakowski Date: Mon, 21 Oct 2013 16:30:55 +0200 Subject: [PATCH 2/8] Migrate a few partest jvm tests to JUnit tests. Migrated to JUnit the following tests (from test/files/jvm): * t0632.scala * t1118.scala * unittest_xml.scala None of those tests were dependent on anything jvm specific. --- build.sbt | 2 + .../scala/scala/xml/JUnitAssertsForXML.scala | 8 ++ src/test/scala/scala/xml/MetaDataTest.scala | 60 +++++++++++ .../scala/xml/PrintEmptyElementsTest.scala | 58 ++++++++++ src/test/scala/scala/xml/UtilityTest.scala | 57 ++++++++++ .../scala/xml/parsing/Ticket0632Test.scala | 43 ++++++++ test/files/jvm/t0632.check | 12 --- test/files/jvm/t0632.scala | 22 ---- test/files/jvm/t1118.check | 11 -- test/files/jvm/t1118.scala | 21 ---- test/files/jvm/unittest_xml.scala | 101 ------------------ 11 files changed, 228 insertions(+), 167 deletions(-) create mode 100644 src/test/scala/scala/xml/JUnitAssertsForXML.scala create mode 100644 src/test/scala/scala/xml/MetaDataTest.scala create mode 100644 src/test/scala/scala/xml/PrintEmptyElementsTest.scala create mode 100644 src/test/scala/scala/xml/UtilityTest.scala create mode 100644 src/test/scala/scala/xml/parsing/Ticket0632Test.scala delete mode 100755 test/files/jvm/t0632.check delete mode 100644 test/files/jvm/t0632.scala delete mode 100755 test/files/jvm/t1118.check delete mode 100755 test/files/jvm/t1118.scala delete mode 100644 test/files/jvm/unittest_xml.scala diff --git a/build.sbt b/build.sbt index 0c56cd914..455c86f82 100644 --- a/build.sbt +++ b/build.sbt @@ -81,6 +81,8 @@ pomExtra := ( // default value must be set here TestKeys.includeTestDependencies := true +libraryDependencies ++= Seq("junit" % "junit" % "4.11" % "test", "com.novocode" % "junit-interface" % "0.10" % "test") + // default TestKeys.partestVersion := "1.0.0-RC6" diff --git a/src/test/scala/scala/xml/JUnitAssertsForXML.scala b/src/test/scala/scala/xml/JUnitAssertsForXML.scala new file mode 100644 index 000000000..374ed704d --- /dev/null +++ b/src/test/scala/scala/xml/JUnitAssertsForXML.scala @@ -0,0 +1,8 @@ +package scala.xml + +object JUnitAssertsForXML { + + private[xml] def assertEquals(expected: String, actual: NodeSeq): Unit = + org.junit.Assert.assertEquals(expected, actual.toString) + +} diff --git a/src/test/scala/scala/xml/MetaDataTest.scala b/src/test/scala/scala/xml/MetaDataTest.scala new file mode 100644 index 000000000..46b598c3a --- /dev/null +++ b/src/test/scala/scala/xml/MetaDataTest.scala @@ -0,0 +1,60 @@ +package scala.xml + +import org.junit.Test +import org.junit.Ignore +import org.junit.runner.RunWith +import org.junit.runners.JUnit4 +import org.junit.Assert.assertEquals + +class MetaDataTest { + + @Test + def absentElementPrefixed1: Unit = { + // type ascription to help overload resolution pick the right variant + assertEquals(null: Object, Null("za://foo.com", TopScope, "bar")) + assertEquals(null, Null("bar")) + } + + @Test + def absentElementPrefixed2: Unit = { + assertEquals(None, Null.get("za://foo.com", TopScope, "bar" )) + assertEquals(None, Null.get("bar")) + } + + @Test + def presentElement1: Unit = { + val x = new PrefixedAttribute("zo","bar", new Atom(42), Null) + val s = new NamespaceBinding("zo","za://foo.com", TopScope) + assertEquals(new Atom(42), x("za://foo.com", s, "bar" )) + assertEquals(null, x("bar")) + assertEquals(Some(new Atom(42)), x.get("za://foo.com", s, "bar")) + assertEquals(None, x.get("bar")) + } + + @Test + def presentElement2: Unit = { + val s = new NamespaceBinding("zo","za://foo.com", TopScope) + val x1 = new PrefixedAttribute("zo","bar", new Atom(42), Null) + val x = new UnprefixedAttribute("bar","meaning", x1) + assertEquals(null, x(null, s, "bar")) + assertEquals(Text("meaning"), x("bar")) + assertEquals(None, x.get(null, s, "bar" )) + assertEquals(Some(Text("meaning")), x.get("bar")) + } + + @Test + def attributeExtractor: Unit = { + def domatch(x:Node): Node = { + x match { + case Node("foo", md @ UnprefixedAttribute(_, value, _), _*) if !value.isEmpty => + md("bar")(0) + case _ => new Atom(3) + } + } + val z = + val z2 = + assertEquals(Text("gar"), domatch(z)) + assertEquals(new Atom(3), domatch(z2)) + } + +} diff --git a/src/test/scala/scala/xml/PrintEmptyElementsTest.scala b/src/test/scala/scala/xml/PrintEmptyElementsTest.scala new file mode 100644 index 000000000..f5270b473 --- /dev/null +++ b/src/test/scala/scala/xml/PrintEmptyElementsTest.scala @@ -0,0 +1,58 @@ +package scala.xml + +import org.junit.Test +import org.junit.Ignore +import org.junit.runner.RunWith +import org.junit.runners.JUnit4 +import JUnitAssertsForXML.assertEquals + +class PrintEmptyElementsTest { + + @Test + def representEmptyXMLElementsInShortForm: Unit = { + val expected: String = + """| + | + | + | + | + |is pretty cool + |""".stripMargin + // the xml snippet is not indented because indentation affects pretty printing + // results + val actual: NodeSeq = + + + + + +is pretty cool + + assertEquals(expected, actual) + } + + @Test + def programmaticLong: Unit = { + assertEquals(" ", + Elem(null, "emptiness", Null, TopScope, false) ++ Text(" ") ++ Comment("programmatic long")) + } + + @Test + def programmaticShort: Unit = { + assertEquals(" ", + Elem(null, "vide", Null, TopScope, true) ++ Text(" ") ++ Comment("programmatic short")) + } + + @Test + def programmaticShortWithAttribute: Unit = { + assertEquals(""" """, + Elem(null, "elem", Attribute("attr", Text("value"), Null), TopScope, true) ++ Text(" ") ++ Comment ("programmatic short with attribute")) + } + + @Test + def programmaticLongWithAttribute: Unit = { + assertEquals(""" """, + Elem(null, "elem2", Attribute("attr2", Text("value2"), Null), TopScope, false) ++ Text(" ") ++ Comment ("programmatic long with attribute")) + } + +} diff --git a/src/test/scala/scala/xml/UtilityTest.scala b/src/test/scala/scala/xml/UtilityTest.scala new file mode 100644 index 000000000..eba631efb --- /dev/null +++ b/src/test/scala/scala/xml/UtilityTest.scala @@ -0,0 +1,57 @@ +package scala.xml + +import org.junit.Test +import org.junit.Ignore +import org.junit.runner.RunWith +import org.junit.runners.JUnit4 +import org.junit.Assert.assertTrue +import org.junit.Assert.assertFalse +import org.junit.Assert.assertEquals + +class UtilityTest { + + @Test + def isNameStart: Unit = { + assertTrue(Utility.isNameStart('b')) + assertFalse(Utility.isNameStart(':')) + } + + @Test + def trim: Unit = { + val x = + + + val y = xml.Utility.trim(x) + assertEquals(1, y match { case => 1 }) + + val x2 = + a b b a + + val y2 = xml.Utility.trim(x2) + assertEquals(2, y2 match { case a b b a => 2 }) + } + + @Test + def aposEscaping: Unit = { + val z = '' + val z1 = z.toString + assertEquals("''", z1) + } + + @Test + def sort: Unit = { + val q = xml.Utility.sort() + assertEquals(" a=\"2\" g=\"3\" j=\"2\" oo=\"2\"", xml.Utility.sort(q.attributes).toString) + val pp = new xml.PrettyPrinter(80,5) + assertEquals("", pp.format(q)) + } + + @Test + def issue777: Unit = { + + + + .hashCode // Bug #777 + } + +} diff --git a/src/test/scala/scala/xml/parsing/Ticket0632Test.scala b/src/test/scala/scala/xml/parsing/Ticket0632Test.scala new file mode 100644 index 000000000..7a6b71a71 --- /dev/null +++ b/src/test/scala/scala/xml/parsing/Ticket0632Test.scala @@ -0,0 +1,43 @@ +package scala.xml.parsing + +import org.junit.Test +import org.junit.Ignore +import org.junit.runner.RunWith +import org.junit.runners.JUnit4 +import scala.xml.JUnitAssertsForXML.assertEquals + +class Ticket0632Test { + + import scala.io.Source.fromString + import scala.xml.parsing.ConstructingParser.fromSource + import scala.xml.{NodeSeq, TopScope} + private def parse(s:String) = fromSource(fromString(s), false).element(TopScope) + + @Test + def singleAmp: Unit = { + val expected = "" + assertEquals(expected, parse("")) + assertEquals(expected, xml.XML.loadString("")) + assertEquals(expected, ) + assertEquals(expected, ) + } + + @Test + def oneAndHalfAmp: Unit = { + val expected = "" + assertEquals(expected, xml.XML.loadString("")) + assertEquals(expected, parse("")) + assertEquals(expected, ) + assertEquals(expected, ) + } + + @Test + def doubleAmp: Unit = { + val expected = "" + assertEquals(expected, xml.XML.loadString("")) + assertEquals(expected, parse("")) + assertEquals(expected, ) + assertEquals(expected, ) + } + +} diff --git a/test/files/jvm/t0632.check b/test/files/jvm/t0632.check deleted file mode 100755 index 681bc9da9..000000000 --- a/test/files/jvm/t0632.check +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/test/files/jvm/t0632.scala b/test/files/jvm/t0632.scala deleted file mode 100644 index a2bb5aa7f..000000000 --- a/test/files/jvm/t0632.scala +++ /dev/null @@ -1,22 +0,0 @@ -object Test { -import scala.io.Source.fromString -import scala.xml.parsing.ConstructingParser.fromSource -import scala.xml.TopScope - def parse(s:String) = fromSource(fromString(s), false).element(TopScope) - def main(argv : Array[String]) : Unit = { - - println(parse("")) - println(xml.XML.loadString("")) - println() - println() - - println(xml.XML.loadString("")) - println(parse("")) - println() - println() - println(xml.XML.loadString("")) - println(parse("")) - println() - println() - } -} diff --git a/test/files/jvm/t1118.check b/test/files/jvm/t1118.check deleted file mode 100755 index d676b413c..000000000 --- a/test/files/jvm/t1118.check +++ /dev/null @@ -1,11 +0,0 @@ - - - - - -is pretty cool - - - - - diff --git a/test/files/jvm/t1118.scala b/test/files/jvm/t1118.scala deleted file mode 100755 index 3c8654724..000000000 --- a/test/files/jvm/t1118.scala +++ /dev/null @@ -1,21 +0,0 @@ -import scala.xml._ - -object Test { - def main(args: Array[String]) { - println( - - - - -is pretty cool -) - - println(Elem(null, "emptiness", Null, TopScope, false) ++ Text(" ") ++ Comment("programmatic long")) - - println(Elem(null, "vide", Null, TopScope, true) ++ Text(" ") ++ Comment("programmatic short")) - - println(Elem(null, "elem", Attribute("attr", Text("value"), Null), TopScope, true) ++ Text(" ") ++ Comment ("programmatic short with attribute")) - - println(Elem(null, "elem2", Attribute("attr2", Text("value2"), Null), TopScope, false) ++ Text(" ") ++ Comment ("programmatic long with attribute")) - } -} \ No newline at end of file diff --git a/test/files/jvm/unittest_xml.scala b/test/files/jvm/unittest_xml.scala deleted file mode 100644 index 106334e62..000000000 --- a/test/files/jvm/unittest_xml.scala +++ /dev/null @@ -1,101 +0,0 @@ -import scala.xml.{ MetaData, Null, Utility, PrefixedAttribute, UnprefixedAttribute } - -object Test { - - def main(args:Array[String]) = { - MetaDataTest.run() - UtilityTest.run() - } - - object MetaDataTest { - - import scala.xml.{ TopScope, NamespaceBinding, Node, Atom, Text } - - def domatch(x:Node): Node = { - x match { - case Node("foo", md @ UnprefixedAttribute(_, value, _), _*) if !value.isEmpty => - md("bar")(0) - case _ => new Atom(3) - } - } - - def run() { - - var x: MetaData = Null - var s: NamespaceBinding = TopScope - - // testing method def apply(uri:String, scp:NamespaceBinding, k:String): Seq[Node] - // def apply(k:String): Seq[Node] - - assert(null == x("za://foo.com", s, "bar" ), "absent element (prefixed) 1") - assert(null == x("bar"), "absent element (unprefix) 1") - - assert(None == x.get("za://foo.com", s, "bar" ), "absent element (prefixed) 2") - assert(None == x.get("bar"), "absent element (unprefix) 2") - - x = new PrefixedAttribute("zo","bar", new Atom(42), x) - s = new NamespaceBinding("zo","za://foo.com",s) - - assert(new Atom(42) == x("za://foo.com", s, "bar" ), "present element (prefixed) 3") - assert(null == x("bar"), "present element (unprefix) 3") - - assert(Some(new Atom(42)) == x.get("za://foo.com", s, "bar" ), "present element (prefixed) 4") - assert(None == x.get("bar"), "present element (unprefix) 4") - - x = new UnprefixedAttribute("bar","meaning", x) - - assert(null == x(null, s, "bar"), "present element (prefixed) 5") - assert(Text("meaning") == x("bar"), "present element (unprefix) 5") - - assert(None == x.get(null, s, "bar" ), "present element (prefixed) 6") - assert(Some(Text("meaning")) == x.get("bar"), "present element (unprefix) 6") - - val z = - val z2 = - - assert(Text("gar") == domatch(z), "attribute extractor 1") - assert(new Atom(3) == domatch(z2), "attribute extractor 2") - - } - } - - object UtilityTest { - def run() { - assert(Utility.isNameStart('b')) - assert(!Utility.isNameStart(':')) - - val x = - - - - val y = xml.Utility.trim(x) - - assert(1 == (y match { case => 1 }), "trim 1") - - val x2 = - a b b a - - - val y2 = xml.Utility.trim(x2) - - assert(2 == (y2 match { case a b b a => 2 }), "trim 2") - - val z = '' - val z1 = z.toString - - assert("''" == z1, "apos unescaped") - - val q = xml.Utility.sort() - assert(" a=\"2\" g=\"3\" j=\"2\" oo=\"2\"" == xml.Utility.sort(q.attributes).toString) - - val pp = new xml.PrettyPrinter(80,5) - assert("" == pp.format(q)) - - - - - .hashCode // Bug #777 - } - } - -} From 533afbcfbbd02c17126bc703e6ad3cc12439ca64 Mon Sep 17 00:00:00 2001 From: Grzegorz Kossakowski Date: Fri, 18 Oct 2013 12:51:24 +0200 Subject: [PATCH 3/8] Remove test/files/jvm/backendBugUnapply.scala test. It doesn't seem to test anything XML-specific and I couldn't trace what kind of backend problem this test is supposed to guard against. --- test/files/jvm/backendBugUnapply.check | 2 -- test/files/jvm/backendBugUnapply.scala | 17 ----------------- 2 files changed, 19 deletions(-) delete mode 100644 test/files/jvm/backendBugUnapply.check delete mode 100644 test/files/jvm/backendBugUnapply.scala diff --git a/test/files/jvm/backendBugUnapply.check b/test/files/jvm/backendBugUnapply.check deleted file mode 100644 index 9d1e7b29c..000000000 --- a/test/files/jvm/backendBugUnapply.check +++ /dev/null @@ -1,2 +0,0 @@ -baz -null diff --git a/test/files/jvm/backendBugUnapply.scala b/test/files/jvm/backendBugUnapply.scala deleted file mode 100644 index 45ee6f7d4..000000000 --- a/test/files/jvm/backendBugUnapply.scala +++ /dev/null @@ -1,17 +0,0 @@ -object Test { - import scala.xml.{Node,UnprefixedAttribute} - - def domatch(x:Node) = - x match { - case Node("foo", UnprefixedAttribute("bar", z, _), _*) => z - case _ => null - } - - def main(args: Array[String]): Unit = { - println(domatch()) - println(domatch()) - // - // assert(domatch().toString == "baz") - // assert(domatch() == null)//, domatch()) - } -} From 952cc8b3e9bb8c4bf865136ef61ddb0545a40141 Mon Sep 17 00:00:00 2001 From: Grzegorz Kossakowski Date: Fri, 18 Oct 2013 13:26:43 +0200 Subject: [PATCH 4/8] Migrate partest jvm/xmlstuff.scala test to JUnit. --- src/test/scala/scala/xml/XMLTest.scala | 198 +++++++++++++++++++++++++ test/files/jvm/xmlstuff.check | 22 --- test/files/jvm/xmlstuff.scala | 181 ---------------------- 3 files changed, 198 insertions(+), 203 deletions(-) create mode 100644 src/test/scala/scala/xml/XMLTest.scala delete mode 100644 test/files/jvm/xmlstuff.check delete mode 100644 test/files/jvm/xmlstuff.scala diff --git a/src/test/scala/scala/xml/XMLTest.scala b/src/test/scala/scala/xml/XMLTest.scala new file mode 100644 index 000000000..ba88c91c5 --- /dev/null +++ b/src/test/scala/scala/xml/XMLTest.scala @@ -0,0 +1,198 @@ +package scala.xml + +import org.junit.Test +import org.junit.Ignore +import org.junit.runner.RunWith +import org.junit.runners.JUnit4 +import org.junit.Assert.assertTrue +import org.junit.Assert.assertFalse +import org.junit.Assert.assertEquals + +class XMLTest { + + @Test + def nodeSeq: Unit = { + val p = + + + + + + val pelems_1 = for (x <- p \ "bar"; y <- p \ "baz" ) yield { + Text(x.attributes("value").toString + y.attributes("bazValue").toString+ "!") + }; + + val pelems_2 = new NodeSeq { val theSeq = List(Text("38!"),Text("58!")) }; + assertTrue(pelems_1 sameElements pelems_2) + assertTrue(Text("8") sameElements (p \\ "@bazValue")) + } + + @Test + def queryBooks: Unit = { + val books = + + Blabla + Blubabla + Baaaaaaalabla + ; + + val reviews = + + Blabla + + Hallo Welt. + + + Blubabla + + Hello Blu + + + Blubabla + + rem 2 + + + ; + + val results1 = new scala.xml.PrettyPrinter(80, 5).formatNodes ( + for (t <- books \\ "title"; + r <- reviews \\ "entry" + if (r \ "title") xml_== t) yield + + { t } + { r \ "remarks" } + + ); + val results1Expected = """ + | Blabla + | Hallo Welt. + | + | Blubabla + | Hello Blu + | + | Blubabla + | rem 2 + |""".stripMargin + assertEquals(results1Expected, results1) + + { + val actual = for (t @ Blabla <- new NodeSeq { val theSeq = books.child }.toList) + yield t + val expected = List(Blabla) + assertEquals(expected, actual) + } + + } + + @Test + def queryPhoneBook: Unit = { + val phoneBook = + + + This is the phonebook of the + ACME corporation. + + + John + +41 21 693 68 67 + +41 79 602 23 23 + + ; + + val addrBook = + + + This is the addressbook of the + ACME corporation. + + + John + Elm Street + Dolphin City + + ; + + val actual: String = new scala.xml.PrettyPrinter(80, 5).formatNodes ( + for (t <- addrBook \\ "entry"; + r <- phoneBook \\ "entry" + if (t \ "name") xml_== (r \ "name")) yield + + { t.child } + { r \ "phone" } + + ) + val expected = """| + | John + | Elm Street + | Dolphin City + | +41 21 693 68 67 + | +41 79 602 23 23 + |""".stripMargin + assertEquals(expected, actual) + } + + @Test + def namespaces: Unit = { + val cuckoo = + + + ; + assertEquals("http://cuckoo.com", cuckoo.namespace) + for (n <- cuckoo \ "_" ) { + assertEquals("http://cuckoo.com", n.namespace) + } + } + + @Test + def validationOfElements: Unit = { + val vtor = new scala.xml.dtd.ElementValidator(); + { + import scala.xml.dtd.ELEMENTS + import scala.xml.dtd.ContentModel._ + vtor.setContentModel( + ELEMENTS( + Sequ( + Letter(ElemName("bar")), + Star(Letter(ElemName("baz"))) ))); + } + assertTrue(vtor()) + + { + import scala.xml.dtd.MIXED + import scala.xml.dtd.ContentModel._ + + vtor.setContentModel( + MIXED( + Alt(Letter(ElemName("bar")), + Letter(ElemName("baz")), + Letter(ElemName("bal"))))); + } + + assertTrue(vtor( )) + assertTrue(vtor(abcdedgh )) + assertFalse(vtor( )) + } + + def validationfOfAttributes: Unit = { + val vtor = new scala.xml.dtd.ElementValidator(); + vtor.setContentModel(null) + vtor.setMetaData(List()) + assertFalse(vtor( )) + + { + import scala.xml.dtd._ + vtor setMetaData List(AttrDecl("bar", "CDATA", IMPLIED)) + } + assertFalse(vtor()) + assertTrue(vtor()) + + { + import scala.xml.dtd._ + vtor.setMetaData(List(AttrDecl("bar","CDATA",REQUIRED))) + } + assertFalse(vtor( )) + assertTrue( vtor( )) + } + +} diff --git a/test/files/jvm/xmlstuff.check b/test/files/jvm/xmlstuff.check deleted file mode 100644 index e1222479f..000000000 --- a/test/files/jvm/xmlstuff.check +++ /dev/null @@ -1,22 +0,0 @@ -NodeSeq - - Blabla - Hallo Welt. - - Blubabla - Hello Blu - - Blubabla - rem 2 - -List(Blabla) - - John - Elm Street - Dolphin City - +41 21 693 68 67 - +41 79 602 23 23 - -namespaces -validation - elements -validation - attributes diff --git a/test/files/jvm/xmlstuff.scala b/test/files/jvm/xmlstuff.scala deleted file mode 100644 index 45234c713..000000000 --- a/test/files/jvm/xmlstuff.scala +++ /dev/null @@ -1,181 +0,0 @@ -import java.io.StringReader -import org.xml.sax.InputSource -import scala.xml.{Node, NodeSeq, Elem, Text, XML} - -object Test { - - /** returns true if exception was thrown */ - def catcher(att: Function1[Unit, scala.xml.MetaData]): Boolean = { - var ex = false - try { - att.apply({}) - } catch { - case scala.xml.MalformedAttributeException(msg) => - println(msg) - ex = true - } - ex - } - - def main(args: Array[String]) { - - println("NodeSeq") - - val p = - - - - ; - - val pelems_1 = for (x <- p \ "bar"; y <- p \ "baz" ) yield { - Text(x.attributes("value").toString + y.attributes("bazValue").toString+ "!") - }; - val pelems_2 = new NodeSeq { val theSeq = List(Text("38!"),Text("58!")) }; - assert(pelems_1 sameElements pelems_2) - - assert(Text("8") sameElements (p \\ "@bazValue")) - - val books = - - Blabla - Blubabla - Baaaaaaalabla - ; - - val reviews = - - Blabla - - Hallo Welt. - - - Blubabla - - Hello Blu - - - Blubabla - - rem 2 - - - ; - - println( new scala.xml.PrettyPrinter(80, 5).formatNodes ( - for (t <- books \\ "title"; - r <- reviews \\ "entry" - if (r \ "title") xml_== t) yield - - { t } - { r \ "remarks" } - - )); - - // example - println( - for (t @ Blabla <- new NodeSeq { val theSeq = books.child }.toList) - yield t - ); - val phoneBook = - - - This is the phonebook of the - ACME corporation. - - - John - +41 21 693 68 67 - +41 79 602 23 23 - - ; - - - val addrBook = - - - This is the addressbook of the - ACME corporation. - - - John - Elm Street - Dolphin City - - ; - - println( new scala.xml.PrettyPrinter(80, 5).formatNodes ( - for (t <- addrBook \\ "entry"; - r <- phoneBook \\ "entry" - if (t \ "name") xml_== (r \ "name")) yield - - { t.child } - { r \ "phone" } - - )); - - - /* namespaces */ - // begin tmp - println("namespaces") - val cuckoo = - - - ; - assert(cuckoo.namespace == "http://cuckoo.com") - for (n <- cuckoo \ "_" ) { - //println("n = "+n); - //println("n.prefix = "+n.prefix); - //.println("n.scope = "+n.scope); - assert( n.namespace == "http://cuckoo.com") - } - - println("validation - elements") - val vtor = new scala.xml.dtd.ElementValidator(); - { - import scala.xml.dtd.ELEMENTS - import scala.xml.dtd.ContentModel._ - vtor.setContentModel( - ELEMENTS( - Sequ( - Letter(ElemName("bar")), - Star(Letter(ElemName("baz"))) ))); - - } - assert(vtor( )) - - { - import scala.xml.dtd.MIXED - import scala.xml.dtd.ContentModel._ - - vtor.setContentModel( - MIXED( - Alt(Letter(ElemName("bar")), - Letter(ElemName("baz")), - Letter(ElemName("bal"))))); - } - - assert(vtor( )) - assert(vtor(abcdedgh )) - assert(!vtor( )) - - println("validation - attributes") - vtor.setContentModel(null) - vtor.setMetaData(List()) - assert(!vtor( )) - - { - import scala.xml.dtd._ - vtor setMetaData List(AttrDecl("bar", "CDATA", IMPLIED)) - } - assert(!vtor()) - assert(vtor()) - - { - import scala.xml.dtd._ - vtor.setMetaData(List(AttrDecl("bar","CDATA",REQUIRED))) - } - assert(!vtor( )) - assert( vtor( )) - - } -} From 8ab2d60832f4a1477e3d1c6232ea3b72de39ffc1 Mon Sep 17 00:00:00 2001 From: Grzegorz Kossakowski Date: Fri, 18 Oct 2013 13:32:40 +0200 Subject: [PATCH 5/8] Migrate partest jvm/xmlpull.scala test to JUnit. --- .../scala/xml/pull/XMLEventReaderTest.scala | 43 +++++++++++++++++++ test/files/jvm/xmlpull.scala | 31 ------------- 2 files changed, 43 insertions(+), 31 deletions(-) create mode 100644 src/test/scala/scala/xml/pull/XMLEventReaderTest.scala delete mode 100644 test/files/jvm/xmlpull.scala diff --git a/src/test/scala/scala/xml/pull/XMLEventReaderTest.scala b/src/test/scala/scala/xml/pull/XMLEventReaderTest.scala new file mode 100644 index 000000000..060276531 --- /dev/null +++ b/src/test/scala/scala/xml/pull/XMLEventReaderTest.scala @@ -0,0 +1,43 @@ +package scala.xml.pull + +import org.junit.Test +import org.junit.Ignore +import org.junit.runner.RunWith +import org.junit.runners.JUnit4 +import org.junit.Assert.assertTrue +import org.junit.Assert.assertFalse +import org.junit.Assert.assertEquals + +import scala.io.Source + +class XMLEventReaderTest { + + val src = Source.fromString("!") + + @Test + def pull: Unit = { + val er = new XMLEventReader(src) + assertTrue(er.next match { + case EvElemStart(_, "hello", _, _) => true + case _ => false + }) + assertTrue(er.next match { + case EvElemStart(_, "world", _, _) => true + case _ => false + }) + assertTrue(er.next match { + case EvElemEnd(_, "world") => true + case _ => false + }) + assertTrue(er.next match { + case EvText("!") => true + case _ => false + }) + assertTrue(er.next match { + case EvElemEnd(_, "hello") => true + case _ => false + }) + er.stop // allow thread to be garbage-collected + } + +} \ No newline at end of file diff --git a/test/files/jvm/xmlpull.scala b/test/files/jvm/xmlpull.scala deleted file mode 100644 index 9ba7d4cf0..000000000 --- a/test/files/jvm/xmlpull.scala +++ /dev/null @@ -1,31 +0,0 @@ -import scala.xml._ -import scala.xml.pull._ -import scala.io.Source - -object Test { - - val src = Source.fromString("!") - - def main(args: Array[String]) { - var er = new XMLEventReader(src) - er.next match { - case EvElemStart(_, "hello", _, _) => //println("1") - } - er.next match { - case EvElemStart(_, "world", _, _) => //println("2") - } - er.next match { - case EvElemEnd(_, "world") => //println("3") - } - er.next match { - case EvText("!") => //println("4") - } - er.next match { - case EvElemEnd(_, "hello") => //println("5") - } - // you get the picture... - er.stop // allow thread to be garbage-collected - //println("6") - } -} - From dcbf2120b79b80c824845d52bafef79e8b34b626 Mon Sep 17 00:00:00 2001 From: Grzegorz Kossakowski Date: Fri, 18 Oct 2013 13:45:50 +0200 Subject: [PATCH 6/8] Migrate partest jvm/xmlattr.scala test to JUnit. --- src/test/scala/scala/xml/AttributeTest.scala | 68 +++++++++++++++++++ test/files/jvm/xmlattr.check | 18 ----- test/files/jvm/xmlattr.scala | 70 -------------------- 3 files changed, 68 insertions(+), 88 deletions(-) create mode 100644 src/test/scala/scala/xml/AttributeTest.scala delete mode 100644 test/files/jvm/xmlattr.check delete mode 100644 test/files/jvm/xmlattr.scala diff --git a/src/test/scala/scala/xml/AttributeTest.scala b/src/test/scala/scala/xml/AttributeTest.scala new file mode 100644 index 000000000..13aa7bfc6 --- /dev/null +++ b/src/test/scala/scala/xml/AttributeTest.scala @@ -0,0 +1,68 @@ +package scala.xml + +import org.junit.Test +import org.junit.Ignore +import org.junit.runner.RunWith +import org.junit.runners.JUnit4 +import org.junit.Assert.assertTrue +import org.junit.Assert.assertFalse +import org.junit.Assert.assertEquals + +class AttributeTest { + @Test + def unprefixedAttribute: Unit = { + val x = new UnprefixedAttribute("foo","bar", Null) + assertEquals(Some(Text("bar")), x.get("foo")) + assertEquals(Text("bar"), x("foo")) + assertEquals(None, x.get("no_foo")) + assertEquals(null, x("no_foo")) + + val y = x.remove("foo") + assertEquals(Null, y) + + val z = new UnprefixedAttribute("foo", null:NodeSeq, x) + assertEquals(None, z.get("foo")) + + var appended = x append x append x append x + var len = 0; while (appended ne Null) { + appended = appended.next + len = len + 1 + } + assertEquals("removal of duplicates for unprefixed attributes in append", 1, len) + } + + @Test + def attributeWithOption: Unit = { + val x = new UnprefixedAttribute("foo", Some(Text("bar")), Null) + + assertEquals(Some(Text("bar")), x.get("foo")) + assertEquals(Text("bar"), x("foo")) + assertEquals(None, x.get("no_foo")) + assertEquals(null, x("no_foo")) + + val attr1 = Some(Text("foo value")) + val attr2 = None + val y = + assertEquals(Some(Text("foo value")), y.attributes.get("foo")) + assertEquals(Text("foo value"), y.attributes("foo")) + assertEquals(None, y.attributes.get("bar")) + assertEquals(null, y.attributes("bar")) + + val z = new UnprefixedAttribute("foo", None, x) + assertEquals(None, z.get("foo")) + } + + @Test + def attributeToString: Unit = { + val expected: String = """""" + assertEquals(expected, ().toString) + assertEquals(expected, ().toString) + } + + @Test + def attributeOperator: Unit = { + val xml = + assertEquals("apple", xml \@ "bar") + } + +} \ No newline at end of file diff --git a/test/files/jvm/xmlattr.check b/test/files/jvm/xmlattr.check deleted file mode 100644 index a87420d86..000000000 --- a/test/files/jvm/xmlattr.check +++ /dev/null @@ -1,18 +0,0 @@ -true -true -true -true -true -true -removal of duplicates for unprefixed attributes in append = 1 -true -true -true -true -true -true -true -true -true - - diff --git a/test/files/jvm/xmlattr.scala b/test/files/jvm/xmlattr.scala deleted file mode 100644 index 6423268ba..000000000 --- a/test/files/jvm/xmlattr.scala +++ /dev/null @@ -1,70 +0,0 @@ -import xml.{ NodeSeq, Null, Text, UnprefixedAttribute } - -object Test { - - def main(args: Array[String]) { - UnprefixedAttributeTest() - AttributeWithOptionTest() - AttributeOutputTest() - AttributeOperatorTest() - } - - object UnprefixedAttributeTest { - def apply() { - val x = new UnprefixedAttribute("foo","bar", Null) - println(Some(Text("bar")) == x.get("foo")) - println(Text("bar") == x("foo")) - println(None == x.get("no_foo")) - println(null == x("no_foo")) - - val y = x.remove("foo") - println(Null == y) - - val z = new UnprefixedAttribute("foo", null:NodeSeq, x) - println(None == z.get("foo")) - - var appended = x append x append x append x - var len = 0; while (appended ne Null) { - appended = appended.next - len = len + 1 - } - println("removal of duplicates for unprefixed attributes in append = " + len) - } - } - - object AttributeWithOptionTest { - def apply() { - val x = new UnprefixedAttribute("foo", Some(Text("bar")), Null) - - println(Some(Text("bar")) == x.get("foo")) - println(Text("bar") == x("foo")) - println(None == x.get("no_foo")) - println(null == x("no_foo")) - - val attr1 = Some(Text("foo value")) - val attr2 = None - val y = - println(Some(Text("foo value")) == y.attributes.get("foo")); - println(Text("foo value") == y.attributes("foo")) - println(None == y.attributes.get("bar")) - println(null == y.attributes("bar")) - - val z = new UnprefixedAttribute("foo", None, x) - println(None == z.get("foo")) - } - } - - object AttributeOutputTest { - def apply() { - println() - println() - } - } - - object AttributeOperatorTest { - def apply() { - val xml = - assert(xml \@ "bar" == "apple") - } - } -} From be7046bc9f8a152dedd156adfe37e45806e7a979 Mon Sep 17 00:00:00 2001 From: Grzegorz Kossakowski Date: Fri, 18 Oct 2013 13:56:10 +0200 Subject: [PATCH 7/8] Migrate partest jvm/xml04embed.scala test to JUnit. --- .../scala/scala/xml/XMLEmbeddingTest.scala | 23 +++++++++++++++++++ test/files/jvm/xml04embed.check | 3 --- test/files/jvm/xml04embed.scala | 10 -------- 3 files changed, 23 insertions(+), 13 deletions(-) create mode 100644 src/test/scala/scala/xml/XMLEmbeddingTest.scala delete mode 100644 test/files/jvm/xml04embed.check delete mode 100644 test/files/jvm/xml04embed.scala diff --git a/src/test/scala/scala/xml/XMLEmbeddingTest.scala b/src/test/scala/scala/xml/XMLEmbeddingTest.scala new file mode 100644 index 000000000..81c69bfb3 --- /dev/null +++ b/src/test/scala/scala/xml/XMLEmbeddingTest.scala @@ -0,0 +1,23 @@ +package scala.xml + +import org.junit.Test +import org.junit.Ignore +import org.junit.runner.RunWith +import org.junit.runners.JUnit4 +import org.junit.Assert.assertTrue +import org.junit.Assert.assertFalse +import org.junit.Assert.assertEquals + +class XMLEmbeddingTest { + + @Test + def basic: Unit = { + val ya = {{ + assertEquals("{", ya.text) + val ua = }} + assertEquals("}", ua.text) + val za = {{}}{{}}{{}} + assertEquals("{}{}{}", za.text) + } + +} \ No newline at end of file diff --git a/test/files/jvm/xml04embed.check b/test/files/jvm/xml04embed.check deleted file mode 100644 index e71e64514..000000000 --- a/test/files/jvm/xml04embed.check +++ /dev/null @@ -1,3 +0,0 @@ -{ -} -{}{}{} diff --git a/test/files/jvm/xml04embed.scala b/test/files/jvm/xml04embed.scala deleted file mode 100644 index fa453e429..000000000 --- a/test/files/jvm/xml04embed.scala +++ /dev/null @@ -1,10 +0,0 @@ -object Test { - def main(args: Array[String]) { - val ya = {{ - println(ya.text) - val ua = }} - println(ua.text) - val za = {{}}{{}}{{}} - println(za.text) - } -} From e36604efc454d73b196aed0ab58c5764079e1508 Mon Sep 17 00:00:00 2001 From: Grzegorz Kossakowski Date: Fri, 18 Oct 2013 17:10:26 +0200 Subject: [PATCH 8/8] Migrate partest jvm/xml03syntax.scala test to JUnit. --- .../test/scala/scala/xml/XMLSyntaxTest.scala | 75 ++++++++----------- test/files/jvm/xml03syntax.check | 27 ------- 2 files changed, 32 insertions(+), 70 deletions(-) rename test/files/jvm/xml03syntax.scala => src/test/scala/scala/xml/XMLSyntaxTest.scala (58%) delete mode 100755 test/files/jvm/xml03syntax.check diff --git a/test/files/jvm/xml03syntax.scala b/src/test/scala/scala/xml/XMLSyntaxTest.scala similarity index 58% rename from test/files/jvm/xml03syntax.scala rename to src/test/scala/scala/xml/XMLSyntaxTest.scala index 41663681c..fa250b416 100644 --- a/test/files/jvm/xml03syntax.scala +++ b/src/test/scala/scala/xml/XMLSyntaxTest.scala @@ -1,83 +1,72 @@ -import scala.xml._ +package scala.xml -object Test { +import org.junit.Test +import org.junit.Ignore +import org.junit.runner.RunWith +import org.junit.runners.JUnit4 +import org.junit.Assert.assertTrue +import org.junit.Assert.assertFalse +import org.junit.Assert.assertEquals + +class XMLSyntaxTest { private def handle[A](x: Node): A = { - println(x) x.child(0).asInstanceOf[Atom[A]].data } - def main(args: Array[String]) { - test1() - test2() - test3() - } - - private def test1() { + @Test + def test1(): Unit = { val xNull = {null} // these used to be Atom(unit), changed to empty children - - println(xNull.child sameElements Nil) + assertTrue(xNull.child sameElements Nil) val x0 = {} // these used to be Atom(unit), changed to empty children val x00 = { } // dto. - val xa = { "world" } - - println(x0.child sameElements Nil) - println(x00.child sameElements Nil) - println(handle[String](xa) == "world") + assertTrue(x0.child sameElements Nil) + assertTrue(x00.child sameElements Nil) + assertEquals("world", handle[String](xa)) val xb = { 1.5 } - - println(handle[Double](xb) == 1.5) + assertEquals(1.5, handle[Double](xb), 0.0) val xc = { 5 } - - println(handle[Int](xc) == 5) + assertEquals(5, handle[Int](xc)) val xd = { true } - - println(handle[Boolean](xd) == true) + assertEquals(true, handle[Boolean](xd)) val xe = { 5:Short } - - println(handle[Short](xe) == (5:Short)) + assertEquals((5:Short), handle[Short](xe)) val xf = { val x = 27; x } - - println(handle[Int](xf) == 27) + assertEquals(27, handle[Int](xf)) val xg = { List(1,2,3,4) } - - println(xg) - for (z <- xg.child) { - println(z.toString() + {if (z.isInstanceOf[Text]) "(is text node ' ')" else ""}) - } + assertEquals("1 2 3 4", xg.toString) + assertFalse(xg.child.map(_.isInstanceOf[Text]).exists(identity)) val xh = { for(x <- List(1,2,3,4) if x % 2 == 0) yield x } - - println(xh) - for (z <- xh.child) { - println(z.toString() + {if (z.isInstanceOf[Text]) "(is text node ' ')" else ""}) - } - println + assertEquals("2 4", xh.toString) + assertFalse(xh.child.map(_.isInstanceOf[Text]).exists(identity)) } /** see SVN r13821 (emir): support for , * so that Options can be used for optional attributes. */ - private def test2() { + @Test + def test2(): Unit = { val x1: Option[Seq[Node]] = Some(hello) val n1 = ; - println("node="+n1+", key="+n1.attribute("key")) + assertEquals(x1, n1.attribute("key")) val x2: Option[Seq[Node]] = None val n2 = ; - println("node="+n2+", key="+n2.attribute("key")) + assertEquals(x2, n2.attribute("key")) } - private def test3() { + @Test + def test3(): Unit = { // this demonstrates how to handle entities val s = io.Source.fromString(" ") object parser extends xml.parsing.ConstructingParser(s, false /*ignore ws*/) { @@ -91,7 +80,7 @@ object Test { } val parsed = parser.element(TopScope) // parse the source as element // alternatively, we could call document() - println(parsed) + assertEquals("Š", parsed.toString) } } diff --git a/test/files/jvm/xml03syntax.check b/test/files/jvm/xml03syntax.check deleted file mode 100755 index 599cbad68..000000000 --- a/test/files/jvm/xml03syntax.check +++ /dev/null @@ -1,27 +0,0 @@ -true -true -true -world -true -1.5 -true -5 -true -true -true -5 -true -27 -true -1 2 3 4 -1 -2 -3 -4 -2 4 -2 -4 - -node=, key=Some(hello) -node=, key=None -Š