Initial commit

This commit is contained in:
Ward Truyen
2024-09-21 16:19:56 +02:00
commit 27f0d4e1ba
37 changed files with 3833 additions and 0 deletions

38
src/test/asserts.html Normal file
View File

@@ -0,0 +1,38 @@
<!DOCTYPE html>
<html>
<head>
<title>Test Asserts</title>
<link rel="stylesheet" href="css/main.css" />
<link rel="stylesheet" href="../css/wterminal.css" />
<script src="../js/wterminal.js"></script>
<script src="../js/wterminal-autoextend.js"></script>
<script src="../js/theme.js"></script>
</head>
<body>
<header>
<button style="float: right;" title="Dark theme on/off" onclick="toggleTheme();">&#9728;</button>
<a href="/test/">WTerminal testing home</a>
</header>
<main>
<h1>Test Asserts:</h1>
<div id="static-terminal"></div>
<script>
let term = new WTerminal("static", "static-terminal", null);
term.terminalCommand("height 40em");
term.clearOutput();
</script>
<script src="js/asserts.js"></script>
<script src="js/test-asserts.js"></script>
</main>
<footer>
<p class="float-right">Author: Ward Truyen</p>
</footer>
</body>
</html>

99
src/test/css/main.css Normal file
View File

@@ -0,0 +1,99 @@
/* Author: Ward Truyen
* Version: 1.3.0
*/
html,
body {
margin: 0px;
padding: 0px;
background: radial-gradient(ellipse at top, #8888ff, transparent),
radial-gradient(ellipse at bottom, #ad9fff, transparent);
height: 100%;
display: flex;
flex-direction: column;
}
main {
margin: auto;
width: 80%;
border: 2px solid darkgreen;
padding: 10px;
background-color: white;
box-shadow: 3px 3px 3px black;
}
h1 {
margin-top: 4px;
margin-bottom: 8px;
text-decoration: underline;
}
header {
padding: 2px 16px 4px 16px;
/* width: 100%; */
border-bottom: 1px solid black;
/* background-image: linear-gradient(#0000008f, #0000004f); */
background-color: #80808080;
/* linear-gradient(#0000008f, #0000004f);*/
/* margin-top: 16px; */
text-shadow: 1px 1px 1px #0000004f;
}
header a {
/* border: solid 1px black; */
padding: 2px;
margin: 1px;
}
footer {
padding: 8px 16px 4px 16px;
/* width: 100%; */
border-top: 1px solid black;
/* background-color: #0000004f; */
background-image: linear-gradient(#0000008f, #0000004f);
/* margin-top: 16px; */
margin-top: auto;
text-shadow: 1px 1px 1px #0000004f;
}
footer h1,
footer h2,
footer h3,
footer p {
display: inline;
margin: 0px;
}
.float-right {
float: right;
}
.text-red {
color: red;
}
.button-red {
background-color: red;
}
.button-black {
background-color: black;
color: white;
}
html.theme-dark {
color-scheme: dark;
background-image: linear-gradient(-10deg, #1010206F 60%, #5050506F);
color: white;
}
.theme-dark>body>main {
border: 1px solid darkgray;
background-color: black;
box-shadow: 3px 3px 5px #101010C0;
}
.theme-dark>body>main>h1 {
text-shadow: 0px 0px 3px blue, 2px 2px 6px;
}

38
src/test/index.html Normal file
View File

@@ -0,0 +1,38 @@
<!DOCTYPE html>
<html>
<head>
<title>WTerminal test home</title>
<link rel="stylesheet" href="css/main.css" />
<!-- <link rel="stylesheet" href="../css/wterminal.css" /> -->
<!-- <script src="../wterminal.js"></script> -->
<script src="../js/theme.js"></script>
</head>
<body>
<header>
<button style="float: right;" title="Dark theme on/off" onclick="toggleTheme();">&#9728;</button>
<a href="/test/">WTerminal testing home</a>
<!-- <a href="splitToArguments.html">splitToArguments</a> -->
<!-- <a href="asserts.html">Asserts</a> -->
</header>
<main>
<h1>Tests:</h1>
<div style="display: inline-block;">
<a href="/test/test-all.html">Test All</a><br>
<hr>
<a href="/test/asserts.html">Test Asserts</a><br>
<a href="/test/splitToArguments.html">Test WTerminal.splitToArguments</a><br>
</div>
<h2>Others:</h2>
<a href="../index.html">WTerminal site home</a>
</main>
<footer>
<p class="float-right">Author: Ward Truyen</p>
</footer>
</body>
</html>

74
src/test/js/asserts.js Normal file
View File

@@ -0,0 +1,74 @@
/* Author: Ward Truyen
* Version: 1.0.0
* About: A tool for testing purposes
*/
class Asserts {
static runTest(name, testFunction, term, pre = " ", printStacktraceAndStop = true) {
term.print(pre+name);
try {
testFunction();
term.printLn(WTerminal.createElement("span", {style:"color: green;"}, " OK"));
} catch (e) {
term.printError(" failed: " + e.toString());
if(printStacktraceAndStop){
term.printLn(WTerminal.createElement("span", {style:"color: blue;"}, e.stack));
throw e;
}
}
}
/* Throws error when not true
*/
static isTrue(value) {
if (value === true) return;
throw new Error('assert isTrue failed');
}
/* Throws error when not false
*/
static isFalse(value) {
if (value === false) return;
throw new Error('assert isFalse failed');
}
/* Throws error when not equal
*/
static isEqual(value1, value2) {
if (Asserts._equals(value1, value2)) return;
// if( typeof value1 === "object" || typeof value2 === "object") throw new Error('assert isEqual failed');
throw new Error('assert isEqual failed\n' + value1 + " != " + value2);
}
/* returns true when values/objects v1 and v2 are equal
*/
static _equals(v1, v2, _depth = 0) {
if (v1 === v2) return true; // easy peasy
let t = typeof v1
if (t === "string" || v1 instanceof String && typeof v2 === "string" || v2 instanceof String) return v1.valueOf() === v2.valueOf(); // "Hello" equals to new String("Hello")
if (t !== typeof v2 || v1.constructor.name !== v2.constructor.name) return false; // must be of identical type
t += " " + v1.constructor.name;
switch (t) {
default: // Yet Unkown when i coded this?
throw new Error("Todo: checking of type " + t);
case 'boolean Boolean':
case 'number Number':
case 'object Date':
return v1.valueOf() === v2.valueOf();
case 'object Array':
if (_depth > 4) throw Error("too deep");
if (v1.length !== v2.length) return false;
for (let i = 0; i < v1.length; i++) {
if (Asserts._equals(v1[i], v2[i], _depth + 1) === false) return false;
}
return true;
case 'object Object':
if (_depth > 4) throw Error("too deep");
const keys = Object.keys(v1);
if (keys.length != Object.keys(v2).length) return false;
for (let k in keys) {
if (Asserts._equals(v1[k], v2[k], _depth + 1) === false) return false;
}
return true;
}//-> switch (t)
}//-> static equals(v1, v2)
}//-> class Asserts

106
src/test/js/test-asserts.js Normal file
View File

@@ -0,0 +1,106 @@
{
const term = getWTerminal();
term.printLn("Testing Asserts");
//isTrue testing
Asserts.runTest(`Asserts.isTrue(true)`,
() => {
try {
Asserts.isTrue(true);
} catch (e) {
throw new Error("Assserts.isTrue(true) failed", e);
}
}, term);
Asserts.runTest(`Asserts.isTrue(false)`,
() => {
let throwsNoError = true;
try {
Asserts.isTrue(false);
} catch (e) {
throwsNoError = false;
}
if (throwsNoError) throw new Error("Assert.isTrue(false) does not throw Error");
}, term);
// Asserts.runTest('This test should fail', ()=>{throw new Error("To fail test")}, term);
//isFalse testing
Asserts.runTest(`Asserts.isFalse(false)`,
() => {
try {
Asserts.isFalse(false);
} catch (e) {
throw new Error("Assserts.isFalse(false) failed", e);
}
}, term);
Asserts.runTest(`Asserts.isFalse(true)`,
() => {
let throwsNoError = true;
try {
Asserts.isFalse(true);
} catch (e) {
throwsNoError = false;
}
if (throwsNoError) throw new Error("Assert.isFalse(true) does not throw Error");
}, term);
//isEqual testing
Asserts.runTest(`Asserts.isEqual(true, true)`,
() => {
try {
Asserts.isEqual(true, true);
} catch (e) {
throw new Error("Assserts.isEqual(true, true) failed", e);
}
}, term);
Asserts.runTest(`Asserts.isEqual(true, false)`,
() => {
let throwsNoError = true;
try {
Asserts.isEqual(true, false);
} catch (e) {
throwsNoError = false;
}
if (throwsNoError) throw new Error("Assert.isEqual(true, false) does not throw Error");
}, term);
//_equals testing
Asserts.runTest(`Asserts.isFalse(Asserts._equals(null, 0))`,
() => Asserts.isFalse(Asserts._equals(null, 0)), term);
Asserts.runTest(`Asserts.isFalse(Asserts._equals(null, undefined))`,
() => Asserts.isFalse(Asserts._equals(null, undefined)), term);
Asserts.runTest(`Asserts.isFalse(Asserts._equals(false, true))`,
() => Asserts.isFalse(Asserts._equals(false, true)), term);
Asserts.runTest(`Asserts.isFalse(Asserts._equals(false, 0))`,
() => Asserts.isFalse(Asserts._equals(false, 0)), term);
Asserts.runTest(`Asserts.isTrue(Asserts._equals(true, true))`,
() => Asserts.isTrue(Asserts._equals(true, true)), term);
Asserts.runTest(`Asserts.isFalse(Asserts._equals(true, 1))`,
() => Asserts.isFalse(Asserts._equals(true, 1)), term);
Asserts.runTest(`Asserts.isFalse(Asserts._equals(0, '0'))`,
() => Asserts.isFalse(Asserts._equals(0, '0')), term);
Asserts.runTest(`Asserts.isFalse(Asserts._equals(0, 1))`,
() => Asserts.isFalse(Asserts._equals(0, 1)), term);
Asserts.runTest(`Asserts.isTrue(Asserts._equals(1, 1))`,
() => Asserts.isTrue(Asserts._equals(1, 1)), term);
Asserts.runTest(`Asserts.isFalse(Asserts._equals(1, '1'))`,
() => Asserts.isFalse(Asserts._equals(1, '1')), term);
Asserts.runTest(`Asserts.isTrue(Asserts._equals(Math.PI, Math.PI))`,
() => Asserts.isTrue(Asserts._equals(Math.PI, Math.PI)), term);
Asserts.runTest(`Asserts.isTrue(Asserts._equals("Hello", "Hello"))`,
() => Asserts.isTrue(Asserts._equals("Hello", "Hello")), term);
Asserts.runTest(`Asserts.isTrue(Asserts._equals("Hello", new String("Hello")))`,
() => Asserts.isTrue(Asserts._equals("Hello", new String("Hello"))), term);
Asserts.runTest(`Asserts.isFalse(Asserts._equals("Hello", "hello"))`,
() => Asserts.isFalse(Asserts._equals("Hello", "hello")), term);
Asserts.runTest(`Asserts.isTrue(Asserts._equals(["Hello", 1], ["Hello", 1]))`,
() => Asserts.isTrue(Asserts._equals(["Hello", 1], ["Hello", 1])), term);
Asserts.runTest(`Asserts.isFalse(Asserts._equals(["Hello", 1], [1, "Hello"]))`,
() => Asserts.isFalse(Asserts._equals(["Hello", 1], [1, "Hello"])), term);
Asserts.runTest(`Asserts.isTrue(Asserts._equals({}, {}))`,
() => Asserts.isTrue(Asserts._equals({}, {})), term);
Asserts.runTest(`Asserts.isTrue(Asserts._equals({ a: "Hello", b: 1 }, { a: "Hello", b: 1 }))`,
() => Asserts.isTrue(Asserts._equals({ a: "Hello", b: 1 }, { a: "Hello", b: 1 })), term);
Asserts.runTest(`Asserts.isTrue(Asserts._equals({ a: "Hello", b: 1 }, { b: 1, a: "Hello" }))`,
() => Asserts.isTrue(Asserts._equals({ a: "Hello", b: 1 }, { b: 1, a: "Hello" })), term);
Asserts.runTest(`Asserts.isFalse(Asserts._equals({ a: "Hello", b: 1 }, { b: 1, a: "Hello", c: undefined }))`,
() => Asserts.isFalse(Asserts._equals({ a: "Hello", b: 1 }, { b: 1, a: "Hello", c: undefined })), term);
Asserts.runTest(`Asserts.isFalse(Asserts._equals({ a: "Hello", b: 1 }, { b: 1, a: "Hello", c: null }))`,
() => Asserts.isFalse(Asserts._equals({ a: "Hello", b: 1 }, { b: 1, a: "Hello", c: null })), term);
term.printLn("Asserts OK");
}

View File

@@ -0,0 +1,20 @@
{
const term = getWTerminal();
term.printLn("Testing WTerminal.splitToArguments");
Asserts.runTest(`Asserts.isEqual(WTerminal.splitToArguments("hello world"), ["hello", "world"]);`,
() => Asserts.isEqual(WTerminal.splitToArguments("hello world"), ["hello", "world"]), term);
Asserts.runTest(`Asserts.isEqual(WTerminal.splitToArguments("hello 1"), ["hello", "1"])`,
() => Asserts.isEqual(WTerminal.splitToArguments("hello 1"), ["hello", "1"]), term);
Asserts.runTest(`Asserts.isEqual(WTerminal.splitToArguments('"hello world" 1'), ["hello world", "1"])`,
() => Asserts.isEqual(WTerminal.splitToArguments('"hello world" 1'), ["hello world", "1"]), term);
Asserts.runTest(`Asserts.isEqual(WTerminal.splitToArguments("'hello world' 1"), ["hello world", "1"])`,
() => Asserts.isEqual(WTerminal.splitToArguments("'hello world' 1"), ["hello world", "1"]), term);
// Asserts.runTest('This test should fail', ()=>{throw new Error("To fail test")}, term);
Asserts.runTest(`Asserts.isEqual(WTerminal.splitToArguments("\`hello world\` 1"), ["hello world", "1"])`,
() => Asserts.isEqual(WTerminal.splitToArguments("`hello world` 1"), ["hello world", "1"]), term);
Asserts.runTest(`Asserts.isEqual(WTerminal.splitToArguments("-rf /css/test.css myKitty.js 'my name with spaces'"),
["-rf", "/css/test.css", "myKitty.js", "my name with spaces"])`,
() => Asserts.isEqual(WTerminal.splitToArguments("-rf /css/test.css myKitty.js 'my name with spaces'"),
["-rf", "/css/test.css", "myKitty.js", "my name with spaces"]), term);
term.printLn("WTerminal.splitToArguments OK");
}

View File

@@ -0,0 +1,38 @@
<!DOCTYPE html>
<html>
<head>
<title>Test WTerminal.splitToArguements</title>
<link rel="stylesheet" href="css/main.css" />
<link rel="stylesheet" href="../css/wterminal.css" />
<script src="../js/wterminal.js"></script>
<script src="../js/wterminal-autoextend.js"></script>
<script src="../js/theme.js"></script>
</head>
<body>
<header>
<button style="float: right;" title="Dark theme on/off" onclick="toggleTheme();">&#9728;</button>
<a href="/test/">WTerminal testing home</a>
</header>
<main>
<h1>Test WTerminal.splitToArguements:</h1>
<div id="static-terminal"></div>
<script>
let term = new WTerminal("static", "static-terminal", null);
term.terminalCommand("height 40em");
term.clearOutput();
</script>
<script src="js/asserts.js"></script>
<script src="js/test-splitToArguments.js"></script>
</main>
<footer>
<p class="float-right">Author: Ward Truyen</p>
</footer>
</body>
</html>

39
src/test/test-all.html Normal file
View File

@@ -0,0 +1,39 @@
<!DOCTYPE html>
<html>
<head>
<title>Test all</title>
<link rel="stylesheet" href="css/main.css" />
<link rel="stylesheet" href="../css/wterminal.css" />
<script src="../js/wterminal.js"></script>
<script src="../js/wterminal-autoextend.js"></script>
<script src="../js/theme.js"></script>
</head>
<body>
<header>
<button style="float: right;" title="Dark theme on/off" onclick="toggleTheme();">&#9728;</button>
<a href="/test/">WTerminal testing home</a>
</header>
<main>
<h1>Test all:</h1>
<div id="static-terminal"></div>
<script>
let term = new WTerminal("static", "static-terminal", null);
term.terminalCommand("height 40em");
term.clearOutput();
</script>
<script src="js/asserts.js"></script>
<script src="js/test-asserts.js"></script>
<script src="js/test-splitToArguments.js"></script>
</main>
<footer>
<p class="float-right">Author: Ward Truyen</p>
</footer>
</body>
</html>