// Copyright (C) 2018 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 {Time} from '../base/time';
import {HighPrecisionTime} from '../common/high_precision_time';

import {PxSpan, TimeScale} from './time_scale';

describe('TimeScale', () => {
  const ts = new TimeScale(
    new HighPrecisionTime(40n),
    100,
    new PxSpan(200, 1000),
  );

  it('converts timescales to pixels', () => {
    expect(ts.timeToPx(Time.fromRaw(40n))).toEqual(200);
    expect(ts.timeToPx(Time.fromRaw(140n))).toEqual(1000);
    expect(ts.timeToPx(Time.fromRaw(90n))).toEqual(600);

    expect(ts.timeToPx(Time.fromRaw(240n))).toEqual(1800);
    expect(ts.timeToPx(Time.fromRaw(-60n))).toEqual(-600);
  });

  it('converts pixels to HPTime objects', () => {
    let result = ts.pxToHpTime(200);
    expect(result.base).toEqual(40n);
    expect(result.offset).toBeCloseTo(0);

    result = ts.pxToHpTime(1000);
    expect(result.base).toEqual(140n);
    expect(result.offset).toBeCloseTo(0);

    result = ts.pxToHpTime(600);
    expect(result.base).toEqual(90n);
    expect(result.offset).toBeCloseTo(0);

    result = ts.pxToHpTime(1800);
    expect(result.base).toEqual(240n);
    expect(result.offset).toBeCloseTo(0);

    result = ts.pxToHpTime(-600);
    expect(result.base).toEqual(-60n);
    expect(result.offset).toBeCloseTo(0);
  });

  it('converts durations to pixels', () => {
    expect(ts.durationToPx(0n)).toEqual(0);
    expect(ts.durationToPx(1n)).toEqual(8);
    expect(ts.durationToPx(1000n)).toEqual(8000);
  });

  it('converts pxDeltaToDurations to HPTime durations', () => {
    let result = ts.pxDeltaToDuration(0);
    expect(result.base).toEqual(0n);
    expect(result.offset).toBeCloseTo(0);

    result = ts.pxDeltaToDuration(1);
    expect(result.base).toEqual(0n);
    expect(result.offset).toBeCloseTo(0.125);

    result = ts.pxDeltaToDuration(100);
    expect(result.base).toEqual(12n);
    expect(result.offset).toBeCloseTo(0.5);
  });
});
