/*
 * Copyright 2017 HugeGraph Authors
 *
 * 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 com.baidu.hugegraph.unit.util;

import java.util.Date;

import org.junit.Test;

import com.baidu.hugegraph.testutil.Assert;
import com.baidu.hugegraph.unit.BaseUnitTest;
import com.baidu.hugegraph.util.TimeUtil;

public class TimeUtilTest extends BaseUnitTest {

    @Test
    public void testTimeGen() {
        long time = TimeUtil.timeGen();
        long base = TimeUtil.BASE_TIME;
        long difference = time - base - System.currentTimeMillis();
        Assert.assertTrue(difference < 1000);
    }

    @Test
    public void testTimeGenWithDate() {
        @SuppressWarnings("deprecation")
        Date date = new Date(2019 - 1900, 2, 28);
        long time = TimeUtil.timeGen(date);
        Assert.assertEquals(41904000000L, time);
    }

    @Test
    public void testTimeGenWithLong() {
        long date = TimeUtil.BASE_TIME + 123L;
        long time = TimeUtil.timeGen(date);
        Assert.assertEquals(123L, time);
    }

    @Test
    public void testTillNextMillis() {
        for (int i = 0; i < 100; i++) {
            long lastTimestamp = TimeUtil.timeGen();
            long time = TimeUtil.tillNextMillis(lastTimestamp);
            Assert.assertNotEquals(lastTimestamp, time);
        }
    }

    @Test
    public void testReadableTime() {
        Assert.assertEquals("0.001s", TimeUtil.readableTime(1));
        Assert.assertEquals("0.999s", TimeUtil.readableTime(999));
        Assert.assertEquals("1s", TimeUtil.readableTime(1000));
        Assert.assertEquals("1.5s", TimeUtil.readableTime(1500));
        Assert.assertEquals("15s", TimeUtil.readableTime(15 * 1000));
        Assert.assertEquals("59.99s", TimeUtil.readableTime(59990));
        Assert.assertEquals("1m", TimeUtil.readableTime(60000));
        // Ignore milliseconds part
        Assert.assertEquals("1m", TimeUtil.readableTime(60000 + 100));
        Assert.assertEquals("1m 1s", TimeUtil.readableTime(60000 + 1000));
        Assert.assertEquals("1m 1s", TimeUtil.readableTime(60000 + 1200));
        Assert.assertEquals("59m", TimeUtil.readableTime(59 * 60 * 1000));
        Assert.assertEquals("1h", TimeUtil.readableTime(60 * 60 * 1000));
        Assert.assertEquals("1h 1m", TimeUtil.readableTime(60 * 60 * 1000 +
                                                           60 * 1000));
        Assert.assertEquals("23h 59m 59s", TimeUtil.readableTime(
                                                    23 * 60 * 60 * 1000 +
                                                    59 * 60 * 1000 +
                                                    59 * 1000));
        Assert.assertEquals("24h", TimeUtil.readableTime(24 * 60 * 60 * 1000));
        Assert.assertEquals("25h 1m 1s", TimeUtil.readableTime(
                                                    25 * 60 * 60 * 1000 +
                                                    1 * 60 * 1000 +
                                                    1 * 1200));
    }
}