@magnit-ce/code-tests 0.0.2 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/code-tests.cjs +70 -28
- package/dist/code-tests.d.cts +7 -1
- package/dist/code-tests.d.ts +7 -1
- package/dist/code-tests.js +69 -28
- package/dist/code-tests.min.js +12 -11
- package/package.json +2 -2
package/dist/code-tests.cjs
CHANGED
|
@@ -24,6 +24,7 @@ __export(code_tests_exports, {
|
|
|
24
24
|
AFTEREACH: () => AFTEREACH,
|
|
25
25
|
BEFOREALL: () => BEFOREALL,
|
|
26
26
|
BEFOREEACH: () => BEFOREEACH,
|
|
27
|
+
CodeTestEventType: () => CodeTestEventType,
|
|
27
28
|
CodeTests: () => CodeTests,
|
|
28
29
|
CodeTestsElement: () => CodeTestsElement,
|
|
29
30
|
expect: () => expect
|
|
@@ -264,9 +265,10 @@ summary::before
|
|
|
264
265
|
{
|
|
265
266
|
border: var(--border-success);
|
|
266
267
|
background: var(--surface-success)
|
|
267
|
-
url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg"
|
|
268
|
+
url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="%232e943a" d="M20.285 2l-11.285 11.567-5.286-5.011-3.714 3.716 9 8.728 15-15.285z"/></svg>');
|
|
268
269
|
background-repeat: no-repeat;
|
|
269
270
|
background-position: center;
|
|
271
|
+
background-size: 16px 16px;
|
|
270
272
|
}
|
|
271
273
|
.test.fail .result-icon
|
|
272
274
|
,.hook.fail .result-icon
|
|
@@ -483,6 +485,13 @@ function assignClassAndIdToPart(shadowRoot) {
|
|
|
483
485
|
}
|
|
484
486
|
|
|
485
487
|
// src/code-tests.ts
|
|
488
|
+
var CodeTestEventType = /* @__PURE__ */ ((CodeTestEventType2) => {
|
|
489
|
+
CodeTestEventType2["BeforeAll"] = "beforeall";
|
|
490
|
+
CodeTestEventType2["AfterAll"] = "afterall";
|
|
491
|
+
CodeTestEventType2["BeforeTest"] = "beforetest";
|
|
492
|
+
CodeTestEventType2["AfterTest"] = "aftertest";
|
|
493
|
+
return CodeTestEventType2;
|
|
494
|
+
})(CodeTestEventType || {});
|
|
486
495
|
var NOTESTDEFINED = Symbol("No Test Defined");
|
|
487
496
|
var COMPONENT_STYLESHEET = new CSSStyleSheet();
|
|
488
497
|
COMPONENT_STYLESHEET.replaceSync(code_tests_default);
|
|
@@ -517,13 +526,16 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
517
526
|
this.#boundClickHandler = this.#onClick.bind(this);
|
|
518
527
|
}
|
|
519
528
|
connectedCallback() {
|
|
529
|
+
assignClassAndIdToPart(this.shadowRoot);
|
|
520
530
|
this.addEventListener("click", this.#boundClickHandler);
|
|
531
|
+
if (this.getAttribute("auto") == "false") {
|
|
532
|
+
return;
|
|
533
|
+
}
|
|
521
534
|
const testsPath = this.getAttribute("src") ?? this.getAttribute("test") ?? this.getAttribute("tests") ?? this.getAttribute("run") ?? this.getAttribute("path");
|
|
522
535
|
if (testsPath == null) {
|
|
523
536
|
return;
|
|
524
537
|
}
|
|
525
538
|
this.loadTests(testsPath);
|
|
526
|
-
assignClassAndIdToPart(this.shadowRoot);
|
|
527
539
|
}
|
|
528
540
|
disconnectedCallback() {
|
|
529
541
|
this.removeEventListener("click", this.#boundClickHandler);
|
|
@@ -553,9 +565,11 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
553
565
|
this.#runTest(testId, test);
|
|
554
566
|
}
|
|
555
567
|
async loadTests(path) {
|
|
556
|
-
this.classList.remove("has-before-hook");
|
|
557
|
-
this.classList.remove("has-after-hook");
|
|
558
568
|
try {
|
|
569
|
+
this.getElement("tests").innerHTML = "";
|
|
570
|
+
this.#tests.clear();
|
|
571
|
+
this.classList.remove("has-before-hook");
|
|
572
|
+
this.classList.remove("has-after-hook");
|
|
559
573
|
const lastSlashIndexInCurrentPath = window.location.href.lastIndexOf("/");
|
|
560
574
|
const currentPathHasExtension = window.location.href.substring(lastSlashIndexInCurrentPath).indexOf(".") != -1;
|
|
561
575
|
const currentPath = currentPathHasExtension == true ? window.location.href.substring(0, lastSlashIndexInCurrentPath + 1) : window.location.href;
|
|
@@ -652,6 +666,7 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
652
666
|
}
|
|
653
667
|
}
|
|
654
668
|
async runTests() {
|
|
669
|
+
this.dispatchEvent(new CustomEvent("beforeall" /* BeforeAll */, { bubbles: true, composed: true }));
|
|
655
670
|
this.#continueRunningTests = true;
|
|
656
671
|
this.classList.add("running");
|
|
657
672
|
this.toggleAttribute("success", false);
|
|
@@ -674,6 +689,9 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
674
689
|
this.#handleHookResult(hookResult, false, "before", error);
|
|
675
690
|
console.error(error);
|
|
676
691
|
this.#continueRunningTests = false;
|
|
692
|
+
this.classList.remove("running");
|
|
693
|
+
this.part.remove("running");
|
|
694
|
+
this.dispatchEvent(new CustomEvent("afterall" /* AfterAll */, { bubbles: true, composed: true }));
|
|
677
695
|
return;
|
|
678
696
|
}
|
|
679
697
|
}
|
|
@@ -692,6 +710,9 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
692
710
|
}
|
|
693
711
|
}
|
|
694
712
|
if (this.#continueRunningTests == false) {
|
|
713
|
+
this.classList.remove("running");
|
|
714
|
+
this.part.remove("running");
|
|
715
|
+
this.dispatchEvent(new CustomEvent("afterall" /* AfterAll */, { bubbles: true, composed: true }));
|
|
695
716
|
return;
|
|
696
717
|
}
|
|
697
718
|
const afterHooks = this.#hooks.get(AFTERALL);
|
|
@@ -711,6 +732,9 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
711
732
|
this.#handleHookResult(hookResult, false, "after", error);
|
|
712
733
|
console.error(error);
|
|
713
734
|
this.#continueRunningTests = false;
|
|
735
|
+
this.classList.remove("running");
|
|
736
|
+
this.part.remove("running");
|
|
737
|
+
this.dispatchEvent(new CustomEvent("afterall" /* AfterAll */, { bubbles: true, composed: true }));
|
|
714
738
|
return;
|
|
715
739
|
}
|
|
716
740
|
}
|
|
@@ -718,6 +742,7 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
718
742
|
this.setAttribute("success", failedTests.length == 0 ? "true" : "false");
|
|
719
743
|
this.classList.remove("running");
|
|
720
744
|
this.part.remove("running");
|
|
745
|
+
this.dispatchEvent(new CustomEvent("afterall" /* AfterAll */, { bubbles: true, composed: true }));
|
|
721
746
|
}
|
|
722
747
|
#clearTestStatuses() {
|
|
723
748
|
for (const [testId, test] of this.#tests) {
|
|
@@ -750,6 +775,11 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
750
775
|
testElement.part.add("running");
|
|
751
776
|
testElement.classList.remove("success", "fail");
|
|
752
777
|
testElement.part.remove("success", "fail");
|
|
778
|
+
const iconElement = testElement.querySelector(".result-icon");
|
|
779
|
+
iconElement?.classList.remove("success", "fail");
|
|
780
|
+
iconElement?.part.remove("success", "fail");
|
|
781
|
+
iconElement?.classList.add("running");
|
|
782
|
+
iconElement?.part.add("running");
|
|
753
783
|
const errorMessageElement = testElement.querySelector(".error-message");
|
|
754
784
|
if (errorMessageElement != null) {
|
|
755
785
|
errorMessageElement.textContent = "";
|
|
@@ -763,34 +793,37 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
763
793
|
let afterResult = NOTESTDEFINED;
|
|
764
794
|
let testType;
|
|
765
795
|
try {
|
|
766
|
-
const
|
|
767
|
-
if (
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
796
|
+
const allowTest = this.dispatchEvent(new CustomEvent("beforetest" /* BeforeTest */, { bubbles: true, cancelable: true, composed: true, detail: { testElement } }));
|
|
797
|
+
if (allowTest == true) {
|
|
798
|
+
const beforeHooks = this.#hooks.get(BEFOREEACH);
|
|
799
|
+
if (beforeHooks != null) {
|
|
800
|
+
for (const [hook, ids] of beforeHooks) {
|
|
801
|
+
if (ids.has(testId)) {
|
|
802
|
+
beforeResult = await hook();
|
|
803
|
+
break;
|
|
804
|
+
}
|
|
772
805
|
}
|
|
773
806
|
}
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
807
|
+
testResult = await test();
|
|
808
|
+
const afterHooks = this.#hooks.get(AFTEREACH);
|
|
809
|
+
if (afterHooks != null) {
|
|
810
|
+
for (const [hook, ids] of afterHooks) {
|
|
811
|
+
if (ids.has(testId)) {
|
|
812
|
+
afterResult = await hook();
|
|
813
|
+
break;
|
|
814
|
+
}
|
|
782
815
|
}
|
|
783
816
|
}
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
817
|
+
testType = "before";
|
|
818
|
+
if (beforeResult != NOTESTDEFINED) {
|
|
819
|
+
this.#handleTestResult(testElement, beforeResult, true, void 0, testType);
|
|
820
|
+
}
|
|
821
|
+
testType = void 0;
|
|
822
|
+
this.#handleTestResult(testElement, testResult, true, void 0, testType);
|
|
823
|
+
testType = "after";
|
|
824
|
+
if (afterResult != NOTESTDEFINED) {
|
|
825
|
+
this.#handleTestResult(testElement, afterResult, true, void 0, testType);
|
|
826
|
+
}
|
|
794
827
|
}
|
|
795
828
|
} catch (error) {
|
|
796
829
|
this.#handleTestResult(testElement, testResult, false, error, testType);
|
|
@@ -799,6 +832,9 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
799
832
|
} finally {
|
|
800
833
|
testElement?.classList.remove("running");
|
|
801
834
|
testElement?.part.remove("running");
|
|
835
|
+
iconElement?.classList.remove("running");
|
|
836
|
+
iconElement?.part.remove("running");
|
|
837
|
+
this.dispatchEvent(new CustomEvent("aftertest" /* AfterTest */, { bubbles: true, cancelable: true, composed: true, detail: { testElement } }));
|
|
802
838
|
}
|
|
803
839
|
}
|
|
804
840
|
#handleTestResult(testElement, result, finishedTest, error, beforeOrAfter) {
|
|
@@ -924,6 +960,11 @@ Result:${objectResult.value}`,
|
|
|
924
960
|
testElement.part.toggle("success", success);
|
|
925
961
|
testElement.classList.toggle("fail", !success);
|
|
926
962
|
testElement.part.toggle("fail", !success);
|
|
963
|
+
const iconElement = testElement.querySelector(".result-icon");
|
|
964
|
+
iconElement?.classList.toggle("success", success);
|
|
965
|
+
iconElement?.part.toggle("success", success);
|
|
966
|
+
iconElement?.classList.toggle("fail", !success);
|
|
967
|
+
iconElement?.part.toggle("fail", !success);
|
|
927
968
|
const resultElement = testElement.querySelector(`.${beforeOrAfter == void 0 ? "result" : beforeOrAfter == "before" ? "before-result" : "after-result"}`);
|
|
928
969
|
if (resultElement == null) {
|
|
929
970
|
this.#addProcessError(`Unable to find result element`);
|
|
@@ -1031,6 +1072,7 @@ if (customElements.get(COMPONENT_TAG_NAME) == null) {
|
|
|
1031
1072
|
AFTEREACH,
|
|
1032
1073
|
BEFOREALL,
|
|
1033
1074
|
BEFOREEACH,
|
|
1075
|
+
CodeTestEventType,
|
|
1034
1076
|
CodeTests,
|
|
1035
1077
|
CodeTestsElement,
|
|
1036
1078
|
expect
|
package/dist/code-tests.d.cts
CHANGED
|
@@ -18,6 +18,12 @@ declare class CodeTests {
|
|
|
18
18
|
declare function expect(value: any): TestPromise<any>;
|
|
19
19
|
|
|
20
20
|
type CodeTestsProperties = {};
|
|
21
|
+
declare enum CodeTestEventType {
|
|
22
|
+
BeforeAll = "beforeall",
|
|
23
|
+
AfterAll = "afterall",
|
|
24
|
+
BeforeTest = "beforetest",
|
|
25
|
+
AfterTest = "aftertest"
|
|
26
|
+
}
|
|
21
27
|
declare class CodeTestsElement extends HTMLElement {
|
|
22
28
|
#private;
|
|
23
29
|
componentParts: Map<string, HTMLElement>;
|
|
@@ -33,4 +39,4 @@ declare class CodeTestsElement extends HTMLElement {
|
|
|
33
39
|
attributeChangedCallback(attributeName: string, oldValue: string, newValue: string): void;
|
|
34
40
|
}
|
|
35
41
|
|
|
36
|
-
export { AFTERALL, AFTEREACH, BEFOREALL, BEFOREEACH, CodeTests, CodeTestsElement, type CodeTestsProperties, expect };
|
|
42
|
+
export { AFTERALL, AFTEREACH, BEFOREALL, BEFOREEACH, CodeTestEventType, CodeTests, CodeTestsElement, type CodeTestsProperties, expect };
|
package/dist/code-tests.d.ts
CHANGED
|
@@ -18,6 +18,12 @@ declare class CodeTests {
|
|
|
18
18
|
declare function expect(value: any): TestPromise<any>;
|
|
19
19
|
|
|
20
20
|
type CodeTestsProperties = {};
|
|
21
|
+
declare enum CodeTestEventType {
|
|
22
|
+
BeforeAll = "beforeall",
|
|
23
|
+
AfterAll = "afterall",
|
|
24
|
+
BeforeTest = "beforetest",
|
|
25
|
+
AfterTest = "aftertest"
|
|
26
|
+
}
|
|
21
27
|
declare class CodeTestsElement extends HTMLElement {
|
|
22
28
|
#private;
|
|
23
29
|
componentParts: Map<string, HTMLElement>;
|
|
@@ -33,4 +39,4 @@ declare class CodeTestsElement extends HTMLElement {
|
|
|
33
39
|
attributeChangedCallback(attributeName: string, oldValue: string, newValue: string): void;
|
|
34
40
|
}
|
|
35
41
|
|
|
36
|
-
export { AFTERALL, AFTEREACH, BEFOREALL, BEFOREEACH, CodeTests, CodeTestsElement, type CodeTestsProperties, expect };
|
|
42
|
+
export { AFTERALL, AFTEREACH, BEFOREALL, BEFOREEACH, CodeTestEventType, CodeTests, CodeTestsElement, type CodeTestsProperties, expect };
|
package/dist/code-tests.js
CHANGED
|
@@ -232,9 +232,10 @@ summary::before
|
|
|
232
232
|
{
|
|
233
233
|
border: var(--border-success);
|
|
234
234
|
background: var(--surface-success)
|
|
235
|
-
url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg"
|
|
235
|
+
url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="%232e943a" d="M20.285 2l-11.285 11.567-5.286-5.011-3.714 3.716 9 8.728 15-15.285z"/></svg>');
|
|
236
236
|
background-repeat: no-repeat;
|
|
237
237
|
background-position: center;
|
|
238
|
+
background-size: 16px 16px;
|
|
238
239
|
}
|
|
239
240
|
.test.fail .result-icon
|
|
240
241
|
,.hook.fail .result-icon
|
|
@@ -451,6 +452,13 @@ function assignClassAndIdToPart(shadowRoot) {
|
|
|
451
452
|
}
|
|
452
453
|
|
|
453
454
|
// src/code-tests.ts
|
|
455
|
+
var CodeTestEventType = /* @__PURE__ */ ((CodeTestEventType2) => {
|
|
456
|
+
CodeTestEventType2["BeforeAll"] = "beforeall";
|
|
457
|
+
CodeTestEventType2["AfterAll"] = "afterall";
|
|
458
|
+
CodeTestEventType2["BeforeTest"] = "beforetest";
|
|
459
|
+
CodeTestEventType2["AfterTest"] = "aftertest";
|
|
460
|
+
return CodeTestEventType2;
|
|
461
|
+
})(CodeTestEventType || {});
|
|
454
462
|
var NOTESTDEFINED = Symbol("No Test Defined");
|
|
455
463
|
var COMPONENT_STYLESHEET = new CSSStyleSheet();
|
|
456
464
|
COMPONENT_STYLESHEET.replaceSync(code_tests_default);
|
|
@@ -485,13 +493,16 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
485
493
|
this.#boundClickHandler = this.#onClick.bind(this);
|
|
486
494
|
}
|
|
487
495
|
connectedCallback() {
|
|
496
|
+
assignClassAndIdToPart(this.shadowRoot);
|
|
488
497
|
this.addEventListener("click", this.#boundClickHandler);
|
|
498
|
+
if (this.getAttribute("auto") == "false") {
|
|
499
|
+
return;
|
|
500
|
+
}
|
|
489
501
|
const testsPath = this.getAttribute("src") ?? this.getAttribute("test") ?? this.getAttribute("tests") ?? this.getAttribute("run") ?? this.getAttribute("path");
|
|
490
502
|
if (testsPath == null) {
|
|
491
503
|
return;
|
|
492
504
|
}
|
|
493
505
|
this.loadTests(testsPath);
|
|
494
|
-
assignClassAndIdToPart(this.shadowRoot);
|
|
495
506
|
}
|
|
496
507
|
disconnectedCallback() {
|
|
497
508
|
this.removeEventListener("click", this.#boundClickHandler);
|
|
@@ -521,9 +532,11 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
521
532
|
this.#runTest(testId, test);
|
|
522
533
|
}
|
|
523
534
|
async loadTests(path) {
|
|
524
|
-
this.classList.remove("has-before-hook");
|
|
525
|
-
this.classList.remove("has-after-hook");
|
|
526
535
|
try {
|
|
536
|
+
this.getElement("tests").innerHTML = "";
|
|
537
|
+
this.#tests.clear();
|
|
538
|
+
this.classList.remove("has-before-hook");
|
|
539
|
+
this.classList.remove("has-after-hook");
|
|
527
540
|
const lastSlashIndexInCurrentPath = window.location.href.lastIndexOf("/");
|
|
528
541
|
const currentPathHasExtension = window.location.href.substring(lastSlashIndexInCurrentPath).indexOf(".") != -1;
|
|
529
542
|
const currentPath = currentPathHasExtension == true ? window.location.href.substring(0, lastSlashIndexInCurrentPath + 1) : window.location.href;
|
|
@@ -620,6 +633,7 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
620
633
|
}
|
|
621
634
|
}
|
|
622
635
|
async runTests() {
|
|
636
|
+
this.dispatchEvent(new CustomEvent("beforeall" /* BeforeAll */, { bubbles: true, composed: true }));
|
|
623
637
|
this.#continueRunningTests = true;
|
|
624
638
|
this.classList.add("running");
|
|
625
639
|
this.toggleAttribute("success", false);
|
|
@@ -642,6 +656,9 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
642
656
|
this.#handleHookResult(hookResult, false, "before", error);
|
|
643
657
|
console.error(error);
|
|
644
658
|
this.#continueRunningTests = false;
|
|
659
|
+
this.classList.remove("running");
|
|
660
|
+
this.part.remove("running");
|
|
661
|
+
this.dispatchEvent(new CustomEvent("afterall" /* AfterAll */, { bubbles: true, composed: true }));
|
|
645
662
|
return;
|
|
646
663
|
}
|
|
647
664
|
}
|
|
@@ -660,6 +677,9 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
660
677
|
}
|
|
661
678
|
}
|
|
662
679
|
if (this.#continueRunningTests == false) {
|
|
680
|
+
this.classList.remove("running");
|
|
681
|
+
this.part.remove("running");
|
|
682
|
+
this.dispatchEvent(new CustomEvent("afterall" /* AfterAll */, { bubbles: true, composed: true }));
|
|
663
683
|
return;
|
|
664
684
|
}
|
|
665
685
|
const afterHooks = this.#hooks.get(AFTERALL);
|
|
@@ -679,6 +699,9 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
679
699
|
this.#handleHookResult(hookResult, false, "after", error);
|
|
680
700
|
console.error(error);
|
|
681
701
|
this.#continueRunningTests = false;
|
|
702
|
+
this.classList.remove("running");
|
|
703
|
+
this.part.remove("running");
|
|
704
|
+
this.dispatchEvent(new CustomEvent("afterall" /* AfterAll */, { bubbles: true, composed: true }));
|
|
682
705
|
return;
|
|
683
706
|
}
|
|
684
707
|
}
|
|
@@ -686,6 +709,7 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
686
709
|
this.setAttribute("success", failedTests.length == 0 ? "true" : "false");
|
|
687
710
|
this.classList.remove("running");
|
|
688
711
|
this.part.remove("running");
|
|
712
|
+
this.dispatchEvent(new CustomEvent("afterall" /* AfterAll */, { bubbles: true, composed: true }));
|
|
689
713
|
}
|
|
690
714
|
#clearTestStatuses() {
|
|
691
715
|
for (const [testId, test] of this.#tests) {
|
|
@@ -718,6 +742,11 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
718
742
|
testElement.part.add("running");
|
|
719
743
|
testElement.classList.remove("success", "fail");
|
|
720
744
|
testElement.part.remove("success", "fail");
|
|
745
|
+
const iconElement = testElement.querySelector(".result-icon");
|
|
746
|
+
iconElement?.classList.remove("success", "fail");
|
|
747
|
+
iconElement?.part.remove("success", "fail");
|
|
748
|
+
iconElement?.classList.add("running");
|
|
749
|
+
iconElement?.part.add("running");
|
|
721
750
|
const errorMessageElement = testElement.querySelector(".error-message");
|
|
722
751
|
if (errorMessageElement != null) {
|
|
723
752
|
errorMessageElement.textContent = "";
|
|
@@ -731,34 +760,37 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
731
760
|
let afterResult = NOTESTDEFINED;
|
|
732
761
|
let testType;
|
|
733
762
|
try {
|
|
734
|
-
const
|
|
735
|
-
if (
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
763
|
+
const allowTest = this.dispatchEvent(new CustomEvent("beforetest" /* BeforeTest */, { bubbles: true, cancelable: true, composed: true, detail: { testElement } }));
|
|
764
|
+
if (allowTest == true) {
|
|
765
|
+
const beforeHooks = this.#hooks.get(BEFOREEACH);
|
|
766
|
+
if (beforeHooks != null) {
|
|
767
|
+
for (const [hook, ids] of beforeHooks) {
|
|
768
|
+
if (ids.has(testId)) {
|
|
769
|
+
beforeResult = await hook();
|
|
770
|
+
break;
|
|
771
|
+
}
|
|
740
772
|
}
|
|
741
773
|
}
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
774
|
+
testResult = await test();
|
|
775
|
+
const afterHooks = this.#hooks.get(AFTEREACH);
|
|
776
|
+
if (afterHooks != null) {
|
|
777
|
+
for (const [hook, ids] of afterHooks) {
|
|
778
|
+
if (ids.has(testId)) {
|
|
779
|
+
afterResult = await hook();
|
|
780
|
+
break;
|
|
781
|
+
}
|
|
750
782
|
}
|
|
751
783
|
}
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
784
|
+
testType = "before";
|
|
785
|
+
if (beforeResult != NOTESTDEFINED) {
|
|
786
|
+
this.#handleTestResult(testElement, beforeResult, true, void 0, testType);
|
|
787
|
+
}
|
|
788
|
+
testType = void 0;
|
|
789
|
+
this.#handleTestResult(testElement, testResult, true, void 0, testType);
|
|
790
|
+
testType = "after";
|
|
791
|
+
if (afterResult != NOTESTDEFINED) {
|
|
792
|
+
this.#handleTestResult(testElement, afterResult, true, void 0, testType);
|
|
793
|
+
}
|
|
762
794
|
}
|
|
763
795
|
} catch (error) {
|
|
764
796
|
this.#handleTestResult(testElement, testResult, false, error, testType);
|
|
@@ -767,6 +799,9 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
767
799
|
} finally {
|
|
768
800
|
testElement?.classList.remove("running");
|
|
769
801
|
testElement?.part.remove("running");
|
|
802
|
+
iconElement?.classList.remove("running");
|
|
803
|
+
iconElement?.part.remove("running");
|
|
804
|
+
this.dispatchEvent(new CustomEvent("aftertest" /* AfterTest */, { bubbles: true, cancelable: true, composed: true, detail: { testElement } }));
|
|
770
805
|
}
|
|
771
806
|
}
|
|
772
807
|
#handleTestResult(testElement, result, finishedTest, error, beforeOrAfter) {
|
|
@@ -892,6 +927,11 @@ Result:${objectResult.value}`,
|
|
|
892
927
|
testElement.part.toggle("success", success);
|
|
893
928
|
testElement.classList.toggle("fail", !success);
|
|
894
929
|
testElement.part.toggle("fail", !success);
|
|
930
|
+
const iconElement = testElement.querySelector(".result-icon");
|
|
931
|
+
iconElement?.classList.toggle("success", success);
|
|
932
|
+
iconElement?.part.toggle("success", success);
|
|
933
|
+
iconElement?.classList.toggle("fail", !success);
|
|
934
|
+
iconElement?.part.toggle("fail", !success);
|
|
895
935
|
const resultElement = testElement.querySelector(`.${beforeOrAfter == void 0 ? "result" : beforeOrAfter == "before" ? "before-result" : "after-result"}`);
|
|
896
936
|
if (resultElement == null) {
|
|
897
937
|
this.#addProcessError(`Unable to find result element`);
|
|
@@ -998,6 +1038,7 @@ export {
|
|
|
998
1038
|
AFTEREACH,
|
|
999
1039
|
BEFOREALL,
|
|
1000
1040
|
BEFOREEACH,
|
|
1041
|
+
CodeTestEventType,
|
|
1001
1042
|
CodeTests,
|
|
1002
1043
|
CodeTestsElement,
|
|
1003
1044
|
expect
|
package/dist/code-tests.min.js
CHANGED
|
@@ -231,9 +231,10 @@ summary::before
|
|
|
231
231
|
{
|
|
232
232
|
border: var(--border-success);
|
|
233
233
|
background: var(--surface-success)
|
|
234
|
-
url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg"
|
|
234
|
+
url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="%232e943a" d="M20.285 2l-11.285 11.567-5.286-5.011-3.714 3.716 9 8.728 15-15.285z"/></svg>');
|
|
235
235
|
background-repeat: no-repeat;
|
|
236
236
|
background-position: center;
|
|
237
|
+
background-size: 16px 16px;
|
|
237
238
|
}
|
|
238
239
|
.test.fail .result-icon
|
|
239
240
|
,.hook.fail .result-icon
|
|
@@ -355,7 +356,7 @@ pre
|
|
|
355
356
|
{
|
|
356
357
|
from { transform: rotate(0deg); }
|
|
357
358
|
to { transform: rotate(360deg); }
|
|
358
|
-
}`;var
|
|
359
|
+
}`;var H=`<slot name="header">
|
|
359
360
|
<header id="header">
|
|
360
361
|
<span id="title"><slot name="title"><span id="title-text">Tests</span></slot></span>
|
|
361
362
|
<slot name="play-button">
|
|
@@ -382,15 +383,15 @@ pre
|
|
|
382
383
|
<span id="after-all-description" class="description">Results from After All Hook</span>
|
|
383
384
|
</summary>
|
|
384
385
|
<div id="after-all-results" class="results"></div>
|
|
385
|
-
</details>`;var
|
|
386
|
+
</details>`;var T=class extends Promise{async toBeDefined(t){if(await this==null)throw new Error(`${t??"Value"} is undefined`)}async toBe(t,s=!1){let e=await this;if((s==!0?e===t:e==t)==!1)throw new Error(` Value is not equal.
|
|
386
387
|
Expected: ${t}
|
|
387
|
-
Result: ${e}`)}async toContainText(t){let s=await this}async toHaveAttribute(t){let s=await this;if(!(s instanceof HTMLElement))throw new Error("Unable to check for attribute on non-HTMLElement target");if(s.getAttribute(t))throw new Error("Taret does not have attribute")}},
|
|
388
|
-
${
|
|
389
|
-
${
|
|
388
|
+
Result: ${e}`)}async toContainText(t){let s=await this}async toHaveAttribute(t){let s=await this;if(!(s instanceof HTMLElement))throw new Error("Unable to check for attribute on non-HTMLElement target");if(s.getAttribute(t))throw new Error("Taret does not have attribute")}},y=Symbol("beforeAll"),v=Symbol("beforeEach"),k=Symbol("afterAll"),x=Symbol("afterEach"),A=class{static timeoutMS=500;static#e;static#p;static expect(t){return new T(async(e,r)=>{if(t instanceof Promise){let a=await t;e(a);return}e(t)})}static expectSync(t){return new T(async(e,r)=>{if(t instanceof Promise){let a=await t;e(a);return}e(t)})}static expectBefore(t){return new T(async(e,r)=>{if(t instanceof Promise){let a=await t;e(a);return}e(t)})}};function q(h){return A.expect(h)}var F=":not(slot,defs,g,rect,path,circle,ellipse,line,polygon,text,tspan,use,svg image,svg title,desc,template,template *)";function $(h){let t=[...h.querySelectorAll(`${F}[id]`)];for(let e=0;e<t.length;e++)t[e].part.add(t[e].id);let s=[...h.querySelectorAll(`${F}[class]`)];for(let e=0;e<s.length;e++)s[e].part.add(...s[e].classList)}var j=(r=>(r.BeforeAll="beforeall",r.AfterAll="afterall",r.BeforeTest="beforetest",r.AfterTest="aftertest",r))(j||{}),M=Symbol("No Test Defined"),P=new CSSStyleSheet;P.replaceSync(S);var D="code-tests",R=class extends HTMLElement{componentParts=new Map;getElement(t){if(this.componentParts.get(t)==null){let s=this.findElement(t);s!=null&&this.componentParts.set(t,s)}return this.componentParts.get(t)}findElement(t){return this.shadowRoot.getElementById(t)}#e=new Map;#p={[y]:L(),[v]:L(),[x]:L(),[k]:L()};#t=!0;constructor(){super(),this.attachShadow({mode:"open"}),this.shadowRoot.innerHTML=H,this.shadowRoot.adoptedStyleSheets.push(P),this.#c=this.#h.bind(this)}connectedCallback(){if($(this.shadowRoot),this.addEventListener("click",this.#c),this.getAttribute("auto")=="false")return;let t=this.getAttribute("src")??this.getAttribute("test")??this.getAttribute("tests")??this.getAttribute("run")??this.getAttribute("path");t!=null&&this.loadTests(t)}disconnectedCallback(){this.removeEventListener("click",this.#c)}#c;#h(t){let s=t.composedPath().find(n=>n instanceof HTMLButtonElement&&n.classList.contains("run"));if(s==null)return;let e=s.closest("li");if(e==null){s.hasAttribute("data-all")==!0&&this.runTests();return}let r=e.dataset.testId;if(r==null)return;let a=this.#s.get(r);a!=null&&this.#u(r,a)}async loadTests(t){try{this.getElement("tests").innerHTML="",this.#s.clear(),this.classList.remove("has-before-hook"),this.classList.remove("has-after-hook");let s=window.location.href.lastIndexOf("/"),r=window.location.href.substring(s).indexOf(".")!=-1==!0?window.location.href.substring(0,s+1):window.location.href,a=r+t.substring(0,t.lastIndexOf("/")+1),n=r+t,o=await(await fetch(n)).text();o=o.replaceAll(/['"`](((\.\/)|(\.\.\/))+(.*))['"`]/g,`'${a}$1'`);let l=new File([o],t.substring(t.lastIndexOf("/")),{type:"text/javascript"}),i=await import(URL.createObjectURL(l)),c=i.tests??i.default;if(c==null)throw new Error(`Unable to find tests definition in file at path: ${t}`);let b=c[y];if(b!=null){if(this.#e.get(y)==null){let u=new Map;u.set(b,new Set),this.#e.set(y,u)}this.classList.add("has-before-hook")}let E=c[v];if(E!=null&&this.#e.get(v)==null){let u=new Map;u.set(E,new Set),this.#e.set(v,u)}let g=c[k];if(g!=null){if(this.#e.get(k)==null){let u=new Map;u.set(g,new Set),this.#e.set(k,u)}this.classList.add("has-after-hook")}let m=c[x];if(m!=null&&this.#e.get(x)==null){let u=new Map;u.set(m,new Set),this.#e.set(x,u)}for(let[w,u]of Object.entries(c)){let C=this.#g(w,u);if(b!=null){let d=this.#e.get(y);if(d!=null){let p=d.get(b);p?.add(C)}}if(E!=null){let d=this.#e.get(v);if(d!=null){let p=d.get(E);p?.add(C)}}if(g!=null){let d=this.#e.get(k);if(d!=null){let p=d.get(g);p?.add(C)}}if(m!=null){let d=this.#e.get(x);if(d!=null){let p=d.get(m);p?.add(C)}}}}catch(s){this.#i("An error occurred while loading the tasks:",s)}}async runTests(){this.dispatchEvent(new CustomEvent("beforeall",{bubbles:!0,composed:!0})),this.#t=!0,this.classList.add("running"),this.toggleAttribute("success",!1),this.#f();let t=this.hasAttribute("in-order"),s=this.#e.get(y);if(s!=null){let a;try{let n=this.getElement("before-all-details");n.classList.add("running"),n.part.add("running");for(let[o,l]of s)a=await o(),this.#n(a,!0,"before");n.part.remove("running"),n.classList.remove("running")}catch(n){this.#n(a,!1,"before",n),console.error(n),this.#t=!1,this.classList.remove("running"),this.part.remove("running"),this.dispatchEvent(new CustomEvent("afterall",{bubbles:!0,composed:!0}));return}}if(t==!1){let a=[];for(let[n,o]of this.#s)a.push(this.#u(n,o));await Promise.all(a)}else for(let[a,n]of this.#s){if(this.#t==!1)break;await this.#u(a,n)}if(this.#t==!1){this.classList.remove("running"),this.part.remove("running"),this.dispatchEvent(new CustomEvent("afterall",{bubbles:!0,composed:!0}));return}let e=this.#e.get(k);if(e!=null){let a;try{let n=this.getElement("after-all-details");n.classList.add("running"),n.part.add("running");for(let[o,l]of e)a=await o(),this.#n(a,!0,"after");n.part.remove("running"),n.classList.remove("running")}catch(n){this.#n(a,!1,"after",n),console.error(n),this.#t=!1,this.classList.remove("running"),this.part.remove("running"),this.dispatchEvent(new CustomEvent("afterall",{bubbles:!0,composed:!0}));return}}let r=this.shadowRoot.querySelectorAll('[success="false"]');this.setAttribute("success",r.length==0?"true":"false"),this.classList.remove("running"),this.part.remove("running"),this.dispatchEvent(new CustomEvent("afterall",{bubbles:!0,composed:!0}))}#f(){for(let[e,r]of this.#s){let a=this.getElement("tests").querySelector(`[data-test-id="${e}"]`);if(a==null){this.#i(`Unable to find test element for test: ${e}`);return}a.toggleAttribute("success",!1),a.classList.remove("success","fail"),a.part.remove("success","fail")}let t=this.getElement("before-all-details");t.toggleAttribute("success",!1),t.classList.remove("success","fail"),t.part.remove("success","fail");let s=this.getElement("after-all-details");s.toggleAttribute("success",!1),s.classList.remove("success","fail"),s.part.remove("success","fail")}async#u(t,s){let e=this.getElement("tests").querySelector(`[data-test-id="${t}"]`);if(e==null){this.#i(`Unable to find test element for test: ${t}`);return}e.toggleAttribute("success",!1),e.classList.add("running"),e.part.add("running"),e.classList.remove("success","fail"),e.part.remove("success","fail");let r=e.querySelector(".result-icon");r?.classList.remove("success","fail"),r?.part.remove("success","fail"),r?.classList.add("running"),r?.part.add("running");let a=e.querySelector(".error-message");a!=null&&(a.textContent="");let n=e.querySelector("details");n!=null&&(n.open=!1);let o=M,l,f=M,i;try{if(this.dispatchEvent(new CustomEvent("beforetest",{bubbles:!0,cancelable:!0,composed:!0,detail:{testElement:e}}))==!0){let b=this.#e.get(v);if(b!=null){for(let[g,m]of b)if(m.has(t)){o=await g();break}}l=await s();let E=this.#e.get(x);if(E!=null){for(let[g,m]of E)if(m.has(t)){f=await g();break}}i="before",o!=M&&this.#a(e,o,!0,void 0,i),i=void 0,this.#a(e,l,!0,void 0,i),i="after",f!=M&&this.#a(e,f,!0,void 0,i)}}catch(c){this.#a(e,l,!1,c,i),console.error(c),this.#t=!1}finally{e?.classList.remove("running"),e?.part.remove("running"),r?.classList.remove("running"),r?.part.remove("running"),this.dispatchEvent(new CustomEvent("aftertest",{bubbles:!0,cancelable:!0,composed:!0,detail:{testElement:e}}))}}#a(t,s,e,r,a){if(s instanceof HTMLElement)this.#o(t,s,e,a);else if(s==null){let o=a==null?"Passed":"Hook Ran Successfully",l=this.#r(e==!0?`${o}`:`Failed${r!=null?`:
|
|
389
|
+
${r.message}`:""}`,e,a);this.#o(t,l,e,a)}else if(typeof s=="string"){let o=this.#r(`${s}${r==null?"":`:
|
|
390
|
+
${r.message}`}`,e,a);this.#o(t,o,e,a)}else if(typeof s=="object"){let o=s;if(o.success!=null&&o.expected!=null&&o.value!=null){let l=a==null?"Passed":"Success",f=a==null?"Failed":"Fail",i=this.#r(`${o.success==!0?`${l}:`:`${f}:`}
|
|
390
391
|
Expected:${o.expected}
|
|
391
|
-
Result:${o.value}`,o.success,
|
|
392
|
-
${
|
|
393
|
-
${
|
|
392
|
+
Result:${o.value}`,o.success,a);this.#o(t,i,e,a)}}let n=t.querySelector("details");n!=null&&(n.open=!0)}#n(t,s,e,r){if(t instanceof HTMLElement)this.#l(t,s,e);else{let n;if(t==null)n=this.#r(s==!0?"Hook Ran Successfully":`Failed${r!=null?`:
|
|
393
|
+
${r.message}`:""}`,s),this.#l(n,s,e);else if(typeof t=="string")n=this.#r(`${t}${r==null?"":`:
|
|
394
|
+
${r.message}`}`,s),this.#l(n,s,e);else if(typeof t=="object"){let o=t;o.success!=null&&o.expected!=null&&o.value!=null&&(n=this.#r(`${o.success==!0?"Success:":"Fail:"}
|
|
394
395
|
Expected:${o.expected}
|
|
395
|
-
Result:${o.value}`,o.success),this.#l(n,s,e))}}let
|
|
396
|
-
${s.message}`,console.error(s));let e=document.createElement("li");e.classList.add("error","process-error"),e.part.add("error","process-error");let
|
|
396
|
+
Result:${o.value}`,o.success),this.#l(n,s,e))}}let a=this.getElement(`${e}-all-details`);a!=null&&(a.open=!0)}static create(t){let s=document.createElement("code-tests");return console.log(t),s}#s=new Map;#g(t,s){let e=L();this.#s.set(e,s);let r=this.#m(e,t);return this.getElement("tests").append(r),e}#m(t,s){let e=document.createElement("li");e.dataset.testId=t,e.classList.add("test"),e.part.add("test");let r=document.createElement("details");r.classList.add("test-details"),r.part.add("test-details");let a=document.createElement("summary");a.classList.add("test-summary"),a.part.add("test-summary");let n=document.createElement("div");n.classList.add("result-icon"),n.part.add("result-icon"),a.append(n);let o=document.createElement("span");o.classList.add("description","test-description"),o.textContent=s,a.append(o);let l=document.createElement("button");l.classList.add("run","test-run"),l.part.add("run","test-run"),l.textContent="Run Test",l.title="Run Test",a.append(l);let f=document.createElement("div");f.classList.add("before-result","test-before-result"),f.part.add("before-result","test-before-result");let i=document.createElement("div");i.classList.add("result","test-result"),i.part.add("result","test-result");let c=document.createElement("div");return c.classList.add("after-result","test-after-result"),c.part.add("after-result","test-after-result"),r.append(a),r.append(f),r.append(i),r.append(c),e.append(r),e}#o(t,s,e,r){t.setAttribute("success",e==!0?"true":"false"),t.classList.toggle("success",e),t.part.toggle("success",e),t.classList.toggle("fail",!e),t.part.toggle("fail",!e);let a=t.querySelector(".result-icon");a?.classList.toggle("success",e),a?.part.toggle("success",e),a?.classList.toggle("fail",!e),a?.part.toggle("fail",!e);let n=t.querySelector(`.${r==null?"result":r=="before"?"before-result":"after-result"}`);if(n==null){this.#i("Unable to find result element");return}n.innerHTML="",n.appendChild(s)}#r(t,s,e){let r=document.createElement("code");r.classList.add("code"),r.part.add("code");let a=document.createElement("pre");a.textContent=t;let n=s==!0?"success-message":"error-message";return a.classList.add("pre",n),a.part.add("pre",n),r.appendChild(a),r}#l(t,s,e){let r=this.getElement(`${e}-all-details`),a=this.getElement(`${e}-all-results`);r.setAttribute("success",s==!0?"true":"false"),r.classList.toggle("success",s),r.part.toggle("success",s),r.classList.toggle("fail",!s),r.part.toggle("fail",!s),a.innerHTML="",a.appendChild(t)}#i(t,s){s instanceof Error&&(t+=`
|
|
397
|
+
${s.message}`,console.error(s));let e=document.createElement("li");e.classList.add("error","process-error"),e.part.add("error","process-error");let r=document.createElement("code");r.classList.add("code","process-error-code"),r.part.add("code","process-error-code");let a=document.createElement("pre");a.classList.add("pre","process-error-pre"),a.part.add("pre","process-error-pre"),a.textContent=t,r.append(a),e.append(r),this.getElement("tests").append(e)}#d(t){if(t=="ordered"){let s=this.shadowRoot.querySelector("ul");if(s==null)return;let e=this.shadowRoot?.querySelectorAll("li"),r=document.createElement("ol");e!=null&&r.append(...e),r.id="tests",s.replaceWith(r)}else{let s=this.shadowRoot.querySelector("ol");if(s==null)return;let e=this.shadowRoot?.querySelectorAll("li"),r=document.createElement("ul");r.id="tests",e!=null&&r.append(...e),s.replaceWith(r)}}static observedAttributes=["in-order"];attributeChangedCallback(t,s,e){t=="in-order"&&(e==null?this.#d("unordered"):this.#d("ordered"))}};function L(){let h=new Uint8Array(20);crypto.getRandomValues(h);let t=[].slice.apply(h).map(function(e){return String.fromCharCode(e)}).join("");return btoa(t).replace(/\//g,"_").replace(/\+/g,"-").replace(/=/g,"")}customElements.get(D)==null&&customElements.define(D,R);export{k as AFTERALL,x as AFTEREACH,y as BEFOREALL,v as BEFOREEACH,j as CodeTestEventType,A as CodeTests,R as CodeTestsElement,q as expect};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@magnit-ce/code-tests",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"description": "A custom html element that
|
|
3
|
+
"version": "0.0.4",
|
|
4
|
+
"description": "A custom html element that interprets and runs tests in a browser.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/code-tests.js",
|
|
7
7
|
"module": "dist/code-tests.mjs",
|