← Files Biological Sequence & Alignment ViewerARCHIVED FILE

src/bam-decoder.test.ts

2.1 KB · Sep 30, 2026 · 23:01 UTC

↓ Download file

import { describe, expect, it } from "vitest";

import { decodeBamWindowToSam } from "./bam-decoder";
import { parseSequenceTrack } from "./sequence/tracks";

// Official GMOD bam-js SAM specification fixture and BAI index.
const BAM = "H4sIBAAAAAAA/wYAQkMCAFgAc3L0ZdRiYGBw8HDhDPOzMtQz4wz2t0rOzy9KycxLLEnlcggO5Az2sypKTeP08bMyMeViBKpmAWKgCIMukAYA2DSCpUIAAAAfiwgEAAAAAAD/BgBCQwIAAQELZoAANiBmlfMUYmVIZhCEiqkAsToQFxkYGDI0ABmKQOwAxEJAbADEHSISgiKOjRoO/9GBH9QIDrixDAx8QAyTZ4AYa8RgAmQkALEYEAtCjRcUdGwEGotqYiiaiUxAmhvTRGOGEKiJThqCTo0CSCYEO0YVpabpGFnq6OqYeZj66hia6xhYMzhBDeaHGsyM3WATsKGPgTgAiCVENJpEFJAM94aaIgMyRRDkPAEOVmzOS4Wa0OiigOwqSx1tHdNgM18dYwMdQ2sGa6QoADmKkWEyAydSVN0E6gRHywRQtDi5KDYggt7XmREAnlXuT9YBAAAfiwgEAAAAAAD/BgBCQwIAGwADAAAAAAAAAAAA";
const BAI = "QkFJAQEAAAACAAAASRIAAAEAAAAAAFkAAAAAAAAAWwEAAAAASpIAAAIAAAAAAFkAAAAAAAAAWwEAAAAABgAAAAAAAAAAAAAAAAAAAAEAAAAAAFkAAAAAAAAAAAAAAAAA";

describe("indexed BAM evidence decoding", () => {
  it("decodes a bounded one-based viewer window through BAI", async () => {
    const result = await decodeBamWindowToSam({
      bamBytes: bytes(BAM),
      end: 45,
      indexBytes: bytes(BAI),
      reference: "ref",
      start: 1,
    });
    expect(result).toMatchObject({
      end: 45,
      reference: "ref",
      start: 1,
      truncated: false,
    });
    expect(result.sam).toContain("@SQ\tSN:ref\tLN:45");

    const track = parseSequenceTrack({
      content: result.sam,
      displayName: "samspec.bam",
      format: "bam",
      id: "track",
      requestedReference: "ref",
    });
    expect(track.kind).toBe("reads");
    expect(track.reads?.length).toBeGreaterThan(0);
    expect(track.reads?.some(({ cigar }) => cigar.includes("I"))).toBe(true);
    expect(track.mapping.status).toBe("matched");
  });

  it("rejects oversized and unknown-reference windows", async () => {
    await expect(
      decodeBamWindowToSam({
        bamBytes: bytes(BAM),
        indexBytes: bytes(BAI),
        reference: "missing",
      }),
    ).rejects.toThrow("No BAM reference matched");
  });
});

function bytes(value: string): Uint8Array {
  return Uint8Array.from(Buffer.from(value, "base64"));
}

SHA-256: 10d0b575f5cb60da116722059bb926cd813bea5bc212b0a5609f1f76d9ab1448