Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,11 @@ public final class ch/tutteli/atrium/api/fluent/en_GB/CharSequenceExpectationsKt
public static final fun toStartWith (Lch/tutteli/atrium/creating/Expect;Ljava/lang/CharSequence;)Lch/tutteli/atrium/creating/Expect;
}

public final class ch/tutteli/atrium/api/fluent/en_GB/CharSequenceFeatureExtractorsKt {
public static final fun getLength (Lch/tutteli/atrium/creating/Expect;)Lch/tutteli/atrium/creating/Expect;
public static final fun length (Lch/tutteli/atrium/creating/Expect;Lkotlin/jvm/functions/Function1;)Lch/tutteli/atrium/creating/Expect;
}

public final class ch/tutteli/atrium/api/fluent/en_GB/CharSequenceToContainCheckersKt {
public static final fun atLeast (Lch/tutteli/atrium/logic/creating/charsequence/contains/CharSequenceContains$EntryPointStep;I)Lch/tutteli/atrium/logic/creating/charsequence/contains/steps/AtLeastCheckerStep;
public static final fun atMost (Lch/tutteli/atrium/logic/creating/charsequence/contains/CharSequenceContains$EntryPointStep;I)Lch/tutteli/atrium/logic/creating/charsequence/contains/steps/AtMostCheckerStep;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,11 @@ public final class ch/tutteli/atrium/api/fluent/en_GB/CharSequenceExpectationsKt
public static final fun toStartWith (Lch/tutteli/atrium/creating/Expect;Ljava/lang/CharSequence;)Lch/tutteli/atrium/creating/Expect;
}

public final class ch/tutteli/atrium/api/fluent/en_GB/CharSequenceFeatureExtractorsKt {
public static final fun getLength (Lch/tutteli/atrium/creating/Expect;)Lch/tutteli/atrium/creating/Expect;
public static final fun length (Lch/tutteli/atrium/creating/Expect;Lkotlin/jvm/functions/Function1;)Lch/tutteli/atrium/creating/Expect;
}

public final class ch/tutteli/atrium/api/fluent/en_GB/CharSequenceToContainCheckersKt {
public static final fun atLeast (Lch/tutteli/atrium/logic/creating/charsequence/contains/CharSequenceContains$EntryPointStep;I)Lch/tutteli/atrium/logic/creating/charsequence/contains/steps/AtLeastCheckerStep;
public static final fun atMost (Lch/tutteli/atrium/logic/creating/charsequence/contains/CharSequenceContains$EntryPointStep;I)Lch/tutteli/atrium/logic/creating/charsequence/contains/steps/AtMostCheckerStep;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package ch.tutteli.atrium.api.fluent.en_GB

import ch.tutteli.atrium.creating.Expect
import ch.tutteli.atrium.logic._logic
import ch.tutteli.atrium.logic.length


/**
* Creates an [Expect] for the property [CharSequence.length] of the subject of `this` expectation,
* so that further fluent calls are assertions about it.
*
* @return The newly created [Expect] for the extracted feature
*
* @sample ch.tutteli.atrium.api.fluent.en_GB.samples.CharSequenceExpectationSamples.lengthFeature
*
* @since 1.3.0
*/
val <T : CharSequence> Expect<T>.length: Expect<Int>
get() = _logic.length().transform()

/**
* Expects that the property [CharSequence.length] of the subject of `this` expectation
* holds all assertions the given [assertionCreator] creates for it and
* returns an [Expect] for the current subject of `this` expectation.
*
* @return an [Expect] for the subject of `this` expectation.
*
* @sample ch.tutteli.atrium.api.fluent.en_GB.samples.CharSequenceExpectationSamples.length
*
* @since 1.3.0
*/
fun <T : CharSequence> Expect<T>.length(assertionCreator: Expect<Int>.() -> Unit): Expect<T> =
_logic.length().collectAndAppend(assertionCreator)

Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import ch.tutteli.atrium.creating.Expect
import ch.tutteli.atrium.specs.fun0
import ch.tutteli.atrium.specs.fun1
import ch.tutteli.atrium.specs.integration.AbstractCharSequenceExpectationsTest
import ch.tutteli.atrium.specs.property
import kotlin.test.Test

class CharSequenceExpectationsTest : AbstractCharSequenceExpectationsTest(
Expand All @@ -16,10 +17,12 @@ class CharSequenceExpectationsTest : AbstractCharSequenceExpectationsTest(
fun1(Expect<CharSequence>::toEndWith),
fun1(Expect<CharSequence>::notToEndWith),
fun1(Expect<CharSequence>::toMatch),
fun1(Expect<CharSequence>::notToMatch)
fun1(Expect<CharSequence>::notToMatch),
property(Expect<CharSequence>::length),
fun1(Expect<CharSequence>::length)
) {

@Suppress("AssignedValueIsNeverRead", "UNUSED_VALUE")
@Suppress("UNUSED_VARIABLE", "UNUSED_VALUE", "unused")
@Test
fun ambiguityTest() {
var a1: Expect<String> = expect("Hello my name is Robert")
Expand All @@ -37,5 +40,11 @@ class CharSequenceExpectationsTest : AbstractCharSequenceExpectationsTest(

a1 = a1.toMatch(Regex(".+Robert"))
a1 = a1.notToMatch(Regex("a"))

a1 = a1.length { toEqual(23) }
a2 = a2.length { toEqual(0) }

val l1: Expect<Int> = a1.length
val l2: Expect<Int> = a2.length
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package ch.tutteli.atrium.api.fluent.en_GB.samples

import ch.tutteli.atrium.api.fluent.en_GB.length
import ch.tutteli.atrium.api.fluent.en_GB.toBeGreaterThan
import ch.tutteli.atrium.api.verbs.internal.expect
import kotlin.test.Test

class CharSequenceFeatureExtractorSamples {

@Test
fun lengthFeature() {
expect("Hello").length.toBeGreaterThan(3)

fails {
expect("Hi").length.toBeGreaterThan(3)
}
}

@Test
fun length() {
expect("Hello").length { toBeGreaterThan(3) }

fails {
expect("Hi").length { toBeGreaterThan(3) }
}
}
}
2 changes: 2 additions & 0 deletions apis/infix/atrium-api-infix/api/main/atrium-api-infix.api
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ public final class ch/tutteli/atrium/api/infix/en_GB/BigDecimalExpectationsKt {
}

public final class ch/tutteli/atrium/api/infix/en_GB/CharSequenceExpectationsKt {
public static final fun getLength (Lch/tutteli/atrium/creating/Expect;)Lch/tutteli/atrium/creating/Expect;
public static final fun length (Lch/tutteli/atrium/creating/Expect;Lkotlin/jvm/functions/Function1;)Lch/tutteli/atrium/creating/Expect;
public static final fun notToBe (Lch/tutteli/atrium/creating/Expect;Lch/tutteli/atrium/api/infix/en_GB/blank;)Lch/tutteli/atrium/creating/Expect;
public static final fun notToBe (Lch/tutteli/atrium/creating/Expect;Lch/tutteli/atrium/api/infix/en_GB/empty;)Lch/tutteli/atrium/creating/Expect;
public static final fun notToContain (Lch/tutteli/atrium/creating/Expect;Lch/tutteli/atrium/api/infix/en_GB/creating/Values;)Lch/tutteli/atrium/creating/Expect;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ public final class ch/tutteli/atrium/api/infix/en_GB/BigDecimalExpectationsKt {
}

public final class ch/tutteli/atrium/api/infix/en_GB/CharSequenceExpectationsKt {
public static final fun getLength (Lch/tutteli/atrium/creating/Expect;)Lch/tutteli/atrium/creating/Expect;
public static final fun length (Lch/tutteli/atrium/creating/Expect;Lkotlin/jvm/functions/Function1;)Lch/tutteli/atrium/creating/Expect;
public static final fun notToBe (Lch/tutteli/atrium/creating/Expect;Lch/tutteli/atrium/api/infix/en_GB/blank;)Lch/tutteli/atrium/creating/Expect;
public static final fun notToBe (Lch/tutteli/atrium/creating/Expect;Lch/tutteli/atrium/api/infix/en_GB/empty;)Lch/tutteli/atrium/creating/Expect;
public static final fun notToContain (Lch/tutteli/atrium/creating/Expect;Lch/tutteli/atrium/api/infix/en_GB/creating/Values;)Lch/tutteli/atrium/creating/Expect;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -306,6 +306,33 @@ infix fun <T : CharSequence> Expect<T>.toMatch(pattern: Regex): Expect<T> =
infix fun <T : CharSequence> Expect<T>.notToMatch(pattern: Regex): Expect<T> =
_logicAppend { mismatches(pattern) }

/**
* Creates an [Expect] for the property [CharSequence.length] of the subject of `this` expectation,
* so that further fluent calls are assertions about it.
*
* @return The newly created [Expect] for the extracted feature.
*
* @sample ch.tutteli.atrium.api.infix.en_GB.samples.CharSequenceExpectationSamples.lengthFeature
*
* @since 1.3.0
*/
val <T : CharSequence> Expect<T>.length: Expect<Int>
get() = _logic.length().transform()

/**
* Expects that the property [CharSequence.length] of the subject of `this` expectation
* holds all assertions the given [assertionCreator] creates for it and
* returns an [Expect] for the current subject of `this` expectation.
*
* @return an [Expect] for the subject of `this` expectation.
*
* @sample ch.tutteli.atrium.api.infix.en_GB.samples.CharSequenceExpectationSamples.length
*
* @since 1.3.0
*/
infix fun <T : CharSequence> Expect<T>.length(assertionCreator: Expect<Int>.() -> Unit): Expect<T> =
_logic.length().collectAndAppend(assertionCreator)


/**
* Expects that the subject of `this` expectation (a [CharSequence]) [CharSequence].[kotlin.text.isEmpty].
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import ch.tutteli.atrium.api.verbs.internal.expect
import ch.tutteli.atrium.creating.Expect
import ch.tutteli.atrium.specs.fun1
import ch.tutteli.atrium.specs.integration.AbstractCharSequenceExpectationsTest
import ch.tutteli.atrium.specs.property
import kotlin.test.Test

class CharSequenceExpectationsTest : AbstractCharSequenceExpectationsTest(
Expand All @@ -15,15 +16,18 @@ class CharSequenceExpectationsTest : AbstractCharSequenceExpectationsTest(
fun1(Expect<CharSequence>::toEndWith),
fun1(Expect<CharSequence>::notToEndWith),
fun1(Expect<CharSequence>::toMatch),
fun1(Expect<CharSequence>::notToMatch)
fun1(Expect<CharSequence>::notToMatch),
property(Expect<CharSequence>::length),
fun1(Expect<CharSequence>::length)
) {

companion object {
private fun toBeEmpty(expect: Expect<CharSequence>) = expect toBe empty
private fun notToBeEmpty(expect: Expect<CharSequence>) = expect notToBe empty
private fun notToBeBlank(expect: Expect<CharSequence>) = expect notToBe blank
}

@Suppress("AssignedValueIsNeverRead", "UNUSED_VALUE")
@Suppress("UNUSED_VARIABLE", "UNUSED_VALUE", "unused")
@Test
fun ambiguityTest() {
var a1: Expect<String> = expect("Hello my name is Robert")
Expand All @@ -41,5 +45,11 @@ class CharSequenceExpectationsTest : AbstractCharSequenceExpectationsTest(

a1 = a1 toMatch Regex(".+Robert")
a1 = a1 notToMatch Regex("a")

a1 = a1 length { it toEqual 23 }
a2 = a2 length { it toEqual 0 }

val l1: Expect<Int> = a1.length
val l2: Expect<Int> = a2.length
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package ch.tutteli.atrium.api.infix.en_GB.samples

import ch.tutteli.atrium.api.infix.en_GB.*
import ch.tutteli.atrium.api.infix.en_GB.samples.fails
import ch.tutteli.atrium.api.verbs.expect
import kotlin.test.Test

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package ch.tutteli.atrium.api.infix.en_GB.samples

import ch.tutteli.atrium.api.infix.en_GB.it
import ch.tutteli.atrium.api.infix.en_GB.length
import ch.tutteli.atrium.api.infix.en_GB.toEqual
import ch.tutteli.atrium.api.verbs.expect
import kotlin.test.Test

class CharSequenceFeatureExtractorSamples {

@Test
fun lengthFeature() {
expect("Hello").length toEqual 5

fails {
expect("Hi").length toEqual 3
}
}

@Test
fun length() {
expect("Hello") length {
it toEqual 5
}

fails {
expect("Hi") length {
it toEqual 3
}
}
}

}
3 changes: 3 additions & 0 deletions logic/atrium-logic/api/main/atrium-logic.api
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ public abstract interface class ch/tutteli/atrium/logic/CharSequenceAssertions {
public abstract fun isEmpty (Lch/tutteli/atrium/creating/AssertionContainer;)Lch/tutteli/atrium/assertions/Assertion;
public abstract fun isNotBlank (Lch/tutteli/atrium/creating/AssertionContainer;)Lch/tutteli/atrium/assertions/Assertion;
public abstract fun isNotEmpty (Lch/tutteli/atrium/creating/AssertionContainer;)Lch/tutteli/atrium/assertions/Assertion;
public abstract fun length (Lch/tutteli/atrium/creating/AssertionContainer;)Lch/tutteli/atrium/logic/creating/transformers/FeatureExtractorBuilder$ExecutionStep;
public abstract fun matches (Lch/tutteli/atrium/creating/AssertionContainer;Lkotlin/text/Regex;)Lch/tutteli/atrium/assertions/Assertion;
public abstract fun mismatches (Lch/tutteli/atrium/creating/AssertionContainer;Lkotlin/text/Regex;)Lch/tutteli/atrium/assertions/Assertion;
public abstract fun startsNotWith (Lch/tutteli/atrium/creating/AssertionContainer;Ljava/lang/CharSequence;)Lch/tutteli/atrium/assertions/Assertion;
Expand All @@ -60,6 +61,7 @@ public final class ch/tutteli/atrium/logic/CharSequenceKt {
public static final fun isEmpty (Lch/tutteli/atrium/creating/AssertionContainer;)Lch/tutteli/atrium/assertions/Assertion;
public static final fun isNotBlank (Lch/tutteli/atrium/creating/AssertionContainer;)Lch/tutteli/atrium/assertions/Assertion;
public static final fun isNotEmpty (Lch/tutteli/atrium/creating/AssertionContainer;)Lch/tutteli/atrium/assertions/Assertion;
public static final fun length (Lch/tutteli/atrium/creating/AssertionContainer;)Lch/tutteli/atrium/logic/creating/transformers/FeatureExtractorBuilder$ExecutionStep;
public static final fun matches (Lch/tutteli/atrium/creating/AssertionContainer;Lkotlin/text/Regex;)Lch/tutteli/atrium/assertions/Assertion;
public static final fun mismatches (Lch/tutteli/atrium/creating/AssertionContainer;Lkotlin/text/Regex;)Lch/tutteli/atrium/assertions/Assertion;
public static final fun startsNotWith (Lch/tutteli/atrium/creating/AssertionContainer;Ljava/lang/CharSequence;)Lch/tutteli/atrium/assertions/Assertion;
Expand Down Expand Up @@ -1943,6 +1945,7 @@ public final class ch/tutteli/atrium/logic/impl/DefaultCharSequenceAssertions :
public fun isEmpty (Lch/tutteli/atrium/creating/AssertionContainer;)Lch/tutteli/atrium/assertions/Assertion;
public fun isNotBlank (Lch/tutteli/atrium/creating/AssertionContainer;)Lch/tutteli/atrium/assertions/Assertion;
public fun isNotEmpty (Lch/tutteli/atrium/creating/AssertionContainer;)Lch/tutteli/atrium/assertions/Assertion;
public fun length (Lch/tutteli/atrium/creating/AssertionContainer;)Lch/tutteli/atrium/logic/creating/transformers/FeatureExtractorBuilder$ExecutionStep;
public fun matches (Lch/tutteli/atrium/creating/AssertionContainer;Lkotlin/text/Regex;)Lch/tutteli/atrium/assertions/Assertion;
public fun mismatches (Lch/tutteli/atrium/creating/AssertionContainer;Lkotlin/text/Regex;)Lch/tutteli/atrium/assertions/Assertion;
public fun startsNotWith (Lch/tutteli/atrium/creating/AssertionContainer;Ljava/lang/CharSequence;)Lch/tutteli/atrium/assertions/Assertion;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ public abstract interface class ch/tutteli/atrium/logic/CharSequenceAssertions {
public abstract fun isEmpty (Lch/tutteli/atrium/creating/AssertionContainer;)Lch/tutteli/atrium/assertions/Assertion;
public abstract fun isNotBlank (Lch/tutteli/atrium/creating/AssertionContainer;)Lch/tutteli/atrium/assertions/Assertion;
public abstract fun isNotEmpty (Lch/tutteli/atrium/creating/AssertionContainer;)Lch/tutteli/atrium/assertions/Assertion;
public abstract fun length (Lch/tutteli/atrium/creating/AssertionContainer;)Lch/tutteli/atrium/logic/creating/transformers/FeatureExtractorBuilder$ExecutionStep;
public abstract fun matches (Lch/tutteli/atrium/creating/AssertionContainer;Lkotlin/text/Regex;)Lch/tutteli/atrium/assertions/Assertion;
public abstract fun mismatches (Lch/tutteli/atrium/creating/AssertionContainer;Lkotlin/text/Regex;)Lch/tutteli/atrium/assertions/Assertion;
public abstract fun startsNotWith (Lch/tutteli/atrium/creating/AssertionContainer;Ljava/lang/CharSequence;)Lch/tutteli/atrium/assertions/Assertion;
Expand All @@ -60,6 +61,7 @@ public final class ch/tutteli/atrium/logic/CharSequenceKt {
public static final fun isEmpty (Lch/tutteli/atrium/creating/AssertionContainer;)Lch/tutteli/atrium/assertions/Assertion;
public static final fun isNotBlank (Lch/tutteli/atrium/creating/AssertionContainer;)Lch/tutteli/atrium/assertions/Assertion;
public static final fun isNotEmpty (Lch/tutteli/atrium/creating/AssertionContainer;)Lch/tutteli/atrium/assertions/Assertion;
public static final fun length (Lch/tutteli/atrium/creating/AssertionContainer;)Lch/tutteli/atrium/logic/creating/transformers/FeatureExtractorBuilder$ExecutionStep;
public static final fun matches (Lch/tutteli/atrium/creating/AssertionContainer;Lkotlin/text/Regex;)Lch/tutteli/atrium/assertions/Assertion;
public static final fun mismatches (Lch/tutteli/atrium/creating/AssertionContainer;Lkotlin/text/Regex;)Lch/tutteli/atrium/assertions/Assertion;
public static final fun startsNotWith (Lch/tutteli/atrium/creating/AssertionContainer;Ljava/lang/CharSequence;)Lch/tutteli/atrium/assertions/Assertion;
Expand Down Expand Up @@ -1943,6 +1945,7 @@ public final class ch/tutteli/atrium/logic/impl/DefaultCharSequenceAssertions :
public fun isEmpty (Lch/tutteli/atrium/creating/AssertionContainer;)Lch/tutteli/atrium/assertions/Assertion;
public fun isNotBlank (Lch/tutteli/atrium/creating/AssertionContainer;)Lch/tutteli/atrium/assertions/Assertion;
public fun isNotEmpty (Lch/tutteli/atrium/creating/AssertionContainer;)Lch/tutteli/atrium/assertions/Assertion;
public fun length (Lch/tutteli/atrium/creating/AssertionContainer;)Lch/tutteli/atrium/logic/creating/transformers/FeatureExtractorBuilder$ExecutionStep;
public fun matches (Lch/tutteli/atrium/creating/AssertionContainer;Lkotlin/text/Regex;)Lch/tutteli/atrium/assertions/Assertion;
public fun mismatches (Lch/tutteli/atrium/creating/AssertionContainer;Lkotlin/text/Regex;)Lch/tutteli/atrium/assertions/Assertion;
public fun startsNotWith (Lch/tutteli/atrium/creating/AssertionContainer;Ljava/lang/CharSequence;)Lch/tutteli/atrium/assertions/Assertion;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import ch.tutteli.atrium.logic.creating.charsequence.contains.CharSequenceContai
import ch.tutteli.atrium.logic.creating.charsequence.contains.searchbehaviours.NoOpSearchBehaviour
import ch.tutteli.atrium.logic.creating.charsequence.contains.searchbehaviours.NotSearchBehaviour
import ch.tutteli.atrium.logic.creating.charsequence.contains.steps.NotCheckerStep
import ch.tutteli.atrium.logic.creating.transformers.FeatureExtractorBuilder

/**
* Collection of assertion functions and builders which are applicable to subjects with a [CharSequence] type.
Expand Down Expand Up @@ -37,4 +38,5 @@ interface CharSequenceAssertions {

fun <T : CharSequence> matches(container: AssertionContainer<T>, expected: Regex): Assertion
fun <T : CharSequence> mismatches(container: AssertionContainer<T>, expected: Regex): Assertion
fun <T : CharSequence> length(container: AssertionContainer<T>): FeatureExtractorBuilder.ExecutionStep<T, Int>
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import ch.tutteli.atrium.creating.AssertionContainer
import ch.tutteli.atrium.logic.CharSequenceAssertions
import ch.tutteli.atrium.logic._logic
import ch.tutteli.atrium.logic.createDescriptiveAssertion
import ch.tutteli.atrium.logic.creating.transformers.FeatureExtractorBuilder
import ch.tutteli.atrium.logic.creating.charsequence.contains.CharSequenceContains
import ch.tutteli.atrium.logic.creating.charsequence.contains.searchbehaviours.NoOpSearchBehaviour
import ch.tutteli.atrium.logic.creating.charsequence.contains.searchbehaviours.NotSearchBehaviour
Expand All @@ -14,6 +15,7 @@ import ch.tutteli.atrium.logic.creating.charsequence.contains.searchbehaviours.i
import ch.tutteli.atrium.logic.creating.charsequence.contains.steps.NotCheckerStep
import ch.tutteli.atrium.logic.creating.charsequence.contains.steps.impl.EntryPointStepImpl
import ch.tutteli.atrium.logic.creating.charsequence.contains.steps.notCheckerStep
import ch.tutteli.atrium.logic.property
import ch.tutteli.atrium.translations.DescriptionBasic.NOT_TO_BE
import ch.tutteli.atrium.translations.DescriptionBasic.TO_BE
import ch.tutteli.atrium.translations.DescriptionCharSequenceExpectation.*
Expand Down Expand Up @@ -55,4 +57,7 @@ class DefaultCharSequenceAssertions : CharSequenceAssertions {

override fun <T : CharSequence> mismatches(container: AssertionContainer<T>, expected: Regex): Assertion =
container.createDescriptiveAssertion(NOT_TO_MATCH, expected) { !it.matches(expected) }

override fun <T : CharSequence> length(container: AssertionContainer<T>): FeatureExtractorBuilder.ExecutionStep<T, Int> =
container.property(CharSequence::length)
}
Loading