@Test
  public void computeSyntaxHighlightingOnTempProject() throws IOException {

    File baseDir = temp.newFolder();
    File srcDir = new File(baseDir, "src");
    srcDir.mkdir();

    File xooFile = new File(srcDir, "sample.xoo");
    File xoohighlightingFile = new File(srcDir, "sample.xoo.highlighting");
    FileUtils.write(xooFile, "Sample xoo\ncontent plop");
    FileUtils.write(xoohighlightingFile, "0:10:s\n11:18:k");

    TaskResult result =
        tester
            .newTask()
            .properties(
                ImmutableMap.<String, String>builder()
                    .put("sonar.projectBaseDir", baseDir.getAbsolutePath())
                    .put("sonar.projectKey", "com.foo.project")
                    .put("sonar.projectName", "Foo Project")
                    .put("sonar.projectVersion", "1.0-SNAPSHOT")
                    .put("sonar.projectDescription", "Description of Foo Project")
                    .put("sonar.sources", "src")
                    .build())
            .start();

    InputFile file = result.inputFile("src/sample.xoo");
    assertThat(result.highlightingTypeFor(file, 1, 0)).containsExactly(TypeOfText.STRING);
    assertThat(result.highlightingTypeFor(file, 1, 9)).containsExactly(TypeOfText.STRING);
    assertThat(result.highlightingTypeFor(file, 2, 0)).containsExactly(TypeOfText.KEYWORD);
    assertThat(result.highlightingTypeFor(file, 2, 8)).isEmpty();
  }
  @Test
  public void testIntraFileDuplications() throws IOException {
    File srcDir = new File(baseDir, "src");
    srcDir.mkdir();

    String content = "Sample xoo\ncontent\nfoo\nbar\nSample xoo\ncontent\n";

    File xooFile = new File(srcDir, "sample.xoo");
    FileUtils.write(xooFile, content);

    TaskResult result =
        tester
            .newTask()
            .properties(
                builder
                    .put("sonar.sources", "src")
                    .put("sonar.cpd.xoo.minimumTokens", "2")
                    .put("sonar.cpd.xoo.minimumLines", "2")
                    .put("sonar.verbose", "true")
                    .build())
            .start();

    assertThat(result.measures("com.foo.project:src/sample.xoo"))
        .extracting("metric.key", "value")
        .contains(
            tuple("duplicated_blocks", 2),
            tuple("duplicated_files", 1),
            tuple("duplicated_lines", 4));

    InputFile inputFile = result.inputFile("src/sample.xoo");
    // One clone group
    List<Duplication> duplicationGroups = result.duplicationsFor(inputFile);
    assertThat(duplicationGroups).hasSize(1);

    Duplication cloneGroup = duplicationGroups.get(0);
    assertThat(cloneGroup.duplicates()).hasSize(1);
    assertThat(cloneGroup.originBlock().startLine()).isEqualTo(1);
    assertThat(cloneGroup.originBlock().length()).isEqualTo(2);
    assertThat(cloneGroup.duplicates()).hasSize(1);
    assertThat(cloneGroup.duplicates().get(0).startLine()).isEqualTo(5);
    assertThat(cloneGroup.duplicates().get(0).length()).isEqualTo(2);
  }
  @Test
  public void computeInvalidOffsets() throws IOException {

    File baseDir = temp.newFolder();
    File srcDir = new File(baseDir, "src");
    srcDir.mkdir();

    File xooFile = new File(srcDir, "sample.xoo");
    File xoohighlightingFile = new File(srcDir, "sample.xoo.highlighting");
    FileUtils.write(xooFile, "Sample xoo\ncontent plop");
    FileUtils.write(xoohighlightingFile, "0:10:s\n18:18:k");

    exception.expect(IllegalStateException.class);
    exception.expectMessage("Error processing line 2");
    exception.expectCause(
        new TypeSafeMatcher<IllegalArgumentException>() {
          @Override
          public void describeTo(Description description) {
            description.appendText("Invalid cause");
          }

          @Override
          protected boolean matchesSafely(IllegalArgumentException e) {
            return e.getMessage().contains("Unable to highlight file");
          }
        });

    TaskResult result =
        tester
            .newTask()
            .properties(
                ImmutableMap.<String, String>builder()
                    .put("sonar.projectBaseDir", baseDir.getAbsolutePath())
                    .put("sonar.projectKey", "com.foo.project")
                    .put("sonar.projectName", "Foo Project")
                    .put("sonar.projectVersion", "1.0-SNAPSHOT")
                    .put("sonar.projectDescription", "Description of Foo Project")
                    .put("sonar.sources", "src")
                    .build())
            .start();
  }
  // SONAR-6000
  @Test
  public void truncateDuplication() throws IOException {
    File srcDir = new File(baseDir, "src");
    srcDir.mkdir();

    String duplicatedStuff = "Sample xoo\n";

    int blockCount = 10000;
    File xooFile1 = new File(srcDir, "sample.xoo");
    for (int i = 0; i < blockCount; i++) {
      FileUtils.write(xooFile1, duplicatedStuff, true);
      FileUtils.write(xooFile1, "" + i + "\n", true);
    }

    TaskResult result =
        tester
            .newTask()
            .properties(
                builder
                    .put("sonar.sources", "src")
                    .put("sonar.cpd.xoo.minimumTokens", "1")
                    .put("sonar.cpd.xoo.minimumLines", "1")
                    .build())
            .start();

    Measure duplicatedBlocks = null;
    for (Measure m : result.allMeasures()) {
      if (m.metric().key().equals("duplicated_blocks")) {
        duplicatedBlocks = m;
      }
    }
    assertThat(duplicatedBlocks.value()).isEqualTo(blockCount);

    List<Duplication> duplicationGroups =
        result.duplicationsFor(result.inputFile("src/sample.xoo"));
    assertThat(duplicationGroups).hasSize(1);

    Duplication cloneGroup = duplicationGroups.get(0);
    assertThat(cloneGroup.duplicates()).hasSize(100);
  }
  @Test
  public void testCrossFileDuplications() throws IOException {
    File srcDir = new File(baseDir, "src");
    srcDir.mkdir();

    String duplicatedStuff =
        "Sample xoo\ncontent\nfoo\nbar\ntoto\ntiti\nfoo\nbar\ntoto\ntiti\nbar\ntoto\ntiti\nfoo\nbar\ntoto\ntiti";

    File xooFile1 = new File(srcDir, "sample1.xoo");
    FileUtils.write(xooFile1, duplicatedStuff);

    File xooFile2 = new File(srcDir, "sample2.xoo");
    FileUtils.write(xooFile2, duplicatedStuff);

    TaskResult result =
        tester
            .newTask()
            .properties(
                builder
                    .put("sonar.sources", "src")
                    .put("sonar.cpd.xoo.minimumTokens", "10")
                    .put("sonar.verbose", "true")
                    .build())
            .start();

    assertThat(result.inputFiles()).hasSize(2);

    assertThat(result.measures("com.foo.project:src/sample1.xoo"))
        .extracting("metric.key", "value")
        .contains(
            tuple("duplicated_blocks", 1),
            tuple("duplicated_files", 1),
            tuple("duplicated_lines", 17));

    InputFile inputFile1 = result.inputFile("src/sample1.xoo");
    InputFile inputFile2 = result.inputFile("src/sample2.xoo");
    // One clone group on each file
    List<Duplication> duplicationGroupsFile1 = result.duplicationsFor(inputFile1);
    assertThat(duplicationGroupsFile1).hasSize(1);

    Duplication cloneGroupFile1 = duplicationGroupsFile1.get(0);
    assertThat(cloneGroupFile1.duplicates()).hasSize(1);
    assertThat(cloneGroupFile1.originBlock().startLine()).isEqualTo(1);
    assertThat(cloneGroupFile1.originBlock().length()).isEqualTo(17);
    assertThat(cloneGroupFile1.originBlock().resourceKey())
        .isEqualTo(((DefaultInputFile) inputFile1).key());
    assertThat(cloneGroupFile1.duplicates()).hasSize(1);
    assertThat(cloneGroupFile1.duplicates().get(0).resourceKey())
        .isEqualTo(((DefaultInputFile) inputFile2).key());

    List<Duplication> duplicationGroupsFile2 = result.duplicationsFor(inputFile2);
    assertThat(duplicationGroupsFile2).hasSize(1);

    Duplication cloneGroupFile2 = duplicationGroupsFile2.get(0);
    assertThat(cloneGroupFile2.duplicates()).hasSize(1);
    assertThat(cloneGroupFile2.originBlock().startLine()).isEqualTo(1);
    assertThat(cloneGroupFile2.originBlock().length()).isEqualTo(17);
    assertThat(cloneGroupFile2.originBlock().resourceKey())
        .isEqualTo(((DefaultInputFile) inputFile2).key());
    assertThat(cloneGroupFile2.duplicates()).hasSize(1);
    assertThat(cloneGroupFile2.duplicates().get(0).resourceKey())
        .isEqualTo(((DefaultInputFile) inputFile1).key());
  }