From 94f32506ade9283f9488c71fcdcb0a4f3002688b Mon Sep 17 00:00:00 2001 From: Robert Stoll Date: Tue, 25 Aug 2020 23:22:26 +0200 Subject: [PATCH] add isNoneOf and isNotIn to scala api --- .gitignore | 3 +- .../api/fluent/en_GB/AnyAssertionsSpec.kt | 4 +-- .../api/infix/en_GB/AnyAssertionsSpec.kt | 4 +-- .../build.gradle | 2 +- .../fluent/en_GB/scala/AnyAssertions.scala | 13 +++++++ .../en_GB/scala/AnyAssertionsSpec.scala | 35 ++++++++++++++----- 6 files changed, 47 insertions(+), 14 deletions(-) diff --git a/.gitignore b/.gitignore index 364f41337..109ef175e 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,5 @@ node_modules *.hprof .history .bloop -.metals \ No newline at end of file +.metals +.vscode diff --git a/apis/fluent-en_GB/atrium-api-fluent-en_GB-common/src/test/kotlin/ch/tutteli/atrium/api/fluent/en_GB/AnyAssertionsSpec.kt b/apis/fluent-en_GB/atrium-api-fluent-en_GB-common/src/test/kotlin/ch/tutteli/atrium/api/fluent/en_GB/AnyAssertionsSpec.kt index 5955b2ca5..ade31af46 100644 --- a/apis/fluent-en_GB/atrium-api-fluent-en_GB-common/src/test/kotlin/ch/tutteli/atrium/api/fluent/en_GB/AnyAssertionsSpec.kt +++ b/apis/fluent-en_GB/atrium-api-fluent-en_GB-common/src/test/kotlin/ch/tutteli/atrium/api/fluent/en_GB/AnyAssertionsSpec.kt @@ -12,8 +12,8 @@ import kotlin.reflect.KProperty1 class AnyAssertionsSpec : ch.tutteli.atrium.specs.integration.AnyAssertionsSpec( fun1(Expect::toBe), fun1(Expect::toBe), - fun1(Expect::toBe), - fun1(Expect::toBe), + fun1(Expect::toBe).withNullableSuffix(), + fun1(Expect::toBe).withNullableSuffix(), fun1(Expect::notToBe), fun1(Expect::notToBe), fun1(Expect::notToBe).withNullableSuffix(), diff --git a/apis/infix-en_GB/atrium-api-infix-en_GB-common/src/test/kotlin/ch/tutteli/atrium/api/infix/en_GB/AnyAssertionsSpec.kt b/apis/infix-en_GB/atrium-api-infix-en_GB-common/src/test/kotlin/ch/tutteli/atrium/api/infix/en_GB/AnyAssertionsSpec.kt index af3933028..39601aeb0 100644 --- a/apis/infix-en_GB/atrium-api-infix-en_GB-common/src/test/kotlin/ch/tutteli/atrium/api/infix/en_GB/AnyAssertionsSpec.kt +++ b/apis/infix-en_GB/atrium-api-infix-en_GB-common/src/test/kotlin/ch/tutteli/atrium/api/infix/en_GB/AnyAssertionsSpec.kt @@ -12,8 +12,8 @@ import kotlin.reflect.KFunction2 class AnyAssertionsSpec : ch.tutteli.atrium.specs.integration.AnyAssertionsSpec( fun1(Expect::toBe), fun1(Expect::toBe), - fun1(Expect::toBe), - fun1(Expect::toBe), + fun1(Expect::toBe).withNullableSuffix(), + fun1(Expect::toBe).withNullableSuffix(), fun1(Expect::notToBe), fun1(Expect::notToBe), fun1(Expect::notToBe).withNullableSuffix(), diff --git a/atrium-scala/apis/atrium-scala-api-fluent-en_GB/build.gradle b/atrium-scala/apis/atrium-scala-api-fluent-en_GB/build.gradle index 64c923214..73bdce4ac 100644 --- a/atrium-scala/apis/atrium-scala-api-fluent-en_GB/build.gradle +++ b/atrium-scala/apis/atrium-scala-api-fluent-en_GB/build.gradle @@ -1,7 +1,7 @@ description = 'A fluent assertion function API in en_GB with a focus on code completion for Scala.' dependencies { - api atriumKotlinDep('domain-builders') + api atriumKotlinDep('logic') testImplementation atriumKotlinDep('specs') } diff --git a/atrium-scala/apis/atrium-scala-api-fluent-en_GB/src/main/scala/ch/tutteli/atrium/api/fluent/en_GB/scala/AnyAssertions.scala b/atrium-scala/apis/atrium-scala-api-fluent-en_GB/src/main/scala/ch/tutteli/atrium/api/fluent/en_GB/scala/AnyAssertions.scala index f77eef397..39e39ca70 100644 --- a/atrium-scala/apis/atrium-scala-api-fluent-en_GB/src/main/scala/ch/tutteli/atrium/api/fluent/en_GB/scala/AnyAssertions.scala +++ b/atrium-scala/apis/atrium-scala-api-fluent-en_GB/src/main/scala/ch/tutteli/atrium/api/fluent/en_GB/scala/AnyAssertions.scala @@ -3,6 +3,8 @@ package ch.tutteli.atrium.api.fluent.en_GB.scala import ch.tutteli.atrium.assertions.Assertion import ch.tutteli.atrium.creating.Expect import ch.tutteli.atrium.domain.builders.creating.AnyAssertionsBuilder +import ch.tutteli.atrium.logic.impl.DefaultAnyAssertions +import ch.tutteli.atrium.creating.AssertionContainer class AnyAssertions[T](expect: Expect[T]) { @inline private def anyAssertions: AnyAssertionsBuilder = ExpectImpl.getAny @@ -35,6 +37,17 @@ class AnyAssertions[T](expect: Expect[T]) { val and: Expect[T] = expect def and(assertionCreator: Expect[T] => Unit): Expect[T] = expect.addAssertionsCreatedBy(assertionCreator) + def isNoneOf(expected: T, otherValues: T*): Expect[T] = { + isNotIn(expected +: otherValues) + } + + def isNotIn(iterable: Iterable[T]): Expect[T] = { + import scala.jdk.CollectionConverters._ + expect.addAssertion(new DefaultAnyAssertions().isNotIn(expect.asInstanceOf[AssertionContainer[T]], iterable.asJava)) + } + + + @inline private def addAssertion(f: AnyAssertionsBuilder => Assertion): Expect[T] = expect.addAssertion(f(anyAssertions)) } diff --git a/atrium-scala/apis/atrium-scala-api-fluent-en_GB/src/test/scala/ch/tutteli/atrium/api/fluent/en_GB/scala/AnyAssertionsSpec.scala b/atrium-scala/apis/atrium-scala-api-fluent-en_GB/src/test/scala/ch/tutteli/atrium/api/fluent/en_GB/scala/AnyAssertionsSpec.scala index 2723d5796..1475054b4 100644 --- a/atrium-scala/apis/atrium-scala-api-fluent-en_GB/src/test/scala/ch/tutteli/atrium/api/fluent/en_GB/scala/AnyAssertionsSpec.scala +++ b/atrium-scala/apis/atrium-scala-api-fluent-en_GB/src/test/scala/ch/tutteli/atrium/api/fluent/en_GB/scala/AnyAssertionsSpec.scala @@ -2,25 +2,35 @@ package ch.tutteli.atrium.api.fluent.en_GB.scala import TestUtils._ import AnyAssertionsSpec._ +import ch.tutteli.atrium.creating.Expect class AnyAssertionsSpec extends ch.tutteli.atrium.specs.integration.AnyAssertionsSpec( toBe, toBe, - toBe, - toBe, - notToBe, - notToBe, + toBe.withNullableSuffix(), + toBe.withNullableSuffix(), notToBe, notToBe, + notToBe.withNullableSuffix(), + notToBe.withNullableSuffix(), isSameAs, isSameAs, - isSameAs, - isSameAs, - isNotSameAs, - isNotSameAs, + isSameAs.withNullableSuffix(), + isSameAs.withNullableSuffix(), isNotSameAs, isNotSameAs, + isNotSameAs.withNullableSuffix(), + isNotSameAs.withNullableSuffix(), + isNoneOf, + isNoneOf, + isNoneOf.withNullableSuffix(), + isNoneOf.withNullableSuffix(), + isNotIn, + isNotIn, + isNotIn.withNullableSuffix(), + isNotIn.withNullableSuffix(), + fun0("toBe", _.toBe(null)), fun1("toBeNullIfNullGivenElse", _.toBeNullIfNullGivenElse(_)), new kotlin.Pair("isA (feature)", _.isA()), @@ -33,13 +43,22 @@ class AnyAssertionsSpec fun1("notToBeNull", _.notToBeNull(_)), fun0("and (feature)", _.and), fun1("and", _.and(_)), + "⚬ ", "[Atrium] " ) //noinspection TypeAnnotation object AnyAssertionsSpec { + import scala.jdk.CollectionConverters._ + def toBe[T]: Fun1[T, T] = fun1("toBe", _.toBe(_)) def notToBe[T]: Fun1[T, T] = fun1("notToBe", _.notToBe(_)) def isSameAs[T]: Fun1[T, T] = fun1("isSameAs", _.isSameAs(_)) def isNotSameAs[T]: Fun1[T, T] = fun1("isNotSameAs", _.isNotSameAs(_)) + def isNoneOf[T]: Fun2[T, T, Array[T]] = fun2("isNoneOf", (e: Expect[T], t: T, arr: Array[T]) => e.isNoneOf(t, arr.toIndexedSeq: _*)) + def isNotIn[T]: Fun1[T, java.lang.Iterable[T]] = fun1("isNotIn", (e: Expect[T], i: java.lang.Iterable[T]) => e.isNotIn(i.asScala)) + + implicit class RxKotlinPair[T](pair: kotlin.Pair[String, T]) { + def withNullableSuffix() = new kotlin.Pair(pair.getFirst+" (nullable)", pair.getSecond) + } }