Skip to content

Instantly share code, notes, and snippets.

@pazz
Created December 22, 2019 11:16
Show Gist options
  • Save pazz/088b9535119235dd6e719bdb4cbcba61 to your computer and use it in GitHub Desktop.
Save pazz/088b9535119235dd6e719bdb4cbcba61 to your computer and use it in GitHub Desktop.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="Auto-testing Report generated by UAM">
<meta name="author" content="Kenneth Ma, 2015">
<title>A1 Auto-Testing Report</title>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet">
<link href="http://getbootstrap.com/examples/dashboard/dashboard.css" rel="stylesheet">
<link rel="stylesheet" href="http://cdnjs.cloudflare.com/ajax/libs/bootstrap-table/1.8.1/bootstrap-table.min.css">
</head>
<body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">A1 UAM Report (generated at 2019-12-22T10:45:48)</a>
</div>
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav navbar-right">
<li><a href="#glance">At a Glance</a></li>
<li><a href="#reports">Individual Reports</a></li>
</ul>
</div>
</div>
</nav>
<div class="container-fluid">
<div class="row">
<div class="main">
<h1 id="glance" class="page-header">At a Glance</h1>
<div id="glance-graph" style="min-width: 310px; height: 700px; margin: 0 auto"></div>
<h2 id="reports" class="sub-header">Individual Results</h2>
<div class="table-responsive">
<table id="table" class="table sortable-theme-bootstrap"></table>
</div>
</div>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
<script src="http://issues.wenzhixin.net.cn/bootstrap-table/assets/bootstrap-table/src/bootstrap-table.js"></script>
<script src="http://code.highcharts.com/highcharts.js"></script>
<script src="http://code.highcharts.com/modules/exporting.js"></script>
<script type="text/javascript">
// grades listing
$(function () {
var $table = $('#table');
// construct the main report listing table
$table.bootstrapTable({
columns: [[{
field: 'student_number',
title: 'Student #',
sortable: true
}, {
field: 'name',
title: 'Full Name',
sortable: true
}, {
field: 'utorid',
title: 'UTORid',
sortable: true
}, {
field: 'email',
title: 'Student Email',
sortable: true
}, {
field: 'source',
title: 'Source Folder',
sortable: true
}].concat(testCaseNamesToColumns(tests))],
data: translateToRows(aggregated),
// expand each TestCases table
onExpandRow: function (index, row, $detail) {
var columnData = [];
var assignmentResults = getRowPasses(aggregated.results[row.id].results, false);
for (testCase in assignmentResults) {
// skip Total testCase since it already appears as default on main table
if (testCase !== 'Total') {
columnData.push({
testcase: testCase,
result: assignmentResults[testCase]
});
}
}
$detail.html('<table></table>').find('table').bootstrapTable({
columns: [{
field: 'testcase',
title: 'Test Case'
}, {
field: 'result',
title: 'Results',
cellStyle: colourRatio
}],
data: columnData,
detailView: true,
sortable: true,
striped: true,
// expand each TestMethod detailView (showing each method's results)
onExpandRow: function (testCaseIndex, testCaseRow, $testCaseDetail) {
$testCaseDetail.html('<table></table>').find('table').bootstrapTable({
columns: [{
field: 'method',
title: 'Test Method',
cellStyle: colourResult
}],
data: function () {
var testMethods = aggregated.results[row.id].results[testCaseRow.testcase];
var columnData = [];
if (testMethods) {
// grab all results and then sort them (or else we have passes always first)
if (testMethods['passes']) {
for (testMethod in testMethods['passes']) {
columnData.push({
method: testMethod,
description: testMethods['passes'][testMethod],
message: '',
details: '',
result: 'success'
});
}
}
if (testMethods['failures']) {
for (testMethod in testMethods['failures']) {
columnData.push({
method: testMethod,
description: testMethods['failures'][testMethod]['description'],
message: testMethods['failures'][testMethod]['message'],
details: testMethods['failures'][testMethod]['details'],
result: 'danger'
});
}
}
if (testMethods['errors']) {
for (testMethod in testMethods['errors']) {
columnData.push({
method: testMethod,
description: testMethods['errors'][testMethod]['description'],
message: testMethods['errors'][testMethod]['message'],
details: testMethods['errors'][testMethod]['details'],
result: 'danger'
});
}
}
} else {
columnData.push({
method: 'Import Error',
description: 'Unable to read Student Assignment',
message: '',
details: '',
result: 'danger'
});
}
// sort results by test method name
return columnData.sort(function (a, b) {
return (a['method'] > b['method']) ? 1 : -1;
});
}(),
detailView: true,
detailFormatter: function(index, row) {
return '<p><b>Description:</b> ' + (row.description ? $('<div>').text(row.description).html() : 'Not provided') + '</p>' +
(row.message ? '<p><b>Message:</b> ' + $('<div>').text(row.message).html() + '</p>' : '') +
(row.details ? '<p><b>Details:</b> <pre>' + $('<div>').text(row.details).html() + '</pre></p>' : '');
}
});
}
});
},
striped: true,
search: true,
detailView: true,
showColumns: true,
minimumCountColumns: 1,
});
});
// gives BootstrapTable sorter ability to sort grades (that appear as x/y)
function gradeSorter(a, b) {
a = parseInt(a.split('/')[0]);
b = parseInt(b.split('/')[0]);
if (a > b) return 1;
else if (a < b) return -1;
else return 0;
}
// takes an aggregated json object and then produces rows the main BootstrapTable
// used in data for main BootstrapTable
function translateToRows(report) {
var rows = [];
var row;
for (assignment in report.results) {
for (student in report.results[assignment].students) {
row = $.extend({
id: assignment,
student_number: report.results[assignment].students[student].student_number,
name: report.results[assignment].students[student].last + ', ' + report.results[assignment].students[student].first,
utorid: report.results[assignment].students[student].student_id,
source: report.results[assignment].origin,
email: '<a href="mailto:' + report.results[assignment].students[student].email + '">' + report.results[assignment].students[student].email + '</a>'
}, getRowPasses(report.results[assignment].results, true));
rows.push(row);
}
}
return rows;
}
// takes an individual assignment results json object and produces testCase names and their passes (in grade x/y format)
// if trackInGlobals is true, then add results to global grade distribution for charts
function getRowPasses(assignmentResults, trackInGlobals) {
var rowPasses = {};
var passes;
var total = 0;
for (testCase in tests) {
if (testCase !== 'Total') {
passes = Object.keys((assignmentResults[testCase] && assignmentResults[testCase].passes) || {}).length;
rowPasses[testCase] = passes + '/' + tests[testCase].count;
// add to grade distribution (for chart)
if (trackInGlobals) tests[testCase].distribution[Math.round(passes / tests[testCase].count * 10)] += 1;
// add to total for reconcilation later
total += passes;
}
}
rowPasses['Total'] = total + '/' + tests['Total'].count;
tests['Total'].distribution[Math.round(total / tests['Total'].count * 10)] += 1;
return rowPasses;
}
// reads testCase names from an aggregated report and tracks the testCase in the distribution chart
function testCaseNames(report) {
var testCases = {'Total': {count: 0, distribution: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}};
var testCase;
var total = 0;
for (test in report.tests) {
testCase = report.tests[test].split('.').slice(0, 2).join('.');
if (testCase.indexOf('unittest') == -1) {
if (!(testCase in testCases)) {
testCases[testCase] = {count: 1, distribution: [
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
]};
} else {
testCases[testCase].count += 1;
}
// add to assignment total
testCases['Total'].count += 1;
}
}
return testCases;
}
// takes a json object containing testCase names and generates header columns for the main
// BootstrapTable
function testCaseNamesToColumns(testCaseNames) {
var columns = [];
var column;
for (testCaseName in testCaseNames) {
column = {
field: testCaseName,
title: testCaseName,
sortable: true,
cellStyle: colourRatio,
visible: false,
sorter: gradeSorter,
pagination: true
}
// restore visibility to total column
if (testCaseName === 'Total') {
column['visible'] = true;
}
columns.push(column);
}
return columns;
}
// assigns an appropriate colour for cells that contain grades
// used in columns for BootstrapTable under cellStyle for cells
// that contain grades in x/y format
function colourRatio(value, row, index) {
var ratio = +value.split('/')[0] / +value.split('/')[1];
if (ratio > 0.8) {
return {
// green
classes: 'success'
}
} else if (ratio > 0) {
return {
// yellow
classes: 'warning'
}
} else {
return {
// red
classes: 'danger'
}
}
}
// assigns an appropriate colour depending on the row's
// result value (which is set to some class containing a background
// colour)
function colourResult(value, row, index) {
return {
classes: row.result
}
}
// charts
$(function () {
$('#glance-graph').highcharts({
title: {
text: 'Grade Distribution',
x: -20 //center
},
xAxis: {
title: {
text: 'Grade (Percentage)'
},
categories: ['0%', '10%', '20%', '30%', '40%', '50%', '60%', '70%', '80%', '90%', '100%']
},
yAxis: {
title: {
text: 'Number of Assignments'
},
plotLines: [{
value: 0,
width: 1,
color: '#808080'
}]
},
tooltip: {
valueSuffix: ' Students'
},
legend: {
layout: 'horizontal',
align: 'center',
verticalAlign: 'bottom',
borderWidth: 0
},
series: (function() {
var lines = [];
var line;
for (testCase in tests) {
line = {
name: testCase,
data: tests[testCase].distribution,
visible: false
}
// restore visibility for total line
if (testCase === 'Total') {
line['visible'] = true;
}
lines.push(line);
}
return lines;
})(),
credits: false,
exporting: false
});
});
var aggregated = {'results': [{'students': [{'student_id': 'correct', 'first': 'correctFirstName', 'last': 'correctLastName', 'student_number': '1111111111', 'section': 'N/A', 'source': 'N/A', 'email': 'correctEmail'}, {'student_id': 'freeloader', 'first': 'freeloaderFirstName', 'last': 'freeloaderLastName', 'student_number': '7777777777', 'section': 'N/A', 'source': 'N/A', 'email': 'freeloaderEmail'}], 'results': {'a1tester.A1Test': {'passes': {'a1tester.A1Test:testLongerPresent': 'longer list that contains the element', 'a1tester.A1Test:testSingletonPresent': 'singleton input list that contains the element', 'a1tester.A1Test:testEmpty': 'empty input list', 'a1tester.A1Test:testLongerNotPresent': 'longer list that does not contain the element', 'a1tester.A1Test:testSingletonNotPresent': 'singleton input list that does not contain the element'}, 'failures': {}, 'errors': {}}}, 'date': '2019-12-22T10:45:48', 'assignment': 'A1', 'origin': '/home/pazz/repo/teaching/2020-COMP122-OOP/sandbox/uam/jam/examples/submissions/correct/A1'}, {'students': [{'student_id': 'failures', 'first': 'failuresFirstName', 'last': 'failuresLastName', 'student_number': '2222222222', 'section': 'N/A', 'source': 'N/A', 'email': 'failuresEmail'}], 'results': {'a1tester.A1Test': {'passes': {'a1tester.A1Test:testLongerPresent': 'longer list that contains the element', 'a1tester.A1Test:testEmpty': 'empty input list', 'a1tester.A1Test:testLongerNotPresent': 'longer list that does not contain the element', 'a1tester.A1Test:testSingletonNotPresent': 'singleton input list that does not contain the element'}, 'failures': {'a1tester.A1Test:testSingletonPresent': {'description': 'singleton input list that contains the element', 'message': 'myContains(["42"], "42") should be true.', 'details': 'java.lang.AssertionError: myContains(["42"], "42") should be true.\n\tat org.junit.Assert.fail(Assert.java:88)\n\tat org.junit.Assert.assertTrue(Assert.java:41)\n\tat a1tester.A1Test.testSingletonPresent(A1Test.java:39)\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:566)\n\tat org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)\n\tat org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)\n\tat org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)\n\tat org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)\n\tat org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:298)\n\tat org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:292)\n\tat java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)\n\tat java.base/java.lang.Thread.run(Thread.java:834)\n'}}, 'errors': {}}}, 'date': '2019-12-22T10:45:48', 'assignment': 'A1', 'origin': '/home/pazz/repo/teaching/2020-COMP122-OOP/sandbox/uam/jam/examples/submissions/failures/A1'}, {'students': [{'student_id': 'infloop', 'first': 'infloopFirstName', 'last': 'infloopLastName', 'student_number': '3333333333', 'section': 'N/A', 'source': 'N/A', 'email': 'infloopEmail'}], 'results': {'a1tester.A1Test': {'passes': {'a1tester.A1Test:testSingletonPresent': 'singleton input list that contains the element', 'a1tester.A1Test:testEmpty': 'empty input list'}, 'failures': {'a1tester.A1Test:testLongerPresent': {'description': 'longer list that contains the element', 'message': 'test timed out after 2 milliseconds', 'details': 'org.junit.runners.model.TestTimedOutException: test timed out after 2 milliseconds\n\tat app//a1soln.A1.myContains(A1.java:15)\n\tat app//a1tester.A1Test.testLongerPresent(A1Test.java:69)\n\tat [email protected]/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n\tat [email protected]/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n\tat [email protected]/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n\tat [email protected]/java.lang.reflect.Method.invoke(Method.java:566)\n\tat app//org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)\n\tat app//org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)\n\tat app//org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)\n\tat app//org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)\n\tat app//org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:298)\n\tat app//org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:292)\n\tat [email protected]/java.util.concurrent.FutureTask.run(FutureTask.java:264)\n\tat [email protected]/java.lang.Thread.run(Thread.java:834)\n'}, 'a1tester.A1Test:testLongerNotPresent': {'description': 'longer list that does not contain the element', 'message': 'test timed out after 2 milliseconds', 'details': 'org.junit.runners.model.TestTimedOutException: test timed out after 2 milliseconds\n\tat app//a1soln.A1.myContains(A1.java:15)\n\tat app//a1tester.A1Test.testLongerNotPresent(A1Test.java:58)\n\tat [email protected]/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n\tat [email protected]/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n\tat [email protected]/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n\tat [email protected]/java.lang.reflect.Method.invoke(Method.java:566)\n\tat app//org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)\n\tat app//org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)\n\tat app//org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)\n\tat app//org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)\n\tat app//org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:298)\n\tat app//org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:292)\n\tat [email protected]/java.util.concurrent.FutureTask.run(FutureTask.java:264)\n\tat [email protected]/java.lang.Thread.run(Thread.java:834)\n'}, 'a1tester.A1Test:testSingletonNotPresent': {'description': 'singleton input list that does not contain the element', 'message': 'test timed out after 2 milliseconds', 'details': 'org.junit.runners.model.TestTimedOutException: test timed out after 2 milliseconds\n\tat app//a1soln.A1.myContains(A1.java:15)\n\tat app//a1tester.A1Test.testSingletonNotPresent(A1Test.java:48)\n\tat [email protected]/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n\tat [email protected]/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n\tat [email protected]/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n\tat [email protected]/java.lang.reflect.Method.invoke(Method.java:566)\n\tat app//org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)\n\tat app//org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)\n\tat app//org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)\n\tat app//org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)\n\tat app//org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:298)\n\tat app//org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:292)\n\tat [email protected]/java.util.concurrent.FutureTask.run(FutureTask.java:264)\n\tat [email protected]/java.lang.Thread.run(Thread.java:834)\n'}}, 'errors': {}}}, 'date': '2019-12-22T10:45:48', 'assignment': 'A1', 'origin': '/home/pazz/repo/teaching/2020-COMP122-OOP/sandbox/uam/jam/examples/submissions/infloop/A1'}, {'students': [{'student_id': 'nosubmission', 'first': 'nosubFirstName', 'last': 'nosubLastName', 'student_number': '4444444444', 'section': 'N/A', 'source': 'N/A', 'email': 'nosubEmail'}], 'results': {'a1tester.A1Test': {'passes': {}, 'failures': {'a1tester.A1Test:initializationError': {'description': 'Compilation errors! Could not run any tests for this class.', 'message': '', 'details': ''}}, 'errors': {}}}, 'date': '2019-12-22T10:45:48', 'assignment': 'A1', 'origin': '/home/pazz/repo/teaching/2020-COMP122-OOP/sandbox/uam/jam/examples/submissions/nosubmission/A1'}, {'students': [{'student_id': 'nullpointer', 'first': 'nullFirstName', 'last': 'nullLastName', 'student_number': '5555555555', 'section': 'N/A', 'source': 'N/A', 'email': 'nullEmail'}], 'results': {'a1tester.A1Test': {'passes': {'a1tester.A1Test:testLongerPresent': 'longer list that contains the element', 'a1tester.A1Test:testLongerNotPresent': 'longer list that does not contain the element'}, 'failures': {'a1tester.A1Test:testSingletonPresent': {'description': 'singleton input list that contains the element', 'message': '', 'details': 'java.lang.NullPointerException\n\tat a1soln.A1.myContains(A1.java:18)\n\tat a1tester.A1Test.testSingletonPresent(A1Test.java:40)\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:566)\n\tat org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)\n\tat org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)\n\tat org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)\n\tat org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)\n\tat org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:298)\n\tat org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:292)\n\tat java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)\n\tat java.base/java.lang.Thread.run(Thread.java:834)\n'}, 'a1tester.A1Test:testEmpty': {'description': 'empty input list', 'message': '', 'details': 'java.lang.NullPointerException\n\tat a1soln.A1.myContains(A1.java:18)\n\tat a1tester.A1Test.testEmpty(A1Test.java:32)\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:566)\n\tat org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)\n\tat org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)\n\tat org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)\n\tat org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)\n\tat org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:298)\n\tat org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:292)\n\tat java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)\n\tat java.base/java.lang.Thread.run(Thread.java:834)\n'}, 'a1tester.A1Test:testSingletonNotPresent': {'description': 'singleton input list that does not contain the element', 'message': '', 'details': 'java.lang.NullPointerException\n\tat a1soln.A1.myContains(A1.java:18)\n\tat a1tester.A1Test.testSingletonNotPresent(A1Test.java:48)\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:566)\n\tat org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)\n\tat org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)\n\tat org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)\n\tat org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)\n\tat org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:298)\n\tat org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:292)\n\tat java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)\n\tat java.base/java.lang.Thread.run(Thread.java:834)\n'}}, 'errors': {}}}, 'date': '2019-12-22T10:45:48', 'assignment': 'A1', 'origin': '/home/pazz/repo/teaching/2020-COMP122-OOP/sandbox/uam/jam/examples/submissions/nullpointer/A1'}, {'students': [{'student_id': 'syntax', 'first': 'syntaxErrorFirstName', 'last': 'syntaxErrorLastName', 'student_number': '6666666666', 'section': 'N/A', 'source': 'N/A', 'email': 'syntaxErrorEmail'}], 'results': {'a1tester.A1Test': {'passes': {}, 'failures': {'a1tester.A1Test:initializationError': {'description': 'Compilation errors! Could not run any tests for this class.', 'message': '', 'details': ''}}, 'errors': {}}}, 'date': '2019-12-22T10:45:48', 'assignment': 'A1', 'origin': '/home/pazz/repo/teaching/2020-COMP122-OOP/sandbox/uam/jam/examples/submissions/syntax/A1'}], 'name': 'A1', 'date': '2019-12-22T10:45:48', 'tests': ['a1tester.A1Test:initializationError', 'a1tester.A1Test:testEmpty', 'a1tester.A1Test:testLongerNotPresent', 'a1tester.A1Test:testLongerPresent', 'a1tester.A1Test:testSingletonNotPresent', 'a1tester.A1Test:testSingletonPresent']};
var tests = testCaseNames(aggregated);
</script>
</body>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment