Files
TREK/client/tests/unit/studio/entryText.test.ts
T
Maurice 4570ace78c feat(journey): the shared book engine lays out, edits and designs whole books
Every element kind and Studio tool gets an op, the auto layout and its
templates move from the client to shared with a parity fixture, and a pure
design engine turns directives into a finished book with design findings.
2026-10-22 21:34:15 +00:00

66 lines
2.6 KiB
TypeScript

import { describe, it, expect } from 'vitest'
import { formatBookCoords, formatBookDate } from '@trek/shared'
/**
* The strings a journal entry lends to a page (#1973).
*
* These are pinned rather than sampled, because three call sites have to agree
* on them character for character: the chip that places a mark, the template
* filler that fills one that was drawn, and the resolver that re-reads it when
* the book is opened. If the chip and the resolver ever disagree by a space,
* opening a book rewrites the element and the autosave writes it back, which
* looks like a book that edits itself.
*
* The degrees form is also the one already printed by the auto layout and by
* the Travel panel, so changing it here changes what is on pages people have
* already made.
*/
describe('coordinates', () => {
it('sets degrees, minutes and seconds with a hemisphere letter', () => {
expect(formatBookCoords(52.5163, 13.3777)).toBe(`52° 30' 59" N 13° 22' 40" E`)
})
it('says south and west rather than using a minus sign', () => {
// A printed page has no room for a sign somebody has to decode, and the
// letter is unambiguous in a way -33.8688 is not.
expect(formatBookCoords(-33.8688, -70.6693)).toBe(`33° 52' 8" S 70° 40' 9" W`)
})
it('sets the decimal form to four places, which is about eleven metres', () => {
expect(formatBookCoords(52.5163, 13.3777, 'decimal')).toBe('52.5163° N 13.3777° E')
})
it('keeps the hemisphere letter in the decimal form too', () => {
expect(formatBookCoords(-33.8688, -70.6693, 'decimal')).toBe('33.8688° S 70.6693° W')
})
it('defaults to degrees, which is what the rest of Studio prints', () => {
expect(formatBookCoords(10, 20)).toBe(formatBookCoords(10, 20, 'dms'))
})
})
describe('the entry date', () => {
it('spells the month out, in the app language', () => {
expect(formatBookDate('2026-06-12', 'de-DE')).toBe('12. Juni 2026')
expect(formatBookDate('2026-06-12', 'en-GB')).toBe('12 June 2026')
})
/*
* Local midnight, not UTC. The date on an entry is the day the writer had,
* and reading it as an instant moves it backwards for everyone west of
* Greenwich, which is a photo book dated the day before the photographs.
*/
it('reads the day as a day rather than as a moment in time', () => {
expect(formatBookDate('2026-01-01', 'en-GB')).toBe('1 January 2026')
})
it('gives nothing back for an entry with no date', () => {
expect(formatBookDate(null, 'en-GB')).toBe('')
})
it('gives nothing back rather than printing Invalid Date', () => {
expect(formatBookDate('not-a-date', 'en-GB')).toBe('')
})
})