// Copyright (C) 2019 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 {Duration, Time, Timecode, TimeSpan} from '../base/time';

test('Duration.format', () => {
  expect(Duration.format(0n)).toEqual('0s');
  expect(Duration.format(3_000_000_000n)).toEqual('3s');
  expect(Duration.format(60_000_000_000n)).toEqual('1m');
  expect(Duration.format(63_000_000_000n)).toEqual('1m 3s');
  expect(Duration.format(63_200_000_000n)).toEqual('1m 3s 200ms');
  expect(Duration.format(63_222_100_000n)).toEqual('1m 3s 222ms 100us');
  expect(Duration.format(63_222_111_100n)).toEqual('1m 3s 222ms 111us 100ns');
  expect(Duration.format(222_111_100n)).toEqual('222ms 111us 100ns');
  expect(Duration.format(1_000n)).toEqual('1us');
  expect(Duration.format(3_000n)).toEqual('3us');
  expect(Duration.format(1_000_001_000n)).toEqual('1s 1us');
  expect(Duration.format(200_000_000_030n)).toEqual('3m 20s 30ns');
  expect(Duration.format(3_600_000_000_000n)).toEqual('1h');
  expect(Duration.format(3_600_000_000_001n)).toEqual('1h 1ns');
  expect(Duration.format(86_400_000_000_000n)).toEqual('24h');
  expect(Duration.format(86_400_000_000_001n)).toEqual('24h 1ns');
  expect(Duration.format(31_536_000_000_000_000n)).toEqual('8,760h');
  expect(Duration.format(31_536_000_000_000_001n)).toEqual('8,760h 1ns');
});

test('Duration.humanise', () => {
  expect(Duration.humanise(0n)).toEqual('0s');
  expect(Duration.humanise(123n)).toEqual('123ns');
  expect(Duration.humanise(1_234n)).toEqual('1.2us');
  expect(Duration.humanise(12_345n)).toEqual('12.3us');
  expect(Duration.humanise(3_000_000_000n)).toEqual('3s');
  expect(Duration.humanise(60_000_000_000n)).toEqual('60s');
  expect(Duration.humanise(63_000_000_000n)).toEqual('63s');
  expect(Duration.humanise(63_200_000_000n)).toEqual('63.2s');
  expect(Duration.humanise(63_222_100_000n)).toEqual('63.2s');
  expect(Duration.humanise(63_222_111_100n)).toEqual('63.2s');
  expect(Duration.humanise(222_111_100n)).toEqual('222.1ms');
  expect(Duration.humanise(1_000n)).toEqual('1us');
  expect(Duration.humanise(3_000n)).toEqual('3us');
  expect(Duration.humanise(1_000_001_000n)).toEqual('1s');
  expect(Duration.humanise(200_000_000_030n)).toEqual('200s');
  expect(Duration.humanise(3_600_000_000_000n)).toEqual('3600s');
  expect(Duration.humanise(86_400_000_000_000n)).toEqual('86400s');
  expect(Duration.humanise(31_536_000_000_000_000n)).toEqual('31536000s');
});

test('Duration.fromMillis', () => {
  expect(Duration.fromMillis(123.456789)).toEqual(123456789n);
  expect(Duration.fromMillis(123.4567895)).toEqual(123456789n);
  expect(Duration.fromMillis(0.0000001)).toEqual(0n);
});

test('timecode', () => {
  expect(new Timecode(Time.fromRaw(0n)).toString(' ')).toEqual(
    '00:00:00.000 000 000',
  );
  expect(new Timecode(Time.fromRaw(123n)).toString(' ')).toEqual(
    '00:00:00.000 000 123',
  );
  expect(new Timecode(Time.fromRaw(60_000_000_000n)).toString(' ')).toEqual(
    '00:01:00.000 000 000',
  );
  expect(new Timecode(Time.fromRaw(12_345_678_910n)).toString(' ')).toEqual(
    '00:00:12.345 678 910',
  );
  expect(new Timecode(Time.fromRaw(86_400_000_000_000n)).toString(' ')).toEqual(
    '1d00:00:00.000 000 000',
  );
  expect(
    new Timecode(Time.fromRaw(31_536_000_000_000_000n)).toString(' '),
  ).toEqual('365d00:00:00.000 000 000');
  expect(new Timecode(Time.fromRaw(-123n)).toString(' ')).toEqual(
    '-00:00:00.000 000 123',
  );
});

function mkSpan(start: bigint, end: bigint) {
  return new TimeSpan(Time.fromRaw(start), Time.fromRaw(end));
}

describe('TimeSpan', () => {
  it('throws when start is later than end', () => {
    expect(() => mkSpan(1n, 0n)).toThrow();
  });

  it('can calc duration', () => {
    expect(mkSpan(10n, 20n).duration).toBe(10n);
  });

  it('can calc midpoint', () => {
    expect(mkSpan(10n, 20n).midpoint).toBe(15n);
    expect(mkSpan(10n, 19n).midpoint).toBe(14n);
    expect(mkSpan(10n, 10n).midpoint).toBe(10n);
  });

  it('can be compared', () => {
    const x = mkSpan(10n, 20n);
    expect(x.equals(mkSpan(10n, 20n))).toBeTruthy();
    expect(x.equals(mkSpan(11n, 20n))).toBeFalsy();
    expect(x.equals(mkSpan(10n, 19n))).toBeFalsy();
  });

  it('checks containment', () => {
    const x = mkSpan(10n, 20n);

    expect(x.contains(Time.fromRaw(9n))).toBeFalsy();
    expect(x.contains(Time.fromRaw(10n))).toBeTruthy();
    expect(x.contains(Time.fromRaw(15n))).toBeTruthy();
    expect(x.contains(Time.fromRaw(20n))).toBeFalsy();
    expect(x.contains(Time.fromRaw(21n))).toBeFalsy();

    expect(x.contains(mkSpan(12n, 18n))).toBeTruthy();
    expect(x.contains(mkSpan(5n, 25n))).toBeFalsy();
    expect(x.contains(mkSpan(5n, 15n))).toBeFalsy();
    expect(x.contains(mkSpan(15n, 25n))).toBeFalsy();
    expect(x.contains(mkSpan(0n, 10n))).toBeFalsy();
    expect(x.contains(mkSpan(20n, 30n))).toBeFalsy();
  });

  it('checks intersection with span', () => {
    const x = mkSpan(10n, 20n);

    expect(x.intersectsInterval(mkSpan(0n, 10n))).toBeFalsy();
    expect(x.intersectsInterval(mkSpan(5n, 15n))).toBeTruthy();
    expect(x.intersectsInterval(mkSpan(12n, 18n))).toBeTruthy();
    expect(x.intersectsInterval(mkSpan(15n, 25n))).toBeTruthy();
    expect(x.intersectsInterval(mkSpan(20n, 30n))).toBeFalsy();
    expect(x.intersectsInterval(mkSpan(5n, 25n))).toBeTruthy();
  });

  it('checks intersection', () => {
    const x = mkSpan(10n, 20n);

    expect(x.intersects(Time.fromRaw(0n), Time.fromRaw(10n))).toBeFalsy();
    expect(x.intersects(Time.fromRaw(5n), Time.fromRaw(15n))).toBeTruthy();
    expect(x.intersects(Time.fromRaw(12n), Time.fromRaw(18n))).toBeTruthy();
    expect(x.intersects(Time.fromRaw(15n), Time.fromRaw(25n))).toBeTruthy();
    expect(x.intersects(Time.fromRaw(20n), Time.fromRaw(30n))).toBeFalsy();
    expect(x.intersects(Time.fromRaw(5n), Time.fromRaw(25n))).toBeTruthy();
  });

  it('can add', () => {
    const x = mkSpan(10n, 20n);
    expect(x.add(5n)).toEqual(mkSpan(15n, 25n));
  });

  it('can pad', () => {
    const x = mkSpan(10n, 20n);
    expect(x.pad(5n)).toEqual(mkSpan(5n, 25n));
  });
});
