-
Bug
-
Resolution: Unresolved
-
P4
-
26
Some templates might include java code containing the `#` character and not get it replaced by a variable, e.g.
```
static final String POSTFIX = "#I_";
```
The template framework thinks there's an argument missing:
```
compiler.lib.template_framework.RendererException: Missing hashtag replacement for #I_
at compiler.lib.template_framework.TemplateFrame.getHashtagReplacement(TemplateFrame.java:93)
at compiler.lib.template_framework.Renderer.getHashtagReplacement(Renderer.java:167)
at compiler.lib.template_framework.Renderer.lambda$renderStringWithDollarAndHashtagReplacementsPart$0(Renderer.java:420)
at java.base/java.util.regex.Matcher.replaceFirst(Matcher.java:1514)
at compiler.lib.template_framework.Renderer.renderStringWithDollarAndHashtagReplacementsPart(Renderer.java:412)
at compiler.lib.template_framework.Renderer.renderStringWithDollarAndHashtagReplacements(Renderer.java:366)
at compiler.lib.template_framework.Renderer.renderToken(Renderer.java:262)
at compiler.lib.template_framework.Renderer.renderTokenList(Renderer.java:328)
at compiler.lib.template_framework.Renderer.renderTemplateToken(Renderer.java:251)
at compiler.lib.template_framework.Renderer.renderToken(Renderer.java:314)
at compiler.lib.template_framework.Renderer.renderTokenList(Renderer.java:328)
at compiler.lib.template_framework.Renderer.renderToken(Renderer.java:281)
at compiler.lib.template_framework.Renderer.renderTokenList(Renderer.java:328)
at compiler.lib.template_framework.Renderer.renderTemplateToken(Renderer.java:251)
at compiler.lib.template_framework.Renderer.render(Renderer.java:132)
at compiler.lib.template_framework.Renderer.render(Renderer.java:122)
at compiler.lib.template_framework.TemplateToken.render(TemplateToken.java:163)
at compiler.lib.template_framework.Template$ZeroArgs.render(Template.java:308)
at compiler.lib.template_framework.library.TestFrameworkClass.render(TestFrameworkClass.java:117)
at compiler.valhalla.inlinetypes.templating.TestOne.generate(TestOne.java:69)
at compiler.valhalla.inlinetypes.templating.TestOne.main(TestOne.java:132)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
at java.base/java.lang.reflect.Method.invoke(Method.java:565)
at com.sun.javatest.regtest.agent.MainActionHelper$AgentVMRunnable.run(MainActionHelper.java:335)
at java.base/java.lang.Thread.run(Thread.java:1447)
```
The way this problem is solved in String.format() is by doubling up. So, if you want to add the `%` character, you just double it: `%%`:
https://docs.oracle.com/javase/8/docs/api/java/util/Formatter.html
```
The format specifiers which do not correspond to arguments have the following syntax:
%[flags][width]conversion
...
Conversions
Conversions are divided into the following categories:
...
* Percent - produces a literal '%' ('\u0025')
```
I've tried to see if `##` works but it doesn't:
```
TEST RESULT: Failed. Execution failed: `main' threw exception: compiler.lib.template_framework.RendererException: Is not a valid '#' replacement pattern: '#' in '...'.
```
So I'm proposing to add the capability to convert `##` into `#` and avoid hashtag replacement.
A similar thing might be required for `$` too
Thoughts [~epeter]? If you're happy with it I can give it a go
```
static final String POSTFIX = "#I_";
```
The template framework thinks there's an argument missing:
```
compiler.lib.template_framework.RendererException: Missing hashtag replacement for #I_
at compiler.lib.template_framework.TemplateFrame.getHashtagReplacement(TemplateFrame.java:93)
at compiler.lib.template_framework.Renderer.getHashtagReplacement(Renderer.java:167)
at compiler.lib.template_framework.Renderer.lambda$renderStringWithDollarAndHashtagReplacementsPart$0(Renderer.java:420)
at java.base/java.util.regex.Matcher.replaceFirst(Matcher.java:1514)
at compiler.lib.template_framework.Renderer.renderStringWithDollarAndHashtagReplacementsPart(Renderer.java:412)
at compiler.lib.template_framework.Renderer.renderStringWithDollarAndHashtagReplacements(Renderer.java:366)
at compiler.lib.template_framework.Renderer.renderToken(Renderer.java:262)
at compiler.lib.template_framework.Renderer.renderTokenList(Renderer.java:328)
at compiler.lib.template_framework.Renderer.renderTemplateToken(Renderer.java:251)
at compiler.lib.template_framework.Renderer.renderToken(Renderer.java:314)
at compiler.lib.template_framework.Renderer.renderTokenList(Renderer.java:328)
at compiler.lib.template_framework.Renderer.renderToken(Renderer.java:281)
at compiler.lib.template_framework.Renderer.renderTokenList(Renderer.java:328)
at compiler.lib.template_framework.Renderer.renderTemplateToken(Renderer.java:251)
at compiler.lib.template_framework.Renderer.render(Renderer.java:132)
at compiler.lib.template_framework.Renderer.render(Renderer.java:122)
at compiler.lib.template_framework.TemplateToken.render(TemplateToken.java:163)
at compiler.lib.template_framework.Template$ZeroArgs.render(Template.java:308)
at compiler.lib.template_framework.library.TestFrameworkClass.render(TestFrameworkClass.java:117)
at compiler.valhalla.inlinetypes.templating.TestOne.generate(TestOne.java:69)
at compiler.valhalla.inlinetypes.templating.TestOne.main(TestOne.java:132)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
at java.base/java.lang.reflect.Method.invoke(Method.java:565)
at com.sun.javatest.regtest.agent.MainActionHelper$AgentVMRunnable.run(MainActionHelper.java:335)
at java.base/java.lang.Thread.run(Thread.java:1447)
```
The way this problem is solved in String.format() is by doubling up. So, if you want to add the `%` character, you just double it: `%%`:
https://docs.oracle.com/javase/8/docs/api/java/util/Formatter.html
```
The format specifiers which do not correspond to arguments have the following syntax:
%[flags][width]conversion
...
Conversions
Conversions are divided into the following categories:
...
* Percent - produces a literal '%' ('\u0025')
```
I've tried to see if `##` works but it doesn't:
```
TEST RESULT: Failed. Execution failed: `main' threw exception: compiler.lib.template_framework.RendererException: Is not a valid '#' replacement pattern: '#' in '...'.
```
So I'm proposing to add the capability to convert `##` into `#` and avoid hashtag replacement.
A similar thing might be required for `$` too
Thoughts [~epeter]? If you're happy with it I can give it a go
- relates to
-
JDK-8344942 Template-Based Testing Framework
-
- Resolved
-