// Copyright 2020 Fastly, Inc.

import { URL } from "../url";

describe("Implement URL tests from https://url.spec.whatwg.org/#urls", () => {
  test("https:example.org", () => {
    let url = new URL("https:example.org");
    expect(url.href).toBe("https://example.org/");
  });

  test("https://////example.com///", () => {
    let url = new URL("https://////example.com///");

    expect(url.href).toBe("https://example.com///");
  });

  test("https://example.com/././foo", () => {
    let url = new URL("https://example.com/././foo");
    expect(url.href).toBe("https://example.com/foo");
  });

  test("hello:world	https://example.com/", () => {
    let url = new URL("hello:world", "https://example.com/");
    expect(url.href).toBe("hello:world");
  });

  test("https:example.org	https://example.com/", () => {
    let url = new URL("https:example.org", "https://example.com/");
    expect(url.href).toBe("https://example.com/example.org");
  });

  test("\\example\\..\\demo/.\\	https://example.com/", () => {
    let url = new URL("\\example\\..\\demo/.\\", "https://example.com/");
    expect(url.href).toBe("https://example.com/demo/");
  });

  test("example	https://example.com/demo", () => {
    let url = new URL("example", "https://example.com/demo");
    expect(url.href).toBe("https://example.com/example");
  });

  test("file:///C|/demo", () => {
    let url = new URL("file:///C|/demo");
    expect(url.protocol).toBe("file:");
    expect(url.pathname).toBe("/C:/demo");
    expect(url.href).toBe("file:///C:/demo");
  });

  test("..	file:///C:/demo", () => {
    let url = new URL("..", "file:///C:/demo");
    expect(url.href).toBe("file:///C:/");
  });

  test("file://loc%61lhost/", () => {
    let url = new URL("file://loc%61lhost/");
    expect(url.href).toBe("file:///");
  });

  test("https://user:password@example.org/", () => {
    let url = new URL("https://user:password@example.org/");
    expect(url.href).toBe("https://user:password@example.org/");
  });

  test("https://example.org/foo bar", () => {
    let url = new URL("https://example.org/foo bar");
    expect(url.href).toBe("https://example.org/foo%20bar");
  });

  test("https://EXAMPLE.com/../x", () => {
    let url = new URL("https://EXAMPLE.com/../x");
    expect(url.href).toBe("https://example.com/x");
  });

  test("https://ex ample.org/", () => {
    let url = new URL("https://ex ample.org/");
    expect(url.href).toBe("https://ex%20ample.org/");
  });

  test("example", () => {
    expect(() => {
      let url = new URL("example");
    }).toThrow();
  });

  test("https://example.com:demo", () => {
    expect(() => {
      let url = new URL("https://example.com:demo");
    }).toThrow();
  });

  test("http://[www.example.com]/", () => {
    expect(() => {
      let url = new URL("http://[www.example.com]/");
    }).toThrow();
  });

  test("https://example.org//", () => {
    let url = new URL("https://example.org//");
    expect(url.href).toBe("https://example.org//");
  });

  test("https://////example.com///", () => {
    let url = new URL("https://////example.com///");

    // NOTE (torch2424): This .toBe fails
    expect(url.href).toBe("https://example.com///");
  });
});
