blob: 410cf5dadcd4f8a62435fad3c6b50faa378b9758 [file] [log] [blame]
/*##############################################################################
# Copyright (c) 2021, ARM Limited and Contributors. All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
##############################################################################*/
const capitalize = (s) => {
if (typeof s !== 'string') return ''
return s.charAt(0).toUpperCase() + s.slice(1)
}
function isValidHttpUrl(str) {
var regex = /(http|https):\/\/(\w+:{0,1}\w*)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%!\-\/]))?/;
if(!regex .test(str)) {
return false;
} else {
return true;
}
}
const slideDown = element => element.style.height = `${element.scrollHeight}px`;
function show(elemId) {
let elem = document.getElementById(elemId)
if (elem.style.display == "none") {
elem.style.display = "block"
setTimeout(function() {elem.classList.toggle('hide')}, 50)
} else {
elem.classList.toggle('hide')
setTimeout(function() {elem.style.display = "none"}, 750)
}
}
var counter = 0
class TableReport {
constructor(data, summary) {
this.data = data
this.summary = summary
this.container = document.createElement("div")
this.header = document.createElement("div")
this.container.classList.add("table-wrap")
this.table = document.createElement("table")
this.table.classList.add("styled-table")
this.container.appendChild(this.header)
this.container.appendChild(this.table)
this.generateHeader()
this.generateTable() // generate the table first
this.generateTableHead() // then the head
}
generateHeader() {
this.header.innerHTML = "<h2>Test results: " + this.summary["total"] + " tests, " +
"<label style='color:green'>" + this.summary["pass"] + " passed,</label> " +
"<label style='color:red'>" + this.summary["fail"] +" failed</label></h2>"
}
generateTableHead() {
let table = this.table
let thead = table.createTHead();
let row = thead.insertRow();
for (let key in this.data[0]) {
let th = document.createElement("th");
let text = document.createTextNode(capitalize(key));
th.appendChild(text);
row.appendChild(th);
}
}
generateTable() {
let table = this.table
for (let element of this.data) {
let row = table.insertRow();
for (let key in element) {
let cell = row.insertCell();
let text = document.createTextNode(element[key]);
cell.appendChild(text);
}
}
}
}
class Report {
constructor(reportObj) {
this.reportObj = reportObj
this.reportName = Object.keys(this.reportObj)[0]
this.report = this.reportObj[this.reportName]
this.testSuites = this.report["test-suites"]
this.testAssets = this.report["test-config"]["test-assets"]
this.metadata = this.report["metadata"]
this.target = this.report["target"]
this.testConfig = this.report["test-config"]
this.testEnvironments = this.report["test-environments"]
this.testSuitesData = {}
}
generateSuitesTables() {
this.suitesDivs = {}
var results = []
var index = 0
for (const [testSuiteName, testSuite] of Object.entries(this.testSuites)) {
++index
results = []
var status = "PASS"
var failCount = 0
var passCount = 0
var counter = 0
var metCols = []
for (const [testResultName, testResult] of Object.entries(testSuite["test-results"])) {
results.push({name: testResultName, status: testResult["status"],
...testResult["metadata"]})
if (testResult["status"] == "FAIL") {
status = "FAIL"
failCount++
} else if (testResult["status"] == "PASS") {
passCount++
}
metCols = Object.keys(testResult["metadata"])
++counter
}
let summary = {"pass": passCount, "fail": failCount, "total": counter}
var tableReport = new TableReport(results, summary)
this.testSuitesData[testSuiteName] = {tableReport: tableReport, metadata: testSuite['metadata']}
}
}
}
function link(url) {
window.open(url, '_blank');
}
function generateItems(obj, container) {
let i = 0
let click=""
for (var [name, value] of Object.entries(obj)) {
if ((i++ % 3) == 0) {
divGroup = document.createElement("div")
divGroup.classList.add("item-parent")
container.appendChild(divGroup)
}
divElem = document.createElement("div")
divElem.classList.add("item")
style = ' class=item'
if (isValidHttpUrl(value))
style = ' class="link" onclick=link("' + value + '")'
divElem.innerHTML = "<span style='color:black'>" + name + ": </span>" + "<span" + style +">" + value + "</span>"
divGroup.appendChild(divElem)
}
}
function generateBlock(obj, title, expanded, extra) {
var divBlock = 0
var divGroup = 0
var divElem = 0
var divData = 0
if (expanded === undefined)
expanded = true
let id = title.replace(/\s+/g, '-') + counter++
let checked = expanded ? "checked" : ""
divBlock = document.createElement("div")
divBlock.classList.add("block-report")
let divTitle = document.createElement("div")
divTitle.innerHTML = '<label>' + title + '</div>' +
'<label class="switch"><input ' +
'" type="checkbox" ' + checked + ' onclick=' +
"show('data-" + id + "')>" +
'<span class="slider"></span></label>'
divBlock.appendChild(divTitle)
if (obj.tagName == 'DIV')
divData = obj
else
divData = document.createElement("div")
divData.id = "data-" + id
divData.classList.add("box")
divBlock.setAttribute('data-items-container', divData.id)
if (expanded == false) {
divData.style.display = 'none'
divData.classList.add("hide")
}
divBlock.appendChild(divData)
generateItems(obj, divData)
if (!(extra === undefined))
divData.appendChild(extra)
return divBlock
}
function generateReport(containerName, yamlString) {
const jsObject = JSON.parse(yamlString)
const report = new Report(jsObject)
document.getElementById("report-name").innerHTML = report.reportName
var divContent = document.getElementById("report-content")
var metadata = generateBlock(report.metadata, "Metadata", false)
divContent.appendChild(metadata)
divContent.appendChild(generateBlock(report.target, "Target", false))
var div = document.createElement("div")
divAssets = generateBlock(div, "Test assets", false)
for (const [name, data] of Object.entries(report.testConfig['test-assets'])) {
var divAsset = generateBlock(data, name, false)
div.appendChild(divAsset)
}
divConfig = generateBlock(divAssets, "Test configuration", false)
divContent.appendChild(divConfig)
div = document.createElement("div")
divEnvs = generateBlock(div, "Test environments", false)
for (const [name, data] of Object.entries(report.testEnvironments)) {
var divEnv = generateBlock(data, name, false)
div.appendChild(divEnv)
}
divContent.appendChild(divEnvs)
div = document.createElement("div")
divSuites = generateBlock(div, "Test suites")
report.generateSuitesTables()
var visible = true
for (const [name, suiteData] of Object.entries(report.testSuitesData)) {
var divSuite = generateBlock(suiteData['metadata'], name, visible, suiteData['tableReport'].container)
div.appendChild(divSuite)
if (visible)
visible = false
}
divContent.appendChild(divSuites)
return report
}