content: /*************************************************************************
  *                                                                        *
  *  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.mechanisminspection;
  
  import act.server.NoSQLAPI;
  import act.shared.Reaction;
  import com.act.biointerpretation.desalting.ReactionDesalter;
  import com.act.biointerpretation.test.util.MockedNoSQLAPI;
  import com.act.biointerpretation.test.util.TestUtils;
  import org.junit.Before;
  import org.junit.Test;
  import org.mockito.MockitoAnnotations;
  
  import java.util.ArrayList;
  import java.util.HashMap;
  import java.util.List;
  import java.util.Map;
  
  import static org.junit.Assert.assertEquals;
  import static org.junit.Assert.assertFalse;
  import static org.junit.Assert.assertTrue;
  
  public class LabelledReactionTest {
  
    TestUtils utilsObject;
  
    @Before
    public void setUp() throws Exception {
      // In case we ever use Mockito annotations, don't forget to initialize them.
      MockitoAnnotations.initMocks(ReactionDesalter.class);
      utilsObject = new TestUtils();
    }
  
    @Test
    public void testOnlyExactSetOfSubstratesAndProductsAreRecognizedByLabelledReaction() throws Exception {
      List<Reaction> testReactions = new ArrayList<>();
  
      Long[] substrates1 = {3L, 4L};
      Long[] products1 = {1L, 2L};
      Integer[] substrateCoefficients1 = {1, 1};
      Integer[] productCoefficients1 = {1, 1};
  
      // An extra substrate is added in this reaction.
      Long[] substrates2 = {3L, 4L, 5L};
      Long[] products2 = {1L, 2L};
      Integer[] substrateCoefficients2 = {1, 1, 1};
      Integer[] productCoefficients2 = {1, 1};
  
      Map<Long, String> idToChem = new HashMap<>();
      idToChem.put(1L, "InChI=1S/C6H9NOS/c1-5-6(2-3-8)9-4-7-5/h4,8H,2-3H2,1H3");
      idToChem.put(2L, "InChI=1S/C13H14N4O2/c1-8-15-7-11(12(14)17-8)16-6-9-2-4-10(5-3-9)13(18)19/h2-5,7,16H,6H2,1H3,(H,18,19)(H2,14,15,17)");
      idToChem.put(3L, "InChI=1S/C12H17N4OS/c1-8-11(3-4-17)18-7-16(8)6-10-5-14-9(2)15-12(10)13/h5,7,17H,3-4,6H2,1-2H3,(H2,13,14,15)/q+1");
      idToChem.put(4L, "InChI=1S/C7H7NO2/c8-6-3-1-5(2-4-6)7(9)10/h1-4H,8H2,(H,9,10)");
      idToChem.put(5L, "InChI=1S/C11H16NO7P/c12-7-3-1-6(2-4-7)11-10(14)9(13)8(19-11)5-18-20(15,16)17/h1-4,8-11,13-14H,5,12H2,(H2,15,16,17)/t8-,9-,10-,11+/m1/s1");
  
      Reaction testReaction1 =
          utilsObject.makeTestReaction(substrates1, products1, substrateCoefficients1, productCoefficients1, true,
              "2.5.1.2",
              " {Marsilea drummondii} thiamine + p-aminobenzoic acid -?> 4-methyl-5-(2-hydroxyethyl)-thiazole + 4-[[(4-amino-2-methylpyrimidin-5-yl)methyl]amino]benzoic acid");
  
      Reaction testReaction2 =
          utilsObject.makeTestReaction(substrates2, products2, substrateCoefficients2, productCoefficients2, true,
              "2.5.1.2",
              " {Marsilea drummondii} thiamine + p-aminobenzoic acid -?> 4-methyl-5-(2-hydroxyethyl)-thiazole + 4-[[(4-amino-2-methylpyrimidin-5-yl)methyl]amino]benzoic acid");
  
      testReactions.add(testReaction1);
      testReactions.add(testReaction2);
  
      MockedNoSQLAPI mockAPI = new MockedNoSQLAPI();
      mockAPI.installMocks(testReactions, utilsObject.SEQUENCES, utilsObject.ORGANISM_NAMES, idToChem);
  
      NoSQLAPI mockNoSQLAPI = mockAPI.getMockNoSQLAPI();
  
      LabelledReactionsCorpus reactionsCorpus = new LabelledReactionsCorpus(mockNoSQLAPI);
      reactionsCorpus.loadCorpus();
      assertTrue(reactionsCorpus.checkIfReactionIsLabelled(testReaction1));
      assertFalse(reactionsCorpus.checkIfReactionIsLabelled(testReaction2));
    }
  }
  