convertResponseJsonToCoverageRanges()

in src/main/resources/static/coverage.js [226:297]


  convertResponseJsonToCoverageRanges(responseJson) {
    if (!responseJson.data) {
      throw new Error('Invalid coverage lines response format. Expecting ' +
                      '"data" property');
    }

    const responseData = responseJson.data;
    if (!responseData.files) {
      throw new Error('Invalid coverage lines response format. Expecting ' +
                      '"files" property');
    }

    const responseFiles = responseData.files;
    let coverageRanges = {};

    for (var i = 0; i < responseFiles.length; i++) {
      const responseFile = responseFiles[i];
      if (!responseFile.path || !responseFile.lines) {
        throw new Error('Invalid coverage lines response format. Expecting ' +
                        '"path" and "lines" properties');
      }

      coverageRanges[responseFile.path] = new Array();
      const responseLines = responseFile.lines;
      responseLines.sort((a, b) => (a.line > b.line)? 1 : -1);
      let startLine = -1;
      let endLine = -1;
      let isCovered = null;
      for (var j = 0; j < responseLines.length; j++) {
        const responseLine = responseLines[j];
        if (!responseLine.line || responseLine.count == null) {
          throw new Error('Invalid coverage lines response format. ' +
                          'Expecting "line" and "count" properties');
        }

        if (startLine != -1 &&
            responseLine.line == endLine + 1 &&
            isCovered == (responseLine.count > 0)) {
          endLine += 1;
          continue;
        }

        if (startLine != -1) {
          coverageRanges[responseFile.path].push({
            side: 'right',
            type: (isCovered? 'COVERED' : 'NOT_COVERED'),
            code_range: {
              start_line: startLine,
              end_line: endLine,
            }
          });
        }

        startLine = responseLine.line;
        endLine = startLine;
        isCovered = (responseLine.count > 0);
      }

      if (startLine != -1) {
        coverageRanges[responseFile.path].push({
          side: 'right',
          type: (isCovered? 'COVERED' : 'NOT_COVERED'),
          code_range: {
            start_line: startLine,
            end_line: endLine,
          }
        });
      }
    }

    return coverageRanges;
  }