Created
December 22, 2019 11:16
-
-
Save pazz/088b9535119235dd6e719bdb4cbcba61 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!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