hand-validation.test.ts 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import assert from "node:assert/strict";
  2. import test from "node:test";
  3. import { chooseWinner, clampUnit, normalizeProbabilities, normalizeText, normalizeUniqueTextList } from "../src/domain/hand-validation.ts";
  4. test("normalizeText trims and collapses whitespace", () => {
  5. assert.equal(normalizeText(" Friday\n dinner ", 20), "Friday dinner");
  6. assert.equal(normalizeText(" ", 20), null);
  7. assert.equal(normalizeText("too long", 3), null);
  8. });
  9. test("normalizeUniqueTextList rejects duplicates and invalid bounds", () => {
  10. assert.deepEqual(normalizeUniqueTextList([" Thai ", "Pizza"], 4, 20), ["Thai", "Pizza"]);
  11. assert.equal(normalizeUniqueTextList(["Thai", "thai"], 4, 20), null);
  12. assert.equal(normalizeUniqueTextList(["a", "b", "c"], 2, 20), null);
  13. assert.equal(normalizeUniqueTextList(["valid", 2], 4, 20), null);
  14. });
  15. test("normalizeProbabilities accepts weights and normalizes only live options", () => {
  16. assert.deepEqual(normalizeProbabilities({ a: 20, b: 30, stale: 50 }, ["a", "b"]), { a: 0.4, b: 0.6 });
  17. });
  18. test("normalizeProbabilities rejects malformed or unusable weights", () => {
  19. assert.equal(normalizeProbabilities({ a: 1, b: -1 }, ["a", "b"]), null);
  20. assert.equal(normalizeProbabilities({ a: 0, b: 0 }, ["a", "b"]), null);
  21. assert.equal(normalizeProbabilities({ a: 1 }, ["a", "b"]), null);
  22. assert.equal(normalizeProbabilities({ a: Number.NaN, b: 1 }, ["a", "b"]), null);
  23. });
  24. test("clampUnit makes Jev scalar metadata safe", () => {
  25. assert.equal(clampUnit(-1), 0);
  26. assert.equal(clampUnit(0.45), 0.45);
  27. assert.equal(clampUnit(3), 1);
  28. assert.equal(clampUnit("0.5"), 0);
  29. });
  30. test("one-tap winner confirms the highest weight with option-order tie breaking", () => {
  31. assert.equal(chooseWinner(["first", "second"], { first: 0.2, second: 0.8 }, 123, true), "second");
  32. assert.equal(chooseWinner(["first", "second"], { first: 0.5, second: 0.5 }, 123, true), "first");
  33. });
  34. test("seeded weighted winner is replayable", () => {
  35. const weights = { first: 0.2, second: 0.8 };
  36. assert.equal(chooseWinner(["first", "second"], weights, 42), chooseWinner(["first", "second"], weights, 42));
  37. });