import * as assert from "assert"
import { normalize } from "../src/common/util"
import { extend } from "../src/node/util"

describe("util", () => {
  describe("extend", () => {
    it("should extend", () => {
      const a = { foo: { bar: 0, baz: 2 }, garply: 4, waldo: 6 }
      const b = { foo: { bar: 1, qux: 3 }, garply: "5", fred: 7 }
      const extended = extend(a, b)
      assert.deepEqual(extended, {
        foo: { bar: 1, baz: 2, qux: 3 },
        garply: "5",
        waldo: 6,
        fred: 7,
      })
    })

    it("should make deep copies of the original objects", () => {
      const a = { foo: 0, bar: { frobnozzle: 2 }, mumble: { qux: { thud: 4 } } }
      const b = { foo: 1, bar: { chad: 3 } }
      const extended = extend(a, b)
      assert.notEqual(a.bar, extended.bar)
      assert.notEqual(b.bar, extended.bar)
      assert.notEqual(a.mumble, extended.mumble)
      assert.notEqual(a.mumble.qux, extended.mumble.qux)
    })

    it("should handle mismatch in type", () => {
      const a = { foo: { bar: 0, baz: 2, qux: { mumble: 11 } }, garply: 4, waldo: { thud: 10 } }
      const b = { foo: { bar: [1], baz: { plugh: 8 }, qux: 12 }, garply: { nox: 9 }, waldo: 7 }
      const extended = extend(a, b)
      assert.deepEqual(extended, {
        foo: { bar: [1], baz: { plugh: 8 }, qux: 12 },
        garply: { nox: 9 },
        waldo: 7,
      })
    })
  })

  describe("normalize", () => {
    it("should remove multiple slashes", () => {
      assert.equal(normalize("//foo//bar//baz///mumble"), "/foo/bar/baz/mumble")
    })

    it("should remove trailing slashes", () => {
      assert.equal(normalize("qux///"), "qux")
    })

    it("should preserve trailing slash if it exists", () => {
      assert.equal(normalize("qux///", true), "qux/")
      assert.equal(normalize("qux", true), "qux")
    })
  })
})