import { describe, it, expect } from "vitest"; import type { ITNode } from "../../../../../../utils/xml-parser"; import { parseXml } from "../../../../../../utils/xml-parser"; import { MPDError, parseBoolean, parseByteRange, parseDateTime, parseDuration, parseIntOrBoolean, parseScheme, } from "../utils"; describe("dash parser helpers", function () { describe("parseBoolean", () => { it('should return true if value is "true"', () => { expect(parseBoolean("true", "toto")).toEqual([true, null]); }); it('should return false if value is "false"', () => { expect(parseBoolean("false", "titi")).toEqual([false, null]); }); it("should return false for and an error any other value", () => { const parsed1 = parseBoolean("", "ab"); const parsed2 = parseBoolean("foo", "ba"); expect(parsed1[0]).toEqual(false); expect(parsed2[0]).toEqual(false); expect(parsed1[1]).toBeInstanceOf(MPDError); expect(parsed2[1]).toBeInstanceOf(MPDError); expect(parsed1[1]?.message).toEqual('`ab` property is not a boolean value but ""'); expect(parsed2[1]?.message).toEqual( '`ba` property is not a boolean value but "foo"', ); }); }); describe("parseIntOrBoolean", () => { it('should return true if value is "true"', () => { expect(parseIntOrBoolean("true", "toto")).toEqual([true, null]); }); it('should return false if value is "false"', () => { expect(parseIntOrBoolean("false", "toto")).toEqual([false, null]); }); it("should return a number for any number", () => { expect(parseIntOrBoolean("0", "foob1")).toEqual([0, null]); expect(parseIntOrBoolean("10", "foob2")).toEqual([10, null]); expect(parseIntOrBoolean("072", "foob3")).toEqual([72, null]); expect(parseIntOrBoolean("-698", "foob4")).toEqual([-698, null]); }); it("should return null and an error for any other value", () => { const parsed1 = parseIntOrBoolean("", "ab"); const parsed2 = parseIntOrBoolean("foo", "ba"); expect(parsed1[0]).toEqual(null); expect(parsed2[0]).toEqual(null); expect(parsed1[1]).toBeInstanceOf(MPDError); expect(parsed2[1]).toBeInstanceOf(MPDError); expect(parsed1[1]?.message).toEqual( '`ab` property is not a boolean nor an integer but ""', ); expect(parsed2[1]?.message).toEqual( '`ba` property is not a boolean nor an integer but "foo"', ); }); }); describe("parseDateTime", () => { it("should correctly parse a given date into a timestamp", () => { expect(parseDateTime("1970-01-01T00:00:00Z", "a")).toEqual([0, null]); expect(parseDateTime("1998-11-22T10:40:50Z", "b")).toEqual([911731250, null]); expect(parseDateTime("1960-01-01T00:00:00Z", "c")).toEqual([-315619200, null]); }); it("should return null and an error when the date is not recognized", () => { const parsed1 = parseDateTime("foo bar", "ab"); const parsed2 = parseDateTime("2047-41-52T30:40:50Z", "ba"); expect(parsed1[0]).toEqual(null); expect(parsed2[0]).toEqual(null); expect(parsed1[1]).toBeInstanceOf(MPDError); expect(parsed2[1]).toBeInstanceOf(MPDError); expect(parsed1[1]?.message).toEqual('`ab` is in an invalid date format: "foo bar"'); expect(parsed2[1]?.message).toEqual( '`ba` is in an invalid date format: "2047-41-52T30:40:50Z"', ); }); }); describe("parseDuration", () => { it("should correctly parse duration in ISO8061 format", function () { expect(parseDuration("P18Y9M4DT11H9M8S", "fooba")).toEqual([591361748, null]); }); it("should correctly parse duration if missing the year", function () { expect(parseDuration("P9M4DT11H9M8S", "fooba")).toEqual([23713748, null]); }); it("should correctly parse duration if missing the month", function () { expect(parseDuration("P18Y4DT11H9M8S", "fooba")).toEqual([568033748, null]); }); it("should correctly parse duration if missing the day", function () { expect(parseDuration("P18Y9MT11H9M8S", "fooba")).toEqual([591016148, null]); }); it("should correctly parse duration if missing the hours", function () { expect(parseDuration("P18Y9M4DT9M8S", "fooba")).toEqual([591322148, null]); }); it("should correctly parse duration if missing the minutes", function () { expect(parseDuration("P18Y9M4DT11H8S", "fooba")).toEqual([591361208, null]); }); it("should correctly parse duration if missing the seconds", function () { expect(parseDuration("P18Y9M4DT11H9M", "fooba")).toEqual([591361740, null]); }); it("should return null and an error if duration not in ISO8061 format", function () { const parsed1 = parseDuration("1000", "fooba"); expect(parsed1[0]).toEqual(null); expect(parsed1[1]).toBeInstanceOf(MPDError); expect(parsed1[1]?.message).toEqual( '`fooba` property has an unrecognized format "1000"', ); }); it("should return 0 and an error if given an empty string", function () { const parsed = parseDuration("", "fooba"); expect(parsed[0]).toEqual(0); expect(parsed[1]).toBeInstanceOf(MPDError); expect(parsed[1]?.message).toEqual("`fooba` property is empty"); }); }); describe("parseByteRange", () => { it("should correctly parse byte range", function () { const parsedByteRange = parseByteRange("1-1000", "tots"); expect(parsedByteRange[0]).not.toEqual(null); expect(parsedByteRange[1]).toEqual(null); expect((parsedByteRange[0] as [number, number]).length).toEqual(2); expect((parsedByteRange[0] as [number, number])[0]).toEqual(1); expect((parsedByteRange[0] as [number, number])[1]).toEqual(1000); }); it("should return null and an error if can't parse given byte range", function () { const parsed1 = parseByteRange("main", "prop"); expect(parsed1[0]).toEqual(null); expect(parsed1[1]).toBeInstanceOf(MPDError); expect(parsed1[1]?.message).toEqual( '`prop` property has an unrecognized format "main"', ); }); }); describe("parseScheme", () => { it("should correctly parse an element with no known attribute", () => { const element1 = parseXml("")[0] as ITNode; expect(parseScheme(element1)).toEqual({}); const element2 = parseXml('')[0] as ITNode; expect(parseScheme(element2)).toEqual({}); }); it("should correctly parse an element with a correct schemeIdUri attribute", () => { const element1 = parseXml('')[0] as ITNode; expect(parseScheme(element1)).toEqual({ schemeIdUri: "foobar " }); const element2 = parseXml('')[0] as ITNode; expect(parseScheme(element2)).toEqual({ schemeIdUri: "" }); }); it("should correctly parse an element with a correct value attribute", () => { const element1 = parseXml('')[0] as ITNode; expect(parseScheme(element1)).toEqual({ value: "foobar " }); const element2 = parseXml('')[0] as ITNode; expect(parseScheme(element2)).toEqual({ value: "" }); }); it("should correctly parse an element with both attributes", () => { const element = parseXml('')[0] as ITNode; expect(parseScheme(element)).toEqual({ schemeIdUri: "baz", value: "foobar ", }); }); }); });