| import { readFileSync } from "node:fs"; | |
| import { describe, it, expect } from "vitest"; | |
| import { parse } from "./parse.js"; | |
| import { tests } from "./__fixtures__/tests.js"; | |
| const broken = [ | |
| "[", | |
| "(", | |
| "{", | |
| "()", | |
| "<>", | |
| "{}", | |
| ",", | |
| ",a", | |
| "a,", | |
| "[id=012345678901234567890123456789", | |
| "input[name=foo b]", | |
| "input[name!foo]", | |
| "input[name|]", | |
| "input[name=']", | |
| "input[name=foo[baz]]", | |
| ':has("p")', | |
| ":has(p", | |
| ":foo(p()", | |
| "#", | |
| "##foo", | |
| "/*", | |
| ]; | |
| describe("Parse", () => { | |
| describe("Own tests", () => { | |
| for (const [selector, expected, message] of tests) { | |
| it(message, () => expect(parse(selector)).toStrictEqual(expected)); | |
| } | |
| }); | |
| describe("Collected selectors (qwery, sizzle, nwmatcher)", () => { | |
| const out = JSON.parse( | |
| readFileSync(`${__dirname}/__fixtures__/out.json`, "utf8"), | |
| ); | |
| for (const s of Object.keys(out)) { | |
| it(s, () => { | |
| expect(parse(s)).toStrictEqual(out[s]); | |
| }); | |
| } | |
| }); | |
| describe("Broken selectors", () => { | |
| for (const selector of broken) { | |
| it(`should not parse — ${selector}`, () => { | |
| expect(() => parse(selector)).toThrow(Error); | |
| }); | |
| } | |
| }); | |
| it("should ignore comments", () => { | |
| expect(parse("/* comment1 */ /**/ foo /*comment2*/")).toEqual([ | |
| [{ name: "foo", namespace: null, type: "tag" }], | |
| ]); | |
| expect(() => parse("/*/")).toThrowError("Comment was not terminated"); | |
| }); | |
| it("should support legacy pseudo-elements with single colon", () => { | |
| expect(parse(":before")).toEqual([ | |
| [{ name: "before", data: null, type: "pseudo-element" }], | |
| ]); | |
| }); | |
| }); |