Skip to content

Commit 2587615

Browse files
committed
Add subject for CharSequence
1 parent c429a3b commit 2587615

File tree

6 files changed

+259
-114
lines changed

6 files changed

+259
-114
lines changed

src/commonMain/kotlin/com/varabyte/truthish/Truth.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ fun assertThat(actual: Long) = LongSubject(actual)
1414
fun assertThat(actual: Float) = FloatSubject(actual)
1515
fun assertThat(actual: Double) = DoubleSubject(actual)
1616
fun assertThat(actual: String) = StringSubject(actual)
17+
fun assertThat(actual: CharSequence) = CharSequenceSubject(actual)
1718
fun <T, I: Iterable<T>> assertThat(actual: I) = IterableSubject(actual)
1819
fun <K, V, T: Map<K, V>> assertThat(actual: T) = MapSubject(actual)
1920
fun <T, S: Sequence<T>> assertThat(actual: S) = IterableSubject(actual.asIterable())
@@ -83,6 +84,7 @@ class AssertAllScope(summary: String?) {
8384
fun that(actual: Float) = FloatSubject(actual).withStrategy(deferredStrategy)
8485
fun that(actual: Double) = DoubleSubject(actual).withStrategy(deferredStrategy)
8586
fun that(actual: String) = StringSubject(actual).withStrategy(deferredStrategy)
87+
fun that(actual: CharSequence) = CharSequenceSubject(actual).withStrategy(deferredStrategy)
8688
fun <T, I: Iterable<T>> that(actual: I) = IterableSubject(actual).withStrategy(deferredStrategy)
8789
fun <K, V, T: Map<K, V>> that(actual: T) = MapSubject(actual).withStrategy(deferredStrategy)
8890
fun <T, S: Sequence<T>> that(actual: S) = IterableSubject(actual.asIterable()).withStrategy(deferredStrategy)
@@ -146,6 +148,7 @@ class SummarizedSubjectBuilder(private val message: String, private val strategy
146148
fun that(actual: Float) = FloatSubject(actual).withMessage(message).withStrategyOverride()
147149
fun that(actual: Double) = DoubleSubject(actual).withMessage(message).withStrategyOverride()
148150
fun that(actual: String) = StringSubject(actual).withMessage(message).withStrategyOverride()
151+
fun that(actual: CharSequence) = CharSequenceSubject(actual).withMessage(message).withStrategyOverride()
149152
fun <T, I: Iterable<T>> that(actual: I) = IterableSubject(actual).withMessage(message).withStrategyOverride()
150153
fun <K, V, T: Map<K, V>> that(actual: T) = MapSubject(actual).withMessage(message).withStrategyOverride()
151154
fun <T, S: Sequence<T>> that(actual: S) = IterableSubject(actual.asIterable()).withMessage(message).withStrategyOverride()

src/commonMain/kotlin/com/varabyte/truthish/failure/Reportable.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,3 +67,11 @@ inline fun <reified R : Reportable> R.withStrategy(strategy: FailureStrategy): R
6767
this.strategy = strategy
6868
return this
6969
}
70+
71+
// Useful for delegating one reportable to another
72+
internal inline fun <reified R1 : Reportable, reified R2 : Reportable> R1.copyValuesFrom(other: R2): R1 {
73+
this.name = other.name
74+
this.strategy = other.strategy
75+
this.message = other.message
76+
return this
77+
}

src/commonMain/kotlin/com/varabyte/truthish/subjects/StringSubject.kt renamed to src/commonMain/kotlin/com/varabyte/truthish/subjects/TextSubjects.kt

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@ package com.varabyte.truthish.subjects
33
import com.varabyte.truthish.failure.DetailsFor
44
import com.varabyte.truthish.failure.Report
55
import com.varabyte.truthish.failure.Summaries
6+
import com.varabyte.truthish.failure.copyValuesFrom
67

7-
class StringSubject(private val actual: String) : ComparableSubject<String>(actual) {
8+
class CharSequenceSubject(private val actual: CharSequence) : NotNullSubject<CharSequence>(actual) {
89

910
fun isEmpty() {
10-
if (!actual.isEmpty()) {
11+
if (actual.isNotEmpty()) {
1112
report(Report(Summaries.EXPECTED_EMPTY, DetailsFor.actual(actual)))
1213
}
1314
}
@@ -19,7 +20,7 @@ class StringSubject(private val actual: String) : ComparableSubject<String>(actu
1920
}
2021

2122
fun isBlank() {
22-
if (!actual.isBlank()) {
23+
if (actual.isNotBlank()) {
2324
report(Report(Summaries.EXPECTED_BLANK, DetailsFor.actual(actual)))
2425
}
2526
}
@@ -148,4 +149,29 @@ class StringSubject(private val actual: String) : ComparableSubject<String>(actu
148149
fun doesNotContainMatch(regex: String) {
149150
doesNotContainMatch(Regex(regex))
150151
}
151-
}
152+
}
153+
154+
class StringSubject(private val actual: String) : ComparableSubject<String>(actual) {
155+
private val delegateSubject
156+
get() = CharSequenceSubject(actual).copyValuesFrom(this)
157+
158+
fun isEmpty() { delegateSubject.isEmpty() }
159+
fun isNotEmpty() { delegateSubject.isNotEmpty() }
160+
fun isBlank() { delegateSubject.isBlank() }
161+
fun isNotBlank() { delegateSubject.isNotBlank() }
162+
fun hasLength(expectedLength: Int) { delegateSubject.hasLength(expectedLength) }
163+
fun startsWith(expected: CharSequence) { delegateSubject.startsWith(expected) }
164+
fun doesNotStartWith(expected: CharSequence) { delegateSubject.doesNotStartWith(expected) }
165+
fun endsWith(expected: CharSequence) { delegateSubject.endsWith(expected) }
166+
fun doesNotEndWith(expected: CharSequence) { delegateSubject.doesNotEndWith(expected) }
167+
fun matches(regex: Regex) { delegateSubject.matches(regex) }
168+
fun matches(regex: String) { delegateSubject.matches(regex) }
169+
fun doesNotMatch(regex: Regex) { delegateSubject.doesNotMatch(regex) }
170+
fun doesNotMatch(regex: String) { delegateSubject.doesNotMatch(regex) }
171+
fun contains(expected: CharSequence) { delegateSubject.contains(expected) }
172+
fun containsMatch(regex: Regex) { delegateSubject.containsMatch(regex) }
173+
fun containsMatch(regex: String) { delegateSubject.containsMatch(regex) }
174+
fun doesNotContain(expected: CharSequence) { delegateSubject.doesNotContain(expected) }
175+
fun doesNotContainMatch(regex: Regex) { delegateSubject.doesNotContainMatch(regex) }
176+
fun doesNotContainMatch(regex: String) { delegateSubject.doesNotContainMatch(regex) }
177+
}

src/commonTest/kotlin/com/varabyte/truthish/MessageAsserts.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ class MessageAsserts {
1919

2020
@Test
2121
fun messageChecks() {
22+
@Suppress("RedundantNullableReturnType") // Force nullable to test nullable subject
2223
val stub: Stub? = Stub()
2324

2425
assertThrows<ReportError> {
@@ -65,6 +66,10 @@ class MessageAsserts {
6566
assertWithMessage(TEST_MESSAGE).that("XYZ").isEmpty()
6667
}.assertSubstrings(TEST_MESSAGE)
6768

69+
assertThrows<ReportError> {
70+
assertWithMessage(TEST_MESSAGE).that(StringBuilder("XYZ")).isEmpty()
71+
}.assertSubstrings(TEST_MESSAGE)
72+
6873
assertThrows<ReportError> {
6974
assertWithMessage(TEST_MESSAGE).that(listOf(1, 2, 3)).containsAnyIn(listOf(4, 5, 6))
7075
}.assertSubstrings(TEST_MESSAGE)

src/commonTest/kotlin/com/varabyte/truthish/StringAsserts.kt

Lines changed: 0 additions & 110 deletions
This file was deleted.

0 commit comments

Comments
 (0)