Skip to content

Commit

Permalink
fixed TimeFormat API
Browse files Browse the repository at this point in the history
  • Loading branch information
nessumo committed Feb 29, 2012
1 parent 945ca08 commit be6b3c8
Show file tree
Hide file tree
Showing 5 changed files with 111 additions and 46 deletions.
25 changes: 20 additions & 5 deletions src/main/java/com/ocpsoft/pretty/time/BasicTimeFormat.java
Expand Up @@ -43,22 +43,37 @@ public class BasicTimeFormat implements TimeFormat

public String format(final Duration duration)
{
return format(duration, true, true);
String result = format(duration, true);
String sign = getSign(duration);
return decorate(sign, result);
}

public String formatWithoutRounding(final Duration duration) {
return format(duration, false);
}

public String formatWithRounding(final Duration duration) {
return format(duration, true);
}

public String format(final Duration duration, final boolean doRounding, final boolean doDecorate)
private String format(final Duration duration, final boolean doRounding)
{
String sign = getSign(duration);
String unit = getGramaticallyCorrectName(duration);
long quantity = getQuantity(duration, doRounding);

String result = applyPattern(sign, unit, quantity);
if (doDecorate)
result = decorate(sign, result);

return result;
}

public String decoratePast(String value) {
return decorate(NEGATIVE, value);
}

public String decorateFuture(String value) {
return decorate("", value);
}

private String decorate(final String sign, String result)
{
if (NEGATIVE.equals(sign))
Expand Down
30 changes: 11 additions & 19 deletions src/main/java/com/ocpsoft/pretty/time/PrettyTime.java
Expand Up @@ -240,21 +240,6 @@ public String format(final Duration duration)
}


/**
* Format the given {@link Duration} object, using the {@link TimeFormat}
* specified by the {@link TimeUnit} contained within and with optional rounding
*
* @param duration
* the {@link Duration} to be formatted
* @param doRounding
* @return A formatted string representing {@code duration}
*/
public String format(final Duration duration, boolean doRounding)
{
TimeFormat format = duration.getUnit().getFormat();
return format.format(duration, doRounding, true);
}

/**
* Format the given {@link Duration} objects, using the {@link TimeFormat}
* specified by the {@link TimeUnit} contained within.
Expand All @@ -270,16 +255,23 @@ public String format(final List<Duration> durations)
if (durations != null) {
StringBuilder builder = new StringBuilder();
Duration duration = null;
TimeFormat format;
TimeFormat format = null;
for (int i=0; i<durations.size(); i++) {
duration = durations.get(i);
boolean isLast = (i == durations.size() - 1);
format = duration.getUnit().getFormat();
builder.append(format.format(duration, isLast, false));
if (!isLast)
if (!isLast) {
builder.append(format.formatWithoutRounding(duration));
builder.append(" ");
} else {
builder.append(format.formatWithRounding(duration));
}
}
if (duration.getQuantity() < 0) {
result = format.decoratePast(builder.toString());
} else {
result = format.decorateFuture(builder.toString());
}
result = duration.getUnit().getFormat().decorate(builder.toString(), duration.getQuantity() < 0);
}
return result;
}
Expand Down
35 changes: 24 additions & 11 deletions src/main/java/com/ocpsoft/pretty/time/TimeFormat.java
Expand Up @@ -29,7 +29,7 @@
public interface TimeFormat
{
/**
* Given a populated Duration object. Apply formatting and output the
* Given a populated Duration object. Apply formatting, decorate and output the
* result.
*
* @param duration
Expand All @@ -38,24 +38,37 @@ public interface TimeFormat
public abstract String format(final Duration duration);

/**
* Given Duration object apply formating, optional rounding,
* optional decorating with prefix/suffix and output the result.
* Return formatted duration without rounding
*
* @param duration
* @param doRounding
* @param doDecorate
* @return
*/
public abstract String format(final Duration duration, boolean doRounding, boolean doDecorate);

public String formatWithRounding(Duration duration);

/**
* Return formatted duration with rounding if necessary
*
* @param duration
* @return
*/
public String formatWithoutRounding(Duration duration);


/**
* Decorate with past prefix/suffix
*
* @param value
* @return
*/
public String decoratePast(String value);


/**
* Decorate with prefix/fuffix
* Decorate with future prefix/suffix
*
* @param sign
* @param result
* @param value
* @return
*/
public String decorate(String value, boolean inThePast);
public String decorateFuture(String value);

}
56 changes: 56 additions & 0 deletions src/test/java/com/ocpsoft/pretty/time/BasicTimeFormatTest.java
@@ -0,0 +1,56 @@
package com.ocpsoft.pretty.time;

import static org.junit.Assert.assertEquals;

import java.util.Date;
import java.util.Locale;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class BasicTimeFormatTest {

// Stores current locale so that it can be restored
private Locale locale;

// Method setUp() is called automatically before every test method
@Before
public void setUp() throws Exception
{
locale = Locale.getDefault();
Locale.setDefault(Locale.ROOT);
}

@Test
public void testRounding() throws Exception
{
PrettyTime t = new PrettyTime(new Date(1000 * 60 * 60 * 3 + 1000 * 60 * 45));
Duration duration = t.approximateDuration(new Date(0));
TimeFormat format = duration.getUnit().getFormat();

assertEquals("3 hours", format.formatWithoutRounding(duration));
assertEquals("4 hours", format.formatWithRounding(duration));
// backward compatibility
assertEquals("4 hours ago", t.format(duration));
}

@Test
public void testDecorating() throws Exception
{
PrettyTime t = new PrettyTime();
Duration duration = t.approximateDuration(new Date(0));
TimeFormat format = duration.getUnit().getFormat();

assertEquals("some time from now", format.decorateFuture("some time"));
assertEquals("some time ago", format.decoratePast("some time"));
}

// Method tearDown() is called automatically after every test method
@After
public void tearDown() throws Exception
{
Locale.setDefault(locale);
}

}
11 changes: 0 additions & 11 deletions src/test/java/com/ocpsoft/pretty/time/PrettyTimeTest.java
Expand Up @@ -246,17 +246,6 @@ public void testPreciseInThePast() throws Exception
assertEquals(-10, durations.get(1).getQuantity());
}

@Test
public void testDoRounding() throws Exception
{
PrettyTime t = new PrettyTime(new Date(1000 * 60 * 60 * 3 + 1000 * 60 * 45));
Duration duration = t.approximateDuration(new Date(0));
assertEquals("3 hours ago", t.format(duration, false));
assertEquals("4 hours ago", t.format(duration, true));
// rounding should be enabled by default
assertEquals("4 hours ago", t.format(duration));
}

@Test
public void testFormattingDurationListInThePast() throws Exception
{
Expand Down

0 comments on commit be6b3c8

Please sign in to comment.