diff --git a/main/src/test/scala/testpkg/CompletionSpec.scala b/main/src/test/scala/testpkg/CompletionSpec.scala new file mode 100644 index 000000000..ff57d02ae --- /dev/null +++ b/main/src/test/scala/testpkg/CompletionSpec.scala @@ -0,0 +1,83 @@ +/* + * sbt + * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2008 - 2010, Mark Harrah + * Licensed under Apache License 2.0 (see LICENSE) + */ + +package testpkg + +import java.net.URI + +import sbt.{ Result => _, _ } +import sbt.Def._ +import sbt.internal.TestBuild +import sbt.internal.TestBuild._ +import sbt.internal.util.AttributeKey +import sbt.librarymanagement.Configuration +import hedgehog._ +import hedgehog.runner._ +import _root_.sbt.internal.util.complete.Parser + +object CompletionSpec extends Properties { + override def tests: List[Test] = + List( + property("can complete any build", TestBuild.uriGen.forAll.map { uri => + complete(buildURI = uri, line = "{", expected = "{" + uri.toString + "}") + }), + property("can complete any project", TestBuild.nonEmptyId.forAll.map { id => + complete(projectID = id, line = id.head.toString, expected = id) + }), + // property( + // "can complete any configuration", + // TestBuild.nonEmptyId.forAll.map { name => + // val cap = name.capitalize + // complete(configName = name, line = cap.head.toString, expected = cap) + // } + // ), + // property("can complete any attribute", TestBuild.kebabIdGen.forAll.map { name => + // complete(attributeName = name, line = name.head.toString, expected = name) + // }) + ) + + private def complete( + buildURI: URI = new URI("file", "///path/", null), + projectID: String = "p", + configName: String = "compile", + attributeName: String = "a", + line: String, + expected: String, + ): Result = { + val attributeKey = AttributeKey[String](attributeName) + val scope = Scope( + Select(BuildRef(buildURI)), + Select(ConfigKey(configName)), + Select(attributeKey), + Zero + ) + val config = Configuration.of(configName.capitalize, configName) + val project = Proj(projectID, Nil, Seq(config)) + val projects = Vector(project) + val build = Build(buildURI, projects) + val builds = Vector(build) + val task = Taskk(attributeKey, Nil) + val tasks = Vector(task) + val env = Env(builds, tasks) + val settings = env.tasks.map { t => + Def.setting(ScopedKey(scope, t.key), Def.value("value")) + } + val structure = TestBuild.structure(env, settings, build.allProjects.head._1) + // val scopedKey = ScopedKey(scope, attributeKey) + // val string = displayMasked(scopedKey, ScopeMask()) + val parser = makeParser(structure) + val cs = Parser.completions(parser, line, 10) + + Result + .assert( + cs.get.exists(c => (line + c.append) == expected || (line + c.append) == expected + "/") + ) + .log(s"line: $line") + .log(s"completions: ${cs.get.map(_.append)}") + .log(s"structure: $structure") + } +} diff --git a/project/Dependencies.scala b/project/Dependencies.scala index 3413ac9d0..1b3b00073 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -112,7 +112,7 @@ object Dependencies { val caffeine = "com.github.ben-manes.caffeine" % "caffeine" % "2.8.5" - val hedgehog = "hedgehog" %% "hedgehog-sbt" % "0.1.0" + val hedgehog = "qa.hedgehog" %% "hedgehog-sbt" % "0.6.1" val disruptor = "com.lmax" % "disruptor" % "3.4.2" val silencerPlugin = "com.github.ghik" %% "silencer-plugin" % "1.4.2" val silencerLib = "com.github.ghik" %% "silencer-lib" % "1.4.2" % Provided