diff --git a/ivy/src/test/scala/ComponentManagerTest.scala b/ivy/src/test/scala/ComponentManagerTest.scala index db3f676cc..80c3f4639 100644 --- a/ivy/src/test/scala/ComponentManagerTest.scala +++ b/ivy/src/test/scala/ComponentManagerTest.scala @@ -3,90 +3,87 @@ package sbt import java.io.File import org.specs2._ import mutable.Specification -import IO.{createDirectory, delete, touch, withTemporaryDirectory} +import IO.{ createDirectory, delete, touch, withTemporaryDirectory } import org.apache.ivy.util.ChecksumHelper import IfMissing.Fail -object ComponentManagerTest extends Specification -{ - val TestID = "manager-test" - "Component manager" should { - "throw an exception if 'file' is called for a non-existing component" in { - withManager { _.file(TestID)(Fail) must throwA[InvalidComponent] } - } - "throw an exception if 'file' is called for an empty component" in { - withManager { manager => - manager.define(TestID, Nil) - ( manager.file(TestID)(Fail) ) must throwA[InvalidComponent] - } - } - "return the file for a single-file component" in { - withManager { manager => - val hash = defineFile(manager, TestID, "a") - checksum(manager.file(TestID)(Fail)) must beEqualTo(hash) - } - } +object ComponentManagerTest extends Specification { + val TestID = "manager-test" + "Component manager" should { + "throw an exception if 'file' is called for a non-existing component" in { + withManager { _.file(TestID)(Fail) must throwA[InvalidComponent] } + } + "throw an exception if 'file' is called for an empty component" in { + withManager { manager => + manager.define(TestID, Nil) + (manager.file(TestID)(Fail)) must throwA[InvalidComponent] + } + } + "return the file for a single-file component" in { + withManager { manager => + val hash = defineFile(manager, TestID, "a") + checksum(manager.file(TestID)(Fail)) must beEqualTo(hash) + } + } - "throw an exception if 'file' is called for multi-file component" in { - withManager { manager => - defineFiles(manager, TestID, "a", "b") - ( manager.file(TestID)(Fail) ) must throwA[InvalidComponent] - } - } - "return the files for a multi-file component" in { - withManager { manager => - val hashes = defineFiles(manager, TestID, "a", "b") - checksum(manager.files(TestID)(Fail)) must haveTheSameElementsAs(hashes) - } - } - "return the files for a single-file component" in { - withManager { manager => - val hashes = defineFiles(manager, TestID, "a") - checksum(manager.files(TestID)(Fail)) must haveTheSameElementsAs(hashes) - } - } - "throw an exception if 'files' is called for a non-existing component" in { - withManager { _.files(TestID)(Fail) must throwA[InvalidComponent] } - } + "throw an exception if 'file' is called for multi-file component" in { + withManager { manager => + defineFiles(manager, TestID, "a", "b") + (manager.file(TestID)(Fail)) must throwA[InvalidComponent] + } + } + "return the files for a multi-file component" in { + withManager { manager => + val hashes = defineFiles(manager, TestID, "a", "b") + checksum(manager.files(TestID)(Fail)) must haveTheSameElementsAs(hashes) + } + } + "return the files for a single-file component" in { + withManager { manager => + val hashes = defineFiles(manager, TestID, "a") + checksum(manager.files(TestID)(Fail)) must haveTheSameElementsAs(hashes) + } + } + "throw an exception if 'files' is called for a non-existing component" in { + withManager { _.files(TestID)(Fail) must throwA[InvalidComponent] } + } - "properly cache a file and then retrieve it to an unresolved component" in { - withTemporaryDirectory { ivyHome => - withManagerHome(ivyHome) { definingManager => - val hash = defineFile(definingManager, TestID, "a") - try - { - definingManager.cache(TestID) - withManagerHome(ivyHome) { usingManager => - checksum(usingManager.file(TestID)(Fail)) must beEqualTo(hash) - } - } - finally { definingManager.clearCache(TestID) } - } - } - } - } - private def checksum(files: Iterable[File]): Seq[String] = files.map(checksum).toSeq - private def checksum(file: File): String = if(file.exists) ChecksumHelper.computeAsString(file, "sha1") else "" - private def defineFile(manager: ComponentManager, id: String, name: String): String = createFile(manager, id, name)(checksum) - private def defineFiles(manager: ComponentManager, id: String, names: String*): Seq[String] = createFiles(manager, id, names : _*)(checksum) - private def createFile[T](manager: ComponentManager, id: String, name: String)(f: File => T): T = createFiles(manager, id, name)(files => f(files.toList.head)) - private def createFiles[T](manager: ComponentManager, id: String, names: String*)(f: Seq[File] => T): T = - withTemporaryDirectory { dir => - val files = names.map(name => new File(dir, name) ) - files.foreach(writeRandomContent) - manager.define(id, files) - f(files) - } - private def writeRandomContent(file: File) = IO.write(file, randomString) - private def randomString = "asdf" - private def withManager[T](f: ComponentManager => T): T = - withTemporaryDirectory { ivyHome => withManagerHome(ivyHome)(f) } + "properly cache a file and then retrieve it to an unresolved component" in { + withTemporaryDirectory { ivyHome => + withManagerHome(ivyHome) { definingManager => + val hash = defineFile(definingManager, TestID, "a") + try { + definingManager.cache(TestID) + withManagerHome(ivyHome) { usingManager => + checksum(usingManager.file(TestID)(Fail)) must beEqualTo(hash) + } + } finally { definingManager.clearCache(TestID) } + } + } + } + } + private def checksum(files: Iterable[File]): Seq[String] = files.map(checksum).toSeq + private def checksum(file: File): String = if (file.exists) ChecksumHelper.computeAsString(file, "sha1") else "" + private def defineFile(manager: ComponentManager, id: String, name: String): String = createFile(manager, id, name)(checksum) + private def defineFiles(manager: ComponentManager, id: String, names: String*): Seq[String] = createFiles(manager, id, names: _*)(checksum) + private def createFile[T](manager: ComponentManager, id: String, name: String)(f: File => T): T = createFiles(manager, id, name)(files => f(files.toList.head)) + private def createFiles[T](manager: ComponentManager, id: String, names: String*)(f: Seq[File] => T): T = + withTemporaryDirectory { dir => + val files = names.map(name => new File(dir, name)) + files.foreach(writeRandomContent) + manager.define(id, files) + f(files) + } + private def writeRandomContent(file: File) = IO.write(file, randomString) + private def randomString = "asdf" + private def withManager[T](f: ComponentManager => T): T = + withTemporaryDirectory { ivyHome => withManagerHome(ivyHome)(f) } - private def withManagerHome[T](ivyHome: File)(f: ComponentManager => T): T = - TestLogger { logger => - withTemporaryDirectory { temp => - val mgr = new ComponentManager(xsbt.boot.Locks, new xsbt.boot.ComponentProvider(temp, true), Some(ivyHome), logger) - f(mgr) - } - } + private def withManagerHome[T](ivyHome: File)(f: ComponentManager => T): T = + TestLogger { logger => + withTemporaryDirectory { temp => + val mgr = new ComponentManager(xsbt.boot.Locks, new xsbt.boot.ComponentProvider(temp, true), Some(ivyHome), logger) + f(mgr) + } + } } diff --git a/ivy/src/test/scala/CrossVersionTest.scala b/ivy/src/test/scala/CrossVersionTest.scala index cd89b1358..364d6c67e 100644 --- a/ivy/src/test/scala/CrossVersionTest.scala +++ b/ivy/src/test/scala/CrossVersionTest.scala @@ -4,120 +4,119 @@ import java.io.File import org.specs2._ import mutable.Specification -object CrossVersionTest extends Specification -{ - "Cross version" should { - "return sbt API for xyz as None" in { - CrossVersion.sbtApiVersion("xyz") must_== None - } - "return sbt API for 0.12 as None" in { - CrossVersion.sbtApiVersion("0.12") must_== None - } - "return sbt API for 0.12.0-SNAPSHOT as None" in { - CrossVersion.sbtApiVersion("0.12.0-SNAPSHOT") must_== None - } - "return sbt API for 0.12.0-RC1 as Some((0, 12))" in { - CrossVersion.sbtApiVersion("0.12.0-RC1") must_== Some((0, 12)) - } - "return sbt API for 0.12.0 as Some((0, 12))" in { - CrossVersion.sbtApiVersion("0.12.0") must_== Some((0, 12)) - } - "return sbt API for 0.12.1-SNAPSHOT as Some((0, 12))" in { - CrossVersion.sbtApiVersion("0.12.1-SNAPSHOT") must_== Some((0, 12)) - } - "return sbt API for 0.12.1-RC1 as Some((0, 12))" in { - CrossVersion.sbtApiVersion("0.12.1-RC1") must_== Some((0, 12)) - } - "return sbt API for 0.12.1 as Some((0, 12))" in { - CrossVersion.sbtApiVersion("0.12.1") must_== Some((0, 12)) - } - "return sbt API compatibility for 0.12.0-M1 as false" in { - CrossVersion.isSbtApiCompatible("0.12.0-M1") must_== false - } - "return sbt API compatibility for 0.12.0-RC1 as true" in { - CrossVersion.isSbtApiCompatible("0.12.0-RC1") must_== true - } - "return sbt API compatibility for 0.12.1-RC1 as true" in { - CrossVersion.isSbtApiCompatible("0.12.1-RC1") must_== true - } - "return binary sbt version for 0.11.3 as 0.11.3" in { - CrossVersion.binarySbtVersion("0.11.3") must_== "0.11.3" - } - "return binary sbt version for 0.12.0-M1 as 0.12.0-M1" in { - CrossVersion.binarySbtVersion("0.12.0-M1") must_== "0.12.0-M1" - } - "return binary sbt version for 0.12.0-RC1 as 0.12" in { - CrossVersion.binarySbtVersion("0.12.0-RC1") must_== "0.12" - } - "return binary sbt version for 0.12.0 as 0.12" in { - CrossVersion.binarySbtVersion("0.12.0") must_== "0.12" - } - "return binary sbt version for 0.12.1-SNAPSHOT as 0.12" in { - CrossVersion.binarySbtVersion("0.12.1-SNAPSHOT") must_== "0.12" - } - "return binary sbt version for 0.12.1-RC1 as 0.12" in { - CrossVersion.binarySbtVersion("0.12.1-RC1") must_== "0.12" - } - "return binary sbt version for 0.12.1 as 0.12" in { - CrossVersion.binarySbtVersion("0.12.1") must_== "0.12" - } +object CrossVersionTest extends Specification { + "Cross version" should { + "return sbt API for xyz as None" in { + CrossVersion.sbtApiVersion("xyz") must_== None + } + "return sbt API for 0.12 as None" in { + CrossVersion.sbtApiVersion("0.12") must_== None + } + "return sbt API for 0.12.0-SNAPSHOT as None" in { + CrossVersion.sbtApiVersion("0.12.0-SNAPSHOT") must_== None + } + "return sbt API for 0.12.0-RC1 as Some((0, 12))" in { + CrossVersion.sbtApiVersion("0.12.0-RC1") must_== Some((0, 12)) + } + "return sbt API for 0.12.0 as Some((0, 12))" in { + CrossVersion.sbtApiVersion("0.12.0") must_== Some((0, 12)) + } + "return sbt API for 0.12.1-SNAPSHOT as Some((0, 12))" in { + CrossVersion.sbtApiVersion("0.12.1-SNAPSHOT") must_== Some((0, 12)) + } + "return sbt API for 0.12.1-RC1 as Some((0, 12))" in { + CrossVersion.sbtApiVersion("0.12.1-RC1") must_== Some((0, 12)) + } + "return sbt API for 0.12.1 as Some((0, 12))" in { + CrossVersion.sbtApiVersion("0.12.1") must_== Some((0, 12)) + } + "return sbt API compatibility for 0.12.0-M1 as false" in { + CrossVersion.isSbtApiCompatible("0.12.0-M1") must_== false + } + "return sbt API compatibility for 0.12.0-RC1 as true" in { + CrossVersion.isSbtApiCompatible("0.12.0-RC1") must_== true + } + "return sbt API compatibility for 0.12.1-RC1 as true" in { + CrossVersion.isSbtApiCompatible("0.12.1-RC1") must_== true + } + "return binary sbt version for 0.11.3 as 0.11.3" in { + CrossVersion.binarySbtVersion("0.11.3") must_== "0.11.3" + } + "return binary sbt version for 0.12.0-M1 as 0.12.0-M1" in { + CrossVersion.binarySbtVersion("0.12.0-M1") must_== "0.12.0-M1" + } + "return binary sbt version for 0.12.0-RC1 as 0.12" in { + CrossVersion.binarySbtVersion("0.12.0-RC1") must_== "0.12" + } + "return binary sbt version for 0.12.0 as 0.12" in { + CrossVersion.binarySbtVersion("0.12.0") must_== "0.12" + } + "return binary sbt version for 0.12.1-SNAPSHOT as 0.12" in { + CrossVersion.binarySbtVersion("0.12.1-SNAPSHOT") must_== "0.12" + } + "return binary sbt version for 0.12.1-RC1 as 0.12" in { + CrossVersion.binarySbtVersion("0.12.1-RC1") must_== "0.12" + } + "return binary sbt version for 0.12.1 as 0.12" in { + CrossVersion.binarySbtVersion("0.12.1") must_== "0.12" + } - "return Scala API for xyz as None" in { - CrossVersion.scalaApiVersion("xyz") must_== None - } - "return Scala API for 2.10 as None" in { - CrossVersion.scalaApiVersion("2.10") must_== None - } - "return Scala API for 2.10.0-SNAPSHOT as None" in { - CrossVersion.scalaApiVersion("2.10.0-SNAPSHOT") must_== None - } - "return Scala API for 2.10.0-RC1 as None" in { - CrossVersion.scalaApiVersion("2.10.0-RC1") must_== None - } - "return Scala API for 2.10.0 as Some((2, 10))" in { - CrossVersion.scalaApiVersion("2.10.0") must_== Some((2, 10)) - } - "return Scala API for 2.10.0-1 as Some((2, 10))" in { - CrossVersion.scalaApiVersion("2.10.0-1") must_== Some((2, 10)) - } - "return Scala API for 2.10.1-SNAPSHOT as Some((2, 10))" in { - CrossVersion.scalaApiVersion("2.10.1-SNAPSHOT") must_== Some((2, 10)) - } - "return Scala API for 2.10.1-RC1 as Some((2, 10))" in { - CrossVersion.scalaApiVersion("2.10.1-RC1") must_== Some((2, 10)) - } - "return Scala API for 2.10.1 as Some((2, 10))" in { - CrossVersion.scalaApiVersion("2.10.1") must_== Some((2, 10)) - } - "return Scala API compatibility for 2.10.0-M1 as false" in { - CrossVersion.isScalaApiCompatible("2.10.0-M1") must_== false - } - "return Scala API compatibility for 2.10.0-RC1 as false" in { - CrossVersion.isScalaApiCompatible("2.10.0-RC1") must_== false - } - "return Scala API compatibility for 2.10.1-RC1 as false" in { - CrossVersion.isScalaApiCompatible("2.10.1-RC1") must_== true - } - "return binary Scala version for 2.9.2 as 2.9.2" in { - CrossVersion.binaryScalaVersion("2.9.2") must_== "2.9.2" - } - "return binary Scala version for 2.10.0-M1 as 2.10.0-M1" in { - CrossVersion.binaryScalaVersion("2.10.0-M1") must_== "2.10.0-M1" - } - "return binary Scala version for 2.10.0-RC1 as 2.10.0-RC1" in { - CrossVersion.binaryScalaVersion("2.10.0-RC1") must_== "2.10.0-RC1" - } - "return binary Scala version for 2.10.0 as 2.10" in { - CrossVersion.binaryScalaVersion("2.10.0") must_== "2.10" - } - "return binary Scala version for 2.10.1-M1 as 2.10" in { - CrossVersion.binaryScalaVersion("2.10.1-M1") must_== "2.10" - } - "return binary Scala version for 2.10.1-RC1 as 2.10" in { - CrossVersion.binaryScalaVersion("2.10.1-RC1") must_== "2.10" - } - "return binary Scala version for 2.10.1 as 2.10" in { - CrossVersion.binaryScalaVersion("2.10.1") must_== "2.10" - } - } + "return Scala API for xyz as None" in { + CrossVersion.scalaApiVersion("xyz") must_== None + } + "return Scala API for 2.10 as None" in { + CrossVersion.scalaApiVersion("2.10") must_== None + } + "return Scala API for 2.10.0-SNAPSHOT as None" in { + CrossVersion.scalaApiVersion("2.10.0-SNAPSHOT") must_== None + } + "return Scala API for 2.10.0-RC1 as None" in { + CrossVersion.scalaApiVersion("2.10.0-RC1") must_== None + } + "return Scala API for 2.10.0 as Some((2, 10))" in { + CrossVersion.scalaApiVersion("2.10.0") must_== Some((2, 10)) + } + "return Scala API for 2.10.0-1 as Some((2, 10))" in { + CrossVersion.scalaApiVersion("2.10.0-1") must_== Some((2, 10)) + } + "return Scala API for 2.10.1-SNAPSHOT as Some((2, 10))" in { + CrossVersion.scalaApiVersion("2.10.1-SNAPSHOT") must_== Some((2, 10)) + } + "return Scala API for 2.10.1-RC1 as Some((2, 10))" in { + CrossVersion.scalaApiVersion("2.10.1-RC1") must_== Some((2, 10)) + } + "return Scala API for 2.10.1 as Some((2, 10))" in { + CrossVersion.scalaApiVersion("2.10.1") must_== Some((2, 10)) + } + "return Scala API compatibility for 2.10.0-M1 as false" in { + CrossVersion.isScalaApiCompatible("2.10.0-M1") must_== false + } + "return Scala API compatibility for 2.10.0-RC1 as false" in { + CrossVersion.isScalaApiCompatible("2.10.0-RC1") must_== false + } + "return Scala API compatibility for 2.10.1-RC1 as false" in { + CrossVersion.isScalaApiCompatible("2.10.1-RC1") must_== true + } + "return binary Scala version for 2.9.2 as 2.9.2" in { + CrossVersion.binaryScalaVersion("2.9.2") must_== "2.9.2" + } + "return binary Scala version for 2.10.0-M1 as 2.10.0-M1" in { + CrossVersion.binaryScalaVersion("2.10.0-M1") must_== "2.10.0-M1" + } + "return binary Scala version for 2.10.0-RC1 as 2.10.0-RC1" in { + CrossVersion.binaryScalaVersion("2.10.0-RC1") must_== "2.10.0-RC1" + } + "return binary Scala version for 2.10.0 as 2.10" in { + CrossVersion.binaryScalaVersion("2.10.0") must_== "2.10" + } + "return binary Scala version for 2.10.1-M1 as 2.10" in { + CrossVersion.binaryScalaVersion("2.10.1-M1") must_== "2.10" + } + "return binary Scala version for 2.10.1-RC1 as 2.10" in { + CrossVersion.binaryScalaVersion("2.10.1-RC1") must_== "2.10" + } + "return binary Scala version for 2.10.1 as 2.10" in { + CrossVersion.binaryScalaVersion("2.10.1") must_== "2.10" + } + } } diff --git a/ivy/src/test/scala/MakePomTest.scala b/ivy/src/test/scala/MakePomTest.scala index 1341b207d..c96d2102e 100644 --- a/ivy/src/test/scala/MakePomTest.scala +++ b/ivy/src/test/scala/MakePomTest.scala @@ -4,26 +4,25 @@ import java.io.File import org.specs2._ import mutable.Specification -object MakePomTest extends Specification -{ - val mp = new MakePom(ConsoleLogger()) - import mp.{makeDependencyVersion=>v} - "MakePom makeDependencyVersion" should { - "Handle .+ in versions" in { - v("1.+") must_== "[1,2)" - v("1.2.3.4.+") must_== "[1.2.3.4,1.2.3.5)" - v("12.31.42.+") must_== "[12.31.42,12.31.43)" - } - /* TODO - do we care about this case? +object MakePomTest extends Specification { + val mp = new MakePom(ConsoleLogger()) + import mp.{ makeDependencyVersion => v } + "MakePom makeDependencyVersion" should { + "Handle .+ in versions" in { + v("1.+") must_== "[1,2)" + v("1.2.3.4.+") must_== "[1.2.3.4,1.2.3.5)" + v("12.31.42.+") must_== "[12.31.42,12.31.43)" + } + /* TODO - do we care about this case? * 1+ --> [1,2),[10,20),[100,200),[1000,2000),[10000,20000),[100000,200000) */ - "Handle ]* bracket in version ranges" in { - v("]1,3]") must_== "(1,3]" - v("]1.1,1.3]") must_== "(1.1,1.3]" - } - "Handle *[ bracket in version ranges" in { - v("[1,3[") must_== "[1,3)" - v("[1.1,1.3[") must_== "[1.1,1.3)" - } - } + "Handle ]* bracket in version ranges" in { + v("]1,3]") must_== "(1,3]" + v("]1.1,1.3]") must_== "(1.1,1.3]" + } + "Handle *[ bracket in version ranges" in { + v("[1,3[") must_== "[1,3)" + v("[1.1,1.3[") must_== "[1.1,1.3)" + } + } }