/************************************************************************* * * * 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.biointerpretation.sars; import chemaxon.formats.MolFormatException; import chemaxon.formats.MolImporter; import chemaxon.reaction.ReactionException; import chemaxon.reaction.Reactor; import chemaxon.struc.Molecule; import chemaxon.struc.RxnMolecule; import com.act.biointerpretation.Utils.ReactionProjector; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; import java.io.IOException; import java.util.Arrays; import java.util.List; import static org.junit.Assert.assertEquals; public class FullReactionBuilderTest { private static final String INCHI_IMPORT_SETTINGS = "inchi"; static final String SUBSTRATE_1 = "InChI=1S/C4H6O3/c1-2-3(5)4(6)7/h2H2,1H3,(H,6,7)"; static final String PRODUCT_1 = "InChI=1S/C4H9NO2/c1-2-3(5)4(6)7/h3H,2,5H2,1H3,(H,6,7)"; static final String SUBSTRATE_2 = "InChI=1S/C4H6O2/c1-2-4(6)3-5/h3H,2H2,1H3"; static final String PRODUCT_2 = "InChI=1S/C4H9NO/c1-2-4(5)3-6/h3-4H,2,5H2,1H3"; static final String REACTOR_STRING_MATCH = "[#6:7]-[#6:6]-[#6:8](=[O:10])-[#6:9]=[#8:11]>>[#6:7]-[#6:6]-[#6:8](-[#7:21])-[#6:9]=[#8:11]"; static final String REACTOR_STRING_MISMATCH = "[#6:7]-[#6:6]-[#6:8](=[O:10])-[#6:9](-[#8:11])=[O:12]>>[#6:7]-[#6:6]-[#6:8](-[#7:21])-[#6:9](-[#8:11])=[O:12]"; static final ReactionProjector PROJECTOR = new ReactionProjector(); static final McsCalculator mockMcs = Mockito.mock(McsCalculator.class); static final Reactor DUMMY_SEED_REACTOR = new Reactor(); ExpandedReactionSearcher mockSearcher = Mockito.mock(ExpandedReactionSearcher.class); private Molecule substrate1, substrate2, product1, product2; private RxnMolecule rxn1, rxn2; List<RxnMolecule> rxnMoleculeList; private Reactor reactorMatch = new Reactor(); private Reactor reactorMismatch = new Reactor(); @Before public void init() throws MolFormatException, ReactionException { substrate1 = MolImporter.importMol(SUBSTRATE_1, INCHI_IMPORT_SETTINGS); product1 = MolImporter.importMol(PRODUCT_1, INCHI_IMPORT_SETTINGS); rxn1 = new RxnMolecule(); rxn1.addComponent(substrate1, RxnMolecule.REACTANTS); rxn1.addComponent(product1, RxnMolecule.PRODUCTS); substrate2 = MolImporter.importMol(SUBSTRATE_2, INCHI_IMPORT_SETTINGS); product2 = MolImporter.importMol(PRODUCT_2, INCHI_IMPORT_SETTINGS); rxn2 = new RxnMolecule(); rxn2.addComponent(substrate2, RxnMolecule.REACTANTS); rxn2.addComponent(product2, RxnMolecule.PRODUCTS); rxnMoleculeList = Arrays.asList(rxn1, rxn2); reactorMatch.setReactionString(REACTOR_STRING_MATCH); reactorMismatch.setReactionString(REACTOR_STRING_MISMATCH); } @Test public void testTwoReactionsOneReactorMatchesBoth() throws ReactionException, IOException { // Arrange Mockito.when(mockSearcher.getNextReactor()) .thenReturn(reactorMatch) .thenReturn(null); FullReactionBuilder reactionBuilder = new FullReactionBuilder(mockMcs, mockSearcher, PROJECTOR); // Act Reactor fullReactor = reactionBuilder.buildReaction(rxnMoleculeList, DUMMY_SEED_REACTOR); // Assert assertEquals("Reaction should be as returned by the searcher.", reactorMatch, fullReactor); } @Test public void testTwoReactionsOneReactorMatchesOnlyOne() throws ReactionException { // Arrange Mockito.when(mockSearcher.getNextReactor()) .thenReturn(reactorMismatch) .thenReturn(null); FullReactionBuilder reactionBuilder = new FullReactionBuilder(mockMcs, mockSearcher, PROJECTOR); // Act Reactor fullReactor = reactionBuilder.buildReaction(rxnMoleculeList, DUMMY_SEED_REACTOR); // Assert assertEquals("Reaction should return seed reactor only.", DUMMY_SEED_REACTOR, fullReactor); } @Test public void testTwoReactionsTwoReactorsSecondMatches() throws ReactionException { // Arrange Mockito.when(mockSearcher.getNextReactor()) .thenReturn(reactorMismatch) .thenReturn(reactorMatch) .thenReturn(null); FullReactionBuilder reactionBuilder = new FullReactionBuilder(mockMcs, mockSearcher, PROJECTOR); // Act Reactor fullReactor = reactionBuilder.buildReaction(rxnMoleculeList, DUMMY_SEED_REACTOR); // Assert assertEquals("Reaction should be the one that matches the reactions.", reactorMatch, fullReactor); } }