Skip to content

Commit abfc72b

Browse files
committed
Add locale conversion format configuration property
1 parent 59141b9 commit abfc72b

File tree

9 files changed

+125
-4
lines changed

9 files changed

+125
-4
lines changed

Diff for: junit-jupiter-engine/junit-jupiter-engine.gradle.kts

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ dependencies {
1313
api(platform(projects.junitBom))
1414
api(projects.junitPlatformEngine)
1515
api(projects.junitJupiterApi)
16+
api(projects.junitJupiterParams)
1617

1718
compileOnlyApi(libs.apiguardian)
1819

Diff for: junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/config/CachingJupiterConfiguration.java

+7
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.junit.jupiter.api.io.CleanupMode;
3030
import org.junit.jupiter.api.io.TempDirFactory;
3131
import org.junit.jupiter.api.parallel.ExecutionMode;
32+
import org.junit.jupiter.params.converter.LocaleConversionFormat;
3233

3334
/**
3435
* Caching implementation of the {@link JupiterConfiguration} API.
@@ -125,4 +126,10 @@ public Supplier<TempDirFactory> getDefaultTempDirFactorySupplier() {
125126
key -> delegate.getDefaultTempDirFactorySupplier());
126127
}
127128

129+
@Override
130+
public LocaleConversionFormat getDefaultLocaleConversionFormat() {
131+
return (LocaleConversionFormat) cache.computeIfAbsent(DEFAULT_LOCALE_CONVERSION_FORMAT_PROPERTY_NAME,
132+
key -> delegate.getDefaultLocaleConversionFormat());
133+
}
134+
128135
}

Diff for: junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/config/DefaultJupiterConfiguration.java

+11
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import static org.junit.jupiter.api.io.CleanupMode.ALWAYS;
1515
import static org.junit.jupiter.api.io.TempDir.DEFAULT_CLEANUP_MODE_PROPERTY_NAME;
1616
import static org.junit.jupiter.api.io.TempDir.DEFAULT_FACTORY_PROPERTY_NAME;
17+
import static org.junit.jupiter.params.converter.LocaleConversionFormat.ISO_639;
1718

1819
import java.util.Optional;
1920
import java.util.function.Function;
@@ -29,6 +30,7 @@
2930
import org.junit.jupiter.api.io.CleanupMode;
3031
import org.junit.jupiter.api.io.TempDirFactory;
3132
import org.junit.jupiter.api.parallel.ExecutionMode;
33+
import org.junit.jupiter.params.converter.LocaleConversionFormat;
3234
import org.junit.platform.commons.util.ClassNamePatternFilterUtils;
3335
import org.junit.platform.commons.util.Preconditions;
3436
import org.junit.platform.engine.ConfigurationParameters;
@@ -62,6 +64,9 @@ public class DefaultJupiterConfiguration implements JupiterConfiguration {
6264
private static final InstantiatingConfigurationParameterConverter<TempDirFactory> tempDirFactoryConverter = //
6365
new InstantiatingConfigurationParameterConverter<>(TempDirFactory.class, "temp dir factory");
6466

67+
private static final EnumConfigurationParameterConverter<LocaleConversionFormat> localeConversionFormatConverter = //
68+
new EnumConfigurationParameterConverter<>(LocaleConversionFormat.class, "locale conversion format");
69+
6570
private final ConfigurationParameters configurationParameters;
6671

6772
public DefaultJupiterConfiguration(ConfigurationParameters configurationParameters) {
@@ -141,4 +146,10 @@ public Supplier<TempDirFactory> getDefaultTempDirFactorySupplier() {
141146
return () -> supplier.get().orElse(TempDirFactory.Standard.INSTANCE);
142147
}
143148

149+
@Override
150+
public LocaleConversionFormat getDefaultLocaleConversionFormat() {
151+
return localeConversionFormatConverter.get(configurationParameters,
152+
DEFAULT_LOCALE_CONVERSION_FORMAT_PROPERTY_NAME, ISO_639);
153+
}
154+
144155
}

Diff for: junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/config/JupiterConfiguration.java

+4
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.junit.jupiter.api.io.TempDirFactory;
2828
import org.junit.jupiter.api.parallel.Execution;
2929
import org.junit.jupiter.api.parallel.ExecutionMode;
30+
import org.junit.jupiter.params.converter.LocaleConversionFormat;
3031

3132
/**
3233
* @since 5.4
@@ -43,6 +44,7 @@ public interface JupiterConfiguration {
4344
String DEFAULT_DISPLAY_NAME_GENERATOR_PROPERTY_NAME = DisplayNameGenerator.DEFAULT_GENERATOR_PROPERTY_NAME;
4445
String DEFAULT_TEST_METHOD_ORDER_PROPERTY_NAME = MethodOrderer.DEFAULT_ORDER_PROPERTY_NAME;
4546
String DEFAULT_TEST_CLASS_ORDER_PROPERTY_NAME = ClassOrderer.DEFAULT_ORDER_PROPERTY_NAME;
47+
String DEFAULT_LOCALE_CONVERSION_FORMAT_PROPERTY_NAME = "junit.jupiter.params.arguments.conversion.locale.format";
4648

4749
Optional<String> getRawConfigurationParameter(String key);
4850

@@ -70,4 +72,6 @@ public interface JupiterConfiguration {
7072

7173
Supplier<TempDirFactory> getDefaultTempDirFactorySupplier();
7274

75+
LocaleConversionFormat getDefaultLocaleConversionFormat();
76+
7377
}

Diff for: junit-jupiter-engine/src/module/org.junit.jupiter.engine/module-info.java

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
module org.junit.jupiter.engine {
2121
requires static org.apiguardian.api;
2222
requires org.junit.jupiter.api;
23+
requires org.junit.jupiter.params.converter;
2324
requires org.junit.platform.commons;
2425
requires org.junit.platform.engine;
2526
requires org.opentest4j;

Diff for: junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/config/CachingJupiterConfigurationTests.java

+16-4
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
import static org.assertj.core.api.Assertions.assertThat;
1414
import static org.junit.jupiter.api.io.CleanupMode.NEVER;
15+
import static org.junit.jupiter.params.converter.LocaleConversionFormat.ISO_639;
1516
import static org.mockito.Mockito.mock;
1617
import static org.mockito.Mockito.only;
1718
import static org.mockito.Mockito.times;
@@ -95,7 +96,7 @@ void cachesDefaultDisplayNameGenerator() {
9596
CustomDisplayNameGenerator customDisplayNameGenerator = new CustomDisplayNameGenerator();
9697
when(delegate.getDefaultDisplayNameGenerator()).thenReturn(customDisplayNameGenerator);
9798

98-
// call `cache.getDefaultDisplayNameGenerator()` twice to verify the delegate method is called only once.
99+
// call twice to verify the delegate method is called only once.
99100
assertThat(cache.getDefaultDisplayNameGenerator()).isSameAs(customDisplayNameGenerator);
100101
assertThat(cache.getDefaultDisplayNameGenerator()).isSameAs(customDisplayNameGenerator);
101102

@@ -107,7 +108,7 @@ void cachesDefaultTestMethodOrderer() {
107108
final Optional<MethodOrderer> methodOrderer = Optional.of(new MethodOrderer.MethodName());
108109
when(delegate.getDefaultTestMethodOrderer()).thenReturn(methodOrderer);
109110

110-
// call `cache.getDefaultTestMethodOrderer()` twice to verify the delegate method is called only once.
111+
// call twice to verify the delegate method is called only once.
111112
assertThat(cache.getDefaultTestMethodOrderer()).isSameAs(methodOrderer);
112113
assertThat(cache.getDefaultTestMethodOrderer()).isSameAs(methodOrderer);
113114

@@ -118,7 +119,7 @@ void cachesDefaultTestMethodOrderer() {
118119
void cachesDefaultTempDirCleanupMode() {
119120
when(delegate.getDefaultTempDirCleanupMode()).thenReturn(NEVER);
120121

121-
// call `cache.getDefaultTempStrategyDirCleanupMode()` twice to verify the delegate method is called only once.
122+
// call twice to verify the delegate method is called only once.
122123
assertThat(cache.getDefaultTempDirCleanupMode()).isSameAs(NEVER);
123124
assertThat(cache.getDefaultTempDirCleanupMode()).isSameAs(NEVER);
124125

@@ -130,13 +131,24 @@ void cachesDefaultTempDirFactorySupplier() {
130131
Supplier<TempDirFactory> supplier = mock();
131132
when(delegate.getDefaultTempDirFactorySupplier()).thenReturn(supplier);
132133

133-
// call `cache.getDefaultTempDirFactorySupplier()` twice to verify the delegate method is called only once.
134+
// call twice to verify the delegate method is called only once.
134135
assertThat(cache.getDefaultTempDirFactorySupplier()).isSameAs(supplier);
135136
assertThat(cache.getDefaultTempDirFactorySupplier()).isSameAs(supplier);
136137

137138
verify(delegate, only()).getDefaultTempDirFactorySupplier();
138139
}
139140

141+
@Test
142+
void cachesDefaultLocaleConversionFormat() {
143+
when(delegate.getDefaultLocaleConversionFormat()).thenReturn(ISO_639);
144+
145+
// call twice to verify the delegate method is called only once.
146+
assertThat(cache.getDefaultLocaleConversionFormat()).isSameAs(ISO_639);
147+
assertThat(cache.getDefaultLocaleConversionFormat()).isSameAs(ISO_639);
148+
149+
verify(delegate, only()).getDefaultLocaleConversionFormat();
150+
}
151+
140152
@Test
141153
void doesNotCacheRawParameters() {
142154
when(delegate.getRawConfigurationParameter("foo")).thenReturn(Optional.of("bar")).thenReturn(

Diff for: junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/config/DefaultJupiterConfigurationTests.java

+9
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import static org.junit.jupiter.api.TestInstance.Lifecycle.PER_METHOD;
1818
import static org.junit.jupiter.api.io.CleanupMode.ALWAYS;
1919
import static org.junit.jupiter.engine.Constants.DEFAULT_TEST_INSTANCE_LIFECYCLE_PROPERTY_NAME;
20+
import static org.junit.jupiter.params.converter.LocaleConversionFormat.ISO_639;
2021
import static org.mockito.Mockito.mock;
2122
import static org.mockito.Mockito.when;
2223

@@ -34,6 +35,7 @@
3435
import org.junit.jupiter.api.io.TempDirFactory;
3536
import org.junit.jupiter.engine.Constants;
3637
import org.junit.jupiter.engine.descriptor.CustomDisplayNameGenerator;
38+
import org.junit.jupiter.params.converter.LocaleConversionFormat;
3739
import org.junit.platform.commons.PreconditionViolationException;
3840
import org.junit.platform.engine.ConfigurationParameters;
3941

@@ -145,6 +147,13 @@ void shouldGetStandardAsDefaultTempDirFactorySupplierWithoutConfigParamSet() {
145147
assertThat(supplier.get()).isSameAs(TempDirFactory.Standard.INSTANCE);
146148
}
147149

150+
@Test
151+
void shouldGetDefaultLocaleConversionFormatWithNoConfigParamSet() {
152+
JupiterConfiguration configuration = new DefaultJupiterConfiguration(mock());
153+
LocaleConversionFormat localeConversionFormat = configuration.getDefaultLocaleConversionFormat();
154+
assertThat(localeConversionFormat).isEqualTo(ISO_639);
155+
}
156+
148157
private void assertDefaultConfigParam(String configValue, Lifecycle expected) {
149158
ConfigurationParameters configParams = mock();
150159
when(configParams.get(KEY)).thenReturn(Optional.ofNullable(configValue));
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/*
2+
* Copyright 2015-2023 the original author or authors.
3+
*
4+
* All rights reserved. This program and the accompanying materials are
5+
* made available under the terms of the Eclipse Public License v2.0 which
6+
* accompanies this distribution and is available at
7+
*
8+
* https://www.eclipse.org/legal/epl-v20.html
9+
*/
10+
11+
package org.junit.jupiter.params.converter;
12+
13+
import static org.apiguardian.api.API.Status.INTERNAL;
14+
15+
import org.apiguardian.api.API;
16+
17+
/**
18+
* Enumeration of {@link java.util.Locale} conversion formats.
19+
*
20+
* @since 5.11
21+
*/
22+
@API(status = INTERNAL, since = "5.11")
23+
public enum LocaleConversionFormat {
24+
25+
/**
26+
* The ISO 639 alpha-2 or alpha-3 language code format.
27+
*
28+
* @see java.util.Locale#Locale(String)
29+
*/
30+
ISO_639,
31+
32+
/**
33+
* The IETF BCP 47 language tag format.
34+
*
35+
* @see java.util.Locale#forLanguageTag(String)
36+
*/
37+
BCP_47
38+
39+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*
2+
* Copyright 2015-2023 the original author or authors.
3+
*
4+
* All rights reserved. This program and the accompanying materials are
5+
* made available under the terms of the Eclipse Public License v2.0 which
6+
* accompanies this distribution and is available at
7+
*
8+
* https://www.eclipse.org/legal/epl-v20.html
9+
*/
10+
11+
package org.junit.jupiter.params.converter;
12+
13+
import java.util.Locale;
14+
import java.util.function.Function;
15+
16+
import org.junit.platform.commons.util.Preconditions;
17+
18+
class StringToLocaleConverter implements StringToObjectConverter {
19+
20+
private final Function<String, Locale> converter;
21+
22+
StringToLocaleConverter(LocaleConversionFormat format) {
23+
Preconditions.notNull(format, "format must not be null");
24+
this.converter = format == LocaleConversionFormat.ISO_639 ? Locale::new : Locale::forLanguageTag;
25+
}
26+
27+
@Override
28+
public boolean canConvert(Class<?> targetType) {
29+
return targetType == Locale.class;
30+
}
31+
32+
@Override
33+
public Object convert(String source, Class<?> targetType) {
34+
return converter.apply(source);
35+
}
36+
37+
}

0 commit comments

Comments
 (0)