github.com/covergates/covergates@v0.2.2-0.20201009050117-42ef8a19fb95/service/perl/coverage.go (about)

     1  package perl
     2  
     3  import "fmt"
     4  
     5  type coverDB struct {
     6  	Runs map[string]*coverRun `json:"runs"`
     7  }
     8  
     9  type coverRun struct {
    10  	Name    string                 `json:"name"`
    11  	Counts  map[string]*coverCount `json:"count"`
    12  	Dir     string                 `json:"dir"`
    13  	Digests map[string]string      `json:"digests"`
    14  }
    15  
    16  type coverCount struct {
    17  	Statement []int `json:"statement"`
    18  }
    19  
    20  type coverDigest struct {
    21  	Statement []int  `json:"statement"`
    22  	File      string `json:"file"`
    23  }
    24  
    25  func updateSummary(s map[string]*coverCount, r *coverRun) error {
    26  	for name, count := range r.Counts {
    27  		sc, ok := s[name]
    28  		if !ok {
    29  			s[name] = newCoverCount(len(count.Statement))
    30  			sc = s[name]
    31  		}
    32  		if err := sc.updateStatement(count.Statement); err != nil {
    33  			return err
    34  		}
    35  	}
    36  	return nil
    37  }
    38  
    39  func (db *coverDB) CountSummarize() (map[string]*coverCount, error) {
    40  	if len(db.Runs) <= 0 {
    41  		return nil, fmt.Errorf("No runs")
    42  	}
    43  	summary := make(map[string]*coverCount)
    44  	for _, run := range db.Runs {
    45  		if err := updateSummary(summary, run); err != nil {
    46  			return nil, err
    47  		}
    48  	}
    49  	return summary, nil
    50  }
    51  
    52  func newCoverCount(lines int) *coverCount {
    53  	return &coverCount{
    54  		Statement: make([]int, lines),
    55  	}
    56  }
    57  
    58  func (c *coverCount) updateStatement(statement []int) error {
    59  	if len(statement) != len(c.Statement) {
    60  		return fmt.Errorf("Statement count mismatch")
    61  	}
    62  	for i, n := range statement {
    63  		c.Statement[i] += n
    64  	}
    65  	return nil
    66  }