# For paged output
options(max.print = 1000)
library(tidyverse)
── Attaching packages ──────────────────────── tidyverse 1.3.0.9000 ──
✓ ggplot2 3.3.0 ✓ purrr 0.3.3.9000
✓ tibble 2.99.99.9014 ✓ dplyr 0.8.5
✓ tidyr 1.0.2 ✓ stringr 1.4.0
✓ readr 1.3.1.9000 ✓ forcats 0.5.0
── Conflicts ──────────────────────────────── tidyverse_conflicts() ──
x dplyr::filter() masks stats::filter()
x dplyr::lag() masks stats::lag()
# for as.data.frame.coverage
requireNamespace("covr", quietly = TRUE)
# Created by covr-per-file.R in
# https://gist.github.com/krlmlr/30a3c07d5114cde39236b2c08d69c873
test_results <- readRDS("covr-results.rds")
covr_enframe <- function(x) {
x$result %>%
as.data.frame() %>%
as_tibble() %>%
transmute(
source_file = filename,
source_pos = paste0(
source_file, ":",
first_line, ":", first_column, "-",
last_line, ":", last_column,
if_else(is.na(functions), paste0("-", functions), "")
),
value
)
}
Check errors —-
test_results %>%
filter(map_lgl(covr, ~ !is.null(.x$error))) %>%
nrow()
[1] 0
Collect coverage per expression per test file —-
long <-
test_results %>%
mutate(covr_frames = map(covr, covr_enframe)) %>%
select(-code, -covr) %>%
rename(test_file = file) %>%
unnest(covr_frames) %>%
select(source_file, everything())
# Munge file names, don't care about native code for now
long_clean <-
long %>%
filter(grepl("^R/", source_file)) %>%
mutate(source_file = gsub("^R/", "", source_file)) %>%
mutate(test_file = gsub("^test-", "", test_file))
covr_per_test_file <-
long_clean %>%
group_by(source_file, test_file) %>%
summarize(coverage = mean(value != 0)) %>%
ungroup() %>%
arrange(source_file, -coverage) %>%
group_by(source_file) %>%
mutate(rank = row_number()) %>%
ungroup()
best <-
covr_per_test_file %>%
filter(rank == 1) %>%
select(-rank)
All tests where the best coverage is obtained from a test file that’s named differently from the source file.
best %>%
filter(test_file != source_file) %>%
filter(!grepl("^utils-", source_file)) %>%
arrange(-coverage)
Which source files are covered by tests in other files? —-
long_clean_rank <-
long_clean %>%
left_join(covr_per_test_file %>% select(source_file, test_file, rank))
Joining, by = c("source_file", "test_file")
best_hit <-
long_clean_rank %>%
filter(value > 0, source_file == test_file) %>%
select(-value, -rank, -test_file)
other_hit <-
long_clean_rank %>%
filter(value > 0, source_file != test_file)
List locations that were missed by the same-file test but hit by the other test
anti_join(other_hit, best_hit, by = c("source_file", "source_pos")) %>%
group_by(source_pos) %>%
summarize(test_file = paste0(head(test_file, 3), collapse = ", ")) %>%
ungroup()
IycgLS0tCiMnIHRpdGxlOiBNaXNtYXRjaCBiZXR3ZWVuIHNvdXJjZSBhbmQgdGVzdCBmaWxlcyBpbiB0aWJibGUKIycgb3V0cHV0OgojJyAgIGh0bWxfbm90ZWJvb2s6CiMnICAgICB0b2M6IHRydWUKIycgICAgIGNvZGVfZm9sZGluZzogaGlkZQojJyAtLS0KCiMgRm9yIHBhZ2VkIG91dHB1dApvcHRpb25zKG1heC5wcmludCA9IDEwMDApCgpsaWJyYXJ5KHRpZHl2ZXJzZSkKIyBmb3IgYXMuZGF0YS5mcmFtZS5jb3ZlcmFnZQpyZXF1aXJlTmFtZXNwYWNlKCJjb3ZyIiwgcXVpZXRseSA9IFRSVUUpCgojIENyZWF0ZWQgYnkgY292ci1wZXItZmlsZS5SIGluCiMgaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20va3JsbWxyLzMwYTNjMDdkNTExNGNkZTM5MjM2YjJjMDhkNjljODczCnRlc3RfcmVzdWx0cyA8LSByZWFkUkRTKCJjb3ZyLXJlc3VsdHMucmRzIikKCmNvdnJfZW5mcmFtZSA8LSBmdW5jdGlvbih4KSB7CiAgeCRyZXN1bHQgJT4lCiAgICBhcy5kYXRhLmZyYW1lKCkgJT4lCiAgICBhc190aWJibGUoKSAlPiUKICAgIHRyYW5zbXV0ZSgKICAgICAgc291cmNlX2ZpbGUgPSBmaWxlbmFtZSwKICAgICAgc291cmNlX3BvcyA9IHBhc3RlMCgKICAgICAgICBzb3VyY2VfZmlsZSwgIjoiLAogICAgICAgIGZpcnN0X2xpbmUsICI6IiwgZmlyc3RfY29sdW1uLCAiLSIsCiAgICAgICAgbGFzdF9saW5lLCAiOiIsIGxhc3RfY29sdW1uLAogICAgICAgIGlmX2Vsc2UoaXMubmEoZnVuY3Rpb25zKSwgcGFzdGUwKCItIiwgZnVuY3Rpb25zKSwgIiIpCiAgICAgICksCiAgICAgIHZhbHVlCiAgICApCn0KCiMjJyAjIENoZWNrIGVycm9ycyAtLS0tCgp0ZXN0X3Jlc3VsdHMgJT4lCiAgZmlsdGVyKG1hcF9sZ2woY292ciwgfiAhaXMubnVsbCgueCRlcnJvcikpKSAlPiUKICBucm93KCkKCgojIycgIyBDb2xsZWN0IGNvdmVyYWdlIHBlciBleHByZXNzaW9uIHBlciB0ZXN0IGZpbGUgLS0tLQoKbG9uZyA8LQogIHRlc3RfcmVzdWx0cyAlPiUKICBtdXRhdGUoY292cl9mcmFtZXMgPSBtYXAoY292ciwgY292cl9lbmZyYW1lKSkgJT4lCiAgc2VsZWN0KC1jb2RlLCAtY292cikgJT4lCiAgcmVuYW1lKHRlc3RfZmlsZSA9IGZpbGUpICU+JQogIHVubmVzdChjb3ZyX2ZyYW1lcykgJT4lCiAgc2VsZWN0KHNvdXJjZV9maWxlLCBldmVyeXRoaW5nKCkpCgojIE11bmdlIGZpbGUgbmFtZXMsIGRvbid0IGNhcmUgYWJvdXQgbmF0aXZlIGNvZGUgZm9yIG5vdwpsb25nX2NsZWFuIDwtCiAgbG9uZyAlPiUKICBmaWx0ZXIoZ3JlcGwoIl5SLyIsIHNvdXJjZV9maWxlKSkgJT4lCiAgbXV0YXRlKHNvdXJjZV9maWxlID0gZ3N1YigiXlIvIiwgIiIsIHNvdXJjZV9maWxlKSkgJT4lCiAgbXV0YXRlKHRlc3RfZmlsZSA9IGdzdWIoIl50ZXN0LSIsICIiLCB0ZXN0X2ZpbGUpKQoKY292cl9wZXJfdGVzdF9maWxlIDwtCiAgbG9uZ19jbGVhbiAlPiUKICBncm91cF9ieShzb3VyY2VfZmlsZSwgdGVzdF9maWxlKSAlPiUKICBzdW1tYXJpemUoY292ZXJhZ2UgPSBtZWFuKHZhbHVlICE9IDApKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgYXJyYW5nZShzb3VyY2VfZmlsZSwgLWNvdmVyYWdlKSAlPiUKICBncm91cF9ieShzb3VyY2VfZmlsZSkgJT4lCiAgbXV0YXRlKHJhbmsgPSByb3dfbnVtYmVyKCkpICU+JQogIHVuZ3JvdXAoKQoKYmVzdCA8LQogIGNvdnJfcGVyX3Rlc3RfZmlsZSAlPiUKICBmaWx0ZXIocmFuayA9PSAxKSAlPiUKICBzZWxlY3QoLXJhbmspCgojJyBBbGwgdGVzdHMgd2hlcmUgdGhlIGJlc3QgY292ZXJhZ2UgaXMgb2J0YWluZWQgZnJvbSBhIHRlc3QgZmlsZQojJyB0aGF0J3MgbmFtZWQgZGlmZmVyZW50bHkgZnJvbSB0aGUgc291cmNlIGZpbGUuCmJlc3QgJT4lCiAgZmlsdGVyKHRlc3RfZmlsZSAhPSBzb3VyY2VfZmlsZSkgJT4lCiAgZmlsdGVyKCFncmVwbCgiXnV0aWxzLSIsIHNvdXJjZV9maWxlKSkgJT4lCiAgYXJyYW5nZSgtY292ZXJhZ2UpCgoKIyMnICMgV2hpY2ggc291cmNlIGZpbGVzIGFyZSBjb3ZlcmVkIGJ5IHRlc3RzIGluIG90aGVyIGZpbGVzPyAtLS0tCgpsb25nX2NsZWFuX3JhbmsgPC0KICBsb25nX2NsZWFuICU+JQogIGxlZnRfam9pbihjb3ZyX3Blcl90ZXN0X2ZpbGUgJT4lIHNlbGVjdChzb3VyY2VfZmlsZSwgdGVzdF9maWxlLCByYW5rKSkKCmJlc3RfaGl0IDwtCiAgbG9uZ19jbGVhbl9yYW5rICU+JQogIGZpbHRlcih2YWx1ZSA+IDAsIHNvdXJjZV9maWxlID09IHRlc3RfZmlsZSkgJT4lCiAgc2VsZWN0KC12YWx1ZSwgLXJhbmssIC10ZXN0X2ZpbGUpCgpvdGhlcl9oaXQgPC0KICBsb25nX2NsZWFuX3JhbmsgJT4lCiAgZmlsdGVyKHZhbHVlID4gMCwgc291cmNlX2ZpbGUgIT0gdGVzdF9maWxlKQoKIycgTGlzdCBsb2NhdGlvbnMgdGhhdCB3ZXJlIG1pc3NlZCBieSB0aGUgc2FtZS1maWxlIHRlc3QKIycgYnV0IGhpdCBieSB0aGUgb3RoZXIgdGVzdAphbnRpX2pvaW4ob3RoZXJfaGl0LCBiZXN0X2hpdCwgYnkgPSBjKCJzb3VyY2VfZmlsZSIsICJzb3VyY2VfcG9zIikpICU+JQogIGdyb3VwX2J5KHNvdXJjZV9wb3MpICU+JQogIHN1bW1hcml6ZSh0ZXN0X2ZpbGUgPSBwYXN0ZTAoaGVhZCh0ZXN0X2ZpbGUsIDMpLCBjb2xsYXBzZSA9ICIsICIpKSAlPiUKICB1bmdyb3VwKCkK