Skip to content

Commit 665e768

Browse files
authored
Merge 23afb46 into 5e778b9
2 parents 5e778b9 + 23afb46 commit 665e768

File tree

2 files changed

+59
-62
lines changed

2 files changed

+59
-62
lines changed

firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/DataConnectSettingsUnitTest.kt

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -142,9 +142,11 @@ class DataConnectSettingsUnitTest {
142142

143143
@Test
144144
fun `hashCode() should return a different value when only 'host' differs`() = runTest {
145-
checkAll(propTestConfig, Arb.dataConnect.dataConnectSettings(), Arb.dataConnect.string()) {
146-
settings1,
147-
newHost ->
145+
checkAll(
146+
hashEqualityPropTestConfig,
147+
Arb.dataConnect.dataConnectSettings(),
148+
Arb.dataConnect.string()
149+
) { settings1, newHost ->
148150
assume { settings1.host.hashCode() != newHost.hashCode() }
149151
val settings2 = settings1.copy(host = newHost)
150152
settings1.equals(settings2) shouldBe false
@@ -153,7 +155,7 @@ class DataConnectSettingsUnitTest {
153155

154156
@Test
155157
fun `hashCode() should return a different value when only 'sslEnabled' differs`() = runTest {
156-
checkAll(propTestConfig, Arb.dataConnect.dataConnectSettings()) { settings1 ->
158+
checkAll(hashEqualityPropTestConfig, Arb.dataConnect.dataConnectSettings()) { settings1 ->
157159
val settings2 = settings1.copy(sslEnabled = !settings1.sslEnabled)
158160
settings1.equals(settings2) shouldBe false
159161
}
@@ -180,9 +182,8 @@ class DataConnectSettingsUnitTest {
180182
newHost ->
181183
val settings2 = settings1.copy(host = newHost)
182184
assertSoftly {
183-
settings1 shouldNotBeSameInstanceAs settings2
184-
settings1.equals(settings2) shouldBe false
185185
settings2.host shouldBeSameInstanceAs newHost
186+
settings2.sslEnabled shouldBe settings1.sslEnabled
186187
}
187188
}
188189
}
@@ -194,8 +195,7 @@ class DataConnectSettingsUnitTest {
194195
newSslEnabled ->
195196
val settings2 = settings1.copy(sslEnabled = newSslEnabled)
196197
assertSoftly {
197-
settings1 shouldNotBeSameInstanceAs settings2
198-
settings1.equals(settings2) shouldBe (settings1.sslEnabled == newSslEnabled)
198+
settings2.host shouldBeSameInstanceAs settings1.host
199199
settings2.sslEnabled shouldBe newSslEnabled
200200
}
201201
}
@@ -211,8 +211,6 @@ class DataConnectSettingsUnitTest {
211211
) { settings1, newHost, newSslEnabled ->
212212
val settings2 = settings1.copy(host = newHost, sslEnabled = newSslEnabled)
213213
assertSoftly {
214-
settings1 shouldNotBeSameInstanceAs settings2
215-
settings1.equals(settings2) shouldBe false
216214
settings2.host shouldBeSameInstanceAs newHost
217215
settings2.sslEnabled shouldBe newSslEnabled
218216
}
@@ -221,5 +219,13 @@ class DataConnectSettingsUnitTest {
221219

222220
private companion object {
223221
val propTestConfig = PropTestConfig(iterations = 20)
222+
223+
// Allow a small number of failures to account for the rare, but possible situation where two
224+
// distinct instances produce the same hash code.
225+
val hashEqualityPropTestConfig =
226+
propTestConfig.copy(
227+
minSuccess = propTestConfig.iterations!! - 2,
228+
maxFailure = 2,
229+
)
224230
}
225231
}

firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/core/QueryResultImplUnitTest.kt

Lines changed: 43 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,11 @@ package com.google.firebase.dataconnect.core
2020

2121
import com.google.firebase.dataconnect.testutil.property.arbitrary.DataConnectArb
2222
import com.google.firebase.dataconnect.testutil.property.arbitrary.dataConnect
23+
import com.google.firebase.dataconnect.testutil.property.arbitrary.distinctPair
2324
import com.google.firebase.dataconnect.testutil.property.arbitrary.queryRefImpl
2425
import com.google.firebase.dataconnect.testutil.shouldContainWithNonAbuttingText
2526
import io.kotest.assertions.assertSoftly
27+
import io.kotest.assertions.withClue
2628
import io.kotest.common.ExperimentalKotest
2729
import io.kotest.matchers.shouldBe
2830
import io.kotest.matchers.shouldNotBe
@@ -31,9 +33,10 @@ import io.kotest.matchers.string.shouldStartWith
3133
import io.kotest.matchers.types.shouldBeSameInstanceAs
3234
import io.kotest.property.Arb
3335
import io.kotest.property.PropTestConfig
34-
import io.kotest.property.arbitrary.arbitrary
36+
import io.kotest.property.arbitrary.bind
3537
import io.kotest.property.arbitrary.choice
3638
import io.kotest.property.arbitrary.int
39+
import io.kotest.property.arbitrary.map
3740
import io.kotest.property.assume
3841
import io.kotest.property.checkAll
3942
import kotlinx.coroutines.test.runTest
@@ -43,22 +46,17 @@ import org.junit.Test
4346
class QueryResultImplUnitTest {
4447

4548
@Test
46-
fun `'data' should be the same object given to the constructor`() = runTest {
47-
checkAll(propTestConfig, Arb.dataConnect.queryRefImpl(), Arb.dataConnect.testData()) {
48-
query,
49-
data ->
50-
val queryResult = query.QueryResultImpl(data)
51-
queryResult.data shouldBeSameInstanceAs data
52-
}
53-
}
54-
55-
@Test
56-
fun `'ref' should be the QueryRefImpl object that was used to create it`() = runTest {
57-
checkAll(propTestConfig, Arb.dataConnect.queryRefImpl(), Arb.dataConnect.testData()) {
58-
query,
59-
data ->
60-
val queryResult = query.QueryResultImpl(data)
61-
queryResult.ref shouldBeSameInstanceAs query
49+
fun `properties should be the same objects given to or inferred by the constructor`() = runTest {
50+
checkAll(
51+
propTestConfig,
52+
Arb.dataConnect.queryRefImpl(),
53+
Arb.dataConnect.testData(),
54+
) { ref, data ->
55+
val queryResult = ref.QueryResultImpl(data)
56+
assertSoftly {
57+
withClue("ref") { queryResult.ref shouldBeSameInstanceAs ref }
58+
withClue("data") { queryResult.data shouldBeSameInstanceAs data }
59+
}
6260
}
6361
}
6462

@@ -125,10 +123,8 @@ class QueryResultImplUnitTest {
125123
checkAll(
126124
propTestConfig,
127125
Arb.dataConnect.queryRefImpl(),
128-
Arb.dataConnect.testData(),
129-
Arb.dataConnect.testData()
130-
) { query, data1, data2 ->
131-
assume(data1 != data2)
126+
Arb.dataConnect.testData().distinctPair()
127+
) { query, (data1, data2) ->
132128
val queryResult1 = query.QueryResultImpl(data1)
133129
val queryResult2 = query.QueryResultImpl(data2)
134130
queryResult1.equals(queryResult2) shouldBe false
@@ -139,11 +135,9 @@ class QueryResultImplUnitTest {
139135
fun `equals() should return false when only 'ref' differs`() = runTest {
140136
checkAll(
141137
propTestConfig,
142-
Arb.dataConnect.queryRefImpl(),
143-
Arb.dataConnect.queryRefImpl(),
138+
Arb.dataConnect.queryRefImpl().distinctPair(),
144139
Arb.dataConnect.testData()
145-
) { query1, query2, data,
146-
->
140+
) { (query1, query2), data ->
147141
assume(query1 != query2)
148142
val queryResult1 = query1.QueryResultImpl(data)
149143
val queryResult2 = query2.QueryResultImpl(data)
@@ -152,12 +146,11 @@ class QueryResultImplUnitTest {
152146
}
153147

154148
@Test
155-
fun `equals() should return false when data of first object is null and second is non-null`() =
149+
fun `equals() should return false when data of first data is null and second is non-null`() =
156150
runTest {
157151
checkAll(propTestConfig, Arb.dataConnect.queryRefImpl(), Arb.dataConnect.testData()) {
158152
query,
159-
data,
160-
->
153+
data ->
161154
val queryResult1 = query.QueryResultImpl(null)
162155
val queryResult2 = query.QueryResultImpl(data)
163156
queryResult1.equals(queryResult2) shouldBe false
@@ -169,8 +162,7 @@ class QueryResultImplUnitTest {
169162
runTest {
170163
checkAll(propTestConfig, Arb.dataConnect.queryRefImpl(), Arb.dataConnect.testData()) {
171164
query,
172-
data,
173-
->
165+
data ->
174166
val queryResult1 = query.QueryResultImpl(data)
175167
val queryResult2 = query.QueryResultImpl(null)
176168
queryResult1.equals(queryResult2) shouldBe false
@@ -192,8 +184,7 @@ class QueryResultImplUnitTest {
192184
fun `hashCode() should return the same value on equal objects`() = runTest {
193185
checkAll(propTestConfig, Arb.dataConnect.queryRefImpl(), Arb.dataConnect.testData()) {
194186
query,
195-
data,
196-
->
187+
data ->
197188
val queryResult1 = query.QueryResultImpl(data)
198189
val queryResult2 = query.QueryResultImpl(data)
199190
queryResult1.hashCode() shouldBe queryResult2.hashCode()
@@ -203,12 +194,10 @@ class QueryResultImplUnitTest {
203194
@Test
204195
fun `hashCode() should return a different value if 'data' is different`() = runTest {
205196
checkAll(
206-
propTestConfig,
197+
hashEqualityPropTestConfig,
207198
Arb.dataConnect.queryRefImpl(),
208-
Arb.dataConnect.testData(),
209-
Arb.dataConnect.testData()
210-
) { query, data1, data2,
211-
->
199+
Arb.dataConnect.testData().distinctPair(),
200+
) { query, (data1, data2) ->
212201
assume(data1.hashCode() != data2.hashCode())
213202
val queryResult1 = query.QueryResultImpl(data1)
214203
val queryResult2 = query.QueryResultImpl(data2)
@@ -219,12 +208,10 @@ class QueryResultImplUnitTest {
219208
@Test
220209
fun `hashCode() should return a different value if 'ref' is different`() = runTest {
221210
checkAll(
222-
propTestConfig,
223-
Arb.dataConnect.queryRefImpl(),
224-
Arb.dataConnect.queryRefImpl(),
211+
hashEqualityPropTestConfig,
212+
Arb.dataConnect.queryRefImpl().distinctPair(),
225213
Arb.dataConnect.testData()
226-
) { query1, query2, data,
227-
->
214+
) { (query1, query2), data ->
228215
assume(query1.hashCode() != query2.hashCode())
229216
val queryResult1 = query1.QueryResultImpl(data)
230217
val queryResult2 = query2.QueryResultImpl(data)
@@ -239,21 +226,25 @@ class QueryResultImplUnitTest {
239226
private companion object {
240227
val propTestConfig = PropTestConfig(iterations = 20)
241228

229+
// Allow a small number of failures to account for the rare, but possible situation where two
230+
// distinct instances produce the same hash code.
231+
val hashEqualityPropTestConfig =
232+
propTestConfig.copy(
233+
minSuccess = propTestConfig.iterations!! - 2,
234+
maxFailure = 2,
235+
)
236+
242237
fun DataConnectArb.testVariables(string: Arb<String> = string()): Arb<TestVariables> =
243-
arbitrary {
244-
TestVariables(string.bind())
245-
}
238+
string.map { TestVariables(it) }
246239

247-
fun DataConnectArb.testData(string: Arb<String> = string()): Arb<TestData> = arbitrary {
248-
TestData(string.bind())
249-
}
240+
fun DataConnectArb.testData(string: Arb<String> = string()): Arb<TestData> =
241+
string.map { TestData(it) }
250242

251243
fun DataConnectArb.queryResultImpl(
252244
query: Arb<QueryRefImpl<TestData?, TestVariables>> = queryRefImpl(),
253-
data: Arb<TestData> = testData()
254-
): Arb<QueryRefImpl<TestData?, TestVariables>.QueryResultImpl> = arbitrary {
255-
query.bind().QueryResultImpl(data.bind())
256-
}
245+
data: Arb<TestData> = testData(),
246+
): Arb<QueryRefImpl<TestData?, TestVariables>.QueryResultImpl> =
247+
Arb.bind(query, data) { query, data -> query.QueryResultImpl(data) }
257248

258249
fun DataConnectArb.queryRefImpl(): Arb<QueryRefImpl<TestData?, TestVariables>> =
259250
queryRefImpl(Arb.dataConnect.testVariables())

0 commit comments

Comments
 (0)