@Test
  public void should_carry_on_after_error() {
    InputFile first = file("source.java");
    InputFile second = file("UNKNOWN.java");
    when(conf.getThreadCount()).thenReturn(1);
    fs.add(first);
    fs.add(second);
    when(context.getResource(any(org.sonar.api.resources.File.class))).thenReturn(file);
    when(blameVersionSelector.detect(file, first, context)).thenThrow(new RuntimeException("BUG"));
    when(blameVersionSelector.detect(file, second, context)).thenReturn(measureUpdate);

    scmActivitySensor.analyse(project, context);

    verify(measureUpdate).execute(timeMachine, context);
  }
  @Test
  public void should_save_blame_when_file_changed() throws IOException {
    File file = file("source.java", "foo");
    DefaultInputFile inputFile = new DefaultInputFile("source.java").setFile(file);
    inputFile.setStatus(InputFile.Status.CHANGED);
    inputFile.setLines(1);
    when(blameSensor.save(file, resource, 1)).thenReturn(saveBlame);

    MeasureUpdate update = blameVersionSelector.detect(resource, inputFile, context, true);

    assertThat(update).isSameAs(saveBlame);
  }
  // SONARPLUGINS-3633
  @Test
  public void should_save_blame_when_file_is_the_same_but_no_previous_measures_present()
      throws IOException {
    File file = file("source.java", "foo");
    DefaultInputFile inputFile = new DefaultInputFile("source.java").setFile(file);
    inputFile.setStatus(InputFile.Status.SAME);
    inputFile.setLines(1);
    when(blameSensor.save(file, resource, 1)).thenReturn(saveBlame);

    MeasureUpdate update = blameVersionSelector.detect(resource, inputFile, context, false);

    assertThat(update).isSameAs(saveBlame);
  }
  @Test
  public void should_copy_previous_measures_when_file_is_the_same_and_previous_measures_present()
      throws IOException {

    File file = file("source.java", "foo");
    DefaultInputFile inputFile = new DefaultInputFile("source.java").setFile(file);
    inputFile.setStatus(InputFile.Status.SAME);
    inputFile.setLines(2);
    when(blameSensor.save(file, resource, 1)).thenReturn(saveBlame);

    MeasureUpdate update = blameVersionSelector.detect(resource, inputFile, context, true);

    assertThat(update).isInstanceOf(CopyPreviousMeasures.class);
  }
  @Test
  public void should_execute_measure_update_for_known_files() {
    InputFile source = file("source.java");
    InputFile test = file("UNKNOWN.java");
    when(conf.getThreadCount()).thenReturn(1);
    fs.add(source);
    fs.add(test);
    when(blameVersionSelector.detect(
            any(org.sonar.api.resources.File.class), eq(source), eq(context)))
        .thenReturn(measureUpdate);
    when(context.getResource(any(org.sonar.api.resources.File.class)))
        .thenReturn(file)
        .thenReturn(null);
    scmActivitySensor.analyse(project, context);

    verify(measureUpdate, only()).execute(timeMachine, context);
  }