diff --git a/build.sbt b/build.sbt index d9374e157..92bca0d1a 100644 --- a/build.sbt +++ b/build.sbt @@ -40,7 +40,7 @@ lazy val root = (project in file(".")). bintrayPackage := "librarymanagement" )), commonSettings, - // rootSettings, + name := "LM Root", publish := {}, publishLocal := {}, publishArtifact := false @@ -49,8 +49,11 @@ lazy val root = (project in file(".")). lazy val lm = (project in file("librarymanagement")). settings( commonSettings, - libraryDependencies ++= Seq(utilLogging, utilLogging), - libraryDependencies ++= Seq(sbtIO, utilCollection, ivy, jsch, sbtSerialization, scalaReflect.value, launcherInterface), + libraryDependencies ++= Seq( + utilLogging, (utilLogging % Test).classifier("tests"), + sbtIO, (sbtIO % Test).classifier("tests"), + utilTesting % Test, + utilCollection, ivy, jsch, sbtSerialization, scalaReflect.value, launcherInterface), resourceGenerators in Compile <+= (version, resourceManaged, streams, compile in Compile) map Util.generateVersionFile, name := "librarymanagement" ) diff --git a/librarymanagement/src/main/scala/sbt/ComponentManager.scala b/librarymanagement/src/main/scala/sbt/ComponentManager.scala index bdf78b9ec..af4788ece 100644 --- a/librarymanagement/src/main/scala/sbt/ComponentManager.scala +++ b/librarymanagement/src/main/scala/sbt/ComponentManager.scala @@ -5,6 +5,7 @@ package sbt import java.io.{ File, FileOutputStream } import java.util.concurrent.Callable +import sbt.internal.util.Logger /** * A component manager provides access to the pieces of xsbt that are distributed as components. diff --git a/librarymanagement/src/main/scala/sbt/ConflictWarning.scala b/librarymanagement/src/main/scala/sbt/ConflictWarning.scala index a4e011736..182272476 100644 --- a/librarymanagement/src/main/scala/sbt/ConflictWarning.scala +++ b/librarymanagement/src/main/scala/sbt/ConflictWarning.scala @@ -1,6 +1,7 @@ package sbt import DependencyFilter._ +import sbt.internal.util.{ Logger, Level } /** * Provide warnings for cross version conflicts. diff --git a/librarymanagement/src/main/scala/sbt/ConvertResolver.scala b/librarymanagement/src/main/scala/sbt/ConvertResolver.scala index 9e2f11f63..6658ae45d 100644 --- a/librarymanagement/src/main/scala/sbt/ConvertResolver.scala +++ b/librarymanagement/src/main/scala/sbt/ConvertResolver.scala @@ -18,6 +18,7 @@ import java.io.{ IOException, File } import org.apache.ivy.util.{ FileUtil, ChecksumHelper } import org.apache.ivy.core.module.descriptor.{ Artifact => IArtifact } import sbt.io.IO +import sbt.internal.util.Logger private[sbt] object ConvertResolver { import UpdateOptions.ResolverConverter diff --git a/librarymanagement/src/main/scala/sbt/Credentials.scala b/librarymanagement/src/main/scala/sbt/Credentials.scala index 9cbe9d977..8cbb5ff43 100644 --- a/librarymanagement/src/main/scala/sbt/Credentials.scala +++ b/librarymanagement/src/main/scala/sbt/Credentials.scala @@ -6,6 +6,7 @@ package sbt import java.io.File import org.apache.ivy.util.url.CredentialsStore import sbt.io.IO +import sbt.internal.util.Logger object Credentials { def apply(realm: String, host: String, userName: String, passwd: String): Credentials = diff --git a/librarymanagement/src/main/scala/sbt/EvictionWarning.scala b/librarymanagement/src/main/scala/sbt/EvictionWarning.scala index 7a3bcaed8..55ebf052a 100644 --- a/librarymanagement/src/main/scala/sbt/EvictionWarning.scala +++ b/librarymanagement/src/main/scala/sbt/EvictionWarning.scala @@ -3,6 +3,7 @@ package sbt import collection.mutable import Configurations.Compile import ScalaArtifacts.{ LibraryID, CompilerID } +import sbt.internal.util.{ Logger, ShowLines } final class EvictionWarningOptions private[sbt] ( val configurations: Seq[Configuration], diff --git a/librarymanagement/src/main/scala/sbt/Ivy.scala b/librarymanagement/src/main/scala/sbt/Ivy.scala index e9ac5a23d..fbe38619c 100644 --- a/librarymanagement/src/main/scala/sbt/Ivy.scala +++ b/librarymanagement/src/main/scala/sbt/Ivy.scala @@ -39,6 +39,8 @@ import org.apache.ivy.util.extendable.ExtendableItem import scala.xml.{ NodeSeq, Text } import scala.collection.mutable +import sbt.internal.util.Logger + final class IvySbt(val configuration: IvyConfiguration) { import configuration.baseDirectory diff --git a/librarymanagement/src/main/scala/sbt/IvyActions.scala b/librarymanagement/src/main/scala/sbt/IvyActions.scala index e3cc20602..0a6547d76 100644 --- a/librarymanagement/src/main/scala/sbt/IvyActions.scala +++ b/librarymanagement/src/main/scala/sbt/IvyActions.scala @@ -17,6 +17,7 @@ import org.apache.ivy.core.report.ResolveReport import org.apache.ivy.core.resolve.ResolveOptions import org.apache.ivy.plugins.resolver.{ BasicResolver, DependencyResolver } import sbt.io.{ IO, PathFinder } +import sbt.internal.util.{ Logger, ShowLines, SourcePosition, LinePosition, RangePosition, LineRange } final class DeliverConfiguration(val deliverIvyPattern: String, val status: String, val configurations: Option[Seq[Configuration]], val logging: UpdateLogging.Value) final class PublishConfiguration(val ivyFile: Option[File], val resolverName: String, val artifacts: Map[Artifact, File], val checksums: Seq[String], val logging: UpdateLogging.Value, diff --git a/librarymanagement/src/main/scala/sbt/IvyCache.scala b/librarymanagement/src/main/scala/sbt/IvyCache.scala index 1e715a278..d9c9992f6 100644 --- a/librarymanagement/src/main/scala/sbt/IvyCache.scala +++ b/librarymanagement/src/main/scala/sbt/IvyCache.scala @@ -13,6 +13,7 @@ import org.apache.ivy.plugins.repository.{ ArtifactResourceResolver, Resource, R import org.apache.ivy.plugins.resolver.util.ResolvedResource import org.apache.ivy.util.FileUtil import sbt.io.Path +import sbt.internal.util.Logger class NotInCache(val id: ModuleID, cause: Throwable) extends RuntimeException(NotInCache(id, cause), cause) { diff --git a/librarymanagement/src/main/scala/sbt/IvyConfigurations.scala b/librarymanagement/src/main/scala/sbt/IvyConfigurations.scala index ed8df9546..8b2855423 100644 --- a/librarymanagement/src/main/scala/sbt/IvyConfigurations.scala +++ b/librarymanagement/src/main/scala/sbt/IvyConfigurations.scala @@ -6,6 +6,7 @@ package sbt import java.io.File import java.net.{ URI, URL } import scala.xml.NodeSeq +import sbt.internal.util.Logger final class IvyPaths(val baseDirectory: File, val ivyHome: Option[File]) { def withBase(newBaseDirectory: File) = new IvyPaths(newBaseDirectory, ivyHome) diff --git a/librarymanagement/src/main/scala/sbt/IvyLogger.scala b/librarymanagement/src/main/scala/sbt/IvyLogger.scala index 94268672e..56fa3561d 100644 --- a/librarymanagement/src/main/scala/sbt/IvyLogger.scala +++ b/librarymanagement/src/main/scala/sbt/IvyLogger.scala @@ -4,6 +4,7 @@ package sbt import org.apache.ivy.util.{ Message, MessageLogger, MessageLoggerEngine } +import sbt.internal.util.Logger /** Interface to Ivy logging. */ private final class IvyLoggerInterface(logger: Logger) extends MessageLogger { diff --git a/librarymanagement/src/main/scala/sbt/IvyScala.scala b/librarymanagement/src/main/scala/sbt/IvyScala.scala index fc9400174..f8e8c6a68 100644 --- a/librarymanagement/src/main/scala/sbt/IvyScala.scala +++ b/librarymanagement/src/main/scala/sbt/IvyScala.scala @@ -11,6 +11,8 @@ import org.apache.ivy.core.module.descriptor.{ DependencyDescriptor, DefaultModu import org.apache.ivy.core.module.id.{ ArtifactId, ModuleId, ModuleRevisionId } import org.apache.ivy.plugins.matcher.ExactPatternMatcher +import sbt.internal.util.Logger + object ScalaArtifacts { val Organization = "org.scala-lang" val LibraryID = "scala-library" diff --git a/librarymanagement/src/main/scala/sbt/JsonUtil.scala b/librarymanagement/src/main/scala/sbt/JsonUtil.scala index 6ee5bd68a..1e8dbd5e4 100644 --- a/librarymanagement/src/main/scala/sbt/JsonUtil.scala +++ b/librarymanagement/src/main/scala/sbt/JsonUtil.scala @@ -6,6 +6,7 @@ import org.apache.ivy.core import core.module.descriptor.ModuleDescriptor import sbt.serialization._ import java.net.{ URLEncoder, URLDecoder } +import sbt.internal.util.Logger private[sbt] object JsonUtil { def sbtOrgTemp = "org.scala-sbt.temp" diff --git a/librarymanagement/src/main/scala/sbt/MakePom.scala b/librarymanagement/src/main/scala/sbt/MakePom.scala index 472dd6cfb..663173e0d 100644 --- a/librarymanagement/src/main/scala/sbt/MakePom.scala +++ b/librarymanagement/src/main/scala/sbt/MakePom.scala @@ -8,6 +8,7 @@ package sbt import java.io.File +import sbt.internal.util.Logger import sbt.mavenint.PomExtraDependencyAttributes diff --git a/librarymanagement/src/main/scala/sbt/UpdateOptions.scala b/librarymanagement/src/main/scala/sbt/UpdateOptions.scala index 3a710026c..159472672 100644 --- a/librarymanagement/src/main/scala/sbt/UpdateOptions.scala +++ b/librarymanagement/src/main/scala/sbt/UpdateOptions.scala @@ -3,6 +3,7 @@ package sbt import java.io.File import org.apache.ivy.plugins.resolver.DependencyResolver import org.apache.ivy.core.settings.IvySettings +import sbt.internal.util.Logger /** * Represents configurable options for update task. diff --git a/librarymanagement/src/main/scala/sbt/ivyint/CachedResolutionResolveEngine.scala b/librarymanagement/src/main/scala/sbt/ivyint/CachedResolutionResolveEngine.scala index ab0896649..34dd0c308 100644 --- a/librarymanagement/src/main/scala/sbt/ivyint/CachedResolutionResolveEngine.scala +++ b/librarymanagement/src/main/scala/sbt/ivyint/CachedResolutionResolveEngine.scala @@ -23,6 +23,7 @@ import Configurations.{ System => _, _ } import annotation.tailrec import scala.concurrent.duration._ import sbt.io.{ DirectoryFilter, Hash, IO, Path } +import sbt.internal.util.Logger private[sbt] object CachedResolutionResolveCache { def createID(organization: String, name: String, revision: String) = diff --git a/librarymanagement/src/main/scala/sbt/ivyint/SbtChainResolver.scala b/librarymanagement/src/main/scala/sbt/ivyint/SbtChainResolver.scala index 6b1f59a15..73328ce5c 100644 --- a/librarymanagement/src/main/scala/sbt/ivyint/SbtChainResolver.scala +++ b/librarymanagement/src/main/scala/sbt/ivyint/SbtChainResolver.scala @@ -15,6 +15,7 @@ import org.apache.ivy.plugins.repository.url.URLResource import org.apache.ivy.plugins.resolver._ import org.apache.ivy.plugins.resolver.util.{ HasLatestStrategy, ResolvedResource } import org.apache.ivy.util.{ Message, StringUtils => IvyStringUtils } +import sbt.internal.util.Logger private[sbt] case class SbtChainResolver( name: String, diff --git a/librarymanagement/src/test/scala/BaseIvySpecification.scala b/librarymanagement/src/test/scala/BaseIvySpecification.scala index f4e21c4c0..8b46ccd9c 100644 --- a/librarymanagement/src/test/scala/BaseIvySpecification.scala +++ b/librarymanagement/src/test/scala/BaseIvySpecification.scala @@ -3,11 +3,12 @@ package sbt import sbt.io.Path._, Configurations._ import sbt.io.IO import java.io.File -import org.specs2._ import cross.CrossVersionUtil import sbt.ivyint.SbtChainResolver +import sbt.internal.util.{ Logger, ConsoleLogger } +import sbt.internal.util.UnitSpec -trait BaseIvySpecification extends Specification { +trait BaseIvySpecification extends UnitSpec { def currentBase: File = new File(".") def currentTarget: File = currentBase / "target" / "ivyhome" def currentManaged: File = currentBase / "target" / "lib_managed" diff --git a/librarymanagement/src/test/scala/CachedResolutionSpec.scala b/librarymanagement/src/test/scala/CachedResolutionSpec.scala index 719431282..c4282120a 100644 --- a/librarymanagement/src/test/scala/CachedResolutionSpec.scala +++ b/librarymanagement/src/test/scala/CachedResolutionSpec.scala @@ -1,33 +1,11 @@ package sbt -import org.specs2._ +import sbt.internal.util.ShowLines class CachedResolutionSpec extends BaseIvySpecification { - def is = args(sequential = true) ^ s2""" - - This is a specification to check the cached resolution - - Resolving the same module twice should - work $e1 - - Resolving the unsolvable module should - not work $e2 - - Resolving a module with a pseudo-conflict should - work $e3 - """ - - def commonsIo13 = ModuleID("commons-io", "commons-io", "1.3", Some("compile")) - def mavenCayennePlugin302 = ModuleID("org.apache.cayenne.plugins", "maven-cayenne-plugin", "3.0.2", Some("compile")) - def avro177 = ModuleID("org.apache.avro", "avro", "1.7.7", Some("compile")) - def dataAvro1940 = ModuleID("com.linkedin.pegasus", "data-avro", "1.9.40", Some("compile")) - def netty320 = ModuleID("org.jboss.netty", "netty", "3.2.0.Final", Some("compile")) - - def defaultOptions = EvictionWarningOptions.default - import ShowLines._ - def e1 = { + "Resolving the same module twice" should "work" in { cleanIvyCache() val m = module(ModuleID("com.example", "foo", "0.1.0", Some("compile")), Seq(commonsIo13), Some("2.10.2"), UpdateOptions().withCachedResolution(true)) @@ -38,10 +16,10 @@ class CachedResolutionSpec extends BaseIvySpecification { println(report) // second resolution reads from the minigraph println(report.configurations.head.modules.head.artifacts) - report.configurations.size must_== 3 + report.configurations.size shouldBe 3 } - def e2 = { + "Resolving the unsolvable module should" should "not work" in { // log.setLevel(Level.Debug) val m = module(ModuleID("com.example", "foo", "0.2.0", Some("compile")), Seq(mavenCayennePlugin302), Some("2.10.2"), UpdateOptions().withCachedResolution(true)) @@ -53,11 +31,11 @@ class CachedResolutionSpec extends BaseIvySpecification { ivyUpdateEither(m) match { case Right(_) => sys.error("this should've failed 2") case Left(uw) => - uw.lines must contain(allOf("\n\tNote: Unresolved dependencies path:", + uw.lines should contain allOf("\n\tNote: Unresolved dependencies path:", "\t\tfoundrylogic.vpp:vpp:2.2.1", "\t\t +- org.apache.cayenne:cayenne-tools:3.0.2", "\t\t +- org.apache.cayenne.plugins:maven-cayenne-plugin:3.0.2", - "\t\t +- com.example:foo:0.2.0")) + "\t\t +- com.example:foo:0.2.0") } } @@ -65,7 +43,7 @@ class CachedResolutionSpec extends BaseIvySpecification { // data-avro:1.9.40 depends on avro:1.4.0, which depends on netty:3.2.1.Final. // avro:1.4.0 will be evicted by avro:1.7.7. // #2046 says that netty:3.2.0.Final is incorrectly evicted by netty:3.2.1.Final - def e3 = { + "Resolving a module with a pseudo-conflict" should "work" in { // log.setLevel(Level.Debug) cleanIvyCache() val m = module(ModuleID("com.example", "foo", "0.3.0", Some("compile")), @@ -76,8 +54,16 @@ class CachedResolutionSpec extends BaseIvySpecification { cleanCachedResolutionCache(m) // second resolution reads from the minigraph val report = ivyUpdate(m) - val modules = report.configurations.head.modules - (modules must containMatch("""org\.jboss\.netty:netty:3\.2\.0.Final""")) and - (modules must not containMatch ("""org\.jboss\.netty:netty:3\.2\.1.Final""")) + val modules: Seq[String] = report.configurations.head.modules map {_.toString} + modules should contain("""org.jboss.netty:netty:3.2.0.Final""") + modules should not contain("""org.jboss.netty:netty:3.2.1.Final""") } + + def commonsIo13 = ModuleID("commons-io", "commons-io", "1.3", Some("compile")) + def mavenCayennePlugin302 = ModuleID("org.apache.cayenne.plugins", "maven-cayenne-plugin", "3.0.2", Some("compile")) + def avro177 = ModuleID("org.apache.avro", "avro", "1.7.7", Some("compile")) + def dataAvro1940 = ModuleID("com.linkedin.pegasus", "data-avro", "1.9.40", Some("compile")) + def netty320 = ModuleID("org.jboss.netty", "netty", "3.2.0.Final", Some("compile")) + + def defaultOptions = EvictionWarningOptions.default } diff --git a/librarymanagement/src/test/scala/ComponentManagerTest.scala b/librarymanagement/src/test/scala/ComponentManagerTest.scala index 29017b6a3..19c29cda8 100644 --- a/librarymanagement/src/test/scala/ComponentManagerTest.scala +++ b/librarymanagement/src/test/scala/ComponentManagerTest.scala @@ -2,73 +2,74 @@ package sbt import java.io.File import java.util.concurrent.Callable -import org.specs2._ -import mutable.Specification import sbt.io.IO.{ createDirectory, delete, touch, withTemporaryDirectory } import sbt.io.IO import org.apache.ivy.util.ChecksumHelper import IfMissing.Fail import xsbti.ComponentProvider +import sbt.internal.util.Logger +import sbt.internal.util.{ UnitSpec, TestLogger } // TODO - We need to re-enable this test. Right now, we dont' have a "stub" launcher for this. // This is testing something which uses a launcher interface, but was grabbing the underlying class directly // when it really should, instead, be stubbing out the underyling class. -object ComponentManagerTest extends Specification { +class ComponentManagerTest extends UnitSpec { 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] } + "Component manager" should "throw an exception if 'file' is called for a non-existing component" in { + withManager { manager => + intercept[InvalidComponent] { manager.file(TestID)(Fail) } } - "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] - } + } + it should "throw an exception if 'file' is called for an empty component" in { + withManager { manager => + manager.define(TestID, Nil) + intercept[InvalidComponent] { manager.file(TestID)(Fail) } } - "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) - } + } + it should "return the file for a single-file component" in { + withManager { manager => + val hash = defineFile(manager, TestID, "a") + checksum(manager.file(TestID)(Fail)) shouldBe 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] - } + } + it should "throw an exception if 'file' is called for multi-file component" in { + withManager { manager => + defineFiles(manager, TestID, "a", "b") + intercept[InvalidComponent] { manager.file(TestID)(Fail) } } - "return the files for a multi-file component" in { - withManager { manager => - val hashes = defineFiles(manager, TestID, "a", "b") - checksum(manager.files(TestID)(Fail)) must containTheSameElementsAs(hashes) - } + } + it should "return the files for a multi-file component" in { + withManager { manager => + val hashes = defineFiles(manager, TestID, "a", "b") + checksum(manager.files(TestID)(Fail)) should contain theSameElementsAs (hashes) } - "return the files for a single-file component" in { - withManager { manager => - val hashes = defineFiles(manager, TestID, "a") - checksum(manager.files(TestID)(Fail)) must containTheSameElementsAs(hashes) - } + } + it should "return the files for a single-file component" in { + withManager { manager => + val hashes = defineFiles(manager, TestID, "a") + checksum(manager.files(TestID)(Fail)) should contain theSameElementsAs (hashes) } - "throw an exception if 'files' is called for a non-existing component" in { - withManager { _.files(TestID)(Fail) must throwA[InvalidComponent] } + } + it should "throw an exception if 'files' is called for a non-existing component" in { + withManager { manager => + intercept[InvalidComponent] { manager.files(TestID)(Fail) } } - - "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) } - } + } + it should "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)) shouldBe 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) diff --git a/librarymanagement/src/test/scala/CrossVersionTest.scala b/librarymanagement/src/test/scala/CrossVersionTest.scala index 364d6c67e..33e1f62f2 100644 --- a/librarymanagement/src/test/scala/CrossVersionTest.scala +++ b/librarymanagement/src/test/scala/CrossVersionTest.scala @@ -1,122 +1,118 @@ package sbt import java.io.File -import org.specs2._ -import mutable.Specification +import sbt.internal.util.UnitSpec -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" - } +class CrossVersionTest extends UnitSpec { + "Cross version" should "return sbt API for xyz as None" in { + CrossVersion.sbtApiVersion("xyz") shouldBe None + } + it should "return sbt API for 0.12 as None" in { + CrossVersion.sbtApiVersion("0.12") shouldBe None + } + it should "return sbt API for 0.12.0-SNAPSHOT as None" in { + CrossVersion.sbtApiVersion("0.12.0-SNAPSHOT") shouldBe None + } + it should "return sbt API for 0.12.0-RC1 as Some((0, 12))" in { + CrossVersion.sbtApiVersion("0.12.0-RC1") shouldBe Some((0, 12)) + } + it should "return sbt API for 0.12.0 as Some((0, 12))" in { + CrossVersion.sbtApiVersion("0.12.0") shouldBe Some((0, 12)) + } + it should "return sbt API for 0.12.1-SNAPSHOT as Some((0, 12))" in { + CrossVersion.sbtApiVersion("0.12.1-SNAPSHOT") shouldBe Some((0, 12)) + } + it should "return sbt API for 0.12.1-RC1 as Some((0, 12))" in { + CrossVersion.sbtApiVersion("0.12.1-RC1") shouldBe Some((0, 12)) + } + it should "return sbt API for 0.12.1 as Some((0, 12))" in { + CrossVersion.sbtApiVersion("0.12.1") shouldBe Some((0, 12)) + } + it should "return sbt API compatibility for 0.12.0-M1 as false" in { + CrossVersion.isSbtApiCompatible("0.12.0-M1") shouldBe false + } + it should "return sbt API compatibility for 0.12.0-RC1 as true" in { + CrossVersion.isSbtApiCompatible("0.12.0-RC1") shouldBe true + } + it should "return sbt API compatibility for 0.12.1-RC1 as true" in { + CrossVersion.isSbtApiCompatible("0.12.1-RC1") shouldBe true + } + it should "return binary sbt version for 0.11.3 as 0.11.3" in { + CrossVersion.binarySbtVersion("0.11.3") shouldBe "0.11.3" + } + it should "return binary sbt version for 0.12.0-M1 as 0.12.0-M1" in { + CrossVersion.binarySbtVersion("0.12.0-M1") shouldBe "0.12.0-M1" + } + it should "return binary sbt version for 0.12.0-RC1 as 0.12" in { + CrossVersion.binarySbtVersion("0.12.0-RC1") shouldBe "0.12" + } + it should "return binary sbt version for 0.12.0 as 0.12" in { + CrossVersion.binarySbtVersion("0.12.0") shouldBe "0.12" + } + it should "return binary sbt version for 0.12.1-SNAPSHOT as 0.12" in { + CrossVersion.binarySbtVersion("0.12.1-SNAPSHOT") shouldBe "0.12" + } + it should "return binary sbt version for 0.12.1-RC1 as 0.12" in { + CrossVersion.binarySbtVersion("0.12.1-RC1") shouldBe "0.12" + } + it should "return binary sbt version for 0.12.1 as 0.12" in { + CrossVersion.binarySbtVersion("0.12.1") shouldBe "0.12" + } + it should "return Scala API for xyz as None" in { + CrossVersion.scalaApiVersion("xyz") shouldBe None + } + it should "return Scala API for 2.10 as None" in { + CrossVersion.scalaApiVersion("2.10") shouldBe None + } + it should "return Scala API for 2.10.0-SNAPSHOT as None" in { + CrossVersion.scalaApiVersion("2.10.0-SNAPSHOT") shouldBe None + } + it should "return Scala API for 2.10.0-RC1 as None" in { + CrossVersion.scalaApiVersion("2.10.0-RC1") shouldBe None + } + it should "return Scala API for 2.10.0 as Some((2, 10))" in { + CrossVersion.scalaApiVersion("2.10.0") shouldBe Some((2, 10)) + } + it should "return Scala API for 2.10.0-1 as Some((2, 10))" in { + CrossVersion.scalaApiVersion("2.10.0-1") shouldBe Some((2, 10)) + } + it should "return Scala API for 2.10.1-SNAPSHOT as Some((2, 10))" in { + CrossVersion.scalaApiVersion("2.10.1-SNAPSHOT") shouldBe Some((2, 10)) + } + it should "return Scala API for 2.10.1-RC1 as Some((2, 10))" in { + CrossVersion.scalaApiVersion("2.10.1-RC1") shouldBe Some((2, 10)) + } + it should "return Scala API for 2.10.1 as Some((2, 10))" in { + CrossVersion.scalaApiVersion("2.10.1") shouldBe Some((2, 10)) + } + it should "return Scala API compatibility for 2.10.0-M1 as false" in { + CrossVersion.isScalaApiCompatible("2.10.0-M1") shouldBe false + } + it should "return Scala API compatibility for 2.10.0-RC1 as false" in { + CrossVersion.isScalaApiCompatible("2.10.0-RC1") shouldBe false + } + it should "return Scala API compatibility for 2.10.1-RC1 as false" in { + CrossVersion.isScalaApiCompatible("2.10.1-RC1") shouldBe true + } + it should "return binary Scala version for 2.9.2 as 2.9.2" in { + CrossVersion.binaryScalaVersion("2.9.2") shouldBe "2.9.2" + } + it should "return binary Scala version for 2.10.0-M1 as 2.10.0-M1" in { + CrossVersion.binaryScalaVersion("2.10.0-M1") shouldBe "2.10.0-M1" + } + it should "return binary Scala version for 2.10.0-RC1 as 2.10.0-RC1" in { + CrossVersion.binaryScalaVersion("2.10.0-RC1") shouldBe "2.10.0-RC1" + } + it should "return binary Scala version for 2.10.0 as 2.10" in { + CrossVersion.binaryScalaVersion("2.10.0") shouldBe "2.10" + } + it should "return binary Scala version for 2.10.1-M1 as 2.10" in { + CrossVersion.binaryScalaVersion("2.10.1-M1") shouldBe "2.10" + } + it should "return binary Scala version for 2.10.1-RC1 as 2.10" in { + CrossVersion.binaryScalaVersion("2.10.1-RC1") shouldBe "2.10" + } + it should "return binary Scala version for 2.10.1 as 2.10" in { + CrossVersion.binaryScalaVersion("2.10.1") shouldBe "2.10" } } diff --git a/librarymanagement/src/test/scala/CustomPomParserTest.scala b/librarymanagement/src/test/scala/CustomPomParserTest.scala index 262e4a22b..c2bf9180b 100644 --- a/librarymanagement/src/test/scala/CustomPomParserTest.scala +++ b/librarymanagement/src/test/scala/CustomPomParserTest.scala @@ -2,36 +2,32 @@ import java.io.File import org.apache.ivy.core.module.descriptor.{ Artifact => IvyArtifact } import org.apache.ivy.core.module.id.ModuleRevisionId import org.apache.ivy.core.resolve.ResolveOptions -import org.specs2.mutable.Specification import sbt._ import sbt.io.IO.withTemporaryDirectory +import sbt.internal.util.{ Logger, ConsoleLogger } +import sbt.internal.util.UnitSpec -object CustomPomParserTest extends Specification { +class CustomPomParserTest extends UnitSpec { + "CustomPomParser" should "resolve an artifact with packaging 'scala-jar' as a regular jar file." in { + val log = ConsoleLogger() + withTemporaryDirectory { cacheDir => + val repoUrl = getClass.getResource("/test-maven-repo") + val local = MavenRepository("Test Repo", repoUrl.toExternalForm) + val paths = new IvyPaths(new File("."), Some(cacheDir)) + val conf = new InlineIvyConfiguration(paths, Seq(local), Nil, Nil, false, None, Seq("sha1", "md5"), None, log) + val ivySbt = new IvySbt(conf) + val resolveOpts = new ResolveOptions().setConfs(Array("default")) + val mrid = ModuleRevisionId.newInstance("com.test", "test-artifact", "1.0.0-SNAPSHOT") - "CustomPomParser" should { - "resolve an artifact with packaging 'scala-jar' as a regular jar file." in { - val log = ConsoleLogger() - withTemporaryDirectory { cacheDir => - val repoUrl = getClass.getResource("/test-maven-repo") - val local = MavenRepository("Test Repo", repoUrl.toExternalForm) - val paths = new IvyPaths(new File("."), Some(cacheDir)) - val conf = new InlineIvyConfiguration(paths, Seq(local), Nil, Nil, false, None, Seq("sha1", "md5"), None, log) - val ivySbt = new IvySbt(conf) - val resolveOpts = new ResolveOptions().setConfs(Array("default")) - val mrid = ModuleRevisionId.newInstance("com.test", "test-artifact", "1.0.0-SNAPSHOT") - - val resolveReport = ivySbt.withIvy(log) { ivy => - ivy.resolve(mrid, resolveOpts, true) - } - - resolveReport.hasError must beFalse - resolveReport.getArtifacts.size() must beEqualTo(1) - val artifact: IvyArtifact = resolveReport.getArtifacts.asInstanceOf[java.util.List[IvyArtifact]].get(0) - artifact.getModuleRevisionId must beEqualTo(mrid) - artifact.getExt must beEqualTo("jar") + val resolveReport = ivySbt.withIvy(log) { ivy => + ivy.resolve(mrid, resolveOpts, true) } + resolveReport.hasError shouldBe false + resolveReport.getArtifacts.size() shouldBe 1 + val artifact: IvyArtifact = resolveReport.getArtifacts.asInstanceOf[java.util.List[IvyArtifact]].get(0) + artifact.getModuleRevisionId shouldBe mrid + artifact.getExt shouldBe "jar" } } - } diff --git a/librarymanagement/src/test/scala/DMSerializationSpec.scala b/librarymanagement/src/test/scala/DMSerializationSpec.scala index bf62de10b..532fae381 100644 --- a/librarymanagement/src/test/scala/DMSerializationSpec.scala +++ b/librarymanagement/src/test/scala/DMSerializationSpec.scala @@ -1,46 +1,50 @@ package sbt -import org.specs2._ -import matcher.MatchResult import java.net.URL import java.io.File import sbt.serialization._ +import sbt.internal.util.UnitSpec -class DMSerializationSpec extends Specification { - def is = sequential ^ s2""" - - This is a specification to check the serialization of dependency graph. - - CrossVersion.full should - ${roundtripStr(CrossVersion.full: sbt.CrossVersion)} - CrossVersion.binary should - ${roundtripStr(CrossVersion.binary: sbt.CrossVersion)} - CrossVersion.Disabled should - ${roundtrip(CrossVersion.Disabled: sbt.CrossVersion)} - - Artifact("foo") should - ${roundtrip(Artifact("foo"))} - Artifact("foo", "sources") should - ${roundtrip(Artifact("foo", "sources"))} - Artifact.pom("foo") should - ${roundtrip(Artifact.pom("foo"))} - Artifact("foo", url("http://example.com/")) should - ${roundtrip(Artifact("foo", new URL("http://example.com/")))} - Artifact("foo").extra(("key", "value")) should - ${roundtrip(Artifact("foo").extra(("key", "value")))} - - ModuleID("org", "name", "1.0") should - ${roundtrip(ModuleID("org", "name", "1.0"))} - - ModuleReport(ModuleID("org", "name", "1.0"), Nil, Nil) should - ${roundtripStr(ModuleReport(ModuleID("org", "name", "1.0"), Nil, Nil))} - Organization artifact report should - ${roundtripStr(organizationArtifactReportExample)} - Configuration report should - ${roundtripStr(configurationReportExample)} - Update report should - ${roundtripStr(updateReportExample)} - """ +class DMSerializationSpec extends UnitSpec { + "CrossVersion.full" should "roundtrip" in { + roundtripStr(CrossVersion.full: sbt.CrossVersion) + } + "CrossVersion.binary" should "roundtrip" in { + roundtripStr(CrossVersion.binary: sbt.CrossVersion) + } + "CrossVersion.Disabled" should "roundtrip" in { + roundtrip(CrossVersion.Disabled: sbt.CrossVersion) + } + """Artifact("foo")""" should "roundtrip" in { + roundtrip(Artifact("foo")) + } + """Artifact("foo", "sources")""" should "roundtrip" in { + roundtrip(Artifact("foo", "sources")) + } + """Artifact.pom("foo")""" should "roundtrip" in { + roundtrip(Artifact.pom("foo")) + } + """Artifact("foo", url("http://example.com/"))""" should "roundtrip" in { + roundtrip(Artifact("foo", new URL("http://example.com/"))) + } + """Artifact("foo").extra(("key", "value"))""" should "roundtrip" in { + roundtrip(Artifact("foo").extra(("key", "value"))) + } + """ModuleID("org", "name", "1.0")""" should "roundtrip" in { + roundtrip(ModuleID("org", "name", "1.0")) + } + """ModuleReport(ModuleID("org", "name", "1.0"), Nil, Nil)""" should "roundtrip" in { + roundtripStr(ModuleReport(ModuleID("org", "name", "1.0"), Nil, Nil)) + } + "Organization artifact report" should "roundtrip" in { + roundtripStr(organizationArtifactReportExample) + } + "Configuration report" should "roundtrip" in { + roundtripStr(configurationReportExample) + } + "Update report" should "roundtrip" in { + roundtripStr(updateReportExample) + } lazy val updateReportExample = new UpdateReport(new File("./foo"), Vector(configurationReportExample), @@ -53,11 +57,11 @@ class DMSerializationSpec extends Specification { lazy val moduleReportExample = ModuleReport(ModuleID("org", "name", "1.0"), Nil, Nil) - def roundtrip[A: Pickler: Unpickler](a: A) = - roundtripBuilder(a) { _ must_== _ } - def roundtripStr[A: Pickler: Unpickler](a: A) = - roundtripBuilder(a) { _.toString must_== _.toString } - def roundtripBuilder[A: Pickler: Unpickler](a: A)(f: (A, A) => MatchResult[Any]): MatchResult[Any] = + def roundtrip[A: Pickler: Unpickler](a: A): Unit = + roundtripBuilder(a) { _ shouldBe _ } + def roundtripStr[A: Pickler: Unpickler](a: A): Unit = + roundtripBuilder(a) { _.toString shouldBe _.toString } + def roundtripBuilder[A: Pickler: Unpickler](a: A)(f: (A, A) => Unit): Unit = { val json = toJsonString(a) println(json) diff --git a/librarymanagement/src/test/scala/EvictionWarningSpec.scala b/librarymanagement/src/test/scala/EvictionWarningSpec.scala index 0e1e3dd2c..a2f30fb3b 100644 --- a/librarymanagement/src/test/scala/EvictionWarningSpec.scala +++ b/librarymanagement/src/test/scala/EvictionWarningSpec.scala @@ -1,52 +1,40 @@ package sbt -import org.specs2._ - class EvictionWarningSpec extends BaseIvySpecification { - def is = s2""" + // This is a specification to check the eviction warnings - This is a specification to check the eviction warnings + "Eviction of scala-library whose scalaVersion" should "be detected" in scalaVersionWarn1 + it should "not be detected if it's diabled" in scalaVersionWarn2 + it should "print out message about the eviction" in scalaVersionWarn3 + it should "print out message about the eviction with callers" in scalaVersionWarn4 - Eviction of scala-library whose scalaVersion should - be detected $scalaVersionWarn1 - not be detected if it's diabled $scalaVersionWarn2 - print out message about the eviction $scalaVersionWarn3 - print out message about the eviction with callers $scalaVersionWarn4 + """Including two (suspect) binary incompatible Java libraries to + direct dependencies""" should "be detected as eviction" in javaLibWarn1 + it should "not be detected if it's disabled" in javaLibWarn2 + it should "print out message about the eviction" in javaLibWarn3 + it should "print out message about the eviction with callers" in javaLibWarn4 - Including two (suspect) binary incompatible Java libraries to - direct dependencies should - be detected as eviction $javaLibWarn1 - not be detected if it's disabled $javaLibWarn2 - print out message about the eviction $javaLibWarn3 - print out message about the eviction with callers $javaLibWarn4 + """Including two (suspect) binary compatible Java libraries to + direct dependencies""" should "not be detected as eviction" in javaLibNoWarn1 + it should "print out message about the eviction" in javaLibNoWarn2 - Including two (suspect) binary compatible Java libraries to - direct dependencies should - not be detected as eviction $javaLibNoWarn1 - print out message about the eviction $javaLibNoWarn2 + """Including two (suspect) transitively binary incompatible Java libraries to + direct dependencies""" should "be not detected as eviction" in javaLibTransitiveWarn1 + it should "be detected if it's enabled" in javaLibTransitiveWarn2 + it should "print out message about the eviction if it's enabled" in javaLibTransitiveWarn3 - Including two (suspect) transitively binary incompatible Java libraries to - direct dependencies should - be not detected as eviction $javaLibTransitiveWarn1 - be detected if it's enabled $javaLibTransitiveWarn2 - print out message about the eviction if it's enabled $javaLibTransitiveWarn3 + """Including two (suspect) binary incompatible Scala libraries to + direct dependencies""" should "be detected as eviction" in scalaLibWarn1 + it should "print out message about the eviction" in scalaLibWarn2 - Including two (suspect) binary incompatible Scala libraries to - direct dependencies should - be detected as eviction $scalaLibWarn1 - print out message about the eviction $scalaLibWarn2 + """Including two (suspect) binary compatible Scala libraries to + direct dependencies""" should "not be detected as eviction" in scalaLibNoWarn1 + it should "print out message about the eviction" in scalaLibNoWarn2 - Including two (suspect) binary compatible Scala libraries to - direct dependencies should - not be detected as eviction $scalaLibNoWarn1 - print out message about the eviction $scalaLibNoWarn2 - - Including two (suspect) transitively binary incompatible Scala libraries to - direct dependencies should - be not detected as eviction $scalaLibTransitiveWarn1 - be detected if it's enabled $scalaLibTransitiveWarn2 - print out message about the eviction if it's enabled $scalaLibTransitiveWarn3 - """ + """Including two (suspect) transitively binary incompatible Scala libraries to + direct dependencies""" should "be not detected as eviction" in scalaLibTransitiveWarn1 + it should "be detected if it's enabled" in scalaLibTransitiveWarn2 + it should "print out message about the eviction if it's enabled" in scalaLibTransitiveWarn3 def akkaActor214 = ModuleID("com.typesafe.akka", "akka-actor", "2.1.4", Some("compile")) cross CrossVersion.binary def akkaActor230 = ModuleID("com.typesafe.akka", "akka-actor", "2.3.0", Some("compile")) cross CrossVersion.binary @@ -64,26 +52,26 @@ class EvictionWarningSpec extends BaseIvySpecification { def defaultOptions = EvictionWarningOptions.default - import ShowLines._ + import sbt.internal.util.ShowLines._ def scalaVersionDeps = Seq(scala2102, akkaActor230) def scalaVersionWarn1 = { val m = module(defaultModuleId, scalaVersionDeps, Some("2.10.2")) val report = ivyUpdate(m) - EvictionWarning(m, defaultOptions, report, log).scalaEvictions must have size (1) + EvictionWarning(m, defaultOptions, report, log).scalaEvictions should have size(1) } def scalaVersionWarn2 = { val m = module(defaultModuleId, scalaVersionDeps, Some("2.10.2")) val report = ivyUpdate(m) - EvictionWarning(m, defaultOptions.withWarnScalaVersionEviction(false), report, log).scalaEvictions must have size (0) + EvictionWarning(m, defaultOptions.withWarnScalaVersionEviction(false), report, log).scalaEvictions should have size(0) } def scalaVersionWarn3 = { val m = module(defaultModuleId, scalaVersionDeps, Some("2.10.2")) val report = ivyUpdate(m) - EvictionWarning(m, defaultOptions, report, log).lines must_== + EvictionWarning(m, defaultOptions, report, log).lines shouldBe List("Scala version was updated by one of library dependencies:", "\t* org.scala-lang:scala-library:2.10.2 -> 2.10.3", "To force scalaVersion, add the following:", @@ -94,7 +82,7 @@ class EvictionWarningSpec extends BaseIvySpecification { def scalaVersionWarn4 = { val m = module(defaultModuleId, scalaVersionDeps, Some("2.10.2")) val report = ivyUpdate(m) - EvictionWarning(m, defaultOptions.withShowCallers(true), report, log).lines must_== + EvictionWarning(m, defaultOptions.withShowCallers(true), report, log).lines shouldBe List("Scala version was updated by one of library dependencies:", "\t* org.scala-lang:scala-library:2.10.2 -> 2.10.3 (caller: com.typesafe.akka:akka-actor_2.10:2.3.0, com.example:foo:0.1.0)", "To force scalaVersion, add the following:", @@ -106,19 +94,19 @@ class EvictionWarningSpec extends BaseIvySpecification { def javaLibWarn1 = { val m = module(defaultModuleId, javaLibDirectDeps, Some("2.10.3")) val report = ivyUpdate(m) - EvictionWarning(m, defaultOptions, report, log).reportedEvictions must have size (1) + EvictionWarning(m, defaultOptions, report, log).reportedEvictions should have size(1) } def javaLibWarn2 = { val m = module(defaultModuleId, javaLibDirectDeps, Some("2.10.3")) val report = ivyUpdate(m) - EvictionWarning(m, defaultOptions.withWarnDirectEvictions(false), report, log).reportedEvictions must have size (0) + EvictionWarning(m, defaultOptions.withWarnDirectEvictions(false), report, log).reportedEvictions should have size(0) } def javaLibWarn3 = { val m = module(defaultModuleId, javaLibDirectDeps, Some("2.10.3")) val report = ivyUpdate(m) - EvictionWarning(m, defaultOptions, report, log).lines must_== + EvictionWarning(m, defaultOptions, report, log).lines shouldBe List("There may be incompatibilities among your library dependencies.", "Here are some of the libraries that were evicted:", "\t* commons-io:commons-io:1.4 -> 2.4", @@ -128,7 +116,7 @@ class EvictionWarningSpec extends BaseIvySpecification { def javaLibWarn4 = { val m = module(defaultModuleId, javaLibDirectDeps, Some("2.10.3")) val report = ivyUpdate(m) - EvictionWarning(m, defaultOptions.withShowCallers(true), report, log).lines must_== + EvictionWarning(m, defaultOptions.withShowCallers(true), report, log).lines shouldBe List("There may be incompatibilities among your library dependencies.", "Here are some of the libraries that were evicted:", "\t* commons-io:commons-io:1.4 -> 2.4 (caller: com.example:foo:0.1.0)") @@ -138,14 +126,14 @@ class EvictionWarningSpec extends BaseIvySpecification { val deps = Seq(commonsIo14, commonsIo13) val m = module(defaultModuleId, deps, Some("2.10.3")) val report = ivyUpdate(m) - EvictionWarning(m, defaultOptions, report, log).reportedEvictions must have size (0) + EvictionWarning(m, defaultOptions, report, log).reportedEvictions should have size(0) } def javaLibNoWarn2 = { val deps = Seq(commonsIo14, commonsIo13) val m = module(defaultModuleId, deps, Some("2.10.3")) val report = ivyUpdate(m) - EvictionWarning(m, defaultOptions, report, log).lines must_== Nil + EvictionWarning(m, defaultOptions, report, log).lines shouldBe Nil } def javaLibTransitiveDeps = Seq(unfilteredUploads080, bnfparser10) @@ -153,19 +141,19 @@ class EvictionWarningSpec extends BaseIvySpecification { def javaLibTransitiveWarn1 = { val m = module(defaultModuleId, javaLibTransitiveDeps, Some("2.10.3")) val report = ivyUpdate(m) - EvictionWarning(m, defaultOptions, report, log).reportedEvictions must have size (0) + EvictionWarning(m, defaultOptions, report, log).reportedEvictions should have size(0) } def javaLibTransitiveWarn2 = { val m = module(defaultModuleId, javaLibTransitiveDeps, Some("2.10.3")) val report = ivyUpdate(m) - EvictionWarning(m, defaultOptions.withWarnTransitiveEvictions(true), report, log).reportedEvictions must have size (1) + EvictionWarning(m, defaultOptions.withWarnTransitiveEvictions(true), report, log).reportedEvictions should have size(1) } def javaLibTransitiveWarn3 = { val m = module(defaultModuleId, javaLibTransitiveDeps, Some("2.10.3")) val report = ivyUpdate(m) - EvictionWarning(m, defaultOptions.withWarnTransitiveEvictions(true).withShowCallers(true), report, log).lines must_== + EvictionWarning(m, defaultOptions.withWarnTransitiveEvictions(true).withShowCallers(true), report, log).lines shouldBe List("There may be incompatibilities among your library dependencies.", "Here are some of the libraries that were evicted:", "\t* commons-io:commons-io:1.4 -> 2.4 (caller: ca.gobits.bnf:bnfparser:1.0, net.databinder:unfiltered-uploads_2.10:0.8.0)") @@ -175,14 +163,14 @@ class EvictionWarningSpec extends BaseIvySpecification { val deps = Seq(scala2104, akkaActor214, akkaActor234) val m = module(defaultModuleId, deps, Some("2.10.4")) val report = ivyUpdate(m) - EvictionWarning(m, defaultOptions, report, log).reportedEvictions must have size (1) + EvictionWarning(m, defaultOptions, report, log).reportedEvictions should have size(1) } def scalaLibWarn2 = { val deps = Seq(scala2104, akkaActor214, akkaActor234) val m = module(defaultModuleId, deps, Some("2.10.4")) val report = ivyUpdate(m) - EvictionWarning(m, defaultOptions, report, log).lines must_== + EvictionWarning(m, defaultOptions, report, log).lines shouldBe List("There may be incompatibilities among your library dependencies.", "Here are some of the libraries that were evicted:", "\t* com.typesafe.akka:akka-actor_2.10:2.1.4 -> 2.3.4", @@ -193,14 +181,14 @@ class EvictionWarningSpec extends BaseIvySpecification { val deps = Seq(scala2104, akkaActor230, akkaActor234) val m = module(defaultModuleId, deps, Some("2.10.4")) val report = ivyUpdate(m) - EvictionWarning(m, defaultOptions, report, log).reportedEvictions must have size (0) + EvictionWarning(m, defaultOptions, report, log).reportedEvictions should have size(0) } def scalaLibNoWarn2 = { val deps = Seq(scala2104, akkaActor230, akkaActor234) val m = module(defaultModuleId, deps, Some("2.10.4")) val report = ivyUpdate(m) - EvictionWarning(m, defaultOptions, report, log).lines must_== Nil + EvictionWarning(m, defaultOptions, report, log).lines shouldBe Nil } def scalaLibTransitiveDeps = Seq(scala2104, bananaSesame04, akkaRemote234) @@ -208,19 +196,19 @@ class EvictionWarningSpec extends BaseIvySpecification { def scalaLibTransitiveWarn1 = { val m = module(defaultModuleId, scalaLibTransitiveDeps, Some("2.10.4")) val report = ivyUpdate(m) - EvictionWarning(m, defaultOptions, report, log).reportedEvictions must have size (0) + EvictionWarning(m, defaultOptions, report, log).reportedEvictions should have size(0) } def scalaLibTransitiveWarn2 = { val m = module(defaultModuleId, scalaLibTransitiveDeps, Some("2.10.4")) val report = ivyUpdate(m) - EvictionWarning(m, defaultOptions.withWarnTransitiveEvictions(true), report, log).reportedEvictions must have size (1) + EvictionWarning(m, defaultOptions.withWarnTransitiveEvictions(true), report, log).reportedEvictions should have size(1) } def scalaLibTransitiveWarn3 = { val m = module(defaultModuleId, scalaLibTransitiveDeps, Some("2.10.4")) val report = ivyUpdate(m) - EvictionWarning(m, defaultOptions.withWarnTransitiveEvictions(true).withShowCallers(true), report, log).lines must_== + EvictionWarning(m, defaultOptions.withWarnTransitiveEvictions(true).withShowCallers(true), report, log).lines shouldBe List("There may be incompatibilities among your library dependencies.", "Here are some of the libraries that were evicted:", "\t* com.typesafe.akka:akka-actor_2.10:2.1.4 -> 2.3.4 (caller: com.typesafe.akka:akka-remote_2.10:2.3.4, org.w3:banana-sesame_2.10:0.4, org.w3:banana-rdf_2.10:0.4)") diff --git a/librarymanagement/src/test/scala/InconsistentDuplicateSpec.scala b/librarymanagement/src/test/scala/InconsistentDuplicateSpec.scala index b9f4a05ef..343149e85 100644 --- a/librarymanagement/src/test/scala/InconsistentDuplicateSpec.scala +++ b/librarymanagement/src/test/scala/InconsistentDuplicateSpec.scala @@ -1,28 +1,20 @@ package sbt -import org.specs2._ +import sbt.internal.util.UnitSpec -class InconsistentDuplicateSpec extends Specification { - def is = s2""" +// This is a specification to check the inconsistent duplicate warnings +class InconsistentDuplicateSpec extends UnitSpec { + "Duplicate with different version" should "be warned" in { + IvySbt.inconsistentDuplicateWarning(Seq(akkaActor214, akkaActor230)) shouldBe + List("Multiple dependencies with the same organization/name but different versions. To avoid conflict, pick one version:", + " * com.typesafe.akka:akka-actor:(2.1.4, 2.3.0)") + } - This is a specification to check the inconsistent duplicate warnings - - Duplicate with different version should - be warned $warn1 - - Duplicate with same version should - not be warned $nodupe1 - """ + "Duplicate with same version" should "not be warned" in { + IvySbt.inconsistentDuplicateWarning(Seq(akkaActor230Test, akkaActor230)) shouldBe Nil + } def akkaActor214 = ModuleID("com.typesafe.akka", "akka-actor", "2.1.4", Some("compile")) cross CrossVersion.binary def akkaActor230 = ModuleID("com.typesafe.akka", "akka-actor", "2.3.0", Some("compile")) cross CrossVersion.binary def akkaActor230Test = ModuleID("com.typesafe.akka", "akka-actor", "2.3.0", Some("test")) cross CrossVersion.binary - - def warn1 = - IvySbt.inconsistentDuplicateWarning(Seq(akkaActor214, akkaActor230)) must_== - List("Multiple dependencies with the same organization/name but different versions. To avoid conflict, pick one version:", - " * com.typesafe.akka:akka-actor:(2.1.4, 2.3.0)") - - def nodupe1 = - IvySbt.inconsistentDuplicateWarning(Seq(akkaActor230Test, akkaActor230)) must_== Nil } diff --git a/librarymanagement/src/test/scala/MakePomSpec.scala b/librarymanagement/src/test/scala/MakePomSpec.scala index 68ede8bc8..edd1eef03 100644 --- a/librarymanagement/src/test/scala/MakePomSpec.scala +++ b/librarymanagement/src/test/scala/MakePomSpec.scala @@ -1,73 +1,78 @@ package sbt import java.io.File -import org.specs2._ +import sbt.internal.util.{ Logger, ConsoleLogger } +import sbt.internal.util.UnitSpec // http://ant.apache.org/ivy/history/2.3.0/ivyfile/dependency.html // http://maven.apache.org/enforcer/enforcer-rules/versionRanges.html -class MakePomSpec extends Specification { - def is = s2""" +class MakePomSpec extends UnitSpec { + // This is a specification to check the Ivy revision number conversion to pom. - This is a specification to check the Ivy revision number conversion to pom. + "1.0" should "convert to 1.0" in convertTo("1.0", "1.0") - 1.0 should - ${convertTo("1.0", "1.0")} + "[1.0,2.0]" should "convert to [1.0,2.0]" in { + convertTo("[1.0,2.0]", "[1.0,2.0]") + } - [1.0,2.0] should - ${convertTo("[1.0,2.0]", "[1.0,2.0]")} + "[1.0,2.0[" should "convert to [1.0,2.0)" in { + convertTo("[1.0,2.0[", "[1.0,2.0)") + } - [1.0,2.0[ should - ${convertTo("[1.0,2.0[", "[1.0,2.0)")} + "]1.0,2.0]" should "convert to (1.0,2.0]" in { + convertTo("]1.0,2.0]", "(1.0,2.0]") + } - ]1.0,2.0] should - ${convertTo("]1.0,2.0]", "(1.0,2.0]")} + "]1.0,2.0[" should "convert to (1.0,2.0)" in { + convertTo("]1.0,2.0[", "(1.0,2.0)") + } - ]1.0,2.0[ should - ${convertTo("]1.0,2.0[", "(1.0,2.0)")} + "[1.0,)" should "convert to [1.0,)" in { + convertTo("[1.0,)", "[1.0,)") + } - [1.0,) should - ${convertTo("[1.0,)", "[1.0,)")} + "]1.0,)" should "convert to (1.0,)" in { + convertTo("]1.0,)", "(1.0,)") + } - ]1.0,) should - ${convertTo("]1.0,)", "(1.0,)")} + "(,2.0]" should "convert to (,2.0]" in { + convertTo("(,2.0]", "(,2.0]") + } - (,2.0] should - ${convertTo("(,2.0]", "(,2.0]")} + "(,2.0[" should "convert to (,2.0)" in { + convertTo("(,2.0[", "(,2.0)") + } - (,2.0[ should - ${convertTo("(,2.0[", "(,2.0)")} + "1.+" should "convert to [1,2)" in { + convertTo("1.+", "[1,2)") + } - 1.+ should - ${convertTo("1.+", "[1,2)")} + "1.2.3.4.+" should "convert to [1.2.3.4,1.2.3.5)" in { + convertTo("1.2.3.4.+", "[1.2.3.4,1.2.3.5)") + } - 1.2.3.4.+ should - ${convertTo("1.2.3.4.+", "[1.2.3.4,1.2.3.5)")} + "12.31.42.+" should "convert to [12.31.42,12.31.43)" in { + convertTo("12.31.42.+", "[12.31.42,12.31.43)") + } - 12.31.42.+ should - ${convertTo("12.31.42.+", "[12.31.42,12.31.43)")} + "1.1+" should "convert to [1.1,1.2),[1.10,1.20),[1.100,1.200),[1.1000,1.2000),[1.10000,1.20000)" in { + convertTo("1.1+", "[1.1,1.2),[1.10,1.20),[1.100,1.200),[1.1000,1.2000),[1.10000,1.20000)") + } - 1.1+ should - ${convertTo("1.1+", "[1.1,1.2),[1.10,1.20),[1.100,1.200),[1.1000,1.2000),[1.10000,1.20000)")} + "1+" should "convert to [1,2),[10,20),[100,200),[1000,2000),[10000,20000)" in { + convertTo("1+", "[1,2),[10,20),[100,200),[1000,2000),[10000,20000)") + } - 1+ should - ${convertTo("1+", "[1,2),[10,20),[100,200),[1000,2000),[10000,20000)")} + "+" should "convert to [0,)" in convertTo("+", "[0,)") - + should - ${convertTo("+", "[0,)")} - - foo+ should - ${beParsedAsError("foo+")} - """ + "foo+" should "convert to foo+" in beParsedAsError("foo+") val mp = new MakePom(ConsoleLogger()) - def convertTo(s: String, expected: String) = - MakePom.makeDependencyVersion(s) must_== expected - def beParsedAsError(s: String) = - try { + def convertTo(s: String, expected: String): Unit = + MakePom.makeDependencyVersion(s) shouldBe expected + def beParsedAsError(s: String): Unit = + intercept[Throwable] { MakePom.makeDependencyVersion(s) - failure - } catch { - case e: Throwable => success } } diff --git a/librarymanagement/src/test/scala/ResolverTest.scala b/librarymanagement/src/test/scala/ResolverTest.scala index 64c6ab777..adfb9c576 100644 --- a/librarymanagement/src/test/scala/ResolverTest.scala +++ b/librarymanagement/src/test/scala/ResolverTest.scala @@ -1,24 +1,19 @@ import java.net.URL -import org.specs2.mutable.Specification import sbt._ +import sbt.internal.util.UnitSpec -object ResolverTest extends Specification { +object ResolverTest extends UnitSpec { - "Resolver" should { - "url" should { - "propagate pattern descriptorOptional and skipConsistencyCheck." in { - val pats = Seq("[orgPath]") - val patsExpected = Seq("http://foo.com/test/[orgPath]") - val patterns = Resolver.url("test", new URL("http://foo.com/test"))(Patterns(pats, pats, isMavenCompatible = false, descriptorOptional = true, skipConsistencyCheck = true)).patterns + "Resolver url" should "propagate pattern descriptorOptional and skipConsistencyCheck." in { + val pats = Seq("[orgPath]") + val patsExpected = Seq("http://foo.com/test/[orgPath]") + val patterns = Resolver.url("test", new URL("http://foo.com/test"))(Patterns(pats, pats, isMavenCompatible = false, descriptorOptional = true, skipConsistencyCheck = true)).patterns - patterns.ivyPatterns must equalTo(patsExpected) - patterns.artifactPatterns must equalTo(patsExpected) - patterns.isMavenCompatible must beFalse - patterns.skipConsistencyCheck must beTrue - patterns.descriptorOptional must beTrue - } - } + patterns.ivyPatterns shouldBe patsExpected + patterns.artifactPatterns shouldBe patsExpected + patterns.isMavenCompatible shouldBe false + assert(patterns.skipConsistencyCheck) + assert(patterns.descriptorOptional) } - } diff --git a/librarymanagement/src/test/scala/VersionNumberSpec.scala b/librarymanagement/src/test/scala/VersionNumberSpec.scala index 68bc2ad6e..3e7b8c631 100644 --- a/librarymanagement/src/test/scala/VersionNumberSpec.scala +++ b/librarymanagement/src/test/scala/VersionNumberSpec.scala @@ -1,112 +1,93 @@ package sbt -import org.specs2._ +import sbt.internal.util.UnitSpec -class VersionNumberSpec extends Specification { - def is = s2""" +// This is a specification to check the version number parsing. +class VersionNumberSpec extends UnitSpec { + "1" should "be parsed" in beParsedAs("1", Seq(1), Seq(), Seq()) + it should "breakdown" in breakDownTo("1", Some(1)) + it should "cascade" in generateCorrectCascadingNumbers("1", Seq("1")) - This is a specification to check the version number parsing. + "1.0" should "be parsed" in beParsedAs("1.0", Seq(1, 0), Seq(), Seq()) + it should "breakdown" in breakDownTo("1.0", Some(1), Some(0)) + it should "cascade" in generateCorrectCascadingNumbers("1.0", Seq("1.0")) - 1 should - ${beParsedAs("1", Seq(1), Seq(), Seq())} - ${breakDownTo("1", Some(1))} - ${generateCorrectCascadingNumbers("1", Seq("1"))} + "1.0.0" should "be parsed" in beParsedAs("1.0.0", Seq(1, 0, 0), Seq(), Seq()) + it should "breakdown" in breakDownTo("1.0.0", Some(1), Some(0), Some(0)) + it should "cascade" in generateCorrectCascadingNumbers("1.0.0", Seq("1.0.0", "1.0")) + it should "be SemVer compat with 1.0.1" in beSemVerCompatWith("1.0.0", "1.0.1") + it should "be SemVer compat with 1.1.1" in beSemVerCompatWith("1.0.0", "1.1.1") + it should "not be SemVer compat with 2.0.0" in notBeSemVerCompatWith("1.0.0", "2.0.0") + it should "not be SemVer compat with 1.0.0-M1" in notBeSemVerCompatWith("1.0.0", "1.0.0-M1") + it should "be SecSeg compat with 1.0.1" in beSecSegCompatWith("1.0.0", "1.0.1") + it should "not be SecSeg compat with 1.1.1" in notBeSecSegCompatWith("1.0.0", "1.1.1") + it should "not be SecSeg compat with 2.0.0" in notBeSecSegCompatWith("1.0.0", "2.0.0") + it should "not be SecSeg compat with 1.0.0-M1" in notBeSecSegCompatWith("1.0.0", "1.0.0-M1") - 1.0 should - ${beParsedAs("1.0", Seq(1, 0), Seq(), Seq())} - ${breakDownTo("1.0", Some(1), Some(0))} - ${generateCorrectCascadingNumbers("1.0", Seq("1.0"))} + "1.0.0.0" should "be parsed" in beParsedAs("1.0.0.0", Seq(1, 0, 0, 0), Seq(), Seq()) + it should "breakdown" in breakDownTo("1.0.0.0", Some(1), Some(0), Some(0), Some(0)) + it should "cascade" in generateCorrectCascadingNumbers("1.0.0.0", Seq("1.0.0.0", "1.0.0", "1.0")) - 1.0.0 should - ${beParsedAs("1.0.0", Seq(1, 0, 0), Seq(), Seq())} - ${breakDownTo("1.0.0", Some(1), Some(0), Some(0))} - ${generateCorrectCascadingNumbers("1.0.0", Seq("1.0.0", "1.0"))} + "0.12.0" should "be parsed" in beParsedAs("0.12.0", Seq(0, 12, 0), Seq(), Seq()) + it should "breakdown" in breakDownTo("0.12.0", Some(0), Some(12), Some(0)) + it should "cascade" in generateCorrectCascadingNumbers("0.12.0", Seq("0.12.0", "0.12")) + it should "not be SemVer compat with 0.12.0-RC1" in notBeSemVerCompatWith("0.12.0", "0.12.0-RC1") + it should "not be SemVer compat with 0.12.1" in notBeSemVerCompatWith("0.12.0", "0.12.1") + it should "not be SemVer compat with 0.12.1-M1" in notBeSemVerCompatWith("0.12.0", "0.12.1-M1") + it should "not be SecSeg compat with 0.12.0-RC1" in notBeSecSegCompatWith("0.12.0", "0.12.0-RC1") + it should "be SecSeg compat with 0.12.1" in beSecSegCompatWith("0.12.0", "0.12.1") + it should "be SecSeg compat with 0.12.1-M1" in beSecSegCompatWith("0.12.0", "0.12.1-M1") - ${beSemVerCompatWith("1.0.0", "1.0.1")} - ${beSemVerCompatWith("1.0.0", "1.1.1")} - ${notBeSemVerCompatWith("1.0.0", "2.0.0")} - ${notBeSemVerCompatWith("1.0.0", "1.0.0-M1")} + "0.1.0-SNAPSHOT" should "be parsed" in beParsedAs("0.1.0-SNAPSHOT", Seq(0, 1, 0), Seq("SNAPSHOT"), Seq()) + it should "cascade" in generateCorrectCascadingNumbers("0.1.0-SNAPSHOT", Seq("0.1.0-SNAPSHOT", "0.1.0", "0.1")) + it should "be SemVer compat with 0.1.0-SNAPSHOT" in beSemVerCompatWith("0.1.0-SNAPSHOT", "0.1.0-SNAPSHOT") + it should "not be SemVer compat with 0.1.0" in notBeSemVerCompatWith("0.1.0-SNAPSHOT", "0.1.0") + it should "be SemVer compat with 0.1.0-SNAPSHOT+001" in beSemVerCompatWith("0.1.0-SNAPSHOT", "0.1.0-SNAPSHOT+001") + it should "be SecSeg compat with 0.1.0-SNAPSHOT" in beSecSegCompatWith("0.1.0-SNAPSHOT", "0.1.0-SNAPSHOT") + it should "be not SecSeg compat with 0.1.0" in notBeSecSegCompatWith("0.1.0-SNAPSHOT", "0.1.0") + it should "be SecSeg compat with 0.1.0-SNAPSHOT+001" in beSecSegCompatWith("0.1.0-SNAPSHOT", "0.1.0-SNAPSHOT+001") - ${beSecSegCompatWith("1.0.0", "1.0.1")} - ${notBeSecSegCompatWith("1.0.0", "1.1.1")} - ${notBeSecSegCompatWith("1.0.0", "2.0.0")} - ${notBeSecSegCompatWith("1.0.0", "1.0.0-M1")} + "0.1.0-M1" should "be parsed" in beParsedAs("0.1.0-M1", Seq(0, 1, 0), Seq("M1"), Seq()) + it should "cascade" in generateCorrectCascadingNumbers("0.1.0-M1", Seq("0.1.0-M1", "0.1.0", "0.1")) - 1.0.0.0 should - ${beParsedAs("1.0.0.0", Seq(1, 0, 0, 0), Seq(), Seq())} - ${breakDownTo("1.0.0.0", Some(1), Some(0), Some(0), Some(0))} - ${generateCorrectCascadingNumbers("1.0.0.0", Seq("1.0.0.0", "1.0.0", "1.0"))} + "0.1.0-RC1" should "be parsed" in beParsedAs("0.1.0-RC1", Seq(0, 1, 0), Seq("RC1"), Seq()) + it should "cascade" in generateCorrectCascadingNumbers("0.1.0-RC1", Seq("0.1.0-RC1", "0.1.0", "0.1")) - 0.12.0 should - ${beParsedAs("0.12.0", Seq(0, 12, 0), Seq(), Seq())} - ${breakDownTo("0.12.0", Some(0), Some(12), Some(0))} - ${generateCorrectCascadingNumbers("0.12.0", Seq("0.12.0", "0.12"))} - - ${notBeSemVerCompatWith("0.12.0", "0.12.0-RC1")} - ${notBeSemVerCompatWith("0.12.0", "0.12.1")} - ${notBeSemVerCompatWith("0.12.0", "0.12.1-M1")} - - ${notBeSecSegCompatWith("0.12.0", "0.12.0-RC1")} - ${beSecSegCompatWith("0.12.0", "0.12.1")} - ${beSecSegCompatWith("0.12.0", "0.12.1-M1")} - - 0.1.0-SNAPSHOT should - ${beParsedAs("0.1.0-SNAPSHOT", Seq(0, 1, 0), Seq("SNAPSHOT"), Seq())} - ${generateCorrectCascadingNumbers("0.1.0-SNAPSHOT", Seq("0.1.0-SNAPSHOT", "0.1.0", "0.1"))} - - ${beSemVerCompatWith("0.1.0-SNAPSHOT", "0.1.0-SNAPSHOT")} - ${notBeSemVerCompatWith("0.1.0-SNAPSHOT", "0.1.0")} - ${beSemVerCompatWith("0.1.0-SNAPSHOT", "0.1.0-SNAPSHOT+001")} - - ${beSecSegCompatWith("0.1.0-SNAPSHOT", "0.1.0-SNAPSHOT")} - ${notBeSecSegCompatWith("0.1.0-SNAPSHOT", "0.1.0")} - ${beSecSegCompatWith("0.1.0-SNAPSHOT", "0.1.0-SNAPSHOT+001")} - - 0.1.0-M1 should - ${beParsedAs("0.1.0-M1", Seq(0, 1, 0), Seq("M1"), Seq())} - ${generateCorrectCascadingNumbers("0.1.0-M1", Seq("0.1.0-M1", "0.1.0", "0.1"))} - - 0.1.0-RC1 should - ${beParsedAs("0.1.0-RC1", Seq(0, 1, 0), Seq("RC1"), Seq())} - ${generateCorrectCascadingNumbers("0.1.0-RC1", Seq("0.1.0-RC1", "0.1.0", "0.1"))} - - 0.1.0-MSERVER-1 should - ${beParsedAs("0.1.0-MSERVER-1", Seq(0, 1, 0), Seq("MSERVER", "1"), Seq())} - ${generateCorrectCascadingNumbers("0.1.0-MSERVER-1", Seq("0.1.0-MSERVER-1", "0.1.0", "0.1"))} + "0.1.0-MSERVER-1" should "be parsed" in beParsedAs("0.1.0-MSERVER-1", Seq(0, 1, 0), Seq("MSERVER", "1"), Seq()) + it should "cascade" in generateCorrectCascadingNumbers("0.1.0-MSERVER-1", Seq("0.1.0-MSERVER-1", "0.1.0", "0.1")) - 2.10.4-20140115-000117-b3a-sources should - ${beParsedAs("2.10.4-20140115-000117-b3a-sources", Seq(2, 10, 4), Seq("20140115", "000117", "b3a", "sources"), Seq())} - ${generateCorrectCascadingNumbers("2.10.4-20140115-000117-b3a-sources", Seq("2.10.4-20140115-000117-b3a-sources", "2.10.4", "2.10"))} + "2.10.4-20140115-000117-b3a-sources" should "be parsed" in { + beParsedAs("2.10.4-20140115-000117-b3a-sources", Seq(2, 10, 4), Seq("20140115", "000117", "b3a", "sources"), Seq()) + } + it should "cascade" in generateCorrectCascadingNumbers("2.10.4-20140115-000117-b3a-sources", Seq("2.10.4-20140115-000117-b3a-sources", "2.10.4", "2.10")) + it should "be SemVer compat with 2.0.0" in beSemVerCompatWith("2.10.4-20140115-000117-b3a-sources", "2.0.0") + it should "be not SecSeg compat with 2.0.0" in notBeSecSegCompatWith("2.10.4-20140115-000117-b3a-sources", "2.0.0") - ${beSemVerCompatWith("2.10.4-20140115-000117-b3a-sources", "2.0.0")} + "20140115000117-b3a-sources" should "be parsed" in { + beParsedAs("20140115000117-b3a-sources", Seq(20140115000117L), Seq("b3a", "sources"), Seq()) + } + it should "cascade" in generateCorrectCascadingNumbers("20140115000117-b3a-sources", Seq("20140115000117-b3a-sources")) - ${notBeSecSegCompatWith("2.10.4-20140115-000117-b3a-sources", "2.0.0")} + "1.0.0-alpha+001+002" should "be parsed" in { + beParsedAs("1.0.0-alpha+001+002", Seq(1, 0, 0), Seq("alpha"), Seq("+001", "+002")) + } + it should "cascade" in generateCorrectCascadingNumbers("1.0.0-alpha+001+002", Seq("1.0.0-alpha+001+002", "1.0.0", "1.0")) - 20140115000117-b3a-sources should - ${beParsedAs("20140115000117-b3a-sources", Seq(20140115000117L), Seq("b3a", "sources"), Seq())} - ${generateCorrectCascadingNumbers("20140115000117-b3a-sources", Seq("20140115000117-b3a-sources"))} + "non.space.!?string" should "be parsed" in { + beParsedAs("non.space.!?string", Seq(), Seq(), Seq("non.space.!?string")) + } + it should "cascade" in generateCorrectCascadingNumbers("non.space.!?string", Seq("non.space.!?string")) - 1.0.0-alpha+001+002 should - ${beParsedAs("1.0.0-alpha+001+002", Seq(1, 0, 0), Seq("alpha"), Seq("+001", "+002"))} - ${generateCorrectCascadingNumbers("1.0.0-alpha+001+002", Seq("1.0.0-alpha+001+002", "1.0.0", "1.0"))} + "space !?string" should "be parsed as an error" in beParsedAsError("space !?string") + "blank string" should "be parsed as an error" in beParsedAsError("") - non.space.!?string should - ${beParsedAs("non.space.!?string", Seq(), Seq(), Seq("non.space.!?string"))} - ${generateCorrectCascadingNumbers("non.space.!?string", Seq("non.space.!?string"))} - - space !?string should - ${beParsedAsError("space !?string")} - - blank string should - ${beParsedAsError("")} - """ def beParsedAs(s: String, ns: Seq[Long], ts: Seq[String], es: Seq[String]) = s match { case VersionNumber(ns1, ts1, es1) if (ns1 == ns && ts1 == ts && es1 == es) => - (VersionNumber(ns, ts, es).toString must_== s) and - (VersionNumber(ns, ts, es) == VersionNumber(ns, ts, es)) + (VersionNumber(ns, ts, es).toString shouldBe s) + (VersionNumber(ns, ts, es) shouldBe VersionNumber(ns, ts, es)) case VersionNumber(ns1, ts1, es1) => sys.error(s"$ns1, $ts1, $es1") } @@ -115,26 +96,26 @@ class VersionNumberSpec extends Specification { s match { case VersionNumber(ns, ts, es) => val v = VersionNumber(ns, ts, es) - (v._1 must_== major) and - (v._2 must_== minor) and - (v._3 must_== patch) and - (v._4 must_== buildNumber) + (v._1 shouldBe major) + (v._2 shouldBe minor) + (v._3 shouldBe patch) + (v._4 shouldBe buildNumber) } - def beParsedAsError(s: String) = + def beParsedAsError(s: String): Unit = s match { - case VersionNumber(ns1, ts1, es1) => failure - case _ => success + case VersionNumber(ns1, ts1, es1) => sys.error(s) + case _ => () } def beSemVerCompatWith(v1: String, v2: String) = - VersionNumber.SemVer.isCompatible(VersionNumber(v1), VersionNumber(v2)) must_== true + VersionNumber.SemVer.isCompatible(VersionNumber(v1), VersionNumber(v2)) shouldBe true def notBeSemVerCompatWith(v1: String, v2: String) = - VersionNumber.SemVer.isCompatible(VersionNumber(v1), VersionNumber(v2)) must_== false + VersionNumber.SemVer.isCompatible(VersionNumber(v1), VersionNumber(v2)) shouldBe false def beSecSegCompatWith(v1: String, v2: String) = - VersionNumber.SecondSegment.isCompatible(VersionNumber(v1), VersionNumber(v2)) must_== true + VersionNumber.SecondSegment.isCompatible(VersionNumber(v1), VersionNumber(v2)) shouldBe true def notBeSecSegCompatWith(v1: String, v2: String) = - VersionNumber.SecondSegment.isCompatible(VersionNumber(v1), VersionNumber(v2)) must_== false + VersionNumber.SecondSegment.isCompatible(VersionNumber(v1), VersionNumber(v2)) shouldBe false def generateCorrectCascadingNumbers(s: String, ns: Seq[String]) = { val versionNumbers = ns.toVector map VersionNumber.apply - VersionNumber(s).cascadingVersions must_== versionNumbers + VersionNumber(s).cascadingVersions shouldBe versionNumbers } } diff --git a/project/Dependencies.scala b/project/Dependencies.scala index 92f1a778d..155785557 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -5,11 +5,12 @@ object Dependencies { lazy val scala210 = "2.10.5" lazy val scala211 = "2.11.7" - val utilVersion = "0.1.0-M1" - val ioVersion = "1.0.0-M1" + val utilVersion = "0.1.0-M2" + val ioVersion = "1.0.0-M3" lazy val sbtIO = "org.scala-sbt" %% "io" % ioVersion lazy val utilCollection = "org.scala-sbt" %% "util-collection" % utilVersion lazy val utilLogging = "org.scala-sbt" %% "util-logging" % utilVersion + lazy val utilTesting = "org.scala-sbt" %% "util-testing" % utilVersion lazy val launcherInterface = "org.scala-sbt" % "launcher-interface" % "1.0.0-M1" lazy val ivy = "org.scala-sbt.ivy" % "ivy" % "2.3.0-sbt-927bc9ded7f8fba63297cddd0d5a3d01d6ad5d8d"