sequaljs
Version:
JavaScript/TypeScript library for parsing and manipulating ProForma peptide sequence notation
242 lines (241 loc) • 11.9 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const sequence_1 = require("../sequence");
describe("ProForma 2.1: Placement Controls (Section 11.2)", () => {
test("should parse single position constraint", () => {
const seq = sequence_1.Sequence.fromProforma("<[Oxidation|Position:M]@M>PEPTIDE");
const globalMods = seq.globalMods;
expect(globalMods.length).toBe(1);
const mod = globalMods[0];
expect(mod.getPositionConstraint()).toEqual(["M"]);
});
test("should parse multiple position constraints", () => {
const seq = sequence_1.Sequence.fromProforma("<[Phospho|Position:S,T,Y]@S,T,Y>PEPTIDES");
const globalMods = seq.globalMods;
expect(globalMods.length).toBe(1);
const mod = globalMods[0];
expect(mod.getPositionConstraint()).toEqual(["S", "T", "Y"]);
});
test("should parse position constraint with specific amino acid", () => {
const seq = sequence_1.Sequence.fromProforma("<[Carbamidomethyl|Position:C]@C>PEPTCDE");
const globalMods = seq.globalMods;
expect(globalMods.length).toBe(1);
const mod = globalMods[0];
expect(mod.getPositionConstraint()).toEqual(["C"]);
});
test("should parse limit per position - limit of 1", () => {
const seq = sequence_1.Sequence.fromProforma("<[Oxidation|Limit:1]@M>MMMM");
const globalMods = seq.globalMods;
expect(globalMods.length).toBe(1);
const mod = globalMods[0];
expect(mod.getLimitPerPosition()).toBe(1);
});
test("should parse limit per position - limit of 2", () => {
const seq = sequence_1.Sequence.fromProforma("<[Phospho|Limit:2]@S,T,Y>STYSTY");
const globalMods = seq.globalMods;
expect(globalMods.length).toBe(1);
const mod = globalMods[0];
expect(mod.getLimitPerPosition()).toBe(2);
});
test("should parse limit with position constraint", () => {
const seq = sequence_1.Sequence.fromProforma("<[Oxidation|Position:M|Limit:1]@M>MMMM");
const globalMods = seq.globalMods;
expect(globalMods.length).toBe(1);
const mod = globalMods[0];
expect(mod.getPositionConstraint()).toEqual(["M"]);
expect(mod.getLimitPerPosition()).toBe(1);
});
test("should parse CoMKP tag", () => {
const seq = sequence_1.Sequence.fromProforma("<[Oxidation|CoMKP]@M>PEPTIDE");
const globalMods = seq.globalMods;
expect(globalMods.length).toBe(1);
const mod = globalMods[0];
expect(mod.getColocalizeKnown()).toBe(true);
});
test("should parse full form ColocaliseModificationsOfKnownPosition", () => {
const seq = sequence_1.Sequence.fromProforma("<[Oxidation|ColocaliseModificationsOfKnownPosition]@M>PEPTIDE");
const globalMods = seq.globalMods;
expect(globalMods.length).toBe(1);
const mod = globalMods[0];
expect(mod.getColocalizeKnown()).toBe(true);
});
test("should parse CoMUP tag", () => {
const seq = sequence_1.Sequence.fromProforma("<[Oxidation|CoMUP]@M>PEPTIDE");
const globalMods = seq.globalMods;
expect(globalMods.length).toBe(1);
const mod = globalMods[0];
expect(mod.getColocalizeUnknown()).toBe(true);
});
test("should parse full form ColocaliseModificationsOfUnknownPosition", () => {
const seq = sequence_1.Sequence.fromProforma("<[Oxidation|ColocaliseModificationsOfUnknownPosition]@M>PEPTIDE");
const globalMods = seq.globalMods;
expect(globalMods.length).toBe(1);
const mod = globalMods[0];
expect(mod.getColocalizeUnknown()).toBe(true);
});
test("should parse all placement controls together", () => {
const seq = sequence_1.Sequence.fromProforma("<[Phospho|Position:S,T,Y|Limit:2|CoMKP]@S,T,Y>PEPTIDES");
const globalMods = seq.globalMods;
expect(globalMods.length).toBe(1);
const mod = globalMods[0];
expect(mod.getPositionConstraint()).toEqual(["S", "T", "Y"]);
expect(mod.getLimitPerPosition()).toBe(2);
expect(mod.getColocalizeKnown()).toBe(true);
});
test("should handle global modification without placement controls", () => {
const seq = sequence_1.Sequence.fromProforma("<[Oxidation]@M>PEPTIDE");
const globalMods = seq.globalMods;
expect(globalMods.length).toBe(1);
const mod = globalMods[0];
expect(mod.getPositionConstraint()).toBeNull();
expect(mod.getLimitPerPosition()).toBeNull();
expect(mod.getColocalizeKnown()).toBe(false);
expect(mod.getColocalizeUnknown()).toBe(false);
});
test("should serialize position constraint", () => {
const original = "<[Oxidation|Position:M]@M>PEPTIDE";
const seq = sequence_1.Sequence.fromProforma(original);
const proforma = seq.toProforma();
expect(proforma).toBe(original);
});
test("should serialize multiple position constraints", () => {
const original = "<[Phospho|Position:S,T,Y]@S,T,Y>PEPTIDES";
const seq = sequence_1.Sequence.fromProforma(original);
const proforma = seq.toProforma();
expect(proforma).toBe(original);
});
test("should serialize limit per position", () => {
const original = "<[Phospho|Limit:2]@S,T,Y>STYSTY";
const seq = sequence_1.Sequence.fromProforma(original);
const proforma = seq.toProforma();
expect(proforma).toBe(original);
});
test("should serialize CoMKP", () => {
const original = "<[Oxidation|CoMKP]@M>PEPTIDE";
const seq = sequence_1.Sequence.fromProforma(original);
const proforma = seq.toProforma();
expect(proforma).toBe(original);
});
test("should serialize CoMUP", () => {
const original = "<[Oxidation|CoMUP]@M>PEPTIDE";
const seq = sequence_1.Sequence.fromProforma(original);
const proforma = seq.toProforma();
expect(proforma).toBe(original);
});
test("should serialize all placement controls", () => {
const original = "<[Phospho|Position:S,T,Y|Limit:2|CoMKP]@S,T,Y>PEPTIDES";
const seq = sequence_1.Sequence.fromProforma(original);
const proforma = seq.toProforma();
expect(proforma).toBe(original);
});
test("should round-trip position constraint", () => {
const testCases = [
"<[Oxidation|Position:M]@M>PEPTIDE",
"<[Phospho|Position:S,T,Y]@S,T,Y>PEPTIDES",
"<[Carbamidomethyl|Position:C]@C>PEPTCDE",
];
for (const original of testCases) {
const seq = sequence_1.Sequence.fromProforma(original);
const proforma = seq.toProforma();
const seq2 = sequence_1.Sequence.fromProforma(proforma);
const proforma2 = seq2.toProforma();
expect(proforma).toBe(original);
expect(proforma2).toBe(original);
const mod1 = seq.globalMods[0];
const mod2 = seq2.globalMods[0];
expect(mod1.getPositionConstraint()).toEqual(mod2.getPositionConstraint());
}
});
test("should round-trip limit per position", () => {
const testCases = [
"<[Oxidation|Limit:1]@M>MMMM",
"<[Phospho|Limit:2]@S,T,Y>STYSTY",
"<[Oxidation|Position:M|Limit:1]@M>MMMM",
];
for (const original of testCases) {
const seq = sequence_1.Sequence.fromProforma(original);
const proforma = seq.toProforma();
const seq2 = sequence_1.Sequence.fromProforma(proforma);
const proforma2 = seq2.toProforma();
expect(proforma).toBe(original);
expect(proforma2).toBe(original);
const mod1 = seq.globalMods[0];
const mod2 = seq2.globalMods[0];
expect(mod1.getLimitPerPosition()).toBe(mod2.getLimitPerPosition());
}
});
test("should round-trip colocalization flags", () => {
const testCases = [
"<[Oxidation|CoMKP]@M>PEPTIDE",
"<[Oxidation|CoMUP]@M>PEPTIDE",
];
for (const original of testCases) {
const seq = sequence_1.Sequence.fromProforma(original);
const proforma = seq.toProforma();
const seq2 = sequence_1.Sequence.fromProforma(proforma);
const proforma2 = seq2.toProforma();
expect(proforma).toBe(original);
expect(proforma2).toBe(original);
const mod1 = seq.globalMods[0];
const mod2 = seq2.globalMods[0];
expect(mod1.getColocalizeKnown()).toBe(mod2.getColocalizeKnown());
expect(mod1.getColocalizeUnknown()).toBe(mod2.getColocalizeUnknown());
}
});
test("should round-trip combined placement controls", () => {
const testCases = [
"<[Phospho|Position:S,T,Y|Limit:2|CoMKP]@S,T,Y>PEPTIDES",
"<[Oxidation|Position:M|Limit:1|CoMUP]@M>MMMM",
];
for (const original of testCases) {
const seq = sequence_1.Sequence.fromProforma(original);
const proforma = seq.toProforma();
const seq2 = sequence_1.Sequence.fromProforma(proforma);
const proforma2 = seq2.toProforma();
expect(proforma).toBe(original);
expect(proforma2).toBe(original);
const mod1 = seq.globalMods[0];
const mod2 = seq2.globalMods[0];
expect(mod1.getPositionConstraint()).toEqual(mod2.getPositionConstraint());
expect(mod1.getLimitPerPosition()).toBe(mod2.getLimitPerPosition());
expect(mod1.getColocalizeKnown()).toBe(mod2.getColocalizeKnown());
expect(mod1.getColocalizeUnknown()).toBe(mod2.getColocalizeUnknown());
}
});
test("should handle multiple global modifications with different placement controls", () => {
const seq = sequence_1.Sequence.fromProforma("<[Phospho|Position:S,T,Y|CoMKP]@S,T,Y><[Oxidation|Position:M|CoMUP]@M>STMYST");
const globalMods = seq.globalMods;
expect(globalMods.length).toBe(2);
const mod1 = globalMods[0];
expect(mod1.getPositionConstraint()).toEqual(["S", "T", "Y"]);
expect(mod1.getColocalizeKnown()).toBe(true);
expect(mod1.getColocalizeUnknown()).toBe(false);
const mod2 = globalMods[1];
expect(mod2.getPositionConstraint()).toEqual(["M"]);
expect(mod2.getColocalizeKnown()).toBe(false);
expect(mod2.getColocalizeUnknown()).toBe(true);
});
test("should preserve placement controls in complex sequences", () => {
const original = "<[Phospho|Position:S,T,Y|Limit:2]@S,T,Y>PEPT[Oxidation]IDE";
const seq = sequence_1.Sequence.fromProforma(original);
const proforma = seq.toProforma();
expect(proforma).toBe(original);
const globalMod = seq.globalMods[0];
expect(globalMod.getPositionConstraint()).toEqual(["S", "T", "Y"]);
expect(globalMod.getLimitPerPosition()).toBe(2);
});
test("should handle long form ColocaliseModificationsOfKnownPosition and serialize as CoMKP", () => {
const input = "<[Oxidation|ColocaliseModificationsOfKnownPosition]@M>PEPTIDE";
const expected = "<[Oxidation|CoMKP]@M>PEPTIDE";
const seq = sequence_1.Sequence.fromProforma(input);
const proforma = seq.toProforma();
expect(proforma).toBe(expected);
});
test("should handle long form ColocaliseModificationsOfUnknownPosition and serialize as CoMUP", () => {
const input = "<[Oxidation|ColocaliseModificationsOfUnknownPosition]@M>PEPTIDE";
const expected = "<[Oxidation|CoMUP]@M>PEPTIDE";
const seq = sequence_1.Sequence.fromProforma(input);
const proforma = seq.toProforma();
expect(proforma).toBe(expected);
});
});