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 act.installer.wikipedia;
  
  import org.junit.Test;
  
  import java.util.Arrays;
  import java.util.HashSet;
  import java.util.Set;
  
  import static org.junit.Assert.assertEquals;
  
  public class ImportantChemicalsWikipediaTest {
  
    public static class InchiFormattingTestCase {
  
      private String description;
      private String extractedLine;
      private String matchedInchi;
      private String expectedInchi;
  
      public InchiFormattingTestCase(
          String description, String extractedLine, String matchedInchi, String expectedInchi) {
        this.description = description;
        this.extractedLine = extractedLine;
        this.matchedInchi = matchedInchi;
        this.expectedInchi = expectedInchi;
      }
  
      public String getDescription() {
        return description;
      }
  
      public String getExtractedLine() {
        return extractedLine;
      }
  
      public String getMatchedInchi() {
        return matchedInchi;
      }
  
      public String getExpectedInchi() {
        return expectedInchi;
      }
    }
  
    private HashSet<InchiFormattingTestCase> InchiFormattingTestCases = new HashSet<>();
  
    private static final InchiFormattingTestCase inchi1 = new InchiFormattingTestCase(
        "Perfect world example.",
        "| InChI=1/C5H8O2/c6-5-3-1-2-4-7-5/h1-4H2",
        "InChI=1/C5H8O2/c6-5-3-1-2-4-7-5/h1-4H2",
        "InChI=1/C5H8O2/c6-5-3-1-2-4-7-5/h1-4H2");
  
    private static final InchiFormattingTestCase inchi2 = new InchiFormattingTestCase(
        "Trailing whitespaces.",
        "| InChI=1/C5H8O2/c6-5-3-1-2-4-7-5/h1-4H2       ",
        "InChI=1/C5H8O2/c6-5-3-1-2-4-7-5/h1-4H2       ",
        "InChI=1/C5H8O2/c6-5-3-1-2-4-7-5/h1-4H2");
  
    private static final InchiFormattingTestCase inchi3 = new InchiFormattingTestCase(
        "Whitespace in the middle of InChI representation.",
        "| InChI=1/C5H8O2/c6-5-3-1-2-4 -7-5/h1-4H2",
        "InChI=1/C5H8O2/c6-5-3-1-2-4 -7-5/h1-4H2",
        "InChI=1/C5H8O2/c6-5-3-1-2-4-7-5/h1-4H2");
  
    private static final InchiFormattingTestCase inchi4 = new InchiFormattingTestCase(
        "Standard InChI prefix.",
        "| StdInChI=1S/C5H8O2/c6-5-3-1-2-4-7-5/h1-4H2",
        "InChI=1S/C5H8O2/c6-5-3-1-2-4-7-5/h1-4H2",
        "InChI=1S/C5H8O2/c6-5-3-1-2-4-7-5/h1-4H2");
  
    private static final InchiFormattingTestCase inchi5 = new InchiFormattingTestCase(
        "Spaces around equal sign.",
        "| InChI = 1/C5H8O2/c6-5-3-1-2-4-7-5/h1-4H2",
        "InChI = 1/C5H8O2/c6-5-3-1-2-4-7-5/h1-4H2",
        "InChI=1/C5H8O2/c6-5-3-1-2-4-7-5/h1-4H2");
  
    private static final InchiFormattingTestCase inchi6 = new InchiFormattingTestCase(
        "Space after equal sign.",
        "| InChI= 1/C5H8O2/c6-5-3-1-2-4-7-5/h1-4H2",
        "InChI= 1/C5H8O2/c6-5-3-1-2-4-7-5/h1-4H2",
        "InChI=1/C5H8O2/c6-5-3-1-2-4-7-5/h1-4H2");
  
    private static final InchiFormattingTestCase inchi7 = new InchiFormattingTestCase(
        "Space before equal sign.",
        "| InChI =1/C5H8O2/c6-5-3-1-2-4-7-5/h1-4H2",
        "InChI =1/C5H8O2/c6-5-3-1-2-4-7-5/h1-4H2",
        "InChI=1/C5H8O2/c6-5-3-1-2-4-7-5/h1-4H2");
  
    private static final InchiFormattingTestCase inchi8 = new InchiFormattingTestCase(
        "Many spaces after equal sign.",
        "| InChI=     1/C5H8O2/c6-5-3-1-2-4-7-5/h1-4H2",
        "InChI=     1/C5H8O2/c6-5-3-1-2-4-7-5/h1-4H2",
        "InChI=1/C5H8O2/c6-5-3-1-2-4-7-5/h1-4H2");
  
    private static final InchiFormattingTestCase inchi9 = new InchiFormattingTestCase(
        "Many spaces before equal sign.",
        "| InChI              =1/C5H8O2/c6-5-3-1-2-4-7-5/h1-4H2",
        "InChI              =1/C5H8O2/c6-5-3-1-2-4-7-5/h1-4H2",
        "InChI=1/C5H8O2/c6-5-3-1-2-4-7-5/h1-4H2");
  
    private static final InchiFormattingTestCase[] INCHI_FORMATTING_TEST_CASES_LIST =
        new InchiFormattingTestCase[] {
            inchi1,
            inchi2,
            inchi3,
            inchi4,
            inchi5,
            inchi6,
            inchi7,
            inchi8,
            inchi9
        };
  
    private static final Set<InchiFormattingTestCase> INCHI_FORMATTING_TEST_CASES = new HashSet<>(
        Arrays.asList(INCHI_FORMATTING_TEST_CASES_LIST));
  
    @Test
    public void testFormatInchiString() throws Exception {
      ImportantChemicalsWikipedia importantChemicalsWikipedia = new ImportantChemicalsWikipedia();
  
  
      for (InchiFormattingTestCase testcase : INCHI_FORMATTING_TEST_CASES) {
        assertEquals(
            "Testing case: " + testcase.getDescription(),
            importantChemicalsWikipedia.formatInchiString(testcase.getMatchedInchi()),
            testcase.getExpectedInchi()
        );
      }
    }
  
    @Test
    public void testExtractInchiFromLine() throws Exception {
      ImportantChemicalsWikipedia importantChemicalsWikipedia = new ImportantChemicalsWikipedia();
  
      for (InchiFormattingTestCase testcase : INCHI_FORMATTING_TEST_CASES) {
        assertEquals(
            "Testing case: " + testcase.getDescription(),
            importantChemicalsWikipedia.extractInchiFromLine(testcase.getExtractedLine()),
            testcase.getMatchedInchi()
        );
      }
    }
  }
  
  