-
Notifications
You must be signed in to change notification settings - Fork 78
/
Copy pathsum-coverage
executable file
·103 lines (84 loc) · 3.13 KB
/
sum-coverage
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#!/usr/bin/env stack
-- stack --resolver lts-8.5 --install-ghc runghc
-- |
--
-- This is a reference implementation for cc-test-reporter sum-coverage.
--
-- What is NOT shown here:
--
-- 1. Attributes not involved in summation
-- 2. Line Counts, they're a function of summed coverage arrays
-- 4. Covered Percent, it's a function of summed line counts
-- 3. Covered Strength, it's a function of summed coverage arrays
--
module CC.TestReporter.Coverage.Sum where
import Data.Function (on)
import Data.List (groupBy, sortOn)
--------------------------------------------------------------------------------
-- Types
--------------------------------------------------------------------------------
data Payload = Payload { pSourceFiles :: [SourceFile] }
data SourceFile = SourceFile
{ sfName :: String
, sfCoverage :: Coverage
}
deriving Show
type Coverage = [CoverageElement]
data CoverageElement = Ignored | Missed | Covered Int
instance Show CoverageElement where
show Ignored = "null"
show Missed = "0"
show (Covered n) = show n
--------------------------------------------------------------------------------
-- Algorithm
--------------------------------------------------------------------------------
sumCoverage :: [Payload] -> Payload
sumCoverage = foldr1 combinePayloads
combinePayloads :: Payload -> Payload -> Payload
combinePayloads a b = Payload
{ pSourceFiles =
-- Groups reduced by fold
map (foldr1 combineSourceFiles) $
-- Where each group is all with the same name
groupBy ((==) `on` sfName) $ sortOn sfName $
-- From both payloads
pSourceFiles a ++ pSourceFiles b
}
combineSourceFiles :: SourceFile -> SourceFile -> SourceFile
combineSourceFiles a b = SourceFile
{ sfName = sfName a
, sfCoverage = zipWith combineCoverage (sfCoverage a) (sfCoverage b)
}
combineCoverage :: CoverageElement -> CoverageElement -> CoverageElement
combineCoverage (Covered x) (Covered y) = Covered $ x + y
combineCoverage x Ignored = x
combineCoverage Ignored y = y
combineCoverage x Missed = x
combineCoverage Missed y = y
--------------------------------------------------------------------------------
-- Example
--------------------------------------------------------------------------------
main :: IO ()
main = do
let p1 = Payload
[ SourceFile "a" [Missed, Missed]
, SourceFile "b" [Ignored, Ignored]
, SourceFile "c" [Covered 1, Covered 2]
]
p2 = Payload
[ SourceFile "b" [Ignored, Ignored]
, SourceFile "c" [Ignored, Covered 3]
, SourceFile "d" [Covered 2, Covered 1]
]
p3 = Payload
[ SourceFile "a" [Ignored, Covered 1]
, SourceFile "b" [Ignored, Ignored]
, SourceFile "d" [Covered 1, Missed]
]
p = sumCoverage [p1, p2, p3]
mapM_ (putStrLn . show) $ pSourceFiles p
-- SourceFile {sfName = "a", sfCoverage = [0,1]}
-- SourceFile {sfName = "b", sfCoverage = [null,null]}
-- SourceFile {sfName = "c", sfCoverage = [1,5]}
-- SourceFile {sfName = "d", sfCoverage = [3,1]}
-- vim: ft=haskell