/************************************************************************* * * * This file is part of the 20n/act project. * * 20n/act enables DNA prediction for synthetic biology/bioengineering. * * Copyright (C) 2017 20n Labs, Inc. * * * * Please direct all queries to act@20n.com. * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program. If not, see <http://www.gnu.org/licenses/>. * * * *************************************************************************/ package com.act.lcms.v2; import org.junit.Test; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; public class MassToRawMetaboliteMapParserTest { private MassToRawMetaboliteMapParser parser; private String inchiHeader = "inchi"; private String formulaHeader = "formula"; private String massHeader = "mass"; private String nameHeader = "name"; @Test(expected=RuntimeException.class) public void testEmptyHeaders() { // Setup List<String> headers = new ArrayList<>(); parser = new MassToRawMetaboliteMapParser(); // Try validating empty headers parser.validateHeaders(headers); } @Test public void testValidateSingleHeader() { // Setup List<String> headers = Collections.singletonList(inchiHeader); parser = new MassToRawMetaboliteMapParser(); // Perform validation of a single header parser.validateHeaders(headers); // Test the validation Integer expectedHeaderPosition = 0; assertEquals(parser.getMetaboliteIndex(), expectedHeaderPosition); assertEquals(parser.getMassToMoleculeMap().getKind(), MassToRawMetaboliteMap.RawMetaboliteKind.INCHI); } @Test public void testValidateMassHeader() { // Setup List<String> headers = Arrays.asList(formulaHeader, massHeader, nameHeader); parser = new MassToRawMetaboliteMapParser(); // Perform header validation parser.validateHeaders(headers); // Check that: // 1) the map has the correct kind // 2) indices are extracted as expected Integer expectedFormulaHeaderPosition = 0; Integer expectedMassHeaderPosition = 1; Integer expectedNameHeaderPosition = 2; assertEquals(parser.getMassToMoleculeMap().getKind(), MassToRawMetaboliteMap.RawMetaboliteKind.FORMULA); assertEquals(expectedFormulaHeaderPosition, parser.getMetaboliteIndex()); assertEquals(expectedMassHeaderPosition, parser.getMassIndex()); assertEquals(expectedNameHeaderPosition, parser.getNameIndex()); } @Test public void testAddRawMetabolites() { // Setup List<String> headers = Arrays.asList(formulaHeader, massHeader); parser = new MassToRawMetaboliteMapParser(); parser.validateHeaders(headers); // Add a metabolite String testCase = "C8H9NO2\t151.063"; parser.addRawMetabolite(testCase); // Test whether the metabolite was added correctly MassToRawMetaboliteMap map = parser.getMassToMoleculeMap(); assertTrue(map.containsKey(151.063)); List<RawMetabolite> value = map.get(151.063); assertEquals(1, value.size()); assertEquals("C8H9NO2", value.get(0).getMolecule()); assertEquals(151.063, value.get(0).getMonoIsotopicMass(), 0.001); } @Test public void testAddRawMetabolitesWithNames() { // Setup List<String> headers = Arrays.asList(formulaHeader, massHeader, nameHeader); parser = new MassToRawMetaboliteMapParser(); parser.validateHeaders(headers); // Add a metabolite with name String testCase = "C8H9NO2\t151.063\tAPAP"; parser.addRawMetabolite(testCase); // Test whether the metabolite was added correctly MassToRawMetaboliteMap map = parser.getMassToMoleculeMap(); assertTrue(map.containsKey(151.063)); List<RawMetabolite> value = map.get(151.063); assertEquals(1, value.size()); assertEquals("C8H9NO2", value.get(0).getMolecule()); assertEquals(151.063, value.get(0).getMonoIsotopicMass(), 0.001); assertEquals("APAP", value.get(0).getName().get()); } @Test public void testAddRawMetabolitesWithoutMass() { // Setup List<String> headers = Arrays.asList(inchiHeader, nameHeader); parser = new MassToRawMetaboliteMapParser(); parser.validateHeaders(headers); // Add inchi metabolite without mass String testCase = "InChI=1S/C8H9NO2/c1-6(10)9-7-2-4-8(11)5-3-7/h2-5,11H,1H3,(H,9,10)\tAPAP"; parser.addRawMetabolite(testCase); // Test whether the metabolite was added correctly MassToRawMetaboliteMap map = parser.getMassToMoleculeMap(); Double testKey = map.ceilingKey(151.0); assertEquals(testKey, 151.063, 0.001); List<RawMetabolite> value = map.get(testKey); assertEquals(1, value.size()); assertEquals("InChI=1S/C8H9NO2/c1-6(10)9-7-2-4-8(11)5-3-7/h2-5,11H,1H3,(H,9,10)", value.get(0).getMolecule()); assertEquals(151.063, value.get(0).getMonoIsotopicMass(), 0.001); assertEquals("APAP", value.get(0).getName().get()); } @Test public void testAddMultipleRawMetabolites() { // Setup List<String> headers = Arrays.asList(formulaHeader, massHeader, nameHeader); parser = new MassToRawMetaboliteMapParser(); parser.validateHeaders(headers); // Add multiple metabolites String testCase1 = "C8H9NO2\t151.063\tAPAP"; String testCase2 = "C8H9NO2\t151.063\tAPAP2"; parser.addRawMetabolite(testCase1); parser.addRawMetabolite(testCase2); // Test whether the metabolites were added correctly MassToRawMetaboliteMap map = parser.getMassToMoleculeMap(); assertTrue(map.containsKey(151.063)); List<RawMetabolite> value = map.get(151.063); assertEquals(2, value.size()); assertEquals("C8H9NO2", value.get(0).getMolecule()); assertEquals(151.063, value.get(0).getMonoIsotopicMass(), 0.001); assertEquals("APAP", value.get(0).getName().get()); assertEquals("C8H9NO2", value.get(1).getMolecule()); assertEquals(151.063, value.get(1).getMonoIsotopicMass(), 0.001); assertEquals("APAP2", value.get(1).getName().get()); } }