/** * Licensed to The Apereo Foundation under one or more contributor license * agreements. See the NOTICE file distributed with this work for additional * information regarding copyright ownership. * * * The Apereo Foundation licenses this file to you under the Educational * Community 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://opensource.org/licenses/ecl2.txt * * 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.opencastproject.metadata.dublincore; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import static org.opencastproject.metadata.dublincore.EncodingSchemeUtils.decodeDate; import static org.opencastproject.metadata.dublincore.EncodingSchemeUtils.decodeDuration; import static org.opencastproject.metadata.dublincore.EncodingSchemeUtils.decodePeriod; import static org.opencastproject.metadata.dublincore.EncodingSchemeUtils.decodeTemporal; import static org.opencastproject.metadata.dublincore.EncodingSchemeUtils.encodeDate; import static org.opencastproject.metadata.dublincore.EncodingSchemeUtils.encodeDuration; import static org.opencastproject.metadata.dublincore.EncodingSchemeUtils.encodePeriod; import static org.opencastproject.metadata.dublincore.TestUtil.createDate; import static org.opencastproject.metadata.dublincore.TestUtil.precisionDay; import static org.opencastproject.metadata.dublincore.TestUtil.precisionSecond; import com.entwinemedia.fn.data.Opt; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.text.SimpleDateFormat; import java.util.Date; import java.util.TimeZone; /** * Test cases for {@link org.opencastproject.metadata.dublincore.EncodingSchemeUtils}. */ public class EncodingSchemeUtilsTest { private Logger logger = LoggerFactory.getLogger(EncodingSchemeUtilsTest.class); @Test public void printTimeZone() { // Not a test case... logger.info("Time zone = " + TimeZone.getDefault()); } @Test public void testEncodeDate() { Date now = new Date(); assertEquals(4, encodeDate(now, Precision.Year).getValue().length()); assertEquals(3, encodeDate(now, Precision.Day).getValue().split("-").length); assertEquals("2009-01-01T00:00:00Z".length(), encodeDate(now, Precision.Second).getValue().length()); assertEquals(Opt.some(DublinCore.ENC_SCHEME_W3CDTF), encodeDate(now, Precision.Year).getEncodingScheme()); // Test symmetry assertEquals(decodeDate(encodeDate(now, Precision.Second)), precisionSecond(now)); assertEquals(decodeDate(encodeDate(createDate(1999, 3, 21, 14, 0, 0), Precision.Day)), precisionDay(createDate( 1999, 3, 21, 14, 0, 0))); assertEquals("1724-04-22", encodeDate(createDate(1724, 4, 22, 18, 30, 0), Precision.Day).getValue()); assertEquals("1724-04-22T18:30:00Z", encodeDate(createDate(1724, 4, 22, 18, 30, 0, "UTC"), Precision.Second) .getValue()); assertEquals("1724-04-22T17:30:10Z", encodeDate(createDate(1724, 4, 22, 17, 30, 10, "UTC"), Precision.Second) .getValue()); assertEquals("1724-04-22T17:30Z", encodeDate(createDate(1724, 4, 22, 17, 30, 25, "UTC"), Precision.Minute) .getValue()); assertEquals("1999-03-21", encodeDate(createDate(1999, 3, 21, 18, 30, 25), Precision.Day).getValue()); // logger.info(encodeDate(now, Precision.Day).getValue()); logger.info(encodeDate(now, Precision.Second).getValue()); } @Test public void testEncodeFraction() { Date a = new Date(1); Date b = new Date(125); Date c = new Date(100); assertEquals("1970-01-01T00:00:00.001Z", encodeDate(a, Precision.Fraction).getValue()); assertEquals("1970-01-01T00:00:00.125Z", encodeDate(b, Precision.Fraction).getValue()); assertEquals("1970-01-01T00:00:00.100Z", encodeDate(c, Precision.Fraction).getValue()); } @Test public void testEncodePeriod() { DublinCoreValue a = encodePeriod(new DCMIPeriod(createDate(2007, 2, 10, 12, 0, 0), createDate(2009, 12, 24, 10, 0, 0), "long time"), Precision.Day); assertEquals("start=2007-02-10; end=2009-12-24; name=long time; scheme=W3C-DTF;", a.getValue()); assertEquals(Opt.some(DublinCore.ENC_SCHEME_PERIOD), a.getEncodingScheme()); DublinCoreValue b = encodePeriod(new DCMIPeriod(createDate(2007, 2, 10, 12, 0, 0), null), Precision.Day); assertEquals("start=2007-02-10; scheme=W3C-DTF;", b.getValue()); } @Test public void testDecodeDate() { assertEquals(createDate(2008, 10, 1, 0, 0, 0), decodeDate(DublinCoreValue.mk("2008-10-01"))); assertEquals(createDate(1999, 3, 21, 14, 30, 0, "UTC"), decodeDate(DublinCoreValue.mk("1999-03-21T14:30Z"))); assertEquals(createDate(1999, 3, 21, 14, 30, 0, "UTC"), decodeDate(DublinCoreValue.mk("1999-03-21T14:30:00Z"))); assertEquals(createDate(1999, 3, 21, 14, 30, 15, "UTC"), decodeDate(DublinCoreValue.mk("1999-03-21T14:30:15Z"))); assertEquals(createDate(2001, 9, 11, 0, 0, 0), decodeDate(DublinCoreValue.mk("2001-09-11"))); assertEquals(createDate(2011, 2, 24, 7, 0, 0, "UTC"), decodeDate(DublinCoreValue.mk("1298530800000"))); assertEquals(createDate(2011, 2, 24, 7, 0, 0, "UTC"), decodeDate("1298530800000")); logger.info(decodeDate(DublinCoreValue.mk("2009-03-31")).toString()); logger.info(decodeDate(DublinCoreValue.mk("2009-09-11")).toString()); logger.info(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(decodeDate(DublinCoreValue.mk( "2009-03-31")))); } @Test public void testDecodePeriod() { DCMIPeriod a = decodePeriod(DublinCoreValue.mk("start=2008-10-01; end=2009-01-01;")); assertEquals(createDate(2008, 10, 1, 0, 0, 0), a.getStart()); assertEquals(createDate(2009, 1, 1, 0, 0, 0), a.getEnd()); DCMIPeriod b = decodePeriod(DublinCoreValue.mk("start=2008-10-01; end=2009-01-01")); assertEquals(createDate(2008, 10, 1, 0, 0, 0), b.getStart()); assertEquals(createDate(2009, 1, 1, 0, 0, 0), b.getEnd()); DCMIPeriod c = decodePeriod(DublinCoreValue.mk("start=2008-10-01")); assertEquals(createDate(2008, 10, 1, 0, 0, 0), c.getStart()); assertNull(c.getEnd()); DCMIPeriod d = decodePeriod(DublinCoreValue.mk("start=2008-10-01T10:20Z; end=2009-01-01; scheme=UNKNOWN")); assertNull(d); DCMIPeriod e = decodePeriod(DublinCoreValue.mk("start=2008-10-01T10:20Z; end=2009-01-01; scheme=W3C-DTF")); assertNotNull(e); DCMIPeriod f = decodePeriod(DublinCoreValue.mk("start=2008-10-01ERR; end=2009-01-01; scheme=W3C-DTF")); assertNull(f); } @Test public void testDecodeTemporal() { Temporal.Match<Integer> match = new Temporal.Match<Integer>() { @Override public Integer period(DCMIPeriod period) { return 1; } @Override public Integer instant(Date instant) { return 2; } @Override public Integer duration(long duration) { return 3; } }; Temporal.Match<Long> durationMatch = new Temporal.Match<Long>() { @Override public Long period(DCMIPeriod period) { throw new RuntimeException(); } @Override public Long instant(Date instant) { throw new RuntimeException(); } @Override public Long duration(long duration) { return duration; } }; assertSame(1, decodeTemporal(DublinCoreValue.mk("start=2008-10-01; end=2009-01-01;")).fold(match)); assertSame(2, decodeTemporal(DublinCoreValue.mk("2008-10-01")).fold(match)); assertSame(2, decodeTemporal(DublinCoreValue.mk("2008-10-01T10:30:05Z")).fold(match)); assertSame(1, decodeTemporal(DublinCoreValue.mk("start=2008-10-01T10:20Z; end=2009-01-01; scheme=W3C-DTF")).fold(match)); assertSame(3, decodeTemporal(DublinCoreValue.mk("PT10H5M")).fold(match)); assertEquals(10L * 60 * 60 * 1000 + 5 * 60 * 1000, (long) decodeTemporal(DublinCoreValue.mk("PT10H5M")).fold(durationMatch)); assertEquals(10L * 60 * 60 * 1000 + 5 * 60 * 1000 + 28 * 1000, (long) decodeTemporal(DublinCoreValue.mk("PT10H5M28S")).fold(durationMatch)); } @Test public void testEncodeDuration() { Long d1 = 2743414L; assertEquals(d1, decodeDuration(encodeDuration(d1).getValue())); Long d2 = 78534795325L; assertEquals(d2, decodeDuration(encodeDuration(d2).getValue())); Long d3 = 234L; assertEquals(d3, decodeDuration(encodeDuration(d3).getValue())); assertEquals(new Long(1 * 1000 * 60 * 60 + 10 * 1000 * 60 + 5 * 1000), decodeDuration("01:10:05")); assertEquals(Opt.some(DublinCore.ENC_SCHEME_ISO8601), encodeDuration(d3).getEncodingScheme()); assertNull(decodeDuration(DublinCoreValue.mk("bla"))); assertNull(decodeDuration(DublinCoreValue.mk(encodeDuration(d1).getValue(), DublinCore.LANGUAGE_UNDEFINED, DublinCore.ENC_SCHEME_BOX))); } }