1 | /* a file to start prob_cli with coverage/profiling info enabled (for SICStus 4.2 and later) */ | |
2 | ||
3 | :- prolog_flag(compiling,_,debugcode). | |
4 | :- prolog_flag(source_info,_,on). | |
5 | :- prolog_flag(profiling,_,on). | |
6 | ||
7 | :- include(coverage_term_expander). | |
8 | ||
9 | :- ensure_loaded(prob_cli). | |
10 | ||
11 | :- use_module(coverage_tools). | |
12 | :- use_module(test_runner). | |
13 | :- use_module(tools_strings,[ajoin/2]). | |
14 | :- use_module(version). | |
15 | :- use_module(extension('pltables/pltables')). | |
16 | ||
17 | :- use_module(library(samsort), [merge/3]). | |
18 | :- use_module(library(system)). | |
19 | :- use_module(library(codesio)). | |
20 | :- use_module(library(lists)). | |
21 | :- use_module(library(file_systems)). | |
22 | :- use_module(library(sets),[subtract/3]). | |
23 | ||
24 | % use module_info/3 because we are not in a module here | |
25 | :- module_info(prob_cov,group,coverage_analysis). | |
26 | :- module_info(prob_cov,description,'ProB start file with coverage tests activated. Includes predicates to execute certain tests. Used by Jenkins.'). | |
27 | ||
28 | generate_makefile :- | |
29 | generate_makefile('Makefile_Coverage_Groups', write_coverage_target). | |
30 | ||
31 | write_coverage_target(G) :- format('~w:\n\tsicstus -l src/prob_cov.pl --goal "coverage_group_data(\'~w\'), halt ; halt."',[G,G]),nl,nl. | |
32 | ||
33 | % compute coverage for a testcase category (see testcases.pl for categories) | |
34 | coverage_group_data(Category) :- | |
35 | % ids_in_category(Category,IDs), | |
36 | % load_coverage_files(IDs,CoverageData), | |
37 | run_tests_by_category(Category,all), | |
38 | format('Obtaining coverage data for category ~w~n',[Category]), | |
39 | coverage_data(CoverageData), | |
40 | write_coverage_data(Category,CoverageData). | |
41 | ||
42 | % write collected coverage information to a Datafile | |
43 | write_coverage_data(FileName,Data) :- | |
44 | ajoin(['./temp_coverage_data/', FileName],Path), | |
45 | format('Writing coverage data to ~w~n',[Path]), | |
46 | open(Path,write,Stream), | |
47 | Out=cov(Data), | |
48 | write_canonical(Stream,Out), | |
49 | write(Stream,'.'), | |
50 | close(Stream). | |
51 | ||
52 | read_coverage_data(Path,Data) :- | |
53 | open(Path,read,S), | |
54 | read(S,cov(Data)), | |
55 | close(S). | |
56 | ||
57 | relevant_categories(units,[unit]). | |
58 | relevant_categories(laws,[laws]). | |
59 | relevant_categories(units-and-laws,[unit,laws]). | |
60 | relevant_categories(regression,Groups) :- | |
61 | all_categories(All), | |
62 | subtract(All,[unit,laws],Groups). | |
63 | relevant_categories(all,All) :- | |
64 | all_categories(All). | |
65 | relevant_categories(data_validation,[data_validation]). | |
66 | relevant_categories(X,[X]) :- atom(X). | |
67 | relevant_categories(X,X) :- is_list(X). | |
68 | ||
69 | header(units, 'Unit Tests'). | |
70 | header(laws, 'Law Checking'). | |
71 | header(units-and-laws,'Unit and Law Tests'). | |
72 | header(regression,'Regression Tests'). | |
73 | header(all,'All Tests'). | |
74 | header(data_validation,'Data Validation Tests'). | |
75 | %header(last,'Last Test Case'). | |
76 | header(X,Joined) :- atom(X), !, ajoin(['Testcases with Group ', X],Joined). | |
77 | header(X,Joined) :- is_list(X), maplist(atom,X), !, ajoin(['Testcases with Groups ', X],Joined). | |
78 | ||
79 | atom_header(Keyword, Header) :- | |
80 | header(Keyword,Tests), | |
81 | datime(datime(Year,Month,Day,Hour,Min,_Sec)), | |
82 | revision(CurrentCommit), | |
83 | format_to_codes('Coverage Report (~w, generated ~w.~w.~w ~w:~w, commit ~w)', [Tests,Day,Month,Year,Hour,Min,CurrentCommit], Codes), | |
84 | atom_codes(Header, Codes). | |
85 | ||
86 | :- use_module(tools,[ensure_atom/2]). | |
87 | load_coverage_files(IDs,CoverageData) :- | |
88 | maplist(ensure_atom,IDs,AtomicIDs), | |
89 | file_members_of_directory('./temp_coverage_data/',CoverageFiles), | |
90 | write('Reading Coverage Files'), nl, | |
91 | read_coverage_files(CoverageFiles,AtomicIDs,CoverageData). | |
92 | ||
93 | ||
94 | read_coverage_files(Files,RelevantIDs,CoverageData) :- | |
95 | read_coverage_files(Files,RelevantIDs,[],CoverageData). | |
96 | ||
97 | read_coverage_files([],_IDs,DataSoFar,DataSoFar). | |
98 | read_coverage_files([Name-Path|Files],IDs,DataSoFar,CovData) :- | |
99 | member(Name,IDs), !, | |
100 | format('.... Reading ~w~n',[Name]), | |
101 | read_coverage_data(Path,Content), | |
102 | % coverage data should already be sorted, only merge-step | |
103 | format(' .... Merging Coverage Lists~n',[]), | |
104 | merge(DataSoFar,Content,AppendedData), | |
105 | format(' .... Merging Coverage Data~n',[]), | |
106 | merge_coverage_data(AppendedData,NewData), | |
107 | length(DataSoFar,L1), length(NewData,L2), L is L2-L1, | |
108 | format(' .... ~w tags in old, ~w tags in new, ~w difference~n',[L1,L2,L]), | |
109 | garbage_collect, | |
110 | read_coverage_files(Files,IDs,NewData,CovData). | |
111 | read_coverage_files([_|Files],IDs,DataSoFar,CovData) :- | |
112 | read_coverage_files(Files,IDs,DataSoFar,CovData). | |
113 | ||
114 | merge_coverage_data([],[]). | |
115 | merge_coverage_data([C],[C]). | |
116 | merge_coverage_data([H1,H2|T],Out) :- | |
117 | merge_coverage_counter(H1,H2,HMerged), !, | |
118 | merge_coverage_data([HMerged|T],Out). | |
119 | merge_coverage_data([H1,H2|T],[H1|Out]) :- | |
120 | merge_coverage_data([H2|T],Out). | |
121 | ||
122 | merge_coverage_counter(counter(File,PredSpec,ClauseNo,LineNr)-Tag1, | |
123 | counter(File,PredSpec,ClauseNo,LineNr)-Tag2, | |
124 | counter(File,PredSpec,ClauseNo,LineNr)-TagOut) :- | |
125 | merge_coverage_tags(Tag1,Tag2,TagOut). | |
126 | ||
127 | merge_coverage_tags(Tag1,Tag2,TagOut) :- | |
128 | Tag1 =.. [Functor1,Count1], Tag2 =.. [Functor2,Count2], !, | |
129 | Count3 is Count1 + Count2, | |
130 | (Functor1 = Functor2 | |
131 | -> TagOut =.. [Functor1,Count3] | |
132 | ; TagOut =.. [nondet,Count3]). | |
133 | ||
134 | generate_report(Now,descriptions) :- !, | |
135 | ajoin(['./coverage_reports/html/descriptions/descriptions-',Now,'.html'],FilenameHTML), | |
136 | ajoin(['./coverage_reports/tex/descriptions/descriptions-',Now,'.tex'],FilenameTEX), | |
137 | gen_pltables_descriptions_table(descriptionstable, [headline('Module Descriptions')], | |
138 | [kernel, interpreter]), | |
139 | tables_to_html([descriptionstable], FilenameHTML), | |
140 | tables_to_latex([descriptionstable], FilenameTEX). | |
141 | ||
142 | generate_report(Now,Keyword) :- | |
143 | format('Generating coverage report for keyword: ~w~n',[Keyword]), | |
144 | relevant_categories(Keyword,Categories), | |
145 | load_coverage_files(Categories,CoverageInfo), | |
146 | % store coverage data of certain keywords, i.e. | |
147 | % to generate units-and-laws report by reading the units and the laws reports | |
148 | % and merging them | |
149 | write_coverage_data(Keyword,CoverageInfo), | |
150 | get_file_coverage_info(CoverageInfo,FinalCoverageInfo), | |
151 | atom_header(Keyword,Header), | |
152 | ajoin(['./coverage_reports/html/',Keyword,'/',Keyword,'-',Now,'.html'],FilenameHTML), | |
153 | ajoin(['./coverage_reports/tex/',Keyword,'/',Keyword,'-',Now,'.html'],FilenameTEX), | |
154 | ajoin(['./coverage_reports/xml/',Keyword,'/',Keyword,'-',Now,'.xml'],FilenameXML), | |
155 | ajoin(['./coverage_reports/color/',Keyword,'/'],ColorizedPath), | |
156 | ajoin(['../../color/',Keyword,'/'],ColorizedURL), | |
157 | ajoin(['./coverage_reports/emma/',Keyword,'.xml'],FilenameEmma), | |
158 | export(FinalCoverageInfo,Header,FilenameHTML,FilenameTEX,FilenameXML,ColorizedPath,ColorizedURL,FilenameEmma). | |
159 | ||
160 | export(Info,Header,FilenameHTML,FilenameTEX,FilenameXML,ColorizedPath,ColorizedURL,EmmaPath) :- | |
161 | write('colorising source files line by line'), nl, full_flush, | |
162 | colorize_source_files(Info, ColorizedPath), | |
163 | write('colorising source files line by line done'), nl, full_flush, | |
164 | write('generation coverage report tables'), nl, full_flush, | |
165 | gen_pltables_coverage_rows(Info, [headline(Header)],[kernel,interpreter],ColorizedURL), | |
166 | write('generation coverage report tables done'), nl, full_flush, | |
167 | write('exporting tables to html, tex and xml'), nl, full_flush, | |
168 | export_tables(FilenameHTML,FilenameTEX,FilenameXML), | |
169 | write('exporting tables to html, tex and xml done'), nl, full_flush, | |
170 | write('exporting coverage data to emma'), nl, full_flush, | |
171 | export_emma(EmmaPath), | |
172 | write('exporting coverage data to emma done'), nl, full_flush. | |
173 | ||
174 | % from old prob_cov.pl - now ported to new table module | |
175 | pci :- print_coverage_info. | |
176 | pci(X) :- print_coverage_info(X). | |
177 | hci :- | |
178 | get_file_coverage_info(Info), | |
179 | gen_pltables_coverage_rows(Info, [], [kernel, interpreter]), | |
180 | export_tables_html_stream(user_output). | |
181 | hci_file :- | |
182 | get_file_coverage_info(Info), | |
183 | gen_pltables_coverage_rows(Info, [], [kernel, interpreter]), | |
184 | export_tables_html('out.html'). | |
185 | lci :- | |
186 | get_file_coverage_info(Info), | |
187 | gen_pltables_coverage_rows(Info, [], [kernel, interpreter]), | |
188 | export_tables_latex_stream(user_output). | |
189 | lci_file :- | |
190 | get_file_coverage_info(Info), | |
191 | gen_pltables_coverage_rows(Info, [], [kernel, interpreter]), | |
192 | export_tables_latex('out.tex'). |