atlas_coverage_core/
debug.rs

1use settings::Settings;
2use model::PuppeteerData;
3use model::SourceMap;
4use source_map::SourceMapSource;
5use vlq_decode;
6use std::path::Path;
7use util;
8use lines::calculate_executable_line_mappings;
9use source_map::process_references;
10use lines::calculate_line_coverage;
11use load;
12use std::env::current_dir;
13use std::env::args;
14use std::fs;
15use lines::FileCoverage;
16
17pub fn print_existing(settings: Settings) {
18    let args: Vec<String> = args().collect();
19    let reads = fs::read_dir(current_dir().expect("Not in a valid directory").join(&args[1])).expect("Cannot read directory");
20    let paths = reads.into_iter().map(|v| v.expect("Cannot read file entry").path()).collect::<Vec<_>>();
21
22    let values = load::load_items(paths);
23
24    for v in values {
25        print_if_has_existing_source_map(&settings, v);
26    }
27}
28
29fn print_if_has_existing_source_map(settings: &Settings, data: PuppeteerData) {
30    if let Some(source_mapping_url) = data.get_source_mapping_url() {
31        let source_path = data.url.replace(&settings.public_url_base, &settings.dist_path);
32
33        let source_mapping_url = source_mapping_url.replace("//# sourceMappingURL=", "");
34        let source_mapping_path = Path::new(&source_path)
35            .parent()
36            .unwrap()
37            .join(source_mapping_url.clone());
38
39        println!("{} - {}", source_mapping_url, data.url);
40
41        let source_mapping_path = Path::new(&source_mapping_path);
42        if source_mapping_path.exists() {
43            let source_map: SourceMap = util::deserialize_object(source_mapping_path).unwrap();
44
45            let references = process_references(&settings, &source_map);
46
47            let _meta_refs = references.iter().map(|r| r.meta()).collect::<Vec<_>>();
48//            let meta_refs = references.clone();
49
50//            println!("{:#?}", &references);
51
52//            debug_source_map(settings, &source_map, references)
53
54            let file_refs = references.iter().map(|s| s.file_path.clone()).collect();
55            let line_refs = calculate_executable_line_mappings(&source_map, references);
56            let file_coverage : Vec<FileCoverage> =
57                calculate_line_coverage(data.ranges, line_refs, file_refs, data.text.as_str());
58
59            file_coverage.iter().for_each(|fc| {
60                let content = util::fast_read(&fc.path);
61                match content {
62                    Ok(content) => {
63                        let lines = content.lines().count();
64                        let cov_lines = fc.lines.iter().last().map(|v| v.line_number);
65                        match cov_lines {
66                            Some(last_line) => {
67                                println!("Within bounds? {: <5} || {: <5} - {: <5}", last_line <= lines, lines, last_line);
68                            },
69                            None => {
70                                println!("Empty file");
71                            }
72                        }
73                    },
74                    Err(_err) => {
75                        println!("Within bounds? {: <5} - {} doesn't exist or is empty!", false, &fc.path)
76                    },
77                }
78            })
79//            println!("{}:\n------------------------------------------------------------------------------------------------\n{:#?}\n-=-=-=-=-=-=-=-=-\n{:#?}", source_mapping_path.to_string_lossy(), meta_refs, file_coverage);
80        }
81    }
82
83
84}
85
86// Currently unused, but useful code:
87
88pub fn debug_source_map(
89    _settings: &Settings,
90    source_map: &SourceMap,
91    references: Vec<SourceMapSource>,
92    minified: String,
93) {
94    let sources = references
95        .into_iter()
96        .map(SourceMapSource::convert_to_user_source)
97        .collect::<Vec<_>>();
98    let mut prev: usize = 9999;
99    let mut announce = None;
100    for v in vlq_decode::MappingData::new(source_map.mappings.as_bytes()) {
101        let minified_slice: String = minified
102            .lines()
103            .skip(v.gen_line as usize)
104            .next()
105            .unwrap()
106            .chars()
107            .skip(v.gen_column as usize)
108            .take(20)
109            .collect();
110        let mut source_slice: Option<String> = None;
111        let mut name: Option<String> = None;
112        if let Some(ref source_ref) = v.source.as_ref() {
113            if prev != source_ref.source_idx as usize {
114                prev = source_ref.source_idx as usize;
115                announce = Some(prev);
116            }
117            source_slice = sources
118                .get(source_ref.source_idx as usize)
119                .unwrap()
120                .as_ref()
121                .map(|ref source_content| {
122                    source_content
123                        .lines()
124                        .skip(source_ref.source_line as usize)
125                        .next()
126                        .unwrap()
127                        .chars()
128                        .skip(source_ref.source_col as usize)
129                        .take(20)
130                        .collect()
131                });
132            if let Some(name_idx) = source_ref.name_idx {
133                name = source_map
134                    .names
135                    .get(name_idx as usize)
136                    .map(|v| v.to_owned());
137            }
138        }
139        if let Some(announce_idx) = announce {
140            println!("--------------------------------------------------------------------------------------------");
141            println!("FILE {}", source_map.sources[announce_idx]);
142            println!("--------------------------------------------------------------------------------------------");
143            announce = None
144        }
145        if let Some(ref source_slice) = source_slice {
146            let source = v.source.as_ref().unwrap();
147            println!(
148                "{: <1}.{: <5} > {: <3}.{: <5} | {: <20} | {: <20} | {: <20}",
149                v.gen_line,
150                v.gen_column,
151                source.source_line,
152                source.source_col,
153                minified_slice,
154                source_slice,
155                name.unwrap_or("".to_owned())
156            );
157        } else {
158            println!(
159                "{: <1}.{: <5}             | {: <20} |",
160                v.gen_line, v.gen_column, minified_slice
161            );
162        }
163    }
164}