diff --git a/src/components/filters/sorting.js b/src/components/filters/sorting.js new file mode 100644 index 0000000..11ceaff --- /dev/null +++ b/src/components/filters/sorting.js @@ -0,0 +1,123 @@ +import { create_coverage_map } from './filter_utils' + +export function sort_by_coverage_X(current_state, all_data) { + const edges = current_state.edges; + + let x = current_state.x; + let y = current_state.y; + + console.log(x, y); + let x_map = create_coverage_map(edges, (e) => e.method_id, (e) => e.test_id) + + function sort_array(list, map){ + return list.sort((e1, e2) => { + const id1 = e1.get_id(); + const id2 = e2.get_id(); + + const size1 = map.has(id1) ? map.get(id1).size : 0; + const size2 = map.has(id2) ? map.get(id2).size : 0; + + return size1 < size2 + }) + } + + return { + "edges": edges, + "x": sort_array(x, x_map), + "y": y, + } +} + +export function sort_by_coverage_Y(current_state, all_data) { + const edges = current_state.edges; + + let x = current_state.x; + let y = current_state.y; + + let y_map = create_coverage_map(edges, (e) => e.test_id, (e) => e.method_id) + + function sort_array(list, map) { + return list.sort((e1, e2) => { + const id1 = e1.get_id(); + const id2 = e2.get_id(); + + const size1 = map.has(id1) ? map.get(id1).size : 0; + const size2 = map.has(id2) ? map.get(id2).size : 0; + + return size1 < size2 + }) + } + + return { + "edges": edges, + "x": x, + "y": sort_array(y, y_map), + } +} + +export function sort_by_suspciousness(current_state, all_data) { + + const edges = current_state.edges; + + let x = current_state.x; + let y = current_state.y; + + let x_map = create_coverage_map(edges, (e) => e.method_id, (e) => e.test_id) + + let test_result_map = new Map() + + edges.forEach(edge => { + const id = edge.test_id; + const result = edge.test_result === "P"; + + test_result_map.set(id, result) + }); + + let total_tests_failed = 0; + let total_tests_passed = 0; + + test_result_map.forEach((value, key) => { + if (value) { + total_tests_passed += 1; + } else { + total_tests_failed += 1; + } + }); + + function suspiciousness(method) { + let passed = 0; + let failed = 0; + + if (!x_map.has(method.get_id())) { + return -1; + } + + let tests = x_map.get(method.get_id()) + + tests.forEach((test_id) => { + if (test_result_map.has(test_id) && test_result_map.get(test_id)) { + passed += 1; + } else { + failed += 1; + } + }); + + return (failed / total_tests_failed) / ((passed/total_tests_passed) + (failed/total_tests_failed)) + } + + function sort_array(list, map) { + return list.sort((e1, e2) => { + return suspiciousness(e1) < suspiciousness(e2); + }) + } + + if (total_tests_failed !== 0 || total_tests_passed !== 0) { + x = sort_array(x, x_map); + } + + return { + "edges": edges, + "x": x, + "y": y, + } +} \ No newline at end of file diff --git a/src/components/routes/TestMatrixView.js b/src/components/routes/TestMatrixView.js index 21b3dd2..4c69b52 100644 --- a/src/components/routes/TestMatrixView.js +++ b/src/components/routes/TestMatrixView.js @@ -24,6 +24,7 @@ import './TestMatrixView.scss'; import { filter_by_num_method_covered, filter_by_test_passed, filter_by_coexecuted_tests, filter_by_test_type, TEST_TYPES, TEST_RESULT} from '../filters/test_filters'; import { filter_method_by_number_of_times_tested, filter_by_coexecuted_methods } from '../filters/method_filters'; import { process_data, FunctionMap } from '../filters/data_processor'; +import { sort_by_coverage_X, sort_by_coverage_Y, sort_by_suspciousness} from '../filters/sorting'; class TestMatrixView extends Component { constructor(props) { @@ -208,6 +209,69 @@ class TestMatrixView extends Component { + + } + aria-controls="panel1a-content" + id="data-set-selector" + > + Sorting + + + { + let new_filter_map = new FunctionMap(current_filter_map); + let func = (data) => data + switch(e.target.value) { + case "Coverage": + func = sort_by_coverage_X; + break + case "Cluster": + break; + case "Suspiciousness": + func = sort_by_suspciousness; + break; + default: + break; + } + new_filter_map.add_function("sorting-x", func); + + this.setState({ + history: this.state.history.concat(new_filter_map) + }) + }} + entries={[ + { key: 0, value: "Name" }, + { key: 1, value: "Coverage" }, + { key: 2, value: "Suspiciousness"} + ]} /> + { + let new_filter_map = new FunctionMap(current_filter_map); + let func = (data) => data + switch (e.target.value) { + case "Coverage": + func = sort_by_coverage_Y; + break + case "Cluster": + break; + default: + break; + } + new_filter_map.add_function("sorting-y", func); + + this.setState({ + history: this.state.history.concat(new_filter_map) + }) + }} + entries={[ + { key: 0, value: "Name" }, + { key: 1, value: "Coverage" } + ]} /> + + }