/* * 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(); }); }); });