/**
 * Logback: the reliable, generic, fast and flexible logging framework.
 * Copyright (C) 1999-2015, QOS.ch. All rights reserved.
 *
 * This program and the accompanying materials are dual-licensed under
 * either the terms of the Eclipse Public License v1.0 as published by
 * the Eclipse Foundation
 *
 *   or (per the licensee's choosing)
 *
 * under the terms of the GNU Lesser General Public License version 2.1
 * as published by the Free Software Foundation.
 */
package ch.qos.logback.core.rolling.helper;

import java.util.Date;

import junit.framework.TestCase;

public class RollingCalendarTest extends TestCase {

  public RollingCalendarTest(String arg0) {
    super(arg0);
  }

  protected void setUp() throws Exception {
    super.setUp();
  }

  protected void tearDown() throws Exception {
    super.tearDown();
  }

  public void testPeriodicity() {
    {
      RollingCalendar rc = new RollingCalendar();
      assertEquals(PeriodicityType.TOP_OF_SECOND, rc
          .computePeriodicityType("yyyy-MM-dd_HH_mm_ss"));
    }

    {
      RollingCalendar rc = new RollingCalendar();
      assertEquals(PeriodicityType.TOP_OF_MINUTE, rc
          .computePeriodicityType("yyyy-MM-dd_HH_mm"));
    }

    {
      RollingCalendar rc = new RollingCalendar();
      assertEquals(PeriodicityType.TOP_OF_HOUR, rc
          .computePeriodicityType("yyyy-MM-dd_HH"));
    }

    {
      RollingCalendar rc = new RollingCalendar();
      assertEquals(PeriodicityType.TOP_OF_DAY, rc
          .computePeriodicityType("yyyy-MM-dd"));
    }

    {
      RollingCalendar rc = new RollingCalendar();
      assertEquals(PeriodicityType.TOP_OF_MONTH, rc
          .computePeriodicityType("yyyy-MM"));
    }
  }

  public void testVaryingNumberOfHourlyPeriods() {
    RollingCalendar rc = new RollingCalendar();
    rc.init("yyyy-MM-dd_HH");
    long MILLIS_IN_HOUR = 3600*1000;

    for (int p = 100; p > -100; p--) {
      long now = 1223325293589L;  // Mon Oct 06 22:34:53 CEST 2008
      Date result = rc.getRelativeDate(new Date(now), p);
      long expected = now - (now % (MILLIS_IN_HOUR)) + p * MILLIS_IN_HOUR;
      assertEquals(expected, result.getTime());
    }
  }

  public void testVaryingNumberOfDailyPeriods() {
    RollingCalendar rc = new RollingCalendar();
    rc.init("yyyy-MM-dd");
    final long MILLIS_IN_DAY = 24*3600*1000;
    
    for (int p = 20; p > -100; p--) {
      long now = 1223325293589L;  // Mon Oct 06 22:34:53 CEST 2008
      Date nowDate = new Date(now);
      Date result = rc.getRelativeDate(nowDate, p);
      long offset = rc.getTimeZone().getRawOffset()+rc.getTimeZone().getDSTSavings();
    
      long origin = now - ((now + offset) % (MILLIS_IN_DAY));      
      long expected = origin + p * MILLIS_IN_DAY;
      assertEquals("p="+p, expected, result.getTime());
    }
  }
}
