From 2bba3487172e7c397bdaf67ae5ceec356a89240d Mon Sep 17 00:00:00 2001 From: dmharrah Date: Fri, 11 Sep 2009 19:22:30 +0000 Subject: [PATCH] Compatibility fixes for specs 1.6 git-svn-id: https://simple-build-tool.googlecode.com/svn/trunk@1001 d89573ee-9141-11dd-94d4-bdf5e562f29c --- src/main/scala/sbt/TestReportListener.scala | 5 +++-- .../scala/sbt/impl/TestFrameworkImpl.scala | 20 ++++++++++++++++--- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/main/scala/sbt/TestReportListener.scala b/src/main/scala/sbt/TestReportListener.scala index 2f664937c..e60be1ddc 100644 --- a/src/main/scala/sbt/TestReportListener.scala +++ b/src/main/scala/sbt/TestReportListener.scala @@ -168,7 +168,7 @@ final case class SpecificationReportEvent(successes: Int, failures: Int, errors: { def result = if(errors > 0) Some(Result.Error) else if(failures > 0) Some(Result.Failed) else Some(Result.Passed) } -final case class SystemReportEvent(description: String, verb: String, skippedSus:Option[Throwable], literateDescription: Option[Seq[String]], examples: Seq[ExampleReportEvent]) extends SpecsEvent { def result = None } +final case class SystemReportEvent(description: String, verb: String, skipped: Seq[Throwable], literateDescription: Option[Seq[String]], examples: Seq[ExampleReportEvent]) extends SpecsEvent { def result = None } final case class ExampleReportEvent(description: String, errors: Seq[Throwable], failures: Seq[RuntimeException], skipped: Seq[RuntimeException], subExamples: Seq[ExampleReportEvent]) extends SpecsEvent { def result = None } trait EventOutput[E <: TestEvent] @@ -240,7 +240,8 @@ class SpecsOutput(val log: Logger) extends EventOutput[SpecsEvent] } private def reportSystem(sus: SystemReportEvent, padding: String) { - log.info(padding + sus.description + " " + sus.verb + sus.skippedSus.map(" (skipped: " + _.getMessage + ")").getOrElse("")) + val skipped = if(sus.skipped.isEmpty) "" else sus.skipped.map(_.getMessage).mkString(" (skipped: ", ", ", ")") + log.info(padding + sus.description + " " + sus.verb + skipped) for(description <- sus.literateDescription) log.info(padding + description.mkString) reportExamples(sus.examples, padding) diff --git a/src/main/scala/sbt/impl/TestFrameworkImpl.scala b/src/main/scala/sbt/impl/TestFrameworkImpl.scala index 2603eed3f..71599c574 100755 --- a/src/main/scala/sbt/impl/TestFrameworkImpl.scala +++ b/src/main/scala/sbt/impl/TestFrameworkImpl.scala @@ -171,8 +171,17 @@ private[sbt] class SpecsRunner(val log: Logger, val listeners: Seq[TestReportLis description.desc.map(_.text) // LiterateDescription } } - - SystemReportEvent(sus.description, sus.verb, sus.skippedSus, format, reportExamples(sus.examples)) + // these are for 1.6 compatibility, which removed skippedSus (skipped still exists) and examples (moved to specification) + def skipped(sus: Sus) = classOf[Sus].getMethod("skipped").invoke(sus).asInstanceOf[Seq[Throwable]] + def examples(sus: Sus) = + { + try { sus.examples } // we compile against specs 1.4.x, which has examples directly on Sus so this compiles + catch { case _: NoSuchMethodError => // It fails at runtime for specs 1.6 because examples is now on BaseSpecification + val spec = classOf[Sus].getMethod("specification").invoke(sus) + spec.getClass.getMethod("examples").invoke(spec).asInstanceOf[List[Example]] + } + } + SystemReportEvent(sus.description, sus.verb, skipped(sus), format, reportExamples(examples(sus))) } private def reportExamples(examples: Seq[Example]): Seq[ExampleReportEvent] = { @@ -181,6 +190,11 @@ private[sbt] class SpecsRunner(val log: Logger, val listeners: Seq[TestReportLis } private def reportExample(example: Example): ExampleReportEvent = { - ExampleReportEvent(example.description, example.errors, example.failures, example.skipped, reportExamples(example.subExamples)) + def examples(example: Example) = + try { example.subExamples } // we compile against specs 1.4.x, which has subExamples defined on Example, so this compiles + catch { case _ : NoSuchMethodError => // It fails at runtime for specs 1.6 because examples is the new method + classOf[Example].getMethod("examples").invoke(example).asInstanceOf[Seq[Example]] + } + ExampleReportEvent(example.description, example.errors, example.failures, example.skipped, reportExamples(examples(example))) } }