Skip to content
This repository has been archived by the owner on Jan 8, 2020. It is now read-only.

Commit

Permalink
(Added test for parametrized custom date formats.)
Browse files Browse the repository at this point in the history
  • Loading branch information
ddekany committed Aug 31, 2015
1 parent 1e76184 commit bb02d0f
Show file tree
Hide file tree
Showing 3 changed files with 123 additions and 7 deletions.
25 changes: 20 additions & 5 deletions src/test/java/freemarker/core/DateFormatTest.java
Expand Up @@ -45,7 +45,8 @@ public void setup() {

cfg.setCustomDateFormats(ImmutableMap.of(
"epoch", EpochMillisTemplateDateFormatFactory.INSTANCE,
"loc", LocAndTZSensitiveTemplateDateFormatFactory.INSTANCE));
"loc", LocAndTZSensitiveTemplateDateFormatFactory.INSTANCE,
"div", EpochMillisDivTemplateDateFormatFactory.INSTANCE));
}

@Test
Expand Down Expand Up @@ -123,6 +124,20 @@ public void testWrongFormatStrings() throws Exception {
getConfiguration().setDateTimeFormat("short");
assertErrorContains("${.now?string('x2')}", "\"x2\"", "'x'");
}

@Test
public void testCustomParameterized() throws Exception {
Configuration cfg = getConfiguration();
addToDataModel("d", new SimpleDate(new Date(12345678L), TemplateDateModel.DATETIME));
cfg.setDateTimeFormat("@div 1000");
assertOutput("${d}", "12345");
assertOutput("${d?string}", "12345");
assertOutput("${d?string.@div_100}", "123456");

assertErrorContains("${d?string.@div_xyz}", "\"@div_xyz\"", "\"xyz\"");
cfg.setDateTimeFormat("@div");
assertErrorContains("${d}", "\"datetime_format\"", "\"@div\"", "format parameter is required");
}

@Test
public void testUnknownCustomFormat() throws Exception {
Expand Down Expand Up @@ -156,10 +171,10 @@ public void testUnknownCustomFormat() throws Exception {
}

@Test
public void testNullInNumberModel() throws Exception {
addToDataModel("n", new MutableTemplateDateModel());
assertErrorContains("${n}", "nothing inside it");
assertErrorContains("${n?string}", "nothing inside it");
public void testNullInModel() throws Exception {
addToDataModel("d", new MutableTemplateDateModel());
assertErrorContains("${d}", "nothing inside it");
assertErrorContains("${d?string}", "nothing inside it");
}

@Test
Expand Down
@@ -0,0 +1,101 @@
/*
* Copyright 2014 Attila Szegedi, Daniel Dekany, Jonathan Revusky
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package freemarker.core;

import java.text.ParseException;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

import org.apache.commons.lang.NotImplementedException;

import freemarker.template.TemplateDateModel;
import freemarker.template.TemplateModelException;
import freemarker.template.utility.StringUtil;

public class EpochMillisDivTemplateDateFormatFactory extends TemplateDateFormatFactory {

public static final EpochMillisDivTemplateDateFormatFactory INSTANCE = new EpochMillisDivTemplateDateFormatFactory();

private EpochMillisDivTemplateDateFormatFactory() {
// Defined to decrease visibility
}

@Override
public TemplateDateFormat get(int dateType, boolean zonelessInput, String params, Locale locale, TimeZone timeZone,
Environment env) throws TemplateModelException, UnknownDateTypeFormattingUnsupportedException,
InvalidFormatParametersException {
int divisor;
try {
divisor = Integer.parseInt(params);
} catch (NumberFormatException e) {
if (params.length() == 0) {
throw new InvalidFormatParametersException(
"A format parameter is required, which specifies the divisor.");
}
throw new InvalidFormatParametersException(
"The format paramter must be an integer, but was (shown quoted): " + StringUtil.jQuote(params));
}
return new EpochMillisDivTemplateDateFormat(divisor);
}

private static class EpochMillisDivTemplateDateFormat extends TemplateDateFormat {

private final int divisor;

private EpochMillisDivTemplateDateFormat(int divisor) {
this.divisor = divisor;
}

@Override
public String format(TemplateDateModel dateModel)
throws UnformattableDateException, TemplateModelException {
return String.valueOf(getNonNullDate(dateModel).getTime() / divisor);
}

@Override
public boolean isLocaleBound() {
return false;
}

@Override
public boolean isTimeZoneBound() {
return false;
}

@Override
public <MO extends TemplateMarkupOutputModel> MO format(TemplateDateModel dateModel,
MarkupOutputFormat<MO> outputFormat) throws UnformattableNumberException, TemplateModelException {
throw new NotImplementedException();
}

@Override
public Date parse(String s) throws ParseException {
try {
return new Date(Long.parseLong(s));
} catch (NumberFormatException e) {
throw new ParseException("Malformed long", 0);
}
}

@Override
public String getDescription() {
return "millis since the epoch";
}

}

}
4 changes: 2 additions & 2 deletions src/test/java/freemarker/core/NumberFormatTest.java
Expand Up @@ -110,7 +110,7 @@ public void testLocaleSensitive2() throws Exception {
}

@Test
public void testParameterized() throws Exception {
public void testCustomParameterized() throws Exception {
Configuration cfg = getConfiguration();
cfg.setNumberFormat("@base 2");
assertOutput("${11}", "1011");
Expand Down Expand Up @@ -155,7 +155,7 @@ public void execute(Environment env, Map params, TemplateModel[] loopVars, Templ
}

@Test
public void testNullInNumberModel() throws Exception {
public void testNullInModel() throws Exception {
addToDataModel("n", new MutableTemplateNumberModel());
assertErrorContains("${n}", "nothing inside it");
assertErrorContains("${n?string}", "nothing inside it");
Expand Down

0 comments on commit bb02d0f

Please sign in to comment.