From 69286c6909017d09899f136f68a852c871aa0293 Mon Sep 17 00:00:00 2001 From: Harttle Date: Tue, 7 Dec 2021 23:34:53 +0800 Subject: [PATCH] test: coverage to 100% --- src/builtin/filters/date.ts | 3 ++- src/util/liquid-date.ts | 19 +++++++++++++++++++ src/util/strftime.ts | 16 +--------------- src/util/timezone-date.ts | 18 +++++++++--------- test/unit/fs/loader.ts | 9 +++++++++ test/unit/util/timezon-date.ts | 22 ++++++++++++++++++++++ 6 files changed, 62 insertions(+), 25 deletions(-) create mode 100644 src/util/liquid-date.ts diff --git a/src/builtin/filters/date.ts b/src/builtin/filters/date.ts index f46b2e0b4..6559df36e 100644 --- a/src/builtin/filters/date.ts +++ b/src/builtin/filters/date.ts @@ -1,4 +1,5 @@ -import strftime, { LiquidDate } from '../../util/strftime' +import strftime from '../../util/strftime' +import { LiquidDate } from '../../util/liquid-date' import { isString, isNumber } from '../../util/underscore' import { FilterImpl } from '../../template/filter/filter-impl' import { TimezoneDate } from '../../util/timezone-date' diff --git a/src/util/liquid-date.ts b/src/util/liquid-date.ts new file mode 100644 index 000000000..fb2c348f6 --- /dev/null +++ b/src/util/liquid-date.ts @@ -0,0 +1,19 @@ +/** + * The date interface LiquidJS uses. + * Basically a subset of JavaScript Date, + * it's defined abstractly here to allow different implementation + */ +export interface LiquidDate { + getTime(): number; + getMilliseconds(): number; + getSeconds(): number; + getMinutes(): number; + getHours(): number; + getDay(): number; + getDate(): number; + getMonth(): number; + getFullYear(): number; + getTimezoneOffset(): number; + toLocaleTimeString(): string; + toLocaleDateString(): string; +} diff --git a/src/util/strftime.ts b/src/util/strftime.ts index f3d87ce97..e50dba71a 100644 --- a/src/util/strftime.ts +++ b/src/util/strftime.ts @@ -1,19 +1,5 @@ import { changeCase, padStart, padEnd } from './underscore' - -export interface LiquidDate { - getTime(): number; - getMilliseconds(): number; - getSeconds(): number; - getMinutes(): number; - getHours(): number; - getDay(): number; - getDate(): number; - getMonth(): number; - getFullYear(): number; - getTimezoneOffset(): number; - toLocaleTimeString(): string; - toLocaleDateString(): string; -} +import { LiquidDate } from './liquid-date' const rFormat = /%([-_0^#:]+)?(\d+)?([EO])?(.)/ const monthNames = [ diff --git a/src/util/timezone-date.ts b/src/util/timezone-date.ts index ea1452cdf..283cbc077 100644 --- a/src/util/timezone-date.ts +++ b/src/util/timezone-date.ts @@ -1,4 +1,4 @@ -import { LiquidDate } from './strftime' +import { LiquidDate } from './liquid-date' // one minute in milliseconds const OneMinute = 60000 @@ -13,18 +13,18 @@ const ISO8601_TIMEZONE_PATTERN = /([zZ]|([+-])(\d{2}):(\d{2}))$/ * - rewrite getTimezoneOffset() to trick strftime */ export class TimezoneDate implements LiquidDate { - private timezoneOffset?: number + private timezoneOffset: number private date: Date constructor (init: string | number | Date | TimezoneDate, timezoneOffset: number) { - const diff = (hostTimezoneOffset - timezoneOffset) * OneMinute if (init instanceof TimezoneDate) { this.date = init.date - this.timezoneOffset = init.timezoneOffset + timezoneOffset = init.timezoneOffset } else { + const diff = (hostTimezoneOffset - timezoneOffset) * OneMinute const time = new Date(init).getTime() + diff this.date = new Date(time) - this.timezoneOffset = timezoneOffset } + this.timezoneOffset = timezoneOffset } getTime () { @@ -55,11 +55,11 @@ export class TimezoneDate implements LiquidDate { getFullYear () { return this.date.getFullYear() } - toLocaleTimeString () { - return this.date.toLocaleTimeString() + toLocaleTimeString (locale?: string) { + return this.date.toLocaleTimeString(locale) } - toLocaleDateString () { - return this.date.toLocaleDateString() + toLocaleDateString (locale?: string) { + return this.date.toLocaleDateString(locale) } getTimezoneOffset () { return this.timezoneOffset! diff --git a/test/unit/fs/loader.ts b/test/unit/fs/loader.ts index 21429660b..39b62db08 100644 --- a/test/unit/fs/loader.ts +++ b/test/unit/fs/loader.ts @@ -22,5 +22,14 @@ describe('fs/loader', function () { const candidates = [...loader.candidates('../root-dir/bar', ['/root'], '/root/current', true)] expect(candidates).to.have.lengthOf(0) }) + it('should default `.contains()` to () => true', async function () { + const customFs = { + ...fs, + contains: undefined + } + const loader = new Loader({ relativeReference: true, fs: customFs, extname: '' } as any) + const candidates = [...loader.candidates('../foo/bar', ['/root'], '/root/current', true)] + expect(candidates).to.contain('/foo/bar') + }) }) }) diff --git a/test/unit/util/timezon-date.ts b/test/unit/util/timezon-date.ts index 3ce54631b..ba6b7a06d 100644 --- a/test/unit/util/timezon-date.ts +++ b/test/unit/util/timezon-date.ts @@ -13,4 +13,26 @@ describe('TimezoneDate', () => { expect(date.getTimezoneOffset()).to.equal(-360) expect(date.getMinutes()).to.equal(26) }) + it('should support Date as argument', () => { + const date = new TimezoneDate(new Date('2021-10-06T14:26:00.000+08:00'), 0) + expect(date.getHours()).to.equal(6) + }) + it('should support .getMilliseconds()', () => { + const date = new TimezoneDate('2021-10-06T14:26:00.001+00:00', 0) + expect(date.getMilliseconds()).to.equal(1) + }) + it('should support .getDay()', () => { + const date = new TimezoneDate('2021-12-07T00:00:00.001+08:00', -480) + expect(date.getDay()).to.equal(2) + }) + it('should support .toLocaleTimeString()', () => { + const date = new TimezoneDate('2021-10-06T00:00:00.001+00:00', -480) + expect(date.toLocaleTimeString('en-US')).to.equal('8:00:00 AM') + expect(() => date.toLocaleDateString()).to.not.throw() + }) + it('should support .toLocaleDateString()', () => { + const date = new TimezoneDate('2021-10-06T22:00:00.001+00:00', -480) + expect(date.toLocaleDateString('en-US')).to.equal('10/7/2021') + expect(() => date.toLocaleDateString()).to.not.throw() + }) })