parent
98072dcdfb
commit
b7d6438f4d
@ -0,0 +1,149 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
||||||
|
|
||||||
|
<modelVersion>4.0.0</modelVersion> |
||||||
|
<groupId>de.kreth.property2java</groupId> |
||||||
|
<artifactId>PropertyToJavaGenerator</artifactId> |
||||||
|
<version>2.0.3-SNAPSHOT</version> |
||||||
|
|
||||||
|
<properties> |
||||||
|
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
||||||
|
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> |
||||||
|
<java.version>11</java.version> |
||||||
|
<org.junit.jupiter>5.3.0-M1</org.junit.jupiter> |
||||||
|
<org.slf4j>1.7.36</org.slf4j> |
||||||
|
<org.apache.logging.log4j>2.17.2</org.apache.logging.log4j> |
||||||
|
|
||||||
|
<timestamp>${maven.build.timestamp}</timestamp> |
||||||
|
<maven.build.timestamp.format>yyyy-MM-dd HH:mm:ss</maven.build.timestamp.format> |
||||||
|
</properties> |
||||||
|
|
||||||
|
<dependencies> |
||||||
|
<dependency> |
||||||
|
<groupId>org.apache.commons</groupId> |
||||||
|
<artifactId>commons-lang3</artifactId> |
||||||
|
<version>3.8.1</version> |
||||||
|
</dependency> |
||||||
|
<dependency> |
||||||
|
<groupId>org.apache.commons</groupId> |
||||||
|
<artifactId>commons-text</artifactId> |
||||||
|
<version>1.10.0</version> |
||||||
|
</dependency> |
||||||
|
<dependency> |
||||||
|
<groupId>commons-cli</groupId> |
||||||
|
<artifactId>commons-cli</artifactId> |
||||||
|
<version>1.4</version> |
||||||
|
</dependency> |
||||||
|
<dependency> |
||||||
|
<groupId>org.freemarker</groupId> |
||||||
|
<artifactId>freemarker</artifactId> |
||||||
|
<version>2.3.28</version> |
||||||
|
</dependency> |
||||||
|
|
||||||
|
<!-- LOGGING --> |
||||||
|
<dependency> |
||||||
|
<groupId>org.slf4j</groupId> |
||||||
|
<artifactId>slf4j-api</artifactId> |
||||||
|
<version>${org.slf4j}</version> |
||||||
|
</dependency> |
||||||
|
<dependency> |
||||||
|
<groupId>org.apache.logging.log4j</groupId> |
||||||
|
<artifactId>log4j-api</artifactId> |
||||||
|
<version>${org.apache.logging.log4j}</version> |
||||||
|
<scope>runtime</scope> |
||||||
|
</dependency> |
||||||
|
<dependency> |
||||||
|
<groupId>org.apache.logging.log4j</groupId> |
||||||
|
<artifactId>log4j-core</artifactId> |
||||||
|
<version>${org.apache.logging.log4j}</version> |
||||||
|
<scope>runtime</scope> |
||||||
|
</dependency> |
||||||
|
<dependency> |
||||||
|
<groupId>org.apache.logging.log4j</groupId> |
||||||
|
<artifactId>log4j-slf4j-impl</artifactId> |
||||||
|
<version>${org.apache.logging.log4j}</version> |
||||||
|
<scope>runtime</scope> |
||||||
|
</dependency> |
||||||
|
|
||||||
|
<!-- TESTING --> |
||||||
|
<dependency> |
||||||
|
<groupId>org.junit.jupiter</groupId> |
||||||
|
<artifactId>junit-jupiter-api</artifactId> |
||||||
|
<version>5.3.2</version> |
||||||
|
<scope>test</scope> |
||||||
|
</dependency> |
||||||
|
<dependency> |
||||||
|
<groupId>org.junit.jupiter</groupId> |
||||||
|
<artifactId>junit-jupiter-engine</artifactId> |
||||||
|
<version>5.3.2</version> |
||||||
|
<scope>test</scope> |
||||||
|
</dependency> |
||||||
|
<dependency> |
||||||
|
<groupId>org.junit.jupiter</groupId> |
||||||
|
<artifactId>junit-jupiter-params</artifactId> |
||||||
|
<version>5.3.2</version> |
||||||
|
<scope>test</scope> |
||||||
|
</dependency> |
||||||
|
<dependency> |
||||||
|
<groupId>org.junit.platform</groupId> |
||||||
|
<artifactId>junit-platform-launcher</artifactId> |
||||||
|
<version>1.5.0-M1</version> |
||||||
|
<scope>test</scope> |
||||||
|
</dependency> |
||||||
|
<dependency> |
||||||
|
<groupId>org.junit.platform</groupId> |
||||||
|
<artifactId>junit-platform-runner</artifactId> |
||||||
|
<version>1.5.0-M1</version> |
||||||
|
<scope>test</scope> |
||||||
|
</dependency> |
||||||
|
<dependency> |
||||||
|
<groupId>org.mockito</groupId> |
||||||
|
<artifactId>mockito-core</artifactId> |
||||||
|
<version>2.24.5</version> |
||||||
|
<scope>test</scope> |
||||||
|
</dependency> |
||||||
|
<dependency> |
||||||
|
<groupId>org.mockito</groupId> |
||||||
|
<artifactId>mockito-junit-jupiter</artifactId> |
||||||
|
<version>2.24.5</version> |
||||||
|
<scope>test</scope> |
||||||
|
</dependency> |
||||||
|
<dependency> |
||||||
|
<groupId>org.hamcrest</groupId> |
||||||
|
<artifactId>hamcrest-library</artifactId> |
||||||
|
<version>2.1-rc4</version> |
||||||
|
<scope>test</scope> |
||||||
|
</dependency> |
||||||
|
</dependencies> |
||||||
|
|
||||||
|
<distributionManagement> |
||||||
|
<snapshotRepository> |
||||||
|
<id>kreth.snapshots</id> |
||||||
|
<url>https://nexus.kreth-development.de/repository/maven-snapshots/</url> |
||||||
|
</snapshotRepository> |
||||||
|
<repository> |
||||||
|
<id>kreth.releases</id> |
||||||
|
<url>https://nexus.kreth-development.de/repository/maven-releases/</url> |
||||||
|
</repository> |
||||||
|
</distributionManagement> |
||||||
|
|
||||||
|
<build> |
||||||
|
<plugins> |
||||||
|
<plugin> |
||||||
|
<groupId>org.apache.maven.plugins</groupId> |
||||||
|
<artifactId>maven-compiler-plugin</artifactId> |
||||||
|
<version>3.8.0</version> |
||||||
|
<configuration> |
||||||
|
<release>${java.version}</release> |
||||||
|
<compilerArgs>-proc:none</compilerArgs> |
||||||
|
</configuration> |
||||||
|
</plugin> |
||||||
|
</plugins> |
||||||
|
</build> |
||||||
|
<scm> |
||||||
|
<developerConnection>scm:git:https://gitea.kreth-development.de/markus/PropertyToJavaGenerator_migration.git</developerConnection> |
||||||
|
<connection>scm:git:https://gitea.kreth-development.de/markus/PropertyToJavaGenerator_migration.git</connection> |
||||||
|
<tag>HEAD</tag> |
||||||
|
</scm> |
||||||
|
</project> |
||||||
@ -0,0 +1,5 @@ |
|||||||
|
package de.kreth.property2java; |
||||||
|
|
||||||
|
public enum GeneratorOptions { |
||||||
|
WithSubstitutors |
||||||
|
} |
||||||
@ -0,0 +1,70 @@ |
|||||||
|
/** |
||||||
|
* The text for this key from {@link Properties} with args as replacements of placeholders. |
||||||
|
* <p>Placeholder must be defined as {0}, {1} etc. |
||||||
|
* @return human readable text |
||||||
|
*/ |
||||||
|
public String getText(Object...objects) { |
||||||
|
String property = properties.getProperty(value); |
||||||
|
return doReplacements(property, objects); |
||||||
|
} |
||||||
|
|
||||||
|
<#-- From here tested substitution method --> |
||||||
|
private String doReplacements(String property, Object...objects) { |
||||||
|
StringBuilder text = new StringBuilder(); |
||||||
|
int index = property.indexOf('{'); |
||||||
|
text.append(property.substring(0, index)); |
||||||
|
|
||||||
|
while (index >= 0) { |
||||||
|
index++; |
||||||
|
int endIndex = withEndIndex(index, property); |
||||||
|
if (endIndex >0) { |
||||||
|
String theIndex = property.substring(index, endIndex); |
||||||
|
int withIndex = Integer.valueOf(theIndex); |
||||||
|
if (withIndex+1> objects.length) { |
||||||
|
throw new IllegalStateException("No Argument for Index {" + theIndex |
||||||
|
+ "}" + " at Position=" + (index - 1) + " in \"" + property + "\""); |
||||||
|
} |
||||||
|
text.append(objects[withIndex].toString()); |
||||||
|
index = property.indexOf('{', endIndex); |
||||||
|
if (index <0) { |
||||||
|
text.append(property.substring(endIndex + 1)); |
||||||
|
} else { |
||||||
|
text.append(property.substring(endIndex + 1, index)); |
||||||
|
} |
||||||
|
} else { |
||||||
|
endIndex = index; |
||||||
|
|
||||||
|
index = property.indexOf('{', index); |
||||||
|
if (index <0) { |
||||||
|
text.append('{'); |
||||||
|
text.append(property.substring(endIndex)); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
return text.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* extracts the end index, if (and only if) the closing } exists and |
||||||
|
* between the indicee an integer value exists. |
||||||
|
* @param index |
||||||
|
* @param property |
||||||
|
* @return -1 if invalid or not existing |
||||||
|
*/ |
||||||
|
private int withEndIndex(int index, String property) { |
||||||
|
|
||||||
|
int result = -1; |
||||||
|
int endIndex = property.indexOf('}', index); |
||||||
|
if (endIndex >index) { |
||||||
|
String between = property.substring(index, endIndex); |
||||||
|
if (between.length() > 0) { |
||||||
|
result = endIndex; |
||||||
|
for(int i=0; i<between.length(); i++) { |
||||||
|
if (Character.isDigit(between.charAt(i)) == false) { |
||||||
|
return -1; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
return result; |
||||||
|
} |
||||||
@ -0,0 +1,7 @@ |
|||||||
|
/** |
||||||
|
* Represented Key in property File. |
||||||
|
* @return key |
||||||
|
*/ |
||||||
|
public String getKey() { |
||||||
|
return value; |
||||||
|
} |
||||||
@ -0,0 +1,5 @@ |
|||||||
|
<#if options??> |
||||||
|
<#list options as option> |
||||||
|
<#include "${option}.tpl"> |
||||||
|
</#list> |
||||||
|
</#if> |
||||||
@ -0,0 +1,203 @@ |
|||||||
|
package de.kreth.property2java.generated; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.io.UncheckedIOException; |
||||||
|
import java.util.Properties; |
||||||
|
|
||||||
|
import javax.annotation.processing.Generated; |
||||||
|
|
||||||
|
/** |
||||||
|
* Property keys from property_loader_options.properties |
||||||
|
*/ |
||||||
|
|
||||||
|
@Generated(date = "06.08.2024, 23:03:48", value = "de.kreth.property2java.Generator") |
||||||
|
public enum Property_Loader_Options_Properties { |
||||||
|
|
||||||
|
/** |
||||||
|
* label = "" |
||||||
|
*/ |
||||||
|
LABEL ("label"), |
||||||
|
/** |
||||||
|
* label.addarticle = "Add Article" |
||||||
|
*/ |
||||||
|
LABEL_ADDARTICLE ("label.addarticle"), |
||||||
|
/** |
||||||
|
* label.cancel = "Cancel" |
||||||
|
*/ |
||||||
|
LABEL_CANCEL ("label.cancel"), |
||||||
|
/** |
||||||
|
* label.close = "Close" |
||||||
|
*/ |
||||||
|
LABEL_CLOSE ("label.close"), |
||||||
|
/** |
||||||
|
* label.delete = "Delete" |
||||||
|
*/ |
||||||
|
LABEL_DELETE ("label.delete"), |
||||||
|
/** |
||||||
|
* label.discart = "Discart" |
||||||
|
*/ |
||||||
|
LABEL_DISCART ("label.discart"), |
||||||
|
/** |
||||||
|
* label.loggedin = "Logged in:" |
||||||
|
*/ |
||||||
|
LABEL_LOGGEDIN ("label.loggedin"), |
||||||
|
/** |
||||||
|
* label.logout = "Logout" |
||||||
|
*/ |
||||||
|
LABEL_LOGOUT ("label.logout"), |
||||||
|
/** |
||||||
|
* label.ok = "OK" |
||||||
|
*/ |
||||||
|
LABEL_OK ("label.ok"), |
||||||
|
/** |
||||||
|
* label.open = "Open" |
||||||
|
*/ |
||||||
|
LABEL_OPEN ("label.open"), |
||||||
|
/** |
||||||
|
* label.preview = "Preview" |
||||||
|
*/ |
||||||
|
LABEL_PREVIEW ("label.preview"), |
||||||
|
/** |
||||||
|
* label.store = "Store" |
||||||
|
*/ |
||||||
|
LABEL_STORE ("label.store"), |
||||||
|
/** |
||||||
|
* label.user.register = "Register" |
||||||
|
*/ |
||||||
|
LABEL_USER_REGISTER ("label.user.register"), |
||||||
|
/** |
||||||
|
* message.article.priceerror = "Please set the price." |
||||||
|
*/ |
||||||
|
MESSAGE_ARTICLE_PRICEERROR ("message.article.priceerror"), |
||||||
|
/** |
||||||
|
* message.delete.text = "Delete {0}?" |
||||||
|
*/ |
||||||
|
MESSAGE_DELETE_TEXT ("message.delete.text"), |
||||||
|
/** |
||||||
|
* message.delete.title = "Really delete?" |
||||||
|
*/ |
||||||
|
MESSAGE_DELETE_TITLE ("message.delete.title"), |
||||||
|
/** |
||||||
|
* message.invoiceitem.allfieldsmustbeset = "Start, end and article must not be |
||||||
|
empty!" |
||||||
|
*/ |
||||||
|
MESSAGE_INVOICEITEM_ALLFIELDSMUSTBESET ("message.invoiceitem.allfieldsmustbeset"), |
||||||
|
/** |
||||||
|
* message.invoiceitem.startbeforeend = "End must be later than start." |
||||||
|
*/ |
||||||
|
MESSAGE_INVOICEITEM_STARTBEFOREEND ("message.invoiceitem.startbeforeend"), |
||||||
|
/** |
||||||
|
* message.user.create.success = "Thanks {0} created!" |
||||||
|
*/ |
||||||
|
MESSAGE_USER_CREATE_SUCCESS ("message.user.create.success"), |
||||||
|
/** |
||||||
|
* message.user.loginfailure = "Login Error! Wrong user or password?" |
||||||
|
*/ |
||||||
|
MESSAGE_USER_LOGINFAILURE ("message.user.loginfailure"), |
||||||
|
/** |
||||||
|
* message.user.passwordmissmatch = "Passwords don't match." |
||||||
|
*/ |
||||||
|
MESSAGE_USER_PASSWORDMISSMATCH ("message.user.passwordmissmatch"), |
||||||
|
/** |
||||||
|
* message.with.five.placeholders = "Third is first{2}, then last "{4}", second={1}, fourth={3} and first is last={0}" |
||||||
|
*/ |
||||||
|
MESSAGE_WITH_FIVE_PLACEHOLDERS ("message.with.five.placeholders"); |
||||||
|
private Property_Loader_Options_Properties (String value) { |
||||||
|
this.value = value; |
||||||
|
} |
||||||
|
|
||||||
|
private static Properties properties = new Properties(); |
||||||
|
static { |
||||||
|
try { |
||||||
|
properties.load(Property_Loader_Options_Properties.class.getResourceAsStream("/property_loader_options.properties")); |
||||||
|
} catch (IOException e) { |
||||||
|
throw new UncheckedIOException(e); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private final String value; |
||||||
|
|
||||||
|
/** |
||||||
|
* Represented Key in property File. |
||||||
|
* @return key |
||||||
|
*/ |
||||||
|
public String getKey() { |
||||||
|
return value; |
||||||
|
} |
||||||
|
/** |
||||||
|
* The text for this key from {@link Properties} |
||||||
|
* @return human readable text |
||||||
|
*/ |
||||||
|
public String getText() { |
||||||
|
return properties.getProperty(value); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* The text for this key from {@link Properties} with args as replacements of placeholders. |
||||||
|
* <p>Placeholder must be defined as {0}, {1} etc. |
||||||
|
* @return human readable text |
||||||
|
*/ |
||||||
|
public String getText(Object...objects) { |
||||||
|
String property = properties.getProperty(value); |
||||||
|
return doReplacements(property, objects); |
||||||
|
} |
||||||
|
|
||||||
|
private String doReplacements(String property, Object...objects) { |
||||||
|
StringBuilder text = new StringBuilder(); |
||||||
|
int index = property.indexOf('{'); |
||||||
|
text.append(property.substring(0, index)); |
||||||
|
|
||||||
|
while (index >= 0) { |
||||||
|
index++; |
||||||
|
int endIndex = withEndIndex(index, property); |
||||||
|
if (endIndex >0) { |
||||||
|
String theIndex = property.substring(index, endIndex); |
||||||
|
int withIndex = Integer.valueOf(theIndex); |
||||||
|
if (withIndex+1> objects.length) { |
||||||
|
throw new IllegalStateException("No Argument for Index {" + theIndex |
||||||
|
+ "}" + " at Position=" + (index - 1) + " in \"" + property + "\""); |
||||||
|
} |
||||||
|
text.append(objects[withIndex].toString()); |
||||||
|
index = property.indexOf('{', endIndex); |
||||||
|
if (index <0) { |
||||||
|
text.append(property.substring(endIndex + 1)); |
||||||
|
} else { |
||||||
|
text.append(property.substring(endIndex + 1, index)); |
||||||
|
} |
||||||
|
} else { |
||||||
|
endIndex = index; |
||||||
|
|
||||||
|
index = property.indexOf('{', index); |
||||||
|
if (index <0) { |
||||||
|
text.append('{'); |
||||||
|
text.append(property.substring(endIndex)); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
return text.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* extracts the end index, if (and only if) the closing } exists and |
||||||
|
* between the indicee an integer value exists. |
||||||
|
* @param index |
||||||
|
* @param property |
||||||
|
* @return -1 if invalid or not existing |
||||||
|
*/ |
||||||
|
private int withEndIndex(int index, String property) { |
||||||
|
|
||||||
|
int result = -1; |
||||||
|
int endIndex = property.indexOf('}', index); |
||||||
|
if (endIndex >index) { |
||||||
|
String between = property.substring(index, endIndex); |
||||||
|
if (between.length() > 0) { |
||||||
|
result = endIndex; |
||||||
|
for(int i=0; i<between.length(); i++) { |
||||||
|
if (Character.isDigit(between.charAt(i)) == false) { |
||||||
|
return -1; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
return result; |
||||||
|
}} |
||||||
@ -0,0 +1,65 @@ |
|||||||
|
package de.kreth.property2java.parts; |
||||||
|
|
||||||
|
public class ReplaceLogicForTemplate { |
||||||
|
|
||||||
|
static String doReplacements(String property, Object...objects) { |
||||||
|
StringBuilder text = new StringBuilder(); |
||||||
|
int index = property.indexOf('{'); |
||||||
|
text.append(property.substring(0, index)); |
||||||
|
|
||||||
|
while (index >= 0) { |
||||||
|
index++; |
||||||
|
int endIndex = withEndIndex(index, property); |
||||||
|
if (endIndex >0) { |
||||||
|
String theIndex = property.substring(index, endIndex); |
||||||
|
int withIndex = Integer.valueOf(theIndex); |
||||||
|
if (withIndex+1> objects.length) { |
||||||
|
throw new IllegalStateException("No Argument for Index {" + theIndex |
||||||
|
+ "}" + " at Position=" + (index - 1) + " in \"" + property + "\""); |
||||||
|
} |
||||||
|
text.append(objects[withIndex].toString()); |
||||||
|
index = property.indexOf('{', endIndex); |
||||||
|
if (index <0) { |
||||||
|
text.append(property.substring(endIndex + 1)); |
||||||
|
} else { |
||||||
|
text.append(property.substring(endIndex + 1, index)); |
||||||
|
} |
||||||
|
} else { |
||||||
|
endIndex = index; |
||||||
|
|
||||||
|
index = property.indexOf('{', index); |
||||||
|
if (index <0) { |
||||||
|
text.append('{'); |
||||||
|
text.append(property.substring(endIndex)); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
return text.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* extracts the end index, if (and only if) the closing } exists and |
||||||
|
* between the indicee an integer value exists. |
||||||
|
* @param index |
||||||
|
* @param property |
||||||
|
* @return -1 if invalid or not existing |
||||||
|
*/ |
||||||
|
private static int withEndIndex(int index, String property) { |
||||||
|
|
||||||
|
int result = -1; |
||||||
|
int endIndex = property.indexOf('}', index); |
||||||
|
if (endIndex >index) { |
||||||
|
String between = property.substring(index, endIndex); |
||||||
|
if (between.length() > 0) { |
||||||
|
result = endIndex; |
||||||
|
for(int i=0; i<between.length(); i++) { |
||||||
|
if (Character.isDigit(between.charAt(i)) == false) { |
||||||
|
return -1; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,82 @@ |
|||||||
|
package de.kreth.property2java.parts; |
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.*; |
||||||
|
import static de.kreth.property2java.parts.ReplaceLogicForTemplate.doReplacements; |
||||||
|
import org.junit.jupiter.api.Test; |
||||||
|
|
||||||
|
public class ReplaceLogicForTemplateTest { |
||||||
|
|
||||||
|
@Test |
||||||
|
void testPlaceholderOnly() { |
||||||
|
String property = "{0}"; |
||||||
|
String replaced = doReplacements(property, "Replacement"); |
||||||
|
assertThat(replaced).isEqualTo("Replacement"); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
void testPlaceholderTrailing() { |
||||||
|
String property = "|{0}"; |
||||||
|
String replaced = doReplacements(property, "Replacement"); |
||||||
|
assertThat(replaced).isEqualTo("|Replacement"); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
void testPlaceholderLeading() { |
||||||
|
String property = "{0}|"; |
||||||
|
String replaced = doReplacements(property, "Replacement"); |
||||||
|
assertThat(replaced).isEqualTo("Replacement|"); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
void testPlaceholderOrdered() { |
||||||
|
String property = "Start{0}|{1}|{2}End"; |
||||||
|
String replaced = doReplacements(property, "R1", "R2", "R3"); |
||||||
|
assertThat(replaced).isEqualTo("StartR1|R2|R3End"); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
void testPlaceholdersOrderedAtEdgesAndMissingIndex() { |
||||||
|
String property = "{0}||{2}"; |
||||||
|
String replaced = doReplacements(property, "R1", "R2", "R3"); |
||||||
|
assertThat(replaced).isEqualTo("R1||R3"); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
void testSimpleReplacementWithEmpty() { |
||||||
|
String property = "Start{0}End"; |
||||||
|
String replaced = doReplacements(property, ""); |
||||||
|
assertThat(replaced).isEqualTo("StartEnd"); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
void testSimpleReplacementToManyArguments() { |
||||||
|
String property = "Start{0}End"; |
||||||
|
String replaced = doReplacements(property, "|0|", "notUsed"); |
||||||
|
assertThat(replaced).isEqualTo("Start|0|End"); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
void testNoReplacementWithoutIndex() { |
||||||
|
String property = "Start{}End"; |
||||||
|
String replaced = doReplacements(property, "|0|", "notUsed"); |
||||||
|
assertThat(replaced).isEqualTo("Start{}End"); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
void testNoReplacementWithNoIntBetweenBraces() { |
||||||
|
String property = "Start{xy}End"; |
||||||
|
String replaced = doReplacements(property, "|0|", "notUsed"); |
||||||
|
assertThat(replaced).isEqualTo("Start{xy}End"); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
void testMissingReplacement() { |
||||||
|
String property = "Start{1}End"; |
||||||
|
assertThatThrownBy(() -> doReplacements(property, "|0|")) |
||||||
|
.isInstanceOf(IllegalStateException.class) |
||||||
|
.hasMessageContaining("{1}") // Orignal Placeholder
|
||||||
|
.hasMessageContaining("Position=5") // Index of missing Placeholder
|
||||||
|
.hasMessageContaining(property); // Orignal Text
|
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,25 @@ |
|||||||
|
|
||||||
|
label = |
||||||
|
|
||||||
|
label.addarticle = Add Article |
||||||
|
label.cancel = Cancel |
||||||
|
label.close = Close |
||||||
|
label.delete = Delete |
||||||
|
label.discart = Discart |
||||||
|
label.loggedin = Logged in: |
||||||
|
label.logout = Logout |
||||||
|
label.ok = OK |
||||||
|
label.store = Store |
||||||
|
label.preview = Preview |
||||||
|
label.open = Open |
||||||
|
label.user.register = Register |
||||||
|
|
||||||
|
message.article.priceerror = Please set the price. |
||||||
|
message.delete.text = Delete {0}? |
||||||
|
message.delete.title = Really delete? |
||||||
|
message.invoiceitem.allfieldsmustbeset = Start, end and article must not be \r\n empty! |
||||||
|
message.invoiceitem.startbeforeend = End must be later than start. |
||||||
|
message.user.create.success = Thanks {0} created! |
||||||
|
message.user.loginfailure = Login Error! Wrong user or password? |
||||||
|
message.user.passwordmissmatch = Passwords don't match. |
||||||
|
message.with.five.placeholders = Third is first{2}, then last "{4}", second={1}, fourth={3} and first is last={0} |
||||||
Loading…
Reference in new issue