Zum Inhalt

viewer/tests/unit/mc-tables.test.mjs

import { test } from 'node:test';
import assert from 'node:assert/strict';
import { edgeTable, triTable } from '../../js/collision/mc-tables.js';

test('mc-tables: edgeTable has 256 entries', () => {
  assert.equal(edgeTable.length, 256);
});

test('mc-tables: triTable has 256 rows of 16 entries', () => {
  assert.equal(triTable.length, 256);
  for (const row of triTable) assert.equal(row.length, 16);
});

test('mc-tables: known cases', () => {
  // Case 0 (all corners outside surface): no triangles, no edges.
  assert.equal(edgeTable[0], 0x0);
  assert.equal(triTable[0][0], -1);
  // Case 255 (all corners inside surface): also no triangles.
  assert.equal(edgeTable[255], 0x0);
  assert.equal(triTable[255][0], -1);
  // Case 1 (only corner 0 inside): single triangle on edges 0, 8, 3.
  assert.equal(edgeTable[1], 0x109);
  assert.deepEqual(triTable[1].slice(0, 4), [0, 8, 3, -1]);
  // Case 254 (all corners except corner 0 inside): complementary triangle,
  // same edges, reversed winding → 0, 3, 8.
  assert.equal(edgeTable[254], 0x109);
  assert.deepEqual(triTable[254].slice(0, 4), [0, 3, 8, -1]);
});

test('mc-tables: every triTable row terminates with -1 in the correct spot', () => {
  for (let i = 0; i < 256; i++) {
    const row = triTable[i];
    // Triangle entries come in groups of 3; non-(-1) entries must be a
    // multiple of 3.
    let first = row.indexOf(-1);
    if (first === -1) first = 16;
    assert.equal(first % 3, 0, `row ${i}: ${first} non-(-1) entries`);
    // Everything after the first -1 must also be -1.
    for (let j = first; j < 16; j++) {
      assert.equal(row[j], -1, `row ${i}, col ${j}`);
    }
  }
});