From 7608000c90cf14fe5d637dd3b1ab68a8179e3471 Mon Sep 17 00:00:00 2001 From: Issam El-atif Date: Wed, 3 Dec 2025 21:59:56 +0100 Subject: [PATCH 1/4] Reduce duplication between code and snippet generation Fixes #3063 --- .../codegen/GherkinKeywordNormalizer.java | 63 +++++++++++++++++++ .../core/snippets/SnippetGenerator.java | 50 +-------------- .../src/codegen/java/GenerateI18n.java | 46 ++------------ .../src/codegen/java/GenerateI18n.java | 45 ++----------- 4 files changed, 75 insertions(+), 129 deletions(-) create mode 100644 cucumber-core/src/main/java/io/cucumber/core/codegen/GherkinKeywordNormalizer.java diff --git a/cucumber-core/src/main/java/io/cucumber/core/codegen/GherkinKeywordNormalizer.java b/cucumber-core/src/main/java/io/cucumber/core/codegen/GherkinKeywordNormalizer.java new file mode 100644 index 0000000000..15a0fffcc4 --- /dev/null +++ b/cucumber-core/src/main/java/io/cucumber/core/codegen/GherkinKeywordNormalizer.java @@ -0,0 +1,63 @@ +package io.cucumber.core.codegen; + +import io.cucumber.gherkin.GherkinDialect; + +import java.text.Normalizer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.IntStream; + +import static java.util.stream.Collectors.joining; + +public class GherkinKeywordNormalizer { + + private GherkinKeywordNormalizer() { + } + + public static String normalizeKeyword(String language, String keyword) { + // Exception: Use the symbol names for the Emoj language. + // Emoji are not legal identifiers in Java. + if ("em".equals(language)) { + return normalizeEmojiKeyword(keyword); + } + return normalizeKeyword(keyword); + } + + public static String normalizeLanguage(GherkinDialect dialect) { + return dialect.getLanguage().replaceAll("[\\s-]", "_").toLowerCase(); + } + + public static String capitalize(String str) { + return str.substring(0, 1).toUpperCase() + str.substring(1); + } + + private static String normalizeKeyword(String keyword) { + return normalize(keyword.replaceAll("[\\s',!\u00AD’]", "")); + } + + private static String normalizeEmojiKeyword(String keyword) { + String titleCasedName = getCodePoints(keyword).mapToObj(Character::getName) + .map(s -> s.split(" ")) + .flatMap(Arrays::stream) + .map(String::toLowerCase) + .map(GherkinKeywordNormalizer::capitalize) + .collect(joining(" ")); + return normalizeKeyword(titleCasedName); + } + + private static String normalize(CharSequence s) { + return Normalizer.normalize(s, Normalizer.Form.NFC); + } + + private static IntStream getCodePoints(String s) { + int length = s.length(); + List codePoints = new ArrayList<>(); + for (int offset = 0; offset < length;) { + int codepoint = s.codePointAt(offset); + codePoints.add(codepoint); + offset += Character.charCount(codepoint); + } + return codePoints.stream().mapToInt(value -> value); + } +} diff --git a/cucumber-core/src/main/java/io/cucumber/core/snippets/SnippetGenerator.java b/cucumber-core/src/main/java/io/cucumber/core/snippets/SnippetGenerator.java index 536731968f..03fa9d7976 100644 --- a/cucumber-core/src/main/java/io/cucumber/core/snippets/SnippetGenerator.java +++ b/cucumber-core/src/main/java/io/cucumber/core/snippets/SnippetGenerator.java @@ -12,20 +12,16 @@ import io.cucumber.plugin.event.StepArgument; import java.lang.reflect.Type; -import java.text.Normalizer; -import java.util.ArrayList; -import java.util.Arrays; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.regex.Pattern; import java.util.stream.Collectors; -import java.util.stream.IntStream; import java.util.stream.Stream; +import static io.cucumber.core.codegen.GherkinKeywordNormalizer.normalizeKeyword; import static io.cucumber.core.snippets.SnippetType.CAMELCASE; -import static java.util.stream.Collectors.joining; public final class SnippetGenerator { @@ -72,7 +68,7 @@ private String createSnippet( List parameterNames = toParameterNames(expression, parameterNameGenerator); Map arguments = arguments(step, parameterNames, expression.getParameterTypes()); return snippet.template().format(new String[] { - getNormalizedKeyWord(language, keyword), + normalizeKeyword(language, keyword), snippet.escapePattern(source), functionName, snippet.arguments(arguments), @@ -88,48 +84,6 @@ private List toParameterNames(GeneratedExpression expression, Identifier .collect(Collectors.toList()); } - private static String capitalize(String str) { - return str.substring(0, 1).toUpperCase() + str.substring(1); - } - - private static String getNormalizedKeyWord(String language, String keyword) { - // Exception: Use the symbol names for the Emoj language. - // Emoji are not legal identifiers in Java. - if ("em".equals(language)) { - return getNormalizedEmojiKeyWord(keyword); - } - return getNormalizedKeyWord(keyword); - } - - private static String getNormalizedEmojiKeyWord(String keyword) { - String titleCasedName = getCodePoints(keyword).mapToObj(Character::getName) - .map(s -> s.split(" ")) - .flatMap(Arrays::stream) - .map(String::toLowerCase) - .map(SnippetGenerator::capitalize) - .collect(joining(" ")); - return getNormalizedKeyWord(titleCasedName); - } - - private static IntStream getCodePoints(String s) { - int length = s.length(); - List codePoints = new ArrayList<>(); - for (int offset = 0; offset < length;) { - int codepoint = s.codePointAt(offset); - codePoints.add(codepoint); - offset += Character.charCount(codepoint); - } - return codePoints.stream().mapToInt(value -> value); - } - - private static String getNormalizedKeyWord(String keyword) { - return normalize(keyword.replaceAll("[\\s',!\u00AD’]", "")); - } - - static String normalize(CharSequence s) { - return Normalizer.normalize(s, Normalizer.Form.NFC); - } - private String functionName(String sentence, IdentifierGenerator functionNameGenerator) { String functionName = Stream.of(sentence) .map(DEFAULT_ARGUMENT_PATTERN::replaceMatchesWithSpace) diff --git a/cucumber-java/src/codegen/java/GenerateI18n.java b/cucumber-java/src/codegen/java/GenerateI18n.java index 2cf7e1adb8..5a649e3cf9 100644 --- a/cucumber-java/src/codegen/java/GenerateI18n.java +++ b/cucumber-java/src/codegen/java/GenerateI18n.java @@ -9,18 +9,17 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.text.Normalizer; -import java.util.Arrays; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; import java.util.Map; +import static io.cucumber.core.codegen.GherkinKeywordNormalizer.normalizeKeyword; +import static io.cucumber.core.codegen.GherkinKeywordNormalizer.normalizeLanguage; import static java.nio.file.Files.newBufferedWriter; import static java.nio.file.StandardOpenOption.CREATE; import static java.nio.file.StandardOpenOption.TRUNCATE_EXISTING; -import static java.util.stream.Collectors.joining; /* This class generates the cucumber-java Interfaces and package-info * based on the languages and keywords from the GherkinDialects @@ -79,8 +78,8 @@ private void writeKeyWordAnnotations(GherkinDialect dialect) { } private void writeKeyWordAnnotation(GherkinDialect dialect, String keyword) { - String normalizedLanguage = getNormalizedLanguage(dialect); - String normalizedKeyword = getNormalizedKeyWord(dialect, keyword); + String normalizedLanguage = normalizeLanguage(dialect); + String normalizedKeyword = normalizeKeyword(dialect.getLanguage(), keyword); Map binding = new LinkedHashMap<>(); binding.put("lang", normalizedLanguage); @@ -103,39 +102,8 @@ private void writeKeyWordAnnotation(GherkinDialect dialect, String keyword) { } } - private static String capitalize(String s) { - return s.substring(0, 1).toUpperCase() + s.substring(1); - } - - private static String getNormalizedKeyWord(GherkinDialect dialect, String keyword) { - // Exception: Use the symbol names for the Emoj language. - // Emoji are not legal identifiers in Java. - if (dialect.getLanguage().equals("em")) { - return getNormalizedEmojiKeyWord(keyword); - } - return getNormalizedKeyWord(keyword); - } - - private static String getNormalizedEmojiKeyWord(String keyword) { - String titleCasedName = keyword.codePoints().mapToObj(Character::getName) - .map(s -> s.split(" ")) - .flatMap(Arrays::stream) - .map(String::toLowerCase) - .map(DialectWriter::capitalize) - .collect(joining(" ")); - return getNormalizedKeyWord(titleCasedName); - } - - private static String getNormalizedKeyWord(String keyword) { - return normalize(keyword.replaceAll("[\\s',!\u00AD’]", "")); - } - - private static String normalize(CharSequence s) { - return Normalizer.normalize(s, Normalizer.Form.NFC); - } - private void writePackageInfo(GherkinDialect dialect) { - String normalizedLanguage = getNormalizedLanguage(dialect); + String normalizedLanguage = normalizeLanguage(dialect); String languageName = dialect.getName(); if (!dialect.getName().equals(dialect.getNativeName())) { languageName += " - " + dialect.getNativeName(); @@ -155,9 +123,5 @@ private void writePackageInfo(GherkinDialect dialect) { } } - private static String getNormalizedLanguage(GherkinDialect dialect) { - return dialect.getLanguage().replaceAll("[\\s-]", "_").toLowerCase(); - } - } } diff --git a/cucumber-java8/src/codegen/java/GenerateI18n.java b/cucumber-java8/src/codegen/java/GenerateI18n.java index 547b21a1c4..17c8a235f6 100644 --- a/cucumber-java8/src/codegen/java/GenerateI18n.java +++ b/cucumber-java8/src/codegen/java/GenerateI18n.java @@ -9,18 +9,18 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.text.Normalizer; -import java.util.Arrays; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; import java.util.Map; +import static io.cucumber.core.codegen.GherkinKeywordNormalizer.capitalize; +import static io.cucumber.core.codegen.GherkinKeywordNormalizer.normalizeKeyword; +import static io.cucumber.core.codegen.GherkinKeywordNormalizer.normalizeLanguage; import static java.nio.file.Files.newBufferedWriter; import static java.nio.file.StandardOpenOption.CREATE; import static java.nio.file.StandardOpenOption.TRUNCATE_EXISTING; -import static java.util.stream.Collectors.joining; import static java.util.stream.Collectors.toList; /* This class generates the cucumber-java Interfaces and package-info @@ -69,7 +69,7 @@ void writeDialect(GherkinDialect dialect) { } private void writeInterface(GherkinDialect dialect) { - String normalizedLanguage = getNormalizedLanguage(dialect); + String normalizedLanguage = normalizeLanguage(dialect); String languageName = dialect.getName(); if (!dialect.getName().equals(dialect.getNativeName())) { languageName += " - " + dialect.getNativeName(); @@ -98,43 +98,8 @@ private static List extractKeywords(GherkinDialect dialect) { .filter(it -> !it.contains(String.valueOf('*'))) .filter(it -> !it.matches("^\\d.*")) .distinct() - .map(keyword -> getNormalizedKeyWord(dialect, keyword)) + .map(keyword -> normalizeKeyword(dialect.getLanguage(), keyword)) .collect(toList()); } - - private static String capitalize(String str) { - return str.substring(0, 1).toUpperCase() + str.substring(1); - } - - private static String getNormalizedKeyWord(GherkinDialect dialect, String keyword) { - // Exception: Use the symbol names for the Emoj language. - // Emoji are not legal identifiers in Java. - if (dialect.getLanguage().equals("em")) { - return getNormalizedEmojiKeyWord(keyword); - } - return getNormalizedKeyWord(keyword); - } - - private static String getNormalizedEmojiKeyWord(String keyword) { - String titleCasedName = keyword.codePoints().mapToObj(Character::getName) - .map(s -> s.split(" ")) - .flatMap(Arrays::stream) - .map(String::toLowerCase) - .map(DialectWriter::capitalize) - .collect(joining(" ")); - return getNormalizedKeyWord(titleCasedName); - } - - private static String getNormalizedKeyWord(String keyword) { - return normalize(keyword.replaceAll("[\\s',!\u00AD’]", "")); - } - - static String normalize(CharSequence s) { - return Normalizer.normalize(s, Normalizer.Form.NFC); - } - - private static String getNormalizedLanguage(GherkinDialect dialect) { - return dialect.getLanguage().replaceAll("[\\s-]", "_").toLowerCase(); - } } } From a93b16d6924eafbf9d14c9616e44e7fe942d7e83 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Mon, 8 Dec 2025 15:02:56 +0100 Subject: [PATCH 2/4] Resolve complaints from RevApi --- .../core/codegen/GherkinKeywordNormalizer.java | 10 ++++++---- cucumber-java/src/codegen/java/GenerateI18n.java | 4 ++-- cucumber-java8/src/codegen/java/GenerateI18n.java | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/cucumber-core/src/main/java/io/cucumber/core/codegen/GherkinKeywordNormalizer.java b/cucumber-core/src/main/java/io/cucumber/core/codegen/GherkinKeywordNormalizer.java index 15a0fffcc4..5b88d594d3 100644 --- a/cucumber-core/src/main/java/io/cucumber/core/codegen/GherkinKeywordNormalizer.java +++ b/cucumber-core/src/main/java/io/cucumber/core/codegen/GherkinKeywordNormalizer.java @@ -1,6 +1,6 @@ package io.cucumber.core.codegen; -import io.cucumber.gherkin.GherkinDialect; +import org.apiguardian.api.API; import java.text.Normalizer; import java.util.ArrayList; @@ -10,9 +10,11 @@ import static java.util.stream.Collectors.joining; -public class GherkinKeywordNormalizer { +@API(status = API.Status.INTERNAL) +public final class GherkinKeywordNormalizer { private GherkinKeywordNormalizer() { + /* no-op */ } public static String normalizeKeyword(String language, String keyword) { @@ -24,8 +26,8 @@ public static String normalizeKeyword(String language, String keyword) { return normalizeKeyword(keyword); } - public static String normalizeLanguage(GherkinDialect dialect) { - return dialect.getLanguage().replaceAll("[\\s-]", "_").toLowerCase(); + public static String normalizeLanguage(String language) { + return language.replaceAll("[\\s-]", "_").toLowerCase(); } public static String capitalize(String str) { diff --git a/cucumber-java/src/codegen/java/GenerateI18n.java b/cucumber-java/src/codegen/java/GenerateI18n.java index 5a649e3cf9..02bbabb672 100644 --- a/cucumber-java/src/codegen/java/GenerateI18n.java +++ b/cucumber-java/src/codegen/java/GenerateI18n.java @@ -78,7 +78,7 @@ private void writeKeyWordAnnotations(GherkinDialect dialect) { } private void writeKeyWordAnnotation(GherkinDialect dialect, String keyword) { - String normalizedLanguage = normalizeLanguage(dialect); + String normalizedLanguage = normalizeLanguage(dialect.getLanguage()); String normalizedKeyword = normalizeKeyword(dialect.getLanguage(), keyword); Map binding = new LinkedHashMap<>(); @@ -103,7 +103,7 @@ private void writeKeyWordAnnotation(GherkinDialect dialect, String keyword) { } private void writePackageInfo(GherkinDialect dialect) { - String normalizedLanguage = normalizeLanguage(dialect); + String normalizedLanguage = normalizeLanguage(dialect.getLanguage()); String languageName = dialect.getName(); if (!dialect.getName().equals(dialect.getNativeName())) { languageName += " - " + dialect.getNativeName(); diff --git a/cucumber-java8/src/codegen/java/GenerateI18n.java b/cucumber-java8/src/codegen/java/GenerateI18n.java index 17c8a235f6..8f90ef357b 100644 --- a/cucumber-java8/src/codegen/java/GenerateI18n.java +++ b/cucumber-java8/src/codegen/java/GenerateI18n.java @@ -69,7 +69,7 @@ void writeDialect(GherkinDialect dialect) { } private void writeInterface(GherkinDialect dialect) { - String normalizedLanguage = normalizeLanguage(dialect); + String normalizedLanguage = normalizeLanguage(dialect.getLanguage()); String languageName = dialect.getName(); if (!dialect.getName().equals(dialect.getNativeName())) { languageName += " - " + dialect.getNativeName(); From 99b68f0f8e6f32af44c0a1472d4897726978652c Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Mon, 8 Dec 2025 15:13:01 +0100 Subject: [PATCH 3/4] Move GherkinKeywordNormalizer to snippets package --- .../{codegen => snippets}/GherkinKeywordNormalizer.java | 2 +- .../java/io/cucumber/core/snippets/SnippetGenerator.java | 2 +- cucumber-java/src/codegen/java/GenerateI18n.java | 4 ++-- cucumber-java8/src/codegen/java/GenerateI18n.java | 6 +++--- 4 files changed, 7 insertions(+), 7 deletions(-) rename cucumber-core/src/main/java/io/cucumber/core/{codegen => snippets}/GherkinKeywordNormalizer.java (98%) diff --git a/cucumber-core/src/main/java/io/cucumber/core/codegen/GherkinKeywordNormalizer.java b/cucumber-core/src/main/java/io/cucumber/core/snippets/GherkinKeywordNormalizer.java similarity index 98% rename from cucumber-core/src/main/java/io/cucumber/core/codegen/GherkinKeywordNormalizer.java rename to cucumber-core/src/main/java/io/cucumber/core/snippets/GherkinKeywordNormalizer.java index 5b88d594d3..85143ecc88 100644 --- a/cucumber-core/src/main/java/io/cucumber/core/codegen/GherkinKeywordNormalizer.java +++ b/cucumber-core/src/main/java/io/cucumber/core/snippets/GherkinKeywordNormalizer.java @@ -1,4 +1,4 @@ -package io.cucumber.core.codegen; +package io.cucumber.core.snippets; import org.apiguardian.api.API; diff --git a/cucumber-core/src/main/java/io/cucumber/core/snippets/SnippetGenerator.java b/cucumber-core/src/main/java/io/cucumber/core/snippets/SnippetGenerator.java index 03fa9d7976..d4e9ed3176 100644 --- a/cucumber-core/src/main/java/io/cucumber/core/snippets/SnippetGenerator.java +++ b/cucumber-core/src/main/java/io/cucumber/core/snippets/SnippetGenerator.java @@ -20,7 +20,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import static io.cucumber.core.codegen.GherkinKeywordNormalizer.normalizeKeyword; +import static io.cucumber.core.snippets.GherkinKeywordNormalizer.normalizeKeyword; import static io.cucumber.core.snippets.SnippetType.CAMELCASE; public final class SnippetGenerator { diff --git a/cucumber-java/src/codegen/java/GenerateI18n.java b/cucumber-java/src/codegen/java/GenerateI18n.java index 02bbabb672..d571d1fb39 100644 --- a/cucumber-java/src/codegen/java/GenerateI18n.java +++ b/cucumber-java/src/codegen/java/GenerateI18n.java @@ -15,8 +15,8 @@ import java.util.Locale; import java.util.Map; -import static io.cucumber.core.codegen.GherkinKeywordNormalizer.normalizeKeyword; -import static io.cucumber.core.codegen.GherkinKeywordNormalizer.normalizeLanguage; +import static io.cucumber.core.snippets.GherkinKeywordNormalizer.normalizeKeyword; +import static io.cucumber.core.snippets.GherkinKeywordNormalizer.normalizeLanguage; import static java.nio.file.Files.newBufferedWriter; import static java.nio.file.StandardOpenOption.CREATE; import static java.nio.file.StandardOpenOption.TRUNCATE_EXISTING; diff --git a/cucumber-java8/src/codegen/java/GenerateI18n.java b/cucumber-java8/src/codegen/java/GenerateI18n.java index 8f90ef357b..07c0ed0591 100644 --- a/cucumber-java8/src/codegen/java/GenerateI18n.java +++ b/cucumber-java8/src/codegen/java/GenerateI18n.java @@ -15,9 +15,9 @@ import java.util.Locale; import java.util.Map; -import static io.cucumber.core.codegen.GherkinKeywordNormalizer.capitalize; -import static io.cucumber.core.codegen.GherkinKeywordNormalizer.normalizeKeyword; -import static io.cucumber.core.codegen.GherkinKeywordNormalizer.normalizeLanguage; +import static io.cucumber.core.snippets.GherkinKeywordNormalizer.capitalize; +import static io.cucumber.core.snippets.GherkinKeywordNormalizer.normalizeKeyword; +import static io.cucumber.core.snippets.GherkinKeywordNormalizer.normalizeLanguage; import static java.nio.file.Files.newBufferedWriter; import static java.nio.file.StandardOpenOption.CREATE; import static java.nio.file.StandardOpenOption.TRUNCATE_EXISTING; From fdd4cdcbcca3d21a647bb7e5a5fbaadae2627f94 Mon Sep 17 00:00:00 2001 From: Issam El-atif Date: Mon, 8 Dec 2025 18:49:13 +0100 Subject: [PATCH 4/4] Code review + Units tests --- .../snippets/GherkinKeywordNormalizer.java | 8 ++--- .../GherkinKeywordNormalizerTest.java | 36 +++++++++++++++++++ .../src/codegen/java/GenerateI18n.java | 5 ++- 3 files changed, 44 insertions(+), 5 deletions(-) create mode 100644 cucumber-core/src/test/java/io/cucumber/core/snippets/GherkinKeywordNormalizerTest.java diff --git a/cucumber-core/src/main/java/io/cucumber/core/snippets/GherkinKeywordNormalizer.java b/cucumber-core/src/main/java/io/cucumber/core/snippets/GherkinKeywordNormalizer.java index 85143ecc88..beb7a53346 100644 --- a/cucumber-core/src/main/java/io/cucumber/core/snippets/GherkinKeywordNormalizer.java +++ b/cucumber-core/src/main/java/io/cucumber/core/snippets/GherkinKeywordNormalizer.java @@ -30,10 +30,6 @@ public static String normalizeLanguage(String language) { return language.replaceAll("[\\s-]", "_").toLowerCase(); } - public static String capitalize(String str) { - return str.substring(0, 1).toUpperCase() + str.substring(1); - } - private static String normalizeKeyword(String keyword) { return normalize(keyword.replaceAll("[\\s',!\u00AD’]", "")); } @@ -48,6 +44,10 @@ private static String normalizeEmojiKeyword(String keyword) { return normalizeKeyword(titleCasedName); } + private static String capitalize(String str) { + return str.substring(0, 1).toUpperCase() + str.substring(1); + } + private static String normalize(CharSequence s) { return Normalizer.normalize(s, Normalizer.Form.NFC); } diff --git a/cucumber-core/src/test/java/io/cucumber/core/snippets/GherkinKeywordNormalizerTest.java b/cucumber-core/src/test/java/io/cucumber/core/snippets/GherkinKeywordNormalizerTest.java new file mode 100644 index 0000000000..9af5f59623 --- /dev/null +++ b/cucumber-core/src/test/java/io/cucumber/core/snippets/GherkinKeywordNormalizerTest.java @@ -0,0 +1,36 @@ +package io.cucumber.core.snippets; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class GherkinKeywordNormalizerTest { + + @ParameterizedTest + @CsvSource({ + "en, G I V E N, GIVEN", + "en, Given', Given", + "en, Hyphen\u00ADated, Hyphenated", + "fr, Sc\u0065\u0301nario, Scénario", + "ar, مثا ل ,مثال", + "em, \uD83C\uDFE6, Bank", + "em, ✅, WhiteHeavyCheckMark" + }) + void shouldNormalizeKeyword(String language, String keyword, String expected) { + String normalizedKeyword = GherkinKeywordNormalizer.normalizeKeyword(language, keyword); + assertEquals(expected, normalizedKeyword); + } + + @ParameterizedTest + @CsvSource({ + "En US, en_us", + "en-tx, en_tx", + "AR, ar", + "cy-GB, cy_gb" + }) + void normalizeLanguage(String language, String expected) { + String normalizedLanguage = GherkinKeywordNormalizer.normalizeLanguage(language); + assertEquals(expected, normalizedLanguage); + } +} diff --git a/cucumber-java8/src/codegen/java/GenerateI18n.java b/cucumber-java8/src/codegen/java/GenerateI18n.java index 07c0ed0591..e8ba3d2098 100644 --- a/cucumber-java8/src/codegen/java/GenerateI18n.java +++ b/cucumber-java8/src/codegen/java/GenerateI18n.java @@ -15,7 +15,6 @@ import java.util.Locale; import java.util.Map; -import static io.cucumber.core.snippets.GherkinKeywordNormalizer.capitalize; import static io.cucumber.core.snippets.GherkinKeywordNormalizer.normalizeKeyword; import static io.cucumber.core.snippets.GherkinKeywordNormalizer.normalizeLanguage; import static java.nio.file.Files.newBufferedWriter; @@ -101,5 +100,9 @@ private static List extractKeywords(GherkinDialect dialect) { .map(keyword -> normalizeKeyword(dialect.getLanguage(), keyword)) .collect(toList()); } + + private static String capitalize(String str) { + return str.substring(0, 1).toUpperCase() + str.substring(1); + } } }