blob: 185ee10a8b37d0e6f3a31e7530151d2b4120c23f [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.struts2.views.jsp.ui;
import com.opensymphony.xwork2.ActionContext;
import org.apache.struts2.views.jsp.AbstractTagTest;
import org.apache.struts2.views.jsp.DateTag;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
/**
* Unit test for {@link org.apache.struts2.components.Date}.
*
*/
public class DateTagTest extends AbstractTagTest {
private DateTag tag;
public void testCustomFormat() throws Exception {
String format = "yyyy/MM/dd hh:mm:ss";
Date now = new Date();
String formatted = new SimpleDateFormat(format).format(now);
context.put("myDate", now);
tag.setName("myDate");
tag.setNice(false);
tag.setFormat(format);
tag.doStartTag();
tag.doEndTag();
assertEquals(formatted, writer.toString());
}
public void testCustomFormatWithTimezone() throws Exception {
String format = "yyyy/MM/dd hh:mm:ss";
Date now = Calendar.getInstance(TimeZone.getTimeZone("UTC+1")).getTime();
SimpleDateFormat sdf = new SimpleDateFormat(format);
sdf.setTimeZone(TimeZone.getTimeZone("UTC+1"));
String formatted = sdf.format(now);
context.put("myDate", now);
tag.setName("myDate");
tag.setNice(false);
tag.setFormat(format);
tag.setTimezone("UTC+1");
tag.doStartTag();
tag.doEndTag();
assertEquals(formatted, writer.toString());
}
public void testCustomFormatWithTimezoneAsExpression() throws Exception {
String format = "yyyy/MM/dd hh:mm:ss";
Date now = Calendar.getInstance(TimeZone.getTimeZone("UTC+2")).getTime();
SimpleDateFormat sdf = new SimpleDateFormat(format);
sdf.setTimeZone(TimeZone.getTimeZone("UTC+2"));
String formatted = sdf.format(now);
context.put("myDate", now);
context.put("myTimezone", "UTC+2");
tag.setName("myDate");
tag.setNice(false);
tag.setFormat(format);
tag.setTimezone("myTimezone");
tag.doStartTag();
tag.doEndTag();
assertEquals(formatted, writer.toString());
}
public void testCustomFormatCalendar() throws Exception {
String format = "yyyy/MM/dd hh:mm:ss";
Calendar calendar = Calendar.getInstance();
String formatted = new SimpleDateFormat(format).format(calendar.getTime());
context.put("myDate", calendar);
tag.setName("myDate");
tag.setNice(false);
tag.setFormat(format);
tag.doStartTag();
tag.doEndTag();
assertEquals(formatted, writer.toString());
}
public void testCustomFormatLong() throws Exception {
String format = "yyyy/MM/dd hh:mm:ss";
Date date = new Date();
String formatted = new SimpleDateFormat(format).format(date);
// long
context.put("myDate", date.getTime());
tag.setName("myDate");
tag.setNice(false);
tag.setFormat(format);
tag.doStartTag();
tag.doEndTag();
assertEquals(formatted, writer.toString());
}
public void testDefaultFormat() throws Exception {
Date now = new Date();
String formatted = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM,
ActionContext.getContext().getLocale()).format(now);
context.put("myDate", now);
tag.setName("myDate");
tag.setNice(false);
tag.doStartTag();
tag.doEndTag();
assertEquals(formatted, writer.toString());
}
public void testCustomFormatAndComponent() throws Exception {
String format = "yyyy/MM/dd hh:mm:ss";
Date now = new Date();
String formatted = new SimpleDateFormat(format).format(now);
context.put("myDate", now);
tag.setName("myDate");
tag.setFormat(format);
tag.setNice(false);
tag.doStartTag();
// component test must be done between start and end tag
org.apache.struts2.components.Date component = (org.apache.struts2.components.Date) tag.getComponent();
assertEquals("myDate", component.getName());
assertEquals(format, component.getFormat());
assertEquals(false, component.isNice());
tag.doEndTag();
assertEquals(formatted, writer.toString());
}
public void testSetId() throws Exception {
String format = "yyyy/MM/dd hh:mm:ss";
Date now = new Date();
String formatted = new SimpleDateFormat(format).format(now);
context.put("myDate", now);
tag.setName("myDate");
tag.setNice(false);
tag.setFormat(format);
tag.setVar("myId");
tag.doStartTag();
tag.doEndTag();
assertEquals(formatted, context.get("myId"));
}
public void testFutureNiceHour() throws Exception {
Date now = new Date();
Calendar future = Calendar.getInstance();
future.setTime(now);
future.add(Calendar.HOUR, 1);
future.add(Calendar.SECOND, 5); // always add a little slack otherwise we could calculate wrong
context.put("myDate", future.getTime());
tag.setName("myDate");
tag.setNice(true);
tag.doStartTag();
tag.doEndTag();
assertEquals("in one hour", writer.toString());
}
public void testPastNiceHour() throws Exception {
Date now = new Date();
Calendar future = Calendar.getInstance();
future.setTime(now);
future.add(Calendar.HOUR, -1);
future.add(Calendar.SECOND, -5); // always add a little slack otherwise we could calculate wrong
context.put("myDate", future.getTime());
tag.setName("myDate");
tag.setNice(true);
tag.doStartTag();
tag.doEndTag();
assertEquals("one hour ago", writer.toString());
}
public void testFutureNiceHourMinSec() throws Exception {
Date now = new Date();
Calendar future = Calendar.getInstance();
future.setTime(now);
future.add(Calendar.HOUR, 2);
future.add(Calendar.MINUTE, 33);
future.add(Calendar.SECOND, 5); // always add a little slack otherwise we could calculate wrong
context.put("myDate", future.getTime());
tag.setName("myDate");
tag.setNice(true);
tag.doStartTag();
tag.doEndTag();
assertEquals("in 2 hours, 33 minutes", writer.toString());
}
public void testPastNiceHourMin() throws Exception {
Date now = new Date();
Calendar past = Calendar.getInstance();
past.setTime(now);
past.add(Calendar.HOUR, -4);
past.add(Calendar.MINUTE, -55);
past.add(Calendar.SECOND, -5); // always add a little slack otherwise we could calculate wrong
context.put("myDate", past.getTime());
tag.setName("myDate");
tag.setNice(true);
tag.doStartTag();
tag.doEndTag();
assertEquals("4 hours, 55 minutes ago", writer.toString());
}
public void testFutureLessOneMin() throws Exception {
Date now = new Date();
Calendar future = Calendar.getInstance();
future.setTime(now);
future.add(Calendar.SECOND, 47);
future.add(Calendar.SECOND, 5); // always add a little slack otherwise we could calculate wrong
context.put("myDate", future.getTime());
tag.setName("myDate");
tag.setNice(true);
tag.doStartTag();
tag.doEndTag();
assertEquals("in an instant", writer.toString());
}
public void testFutureLessOneHour() throws Exception {
Date now = new Date();
Calendar future = Calendar.getInstance();
future.setTime(now);
future.add(Calendar.MINUTE, 36);
future.add(Calendar.SECOND, 5); // always add a little slack otherwise we could calculate wrong
context.put("myDate", future.getTime());
tag.setName("myDate");
tag.setNice(true);
tag.doStartTag();
tag.doEndTag();
assertEquals("in 36 minutes", writer.toString());
}
public void testFutureLessOneYear() throws Exception {
Date now = new Date();
Calendar future = Calendar.getInstance();
future.setTime(now);
future.add(Calendar.HOUR, 40 * 24);
future.add(Calendar.SECOND, 5); // always add a little slack otherwise we could calculate wrong
context.put("myDate", future.getTime());
tag.setName("myDate");
tag.setNice(true);
tag.doStartTag();
tag.doEndTag();
assertEquals("in 40 days", writer.toString());
}
public void testFutureTwoYears() throws Exception {
Date now = new Date();
Calendar future = Calendar.getInstance();
future.setTime(now);
future.add(Calendar.YEAR, 2);
future.add(Calendar.DATE, 1);
future.add(Calendar.SECOND, 5); // always add a little slack otherwise we could calculate wrong
context.put("myDate", future.getTime());
tag.setName("myDate");
tag.setNice(true);
tag.doStartTag();
tag.doEndTag();
// hmmm the Date component isn't the best to calculate the excat difference so we'll just check
// that it starts with in 2 years
assertTrue(writer.toString().startsWith("in 2 years"));
}
public void testNoDateObjectInContext() throws Exception {
context.put("myDate", "this is not a java.util.Date object");
tag.setName("myDate");
tag.setNice(true);
tag.doStartTag();
tag.doEndTag();
//should return a blank
assertEquals("", writer.toString());
}
protected void setUp() throws Exception {
super.setUp();
tag = new DateTag();
tag.setPageContext(pageContext);
}
protected void tearDown() throws Exception {
super.tearDown();
tag = null;
}
}