Skip to content

Commit

Permalink
Added test for normalization.
Browse files Browse the repository at this point in the history
  • Loading branch information
gaurav committed Apr 24, 2024
1 parent d4d1271 commit 0f9af87
Show file tree
Hide file tree
Showing 2 changed files with 345 additions and 0 deletions.
221 changes: 221 additions & 0 deletions test/examples/correct/normalization/brochu_2003_normalization.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,221 @@
{
"@context": "https://www.phyloref.org/phyx.js/context/v1.0.0/phyx.json",
"doi": "10.5281/zenodo.4562685",
"source": {
"authors": [
{
"firstname": "Gaurav",
"lastname": "Vaidya"
}
],
"year": 2021,
"title": "Digital representation of some of the clade definitions in Brochu 2003 in the Phyloreference Exchange (Phyx) format",
"journal": {
"name": "Zenodo"
},
"identifier": [
{
"type": "doi",
"id": "10.5281/zenodo.4562685"
}
]
},
"phylogenies": [
{
"newick": "(Parasuchia,(rauisuchians,Aetosauria,(sphenosuchians,(protosuchians,(mesosuchians,(Hylaeochampsa,Aegyptosuchus,Stomatosuchus,(Allodaposuchus,('Gavialis gangeticus',(('Diplocynodon ratelii',('Alligator mississippiensis','Caiman crocodilus')Alligatoridae)Alligatoroidea,('Tomistoma schlegelii',('Osteolaemus tetraspis','Crocodylus niloticus')Crocodylinae)Crocodylidae)Brevirostres)Crocodylia))Eusuchia)Mesoeucrocodylia)Crocodyliformes)Crocodylomorpha))root;",
"label": "Fig 1 from Brochu 2003",
"@id": "#phylogeny0",
"source": {
"type": "article",
"title": "Phylogenetic approaches toward crocodylian history",
"authors": [
{
"name": "Christopher A. Brochu",
"alternate": [
"Brochu, Christopher A."
],
"firstname": "Christopher",
"middlename": "A.",
"lastname": "Brochu"
}
],
"year": 2003,
"figure": "1",
"identifier": [
{
"type": "doi",
"id": "10.1146/annurev.earth.31.100901.141308"
}
],
"link": [
{
"url": "https://www.annualreviews.org/doi/10.1146/annurev.earth.31.100901.141308"
}
],
"journal": {
"name": "Annual Review of Earth and Planetary Sciences",
"volume": "31",
"pages": "357--397",
"identifier": [
{
"type": "eISSN",
"id": "1545-4495"
}
]
}
}
}
],
"phylorefs": [
{
"@id": "#Alligatoridae1_same",
"label": "Alligatoridae",
"scientificNameAuthorship": {
"bibliographicCitation": "(Cuvier 1807)"
},
"phylorefType": "phyloref:PhyloreferenceUsingMinimumClade",
"definition": "Alligatoridae (Cuvier 1807).\n\nLast common ancestor of Alligator mississippiensis and Caiman crocodilus and all of its descendents.",
"definitionSource": {
"type": "article",
"title": "Phylogenetic approaches toward crocodylian history",
"authors": [
{
"name": "Christopher A. Brochu",
"alternate": [
"Brochu, Christopher A."
],
"firstname": "Christopher",
"middlename": "A.",
"lastname": "Brochu"
}
],
"year": 2003,
"figure": "1",
"identifier": [
{
"type": "doi",
"id": "10.1146/annurev.earth.31.100901.141308"
}
],
"link": [
{
"url": "https://www.annualreviews.org/doi/10.1146/annurev.earth.31.100901.141308"
}
],
"journal": {
"name": "Annual Review of Earth and Planetary Sciences",
"volume": "31",
"pages": "357--397",
"identifier": [
{
"type": "eISSN",
"id": "1545-4495"
}
]
}
},
"internalSpecifiers": [
{
"@type": "http://rs.tdwg.org/ontology/voc/TaxonConcept#TaxonConcept",
"hasName": {
"@type": "http://rs.tdwg.org/ontology/voc/TaxonName#TaxonName",
"nomenclaturalCode": "http://rs.tdwg.org/ontology/voc/TaxonName#ICZN",
"label": "Caiman crocodilus",
"nameComplete": "Caiman crocodilus",
"genusPart": "Caiman",
"specificEpithet": "crocodilus"
}
},
{
"@type": "http://rs.tdwg.org/ontology/voc/TaxonConcept#TaxonConcept",
"hasName": {
"@type": "http://rs.tdwg.org/ontology/voc/TaxonName#TaxonName",
"nomenclaturalCode": "http://rs.tdwg.org/ontology/voc/TaxonName#ICZN",
"label": "Alligator mississippiensis",
"nameComplete": "Alligator mississippiensis",
"genusPart": "Alligator",
"specificEpithet": "mississippiensis"
},
"label": "Alligator mississippiensis"
}
],
"externalSpecifiers": []
},
{
"@id": "#Alligatoridae2_same",
"label": "Alligatoridae",
"scientificNameAuthorship": {
"bibliographicCitation": "(Cuvier 1807)"
},
"phylorefType": "phyloref:PhyloreferenceUsingMinimumClade",
"definition": "Alligatoridae (Cuvier 1807).\n\nLast common ancestor of Alligator mississippiensis and Caiman crocodilus and all of its descendents.",
"definitionSource": {
"type": "article",
"title": "Phylogenetic approaches toward crocodylian history",
"authors": [
{
"name": "Christopher A. Brochu",
"alternate": [
"Brochu, Christopher A."
],
"firstname": "Christopher",
"middlename": "A.",
"lastname": "Brochu"
}
],
"year": 2003,
"figure": "1",
"identifier": [
{
"type": "doi",
"id": "10.1146/annurev.earth.31.100901.141308"
}
],
"link": [
{
"url": "https://www.annualreviews.org/doi/10.1146/annurev.earth.31.100901.141308"
}
],
"journal": {
"name": "Annual Review of Earth and Planetary Sciences",
"volume": "31",
"pages": "357--397",
"identifier": [
{
"type": "eISSN",
"id": "1545-4495"
}
]
}
},
"internalSpecifiers": [
{
"@type": "http://rs.tdwg.org/ontology/voc/TaxonConcept#TaxonConcept",
"hasName": {
"@type": "http://rs.tdwg.org/ontology/voc/TaxonName#TaxonName",
"label": "Caiman crocodilus",
"nameComplete": "Caiman crocodilus",
"genusPart": "Caiman",
"specificEpithet": "crocodilus",
"nomenclaturalCode": "http://rs.tdwg.org/ontology/voc/TaxonName#ICZN"
},
"label": "Caiman crocodilus"
},
{
"@type": "http://rs.tdwg.org/ontology/voc/TaxonConcept#TaxonConcept",
"hasName": {
"@type": "http://rs.tdwg.org/ontology/voc/TaxonName#TaxonName",
"nomenclaturalCode": "http://rs.tdwg.org/ontology/voc/TaxonName#ICZN",
"label": "Alligator mississippiensis",
"nameComplete": "Alligator mississippiensis",
"genusPart": "Alligator",
"specificEpithet": "mississippiensis"
},
"label": "Alligator mississippiensis"
}
],
"externalSpecifiers": []
}
],
"defaultNomenclaturalCodeIRI": "http://rs.tdwg.org/ontology/voc/TaxonName#ICZN"
}
124 changes: 124 additions & 0 deletions test/normalization.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
/*
* Test normalization on examples/correct/normalization files.
*/

const fs = require('fs');
const path = require('path');

const chai = require('chai');

const phyx = require('../src');

const expect = chai.expect;

/**
* When making the comparisons, we need to remove the `@id`s which would otherwise be different
* between the phylorefs being compared.
*
* @param phyloref The phyloref whose '@id' needs to be removed.
*/
function removeId(phyloref) {
// Shallow copy the phyloref.
const copiedPhyloref = Object.assign({}, phyloref);
// Delete the '@id'.
delete copiedPhyloref['@id'];
return copiedPhyloref;
}


/**
* Test whether normalization of phyloreferences and phylogenies work as expected.
* This test does not cover Phyx normalization.
*/

describe('Phyloref and phylogeny normalization', function () {
describe('Test all normalization Phyx files', function () {
/*
* Normalization Phyx files consist of a number of phyloreferences and phylogenies. We can
* test them by confirming:
* - every phyloref or phylogeny should be DIFFERENT from every other.
* - every phyloref or phylogeny whose `@id` ends with `_same` should be IDENTICAL to
* every other phyloref or phylogeny whose `@id` ends with `_same` after NORMALIZATION (to
* test non-same phyloref or phylogeny files, they should be placed in different files).
* - every phyloref or phylogeny whose `@id` ends with `_different` should be DIFFERENT to
* every phyloref or phylogeny whose `@id` ends with `_same` even after NORMALIZATION.
*/
const normalizationExamples = fs
.readdirSync(path.resolve(__dirname, './examples/correct/normalization'))
.filter(filename => filename.endsWith('.json'));

normalizationExamples.forEach((example) => {
const basename = path.resolve(__dirname, './examples/correct/normalization', path.parse(example).name);
const jsonFilename = `${basename}.json`;

describe(`Normalization test file '${example}'`, function () {
const phyxDoc = JSON.parse(fs.readFileSync(jsonFilename));
const phylorefs = phyxDoc.phylorefs || [];
const samePhylorefs = phylorefs.filter(p => (p['@id'] || '').endsWith('_same'));
const differentPhylorefs = phylorefs.filter(p => (p['@id'] || '').endsWith('_different'));

// We don't need phylogeny normalization yet, so there's no point in testing them.
describe('Test phylogenies', function () {
it("These tests have not yet been implemented since we don't have an urgent need for them.");
});

// So we only focus on phyloreference normalization.
describe('Test phyloreferences', function () {
it('should have multiple same phyloreferences for testing', function () {
expect(samePhylorefs).to.not.be.empty;
});

// No two phyloreferences in a normalization file should be deeply identical to each
// other, otherwise the test will be pointless.
phylorefs.forEach((phyloref1) => {
phylorefs.forEach((phyloref2) => {
if (phyloref1 === phyloref2) return;
expect(removeId(phyloref1))
.to
.not
.deep
.equal(removeId(phyloref2),
'No two phyloreferences in a single normalization file should be identical.');
});
});

// Every pair of `_same` phyloreferences should be different.
samePhylorefs.forEach((phyloref1) => {
samePhylorefs.forEach((phyloref2) => {
if (phyloref1 === phyloref2) return;
expect(
removeId(phyx.PhylorefWrapper.normalize(phyloref1))
)
.to
.deep
.equal(
removeId(phyx.PhylorefWrapper.normalize(phyloref2)),
`Expected phyloref ${phyloref1['@id']} to deeply equal ${phyloref2['@id']} `
+ 'after normalization'
);
});
});

// Every pair of `_different` phyloreferences should be different from every `_same`
// phyloreference, even after normalization.
differentPhylorefs.forEach((phyloref1) => {
samePhylorefs.forEach((phyloref2) => {
if (phyloref1 === phyloref2) return;
expect(
removeId(phyx.PhylorefWrapper.normalize(phyloref1))
)
.to
.not
.deep
.equal(
removeId(phyx.PhylorefWrapper.normalize(phyloref2)),
`Expected phyloref ${phyloref1['@id']} to not deeply equal ${phyloref2['@id']} `
+ 'after normalization'
);
});
});
});
});
});
});
});

0 comments on commit 0f9af87

Please sign in to comment.