fix(plex): E30 review round 3 — a dead headshot breaks the Plex-failing streak, 410 held by a test
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { placeByPriority, priorityChoices } from "./channelOrder";
|
||||
|
||||
const row = (id: string, priority: number, title: string | null = id) => ({ id, priority, title });
|
||||
const ids = (rows: { id: string }[]) => rows.map((r) => r.id);
|
||||
|
||||
describe("placeByPriority", () => {
|
||||
const list = [row("a", 10), row("b", 5), row("c", 5), row("d", 0), row("e", 0)];
|
||||
|
||||
it("bubbles a raised channel up to the first row it now outranks", () => {
|
||||
expect(
|
||||
ids(placeByPriority([...list.slice(0, 4), { ...list[4]!, priority: 5 }], "e", "en")),
|
||||
).toEqual(["a", "b", "c", "e", "d"]);
|
||||
});
|
||||
|
||||
it("sinks a lowered channel below every row it no longer outranks", () => {
|
||||
expect(
|
||||
ids(placeByPriority([{ ...list[0]!, priority: 0 }, ...list.slice(1)], "a", "en")),
|
||||
).toEqual(["b", "c", "a", "d", "e"]);
|
||||
});
|
||||
|
||||
it("orders equal priorities by title, case-folded, a missing title last", () => {
|
||||
const rows = [row("x", 3, "beta"), row("y", 3, null), row("z", 3, "Alpha")];
|
||||
expect(ids(placeByPriority(rows, "z", "en"))).toEqual(["z", "x", "y"]);
|
||||
expect(ids(placeByPriority([row("y", 3, null), row("x", 3, "beta")], "y", "en"))).toEqual([
|
||||
"x",
|
||||
"y",
|
||||
]);
|
||||
});
|
||||
|
||||
it("leaves every other row where it was, even ones out of the server's order", () => {
|
||||
const rows = [row("p", 0), row("q", 9), row("r", 2)];
|
||||
// r lands before the first row it outranks; p and q keep their (unsorted) order.
|
||||
expect(ids(placeByPriority(rows, "r", "en"))).toEqual(["r", "p", "q"]);
|
||||
});
|
||||
|
||||
it("returns an unknown id's list unchanged", () => {
|
||||
expect(ids(placeByPriority(list, "nope", "en"))).toEqual(ids(list));
|
||||
});
|
||||
|
||||
it("places a title in the reader's alphabet, as the server's collation does (E30 review)", () => {
|
||||
const rows = [row("e", 0, "Ecset"), row("f", 0, "Fa"), row("m", 5, "Életrajz")];
|
||||
const moved = [...rows.slice(0, 2), { ...rows[2]!, priority: 0 }];
|
||||
expect(ids(placeByPriority(moved, "m", "hu"))).toEqual(["e", "m", "f"]);
|
||||
const cs = [row("u", 0, "Cukor"), row("x", 0, "Dob"), row("c", 5, "Csiga")];
|
||||
expect(
|
||||
ids(placeByPriority([...cs.slice(0, 2), { ...cs[2]!, priority: 0 }], "c", "hu")),
|
||||
).toEqual(["u", "c", "x"]);
|
||||
});
|
||||
});
|
||||
|
||||
describe("priorityChoices", () => {
|
||||
it("offers the fixed steps, and an off-scale current value in its place", () => {
|
||||
expect(priorityChoices(3)).toEqual([10, 5, 3, 2, 1, 0]);
|
||||
expect(priorityChoices(7)).toEqual([10, 7, 5, 3, 2, 1, 0]);
|
||||
expect(priorityChoices(-2)).toEqual([10, 5, 3, 2, 1, 0, -2]);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user