← Files Biological Sequence & Alignment ViewerARCHIVED FILE

src/sequence/feature-location.test.ts

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

↓ Download file

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

import {
  featureContainsCoordinate,
  featureOverlapsRange,
  parseFeatureLocation,
} from "./feature-location";

describe("feature locations", () => {
  it("preserves joined segments and complement strand", () => {
    expect(parseFeatureLocation("complement(join(<1..3,7..>9))")).toEqual({
      end: 9,
      segments: [
        { end: 9, partialEnd: true, partialStart: false, start: 7 },
        { end: 3, partialEnd: false, partialStart: true, start: 1 },
      ],
      start: 1,
      strand: "-",
      translationTrackReliable: false,
      translationMappingUnavailableReason: "partial boundary",
    });
  });

  it("retains remote segments without projecting them onto the local record", () => {
    expect(parseFeatureLocation("join(1..3,OTHER.1:5..8)")).toEqual({
      end: 3,
      segments: [
        { end: 3, partialEnd: false, partialStart: false, start: 1 },
        {
          end: 8,
          partialEnd: false,
          partialStart: false,
          remoteAccession: "OTHER.1",
          start: 5,
        },
      ],
      start: 1,
      strand: "+",
      translationTrackReliable: false,
      translationMappingUnavailableReason: "remote segment",
    });
  });

  it("marks exact local joins as safe for codon-coordinate mapping", () => {
    expect(parseFeatureLocation("join(1..3,7..9)")).toMatchObject({
      segments: [
        { end: 3, start: 1 },
        { end: 9, start: 7 },
      ],
      strand: "+",
      translationTrackReliable: true,
    });
  });

  it("does not treat gaps between joined segments as feature sequence", () => {
    const parsed = parseFeatureLocation("join(1..3,7..9)");
    expect(parsed).not.toBeNull();
    if (parsed == null) {
      throw new Error("Expected a parsed compound feature.");
    }
    const feature = {
      ...parsed,
      id: "joined",
      qualifiers: {},
      sourceLocation: "join(1..3,7..9)",
      type: "CDS" as const,
    };

    expect(featureContainsCoordinate(feature, 2)).toBe(true);
    expect(featureContainsCoordinate(feature, 5)).toBe(false);
    expect(featureOverlapsRange(feature, 4, 6)).toBe(false);
    expect(featureOverlapsRange(feature, 3, 7)).toBe(true);
  });
});

SHA-256: 73260a5c0763982682c0a7b76e7f96c76b8d8a8e1a1d4e351dfd377baebc466b