@Test
  public void testSearchWithoutAutocomplete() {
    LimitedResult<List<NameConceptModelIF>> nameModeListLR = nameDAO.search("car", false);
    assertEquals(0, nameModeListLR.getRows().size());

    // test vernacular names when using a part of the name
    nameModeListLR = nameDAO.search("sali", false);
    assertEquals(1, nameModeListLR.getRows().size());
  }
  @Test
  public void testSearchScoringWithAutocomplete() {
    // test vernacular names partial match
    LimitedResult<List<NameConceptModelIF>> nameModeListLR = nameDAO.search("sali", true);
    assertEquals(1, nameModeListLR.getRows().size());
    float saliScore = nameModeListLR.getRows().get(0).getScore();

    // make sure that scores make sense
    nameModeListLR = nameDAO.search("carex sali", true);
    assertEquals(1, nameModeListLR.getRows().size());
    float carexSaliScore = nameModeListLR.getRows().get(0).getScore();
    assertTrue(
        "Full match should have a better score than partial match", carexSaliScore > saliScore);

    nameModeListLR = nameDAO.search("carex feta", true);
    assertEquals(1, nameModeListLR.getRows().size());
    float carexFetaScore = nameModeListLR.getRows().get(0).getScore();
    assertTrue(
        "Full match should have the same score for taxon and vernacular",
        carexSaliScore == carexFetaScore);
  }
 /**
  * Test to make sure that taxon and vernacular are sorted correctly when returned by search
  * function. Correctly means sorted by score then name.
  */
 @Test
 public void testTaxonVernacularOrdering() {
   LimitedResult<List<NameConceptModelIF>> nameModeListLR = nameDAO.search("carex", true);
   int idx = 0;
   int carexSabulosaIdx = 0;
   int carexSaliIdx = 0;
   for (NameConceptModelIF currName : nameModeListLR.getRows()) {
     if ("Carex sabulosa".equals(currName.getName())) {
       carexSabulosaIdx = idx;
     } else if ("carex sali".equals(currName.getName())) {
       carexSaliIdx = idx;
     }
     idx++;
   }
   assertTrue("taxon and vernacular order", carexSabulosaIdx < carexSaliIdx);
 }
  @Test
  public void testSearch() {
    // Test asciifolding filter
    LimitedResult<List<NameConceptModelIF>> nameModeListLR = nameDAO.search("epi", true);
    assertEquals(1, nameModeListLR.getRows().size());
    assertEquals(1, nameModeListLR.getTotal_rows());
    assertEquals(
        "Ascii Folding, search vernacular with accent",
        new Integer(7174),
        nameModeListLR.getRows().get(0).getTaxonId());

    // Test search using carex fe
    List<NameConceptModelIF> nameModeList = nameDAO.searchTaxon("carex fe");
    // make sure Carex feta is the first element
    assertEquals(
        "<em>Carex feta</em> L.H. Bailey",
        ((NameConceptTaxonModel) nameModeList.get(0)).getNamehtmlauthor());
    // make sure Carex alone (951) is not there
    boolean carexFound = false;
    for (NameConceptModelIF curr : nameModeList) {
      if (curr.getTaxonId().intValue() == 951) {
        carexFound = true;
      }
    }
    assertFalse(carexFound);

    // Test search carex
    nameModeListLR = nameDAO.search("carex", true);
    assertEquals(new Integer(951), nameModeListLR.getRows().get(0).getTaxonId());
    // make sure other carex are returned (carex feta)
    assertTrue(nameModeListLR.getRows().size() > 1);
    // make sure carex the genus get the higher score
    assertTrue(
        nameModeListLR.getRows().get(0).getScore() > nameModeListLR.getRows().get(1).getScore());
    // same test with searchTaxon
    nameModeList = nameDAO.searchTaxon("carex");
    assertTrue(nameModeList.get(0).getScore() > nameModeList.get(1).getScore());

    // Test fuzzy match
    //		nameModeListLR = nameDAO.search("carox",true);
    //		assertEquals(new Integer(951), nameModeListLR.getRows().get(0).getTaxonId());

    // Search for carex feta using the genus first letter
    nameModeListLR = nameDAO.search("C. feta", true);
    assertEquals(new Integer(4864), nameModeListLR.getRows().get(0).getTaxonId());
    // same test with searchTaxon
    nameModeList = nameDAO.searchTaxon("C. feta");
    assertEquals(new Integer(4864), nameModeList.get(0).getTaxonId());

    // Search using the epithet
    nameModeListLR = nameDAO.search("sabulosa", true);
    assertEquals(new Integer(5064), nameModeListLR.getRows().get(0).getTaxonId());
    // same test with searchTaxon
    nameModeList = nameDAO.searchTaxon("sabulosa");
    assertEquals(new Integer(5064), nameModeList.get(0).getTaxonId());

    // Test hybrids
    // should work without the multiply sign
    nameModeListLR = nameDAO.search("Achnella", true);
    assertEquals(
        "Search hybrid without symbol",
        new Integer(23238),
        nameModeListLR.getRows().get(0).getTaxonId());
    // should also work with the multiply sign
    nameModeListLR = nameDAO.search("×Achnella", true);
    assertEquals(
        "Search hybrid with symbol",
        new Integer(23238),
        nameModeListLR.getRows().get(0).getTaxonId());

    // Test searching for a vernacular on taxon index
    nameModeList = nameDAO.searchTaxon("epi");
    assertEquals(0, nameModeList.size());

    // Test vernacular
    nameModeListLR = nameDAO.search("japanese m", true);
    assertEquals(1, nameModeListLR.getRows().size());
    nameModeListLR = nameDAO.search("maple", true);
    assertEquals(1, nameModeListLR.getRows().size());

    // test a synonym with 2 parents
    nameModeListLR = nameDAO.search("SynonymWithTwoParents", true);
    assertEquals(new Integer(101010), nameModeListLR.getRows().get(0).getTaxonId());
    assertFalse(((NameConceptTaxonModel) nameModeListLR.getRows().get(0)).hasSingleParent());

    // Test with paging, do this one last since we change the behavior of the nameDAO
    // We should not use setPageSize outside testing
    ((ElasticSearchNameDAO) nameDAO).setPageSize(1);
    nameModeListLR = nameDAO.search("care", true, 0);
    assertEquals(1, nameModeListLR.getRows().size());
    nameModeListLR = nameDAO.search("care", true, 1);
    assertEquals(1, nameModeListLR.getRows().size());
  }