@Override
  public void shouldCorrectlyBuildASinglePath() {
    ICategory[] categories = {
      Category.DATE, Category.WORKSPACE, Category.PROJECT, Category.FOLDER, Category.FILE
    };
    List<TreePath> expected =
        asList(
            newPath(
                date,
                ws,
                fileHasParentFolder.getProject(),
                fileHasParentFolder.getParent(),
                fileHasParentFolder,
                duration));

    ICategoryProvider provider = mock(ICategoryProvider.class);
    given(provider.getSelected()).willReturn(asList(categories));
    ITreePathBuilder builder = create(provider);

    IFileDataProvider input = mock(IFileDataProvider.class);
    given(input.get()).willReturn(asList(data));
    List<TreePath> actual = builder.build(input);

    assertThat(toString(actual, expected), actual, equalTo(expected));
  }
  @Override
  public void shouldCorrectlyBuildMultiplePaths() {
    WorkspaceStorage ws2 = new WorkspaceStorage(new Path(".b"), null);
    LocalDate date2 = date.minusDays(2);
    Duration duration2 = duration.withMillis(10000);
    IFile fileHasNoParentFolder = root.getFile(new Path("/project/file.txt"));

    ICategory[] categories = {Category.PROJECT, Category.FOLDER, Category.FILE};
    List<TreePath> expected =
        asList(
            newPath(
                fileHasParentFolder.getProject(),
                fileHasParentFolder.getParent(),
                fileHasParentFolder,
                duration),
            newPath(fileHasNoParentFolder.getProject(), fileHasNoParentFolder, duration2));

    IFileData data2 = mock(IFileData.class);
    given(data2.get(IFileData.DATE)).willReturn(date2);
    given(data2.get(IFileData.DURATION)).willReturn(duration2);
    given(data2.get(IFileData.FILE)).willReturn(fileHasNoParentFolder);
    given(data2.get(IFileData.WORKSPACE)).willReturn(ws2);

    ICategoryProvider provider = mock(ICategoryProvider.class);
    given(provider.getSelected()).willReturn(asList(categories));
    ITreePathBuilder builder = create(provider);

    IFileDataProvider input = mock(IFileDataProvider.class);
    given(input.get()).willReturn(asList(data, data2));
    List<TreePath> actual = builder.build(input);

    assertThat(actual.size(), equalTo(expected.size()));
    assertThat(toString(actual, expected), actual, hasItems(expected.toArray(new TreePath[0])));
  }
  @Override
  public void shouldRetainIdenticalPaths() {
    ICategory[] categories = {Category.DATE, Category.WORKSPACE};
    List<TreePath> expected = asList(newPath(date, ws, duration), newPath(date, ws, duration));

    ICategoryProvider provider = mock(ICategoryProvider.class);
    given(provider.getSelected()).willReturn(asList(categories));
    ITreePathBuilder builder = create(provider);

    IFileDataProvider input = mock(IFileDataProvider.class);
    given(input.get()).willReturn(asList(data, data));
    List<TreePath> actual = builder.build(input);

    assertThat(toString(actual, expected), actual, equalTo(expected));
  }