Skip to content

Commit

Permalink
Added sorting functionality to the visualization.
Browse files Browse the repository at this point in the history
  • Loading branch information
kajdreef committed Nov 7, 2020
1 parent 43afdb5 commit 6b98712
Show file tree
Hide file tree
Showing 2 changed files with 187 additions and 0 deletions.
123 changes: 123 additions & 0 deletions src/components/filters/sorting.js
Original file line number Diff line number Diff line change
@@ -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,
}
}
64 changes: 64 additions & 0 deletions src/components/routes/TestMatrixView.js
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -208,6 +209,69 @@ class TestMatrixView extends Component {
<Menu title="Commit" onChange={this.onCommitChange} entries={this.state.commits} />
</AccordionDetails>
</Accordion>
<Accordion>
<AccordionSummary
expandIcon={<ExpandMoreIcon />}
aria-controls="panel1a-content"
id="data-set-selector"
>
<span>Sorting</span>
</AccordionSummary>
<AccordionDetails className="accordion-block">
<Menu
title="Sort X-Axis"
onChange={(e) => {
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"}
]} />
<Menu
title="Sort Y-Axis"
onChange={(e) => {
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" }
]} />
</AccordionDetails>
</Accordion>
<Accordion>
<AccordionSummary
expandIcon={<ExpandMoreIcon />}
Expand Down

0 comments on commit 6b98712

Please sign in to comment.