@magnit-ce/code-tests 0.0.2 → 0.0.3
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 +57 -27
- package/dist/code-tests.d.cts +7 -1
- package/dist/code-tests.d.ts +7 -1
- package/dist/code-tests.js +56 -27
- 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);
|
|
@@ -553,9 +562,11 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
553
562
|
this.#runTest(testId, test);
|
|
554
563
|
}
|
|
555
564
|
async loadTests(path) {
|
|
556
|
-
this.classList.remove("has-before-hook");
|
|
557
|
-
this.classList.remove("has-after-hook");
|
|
558
565
|
try {
|
|
566
|
+
this.getElement("tests").innerHTML = "";
|
|
567
|
+
this.#tests.clear();
|
|
568
|
+
this.classList.remove("has-before-hook");
|
|
569
|
+
this.classList.remove("has-after-hook");
|
|
559
570
|
const lastSlashIndexInCurrentPath = window.location.href.lastIndexOf("/");
|
|
560
571
|
const currentPathHasExtension = window.location.href.substring(lastSlashIndexInCurrentPath).indexOf(".") != -1;
|
|
561
572
|
const currentPath = currentPathHasExtension == true ? window.location.href.substring(0, lastSlashIndexInCurrentPath + 1) : window.location.href;
|
|
@@ -652,6 +663,7 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
652
663
|
}
|
|
653
664
|
}
|
|
654
665
|
async runTests() {
|
|
666
|
+
this.dispatchEvent(new CustomEvent("beforeall" /* BeforeAll */, { bubbles: true, composed: true }));
|
|
655
667
|
this.#continueRunningTests = true;
|
|
656
668
|
this.classList.add("running");
|
|
657
669
|
this.toggleAttribute("success", false);
|
|
@@ -718,6 +730,7 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
718
730
|
this.setAttribute("success", failedTests.length == 0 ? "true" : "false");
|
|
719
731
|
this.classList.remove("running");
|
|
720
732
|
this.part.remove("running");
|
|
733
|
+
this.dispatchEvent(new CustomEvent("afterall" /* AfterAll */, { bubbles: true, composed: true }));
|
|
721
734
|
}
|
|
722
735
|
#clearTestStatuses() {
|
|
723
736
|
for (const [testId, test] of this.#tests) {
|
|
@@ -750,6 +763,11 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
750
763
|
testElement.part.add("running");
|
|
751
764
|
testElement.classList.remove("success", "fail");
|
|
752
765
|
testElement.part.remove("success", "fail");
|
|
766
|
+
const iconElement = testElement.querySelector(".result-icon");
|
|
767
|
+
iconElement?.classList.remove("success", "fail");
|
|
768
|
+
iconElement?.part.remove("success", "fail");
|
|
769
|
+
iconElement?.classList.add("running");
|
|
770
|
+
iconElement?.part.add("running");
|
|
753
771
|
const errorMessageElement = testElement.querySelector(".error-message");
|
|
754
772
|
if (errorMessageElement != null) {
|
|
755
773
|
errorMessageElement.textContent = "";
|
|
@@ -763,34 +781,37 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
763
781
|
let afterResult = NOTESTDEFINED;
|
|
764
782
|
let testType;
|
|
765
783
|
try {
|
|
766
|
-
const
|
|
767
|
-
if (
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
784
|
+
const allowTest = this.dispatchEvent(new CustomEvent("beforetest" /* BeforeTest */, { bubbles: true, cancelable: true, composed: true, detail: { testElement } }));
|
|
785
|
+
if (allowTest == true) {
|
|
786
|
+
const beforeHooks = this.#hooks.get(BEFOREEACH);
|
|
787
|
+
if (beforeHooks != null) {
|
|
788
|
+
for (const [hook, ids] of beforeHooks) {
|
|
789
|
+
if (ids.has(testId)) {
|
|
790
|
+
beforeResult = await hook();
|
|
791
|
+
break;
|
|
792
|
+
}
|
|
772
793
|
}
|
|
773
794
|
}
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
795
|
+
testResult = await test();
|
|
796
|
+
const afterHooks = this.#hooks.get(AFTEREACH);
|
|
797
|
+
if (afterHooks != null) {
|
|
798
|
+
for (const [hook, ids] of afterHooks) {
|
|
799
|
+
if (ids.has(testId)) {
|
|
800
|
+
afterResult = await hook();
|
|
801
|
+
break;
|
|
802
|
+
}
|
|
782
803
|
}
|
|
783
804
|
}
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
805
|
+
testType = "before";
|
|
806
|
+
if (beforeResult != NOTESTDEFINED) {
|
|
807
|
+
this.#handleTestResult(testElement, beforeResult, true, void 0, testType);
|
|
808
|
+
}
|
|
809
|
+
testType = void 0;
|
|
810
|
+
this.#handleTestResult(testElement, testResult, true, void 0, testType);
|
|
811
|
+
testType = "after";
|
|
812
|
+
if (afterResult != NOTESTDEFINED) {
|
|
813
|
+
this.#handleTestResult(testElement, afterResult, true, void 0, testType);
|
|
814
|
+
}
|
|
794
815
|
}
|
|
795
816
|
} catch (error) {
|
|
796
817
|
this.#handleTestResult(testElement, testResult, false, error, testType);
|
|
@@ -799,6 +820,9 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
799
820
|
} finally {
|
|
800
821
|
testElement?.classList.remove("running");
|
|
801
822
|
testElement?.part.remove("running");
|
|
823
|
+
iconElement?.classList.remove("running");
|
|
824
|
+
iconElement?.part.remove("running");
|
|
825
|
+
this.dispatchEvent(new CustomEvent("aftertest" /* AfterTest */, { bubbles: true, cancelable: true, composed: true, detail: { testElement } }));
|
|
802
826
|
}
|
|
803
827
|
}
|
|
804
828
|
#handleTestResult(testElement, result, finishedTest, error, beforeOrAfter) {
|
|
@@ -924,6 +948,11 @@ Result:${objectResult.value}`,
|
|
|
924
948
|
testElement.part.toggle("success", success);
|
|
925
949
|
testElement.classList.toggle("fail", !success);
|
|
926
950
|
testElement.part.toggle("fail", !success);
|
|
951
|
+
const iconElement = testElement.querySelector(".result-icon");
|
|
952
|
+
iconElement?.classList.toggle("success", success);
|
|
953
|
+
iconElement?.part.toggle("success", success);
|
|
954
|
+
iconElement?.classList.toggle("fail", !success);
|
|
955
|
+
iconElement?.part.toggle("fail", !success);
|
|
927
956
|
const resultElement = testElement.querySelector(`.${beforeOrAfter == void 0 ? "result" : beforeOrAfter == "before" ? "before-result" : "after-result"}`);
|
|
928
957
|
if (resultElement == null) {
|
|
929
958
|
this.#addProcessError(`Unable to find result element`);
|
|
@@ -1031,6 +1060,7 @@ if (customElements.get(COMPONENT_TAG_NAME) == null) {
|
|
|
1031
1060
|
AFTEREACH,
|
|
1032
1061
|
BEFOREALL,
|
|
1033
1062
|
BEFOREEACH,
|
|
1063
|
+
CodeTestEventType,
|
|
1034
1064
|
CodeTests,
|
|
1035
1065
|
CodeTestsElement,
|
|
1036
1066
|
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);
|
|
@@ -521,9 +529,11 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
521
529
|
this.#runTest(testId, test);
|
|
522
530
|
}
|
|
523
531
|
async loadTests(path) {
|
|
524
|
-
this.classList.remove("has-before-hook");
|
|
525
|
-
this.classList.remove("has-after-hook");
|
|
526
532
|
try {
|
|
533
|
+
this.getElement("tests").innerHTML = "";
|
|
534
|
+
this.#tests.clear();
|
|
535
|
+
this.classList.remove("has-before-hook");
|
|
536
|
+
this.classList.remove("has-after-hook");
|
|
527
537
|
const lastSlashIndexInCurrentPath = window.location.href.lastIndexOf("/");
|
|
528
538
|
const currentPathHasExtension = window.location.href.substring(lastSlashIndexInCurrentPath).indexOf(".") != -1;
|
|
529
539
|
const currentPath = currentPathHasExtension == true ? window.location.href.substring(0, lastSlashIndexInCurrentPath + 1) : window.location.href;
|
|
@@ -620,6 +630,7 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
620
630
|
}
|
|
621
631
|
}
|
|
622
632
|
async runTests() {
|
|
633
|
+
this.dispatchEvent(new CustomEvent("beforeall" /* BeforeAll */, { bubbles: true, composed: true }));
|
|
623
634
|
this.#continueRunningTests = true;
|
|
624
635
|
this.classList.add("running");
|
|
625
636
|
this.toggleAttribute("success", false);
|
|
@@ -686,6 +697,7 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
686
697
|
this.setAttribute("success", failedTests.length == 0 ? "true" : "false");
|
|
687
698
|
this.classList.remove("running");
|
|
688
699
|
this.part.remove("running");
|
|
700
|
+
this.dispatchEvent(new CustomEvent("afterall" /* AfterAll */, { bubbles: true, composed: true }));
|
|
689
701
|
}
|
|
690
702
|
#clearTestStatuses() {
|
|
691
703
|
for (const [testId, test] of this.#tests) {
|
|
@@ -718,6 +730,11 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
718
730
|
testElement.part.add("running");
|
|
719
731
|
testElement.classList.remove("success", "fail");
|
|
720
732
|
testElement.part.remove("success", "fail");
|
|
733
|
+
const iconElement = testElement.querySelector(".result-icon");
|
|
734
|
+
iconElement?.classList.remove("success", "fail");
|
|
735
|
+
iconElement?.part.remove("success", "fail");
|
|
736
|
+
iconElement?.classList.add("running");
|
|
737
|
+
iconElement?.part.add("running");
|
|
721
738
|
const errorMessageElement = testElement.querySelector(".error-message");
|
|
722
739
|
if (errorMessageElement != null) {
|
|
723
740
|
errorMessageElement.textContent = "";
|
|
@@ -731,34 +748,37 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
731
748
|
let afterResult = NOTESTDEFINED;
|
|
732
749
|
let testType;
|
|
733
750
|
try {
|
|
734
|
-
const
|
|
735
|
-
if (
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
751
|
+
const allowTest = this.dispatchEvent(new CustomEvent("beforetest" /* BeforeTest */, { bubbles: true, cancelable: true, composed: true, detail: { testElement } }));
|
|
752
|
+
if (allowTest == true) {
|
|
753
|
+
const beforeHooks = this.#hooks.get(BEFOREEACH);
|
|
754
|
+
if (beforeHooks != null) {
|
|
755
|
+
for (const [hook, ids] of beforeHooks) {
|
|
756
|
+
if (ids.has(testId)) {
|
|
757
|
+
beforeResult = await hook();
|
|
758
|
+
break;
|
|
759
|
+
}
|
|
740
760
|
}
|
|
741
761
|
}
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
762
|
+
testResult = await test();
|
|
763
|
+
const afterHooks = this.#hooks.get(AFTEREACH);
|
|
764
|
+
if (afterHooks != null) {
|
|
765
|
+
for (const [hook, ids] of afterHooks) {
|
|
766
|
+
if (ids.has(testId)) {
|
|
767
|
+
afterResult = await hook();
|
|
768
|
+
break;
|
|
769
|
+
}
|
|
750
770
|
}
|
|
751
771
|
}
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
772
|
+
testType = "before";
|
|
773
|
+
if (beforeResult != NOTESTDEFINED) {
|
|
774
|
+
this.#handleTestResult(testElement, beforeResult, true, void 0, testType);
|
|
775
|
+
}
|
|
776
|
+
testType = void 0;
|
|
777
|
+
this.#handleTestResult(testElement, testResult, true, void 0, testType);
|
|
778
|
+
testType = "after";
|
|
779
|
+
if (afterResult != NOTESTDEFINED) {
|
|
780
|
+
this.#handleTestResult(testElement, afterResult, true, void 0, testType);
|
|
781
|
+
}
|
|
762
782
|
}
|
|
763
783
|
} catch (error) {
|
|
764
784
|
this.#handleTestResult(testElement, testResult, false, error, testType);
|
|
@@ -767,6 +787,9 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
767
787
|
} finally {
|
|
768
788
|
testElement?.classList.remove("running");
|
|
769
789
|
testElement?.part.remove("running");
|
|
790
|
+
iconElement?.classList.remove("running");
|
|
791
|
+
iconElement?.part.remove("running");
|
|
792
|
+
this.dispatchEvent(new CustomEvent("aftertest" /* AfterTest */, { bubbles: true, cancelable: true, composed: true, detail: { testElement } }));
|
|
770
793
|
}
|
|
771
794
|
}
|
|
772
795
|
#handleTestResult(testElement, result, finishedTest, error, beforeOrAfter) {
|
|
@@ -892,6 +915,11 @@ Result:${objectResult.value}`,
|
|
|
892
915
|
testElement.part.toggle("success", success);
|
|
893
916
|
testElement.classList.toggle("fail", !success);
|
|
894
917
|
testElement.part.toggle("fail", !success);
|
|
918
|
+
const iconElement = testElement.querySelector(".result-icon");
|
|
919
|
+
iconElement?.classList.toggle("success", success);
|
|
920
|
+
iconElement?.part.toggle("success", success);
|
|
921
|
+
iconElement?.classList.toggle("fail", !success);
|
|
922
|
+
iconElement?.part.toggle("fail", !success);
|
|
895
923
|
const resultElement = testElement.querySelector(`.${beforeOrAfter == void 0 ? "result" : beforeOrAfter == "before" ? "before-result" : "after-result"}`);
|
|
896
924
|
if (resultElement == null) {
|
|
897
925
|
this.#addProcessError(`Unable to find result element`);
|
|
@@ -998,6 +1026,7 @@ export {
|
|
|
998
1026
|
AFTEREACH,
|
|
999
1027
|
BEFOREALL,
|
|
1000
1028
|
BEFOREEACH,
|
|
1029
|
+
CodeTestEventType,
|
|
1001
1030
|
CodeTests,
|
|
1002
1031
|
CodeTestsElement,
|
|
1003
1032
|
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(){this.addEventListener("click",this.#c);let t=this.getAttribute("src")??this.getAttribute("test")??this.getAttribute("tests")??this.getAttribute("run")??this.getAttribute("path");t!=null&&(this.loadTests(t),$(this.shadowRoot))}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;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)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;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.3",
|
|
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",
|