Guest User

Untitled

a guest
Jul 3rd, 2024
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import { describe, expect, test } from "bun:test"
  2. import {
  3.   BackgammonEngine,
  4.   BoardInit,
  5.   defaultBoard,
  6.   MatchState,
  7. } from "../backgammonEngine"
  8. import { parseMoveString } from "../backgammonMessage"
  9. import { isExpectedError } from "../utils"
  10.  
  11. const ArrToInit = (arr: [number, number][]): [BoardInit, BoardInit] => {
  12.   return [
  13.     arr.filter(([, v]) => v > 0),
  14.     arr.filter(([, v]) => v < 0).map(([i, v]) => [24 - i + 1, -v]),
  15.   ]
  16. }
  17.  
  18. const makeEngine = (
  19.   config?: Partial<MatchState>,
  20.   messages?: string[],
  21.   init?: [BoardInit, BoardInit],
  22.   reset?: [BoardInit, BoardInit]
  23. ) =>
  24.   new BackgammonEngine(
  25.     config || {},
  26.     ["jack", "jill"],
  27.     (msg) => messages?.push(msg),
  28.     init,
  29.     reset
  30.   )
  31.  
  32. type RollMove = { rolls: number[]; move: string }
  33. const runTestForConfig = ({
  34.   config,
  35.   valid,
  36.   invalid,
  37.   init,
  38.   reset,
  39.   m,
  40. }: {
  41.   config: Partial<MatchState>
  42.   valid?: RollMove[]
  43.   invalid?: RollMove[]
  44.   init?: [BoardInit, BoardInit]
  45.   reset?: [BoardInit, BoardInit]
  46.   m?: string[]
  47. }) => {
  48.   for (const move of valid ?? []) {
  49.     const moves = parseMoveString(move.move)
  50.     if (isExpectedError(moves)) throw Error("Bad test move string" + move.move)
  51.     const rollOrder = [move.rolls, [...move.rolls].reverse()]
  52.     for (const rolls of rollOrder) {
  53.       const e = makeEngine({ ...config, rolls }, m, init, reset)
  54.       const r = e.tryApplyMove(moves) as any
  55.       test(`valid: ${move.move} ${rolls}`, () => {
  56.         expect(r.error).toBeUndefined()
  57.       })
  58.     }
  59.   }
  60.  
  61.   for (const move of invalid ?? []) {
  62.     const moves = parseMoveString(move.move)
  63.     if (isExpectedError(moves)) throw Error("Bad test move string" + move.move)
  64.     const rollOrder = [move.rolls, [...move.rolls].reverse()]
  65.     for (const rolls of rollOrder) {
  66.       const e = makeEngine({ ...config, rolls }, m, init, reset)
  67.       const r = e.tryApplyMove(moves) as any
  68.       test(`invalid: ${move.move} ${rolls} (${r?.error})`, () => {
  69.         expect(r.error).toBeDefined()
  70.       })
  71.     }
  72.   }
  73. }
  74.  
  75. describe("tryApplyMove from starting", () => {
  76.   runTestForConfig({
  77.     config: {},
  78.     valid: [
  79.       { rolls: [6, 5], move: `24/18 18/13` },
  80.       { rolls: [6, 5], move: `13/7 13/8` },
  81.     ],
  82.     invalid: [
  83.       { rolls: [6, 5], move: `18/13 24/18` },
  84.       { rolls: [6, 5], move: `23/17 17/12` },
  85.       { rolls: [6, 5], move: `24/18 6/1` },
  86.       { rolls: [6, 5], move: `13/7 13/8 13/8` },
  87.     ],
  88.   })
  89. })
  90.  
  91. describe("jailFirst", () => {
  92.   describe("single jail", () => {
  93.     runTestForConfig({
  94.       config: {},
  95.       valid: [
  96.         { rolls: [6, 6], move: `` },
  97.         { rolls: [1, 1], move: `jail/24 24/23` },
  98.         { rolls: [1, 1], move: `j/24 24/23` },
  99.       ],
  100.       invalid: [
  101.         { rolls: [6, 6], move: `24/18 24/18` },
  102.         { rolls: [1, 1], move: `24/23 24/23` },
  103.         { rolls: [1, 1], move: `` },
  104.       ],
  105.       init: [
  106.         [...defaultBoard, ["jail", 1]],
  107.         [...defaultBoard, ["jail", 1]],
  108.       ],
  109.     })
  110.   })
  111.  
  112.   describe("double jail", () => {
  113.     runTestForConfig({
  114.       config: {},
  115.       init: [
  116.         [...defaultBoard, ["jail", 2]],
  117.         [...defaultBoard, ["jail", 2]],
  118.       ],
  119.       valid: [
  120.         { rolls: [6, 6], move: `` },
  121.         { rolls: [1, 1], move: `jail/24 jail/24` },
  122.         { rolls: [1, 1, 1, 1], move: `jail/24 jail/24 24/23 24/23` },
  123.         { rolls: [1, 1, 1, 1], move: `j/24 j/24 24/23 24/23` },
  124.         { rolls: [2, 2], move: `jail/23 jail/23` },
  125.       ],
  126.       invalid: [
  127.         { rolls: [1, 1, 1, 1], move: `j/24 j/24` },
  128.         { rolls: [2, 2], move: `jail/24 jail/24` },
  129.         { rolls: [2, 2], move: `jail/22 jail/22` },
  130.         { rolls: [1, 1], move: `jail/24 24/23` },
  131.         { rolls: [6, 6], move: `24/18 24/18` },
  132.         { rolls: [1, 1], move: `24/23 24/23` },
  133.       ],
  134.     })
  135.   })
  136. })
  137.  
  138. describe("maximum travel", () => {
  139.   runTestForConfig({
  140.     config: {
  141.       going: 0,
  142.     },
  143.     init: [
  144.       [
  145.         [4, 1],
  146.         [24, 1],
  147.       ],
  148.       [
  149.         [2, 2],
  150.         [3, 2],
  151.         [4, 2],
  152.         [5, 2],
  153.         [6, 2],
  154.       ],
  155.     ],
  156.     valid: [
  157.       { rolls: [6, 6], move: `24/18 18/12` },
  158.       { rolls: [3, 2], move: `4/1` },
  159.       { rolls: [5, 5], move: `` },
  160.     ],
  161.     invalid: [
  162.       { rolls: [3, 2], move: `4/2` },
  163.       { rolls: [6, 6], move: `24/18` },
  164.     ],
  165.   })
  166. })
  167.  
  168. describe("maximum travel - backtracking", () => {
  169.   runTestForConfig({
  170.     config: {
  171.       going: 0,
  172.     },
  173.     init: ArrToInit([
  174.       [4, -2],
  175.       [5, -2],
  176.       [7, -2],
  177.       [8, 1],
  178.  
  179.       [19, -2],
  180.       [20, 1],
  181.     ]),
  182.  
  183.     valid: [{ rolls: [1, 2], move: `20/18 18/17` }],
  184.     invalid: [{ rolls: [1, 2], move: `8/6` }],
  185.   })
  186. })
  187.  
  188. describe("maximum travel - backtracking little", () => {
  189.   runTestForConfig({
  190.     config: {
  191.       going: 0,
  192.     },
  193.     init: ArrToInit([
  194.       [4, -2],
  195.       [5, -2],
  196.       [6, -2],
  197.       [8, 1],
  198.  
  199.       [18, -2],
  200.       [20, 1],
  201.     ]),
  202.  
  203.     valid: [{ rolls: [1, 2], move: `20/19 19/17` }],
  204.     invalid: [{ rolls: [1, 2], move: `8/7` }],
  205.   })
  206. })
  207.  
  208. describe("maximum travel - multiple paths", () => {
  209.   runTestForConfig({
  210.     config: {
  211.       going: 0,
  212.     },
  213.     init: ArrToInit([
  214.       [3, 1],
  215.       [5, 1],
  216.     ]),
  217.  
  218.     valid: [{ rolls: [4, 6], move: `5/f 3/f` }],
  219.     invalid: [{ rolls: [4, 6], move: `5/1 3/f` }],
  220.   })
  221. })
  222.  
  223. describe("overshooting", () => {
  224.   runTestForConfig({
  225.     config: {
  226.       going: 0,
  227.     },
  228.     init: ArrToInit([
  229.       [5, 1],
  230.       [7, 1],
  231.     ]),
  232.  
  233.     valid: [{ rolls: [4, 6], move: `7/1 5/1` }],
  234.     invalid: [{ rolls: [4, 6], move: `7/3 5/f` }],
  235.   })
  236. })
  237.  
  238. describe("hn test", () => {
  239.   runTestForConfig({
  240.     config: {
  241.       going: 0,
  242.     },
  243.     init: ArrToInit([
  244.       [1, 2],
  245.       [2, 6],
  246.       [3, 3],
  247.       [5, -1],
  248.       [6, 3],
  249.       [7, -1],
  250.       [9, 1],
  251.       [19, -3],
  252.       [20, -3],
  253.       [21, -3],
  254.       [22, -2],
  255.       [23, -2],
  256.     ]),
  257.     valid: [
  258.       { rolls: [4, 6], move: `9/5 6/f` },
  259.       { rolls: [4, 6], move: `9/3 6/2` },
  260.     ],
  261.   })
  262. })
  263.  
Advertisement
Add Comment
Please, Sign In to add comment