public void testGroupingByName2UrnsNameComesLate() {
    model
        .getGroupedSearchResults()
        .addListEventListener(new GroupingListEventListener(new SimilarResultsFileNameDetector()));

    TestSearchResult testResult1 = new TestSearchResult("1", "file name");
    TestSearchResult testResult2 = new TestSearchResult("2", "other file");
    TestSearchResult testResult3 = new TestSearchResult("1", "file name");
    // other file for urn1 is coming in late
    TestSearchResult testResult4 = new TestSearchResult("1", "other file");

    model.addSearchResult(testResult1);
    model.addSearchResult(testResult2);
    model.addSearchResult(testResult3);
    model.addSearchResult(testResult4);

    List<VisualSearchResult> results = model.getGroupedSearchResults();
    Assert.assertEquals(2, results.size());
    VisualSearchResult group0 = results.get(0);
    List<VisualSearchResult> similarResults0 = group0.getSimilarResults();
    Assert.assertEquals(0, similarResults0.size());
    List<SearchResult> coreResults0 = group0.getCoreSearchResults();
    Assert.assertEquals(3, coreResults0.size());

    VisualSearchResult group1 = results.get(1);
    List<VisualSearchResult> similarResults1 = group1.getSimilarResults();
    Assert.assertEquals(1, similarResults1.size());
    List<SearchResult> coreResults1 = group1.getCoreSearchResults();
    Assert.assertEquals(1, coreResults1.size());

    Assert.assertNull(group1.getSimilarityParent());
    Assert.assertEquals(group1, group0.getSimilarityParent());
  }
  /** Tests method to retrieve sorted and filtered search results. */
  public void testGetSortedSearchResults() {
    // Create test search results.
    TestSearchResult testResult1 = new TestSearchResult("1", "xray");
    TestSearchResult testResult2 = new TestSearchResult("2", "zulu");
    TestSearchResult testResult3 = new TestSearchResult("3", "whiskey");
    TestSearchResult testResult4 = new TestSearchResult("4", "yankee");

    model.addSearchResult(testResult1);
    model.addSearchResult(testResult2);
    model.addSearchResult(testResult3);
    model.addSearchResult(testResult4);

    // Get sorted search results.
    model.setSelectedCategory(SearchCategory.ALL);
    List<VisualSearchResult> sortedList = model.getSortedSearchResults();

    // Verify unsorted order.
    String expectedReturn = "xray";
    String actualReturn = sortedList.get(0).getHeading();
    assertEquals("unsorted list", expectedReturn, actualReturn);

    // Apply sort option.
    model.setSortOption(SortOption.NAME);

    // Verify sorted order.
    expectedReturn = "whiskey";
    actualReturn = sortedList.get(0).getHeading();
    assertEquals("sorted list", expectedReturn, actualReturn);
  }
  /** Tests method to set filter editor with filter text. */
  public void testSetFilterEditor() {
    // Create test search results.
    TestSearchResult testResult1 = new TestSearchResult("1", "xray");
    TestSearchResult testResult2 = new TestSearchResult("2", "zulu");
    TestSearchResult testResult3 = new TestSearchResult("3", "whiskey");
    TestSearchResult testResult4 = new TestSearchResult("4", "yankee");

    model.addSearchResult(testResult1);
    model.addSearchResult(testResult2);
    model.addSearchResult(testResult3);
    model.addSearchResult(testResult4);

    // Get all search results.
    List<VisualSearchResult> filteredList = model.getCategorySearchResults(SearchCategory.ALL);

    // Verify unfiltered list.
    int expectedSize = 4;
    int actualSize = filteredList.size();
    assertEquals("unfiltered list size", expectedSize, actualSize);

    // Apply filter editor.
    TextMatcherEditor<VisualSearchResult> editor =
        new TextMatcherEditor<VisualSearchResult>(new VisualSearchResultTextFilterator());
    editor.setFilterText(new String[] {"z"});
    model.setFilterEditor(editor);

    // Verify filtered list.
    expectedSize = 1;
    actualSize = filteredList.size();
    assertEquals("filtered list size", expectedSize, actualSize);
  }
  public void testSameNameHyphenNameHyphenName() {

    Map<FilePropertyKey, Object> properties1 = new HashMap<FilePropertyKey, Object>();
    properties1.put(FilePropertyKey.NAME, "test-foo-bar");
    SearchResult searchResult1 = new TestSearchResult("1", "test-foo-bar.mp3", properties1);
    Map<FilePropertyKey, Object> properties2 = new HashMap<FilePropertyKey, Object>();
    properties2.put(FilePropertyKey.NAME, "test-foo-bar");
    SearchResult searchResult2 = new TestSearchResult("2", "test-foo-bar.mp3", properties2);

    model
        .getGroupedSearchResults()
        .addListEventListener(
            new GroupingListEventListener(new AudioMetaDataSimilarResultsDetector()));

    model.addSearchResult(searchResult1);
    model.addSearchResult(searchResult2);

    List<VisualSearchResult> results = model.getGroupedSearchResults();
    Assert.assertEquals(2, results.size());

    VisualSearchResult group0 = results.get(0);
    List<VisualSearchResult> similarResults0 = group0.getSimilarResults();
    Assert.assertEquals(1, similarResults0.size());
    List<SearchResult> coreResults0 = group0.getCoreSearchResults();
    Assert.assertEquals(1, coreResults0.size());

    VisualSearchResult group1 = results.get(1);
    List<VisualSearchResult> similarResults1 = group1.getSimilarResults();
    Assert.assertEquals(0, similarResults1.size());
    List<SearchResult> coreResults1 = group1.getCoreSearchResults();
    Assert.assertEquals(1, coreResults1.size());

    Assert.assertNull(group0.getSimilarityParent());
    Assert.assertEquals(group0, group1.getSimilarityParent());
  }
  public void testGroupByName4Urns() {
    model
        .getGroupedSearchResults()
        .addListEventListener(new GroupingListEventListener(new SimilarResultsFileNameDetector()));

    TestSearchResult testResult1 = new TestSearchResult("1", "other file");
    TestSearchResult testResult2 = new TestSearchResult("2", "other file");
    TestSearchResult testResult3 = new TestSearchResult("3", "other file");
    TestSearchResult testResult4 = new TestSearchResult("4", "other file");

    model.addSearchResult(testResult1);
    model.addSearchResult(testResult2);
    model.addSearchResult(testResult3);
    model.addSearchResult(testResult4);

    List<VisualSearchResult> results = model.getGroupedSearchResults();
    Assert.assertEquals(4, results.size());
    VisualSearchResult group0 = results.get(0);
    List<VisualSearchResult> similarResults0 = group0.getSimilarResults();
    Assert.assertEquals(3, similarResults0.size());
    List<SearchResult> coreResults0 = group0.getCoreSearchResults();
    Assert.assertEquals(1, coreResults0.size());

    VisualSearchResult group1 = results.get(1);
    List<VisualSearchResult> similarResults1 = group1.getSimilarResults();
    Assert.assertEquals(0, similarResults1.size());
    List<SearchResult> coreResults1 = group1.getCoreSearchResults();
    Assert.assertEquals(1, coreResults1.size());

    VisualSearchResult group2 = results.get(2);
    List<VisualSearchResult> similarResults2 = group2.getSimilarResults();
    Assert.assertEquals(0, similarResults2.size());
    List<SearchResult> coreResults2 = group2.getCoreSearchResults();
    Assert.assertEquals(1, coreResults2.size());

    VisualSearchResult group3 = results.get(3);
    List<VisualSearchResult> similarResults3 = group3.getSimilarResults();
    Assert.assertEquals(0, similarResults3.size());
    List<SearchResult> coreResults3 = group1.getCoreSearchResults();
    Assert.assertEquals(1, coreResults3.size());

    Assert.assertEquals(group0, group1.getSimilarityParent());
    Assert.assertNull(group0.getSimilarityParent());
    Assert.assertEquals(group0, group2.getSimilarityParent());
    Assert.assertEquals(group0, group3.getSimilarityParent());
  }
  public void testGroupingByName3UrnsNameMatchViaTransitiveProperty() {
    model
        .getGroupedSearchResults()
        .addListEventListener(new GroupingListEventListener(new SimilarResultsFileNameDetector()));

    TestSearchResult testResult1 = new TestSearchResult("1", "blah1 file");
    TestSearchResult testResult2 = new TestSearchResult("1", "blah1 file");
    TestSearchResult testResult3 = new TestSearchResult("2", "blah2 file");
    TestSearchResult testResult4 = new TestSearchResult("2", "blah2 file");
    TestSearchResult testResult5 = new TestSearchResult("3", "blah1 file");
    TestSearchResult testResult6 = new TestSearchResult("3", "blah2 file");

    model.addSearchResult(testResult1);
    model.addSearchResult(testResult2);
    model.addSearchResult(testResult3);
    model.addSearchResult(testResult4);
    model.addSearchResult(testResult5);
    model.addSearchResult(testResult6);

    List<VisualSearchResult> results = model.getGroupedSearchResults();
    Assert.assertEquals(3, results.size());
    VisualSearchResult group0 = results.get(0);
    List<VisualSearchResult> similarResults0 = group0.getSimilarResults();
    Assert.assertEquals(0, similarResults0.size());
    List<SearchResult> coreResults0 = group0.getCoreSearchResults();
    Assert.assertEquals(2, coreResults0.size());

    VisualSearchResult group1 = results.get(1);
    List<VisualSearchResult> similarResults1 = group1.getSimilarResults();
    Assert.assertEquals(2, similarResults1.size());
    List<SearchResult> coreResults1 = group1.getCoreSearchResults();
    Assert.assertEquals(2, coreResults1.size());

    VisualSearchResult group2 = results.get(2);
    List<VisualSearchResult> similarResults2 = group2.getSimilarResults();
    Assert.assertEquals(0, similarResults2.size());
    List<SearchResult> coreResults2 = group2.getCoreSearchResults();
    Assert.assertEquals(2, coreResults2.size());

    Assert.assertNull(group1.getSimilarityParent());
    Assert.assertEquals(group1, group0.getSimilarityParent());
    Assert.assertEquals(group1, group2.getSimilarityParent());
  }
  /** Tests method to retrieve filtered search results by category. */
  public void testGetCategorySearchResults() {
    // Create test search results.
    TestSearchResult testResult1 = new TestSearchResult("1", "xray");
    TestSearchResult testResult2 = new TestSearchResult("2", "zulu");
    TestSearchResult testResult3 = new TestSearchResult("3", "whiskey");
    TestSearchResult testResult4 = new TestSearchResult("4", "yankee");
    testResult3.setCategory(Category.VIDEO);
    testResult4.setCategory(Category.IMAGE);

    model.addSearchResult(testResult1);
    model.addSearchResult(testResult2);
    model.addSearchResult(testResult3);
    model.addSearchResult(testResult4);

    // Get category search results.
    List<VisualSearchResult> categoryList = model.getCategorySearchResults(SearchCategory.VIDEO);

    // Verify category list.
    int expectedSize = 1;
    int actualSize = categoryList.size();
    assertEquals("category list size", expectedSize, actualSize);
  }
  public void testVisibility() {
    model
        .getGroupedSearchResults()
        .addListEventListener(new GroupingListEventListener(new SimilarResultsFileNameDetector()));

    TestSearchResult testResult1 = new TestSearchResult("1", "blah1 file");
    TestSearchResult testResult2 = new TestSearchResult("1", "blah1 file");
    TestSearchResult testResult3 = new TestSearchResult("2", "blah1 file");
    TestSearchResult testResult4 = new TestSearchResult("2", "blah2 file");
    TestSearchResult testResult5 = new TestSearchResult("3", "blah1 file");
    TestSearchResult testResult6 = new TestSearchResult("3", "blah2 file");

    model.addSearchResult(testResult1);
    List<VisualSearchResult> results = model.getGroupedSearchResults();
    Assert.assertEquals(1, results.size());
    VisualSearchResult result0 = results.get(0);
    Assert.assertTrue(result0.isVisible());
    Assert.assertFalse(result0.isChildrenVisible());
    result0.setChildrenVisible(true);
    Assert.assertTrue(result0.isVisible());
    Assert.assertTrue(result0.isChildrenVisible());

    model.addSearchResult(testResult2);
    Assert.assertTrue(result0.isVisible());
    Assert.assertTrue(result0.isChildrenVisible());

    model.addSearchResult(testResult3);

    Assert.assertTrue(result0.isVisible());
    Assert.assertTrue(result0.isChildrenVisible());
    List<VisualSearchResult> children = result0.getSimilarResults();
    Assert.assertEquals(1, children.size());
    VisualSearchResult child = children.get(0);
    Assert.assertTrue(child.isVisible());

    result0.setChildrenVisible(false);
    Assert.assertTrue(result0.isVisible());
    Assert.assertFalse(result0.isChildrenVisible());
    Assert.assertFalse(child.isVisible());
    result0.setChildrenVisible(true);

    model.addSearchResult(testResult4);
    model.addSearchResult(testResult5);

    children = result0.getSimilarResults();
    Assert.assertEquals(2, children.size());
    VisualSearchResult child0 = children.get(0);
    VisualSearchResult child1 = children.get(1);
    Assert.assertTrue(child0.isVisible());
    Assert.assertTrue(child1.isVisible());
    result0.setChildrenVisible(false);

    model.addSearchResult(testResult6);

    children = result0.getSimilarResults();
    Assert.assertEquals(2, children.size());
    child0 = children.get(0);
    child1 = children.get(1);
    Assert.assertFalse(child0.isVisible());
    Assert.assertFalse(child1.isVisible());
    result0.setChildrenVisible(true);
    Assert.assertTrue(child0.isVisible());
    Assert.assertTrue(child1.isVisible());

    results = model.getGroupedSearchResults();
    Assert.assertEquals(3, results.size());
    VisualSearchResult group0 = results.get(0);
    List<VisualSearchResult> similarResults0 = group0.getSimilarResults();
    Assert.assertEquals(2, similarResults0.size());
    List<SearchResult> coreResults0 = group0.getCoreSearchResults();
    Assert.assertEquals(2, coreResults0.size());

    VisualSearchResult group1 = results.get(1);
    List<VisualSearchResult> similarResults1 = group1.getSimilarResults();
    Assert.assertEquals(0, similarResults1.size());
    List<SearchResult> coreResults1 = group1.getCoreSearchResults();
    Assert.assertEquals(2, coreResults1.size());

    VisualSearchResult group2 = results.get(2);
    List<VisualSearchResult> similarResults2 = group2.getSimilarResults();
    Assert.assertEquals(0, similarResults2.size());
    List<SearchResult> coreResults2 = group2.getCoreSearchResults();
    Assert.assertEquals(2, coreResults2.size());

    Assert.assertNull(group0.getSimilarityParent());
    Assert.assertEquals(group0, group2.getSimilarityParent());
    Assert.assertEquals(group0, group1.getSimilarityParent());
  }