time/TimeReplacer.test.ts

Summary

Maintainability
F
6 days
Test Coverage
import { TimeReplacer } from "./TimeReplacer"
import { rr0TestUtil } from "../test/RR0TestUtil"
import { describe, expect, test } from "@javarome/testscript"

describe("TimeReplacer", () => {

  test("parses year", () => {
    {
      const context = rr0TestUtil.newHtmlContext("time/1/9/9/0/08/index.html", "")
      const replacer = new TimeReplacer(["time/2/0/0/3/index.html"])
      expect(replacer.valueReplacement(context, "2003", undefined).outerHTML).toBe(`<a href="/time/2/0/0/3/">2003</a>`)
      expect(context.time.getYear()).toBe(2003)
      expect(context.time.getMonth()).toBe(undefined)
      expect(context.time.getDayOfMonth()).toBe(undefined)
      expect(context.time.getHour()).toBe(undefined)
      expect(context.time.getMinutes()).toBe(undefined)
      expect(context.time.getTimeZone()).toBe(undefined)
    }
    {
      const context = rr0TestUtil.newHtmlContext("time/1/9/9/0/08/index.html", "")
      const replacer = new TimeReplacer(["time/2/0/2/5/index.html"])
      expect(replacer.valueReplacement(context, "2025\n      ", undefined).outerHTML).toBe(
        `<a href="/time/2/0/2/5/">2025</a>`)
      expect(context.time.getYear()).toBe(2025)
      expect(context.time.getMonth()).toBe(undefined)
      expect(context.time.getDayOfMonth()).toBe(undefined)
      expect(context.time.getHour()).toBe(undefined)
      expect(context.time.getMinutes()).toBe(undefined)
      expect(context.time.getTimeZone()).toBe(undefined)
    }
  })

  test("parses interval", async () => {
    const context = rr0TestUtil.newHtmlContext("time/1/9/9/0/08/index.html", "")
    const interval = "2012/2016"
    const replacer = new TimeReplacer(["time/2/0/1/2/index.html", "time/2/0/1/6/index.html"])
    const original = context.outputFile.document.createElement("time")
    original.textContent = interval
    const replaced = await replacer.replacement(context, original)
    expect(replaced.outerHTML)
      .toBe(`<span class="time-interval"><a href="/time/2/0/1/2/">2012</a> à <a href="/time/2/0/1/6/">2016</a></span>`)
    expect(context.time.getYear()).toBe(2016)
    expect(context.time.getMonth()).toBe(undefined)
    expect(context.time.getDayOfMonth()).toBe(undefined)
    expect(context.time.getHour()).toBe(undefined)
    expect(context.time.getMinutes()).toBe(undefined)
    expect(context.time.getTimeZone()).toBe(undefined)
  })

  test("parses unsupported", async () => {
    const context = rr0TestUtil.newHtmlContext("time/1/9/9/0/08/index.html", "")
    const interval = "moi"
    const replacer = new TimeReplacer([])
    const original = context.outputFile.document.createElement("time")
    original.textContent = interval
    const replacement = await replacer.replacement(context, original)
    expect(replacement.outerHTML).toBe(`<time>moi</time>`)
    expect(context.time.getYear()).toBe(undefined)
    expect(context.time.getMonth()).toBe(undefined)
    expect(context.time.getDayOfMonth()).toBe(undefined)
    expect(context.time.getHour()).toBe(undefined)
    expect(context.time.getMinutes()).toBe(undefined)
    expect(context.time.getTimeZone()).toBe(undefined)
  })

  test("parses timezone", async () => {
    {
      const context = rr0TestUtil.newHtmlContext("time/1/9/9/0/08/index.html", "")
      const interval = "2003-12-24CDT"
      const replacer = new TimeReplacer(["time/2/0/0/3/12/24/index.html"])
      const original = context.outputFile.document.createElement("time")
      original.textContent = interval
      const replacement = await replacer.replacement(context, original)
      expect(replacement.outerHTML)
        .toBe(`<a href="/time/2/0/0/3/12/24/">mercredi 24 décembre 2003</a>`)  // TODO: Text should have timezone info
      expect(context.time.getYear()).toBe(2003)
      expect(context.time.getMonth()).toBe(12)
      expect(context.time.getDayOfMonth()).toBe(24)
      expect(context.time.getHour()).toBe(undefined)
      expect(context.time.getMinutes()).toBe(undefined)
      expect(context.time.getTimeZone()).toBe("CDT")
    }
    /*{
      const context = rr0TestUtil.newHtmlContext("time/1/9/9/0/08/index.html", "")
      const interval = "2003-12-24 (CDT)"
      const replacer = new TimeReplacer(["time/2/0/0/3/12/24"])
      expect(replacer.replacement(context, `<time>${interval}</time>`, interval))
        .toBe(`<a href="/time/2/0/0/3/12/24/">mercredi 24 décembre 2003</a>`)  // TODO: Text should have timezone info
      expect(context.time.getYear()).toBe(2003)
      expect(context.time.getMonth()).toBe(12)
      expect(context.time.getDayOfMonth()).toBe(24)
      expect(context.time.getHour()).toBe(undefined)
      expect(context.time.getMinutes()).toBe(undefined)
      expect(context.time.getTimeZone()).toBe("CDT")
    }*/
  })

  test("parses month", async () => {
    const context = rr0TestUtil.newHtmlContext("time/1/9/9/0/08/index.html", "")
    let value = "2004-09"
    const original = context.outputFile.document.createElement("time")
    original.textContent = value
    const replacer = new TimeReplacer(["time/2/0/0/4/09/index.html"])
    const replacement = await replacer.replacement(context, original)
    expect(replacement.outerHTML).toBe(`<a href="/time/2/0/0/4/09/">septembre 2004</a>`)
    expect(context.time.getYear()).toBe(2004)
    expect(context.time.getMonth()).toBe(9)
    expect(context.time.getDayOfMonth()).toBe(undefined)
    expect(context.time.getHour()).toBe(undefined)
    expect(context.time.getMinutes()).toBe(undefined)
  })

  describe("parses day", () => {

    test("from full date", () => {
      const context = rr0TestUtil.newHtmlContext("time/1/9/9/0/08/index.html", "")
      const replacer = new TimeReplacer(["time/2/0/0/5/08/23/index.html"])
      const replacement = replacer.valueReplacement(context, "2005-08-23", undefined)
      expect(replacement.outerHTML).toBe(`<a href="/time/2/0/0/5/08/23/">mardi 23 août 2005</a>`)
      expect(context.time.getYear()).toBe(2005)
      expect(context.time.getMonth()).toBe(8)
      expect(context.time.getDayOfMonth()).toBe(23)
      expect(context.time.getHour()).toBe(undefined)
      expect(context.time.getMinutes()).toBe(undefined)
    })

    test("from current date", () => {
      const context = rr0TestUtil.newHtmlContext("time/1/9/9/0/08/index.html", "")
      context.time.setYear(2005)
      context.time.setMonth(8)
      const replacer = new TimeReplacer(["time/2/0/0/5/08/23/index.html"])
      const replacement2 = replacer.valueReplacement(context, "23", undefined)
      expect(replacement2.outerHTML)
        .toBe(`<a href="/time/2/0/0/5/08/23/" title="mardi 23 août 2005">mardi 23</a>`)
      expect(context.time.getYear()).toBe(2005)
      expect(context.time.getMonth()).toBe(8)
      expect(context.time.getDayOfMonth()).toBe(23)
      expect(context.time.getHour()).toBe(undefined)
      expect(context.time.getMinutes()).toBe(undefined)
    })

    test("with hour", () => {
      const context = rr0TestUtil.newHtmlContext("time/1/9/9/0/08/index.html", "")
      context.time.setYear(2005)
      context.time.setMonth(8)
      const replacer = new TimeReplacer(["time/2/0/0/5/08/23/index.html"])
      const replacement1 = replacer.valueReplacement(context, "23 18:45", undefined)
      expect(replacement1.outerHTML)
        .toBe(`<a href="/time/2/0/0/5/08/23/" title="mardi 23 août 2005 à 18:45">mardi 23 18:45</a>`)
      expect(context.time.getYear()).toBe(2005)
      expect(context.time.getMonth()).toBe(8)
      expect(context.time.getDayOfMonth()).toBe(23)
      expect(context.time.getHour()).toBe(18)
      expect(context.time.getMinutes()).toBe(45)
    })

    test("with hour interval", () => {
      const context = rr0TestUtil.newHtmlContext("time/1/9/9/0/08/index.html", "")
      context.time.setYear(2005)
      context.time.setMonth(8)
      const replacer = new TimeReplacer(["time/2/0/0/5/08/23/index.html"])
      const replacement = replacer.valueReplacement(context, "23 18:45/19:00", undefined)
      expect(replacement.outerHTML)
        .toBe(
          `<a href="/time/2/0/0/5/08/23/" title="mardi 23 août 2005 entre 18:45 et 19:00">mardi 23, entre 18:45 et 19:00</a>`)
      expect(context.time.getYear()).toBe(2005)
      expect(context.time.getMonth()).toBe(8)
      expect(context.time.getDayOfMonth()).toBe(23)
      expect(context.time.getHour()).toBe(18)
      expect(context.time.getMinutes()).toBe(45)
    })
  })

  test("reset context", async () => {
    const context = rr0TestUtil.newHtmlContext("time/1/9/9/0/08/index.html", "")
    const replacer = new TimeReplacer(["time/2/0/0/5/index.html", "time/2/0/0/6/index.html"])
    const replacement = replacer.valueReplacement(context, "2005", undefined)
    expect(replacement.outerHTML).toBe(`<a href="/time/2/0/0/5/">2005</a>`)
    const original = context.outputFile.document.createElement("time")
    original.textContent = "2006"
    const replacement2 = await replacer.replacement(context, original)
    expect(replacement2.outerHTML)
      .toBe(`<a href="/time/2/0/0/6/">2006</a>`)
  })

  test("avoids linking to current file", async () => {
    const context = rr0TestUtil.newHtmlContext("time/1/9/5/4/10/01/index.html", "")
    const replacer = new TimeReplacer(["time/1/9/5/4/10/01"])
    const original = context.outputFile.document.createElement("time")
    original.textContent = "1954-10-01"
    const replacement = await replacer.replacement(context, original)
    expect(replacement.outerHTML)
      .toBe(`<span class="time">vendredi 1 octobre 1954</span>`)
  })

  describe("parse duration", () => {

    test("with days, hours, minutes and seconds", async () => {
      const context = rr0TestUtil.newHtmlContext("time/1/9/9/0/08/index.html", "")
      const replacer = new TimeReplacer([])
      const original = context.outputFile.document.createElement("time")
      original.textContent = "P2D10H23M45S"
      const replacement = await replacer.replacement(context, original)
      expect(replacement.outerHTML).toBe(`<time class="duration">2 jours, 10 heures, 23 minutes et 45 secondes</time>`)
    })

    test("with context", async () => {
      const context = rr0TestUtil.newHtmlContext("time/1/9/4/7/07/02/index.html", "")
      const replacer = new TimeReplacer([])
      {
        const ctxElement = context.outputFile.document.createElement("time")
        ctxElement.textContent = "1947-07-02"
        const replacement1 = await replacer.replacement(context, ctxElement)
        expect(replacement1.outerHTML).toBe(`<span class="time">mercredi 2 juillet 1947</span>`)
      }
      {
        const element = context.outputFile.document.createElement("time")
        element.textContent = "P20M"
        const replacement = await replacer.replacement(context, element)
        expect(replacement.outerHTML).toBe(`<time class="duration">20 minutes</time>`)
      }
    })

    test("with approximation", async () => {
      const context = rr0TestUtil.newHtmlContext("time/1/9/9/0/08/index.html", "")
      const replacer = new TimeReplacer([])
      const original = context.outputFile.document.createElement("time")
      original.textContent = "~P2H"
      const replacement = await replacer.replacement(context, original)
      expect(replacement.outerHTML).toBe(`<time class="duration">environ 2 heures</time>`)
    })
  })

  describe("parses hour", () => {

    test("with context", () => {
      // Empty context
      const context = rr0TestUtil.newHtmlContext("time/1/9/9/0/08/index.html", "")
      const replacer = new TimeReplacer(["time/2/0/0/6/07/14/index.html", "time/2/0/0/7/06/15/index.html"])
      const replacement = replacer.valueReplacement(context, "2006-07-14 17:56", undefined)
      expect(replacement.outerHTML).toBe(`<a href="/time/2/0/0/6/07/14/">vendredi 14 juillet 2006 à 17:56</a>`)
      expect(context.time.getYear()).toBe(2006)
      expect(context.time.getMonth()).toBe(7)
      expect(context.time.getDayOfMonth()).toBe(14)
      expect(context.time.getHour()).toBe(17)
      expect(context.time.getMinutes()).toBe(56)

      // Change day + hour
      const replacement1 = replacer.valueReplacement(context, "2007-06-15 18:47", undefined)
      expect(replacement1.outerHTML).toBe(`<a href="/time/2/0/0/7/06/15/">vendredi 15 juin 2007 à 18:47</a>`)
      expect(context.time.getYear()).toBe(2007)
      expect(context.time.getMonth()).toBe(6)
      expect(context.time.getDayOfMonth()).toBe(15)
      expect(context.time.getHour()).toBe(18)
      expect(context.time.getMinutes()).toBe(47)

      // Change hour only
      const hourReplacement = replacer.valueReplacement(context, "19:47", undefined)
      expect(hourReplacement.outerHTML).toBe(
        `<a href="/time/2/0/0/7/06/15/" title="vendredi 15 juin 2007 à 19:47">19:47</a>`)
      expect(context.time.getYear()).toBe(2007)
      expect(context.time.getMonth()).toBe(6)
      expect(context.time.getDayOfMonth()).toBe(15)
      expect(context.time.getHour()).toBe(19)
      expect(context.time.getMinutes()).toBe(47)
    })

    test("with approximation", () => {
      {
        const context = rr0TestUtil.newHtmlContext("time/1/9/9/0/08/index.html", "")
        context.time.setYear(2007)
        context.time.setMonth(6)
        context.time.setDayOfMonth(15)
        const replacer = new TimeReplacer(["time/2/0/0/7/06/15/index.html"])
        const replacement = replacer.valueReplacement(context, "~18:45", undefined)
        expect(replacement.outerHTML).toBe(
          `<a href="/time/2/0/0/7/06/15/" title="vendredi 15 juin 2007, vers 18:45">vers 18:45</a>`)
        expect(context.time.getYear()).toBe(2007)
        expect(context.time.getMonth()).toBe(6)
        expect(context.time.getDayOfMonth()).toBe(15)
        expect(context.time.getHour()).toBe(18)
        expect(context.time.getMinutes()).toBe(45)
      }
    })
  })
})