Skip to content

Commit

Permalink
add tests for hgvsg converter and genomic location validator
Browse files Browse the repository at this point in the history
  • Loading branch information
leexgh committed Jan 10, 2020
1 parent ce61955 commit 8fbd2c6
Show file tree
Hide file tree
Showing 2 changed files with 176 additions and 84 deletions.
231 changes: 157 additions & 74 deletions src/shared/lib/MutationUtils.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -440,88 +440,171 @@ describe('MutationUtils', () => {
];

it('match chorosome X and Y to 23 and 24', () => {
assert.equal("23,47836189,47836189,C,T", genomicLocationString(genomicLocation[0]));
assert.equal("24,24089764,24089764,T,G", genomicLocationString(genomicLocation[1]));
assert.equal("23,153694368,153694368,C,T", genomicLocationString(genomicLocation[2]));
assert.equal("24,152057792,152057792,C,G", genomicLocationString(genomicLocation[3]));
assert.equal("23,47836189,47836189,C,G", genomicLocationString(genomicLocation[0]), "should ocnver X to 23");
assert.equal("24,24089764,24089764,T,G", genomicLocationString(genomicLocation[1]), "should ocnver Y to 24");
assert.equal("23,153694368,153694368,C,T", genomicLocationString(genomicLocation[2]), "should ocnver x to 23");
assert.equal("24,152057792,152057792,C,G", genomicLocationString(genomicLocation[3]), "should ocnver y to 24");
});
});

describe('generate Hgvsg by mutation', () => {

const mutations:Partial<Mutation>[] = [
{
// snp
chr: "17",
startPosition: 7577121,
endPosition: 7577121,
referenceAllele: "G",
variantAllele: "A"
},
{
// ins
chr: "17",
startPosition: 7579590,
endPosition: 7579591,
referenceAllele: "-",
variantAllele: "CT"
},
{
// del
chr: "17",
startPosition: 7574030,
endPosition: 7574030,
referenceAllele: "G",
variantAllele: "-"
},
{
// delins
chr: "17",
startPosition: 7578205,
endPosition: 7578207,
referenceAllele: "CTA",
variantAllele: "TTT"
},
{
// chromosome is X
chr: "X",
startPosition: 47836189,
endPosition: 47836189,
referenceAllele: "C",
variantAllele: "G"
},
{
// invalid allele
chr: "17",
startPosition: 7574030,
endPosition: 7574030,
referenceAllele: "NA",
variantAllele: "G"
},
{
// invalid position
chr: "17",
startPosition: -1,
endPosition: -1,
referenceAllele: "G",
variantAllele: "C"
}
]

it('has valid genomic location', () => {
assert.equal(true, isValidGenomicLocation(mutations[0]));
assert.equal(false, isValidGenomicLocation(mutations[5]));
assert.equal(false, isValidGenomicLocation(mutations[6]));
const validateMutations: Partial<Mutation>[] = [
{
// valid
chr: "X",
startPosition: 47836189,
endPosition: 47836189,
referenceAllele: "C",
variantAllele: "G"
},
{
// invalid allele, referenceAllele = "NA"
chr: "17",
startPosition: 7574030,
endPosition: 7574030,
referenceAllele: "NA",
variantAllele: "G"
},
{
// invalid allele, both referenceAllele and variantAllele are "-"
chr: "17",
startPosition: 7577498,
endPosition: 7577498,
referenceAllele: "-",
variantAllele: "-"
},
{
// invalid allele, referenceAllele is empty
chr: "17",
startPosition: 7577498,
endPosition: 7577498,
referenceAllele: "",
variantAllele: "-"
},
{
// invalid position, startPosition is -1
chr: "17",
startPosition: -1,
endPosition: 7664673,
referenceAllele: "G",
variantAllele: "C"
},
{
// invalid, missing chr
chr: "",
startPosition: 7577594,
endPosition: 7577595,
referenceAllele: "AC",
variantAllele: "-"
}
];

assert.equal(true, isValidGenomicLocation(validateMutations[0]),
"should be valid genomic location");
assert.equal(false, isValidGenomicLocation(validateMutations[1]),
"should be invalid allele, referenceAllele = NA");
assert.equal(false, isValidGenomicLocation(validateMutations[2]),
"should be invalid allele, both referenceAllele and variantAllele are -");
assert.equal(false, isValidGenomicLocation(validateMutations[3]),
"should be invalid allele, referenceAllele is empty");
assert.equal(false, isValidGenomicLocation(validateMutations[4]),
"should be invalid position, startPosition is -1");
assert.equal(false, isValidGenomicLocation(validateMutations[5]),
"should be invalid, missing chr");

});

it('generate substitution hgvsg', () => {
const substitutionMutation: Partial<Mutation>[] = [
{
// substitution
chr: "17",
startPosition: 7577121,
endPosition: 7577121,
referenceAllele: "G",
variantAllele: "A"
}
];

assert.equal("17:g.7577121G>A", generateHgvsgByMutation(substitutionMutation[0]), "the hgvsg should be 17:g.7577121G>A");
});

it('generate insertion hgvsg', () => {
const insertionMutations: Partial<Mutation>[] = [
{
// ins, length of variantAllele > 1
chr: "17",
startPosition: 7579590,
endPosition: 7579591,
referenceAllele: "-",
variantAllele: "CT"
},
{
// ins, length of variantAllele = 1
chr: "17",
startPosition: 3637855,
endPosition: 3637856,
referenceAllele: "-",
variantAllele: "C"
}];

assert.equal("17:g.7579590_7579591insCT", generateHgvsgByMutation(insertionMutations[0]),
"should be insertion 17:g.7579590_7579591insCT: (chr):g.(start)_(end)ins(var)");
assert.equal("17:g.3637855_3637856insC", generateHgvsgByMutation(insertionMutations[1]),
"should be insertion 17:g.3637855_3637856insC: (chr):g.(start)_(end)ins(var)");

});

it('generate deletion hgvsg', () => {
const deletionMutations: Partial<Mutation>[] = [
{
// del, length of referenceAllele = 1
chr: "17",
startPosition: 7574030,
endPosition: 7574030,
referenceAllele: "G",
variantAllele: "-"
},
{
// del, length of referenceAllele > 1
chr: "17",
startPosition: 7577594,
endPosition: 7577595,
referenceAllele: "AC",
variantAllele: "-"
}];

assert.equal("17:g.7574030del", generateHgvsgByMutation(deletionMutations[0]),
"should be deletion 17:g.7574030del: (chr):g.(start)del");
assert.equal("17:g.7577594_7577595del", generateHgvsgByMutation(deletionMutations[1]),
"should be deletion 17:g.7577594_7577595del: (chr):g.(start)_(end)del");
});

it('generate hgvsg', () => {
assert.equal("17:g.7577121G>A", generateHgvsgByMutation(mutations[0]));
assert.equal("17:g.7579590_7579591insCT", generateHgvsgByMutation(mutations[1]));
assert.equal("17:g.7574030_7574030del", generateHgvsgByMutation(mutations[2]));
assert.equal("17:g.7578205_7578205delinsTTT", generateHgvsgByMutation(mutations[3]));
assert.equal("23:g.47836189C>G", generateHgvsgByMutation(mutations[4]));
assert.equal(null, generateHgvsgByMutation(mutations[5]));
assert.equal(null, generateHgvsgByMutation(mutations[6]));
it('generate delins hgvsg', () => {
const delinsMutations: Partial<Mutation>[] = [
{
// delins, length of variantAllele = 1
chr: "17",
startPosition: 7573443,
endPosition: 7573443,
referenceAllele: "C",
variantAllele: "TGG"
},
{
// delins, length of variantAllele > 1
chr: "17",
startPosition: 7578205,
endPosition: 7578207,
referenceAllele: "CTA",
variantAllele: "TTT"
}];

assert.equal("17:g.7573443delinsTGG", generateHgvsgByMutation(delinsMutations[0]),
"should be delins 17:g.7573443delinsTGG: (chr):g.(start)delins(var)");
assert.equal("17:g.7578205_7578207delinsTTT", generateHgvsgByMutation(delinsMutations[1]),
"should be delins 17:g.7578205_7578207delinsTTT: (chr):g.(start)_(end)delins(var)");
});
});
});
29 changes: 19 additions & 10 deletions src/shared/lib/MutationUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -233,8 +233,8 @@ export function extractGenomicLocation(mutation: Mutation)
export function genomicLocationString(genomicLocation: GenomicLocation)
{
// mapping chromosome X with 23
let chromosome = genomicLocation.chromosome.toUpperCase();
switch(genomicLocation.chromosome) {
let chromosome = genomicLocation.chromosome;
switch(genomicLocation.chromosome.toUpperCase()) {
case "X":
chromosome = "23";
break;
Expand Down Expand Up @@ -271,17 +271,24 @@ export function generateHgvsgByMutation(mutation: Partial<Mutation>): string | n
}
// del (in new format that no ref after del, may differ with genome nexus hgvsg response)
else if (mutation.variantAllele === "-") {
if (mutation.startPosition === mutation.endPosition) {
return `${mutation.chr}:g.${mutation.startPosition}del`;
}
return `${mutation.chr}:g.${mutation.startPosition}_${mutation.endPosition}del`;
}
// substitution
else if (mutation.referenceAllele!.length === 1 && mutation.variantAllele!.length === 1) {
else if (mutation.referenceAllele!.length === 1 && mutation.variantAllele!.length === 1) {
return `${mutation.chr}:g.${mutation.startPosition}${mutation.referenceAllele}>${mutation.variantAllele}`;
}
// delins (in new format that no ref after del, may differ with genome nexus hgvsg response)
// for cases (mutation.referenceAllele.length > 1 && mutation.variantAllele.length > 1)
else {
else if (mutation.referenceAllele!.length === 1 && mutation.variantAllele!.length > 1) {
return `${mutation.chr}:g.${mutation.startPosition}delins${mutation.variantAllele}`;
}
// delins (in new format that no ref after del, may differ with genome nexus hgvsg response)
// for cases mutation.referenceAllele.length > 1 && mutation.variantAllele.length >= 1
else {
return `${mutation.chr}:g.${mutation.startPosition}_${mutation.endPosition}delins${mutation.variantAllele}`;
}
}

return null;
Expand All @@ -293,10 +300,12 @@ export function isValidGenomicLocation(mutation: Partial<Mutation>): boolean {
&& mutation.endPosition && mutation.endPosition !== -1
&& mutation.referenceAllele && mutation.referenceAllele !== "NA"
&& mutation.variantAllele && mutation.variantAllele !== "NA") {

return true;
}
else {
return false;
if (mutation.referenceAllele === "-" && mutation.variantAllele === "-") {
return false;
}
return true;
}

return false;

}

0 comments on commit 8fbd2c6

Please sign in to comment.