Skip to content

Commit 63d13d7

Browse files
Update set_once tests that check placeholders
1 parent 0632a29 commit 63d13d7

File tree

8 files changed

+168
-129
lines changed

8 files changed

+168
-129
lines changed

java-tests/validating/src/test/kotlin/io/spine/test/options/setonce/SetOnceErrorMessageITest.kt

+14-60
Original file line numberDiff line numberDiff line change
@@ -32,86 +32,40 @@ import io.kotest.matchers.shouldBe
3232
import io.spine.base.FieldPath
3333
import io.spine.protobuf.TypeConverter.toAny
3434
import io.spine.protobuf.field
35-
import io.spine.test.options.setonce.TestEnv.CERT1
36-
import io.spine.test.options.setonce.TestEnv.CERT2
37-
import io.spine.test.options.setonce.TestEnv.DONALD
38-
import io.spine.test.options.setonce.TestEnv.TWENTY
39-
import io.spine.test.options.setonce.TestEnv.SEVENTY
40-
import io.spine.test.options.setonce.TestEnv.EIGHTY_KG
41-
import io.spine.test.options.setonce.TestEnv.FIFTY_KG
42-
import io.spine.test.options.setonce.TestEnv.FIRST_YEAR
43-
import io.spine.test.options.setonce.TestEnv.JACK
44-
import io.spine.test.options.setonce.TestEnv.NO
45-
import io.spine.test.options.setonce.TestEnv.SHORT_HEIGHT
46-
import io.spine.test.options.setonce.TestEnv.TWO
47-
import io.spine.test.options.setonce.TestEnv.EIGHT
48-
import io.spine.test.options.setonce.TestEnv.STUDENT1
49-
import io.spine.test.options.setonce.TestEnv.STUDENT2
50-
import io.spine.test.options.setonce.TestEnv.TALL_HEIGHT
51-
import io.spine.test.options.setonce.TestEnv.THIRD_YEAR
52-
import io.spine.test.options.setonce.TestEnv.YES
5335
import io.spine.test.tools.validate.StudentCustomMessage
5436
import io.spine.test.tools.validate.StudentDefaultMessage
5537
import io.spine.test.tools.validate.YearOfStudy
5638
import io.spine.validate.ValidationException
5739
import org.junit.jupiter.api.DisplayName
58-
import org.junit.jupiter.api.Named.named
5940
import org.junit.jupiter.api.assertThrows
6041
import org.junit.jupiter.params.ParameterizedTest
61-
import org.junit.jupiter.params.provider.Arguments.arguments
6242
import org.junit.jupiter.params.provider.MethodSource
6343

6444
@DisplayName("`(set_once)` constraint should")
6545
internal class SetOnceErrorMessageITest {
6646

67-
@MethodSource("allFieldTypesWithTwoDistinctValues")
47+
@MethodSource("io.spine.test.options.setonce.given.SetOnceErrorMessageTestEnv#allFieldTypesWithTwoDistinctValues")
6848
@ParameterizedTest(name = "show the default error message for `{0}` field")
69-
fun <T : Any> defaultErrorMessage(fieldName: String, value1: T, value2: T) =
70-
assertDefaultMessage(fieldName, value1, value2)
49+
fun <T : Any> defaultErrorMessage(fieldName: String, value1: T, value2: T, type: String) =
50+
assertDefaultMessage(fieldName, value1, value2, type)
7151

72-
@MethodSource("allFieldTypesWithTwoDistinctValues")
52+
@MethodSource("io.spine.test.options.setonce.given.SetOnceErrorMessageTestEnv#allFieldTypesWithTwoDistinctValues")
7353
@ParameterizedTest(name = "show the custom error message for `{0}` field")
74-
fun <T : Any> customErrorMessage(fieldName: String, value1: T, value2: T) =
75-
assertCustomMessage(fieldName, value1, value2)
76-
77-
private companion object {
78-
79-
@JvmStatic
80-
fun allFieldTypesWithTwoDistinctValues() = listOf(
81-
arguments(named("message", "name"), JACK, DONALD),
82-
arguments(named("string", "id"), STUDENT1, STUDENT2),
83-
arguments(named("double", "height"), SHORT_HEIGHT, TALL_HEIGHT),
84-
arguments(named("float", "weight"), FIFTY_KG, EIGHTY_KG),
85-
arguments(named("int32", "cash_USD"), TWO, EIGHT),
86-
arguments(named("int64", "cash_EUR"), TWENTY, SEVENTY),
87-
arguments(named("uint32", "cash_JPY"), TWO, EIGHT),
88-
arguments(named("uint64", "cash_GBP"), TWENTY, SEVENTY),
89-
arguments(named("sint32", "cash_AUD"), TWO, EIGHT),
90-
arguments(named("sint64", "cash_CAD"), TWENTY, SEVENTY),
91-
arguments(named("fixed32", "cash_CHF"), TWO, EIGHT),
92-
arguments(named("fixed64", "cash_CNY"), TWENTY, SEVENTY),
93-
arguments(named("sfixed32", "cash_PLN"), TWO, EIGHT),
94-
arguments(named("sfixed64", "cash_NZD"), TWENTY, SEVENTY),
95-
arguments(named("bool", "has_medals"), YES, NO),
96-
arguments(named("enum", "signature"), CERT1, CERT2),
97-
98-
// For some reason, for enums, `Message.Builder.setField()` expects value
99-
// descriptors instead of constants or their ordinal numbers.
100-
arguments("year_of_study", FIRST_YEAR.valueDescriptor, THIRD_YEAR.valueDescriptor)
101-
)
102-
}
54+
fun <T : Any> customErrorMessage(fieldName: String, value1: T, value2: T, type: String) =
55+
assertCustomMessage(fieldName, value1, value2, type)
10356
}
10457

105-
private fun <T : Any> assertDefaultMessage(fieldName: String, value1: T, value2: T) {
58+
private fun <T : Any> assertDefaultMessage(fieldName: String, value1: T, value2: T, type: String) {
10659
val builder = StudentDefaultMessage.newBuilder()
107-
val expectedParams = listOf(fieldName, "$value1", "$value2")
60+
val descriptor = StudentDefaultMessage.getDescriptor()
61+
val expectedParams = listOf(descriptor.fullName, fieldName, type, "$value1", "$value2")
10862
val expectedFormat = { _: Int -> DEFAULT_MESSAGE_FORMAT }
10963
return builder.assertErrorMessage(fieldName, value1, value2, expectedParams, expectedFormat)
11064
}
11165

112-
private fun <T : Any> assertCustomMessage(fieldName: String, value1: T, value2: T) {
66+
private fun <T : Any> assertCustomMessage(fieldName: String, value1: T, value2: T, type: String) {
11367
val builder = StudentCustomMessage.newBuilder()
114-
val expectedParams = listOf("$value1", fieldName, "$value2")
68+
val expectedParams = listOf("$value1", fieldName, "$value2", type)
11569
val expectedFormat = ::customMessageFormat
11670
return builder.assertErrorMessage(fieldName, value1, value2, expectedParams, expectedFormat)
11771
}
@@ -121,7 +75,7 @@ private fun <T : Any> assertCustomMessage(fieldName: String, value1: T, value2:
12175
* the expected parameters when [fieldName] is set twice.
12276
*
12377
* Notice on enum fields: we have to pass enums as value descriptors
124-
* (see [SetOnceErrorMessageITest.allFieldTypesWithTwoDistinctValues]),
78+
* (see [io.spine.test.options.setonce.given.SetOnceErrorMessageTestEnv.allFieldTypesWithTwoDistinctValues]),
12579
* so we also have to take this into account during assertions because
12680
* in `ConstraintViolation` they still arrive as Java enum constants.
12781
*
@@ -166,7 +120,7 @@ private fun <T : Any> Builder.assertErrorMessage(
166120
}
167121

168122
private const val DEFAULT_MESSAGE_FORMAT =
169-
"The field `%s` already has the value `%s` and cannot be reassigned to `%s`."
123+
"The field `%s.%s` of the type `%s` already has the value `%s` and cannot be reassigned to `%s`."
170124

171125
private fun customMessageFormat(fieldNumber: Int) =
172-
"Field_$fieldNumber: `%s`, `%s`, `%s`."
126+
"Field_$fieldNumber: `%s`, `%s`, `%s`, `%s`."

java-tests/validating/src/test/kotlin/io/spine/test/options/setonce/SetOnceFieldsITest.kt

+14-14
Original file line numberDiff line numberDiff line change
@@ -27,20 +27,20 @@
2727
package io.spine.test.options.setonce
2828

2929
import com.google.protobuf.ByteString.copyFromUtf8
30-
import io.spine.test.options.setonce.TestEnv.DONALD
31-
import io.spine.test.options.setonce.TestEnv.EIGHTY_KG
32-
import io.spine.test.options.setonce.TestEnv.FIFTY_KG
33-
import io.spine.test.options.setonce.TestEnv.FIRST_YEAR
34-
import io.spine.test.options.setonce.TestEnv.CERT1
35-
import io.spine.test.options.setonce.TestEnv.JACK
36-
import io.spine.test.options.setonce.TestEnv.TALL_HEIGHT
37-
import io.spine.test.options.setonce.TestEnv.SHORT_HEIGHT
38-
import io.spine.test.options.setonce.TestEnv.NO
39-
import io.spine.test.options.setonce.TestEnv.CERT2
40-
import io.spine.test.options.setonce.TestEnv.STUDENT1
41-
import io.spine.test.options.setonce.TestEnv.STUDENT2
42-
import io.spine.test.options.setonce.TestEnv.THIRD_YEAR
43-
import io.spine.test.options.setonce.TestEnv.YES
30+
import io.spine.test.options.setonce.given.TestEnv.DONALD
31+
import io.spine.test.options.setonce.given.TestEnv.EIGHTY_KG
32+
import io.spine.test.options.setonce.given.TestEnv.FIFTY_KG
33+
import io.spine.test.options.setonce.given.TestEnv.FIRST_YEAR
34+
import io.spine.test.options.setonce.given.TestEnv.CERT1
35+
import io.spine.test.options.setonce.given.TestEnv.JACK
36+
import io.spine.test.options.setonce.given.TestEnv.TALL_HEIGHT
37+
import io.spine.test.options.setonce.given.TestEnv.SHORT_HEIGHT
38+
import io.spine.test.options.setonce.given.TestEnv.NO
39+
import io.spine.test.options.setonce.given.TestEnv.CERT2
40+
import io.spine.test.options.setonce.given.TestEnv.STUDENT1
41+
import io.spine.test.options.setonce.given.TestEnv.STUDENT2
42+
import io.spine.test.options.setonce.given.TestEnv.THIRD_YEAR
43+
import io.spine.test.options.setonce.given.TestEnv.YES
4444
import io.spine.test.tools.validate.StudentSetOnce
4545
import io.spine.test.tools.validate.studentSetOnce
4646
import io.spine.validation.assertions.assertValidationFails

java-tests/validating/src/test/kotlin/io/spine/test/options/setonce/SetOnceITest.kt

+18-18
Original file line numberDiff line numberDiff line change
@@ -26,24 +26,24 @@
2626

2727
package io.spine.test.options.setonce
2828

29-
import io.spine.test.options.setonce.TestEnv.CERT1
30-
import io.spine.test.options.setonce.TestEnv.CERT2
31-
import io.spine.test.options.setonce.TestEnv.DONALD
32-
import io.spine.test.options.setonce.TestEnv.TWENTY
33-
import io.spine.test.options.setonce.TestEnv.SEVENTY
34-
import io.spine.test.options.setonce.TestEnv.EIGHTY_KG
35-
import io.spine.test.options.setonce.TestEnv.FIFTY_KG
36-
import io.spine.test.options.setonce.TestEnv.FIRST_YEAR
37-
import io.spine.test.options.setonce.TestEnv.JACK
38-
import io.spine.test.options.setonce.TestEnv.NO
39-
import io.spine.test.options.setonce.TestEnv.SHORT_HEIGHT
40-
import io.spine.test.options.setonce.TestEnv.TWO
41-
import io.spine.test.options.setonce.TestEnv.EIGHT
42-
import io.spine.test.options.setonce.TestEnv.STUDENT1
43-
import io.spine.test.options.setonce.TestEnv.STUDENT2
44-
import io.spine.test.options.setonce.TestEnv.TALL_HEIGHT
45-
import io.spine.test.options.setonce.TestEnv.THIRD_YEAR
46-
import io.spine.test.options.setonce.TestEnv.YES
29+
import io.spine.test.options.setonce.given.TestEnv.CERT1
30+
import io.spine.test.options.setonce.given.TestEnv.CERT2
31+
import io.spine.test.options.setonce.given.TestEnv.DONALD
32+
import io.spine.test.options.setonce.given.TestEnv.TWENTY
33+
import io.spine.test.options.setonce.given.TestEnv.SEVENTY
34+
import io.spine.test.options.setonce.given.TestEnv.EIGHTY_KG
35+
import io.spine.test.options.setonce.given.TestEnv.FIFTY_KG
36+
import io.spine.test.options.setonce.given.TestEnv.FIRST_YEAR
37+
import io.spine.test.options.setonce.given.TestEnv.JACK
38+
import io.spine.test.options.setonce.given.TestEnv.NO
39+
import io.spine.test.options.setonce.given.TestEnv.SHORT_HEIGHT
40+
import io.spine.test.options.setonce.given.TestEnv.TWO
41+
import io.spine.test.options.setonce.given.TestEnv.EIGHT
42+
import io.spine.test.options.setonce.given.TestEnv.STUDENT1
43+
import io.spine.test.options.setonce.given.TestEnv.STUDENT2
44+
import io.spine.test.options.setonce.given.TestEnv.TALL_HEIGHT
45+
import io.spine.test.options.setonce.given.TestEnv.THIRD_YEAR
46+
import io.spine.test.options.setonce.given.TestEnv.YES
4747
import io.spine.test.tools.validate.studentSetOnceFalse
4848
import io.spine.test.tools.validate.studentUnconstrained
4949
import io.spine.validation.assertions.assertValidationPasses

java-tests/validating/src/test/kotlin/io/spine/test/options/setonce/SetOnceIntegerITest.kt

+4-4
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@
2626

2727
package io.spine.test.options.setonce
2828

29-
import io.spine.test.options.setonce.TestEnv.TWENTY
30-
import io.spine.test.options.setonce.TestEnv.SEVENTY
31-
import io.spine.test.options.setonce.TestEnv.TWO
32-
import io.spine.test.options.setonce.TestEnv.EIGHT
29+
import io.spine.test.options.setonce.given.TestEnv.TWENTY
30+
import io.spine.test.options.setonce.given.TestEnv.SEVENTY
31+
import io.spine.test.options.setonce.given.TestEnv.TWO
32+
import io.spine.test.options.setonce.given.TestEnv.EIGHT
3333
import io.spine.test.tools.validate.StudentSetOnce
3434
import io.spine.test.tools.validate.studentSetOnce
3535
import io.spine.validation.assertions.assertValidationFails
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
/*
2+
* Copyright 2024, TeamDev. All rights reserved.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Redistribution and use in source and/or binary forms, with or without
11+
* modification, must retain the above copyright notice and the following
12+
* disclaimer.
13+
*
14+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
15+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
16+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
17+
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
18+
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
19+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
20+
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25+
*/
26+
27+
package io.spine.test.options.setonce.given
28+
29+
import io.spine.test.tools.validate.Name
30+
import io.spine.test.tools.validate.YearOfStudy
31+
import org.junit.jupiter.api.Named.named
32+
import org.junit.jupiter.params.provider.Arguments.arguments
33+
34+
/**
35+
* Provides data for parametrized [io.spine.test.options.setonce.SetOnceErrorMessageITest].
36+
*/
37+
internal object SetOnceErrorMessageTestEnv {
38+
39+
@JvmStatic
40+
fun allFieldTypesWithTwoDistinctValues() = listOf(
41+
// For some reason, for enums, `Message.Builder.setField()` expects value
42+
// descriptors instead of constants or their ordinal numbers.
43+
arguments(
44+
named("enum", "year_of_study"),
45+
TestEnv.FIRST_YEAR.valueDescriptor, TestEnv.THIRD_YEAR.valueDescriptor,
46+
YearOfStudy.getDescriptor().fullName // Expected a specific enum type.
47+
),
48+
arguments(
49+
named("message", "name"),
50+
TestEnv.JACK, TestEnv.DONALD,
51+
Name.getDescriptor().fullName // Expected a specific message type.
52+
)
53+
) + primitiveFieldTypesWithTwoDistinctValues().map {
54+
arguments(named(it.type, it.field), it.value1, it.value2, it.type)
55+
}
56+
57+
private fun primitiveFieldTypesWithTwoDistinctValues() = listOf(
58+
Primitive("double", "height", TestEnv.SHORT_HEIGHT, TestEnv.TALL_HEIGHT),
59+
Primitive("float", "weight", TestEnv.FIFTY_KG, TestEnv.EIGHTY_KG),
60+
Primitive("int32", "cash_USD", TestEnv.TWO, TestEnv.EIGHT),
61+
Primitive("int64", "cash_EUR", TestEnv.TWENTY, TestEnv.SEVENTY),
62+
Primitive("uint32", "cash_JPY", TestEnv.TWO, TestEnv.EIGHT),
63+
Primitive("uint64", "cash_GBP", TestEnv.TWENTY, TestEnv.SEVENTY),
64+
Primitive("sint32", "cash_AUD", TestEnv.TWO, TestEnv.EIGHT),
65+
Primitive("sint64", "cash_CAD", TestEnv.TWENTY, TestEnv.SEVENTY),
66+
Primitive("fixed32", "cash_CHF", TestEnv.TWO, TestEnv.EIGHT),
67+
Primitive("fixed64", "cash_CNY", TestEnv.TWENTY, TestEnv.SEVENTY),
68+
Primitive("sfixed32", "cash_PLN", TestEnv.TWO, TestEnv.EIGHT),
69+
Primitive("sfixed64", "cash_NZD", TestEnv.TWENTY, TestEnv.SEVENTY),
70+
Primitive("bool", "has_medals", TestEnv.YES, TestEnv.NO),
71+
Primitive("bytes", "signature", TestEnv.CERT1, TestEnv.CERT2),
72+
)
73+
}
74+
75+
private class Primitive(
76+
val type: String,
77+
val field: String,
78+
val value1: Any,
79+
val value2: Any,
80+
)

java-tests/validating/src/test/kotlin/io/spine/test/options/setonce/TestEnv.kt java-tests/validating/src/test/kotlin/io/spine/test/options/setonce/given/TestEnv.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2525
*/
2626

27-
package io.spine.test.options.setonce
27+
package io.spine.test.options.setonce.given
2828

2929
import com.google.protobuf.ByteString
3030
import io.spine.test.tools.validate.Name

0 commit comments

Comments
 (0)