/*_############################################################################
  _##
  _##  SNMP4J-Agent 2 - DateAndTimeTest.java
  _##
  _##  Copyright (C) 2005-2014  Frank Fock (SNMP4J.org)
  _##
  _##  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 org.snmp4j.agent.mo.snmp;

import org.junit.Assert;
import org.junit.Test;
import org.snmp4j.smi.OctetString;

import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.TimeZone;

import static org.junit.Assert.*;

public class DateAndTimeTest {

  @Test
  public void testMakeDateAndTime() throws Exception {
    GregorianCalendar calendar = (GregorianCalendar) Calendar.getInstance();
    calendar.setTimeZone(TimeZone.getTimeZone("GMT+1"));
    OctetString dateOctetString = DateAndTime.makeDateAndTime(calendar);
    Assert.assertTrue(dateOctetString.toHexString().endsWith("2b:01:00"));

    calendar = (GregorianCalendar) Calendar.getInstance();
    calendar.setTimeZone(TimeZone.getTimeZone("GMT-1"));
    dateOctetString = DateAndTime.makeDateAndTime(calendar);
    Assert.assertTrue(dateOctetString.toHexString().endsWith("2d:01:00"));

  }

  @Test
  public void testDateAndTime() throws Exception {
    // 1st april 2016 UTC 00:00:00
    long testMillis = 1459468800000L;
    for (String timeZoneId : TimeZone.getAvailableIDs()) {
      GregorianCalendar gc = new
          GregorianCalendar(TimeZone.getTimeZone(timeZoneId));
      gc.setTimeInMillis(testMillis);
      OctetString dateAndTime = DateAndTime.makeDateAndTime(gc);
      int error = DateAndTime.validateDateAndTime(dateAndTime);
      assertEquals(0, error);
      // check the makeCalendar from the generated DateAndTime
      GregorianCalendar parsedGc = DateAndTime.makeCalendar(dateAndTime);
      long parsedGcMillis = parsedGc.getTimeInMillis();
      /*
      System.out.println(String.format("[%32s] The parsed millis %s: %5.1f hours (" + gc
                  .getTime()+gc.getTimeZone() + " " + parsedGc.getTime()+parsedGc.getTimeZone() + ")", timeZoneId,
              (parsedGcMillis != testMillis ? "differs" : "equals "),
              (parsedGcMillis - testMillis) / 3600000.0));
      */
      assertEquals(testMillis/60000, parsedGcMillis/60000);
    }
  }
}