| 1 | /** |
| 2 | * Copyright (c) Meta Platforms, Inc. and affiliates. |
| 3 | * |
| 4 | * This source code is licensed under the MIT license found in the |
| 5 | * LICENSE file in the root directory of this source tree. |
| 6 | */ |
| 7 | |
| 8 | import {setCurrentLanguage} from '../i18n'; |
| 9 | import {relativeDate} from '../relativeDate'; |
| 10 | |
| 11 | describe('relativeDate', () => { |
| 12 | const SECOND = 1000; |
| 13 | const MINUTE = 60 * SECOND; |
| 14 | const HOUR = 60 * MINUTE; |
| 15 | const DAY = 24 * HOUR; |
| 16 | const WEEK = 7 * DAY; |
| 17 | const YEAR = DAY * 365; |
| 18 | const MONTH = YEAR / 12; |
| 19 | |
| 20 | const reference = 157765000000; // 01.01.1975 00:00 |
| 21 | const now = new Date().getTime(); |
| 22 | |
| 23 | const check = (time: number) => expect(relativeDate(time, {reference})); |
| 24 | const checkShort = (time: number) => |
| 25 | expect(relativeDate(time, {reference, useShortVariant: true})); |
| 26 | |
| 27 | describe('en', () => { |
| 28 | beforeAll(() => { |
| 29 | setCurrentLanguage('en'); |
| 30 | }); |
| 31 | |
| 32 | it('renders relative dates', () => { |
| 33 | expect(relativeDate(new Date(), {})).toEqual('just now'); |
| 34 | |
| 35 | // test long format |
| 36 | expect(relativeDate(0, {})).toEqual(Math.round(now / YEAR) + ' years ago'); |
| 37 | check(reference - 41 * SECOND).toEqual('just now'); |
| 38 | check(reference - 42 * SECOND).toEqual('a minute ago'); |
| 39 | check(reference - MINUTE).toEqual('a minute ago'); |
| 40 | check(reference - MINUTE * 1.5).toEqual('2 minutes ago'); |
| 41 | check(reference - MINUTE * 59).toEqual('59 minutes ago'); |
| 42 | check(reference - HOUR).toEqual('an hour ago'); |
| 43 | check(reference - HOUR * 1.5).toEqual('2 hours ago'); |
| 44 | check(reference - HOUR * 16).toEqual('16 hours ago'); |
| 45 | check(reference - HOUR * 23).toEqual('23 hours ago'); |
| 46 | check(reference - DAY * 1.8).toEqual('yesterday'); |
| 47 | check(reference - DAY * 3).toEqual('3 days ago'); |
| 48 | check(reference - DAY * 6).toEqual('6 days ago'); |
| 49 | check(reference - WEEK).toEqual('a week ago'); |
| 50 | check(reference - WEEK * 2).toEqual('2 weeks ago'); |
| 51 | check(reference - WEEK * 4).toEqual('4 weeks ago'); |
| 52 | check(reference - MONTH * 1.2).toEqual('a month ago'); |
| 53 | check(reference - YEAR + HOUR).toEqual('12 months ago'); |
| 54 | check(reference - YEAR).toEqual('a year ago'); |
| 55 | check(reference - YEAR * 2).toEqual('2 years ago'); |
| 56 | }); |
| 57 | |
| 58 | it('renders short relative dates', () => { |
| 59 | // test short format |
| 60 | checkShort(reference - 41 * SECOND).toEqual('now'); |
| 61 | checkShort(reference - 42 * SECOND).toEqual('1m'); |
| 62 | checkShort(reference - MINUTE).toEqual('1m'); |
| 63 | checkShort(reference - MINUTE * 1.5).toEqual('2m'); |
| 64 | checkShort(reference - MINUTE * 59).toEqual('59m'); |
| 65 | checkShort(reference - HOUR).toEqual('1h'); |
| 66 | checkShort(reference - HOUR * 1.5).toEqual('2h'); |
| 67 | checkShort(reference - HOUR * 16).toEqual('16h'); |
| 68 | checkShort(reference - HOUR * 23).toEqual('23h'); |
| 69 | checkShort(reference - DAY * 1.8).toEqual('1d'); |
| 70 | checkShort(reference - DAY * 3).toEqual('3d'); |
| 71 | checkShort(reference - DAY * 6).toEqual('6d'); |
| 72 | checkShort(reference - WEEK).toEqual('1w'); |
| 73 | checkShort(reference - WEEK * 2).toEqual('2w'); |
| 74 | checkShort(reference - WEEK * 4).toEqual('4w'); |
| 75 | checkShort(reference - MONTH * 1.2).toEqual('1mo'); |
| 76 | checkShort(reference - YEAR + HOUR).toEqual('12mo'); |
| 77 | checkShort(reference - YEAR).toEqual('1y'); |
| 78 | checkShort(reference - YEAR * 2).toEqual('2y'); |
| 79 | }); |
| 80 | }); |
| 81 | |
| 82 | describe('de', () => { |
| 83 | beforeAll(() => { |
| 84 | setCurrentLanguage('de'); |
| 85 | }); |
| 86 | it('renders relative dates', () => { |
| 87 | check(reference - 41 * SECOND).toEqual('vor 1 Min.'); |
| 88 | check(reference - 42 * SECOND).toEqual('vor 1 Min.'); |
| 89 | check(reference - MINUTE).toEqual('vor 1 Min.'); |
| 90 | check(reference - MINUTE * 1.5).toEqual('vor 2 Min.'); |
| 91 | check(reference - MINUTE * 59).toEqual('vor 59 Min.'); |
| 92 | check(reference - HOUR).toEqual('vor 60 Min.'); |
| 93 | check(reference - HOUR * 1.5).toEqual('vor 2 Std.'); |
| 94 | check(reference - HOUR * 16).toEqual('vor 16 Std.'); |
| 95 | check(reference - HOUR * 23).toEqual('vor 23 Std.'); |
| 96 | check(reference - DAY * 1.8).toEqual('vorgestern'); |
| 97 | check(reference - DAY * 3).toEqual('vor 3 Tagen'); |
| 98 | check(reference - DAY * 6).toEqual('vor 6 Tagen'); |
| 99 | check(reference - WEEK).toEqual('vor 7 Tagen'); |
| 100 | check(reference - WEEK * 2).toEqual('vor 14 Tagen'); |
| 101 | check(reference - WEEK * 4).toEqual('vor 28 Tagen'); |
| 102 | check(reference - MONTH * 1.2).toEqual('letzten Monat'); |
| 103 | // check(reference - YEAR + HOUR).toEqual('vor 12 Monaten'); // some kind of whitespace issue |
| 104 | // check(reference - YEAR).toEqual('vor 12 Monaten'); // some kind of whitespace issue |
| 105 | check(reference - YEAR * 2).toEqual('vor 2 Jahren'); |
| 106 | |
| 107 | check(reference + 2 * HOUR).toEqual('in 2 Std.'); |
| 108 | check(reference + MINUTE).toEqual('in 1 Min.'); |
| 109 | }); |
| 110 | }); |
| 111 | }); |
| 112 | |