task completed

parents
# dependencies
/node_modules
\ No newline at end of file
## GAP TASK
## Starting of project
# Locally
Run index.html file.
# In IDE
Run index.html in live server.
## Testing
# npm test or npm run test
To run tests, you need to install Jest first:
npm install --save-dev jest
Then you can use the following commands for different actions:
# To Test a Single File
bash$ npx jest filename.test.js
# To Test All Files in a Directory
bash$ npx jest directoryname
# Watching Files
bash$ npx jest -w
Watch Usage
› Press f to run only failed tests.
› Press o to only run tests related to changed files.
› Press p to filter by a filename regex pattern.
› Press t to filter by a test name regex pattern.
› Press q to quit watch mode.
› Press Enter to trigger a test run.
## Test Coverage
# npm run coverage
To check the number of line code covered in the jest tests.
## Client requirements of Project
Frontend Javascript question
# Problem Create the following UI:
- Create an empty container div in the HTML file.
- Programmatically create multiple child divs in the container, say 10. Use
Javascript.
- Give all the child divs a black background.
- Lay out the child divs horizontally within the container.
- Whenever the user clicks one of the child divs, the child div should respond as
follows:
- If the child div does not have a blue background:
- Give the child div a blue background.
- Print out the child div's index. If the 7th div is getting a blue background,
say "Turning ON 7".
- If the child div does have a blue background:
- Give the child div its original background color.
- Print out the child div's index. If the 4th div is removing the blue
background, say "Turning OFF 4".
# Requirements:
- Should work for 3, 10, 27, however many child divs. They do not all need to be on
the same line, but they should still lay out horizontally (across multiple lines if
necessary).
- Combine HTML, CSS, and JavaScript
\ No newline at end of file
const fs = require('fs');
const path = require('path');
const { JSDOM } = require('jsdom');
// Read the HTML file
const html = fs.readFileSync(path.resolve(__dirname, '../index.html'), 'utf8');
// Set up jsdom environment
const dom = new JSDOM(html, { runScripts: 'dangerously' });
global.document = dom.window.document;
// Load the JavaScript file
const {
handleAddChildDiv,
handleAppendChildDiv,
handleClearChildDiv,
initChildDiv
} = require('../src/index');
const index = require('../src/index');
// Test suite for the HTML content
describe('HTML content', () => {
it('should have text "GAP TASK',()=>{
const element = document.querySelector('h3');
expect(element.textContent).toEqual('GAP TASK')
})
it('to have label "Add Div',()=>{
const label=document.getElementById( 'add-divs');
expect(label.innerHTML).toContain('Add Divs');
})
it('to have add button',()=>{
const addBtn=document.getElementById("add");
expect(addBtn.textContent).toEqual('Add New');
})
afterAll(() => {
document.getElementById('mainDiv').replaceChildren();
});
it('should add new divs when "Add New" button is clicked', async () => {
const input = parseInt(document.getElementById('input').value);
const mainDiv=document.getElementById('mainDiv');
await handleAddChildDiv();
expect(document.getElementById('mainDiv').children.length).toBe(input);
});
it('should add new divs when "Append" button is clicked', async () => {
const inputMock = parseInt(document.getElementById('input').value);
let mainDiv = document.getElementById('mainDiv');
let childCount=parseInt(mainDiv.children.length);
await handleAppendChildDiv();
expect(mainDiv.children.length).toBe(inputMock+childCount);
});
it('should add new divs when "Clear" button is clicked', async () => {
let mainDiv = document.getElementById('mainDiv');
await handleClearChildDiv();
expect(mainDiv.children.length).toBe(0);
});
});
<?xml version="1.0" encoding="UTF-8"?>
<coverage generated="1711546101232" clover="3.2.0">
<project timestamp="1711546101232" name="All files">
<metrics statements="25" coveredstatements="11" conditionals="7" coveredconditionals="3" methods="5" coveredmethods="4" elements="37" coveredelements="18" complexity="0" loc="25" ncloc="25" packages="1" files="1" classes="1"/>
<file name="index.js" path="D:\GAP TASK\src\index.js">
<metrics statements="25" coveredstatements="11" conditionals="7" coveredconditionals="3" methods="5" coveredmethods="4"/>
<line num="2" count="1" type="stmt"/>
<line num="3" count="0" type="stmt"/>
<line num="4" count="0" type="stmt"/>
<line num="5" count="0" type="stmt"/>
<line num="6" count="0" type="stmt"/>
<line num="7" count="0" type="stmt"/>
<line num="8" count="0" type="cond" truecount="0" falsecount="2"/>
<line num="9" count="0" type="stmt"/>
<line num="10" count="0" type="stmt"/>
<line num="12" count="0" type="stmt"/>
<line num="13" count="0" type="stmt"/>
<line num="16" count="0" type="stmt"/>
<line num="21" count="1" type="stmt"/>
<line num="22" count="1" type="stmt"/>
<line num="23" count="1" type="stmt"/>
<line num="24" count="1" type="stmt"/>
<line num="25" count="1" type="cond" truecount="1" falsecount="1"/>
<line num="26" count="0" type="stmt"/>
<line num="30" count="1" type="stmt"/>
<line num="31" count="1" type="stmt"/>
<line num="32" count="1" type="cond" truecount="1" falsecount="1"/>
<line num="33" count="0" type="stmt"/>
<line num="34" count="0" type="stmt"/>
<line num="38" count="1" type="stmt"/>
<line num="41" count="1" type="stmt"/>
</file>
</project>
</coverage>
{"D:\\GAP TASK\\src\\index.js": {"path":"D:\\GAP TASK\\src\\index.js","statementMap":{"0":{"start":{"line":2,"column":4},"end":{"line":17,"column":5}},"1":{"start":{"line":2,"column":17},"end":{"line":2,"column":31}},"2":{"start":{"line":3,"column":25},"end":{"line":3,"column":54}},"3":{"start":{"line":4,"column":8},"end":{"line":4,"column":45}},"4":{"start":{"line":5,"column":8},"end":{"line":5,"column":47}},"5":{"start":{"line":6,"column":8},"end":{"line":6,"column":39}},"6":{"start":{"line":7,"column":8},"end":{"line":15,"column":11}},"7":{"start":{"line":8,"column":12},"end":{"line":14,"column":13}},"8":{"start":{"line":9,"column":16},"end":{"line":9,"column":54}},"9":{"start":{"line":10,"column":16},"end":{"line":10,"column":56}},"10":{"start":{"line":12,"column":16},"end":{"line":12,"column":55}},"11":{"start":{"line":13,"column":16},"end":{"line":13,"column":56}},"12":{"start":{"line":16,"column":8},"end":{"line":16,"column":38}},"13":{"start":{"line":21,"column":20},"end":{"line":21,"column":54}},"14":{"start":{"line":22,"column":19},"end":{"line":22,"column":57}},"15":{"start":{"line":23,"column":4},"end":{"line":23,"column":30}},"16":{"start":{"line":24,"column":4},"end":{"line":24,"column":33}},"17":{"start":{"line":25,"column":4},"end":{"line":27,"column":5}},"18":{"start":{"line":26,"column":8},"end":{"line":26,"column":59}},"19":{"start":{"line":30,"column":20},"end":{"line":30,"column":54}},"20":{"start":{"line":31,"column":19},"end":{"line":31,"column":57}},"21":{"start":{"line":32,"column":4},"end":{"line":35,"column":5}},"22":{"start":{"line":33,"column":24},"end":{"line":33,"column":60}},"23":{"start":{"line":34,"column":8},"end":{"line":34,"column":59}},"24":{"start":{"line":38,"column":4},"end":{"line":38,"column":56}},"25":{"start":{"line":41,"column":0},"end":{"line":46,"column":2}}},"fnMap":{"0":{"name":"initChildDiv","decl":{"start":{"line":1,"column":9},"end":{"line":1,"column":21}},"loc":{"start":{"line":1,"column":53},"end":{"line":18,"column":1}},"line":1},"1":{"name":"(anonymous_1)","decl":{"start":{"line":7,"column":43},"end":{"line":7,"column":44}},"loc":{"start":{"line":7,"column":49},"end":{"line":15,"column":9}},"line":7},"2":{"name":"handleAddChildDiv","decl":{"start":{"line":20,"column":9},"end":{"line":20,"column":26}},"loc":{"start":{"line":20,"column":29},"end":{"line":28,"column":1}},"line":20},"3":{"name":"handleAppendChildDiv","decl":{"start":{"line":29,"column":9},"end":{"line":29,"column":29}},"loc":{"start":{"line":29,"column":32},"end":{"line":36,"column":1}},"line":29},"4":{"name":"handleClearChildDiv","decl":{"start":{"line":37,"column":9},"end":{"line":37,"column":28}},"loc":{"start":{"line":37,"column":31},"end":{"line":39,"column":1}},"line":37}},"branchMap":{"0":{"loc":{"start":{"line":1,"column":39},"end":{"line":1,"column":51}},"type":"default-arg","locations":[{"start":{"line":1,"column":50},"end":{"line":1,"column":51}}],"line":1},"1":{"loc":{"start":{"line":8,"column":12},"end":{"line":14,"column":13}},"type":"if","locations":[{"start":{"line":8,"column":12},"end":{"line":14,"column":13}},{"start":{"line":11,"column":19},"end":{"line":14,"column":13}}],"line":8},"2":{"loc":{"start":{"line":25,"column":4},"end":{"line":27,"column":5}},"type":"if","locations":[{"start":{"line":25,"column":4},"end":{"line":27,"column":5}},{"start":{},"end":{}}],"line":25},"3":{"loc":{"start":{"line":32,"column":4},"end":{"line":35,"column":5}},"type":"if","locations":[{"start":{"line":32,"column":4},"end":{"line":35,"column":5}},{"start":{},"end":{}}],"line":32}},"s":{"0":1,"1":1,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":1,"14":1,"15":1,"16":1,"17":1,"18":0,"19":1,"20":1,"21":1,"22":0,"23":0,"24":1,"25":1},"f":{"0":1,"1":0,"2":1,"3":1,"4":1},"b":{"0":[1],"1":[0,0],"2":[0,1],"3":[0,1]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"0571b7edbaaef76162b355a11471d02f02cb4e61"}
}
body, html {
margin:0; padding: 0;
height: 100%;
}
body {
font-family: Helvetica Neue, Helvetica, Arial;
font-size: 14px;
color:#333;
}
.small { font-size: 12px; }
*, *:after, *:before {
-webkit-box-sizing:border-box;
-moz-box-sizing:border-box;
box-sizing:border-box;
}
h1 { font-size: 20px; margin: 0;}
h2 { font-size: 14px; }
pre {
font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace;
margin: 0;
padding: 0;
-moz-tab-size: 2;
-o-tab-size: 2;
tab-size: 2;
}
a { color:#0074D9; text-decoration:none; }
a:hover { text-decoration:underline; }
.strong { font-weight: bold; }
.space-top1 { padding: 10px 0 0 0; }
.pad2y { padding: 20px 0; }
.pad1y { padding: 10px 0; }
.pad2x { padding: 0 20px; }
.pad2 { padding: 20px; }
.pad1 { padding: 10px; }
.space-left2 { padding-left:55px; }
.space-right2 { padding-right:20px; }
.center { text-align:center; }
.clearfix { display:block; }
.clearfix:after {
content:'';
display:block;
height:0;
clear:both;
visibility:hidden;
}
.fl { float: left; }
@media only screen and (max-width:640px) {
.col3 { width:100%; max-width:100%; }
.hide-mobile { display:none!important; }
}
.quiet {
color: #7f7f7f;
color: rgba(0,0,0,0.5);
}
.quiet a { opacity: 0.7; }
.fraction {
font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace;
font-size: 10px;
color: #555;
background: #E8E8E8;
padding: 4px 5px;
border-radius: 3px;
vertical-align: middle;
}
div.path a:link, div.path a:visited { color: #333; }
table.coverage {
border-collapse: collapse;
margin: 10px 0 0 0;
padding: 0;
}
table.coverage td {
margin: 0;
padding: 0;
vertical-align: top;
}
table.coverage td.line-count {
text-align: right;
padding: 0 5px 0 20px;
}
table.coverage td.line-coverage {
text-align: right;
padding-right: 10px;
min-width:20px;
}
table.coverage td span.cline-any {
display: inline-block;
padding: 0 5px;
width: 100%;
}
.missing-if-branch {
display: inline-block;
margin-right: 5px;
border-radius: 3px;
position: relative;
padding: 0 4px;
background: #333;
color: yellow;
}
.skip-if-branch {
display: none;
margin-right: 10px;
position: relative;
padding: 0 4px;
background: #ccc;
color: white;
}
.missing-if-branch .typ, .skip-if-branch .typ {
color: inherit !important;
}
.coverage-summary {
border-collapse: collapse;
width: 100%;
}
.coverage-summary tr { border-bottom: 1px solid #bbb; }
.keyline-all { border: 1px solid #ddd; }
.coverage-summary td, .coverage-summary th { padding: 10px; }
.coverage-summary tbody { border: 1px solid #bbb; }
.coverage-summary td { border-right: 1px solid #bbb; }
.coverage-summary td:last-child { border-right: none; }
.coverage-summary th {
text-align: left;
font-weight: normal;
white-space: nowrap;
}
.coverage-summary th.file { border-right: none !important; }
.coverage-summary th.pct { }
.coverage-summary th.pic,
.coverage-summary th.abs,
.coverage-summary td.pct,
.coverage-summary td.abs { text-align: right; }
.coverage-summary td.file { white-space: nowrap; }
.coverage-summary td.pic { min-width: 120px !important; }
.coverage-summary tfoot td { }
.coverage-summary .sorter {
height: 10px;
width: 7px;
display: inline-block;
margin-left: 0.5em;
background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent;
}
.coverage-summary .sorted .sorter {
background-position: 0 -20px;
}
.coverage-summary .sorted-desc .sorter {
background-position: 0 -10px;
}
.status-line { height: 10px; }
/* yellow */
.cbranch-no { background: yellow !important; color: #111; }
/* dark red */
.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 }
.low .chart { border:1px solid #C21F39 }
.highlighted,
.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{
background: #C21F39 !important;
}
/* medium red */
.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE }
/* light red */
.low, .cline-no { background:#FCE1E5 }
/* light green */
.high, .cline-yes { background:rgb(230,245,208) }
/* medium green */
.cstat-yes { background:rgb(161,215,106) }
/* dark green */
.status-line.high, .high .cover-fill { background:rgb(77,146,33) }
.high .chart { border:1px solid rgb(77,146,33) }
/* dark yellow (gold) */
.status-line.medium, .medium .cover-fill { background: #f9cd0b; }
.medium .chart { border:1px solid #f9cd0b; }
/* light yellow */
.medium { background: #fff4c2; }
.cstat-skip { background: #ddd; color: #111; }
.fstat-skip { background: #ddd; color: #111 !important; }
.cbranch-skip { background: #ddd !important; color: #111; }
span.cline-neutral { background: #eaeaea; }
.coverage-summary td.empty {
opacity: .5;
padding-top: 4px;
padding-bottom: 4px;
line-height: 1;
color: #888;
}
.cover-fill, .cover-empty {
display:inline-block;
height: 12px;
}
.chart {
line-height: 0;
}
.cover-empty {
background: white;
}
.cover-full {
border-right: none !important;
}
pre.prettyprint {
border: none !important;
padding: 0 !important;
margin: 0 !important;
}
.com { color: #999 !important; }
.ignore-none { color: #999; font-weight: normal; }
.wrapper {
min-height: 100%;
height: auto !important;
height: 100%;
margin: 0 auto -48px;
}
.footer, .push {
height: 48px;
}
/* eslint-disable */
var jumpToCode = (function init() {
// Classes of code we would like to highlight in the file view
var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no'];
// Elements to highlight in the file listing view
var fileListingElements = ['td.pct.low'];
// We don't want to select elements that are direct descendants of another match
var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > `
// Selecter that finds elements on the page to which we can jump
var selector =
fileListingElements.join(', ') +
', ' +
notSelector +
missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b`
// The NodeList of matching elements
var missingCoverageElements = document.querySelectorAll(selector);
var currentIndex;
function toggleClass(index) {
missingCoverageElements
.item(currentIndex)
.classList.remove('highlighted');
missingCoverageElements.item(index).classList.add('highlighted');
}
function makeCurrent(index) {
toggleClass(index);
currentIndex = index;
missingCoverageElements.item(index).scrollIntoView({
behavior: 'smooth',
block: 'center',
inline: 'center'
});
}
function goToPrevious() {
var nextIndex = 0;
if (typeof currentIndex !== 'number' || currentIndex === 0) {
nextIndex = missingCoverageElements.length - 1;
} else if (missingCoverageElements.length > 1) {
nextIndex = currentIndex - 1;
}
makeCurrent(nextIndex);
}
function goToNext() {
var nextIndex = 0;
if (
typeof currentIndex === 'number' &&
currentIndex < missingCoverageElements.length - 1
) {
nextIndex = currentIndex + 1;
}
makeCurrent(nextIndex);
}
return function jump(event) {
if (
document.getElementById('fileSearch') === document.activeElement &&
document.activeElement != null
) {
// if we're currently focused on the search input, we don't want to navigate
return;
}
switch (event.which) {
case 78: // n
case 74: // j
goToNext();
break;
case 66: // b
case 75: // k
case 80: // p
goToPrevious();
break;
}
};
})();
window.addEventListener('keydown', jumpToCode);
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for All files</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="prettify.css" />
<link rel="stylesheet" href="base.css" />
<link rel="shortcut icon" type="image/x-icon" href="favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1>All files</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">46.15% </span>
<span class="quiet">Statements</span>
<span class='fraction'>12/26</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">42.85% </span>
<span class="quiet">Branches</span>
<span class='fraction'>3/7</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">80% </span>
<span class="quiet">Functions</span>
<span class='fraction'>4/5</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">44% </span>
<span class="quiet">Lines</span>
<span class='fraction'>11/25</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
<template id="filterTemplate">
<div class="quiet">
Filter:
<input type="search" id="fileSearch">
</div>
</template>
</div>
<div class='status-line low'></div>
<div class="pad1">
<table class="coverage-summary">
<thead>
<tr>
<th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
<th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
<th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
<th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
<th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
<th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
<th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
</tr>
</thead>
<tbody><tr>
<td class="file low" data-value="index.js"><a href="index.js.html">index.js</a></td>
<td data-value="46.15" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 46%"></div><div class="cover-empty" style="width: 54%"></div></div>
</td>
<td data-value="46.15" class="pct low">46.15%</td>
<td data-value="26" class="abs low">12/26</td>
<td data-value="42.85" class="pct low">42.85%</td>
<td data-value="7" class="abs low">3/7</td>
<td data-value="80" class="pct high">80%</td>
<td data-value="5" class="abs high">4/5</td>
<td data-value="44" class="pct low">44%</td>
<td data-value="25" class="abs low">11/25</td>
</tr>
</tbody>
</table>
</div>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2024-03-27T13:28:21.052Z
</div>
<script src="prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="sorter.js"></script>
<script src="block-navigation.js"></script>
</body>
</html>
\ No newline at end of file
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for index.js</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="prettify.css" />
<link rel="stylesheet" href="base.css" />
<link rel="shortcut icon" type="image/x-icon" href="favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="index.html">All files</a> index.js</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">46.15% </span>
<span class="quiet">Statements</span>
<span class='fraction'>12/26</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">42.85% </span>
<span class="quiet">Branches</span>
<span class='fraction'>3/7</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">80% </span>
<span class="quiet">Functions</span>
<span class='fraction'>4/5</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">44% </span>
<span class="quiet">Lines</span>
<span class='fraction'>11/25</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
<template id="filterTemplate">
<div class="quiet">
Filter:
<input type="search" id="fileSearch">
</div>
</template>
</div>
<div class='status-line low'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
<a name='L3'></a><a href='#L3'>3</a>
<a name='L4'></a><a href='#L4'>4</a>
<a name='L5'></a><a href='#L5'>5</a>
<a name='L6'></a><a href='#L6'>6</a>
<a name='L7'></a><a href='#L7'>7</a>
<a name='L8'></a><a href='#L8'>8</a>
<a name='L9'></a><a href='#L9'>9</a>
<a name='L10'></a><a href='#L10'>10</a>
<a name='L11'></a><a href='#L11'>11</a>
<a name='L12'></a><a href='#L12'>12</a>
<a name='L13'></a><a href='#L13'>13</a>
<a name='L14'></a><a href='#L14'>14</a>
<a name='L15'></a><a href='#L15'>15</a>
<a name='L16'></a><a href='#L16'>16</a>
<a name='L17'></a><a href='#L17'>17</a>
<a name='L18'></a><a href='#L18'>18</a>
<a name='L19'></a><a href='#L19'>19</a>
<a name='L20'></a><a href='#L20'>20</a>
<a name='L21'></a><a href='#L21'>21</a>
<a name='L22'></a><a href='#L22'>22</a>
<a name='L23'></a><a href='#L23'>23</a>
<a name='L24'></a><a href='#L24'>24</a>
<a name='L25'></a><a href='#L25'>25</a>
<a name='L26'></a><a href='#L26'>26</a>
<a name='L27'></a><a href='#L27'>27</a>
<a name='L28'></a><a href='#L28'>28</a>
<a name='L29'></a><a href='#L29'>29</a>
<a name='L30'></a><a href='#L30'>30</a>
<a name='L31'></a><a href='#L31'>31</a>
<a name='L32'></a><a href='#L32'>32</a>
<a name='L33'></a><a href='#L33'>33</a>
<a name='L34'></a><a href='#L34'>34</a>
<a name='L35'></a><a href='#L35'>35</a>
<a name='L36'></a><a href='#L36'>36</a>
<a name='L37'></a><a href='#L37'>37</a>
<a name='L38'></a><a href='#L38'>38</a>
<a name='L39'></a><a href='#L39'>39</a>
<a name='L40'></a><a href='#L40'>40</a>
<a name='L41'></a><a href='#L41'>41</a>
<a name='L42'></a><a href='#L42'>42</a>
<a name='L43'></a><a href='#L43'>43</a>
<a name='L44'></a><a href='#L44'>44</a>
<a name='L45'></a><a href='#L45'>45</a>
<a name='L46'></a><a href='#L46'>46</a>
<a name='L47'></a><a href='#L47'>47</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">function initChildDiv(values, mainDiv, childCount=0) {
for (let i = childCount + 1; i &lt;= childCount + parseInt(values); i++) {
const childDiv = <span class="cstat-no" title="statement not covered" >document.createElement('div');</span>
<span class="cstat-no" title="statement not covered" > childDiv.classList.add("box", "off");</span>
<span class="cstat-no" title="statement not covered" > childDiv.innerHTML = "Turned OFF " + i;</span>
<span class="cstat-no" title="statement not covered" > childDiv.setAttribute("id", i);</span>
<span class="cstat-no" title="statement not covered" > childDiv.addEventListener('click', <span class="fstat-no" title="function not covered" >()</span> =&gt; {</span>
<span class="cstat-no" title="statement not covered" > if (childDiv.classList.contains("off")) {</span>
<span class="cstat-no" title="statement not covered" > childDiv.innerText = 'Turned ON ' + i;</span>
<span class="cstat-no" title="statement not covered" > childDiv.classList.replace("off", "on");</span>
} else {
<span class="cstat-no" title="statement not covered" > childDiv.innerText = 'Turned OFF ' + i;</span>
<span class="cstat-no" title="statement not covered" > childDiv.classList.replace("on", "off");</span>
}
});
<span class="cstat-no" title="statement not covered" > mainDiv.appendChild(childDiv);</span>
}
}
&nbsp;
function handleAddChildDiv() {
const mainDiv = document.getElementById("mainDiv");
const values = document.getElementById("input").value;
mainDiv.replaceChildren();
initChildDiv(values, mainDiv)
<span class="missing-if-branch" title="if path not taken" >I</span>if(values&gt;0){
<span class="cstat-no" title="statement not covered" > document.getElementById("append").disabled = false;</span>
}
}
function handleAppendChildDiv() {
const mainDiv = document.getElementById("mainDiv");
const values = document.getElementById("input").value;
<span class="missing-if-branch" title="if path not taken" >I</span>if (mainDiv.children.length &gt; 0) {
let childDivs = <span class="cstat-no" title="statement not covered" >mainDiv.lastChild.getAttribute('id');</span>
<span class="cstat-no" title="statement not covered" > initChildDiv(values, mainDiv, parseInt(childDivs));</span>
}
}
function handleClearChildDiv() {
document.getElementById("mainDiv").replaceChildren()
}
&nbsp;
module.exports = {
initChildDiv,
handleAddChildDiv,
handleAppendChildDiv,
handleClearChildDiv,
};
&nbsp;</pre></td></tr></table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2024-03-27T13:28:21.052Z
</div>
<script src="prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="sorter.js"></script>
<script src="block-navigation.js"></script>
</body>
</html>
\ No newline at end of file
.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}
This diff is collapsed.
/* eslint-disable */
var addSorting = (function() {
'use strict';
var cols,
currentSort = {
index: 0,
desc: false
};
// returns the summary table element
function getTable() {
return document.querySelector('.coverage-summary');
}
// returns the thead element of the summary table
function getTableHeader() {
return getTable().querySelector('thead tr');
}
// returns the tbody element of the summary table
function getTableBody() {
return getTable().querySelector('tbody');
}
// returns the th element for nth column
function getNthColumn(n) {
return getTableHeader().querySelectorAll('th')[n];
}
function onFilterInput() {
const searchValue = document.getElementById('fileSearch').value;
const rows = document.getElementsByTagName('tbody')[0].children;
for (let i = 0; i < rows.length; i++) {
const row = rows[i];
if (
row.textContent
.toLowerCase()
.includes(searchValue.toLowerCase())
) {
row.style.display = '';
} else {
row.style.display = 'none';
}
}
}
// loads the search box
function addSearchBox() {
var template = document.getElementById('filterTemplate');
var templateClone = template.content.cloneNode(true);
templateClone.getElementById('fileSearch').oninput = onFilterInput;
template.parentElement.appendChild(templateClone);
}
// loads all columns
function loadColumns() {
var colNodes = getTableHeader().querySelectorAll('th'),
colNode,
cols = [],
col,
i;
for (i = 0; i < colNodes.length; i += 1) {
colNode = colNodes[i];
col = {
key: colNode.getAttribute('data-col'),
sortable: !colNode.getAttribute('data-nosort'),
type: colNode.getAttribute('data-type') || 'string'
};
cols.push(col);
if (col.sortable) {
col.defaultDescSort = col.type === 'number';
colNode.innerHTML =
colNode.innerHTML + '<span class="sorter"></span>';
}
}
return cols;
}
// attaches a data attribute to every tr element with an object
// of data values keyed by column name
function loadRowData(tableRow) {
var tableCols = tableRow.querySelectorAll('td'),
colNode,
col,
data = {},
i,
val;
for (i = 0; i < tableCols.length; i += 1) {
colNode = tableCols[i];
col = cols[i];
val = colNode.getAttribute('data-value');
if (col.type === 'number') {
val = Number(val);
}
data[col.key] = val;
}
return data;
}
// loads all row data
function loadData() {
var rows = getTableBody().querySelectorAll('tr'),
i;
for (i = 0; i < rows.length; i += 1) {
rows[i].data = loadRowData(rows[i]);
}
}
// sorts the table using the data for the ith column
function sortByIndex(index, desc) {
var key = cols[index].key,
sorter = function(a, b) {
a = a.data[key];
b = b.data[key];
return a < b ? -1 : a > b ? 1 : 0;
},
finalSorter = sorter,
tableBody = document.querySelector('.coverage-summary tbody'),
rowNodes = tableBody.querySelectorAll('tr'),
rows = [],
i;
if (desc) {
finalSorter = function(a, b) {
return -1 * sorter(a, b);
};
}
for (i = 0; i < rowNodes.length; i += 1) {
rows.push(rowNodes[i]);
tableBody.removeChild(rowNodes[i]);
}
rows.sort(finalSorter);
for (i = 0; i < rows.length; i += 1) {
tableBody.appendChild(rows[i]);
}
}
// removes sort indicators for current column being sorted
function removeSortIndicators() {
var col = getNthColumn(currentSort.index),
cls = col.className;
cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, '');
col.className = cls;
}
// adds sort indicators for current column being sorted
function addSortIndicators() {
getNthColumn(currentSort.index).className += currentSort.desc
? ' sorted-desc'
: ' sorted';
}
// adds event listeners for all sorter widgets
function enableUI() {
var i,
el,
ithSorter = function ithSorter(i) {
var col = cols[i];
return function() {
var desc = col.defaultDescSort;
if (currentSort.index === i) {
desc = !currentSort.desc;
}
sortByIndex(i, desc);
removeSortIndicators();
currentSort.index = i;
currentSort.desc = desc;
addSortIndicators();
};
};
for (i = 0; i < cols.length; i += 1) {
if (cols[i].sortable) {
// add the click event handler on the th so users
// dont have to click on those tiny arrows
el = getNthColumn(i).querySelector('.sorter').parentElement;
if (el.addEventListener) {
el.addEventListener('click', ithSorter(i));
} else {
el.attachEvent('onclick', ithSorter(i));
}
}
}
}
// adds sorting functionality to the UI
return function() {
if (!getTable()) {
return;
}
cols = loadColumns();
loadData();
addSearchBox();
addSortIndicators();
enableUI();
};
})();
window.addEventListener('load', addSorting);
TN:
SF:src\index.js
FN:1,initChildDiv
FN:7,(anonymous_1)
FN:20,handleAddChildDiv
FN:29,handleAppendChildDiv
FN:37,handleClearChildDiv
FNF:5
FNH:4
FNDA:1,initChildDiv
FNDA:0,(anonymous_1)
FNDA:1,handleAddChildDiv
FNDA:1,handleAppendChildDiv
FNDA:1,handleClearChildDiv
DA:2,1
DA:3,0
DA:4,0
DA:5,0
DA:6,0
DA:7,0
DA:8,0
DA:9,0
DA:10,0
DA:12,0
DA:13,0
DA:16,0
DA:21,1
DA:22,1
DA:23,1
DA:24,1
DA:25,1
DA:26,0
DA:30,1
DA:31,1
DA:32,1
DA:33,0
DA:34,0
DA:38,1
DA:41,1
LF:25
LH:11
BRDA:1,0,0,1
BRDA:8,1,0,0
BRDA:8,1,1,0
BRDA:25,2,0,0
BRDA:25,2,1,1
BRDA:32,3,0,0
BRDA:32,3,1,1
BRF:7
BRH:3
end_of_record
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>GAP TASK</title>
<link rel="stylesheet" href="./styles/style.css">
</head>
<body>
<h3>GAP TASK</h3>
<label id="add-divs">Add Divs</label>
<input type="number" placeholder="enter number" id="input" min="0" max="100" value="0" />
<br />
<div class="btns">
<button id="add" class="add" onclick=handleAddChildDiv()>Add New</button>
<button id="append" class="add" disabled="true" onclick=handleAppendChildDiv()>Append</button>
<button id="clear" class="clear" onclick=handleClearChildDiv()>Clear</button>
</div>
<br />
<div id="mainDiv" class="mainDiv">
</div>
<script src="./src/index.js"></script>
</body>
</html>
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
{
"name": "gap-task",
"version": "1.0.0",
"description": "# starting of project # Locally Run index.html file from folder. # In IDE Run index.html in live server.",
"main": "index.js",
"scripts": {
"test": "jest --watchAll",
"coverage": "jest --coverage"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"@types/jest": "^29.5.12",
"jest": "^29.7.0"
},
"devDependencies": {
"jsdom": "^24.0.0"
},
"jest": {
"coveragePathIgnorePatterns": ["/node_modules/","/styles/","package.json","package-lock.json"]
}
}
function initChildDiv(values, mainDiv, childCount=0) {
for (let i = childCount + 1; i <= childCount + parseInt(values); i++) {
const childDiv = document.createElement('div');
childDiv.classList.add("box", "off");
childDiv.innerHTML = "Turned OFF " + i;
childDiv.setAttribute("id", i);
childDiv.addEventListener('click', () => {
if (childDiv.classList.contains("off")) {
childDiv.innerText = 'Turned ON ' + i;
childDiv.classList.replace("off", "on");
} else {
childDiv.innerText = 'Turned OFF ' + i;
childDiv.classList.replace("on", "off");
}
});
mainDiv.appendChild(childDiv);
}
}
function handleAddChildDiv() {
const mainDiv = document.getElementById("mainDiv");
const values = document.getElementById("input").value;
mainDiv.replaceChildren();
initChildDiv(values, mainDiv)
if(values>0){
document.getElementById("append").disabled = false;
}
}
function handleAppendChildDiv() {
const mainDiv = document.getElementById("mainDiv");
const values = document.getElementById("input").value;
if (mainDiv.children.length > 0) {
let childDivs = mainDiv.lastChild.getAttribute('id');
initChildDiv(values, mainDiv, parseInt(childDivs));
}
}
function handleClearChildDiv() {
document.getElementById("mainDiv").replaceChildren()
}
module.exports = {
initChildDiv,
handleAddChildDiv,
handleAppendChildDiv,
handleClearChildDiv,
};
body{
background-color: rgb(219, 153, 153);
min-height: 100vh;
color: white;
padding: 10px;
}
.box {
width: 100px;
height: 100px;
margin: 3px;
color: white;
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
transition: 1s;
}
.box:hover{
transition: 1s;
width: 110px;
height: 110px;
}
.off {
background-color: black;
}
.on {
background-color: blue;
}
.btns{
margin: 3px;
padding-top: 10px;
}
.mainDiv{
display: flex;flex-wrap: wrap;
}
.add{
background-color: blue;
color: white;
border: 0;
width: 80px;
height: 20px;
border-radius: 5px;
}
.add:disabled{
background-color: rgb(94, 94, 109);
color: white;
border: 0;
width: 80px;
height: 20px;
}
.clear{
background-color: red;
color: white;
border: 0;
width: 50px;
border-radius: 5px;
height: 20px;
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment