/*
 * Copyright (C) 2022 The Android Open Source Project
 *
 * 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.
 */

import {TimestampConverterUtils} from 'test/unit/timestamp_converter_utils';
import {TimeRange} from './time';
import {TIME_UNIT_TO_NANO} from './time_units';

describe('Timestamp', () => {
  describe('arithmetic', () => {
    const REAL_TIMESTAMP_10 = TimestampConverterUtils.makeRealTimestamp(10n);
    const REAL_TIMESTAMP_20 = TimestampConverterUtils.makeRealTimestamp(20n);
    const ELAPSED_TIMESTAMP_10 =
      TimestampConverterUtils.makeElapsedTimestamp(10n);
    const ELAPSED_TIMESTAMP_20 =
      TimestampConverterUtils.makeElapsedTimestamp(20n);

    it('can add', () => {
      let timestamp = REAL_TIMESTAMP_10.add(REAL_TIMESTAMP_20.getValueNs());
      expect(timestamp.getValueNs()).toBe(30n);

      timestamp = ELAPSED_TIMESTAMP_10.add(ELAPSED_TIMESTAMP_20.getValueNs());
      expect(timestamp.getValueNs()).toBe(30n);
    });

    it('can subtract', () => {
      let timestamp = REAL_TIMESTAMP_20.minus(REAL_TIMESTAMP_10.getValueNs());
      expect(timestamp.getValueNs()).toBe(10n);

      timestamp = ELAPSED_TIMESTAMP_20.minus(ELAPSED_TIMESTAMP_10.getValueNs());
      expect(timestamp.getValueNs()).toBe(10n);
    });

    it('can divide', () => {
      let timestamp = TimestampConverterUtils.makeRealTimestamp(10n).div(2n);
      expect(timestamp.getValueNs()).toBe(5n);

      timestamp = ELAPSED_TIMESTAMP_10.div(2n);
      expect(timestamp.getValueNs()).toBe(5n);
    });
  });

  describe('formatting', () => {
    const MILLISECOND = BigInt(TIME_UNIT_TO_NANO.ms);
    const SECOND = BigInt(TIME_UNIT_TO_NANO.s);
    const MINUTE = BigInt(TIME_UNIT_TO_NANO.m);
    const HOUR = BigInt(TIME_UNIT_TO_NANO.h);
    const DAY = BigInt(TIME_UNIT_TO_NANO.d);

    it('elapsed timestamps', () => {
      expect(TimestampConverterUtils.makeElapsedTimestamp(0n).format()).toEqual(
        '0ns',
      );
      expect(
        TimestampConverterUtils.makeElapsedTimestamp(1000n).format(),
      ).toEqual('1000ns');
      expect(
        TimestampConverterUtils.makeElapsedTimestamp(
          10n * MILLISECOND,
        ).format(),
      ).toEqual('10ms0ns');

      expect(
        TimestampConverterUtils.makeElapsedTimestamp(SECOND - 1n).format(),
      ).toEqual('999ms999999ns');
      expect(
        TimestampConverterUtils.makeElapsedTimestamp(SECOND).format(),
      ).toEqual('1s0ms0ns');
      expect(
        TimestampConverterUtils.makeElapsedTimestamp(
          SECOND + MILLISECOND,
        ).format(),
      ).toEqual('1s1ms0ns');

      expect(
        TimestampConverterUtils.makeElapsedTimestamp(MINUTE - 1n).format(),
      ).toEqual('59s999ms999999ns');
      expect(
        TimestampConverterUtils.makeElapsedTimestamp(MINUTE).format(),
      ).toEqual('1m0s0ms0ns');
      expect(
        TimestampConverterUtils.makeElapsedTimestamp(
          MINUTE + SECOND + MILLISECOND,
        ).format(),
      ).toEqual('1m1s1ms0ns');
      expect(
        TimestampConverterUtils.makeElapsedTimestamp(
          MINUTE + SECOND + MILLISECOND + 1n,
        ).format(),
      ).toEqual('1m1s1ms1ns');

      expect(
        TimestampConverterUtils.makeElapsedTimestamp(HOUR - 1n).format(),
      ).toEqual('59m59s999ms999999ns');
      expect(
        TimestampConverterUtils.makeElapsedTimestamp(HOUR).format(),
      ).toEqual('1h0m0s0ms0ns');
      expect(
        TimestampConverterUtils.makeElapsedTimestamp(
          HOUR + MINUTE + SECOND + MILLISECOND,
        ).format(),
      ).toEqual('1h1m1s1ms0ns');

      expect(
        TimestampConverterUtils.makeElapsedTimestamp(DAY - 1n).format(),
      ).toEqual('23h59m59s999ms999999ns');
      expect(
        TimestampConverterUtils.makeElapsedTimestamp(DAY).format(),
      ).toEqual('1d0h0m0s0ms0ns');
      expect(
        TimestampConverterUtils.makeElapsedTimestamp(
          DAY + HOUR + MINUTE + SECOND + MILLISECOND,
        ).format(),
      ).toEqual('1d1h1m1s1ms0ns');
    });

    it('real timestamps without timezone info', () => {
      const NOV_10_2022 = 1668038400000n * MILLISECOND;
      expect(TimestampConverterUtils.makeRealTimestamp(0n).format()).toEqual(
        '1970-01-01, 00:00:00.000',
      );
      expect(
        TimestampConverterUtils.makeRealTimestamp(
          NOV_10_2022 +
            22n * HOUR +
            4n * MINUTE +
            54n * SECOND +
            186n * MILLISECOND +
            123212n,
        ).format(),
      ).toEqual('2022-11-10, 22:04:54.186');
      expect(
        TimestampConverterUtils.makeRealTimestamp(NOV_10_2022).format(),
      ).toEqual('2022-11-10, 00:00:00.000');
      expect(
        TimestampConverterUtils.makeRealTimestamp(NOV_10_2022 + 1n).format(),
      ).toEqual('2022-11-10, 00:00:00.000');

      expect(TimestampConverterUtils.makeRealTimestamp(0n).format()).toEqual(
        '1970-01-01, 00:00:00.000',
      );
      expect(
        TimestampConverterUtils.makeRealTimestamp(
          NOV_10_2022 +
            22n * HOUR +
            4n * MINUTE +
            54n * SECOND +
            186n * MILLISECOND +
            123212n,
        ).format(),
      ).toEqual('2022-11-10, 22:04:54.186');
      expect(
        TimestampConverterUtils.makeRealTimestamp(NOV_10_2022).format(),
      ).toEqual('2022-11-10, 00:00:00.000');
      expect(
        TimestampConverterUtils.makeRealTimestamp(NOV_10_2022 + 1n).format(),
      ).toEqual('2022-11-10, 00:00:00.000');
    });

    it('real timestamps with timezone info', () => {
      const NOV_10_2022 = 1668038400000n * MILLISECOND;
      expect(
        TimestampConverterUtils.TIMESTAMP_CONVERTER_WITH_UTC_OFFSET.makeTimestampFromRealNs(
          0n,
        ).format(),
      ).toEqual('1970-01-01, 05:30:00.000');
      expect(
        TimestampConverterUtils.TIMESTAMP_CONVERTER_WITH_UTC_OFFSET.makeTimestampFromRealNs(
          NOV_10_2022 +
            22n * HOUR +
            4n * MINUTE +
            54n * SECOND +
            186n * MILLISECOND +
            123212n,
        ).format(),
      ).toEqual('2022-11-11, 03:34:54.186');
      expect(
        TimestampConverterUtils.TIMESTAMP_CONVERTER_WITH_UTC_OFFSET.makeTimestampFromRealNs(
          NOV_10_2022,
        ).format(),
      ).toEqual('2022-11-10, 05:30:00.000');
      expect(
        TimestampConverterUtils.TIMESTAMP_CONVERTER_WITH_UTC_OFFSET.makeTimestampFromRealNs(
          NOV_10_2022 + 1n,
        ).format(),
      ).toEqual('2022-11-10, 05:30:00.000');

      expect(
        TimestampConverterUtils.TIMESTAMP_CONVERTER_WITH_UTC_OFFSET.makeTimestampFromRealNs(
          0n,
        ).format(),
      ).toEqual('1970-01-01, 05:30:00.000');
      expect(
        TimestampConverterUtils.TIMESTAMP_CONVERTER_WITH_UTC_OFFSET.makeTimestampFromRealNs(
          NOV_10_2022 +
            22n * HOUR +
            4n * MINUTE +
            54n * SECOND +
            186n * MILLISECOND +
            123212n,
        ).format(),
      ).toEqual('2022-11-11, 03:34:54.186');
      expect(
        TimestampConverterUtils.TIMESTAMP_CONVERTER_WITH_UTC_OFFSET.makeTimestampFromRealNs(
          NOV_10_2022,
        ).format(),
      ).toEqual('2022-11-10, 05:30:00.000');
      expect(
        TimestampConverterUtils.TIMESTAMP_CONVERTER_WITH_UTC_OFFSET.makeTimestampFromRealNs(
          NOV_10_2022 + 1n,
        ).format(),
      ).toEqual('2022-11-10, 05:30:00.000');
    });
  });
});

describe('TimeRange', () => {
  describe('containsTimestamp', () => {
    const range = new TimeRange(
      TimestampConverterUtils.TIMESTAMP_CONVERTER.makeTimestampFromNs(10n),
      TimestampConverterUtils.TIMESTAMP_CONVERTER.makeTimestampFromNs(600n),
    );

    it('returns true for range containing timestamp', () => {
      expect(
        range.containsTimestamp(
          TimestampConverterUtils.TIMESTAMP_CONVERTER.makeTimestampFromNs(10n),
        ),
      ).toBeTrue();

      expect(
        range.containsTimestamp(
          TimestampConverterUtils.TIMESTAMP_CONVERTER.makeTimestampFromNs(600n),
        ),
      ).toBeTrue();

      expect(
        range.containsTimestamp(
          TimestampConverterUtils.TIMESTAMP_CONVERTER.makeTimestampFromNs(300n),
        ),
      ).toBeTrue();
    });

    it('returns false for range not containing timestamp', () => {
      expect(
        range.containsTimestamp(
          TimestampConverterUtils.TIMESTAMP_CONVERTER.makeTimestampFromNs(0n),
        ),
      ).toBeFalse();

      expect(
        range.containsTimestamp(
          TimestampConverterUtils.TIMESTAMP_CONVERTER.makeTimestampFromNs(601n),
        ),
      ).toBeFalse();
    });
  });
});
