// 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 {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.tpTimeToPx(40n)).toEqual(200);
    expect(ts.tpTimeToPx(140n)).toEqual(1000);
    expect(ts.tpTimeToPx(90n)).toEqual(600);

    expect(ts.tpTimeToPx(240n)).toEqual(1800);
    expect(ts.tpTimeToPx(-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);
  });
});
