@magnit-ce/code-tests 0.0.11 → 0.0.13
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 +202 -131
- package/dist/code-tests.d.cts +9 -5
- package/dist/code-tests.d.ts +9 -5
- package/dist/code-tests.js +201 -127
- package/dist/code-tests.min.js +43 -15
- package/package.json +1 -1
package/dist/code-tests.cjs
CHANGED
|
@@ -20,13 +20,10 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
20
20
|
// src/code-tests.ts
|
|
21
21
|
var code_tests_exports = {};
|
|
22
22
|
__export(code_tests_exports, {
|
|
23
|
-
AFTERALL: () => AFTERALL,
|
|
24
|
-
AFTEREACH: () => AFTEREACH,
|
|
25
|
-
BEFOREALL: () => BEFOREALL,
|
|
26
|
-
BEFOREEACH: () => BEFOREEACH,
|
|
27
23
|
CodeTestEventType: () => CodeTestEventType,
|
|
28
24
|
CodeTests: () => CodeTests,
|
|
29
25
|
CodeTestsElement: () => CodeTestsElement,
|
|
26
|
+
HookType: () => HookType,
|
|
30
27
|
expect: () => expect,
|
|
31
28
|
prompt: () => prompt
|
|
32
29
|
});
|
|
@@ -163,11 +160,25 @@ var code_tests_default = `:host
|
|
|
163
160
|
display: none;
|
|
164
161
|
}
|
|
165
162
|
:host(.has-before-hook) #before-all-details
|
|
166
|
-
,:host(.has-
|
|
163
|
+
,:host(.has-after-hook) #after-all-details
|
|
164
|
+
{
|
|
165
|
+
display: initial;
|
|
166
|
+
}
|
|
167
|
+
:host(.has-required-before-hook) #required-before-any-details
|
|
168
|
+
,:host(.has-required-after-hook) #required-after-any-details
|
|
167
169
|
{
|
|
168
170
|
display: initial;
|
|
169
171
|
}
|
|
170
172
|
|
|
173
|
+
#required-before-any-summary
|
|
174
|
+
,#required-after-any-summary
|
|
175
|
+
{
|
|
176
|
+
background: var(--surface-process);
|
|
177
|
+
color: var(--text-process);
|
|
178
|
+
border: solid 1px var(--text-process);
|
|
179
|
+
grid-template-columns: auto auto 1fr;
|
|
180
|
+
}
|
|
181
|
+
|
|
171
182
|
#tests
|
|
172
183
|
{
|
|
173
184
|
margin: 0;
|
|
@@ -431,7 +442,7 @@ pre
|
|
|
431
442
|
}`;
|
|
432
443
|
|
|
433
444
|
// src/code-tests.html?raw
|
|
434
|
-
var code_tests_default2 = '<slot name="header">\n <header id="header">\n <span id="title"><slot name="title"><span id="title-text">Tests</span></slot></span>\n <slot name="play-button">\n <button type="button" class="run" data-all>\n <slot name="play-button-label">\n <span id="play-button-label" class="button-label label icon">Run Tests</span>\n </slot>\n </button>\n </slot>\n <slot name="details"></slot>\n </header>\n</slot>\n<details id="before-all-details" class="hook">\n <summary id="before-all-summary">\n <span id="before-all-result-icon" class="result-icon"></span>\n <span id="before-all-description" class="description">Results from Before All Hook</span>\n </summary>\n <div id="before-all-results" class="results"></div>\n</details>\n<ul id="tests"></ul>\n<details id="after-all-details" class="hook">\n <summary id="after-all-summary">\n <span id="after-all-result-icon" class="result-icon"></span>\n <span id="after-all-description" class="description">Results from After All Hook</span>\n </summary>\n <div id="after-all-results" class="results"></div>\n</details>\n\n<template id="prompt-template">\n <div class="prompt" part="prompt">\n <div class="prompt-display">\n <span class="icon prompt-icon"></span>\n <span class="label prompt-label"></span>\n </div>\n <div class="prompt-actions">\n <button class="prompt-button accept" type="button">Accept</button>\n <button class="prompt-button reject" type="button">Reject</button>\n </div>\n </div>\n</template>';
|
|
445
|
+
var code_tests_default2 = '<slot name="header">\n <header id="header">\n <span id="title"><slot name="title"><span id="title-text">Tests</span></slot></span>\n <slot name="play-button">\n <button type="button" class="run" data-all>\n <slot name="play-button-label">\n <span id="play-button-label" class="button-label label icon">Run Tests</span>\n </slot>\n </button>\n </slot>\n <slot name="details"></slot>\n </header>\n</slot>\n<details id="required-before-any-details" class="hook">\n <summary id="required-before-any-summary">\n <span id="required-before-any-result-icon" class="result-icon"></span>\n <span id="required-before-any-description" class="description">Results from Required Before Any Hook</span>\n </summary>\n <div id="required-before-any-results" class="results"></div>\n</details>\n<details id="before-all-details" class="hook">\n <summary id="before-all-summary">\n <span id="before-all-result-icon" class="result-icon"></span>\n <span id="before-all-description" class="description">Results from Before All Hook</span>\n </summary>\n <div id="before-all-results" class="results"></div>\n</details>\n<ul id="tests"></ul>\n<details id="after-all-details" class="hook">\n <summary id="after-all-summary">\n <span id="after-all-result-icon" class="result-icon"></span>\n <span id="after-all-description" class="description">Results from After All Hook</span>\n </summary>\n <div id="after-all-results" class="results"></div>\n</details>\n<details id="required-after-any-details" class="hook">\n <summary id="required-after-any-summary">\n <span id="required-after-any-result-icon" class="result-icon"></span>\n <span id="required-after-any-description" class="description">Results from Required After Any Hook</span>\n </summary>\n <div id="required-after-any-results" class="results"></div>\n</details>\n\n<template id="prompt-template">\n <div class="prompt" part="prompt">\n <div class="prompt-display">\n <span class="icon prompt-icon"></span>\n <span class="label prompt-label"></span>\n </div>\n <div class="prompt-actions">\n <button class="prompt-button accept" type="button">Accept</button>\n <button class="prompt-button reject" type="button">Reject</button>\n </div>\n </div>\n</template>';
|
|
435
446
|
|
|
436
447
|
// src/api.ts
|
|
437
448
|
var TestPromise = class extends Promise {
|
|
@@ -463,10 +474,6 @@ var TestPromise = class extends Promise {
|
|
|
463
474
|
}
|
|
464
475
|
}
|
|
465
476
|
};
|
|
466
|
-
var BEFOREALL = Symbol("beforeAll");
|
|
467
|
-
var BEFOREEACH = Symbol("beforeEach");
|
|
468
|
-
var AFTERALL = Symbol("afterAll");
|
|
469
|
-
var AFTEREACH = Symbol("afterEach");
|
|
470
477
|
var CodeTests = class _CodeTests {
|
|
471
478
|
static timeoutMS = 500;
|
|
472
479
|
static #expectInterval;
|
|
@@ -574,6 +581,15 @@ function assignClassAndIdToPart(shadowRoot) {
|
|
|
574
581
|
}
|
|
575
582
|
|
|
576
583
|
// src/code-tests.ts
|
|
584
|
+
var HookType = /* @__PURE__ */ ((HookType2) => {
|
|
585
|
+
HookType2["BeforeAll"] = "beforeall";
|
|
586
|
+
HookType2["AfterAll"] = "afterall";
|
|
587
|
+
HookType2["BeforeEach"] = "beforeeach";
|
|
588
|
+
HookType2["AfterEach"] = "aftereach";
|
|
589
|
+
HookType2["RequiredBeforeAny"] = "requiredbeforeany";
|
|
590
|
+
HookType2["RequiredAfterAny"] = "requiredafterany";
|
|
591
|
+
return HookType2;
|
|
592
|
+
})(HookType || {});
|
|
577
593
|
var CodeTestEventType = /* @__PURE__ */ ((CodeTestEventType2) => {
|
|
578
594
|
CodeTestEventType2["BeforeAll"] = "beforeall";
|
|
579
595
|
CodeTestEventType2["AfterAll"] = "afterall";
|
|
@@ -600,13 +616,7 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
600
616
|
findElement(id) {
|
|
601
617
|
return this.shadowRoot.getElementById(id);
|
|
602
618
|
}
|
|
603
|
-
#hooks =
|
|
604
|
-
#hookIds = {
|
|
605
|
-
[BEFOREALL]: generateId(),
|
|
606
|
-
[BEFOREEACH]: generateId(),
|
|
607
|
-
[AFTEREACH]: generateId(),
|
|
608
|
-
[AFTERALL]: generateId()
|
|
609
|
-
};
|
|
619
|
+
#hooks = {};
|
|
610
620
|
#continueRunningTests = true;
|
|
611
621
|
constructor() {
|
|
612
622
|
super();
|
|
@@ -621,7 +631,7 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
621
631
|
if (this.getAttribute("auto") == "false") {
|
|
622
632
|
return;
|
|
623
633
|
}
|
|
624
|
-
const testsPath = this
|
|
634
|
+
const testsPath = this.#getCurrentTestsPath();
|
|
625
635
|
if (testsPath == null) {
|
|
626
636
|
return;
|
|
627
637
|
}
|
|
@@ -691,82 +701,44 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
691
701
|
if (tests == void 0) {
|
|
692
702
|
throw new Error(`Unable to find tests definition in file at path: ${path}`);
|
|
693
703
|
}
|
|
694
|
-
const beforeAll = tests[
|
|
704
|
+
const beforeAll = tests["beforeall" /* BeforeAll */];
|
|
695
705
|
if (beforeAll != null) {
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
const map = /* @__PURE__ */ new Map();
|
|
699
|
-
map.set(beforeAll, /* @__PURE__ */ new Set());
|
|
700
|
-
this.#hooks.set(BEFOREALL, map);
|
|
701
|
-
}
|
|
706
|
+
this.#hooks["beforeall" /* BeforeAll */] = beforeAll;
|
|
707
|
+
delete tests["beforeall" /* BeforeAll */];
|
|
702
708
|
this.classList.add("has-before-hook");
|
|
703
709
|
}
|
|
704
|
-
const
|
|
705
|
-
if (beforeEach != null) {
|
|
706
|
-
const hookMap = this.#hooks.get(BEFOREEACH);
|
|
707
|
-
if (hookMap == null) {
|
|
708
|
-
const map = /* @__PURE__ */ new Map();
|
|
709
|
-
map.set(beforeEach, /* @__PURE__ */ new Set());
|
|
710
|
-
this.#hooks.set(BEFOREEACH, map);
|
|
711
|
-
}
|
|
712
|
-
}
|
|
713
|
-
const afterAll = tests[AFTERALL];
|
|
710
|
+
const afterAll = tests["afterall" /* AfterAll */];
|
|
714
711
|
if (afterAll != null) {
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
const map = /* @__PURE__ */ new Map();
|
|
718
|
-
map.set(afterAll, /* @__PURE__ */ new Set());
|
|
719
|
-
this.#hooks.set(AFTERALL, map);
|
|
720
|
-
}
|
|
712
|
+
this.#hooks["afterall" /* AfterAll */] = afterAll;
|
|
713
|
+
delete tests["afterall" /* AfterAll */];
|
|
721
714
|
this.classList.add("has-after-hook");
|
|
722
715
|
}
|
|
723
|
-
const
|
|
716
|
+
const beforeEach = tests["beforeeach" /* BeforeEach */];
|
|
717
|
+
if (beforeEach != null) {
|
|
718
|
+
this.#hooks["beforeeach" /* BeforeEach */] = beforeEach;
|
|
719
|
+
delete tests["beforeeach" /* BeforeEach */];
|
|
720
|
+
}
|
|
721
|
+
const afterEach = tests["aftereach" /* AfterEach */];
|
|
724
722
|
if (afterEach != null) {
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
723
|
+
this.#hooks["aftereach" /* AfterEach */] = afterEach;
|
|
724
|
+
delete tests["aftereach" /* AfterEach */];
|
|
725
|
+
}
|
|
726
|
+
const requiredBeforeAny = tests["requiredbeforeany" /* RequiredBeforeAny */];
|
|
727
|
+
if (requiredBeforeAny != null) {
|
|
728
|
+
this.#hooks["requiredbeforeany" /* RequiredBeforeAny */] = requiredBeforeAny;
|
|
729
|
+
delete tests["requiredbeforeany" /* RequiredBeforeAny */];
|
|
730
|
+
this.classList.add("has-required-before-hook");
|
|
731
|
+
this.part.add("has-required-before-hook");
|
|
732
|
+
}
|
|
733
|
+
const requiredAfterAny = tests["requiredafterany" /* RequiredAfterAny */];
|
|
734
|
+
if (requiredAfterAny != null) {
|
|
735
|
+
this.#hooks["requiredafterany" /* RequiredAfterAny */] = requiredAfterAny;
|
|
736
|
+
delete tests["requiredafterany" /* RequiredAfterAny */];
|
|
737
|
+
this.classList.add("has-required-after-hook");
|
|
738
|
+
this.part.add("has-required-after-hook");
|
|
731
739
|
}
|
|
732
740
|
for (const [description, test] of Object.entries(tests)) {
|
|
733
|
-
|
|
734
|
-
if (beforeAll != null) {
|
|
735
|
-
const hookMap = this.#hooks.get(BEFOREALL);
|
|
736
|
-
if (hookMap != null) {
|
|
737
|
-
const testIds = hookMap.get(beforeAll);
|
|
738
|
-
if (testIds != null) {
|
|
739
|
-
testIds.add(id);
|
|
740
|
-
}
|
|
741
|
-
}
|
|
742
|
-
}
|
|
743
|
-
if (beforeEach != null) {
|
|
744
|
-
const hookMap = this.#hooks.get(BEFOREEACH);
|
|
745
|
-
if (hookMap != null) {
|
|
746
|
-
const testIds = hookMap.get(beforeEach);
|
|
747
|
-
if (testIds != null) {
|
|
748
|
-
testIds.add(id);
|
|
749
|
-
}
|
|
750
|
-
}
|
|
751
|
-
}
|
|
752
|
-
if (afterAll != null) {
|
|
753
|
-
const hookMap = this.#hooks.get(AFTERALL);
|
|
754
|
-
if (hookMap != null) {
|
|
755
|
-
const testIds = hookMap.get(afterAll);
|
|
756
|
-
if (testIds != null) {
|
|
757
|
-
testIds.add(id);
|
|
758
|
-
}
|
|
759
|
-
}
|
|
760
|
-
}
|
|
761
|
-
if (afterEach != null) {
|
|
762
|
-
const hookMap = this.#hooks.get(AFTEREACH);
|
|
763
|
-
if (hookMap != null) {
|
|
764
|
-
const testIds = hookMap.get(afterEach);
|
|
765
|
-
if (testIds != null) {
|
|
766
|
-
testIds.add(id);
|
|
767
|
-
}
|
|
768
|
-
}
|
|
769
|
-
}
|
|
741
|
+
this.#addTest(description, test);
|
|
770
742
|
}
|
|
771
743
|
} catch (error) {
|
|
772
744
|
this.#addProcessError("An error occurred while loading the tasks:", error);
|
|
@@ -793,24 +765,49 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
793
765
|
}
|
|
794
766
|
this.#clearTestStatuses();
|
|
795
767
|
const inOrder = this.hasAttribute("in-order");
|
|
796
|
-
const
|
|
797
|
-
if (
|
|
768
|
+
const requiredBeforeHook = this.#hooks["requiredbeforeany" /* RequiredBeforeAny */];
|
|
769
|
+
if (requiredBeforeHook != null) {
|
|
770
|
+
let hookResult;
|
|
771
|
+
try {
|
|
772
|
+
const requiredBeforeAnyHookElement = this.getElement(`required-before-any-details`);
|
|
773
|
+
requiredBeforeAnyHookElement.classList.add("running");
|
|
774
|
+
requiredBeforeAnyHookElement.part.add("running");
|
|
775
|
+
if (this.isCanceled == true) {
|
|
776
|
+
throw new Error("Test has been cancelled");
|
|
777
|
+
}
|
|
778
|
+
hookResult = await requiredBeforeHook(this, requiredBeforeAnyHookElement);
|
|
779
|
+
this.#handleHookResult(hookResult, true, "before", true);
|
|
780
|
+
requiredBeforeAnyHookElement.part.remove("running");
|
|
781
|
+
requiredBeforeAnyHookElement.classList.remove("running");
|
|
782
|
+
} catch (error) {
|
|
783
|
+
this.#handleHookResult(hookResult, false, "before", true, error);
|
|
784
|
+
console.error(error);
|
|
785
|
+
this.#continueRunningTests = false;
|
|
786
|
+
this.classList.remove("running");
|
|
787
|
+
this.part.remove("running");
|
|
788
|
+
if (playButtonLabel != null) {
|
|
789
|
+
playButtonLabel.textContent = "Run Tests";
|
|
790
|
+
}
|
|
791
|
+
this.dispatchEvent(new CustomEvent("afterall" /* AfterAll */, { bubbles: true, composed: true }));
|
|
792
|
+
return;
|
|
793
|
+
}
|
|
794
|
+
}
|
|
795
|
+
const beforeHook = this.#hooks["beforeall" /* BeforeAll */];
|
|
796
|
+
if (beforeHook != null) {
|
|
798
797
|
let hookResult;
|
|
799
798
|
try {
|
|
800
799
|
const beforeAllHookElement = this.getElement(`before-all-details`);
|
|
801
800
|
beforeAllHookElement.classList.add("running");
|
|
802
801
|
beforeAllHookElement.part.add("running");
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
throw new Error("Test has been cancelled");
|
|
806
|
-
}
|
|
807
|
-
hookResult = await hook(this, beforeAllHookElement);
|
|
808
|
-
this.#handleHookResult(hookResult, true, "before");
|
|
802
|
+
if (this.isCanceled == true) {
|
|
803
|
+
throw new Error("Test has been cancelled");
|
|
809
804
|
}
|
|
805
|
+
hookResult = await beforeHook(this, beforeAllHookElement);
|
|
806
|
+
this.#handleHookResult(hookResult, true, "before", false);
|
|
810
807
|
beforeAllHookElement.part.remove("running");
|
|
811
808
|
beforeAllHookElement.classList.remove("running");
|
|
812
809
|
} catch (error) {
|
|
813
|
-
this.#handleHookResult(hookResult, false, "before", error);
|
|
810
|
+
this.#handleHookResult(hookResult, false, "before", false, error);
|
|
814
811
|
console.error(error);
|
|
815
812
|
this.#continueRunningTests = false;
|
|
816
813
|
this.classList.remove("running");
|
|
@@ -833,7 +830,7 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
833
830
|
if (this.#continueRunningTests == false) {
|
|
834
831
|
break;
|
|
835
832
|
}
|
|
836
|
-
await this.#runTest(id, test);
|
|
833
|
+
await this.#runTest(id, test, false);
|
|
837
834
|
}
|
|
838
835
|
}
|
|
839
836
|
if (this.#continueRunningTests == false) {
|
|
@@ -845,25 +842,42 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
845
842
|
this.dispatchEvent(new CustomEvent("afterall" /* AfterAll */, { bubbles: true, composed: true }));
|
|
846
843
|
return;
|
|
847
844
|
}
|
|
848
|
-
const
|
|
849
|
-
if (
|
|
845
|
+
const afterHook = this.#hooks["afterall" /* AfterAll */];
|
|
846
|
+
if (afterHook != null) {
|
|
850
847
|
let hookResult;
|
|
851
848
|
try {
|
|
852
849
|
const afterAllHookElement = this.getElement(`after-all-details`);
|
|
853
850
|
afterAllHookElement.classList.add("running");
|
|
854
851
|
afterAllHookElement.part.add("running");
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
throw new Error("Test has been cancelled");
|
|
858
|
-
}
|
|
859
|
-
hookResult = await hook(this, afterAllHookElement);
|
|
860
|
-
this.#handleHookResult(hookResult, true, "after");
|
|
852
|
+
if (this.isCanceled == true) {
|
|
853
|
+
throw new Error("Test has been cancelled");
|
|
861
854
|
}
|
|
855
|
+
hookResult = await afterHook(this, afterAllHookElement);
|
|
856
|
+
this.#handleHookResult(hookResult, true, "after", false);
|
|
862
857
|
afterAllHookElement.part.remove("running");
|
|
863
858
|
afterAllHookElement.classList.remove("running");
|
|
864
859
|
} catch (error) {
|
|
865
|
-
this.#handleHookResult(hookResult, false, "after", error);
|
|
860
|
+
this.#handleHookResult(hookResult, false, "after", false, error);
|
|
866
861
|
console.error(error);
|
|
862
|
+
const requiredAfterHook2 = this.#hooks["requiredafterany" /* RequiredAfterAny */];
|
|
863
|
+
if (requiredAfterHook2 != null) {
|
|
864
|
+
let hookResult2;
|
|
865
|
+
try {
|
|
866
|
+
const requiredAfterAnyHookElement = this.getElement(`required-after-any-details`);
|
|
867
|
+
requiredAfterAnyHookElement.classList.add("running");
|
|
868
|
+
requiredAfterAnyHookElement.part.add("running");
|
|
869
|
+
if (this.isCanceled == true) {
|
|
870
|
+
throw new Error("Test has been cancelled");
|
|
871
|
+
}
|
|
872
|
+
hookResult2 = await requiredAfterHook2(this, requiredAfterAnyHookElement);
|
|
873
|
+
this.#handleHookResult(hookResult2, true, "after", true);
|
|
874
|
+
requiredAfterAnyHookElement.part.remove("running");
|
|
875
|
+
requiredAfterAnyHookElement.classList.remove("running");
|
|
876
|
+
} catch (error2) {
|
|
877
|
+
this.#handleHookResult(hookResult2, false, "after", true, error2);
|
|
878
|
+
console.error(error2);
|
|
879
|
+
}
|
|
880
|
+
}
|
|
867
881
|
this.#continueRunningTests = false;
|
|
868
882
|
this.classList.remove("running");
|
|
869
883
|
this.part.remove("running");
|
|
@@ -874,6 +888,26 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
874
888
|
return;
|
|
875
889
|
}
|
|
876
890
|
}
|
|
891
|
+
const requiredAfterHook = this.#hooks["requiredafterany" /* RequiredAfterAny */];
|
|
892
|
+
if (requiredAfterHook != null) {
|
|
893
|
+
let hookResult;
|
|
894
|
+
try {
|
|
895
|
+
const requiredAfterAnyHookElement = this.getElement(`required-after-any-details`);
|
|
896
|
+
requiredAfterAnyHookElement.classList.add("running");
|
|
897
|
+
requiredAfterAnyHookElement.part.add("running");
|
|
898
|
+
if (this.isCanceled == true) {
|
|
899
|
+
throw new Error("Test has been cancelled");
|
|
900
|
+
}
|
|
901
|
+
hookResult = await requiredAfterHook(this, requiredAfterAnyHookElement);
|
|
902
|
+
this.#handleHookResult(hookResult, true, "after", true);
|
|
903
|
+
requiredAfterAnyHookElement.part.remove("running");
|
|
904
|
+
requiredAfterAnyHookElement.classList.remove("running");
|
|
905
|
+
} catch (error) {
|
|
906
|
+
this.#handleHookResult(hookResult, false, "after", true, error);
|
|
907
|
+
console.error(error);
|
|
908
|
+
this.#continueRunningTests = false;
|
|
909
|
+
}
|
|
910
|
+
}
|
|
877
911
|
const failedTests = this.shadowRoot.querySelectorAll('[success="false"]');
|
|
878
912
|
this.setAttribute("success", failedTests.length == 0 ? "true" : "false");
|
|
879
913
|
this.classList.remove("running");
|
|
@@ -903,7 +937,7 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
903
937
|
afterAllHookElement.classList.remove("success", "fail");
|
|
904
938
|
afterAllHookElement.part.remove("success", "fail");
|
|
905
939
|
}
|
|
906
|
-
async #runTest(testId, test) {
|
|
940
|
+
async #runTest(testId, test, handleRequiredTests = true) {
|
|
907
941
|
const testElement = this.getElement("tests").querySelector(`[data-test-id="${testId}"]`);
|
|
908
942
|
if (testElement == null) {
|
|
909
943
|
this.#addProcessError(`Unable to find test element for test: ${testId}`);
|
|
@@ -933,17 +967,38 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
933
967
|
let testType;
|
|
934
968
|
try {
|
|
935
969
|
const allowTest = this.dispatchEvent(new CustomEvent("beforetest" /* BeforeTest */, { bubbles: true, cancelable: true, composed: true, detail: { testElement } }));
|
|
970
|
+
if (handleRequiredTests == true) {
|
|
971
|
+
const requiredBeforeHook = this.#hooks["requiredbeforeany" /* RequiredBeforeAny */];
|
|
972
|
+
if (requiredBeforeHook != null) {
|
|
973
|
+
let hookResult;
|
|
974
|
+
try {
|
|
975
|
+
const requiredBeforeAnyHookElement = this.getElement(`required-before-any-details`);
|
|
976
|
+
requiredBeforeAnyHookElement.classList.add("running");
|
|
977
|
+
requiredBeforeAnyHookElement.part.add("running");
|
|
978
|
+
if (this.isCanceled == true) {
|
|
979
|
+
throw new Error("Test has been cancelled");
|
|
980
|
+
}
|
|
981
|
+
hookResult = await requiredBeforeHook(this, requiredBeforeAnyHookElement);
|
|
982
|
+
this.#handleHookResult(hookResult, true, "before", true);
|
|
983
|
+
requiredBeforeAnyHookElement.part.remove("running");
|
|
984
|
+
requiredBeforeAnyHookElement.classList.remove("running");
|
|
985
|
+
} catch (error) {
|
|
986
|
+
this.#handleHookResult(hookResult, true, "before", true, error);
|
|
987
|
+
console.error(error);
|
|
988
|
+
this.#continueRunningTests = false;
|
|
989
|
+
return;
|
|
990
|
+
}
|
|
991
|
+
}
|
|
992
|
+
}
|
|
993
|
+
if (this.#continueRunningTests == false) {
|
|
994
|
+
throw new Error("Tests have been disabled from continuing to run.");
|
|
995
|
+
}
|
|
936
996
|
if (allowTest == false || this.isCanceled == true) {
|
|
937
997
|
throw new Error("Test has been cancelled");
|
|
938
998
|
}
|
|
939
|
-
const
|
|
940
|
-
if (
|
|
941
|
-
|
|
942
|
-
if (ids.has(testId)) {
|
|
943
|
-
beforeResult = await hook(this, testElement);
|
|
944
|
-
break;
|
|
945
|
-
}
|
|
946
|
-
}
|
|
999
|
+
const beforeHook = this.#hooks["beforeeach" /* BeforeEach */];
|
|
1000
|
+
if (beforeHook != null) {
|
|
1001
|
+
beforeResult = await beforeHook(this, testElement);
|
|
947
1002
|
}
|
|
948
1003
|
if (this.isCanceled == true) {
|
|
949
1004
|
throw new Error("Test has been cancelled");
|
|
@@ -952,12 +1007,30 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
952
1007
|
if (this.isCanceled == true) {
|
|
953
1008
|
throw new Error("Test has been cancelled");
|
|
954
1009
|
}
|
|
955
|
-
const
|
|
956
|
-
if (
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
1010
|
+
const afterHook = this.#hooks["aftereach" /* AfterEach */];
|
|
1011
|
+
if (afterHook != null) {
|
|
1012
|
+
afterResult = await afterHook(this, testElement);
|
|
1013
|
+
}
|
|
1014
|
+
if (handleRequiredTests == true) {
|
|
1015
|
+
const requiredAfterHook = this.#hooks["requiredafterany" /* RequiredAfterAny */];
|
|
1016
|
+
if (requiredAfterHook != null) {
|
|
1017
|
+
let hookResult;
|
|
1018
|
+
try {
|
|
1019
|
+
const requiredBeforeAnyHookElement = this.getElement(`required-before-any-details`);
|
|
1020
|
+
requiredBeforeAnyHookElement.classList.add("running");
|
|
1021
|
+
requiredBeforeAnyHookElement.part.add("running");
|
|
1022
|
+
if (this.isCanceled == true) {
|
|
1023
|
+
throw new Error("Test has been cancelled");
|
|
1024
|
+
}
|
|
1025
|
+
hookResult = await requiredAfterHook(this, requiredBeforeAnyHookElement);
|
|
1026
|
+
this.#handleHookResult(hookResult, true, "after", true);
|
|
1027
|
+
requiredBeforeAnyHookElement.part.remove("running");
|
|
1028
|
+
requiredBeforeAnyHookElement.classList.remove("running");
|
|
1029
|
+
} catch (error) {
|
|
1030
|
+
this.#handleHookResult(hookResult, true, "after", true, error);
|
|
1031
|
+
console.error(error);
|
|
1032
|
+
this.#continueRunningTests = false;
|
|
1033
|
+
return;
|
|
961
1034
|
}
|
|
962
1035
|
}
|
|
963
1036
|
}
|
|
@@ -1015,19 +1088,19 @@ Result:${objectResult.value}`,
|
|
|
1015
1088
|
detailsElement.open = true;
|
|
1016
1089
|
}
|
|
1017
1090
|
}
|
|
1018
|
-
#handleHookResult(result, finishedTest, beforeOrAfter, error) {
|
|
1091
|
+
#handleHookResult(result, finishedTest, beforeOrAfter, required, error) {
|
|
1019
1092
|
if (result instanceof HTMLElement) {
|
|
1020
|
-
this.#setHookResult(result, finishedTest, beforeOrAfter);
|
|
1093
|
+
this.#setHookResult(result, finishedTest, beforeOrAfter, required);
|
|
1021
1094
|
} else {
|
|
1022
1095
|
let defaultResult;
|
|
1023
1096
|
if (result == void 0) {
|
|
1024
1097
|
defaultResult = this.#createDefaultResult(finishedTest == true ? "Hook Ran Successfully" : `Failed${error != null ? `:
|
|
1025
1098
|
${error.message}` : ""}`, finishedTest);
|
|
1026
|
-
this.#setHookResult(defaultResult, finishedTest, beforeOrAfter);
|
|
1099
|
+
this.#setHookResult(defaultResult, finishedTest, beforeOrAfter, required);
|
|
1027
1100
|
} else if (typeof result == "string") {
|
|
1028
1101
|
defaultResult = this.#createDefaultResult(`${result}${error == null ? "" : `:
|
|
1029
1102
|
${error.message}`}`, finishedTest);
|
|
1030
|
-
this.#setHookResult(defaultResult, finishedTest, beforeOrAfter);
|
|
1103
|
+
this.#setHookResult(defaultResult, finishedTest, beforeOrAfter, required);
|
|
1031
1104
|
} else if (typeof result == "object") {
|
|
1032
1105
|
const objectResult = result;
|
|
1033
1106
|
if (objectResult.success != void 0 && objectResult.expected != void 0 && objectResult.value != void 0) {
|
|
@@ -1037,7 +1110,7 @@ Expected:${objectResult.expected}
|
|
|
1037
1110
|
Result:${objectResult.value}`,
|
|
1038
1111
|
objectResult.success
|
|
1039
1112
|
);
|
|
1040
|
-
this.#setHookResult(defaultResult, finishedTest, beforeOrAfter);
|
|
1113
|
+
this.#setHookResult(defaultResult, finishedTest, beforeOrAfter, required);
|
|
1041
1114
|
}
|
|
1042
1115
|
}
|
|
1043
1116
|
}
|
|
@@ -1130,9 +1203,10 @@ Result:${objectResult.value}`,
|
|
|
1130
1203
|
codeElement.appendChild(preElement);
|
|
1131
1204
|
return codeElement;
|
|
1132
1205
|
}
|
|
1133
|
-
#setHookResult(valueElement, success, beforeOrAfter) {
|
|
1134
|
-
const
|
|
1135
|
-
const
|
|
1206
|
+
#setHookResult(valueElement, success, beforeOrAfter, required) {
|
|
1207
|
+
const selector = required == true ? `required-${beforeOrAfter}-any` : `${beforeOrAfter}-all`;
|
|
1208
|
+
const detailsElement = this.getElement(`${selector}-details`);
|
|
1209
|
+
const resultsElement = this.getElement(`${selector}-results`);
|
|
1136
1210
|
detailsElement.setAttribute("success", success == true ? "true" : "false");
|
|
1137
1211
|
detailsElement.classList.toggle("success", success);
|
|
1138
1212
|
detailsElement.part.toggle("success", success);
|
|
@@ -1213,13 +1287,10 @@ if (customElements.get(COMPONENT_TAG_NAME) == null) {
|
|
|
1213
1287
|
}
|
|
1214
1288
|
// Annotate the CommonJS export names for ESM import in node:
|
|
1215
1289
|
0 && (module.exports = {
|
|
1216
|
-
AFTERALL,
|
|
1217
|
-
AFTEREACH,
|
|
1218
|
-
BEFOREALL,
|
|
1219
|
-
BEFOREEACH,
|
|
1220
1290
|
CodeTestEventType,
|
|
1221
1291
|
CodeTests,
|
|
1222
1292
|
CodeTestsElement,
|
|
1293
|
+
HookType,
|
|
1223
1294
|
expect,
|
|
1224
1295
|
prompt
|
|
1225
1296
|
});
|
package/dist/code-tests.d.cts
CHANGED
|
@@ -4,10 +4,6 @@ declare class TestPromise<T> extends Promise<T> {
|
|
|
4
4
|
toContainText(value: string): Promise<void>;
|
|
5
5
|
toHaveAttribute(value: string): Promise<void>;
|
|
6
6
|
}
|
|
7
|
-
declare const BEFOREALL: unique symbol;
|
|
8
|
-
declare const BEFOREEACH: unique symbol;
|
|
9
|
-
declare const AFTERALL: unique symbol;
|
|
10
|
-
declare const AFTEREACH: unique symbol;
|
|
11
7
|
declare class CodeTests {
|
|
12
8
|
#private;
|
|
13
9
|
static timeoutMS: number;
|
|
@@ -27,6 +23,14 @@ type PromptOptions = {
|
|
|
27
23
|
declare function prompt(host: CodeTestsElement, parent: HTMLElement, message: string, options?: PromptOptions): Promise<boolean>;
|
|
28
24
|
|
|
29
25
|
type CodeTestsProperties = {};
|
|
26
|
+
declare enum HookType {
|
|
27
|
+
BeforeAll = "beforeall",
|
|
28
|
+
AfterAll = "afterall",
|
|
29
|
+
BeforeEach = "beforeeach",
|
|
30
|
+
AfterEach = "aftereach",
|
|
31
|
+
RequiredBeforeAny = "requiredbeforeany",
|
|
32
|
+
RequiredAfterAny = "requiredafterany"
|
|
33
|
+
}
|
|
30
34
|
declare enum CodeTestEventType {
|
|
31
35
|
BeforeAll = "beforeall",
|
|
32
36
|
AfterAll = "afterall",
|
|
@@ -51,4 +55,4 @@ declare class CodeTestsElement extends HTMLElement {
|
|
|
51
55
|
attributeChangedCallback(attributeName: string, oldValue: string, newValue: string): void;
|
|
52
56
|
}
|
|
53
57
|
|
|
54
|
-
export {
|
|
58
|
+
export { CodeTestEventType, CodeTests, CodeTestsElement, type CodeTestsProperties, HookType, expect, prompt };
|
package/dist/code-tests.d.ts
CHANGED
|
@@ -4,10 +4,6 @@ declare class TestPromise<T> extends Promise<T> {
|
|
|
4
4
|
toContainText(value: string): Promise<void>;
|
|
5
5
|
toHaveAttribute(value: string): Promise<void>;
|
|
6
6
|
}
|
|
7
|
-
declare const BEFOREALL: unique symbol;
|
|
8
|
-
declare const BEFOREEACH: unique symbol;
|
|
9
|
-
declare const AFTERALL: unique symbol;
|
|
10
|
-
declare const AFTEREACH: unique symbol;
|
|
11
7
|
declare class CodeTests {
|
|
12
8
|
#private;
|
|
13
9
|
static timeoutMS: number;
|
|
@@ -27,6 +23,14 @@ type PromptOptions = {
|
|
|
27
23
|
declare function prompt(host: CodeTestsElement, parent: HTMLElement, message: string, options?: PromptOptions): Promise<boolean>;
|
|
28
24
|
|
|
29
25
|
type CodeTestsProperties = {};
|
|
26
|
+
declare enum HookType {
|
|
27
|
+
BeforeAll = "beforeall",
|
|
28
|
+
AfterAll = "afterall",
|
|
29
|
+
BeforeEach = "beforeeach",
|
|
30
|
+
AfterEach = "aftereach",
|
|
31
|
+
RequiredBeforeAny = "requiredbeforeany",
|
|
32
|
+
RequiredAfterAny = "requiredafterany"
|
|
33
|
+
}
|
|
30
34
|
declare enum CodeTestEventType {
|
|
31
35
|
BeforeAll = "beforeall",
|
|
32
36
|
AfterAll = "afterall",
|
|
@@ -51,4 +55,4 @@ declare class CodeTestsElement extends HTMLElement {
|
|
|
51
55
|
attributeChangedCallback(attributeName: string, oldValue: string, newValue: string): void;
|
|
52
56
|
}
|
|
53
57
|
|
|
54
|
-
export {
|
|
58
|
+
export { CodeTestEventType, CodeTests, CodeTestsElement, type CodeTestsProperties, HookType, expect, prompt };
|
package/dist/code-tests.js
CHANGED
|
@@ -129,11 +129,25 @@ var code_tests_default = `:host
|
|
|
129
129
|
display: none;
|
|
130
130
|
}
|
|
131
131
|
:host(.has-before-hook) #before-all-details
|
|
132
|
-
,:host(.has-
|
|
132
|
+
,:host(.has-after-hook) #after-all-details
|
|
133
|
+
{
|
|
134
|
+
display: initial;
|
|
135
|
+
}
|
|
136
|
+
:host(.has-required-before-hook) #required-before-any-details
|
|
137
|
+
,:host(.has-required-after-hook) #required-after-any-details
|
|
133
138
|
{
|
|
134
139
|
display: initial;
|
|
135
140
|
}
|
|
136
141
|
|
|
142
|
+
#required-before-any-summary
|
|
143
|
+
,#required-after-any-summary
|
|
144
|
+
{
|
|
145
|
+
background: var(--surface-process);
|
|
146
|
+
color: var(--text-process);
|
|
147
|
+
border: solid 1px var(--text-process);
|
|
148
|
+
grid-template-columns: auto auto 1fr;
|
|
149
|
+
}
|
|
150
|
+
|
|
137
151
|
#tests
|
|
138
152
|
{
|
|
139
153
|
margin: 0;
|
|
@@ -397,7 +411,7 @@ pre
|
|
|
397
411
|
}`;
|
|
398
412
|
|
|
399
413
|
// src/code-tests.html?raw
|
|
400
|
-
var code_tests_default2 = '<slot name="header">\n <header id="header">\n <span id="title"><slot name="title"><span id="title-text">Tests</span></slot></span>\n <slot name="play-button">\n <button type="button" class="run" data-all>\n <slot name="play-button-label">\n <span id="play-button-label" class="button-label label icon">Run Tests</span>\n </slot>\n </button>\n </slot>\n <slot name="details"></slot>\n </header>\n</slot>\n<details id="before-all-details" class="hook">\n <summary id="before-all-summary">\n <span id="before-all-result-icon" class="result-icon"></span>\n <span id="before-all-description" class="description">Results from Before All Hook</span>\n </summary>\n <div id="before-all-results" class="results"></div>\n</details>\n<ul id="tests"></ul>\n<details id="after-all-details" class="hook">\n <summary id="after-all-summary">\n <span id="after-all-result-icon" class="result-icon"></span>\n <span id="after-all-description" class="description">Results from After All Hook</span>\n </summary>\n <div id="after-all-results" class="results"></div>\n</details>\n\n<template id="prompt-template">\n <div class="prompt" part="prompt">\n <div class="prompt-display">\n <span class="icon prompt-icon"></span>\n <span class="label prompt-label"></span>\n </div>\n <div class="prompt-actions">\n <button class="prompt-button accept" type="button">Accept</button>\n <button class="prompt-button reject" type="button">Reject</button>\n </div>\n </div>\n</template>';
|
|
414
|
+
var code_tests_default2 = '<slot name="header">\n <header id="header">\n <span id="title"><slot name="title"><span id="title-text">Tests</span></slot></span>\n <slot name="play-button">\n <button type="button" class="run" data-all>\n <slot name="play-button-label">\n <span id="play-button-label" class="button-label label icon">Run Tests</span>\n </slot>\n </button>\n </slot>\n <slot name="details"></slot>\n </header>\n</slot>\n<details id="required-before-any-details" class="hook">\n <summary id="required-before-any-summary">\n <span id="required-before-any-result-icon" class="result-icon"></span>\n <span id="required-before-any-description" class="description">Results from Required Before Any Hook</span>\n </summary>\n <div id="required-before-any-results" class="results"></div>\n</details>\n<details id="before-all-details" class="hook">\n <summary id="before-all-summary">\n <span id="before-all-result-icon" class="result-icon"></span>\n <span id="before-all-description" class="description">Results from Before All Hook</span>\n </summary>\n <div id="before-all-results" class="results"></div>\n</details>\n<ul id="tests"></ul>\n<details id="after-all-details" class="hook">\n <summary id="after-all-summary">\n <span id="after-all-result-icon" class="result-icon"></span>\n <span id="after-all-description" class="description">Results from After All Hook</span>\n </summary>\n <div id="after-all-results" class="results"></div>\n</details>\n<details id="required-after-any-details" class="hook">\n <summary id="required-after-any-summary">\n <span id="required-after-any-result-icon" class="result-icon"></span>\n <span id="required-after-any-description" class="description">Results from Required After Any Hook</span>\n </summary>\n <div id="required-after-any-results" class="results"></div>\n</details>\n\n<template id="prompt-template">\n <div class="prompt" part="prompt">\n <div class="prompt-display">\n <span class="icon prompt-icon"></span>\n <span class="label prompt-label"></span>\n </div>\n <div class="prompt-actions">\n <button class="prompt-button accept" type="button">Accept</button>\n <button class="prompt-button reject" type="button">Reject</button>\n </div>\n </div>\n</template>';
|
|
401
415
|
|
|
402
416
|
// src/api.ts
|
|
403
417
|
var TestPromise = class extends Promise {
|
|
@@ -429,10 +443,6 @@ var TestPromise = class extends Promise {
|
|
|
429
443
|
}
|
|
430
444
|
}
|
|
431
445
|
};
|
|
432
|
-
var BEFOREALL = Symbol("beforeAll");
|
|
433
|
-
var BEFOREEACH = Symbol("beforeEach");
|
|
434
|
-
var AFTERALL = Symbol("afterAll");
|
|
435
|
-
var AFTEREACH = Symbol("afterEach");
|
|
436
446
|
var CodeTests = class _CodeTests {
|
|
437
447
|
static timeoutMS = 500;
|
|
438
448
|
static #expectInterval;
|
|
@@ -540,6 +550,15 @@ function assignClassAndIdToPart(shadowRoot) {
|
|
|
540
550
|
}
|
|
541
551
|
|
|
542
552
|
// src/code-tests.ts
|
|
553
|
+
var HookType = /* @__PURE__ */ ((HookType2) => {
|
|
554
|
+
HookType2["BeforeAll"] = "beforeall";
|
|
555
|
+
HookType2["AfterAll"] = "afterall";
|
|
556
|
+
HookType2["BeforeEach"] = "beforeeach";
|
|
557
|
+
HookType2["AfterEach"] = "aftereach";
|
|
558
|
+
HookType2["RequiredBeforeAny"] = "requiredbeforeany";
|
|
559
|
+
HookType2["RequiredAfterAny"] = "requiredafterany";
|
|
560
|
+
return HookType2;
|
|
561
|
+
})(HookType || {});
|
|
543
562
|
var CodeTestEventType = /* @__PURE__ */ ((CodeTestEventType2) => {
|
|
544
563
|
CodeTestEventType2["BeforeAll"] = "beforeall";
|
|
545
564
|
CodeTestEventType2["AfterAll"] = "afterall";
|
|
@@ -566,13 +585,7 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
566
585
|
findElement(id) {
|
|
567
586
|
return this.shadowRoot.getElementById(id);
|
|
568
587
|
}
|
|
569
|
-
#hooks =
|
|
570
|
-
#hookIds = {
|
|
571
|
-
[BEFOREALL]: generateId(),
|
|
572
|
-
[BEFOREEACH]: generateId(),
|
|
573
|
-
[AFTEREACH]: generateId(),
|
|
574
|
-
[AFTERALL]: generateId()
|
|
575
|
-
};
|
|
588
|
+
#hooks = {};
|
|
576
589
|
#continueRunningTests = true;
|
|
577
590
|
constructor() {
|
|
578
591
|
super();
|
|
@@ -587,7 +600,7 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
587
600
|
if (this.getAttribute("auto") == "false") {
|
|
588
601
|
return;
|
|
589
602
|
}
|
|
590
|
-
const testsPath = this
|
|
603
|
+
const testsPath = this.#getCurrentTestsPath();
|
|
591
604
|
if (testsPath == null) {
|
|
592
605
|
return;
|
|
593
606
|
}
|
|
@@ -657,82 +670,44 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
657
670
|
if (tests == void 0) {
|
|
658
671
|
throw new Error(`Unable to find tests definition in file at path: ${path}`);
|
|
659
672
|
}
|
|
660
|
-
const beforeAll = tests[
|
|
673
|
+
const beforeAll = tests["beforeall" /* BeforeAll */];
|
|
661
674
|
if (beforeAll != null) {
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
const map = /* @__PURE__ */ new Map();
|
|
665
|
-
map.set(beforeAll, /* @__PURE__ */ new Set());
|
|
666
|
-
this.#hooks.set(BEFOREALL, map);
|
|
667
|
-
}
|
|
675
|
+
this.#hooks["beforeall" /* BeforeAll */] = beforeAll;
|
|
676
|
+
delete tests["beforeall" /* BeforeAll */];
|
|
668
677
|
this.classList.add("has-before-hook");
|
|
669
678
|
}
|
|
670
|
-
const
|
|
671
|
-
if (beforeEach != null) {
|
|
672
|
-
const hookMap = this.#hooks.get(BEFOREEACH);
|
|
673
|
-
if (hookMap == null) {
|
|
674
|
-
const map = /* @__PURE__ */ new Map();
|
|
675
|
-
map.set(beforeEach, /* @__PURE__ */ new Set());
|
|
676
|
-
this.#hooks.set(BEFOREEACH, map);
|
|
677
|
-
}
|
|
678
|
-
}
|
|
679
|
-
const afterAll = tests[AFTERALL];
|
|
679
|
+
const afterAll = tests["afterall" /* AfterAll */];
|
|
680
680
|
if (afterAll != null) {
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
const map = /* @__PURE__ */ new Map();
|
|
684
|
-
map.set(afterAll, /* @__PURE__ */ new Set());
|
|
685
|
-
this.#hooks.set(AFTERALL, map);
|
|
686
|
-
}
|
|
681
|
+
this.#hooks["afterall" /* AfterAll */] = afterAll;
|
|
682
|
+
delete tests["afterall" /* AfterAll */];
|
|
687
683
|
this.classList.add("has-after-hook");
|
|
688
684
|
}
|
|
689
|
-
const
|
|
685
|
+
const beforeEach = tests["beforeeach" /* BeforeEach */];
|
|
686
|
+
if (beforeEach != null) {
|
|
687
|
+
this.#hooks["beforeeach" /* BeforeEach */] = beforeEach;
|
|
688
|
+
delete tests["beforeeach" /* BeforeEach */];
|
|
689
|
+
}
|
|
690
|
+
const afterEach = tests["aftereach" /* AfterEach */];
|
|
690
691
|
if (afterEach != null) {
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
692
|
+
this.#hooks["aftereach" /* AfterEach */] = afterEach;
|
|
693
|
+
delete tests["aftereach" /* AfterEach */];
|
|
694
|
+
}
|
|
695
|
+
const requiredBeforeAny = tests["requiredbeforeany" /* RequiredBeforeAny */];
|
|
696
|
+
if (requiredBeforeAny != null) {
|
|
697
|
+
this.#hooks["requiredbeforeany" /* RequiredBeforeAny */] = requiredBeforeAny;
|
|
698
|
+
delete tests["requiredbeforeany" /* RequiredBeforeAny */];
|
|
699
|
+
this.classList.add("has-required-before-hook");
|
|
700
|
+
this.part.add("has-required-before-hook");
|
|
701
|
+
}
|
|
702
|
+
const requiredAfterAny = tests["requiredafterany" /* RequiredAfterAny */];
|
|
703
|
+
if (requiredAfterAny != null) {
|
|
704
|
+
this.#hooks["requiredafterany" /* RequiredAfterAny */] = requiredAfterAny;
|
|
705
|
+
delete tests["requiredafterany" /* RequiredAfterAny */];
|
|
706
|
+
this.classList.add("has-required-after-hook");
|
|
707
|
+
this.part.add("has-required-after-hook");
|
|
697
708
|
}
|
|
698
709
|
for (const [description, test] of Object.entries(tests)) {
|
|
699
|
-
|
|
700
|
-
if (beforeAll != null) {
|
|
701
|
-
const hookMap = this.#hooks.get(BEFOREALL);
|
|
702
|
-
if (hookMap != null) {
|
|
703
|
-
const testIds = hookMap.get(beforeAll);
|
|
704
|
-
if (testIds != null) {
|
|
705
|
-
testIds.add(id);
|
|
706
|
-
}
|
|
707
|
-
}
|
|
708
|
-
}
|
|
709
|
-
if (beforeEach != null) {
|
|
710
|
-
const hookMap = this.#hooks.get(BEFOREEACH);
|
|
711
|
-
if (hookMap != null) {
|
|
712
|
-
const testIds = hookMap.get(beforeEach);
|
|
713
|
-
if (testIds != null) {
|
|
714
|
-
testIds.add(id);
|
|
715
|
-
}
|
|
716
|
-
}
|
|
717
|
-
}
|
|
718
|
-
if (afterAll != null) {
|
|
719
|
-
const hookMap = this.#hooks.get(AFTERALL);
|
|
720
|
-
if (hookMap != null) {
|
|
721
|
-
const testIds = hookMap.get(afterAll);
|
|
722
|
-
if (testIds != null) {
|
|
723
|
-
testIds.add(id);
|
|
724
|
-
}
|
|
725
|
-
}
|
|
726
|
-
}
|
|
727
|
-
if (afterEach != null) {
|
|
728
|
-
const hookMap = this.#hooks.get(AFTEREACH);
|
|
729
|
-
if (hookMap != null) {
|
|
730
|
-
const testIds = hookMap.get(afterEach);
|
|
731
|
-
if (testIds != null) {
|
|
732
|
-
testIds.add(id);
|
|
733
|
-
}
|
|
734
|
-
}
|
|
735
|
-
}
|
|
710
|
+
this.#addTest(description, test);
|
|
736
711
|
}
|
|
737
712
|
} catch (error) {
|
|
738
713
|
this.#addProcessError("An error occurred while loading the tasks:", error);
|
|
@@ -759,24 +734,49 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
759
734
|
}
|
|
760
735
|
this.#clearTestStatuses();
|
|
761
736
|
const inOrder = this.hasAttribute("in-order");
|
|
762
|
-
const
|
|
763
|
-
if (
|
|
737
|
+
const requiredBeforeHook = this.#hooks["requiredbeforeany" /* RequiredBeforeAny */];
|
|
738
|
+
if (requiredBeforeHook != null) {
|
|
739
|
+
let hookResult;
|
|
740
|
+
try {
|
|
741
|
+
const requiredBeforeAnyHookElement = this.getElement(`required-before-any-details`);
|
|
742
|
+
requiredBeforeAnyHookElement.classList.add("running");
|
|
743
|
+
requiredBeforeAnyHookElement.part.add("running");
|
|
744
|
+
if (this.isCanceled == true) {
|
|
745
|
+
throw new Error("Test has been cancelled");
|
|
746
|
+
}
|
|
747
|
+
hookResult = await requiredBeforeHook(this, requiredBeforeAnyHookElement);
|
|
748
|
+
this.#handleHookResult(hookResult, true, "before", true);
|
|
749
|
+
requiredBeforeAnyHookElement.part.remove("running");
|
|
750
|
+
requiredBeforeAnyHookElement.classList.remove("running");
|
|
751
|
+
} catch (error) {
|
|
752
|
+
this.#handleHookResult(hookResult, false, "before", true, error);
|
|
753
|
+
console.error(error);
|
|
754
|
+
this.#continueRunningTests = false;
|
|
755
|
+
this.classList.remove("running");
|
|
756
|
+
this.part.remove("running");
|
|
757
|
+
if (playButtonLabel != null) {
|
|
758
|
+
playButtonLabel.textContent = "Run Tests";
|
|
759
|
+
}
|
|
760
|
+
this.dispatchEvent(new CustomEvent("afterall" /* AfterAll */, { bubbles: true, composed: true }));
|
|
761
|
+
return;
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
const beforeHook = this.#hooks["beforeall" /* BeforeAll */];
|
|
765
|
+
if (beforeHook != null) {
|
|
764
766
|
let hookResult;
|
|
765
767
|
try {
|
|
766
768
|
const beforeAllHookElement = this.getElement(`before-all-details`);
|
|
767
769
|
beforeAllHookElement.classList.add("running");
|
|
768
770
|
beforeAllHookElement.part.add("running");
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
throw new Error("Test has been cancelled");
|
|
772
|
-
}
|
|
773
|
-
hookResult = await hook(this, beforeAllHookElement);
|
|
774
|
-
this.#handleHookResult(hookResult, true, "before");
|
|
771
|
+
if (this.isCanceled == true) {
|
|
772
|
+
throw new Error("Test has been cancelled");
|
|
775
773
|
}
|
|
774
|
+
hookResult = await beforeHook(this, beforeAllHookElement);
|
|
775
|
+
this.#handleHookResult(hookResult, true, "before", false);
|
|
776
776
|
beforeAllHookElement.part.remove("running");
|
|
777
777
|
beforeAllHookElement.classList.remove("running");
|
|
778
778
|
} catch (error) {
|
|
779
|
-
this.#handleHookResult(hookResult, false, "before", error);
|
|
779
|
+
this.#handleHookResult(hookResult, false, "before", false, error);
|
|
780
780
|
console.error(error);
|
|
781
781
|
this.#continueRunningTests = false;
|
|
782
782
|
this.classList.remove("running");
|
|
@@ -799,7 +799,7 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
799
799
|
if (this.#continueRunningTests == false) {
|
|
800
800
|
break;
|
|
801
801
|
}
|
|
802
|
-
await this.#runTest(id, test);
|
|
802
|
+
await this.#runTest(id, test, false);
|
|
803
803
|
}
|
|
804
804
|
}
|
|
805
805
|
if (this.#continueRunningTests == false) {
|
|
@@ -811,25 +811,42 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
811
811
|
this.dispatchEvent(new CustomEvent("afterall" /* AfterAll */, { bubbles: true, composed: true }));
|
|
812
812
|
return;
|
|
813
813
|
}
|
|
814
|
-
const
|
|
815
|
-
if (
|
|
814
|
+
const afterHook = this.#hooks["afterall" /* AfterAll */];
|
|
815
|
+
if (afterHook != null) {
|
|
816
816
|
let hookResult;
|
|
817
817
|
try {
|
|
818
818
|
const afterAllHookElement = this.getElement(`after-all-details`);
|
|
819
819
|
afterAllHookElement.classList.add("running");
|
|
820
820
|
afterAllHookElement.part.add("running");
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
throw new Error("Test has been cancelled");
|
|
824
|
-
}
|
|
825
|
-
hookResult = await hook(this, afterAllHookElement);
|
|
826
|
-
this.#handleHookResult(hookResult, true, "after");
|
|
821
|
+
if (this.isCanceled == true) {
|
|
822
|
+
throw new Error("Test has been cancelled");
|
|
827
823
|
}
|
|
824
|
+
hookResult = await afterHook(this, afterAllHookElement);
|
|
825
|
+
this.#handleHookResult(hookResult, true, "after", false);
|
|
828
826
|
afterAllHookElement.part.remove("running");
|
|
829
827
|
afterAllHookElement.classList.remove("running");
|
|
830
828
|
} catch (error) {
|
|
831
|
-
this.#handleHookResult(hookResult, false, "after", error);
|
|
829
|
+
this.#handleHookResult(hookResult, false, "after", false, error);
|
|
832
830
|
console.error(error);
|
|
831
|
+
const requiredAfterHook2 = this.#hooks["requiredafterany" /* RequiredAfterAny */];
|
|
832
|
+
if (requiredAfterHook2 != null) {
|
|
833
|
+
let hookResult2;
|
|
834
|
+
try {
|
|
835
|
+
const requiredAfterAnyHookElement = this.getElement(`required-after-any-details`);
|
|
836
|
+
requiredAfterAnyHookElement.classList.add("running");
|
|
837
|
+
requiredAfterAnyHookElement.part.add("running");
|
|
838
|
+
if (this.isCanceled == true) {
|
|
839
|
+
throw new Error("Test has been cancelled");
|
|
840
|
+
}
|
|
841
|
+
hookResult2 = await requiredAfterHook2(this, requiredAfterAnyHookElement);
|
|
842
|
+
this.#handleHookResult(hookResult2, true, "after", true);
|
|
843
|
+
requiredAfterAnyHookElement.part.remove("running");
|
|
844
|
+
requiredAfterAnyHookElement.classList.remove("running");
|
|
845
|
+
} catch (error2) {
|
|
846
|
+
this.#handleHookResult(hookResult2, false, "after", true, error2);
|
|
847
|
+
console.error(error2);
|
|
848
|
+
}
|
|
849
|
+
}
|
|
833
850
|
this.#continueRunningTests = false;
|
|
834
851
|
this.classList.remove("running");
|
|
835
852
|
this.part.remove("running");
|
|
@@ -840,6 +857,26 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
840
857
|
return;
|
|
841
858
|
}
|
|
842
859
|
}
|
|
860
|
+
const requiredAfterHook = this.#hooks["requiredafterany" /* RequiredAfterAny */];
|
|
861
|
+
if (requiredAfterHook != null) {
|
|
862
|
+
let hookResult;
|
|
863
|
+
try {
|
|
864
|
+
const requiredAfterAnyHookElement = this.getElement(`required-after-any-details`);
|
|
865
|
+
requiredAfterAnyHookElement.classList.add("running");
|
|
866
|
+
requiredAfterAnyHookElement.part.add("running");
|
|
867
|
+
if (this.isCanceled == true) {
|
|
868
|
+
throw new Error("Test has been cancelled");
|
|
869
|
+
}
|
|
870
|
+
hookResult = await requiredAfterHook(this, requiredAfterAnyHookElement);
|
|
871
|
+
this.#handleHookResult(hookResult, true, "after", true);
|
|
872
|
+
requiredAfterAnyHookElement.part.remove("running");
|
|
873
|
+
requiredAfterAnyHookElement.classList.remove("running");
|
|
874
|
+
} catch (error) {
|
|
875
|
+
this.#handleHookResult(hookResult, false, "after", true, error);
|
|
876
|
+
console.error(error);
|
|
877
|
+
this.#continueRunningTests = false;
|
|
878
|
+
}
|
|
879
|
+
}
|
|
843
880
|
const failedTests = this.shadowRoot.querySelectorAll('[success="false"]');
|
|
844
881
|
this.setAttribute("success", failedTests.length == 0 ? "true" : "false");
|
|
845
882
|
this.classList.remove("running");
|
|
@@ -869,7 +906,7 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
869
906
|
afterAllHookElement.classList.remove("success", "fail");
|
|
870
907
|
afterAllHookElement.part.remove("success", "fail");
|
|
871
908
|
}
|
|
872
|
-
async #runTest(testId, test) {
|
|
909
|
+
async #runTest(testId, test, handleRequiredTests = true) {
|
|
873
910
|
const testElement = this.getElement("tests").querySelector(`[data-test-id="${testId}"]`);
|
|
874
911
|
if (testElement == null) {
|
|
875
912
|
this.#addProcessError(`Unable to find test element for test: ${testId}`);
|
|
@@ -899,17 +936,38 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
899
936
|
let testType;
|
|
900
937
|
try {
|
|
901
938
|
const allowTest = this.dispatchEvent(new CustomEvent("beforetest" /* BeforeTest */, { bubbles: true, cancelable: true, composed: true, detail: { testElement } }));
|
|
939
|
+
if (handleRequiredTests == true) {
|
|
940
|
+
const requiredBeforeHook = this.#hooks["requiredbeforeany" /* RequiredBeforeAny */];
|
|
941
|
+
if (requiredBeforeHook != null) {
|
|
942
|
+
let hookResult;
|
|
943
|
+
try {
|
|
944
|
+
const requiredBeforeAnyHookElement = this.getElement(`required-before-any-details`);
|
|
945
|
+
requiredBeforeAnyHookElement.classList.add("running");
|
|
946
|
+
requiredBeforeAnyHookElement.part.add("running");
|
|
947
|
+
if (this.isCanceled == true) {
|
|
948
|
+
throw new Error("Test has been cancelled");
|
|
949
|
+
}
|
|
950
|
+
hookResult = await requiredBeforeHook(this, requiredBeforeAnyHookElement);
|
|
951
|
+
this.#handleHookResult(hookResult, true, "before", true);
|
|
952
|
+
requiredBeforeAnyHookElement.part.remove("running");
|
|
953
|
+
requiredBeforeAnyHookElement.classList.remove("running");
|
|
954
|
+
} catch (error) {
|
|
955
|
+
this.#handleHookResult(hookResult, true, "before", true, error);
|
|
956
|
+
console.error(error);
|
|
957
|
+
this.#continueRunningTests = false;
|
|
958
|
+
return;
|
|
959
|
+
}
|
|
960
|
+
}
|
|
961
|
+
}
|
|
962
|
+
if (this.#continueRunningTests == false) {
|
|
963
|
+
throw new Error("Tests have been disabled from continuing to run.");
|
|
964
|
+
}
|
|
902
965
|
if (allowTest == false || this.isCanceled == true) {
|
|
903
966
|
throw new Error("Test has been cancelled");
|
|
904
967
|
}
|
|
905
|
-
const
|
|
906
|
-
if (
|
|
907
|
-
|
|
908
|
-
if (ids.has(testId)) {
|
|
909
|
-
beforeResult = await hook(this, testElement);
|
|
910
|
-
break;
|
|
911
|
-
}
|
|
912
|
-
}
|
|
968
|
+
const beforeHook = this.#hooks["beforeeach" /* BeforeEach */];
|
|
969
|
+
if (beforeHook != null) {
|
|
970
|
+
beforeResult = await beforeHook(this, testElement);
|
|
913
971
|
}
|
|
914
972
|
if (this.isCanceled == true) {
|
|
915
973
|
throw new Error("Test has been cancelled");
|
|
@@ -918,12 +976,30 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
918
976
|
if (this.isCanceled == true) {
|
|
919
977
|
throw new Error("Test has been cancelled");
|
|
920
978
|
}
|
|
921
|
-
const
|
|
922
|
-
if (
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
979
|
+
const afterHook = this.#hooks["aftereach" /* AfterEach */];
|
|
980
|
+
if (afterHook != null) {
|
|
981
|
+
afterResult = await afterHook(this, testElement);
|
|
982
|
+
}
|
|
983
|
+
if (handleRequiredTests == true) {
|
|
984
|
+
const requiredAfterHook = this.#hooks["requiredafterany" /* RequiredAfterAny */];
|
|
985
|
+
if (requiredAfterHook != null) {
|
|
986
|
+
let hookResult;
|
|
987
|
+
try {
|
|
988
|
+
const requiredBeforeAnyHookElement = this.getElement(`required-before-any-details`);
|
|
989
|
+
requiredBeforeAnyHookElement.classList.add("running");
|
|
990
|
+
requiredBeforeAnyHookElement.part.add("running");
|
|
991
|
+
if (this.isCanceled == true) {
|
|
992
|
+
throw new Error("Test has been cancelled");
|
|
993
|
+
}
|
|
994
|
+
hookResult = await requiredAfterHook(this, requiredBeforeAnyHookElement);
|
|
995
|
+
this.#handleHookResult(hookResult, true, "after", true);
|
|
996
|
+
requiredBeforeAnyHookElement.part.remove("running");
|
|
997
|
+
requiredBeforeAnyHookElement.classList.remove("running");
|
|
998
|
+
} catch (error) {
|
|
999
|
+
this.#handleHookResult(hookResult, true, "after", true, error);
|
|
1000
|
+
console.error(error);
|
|
1001
|
+
this.#continueRunningTests = false;
|
|
1002
|
+
return;
|
|
927
1003
|
}
|
|
928
1004
|
}
|
|
929
1005
|
}
|
|
@@ -981,19 +1057,19 @@ Result:${objectResult.value}`,
|
|
|
981
1057
|
detailsElement.open = true;
|
|
982
1058
|
}
|
|
983
1059
|
}
|
|
984
|
-
#handleHookResult(result, finishedTest, beforeOrAfter, error) {
|
|
1060
|
+
#handleHookResult(result, finishedTest, beforeOrAfter, required, error) {
|
|
985
1061
|
if (result instanceof HTMLElement) {
|
|
986
|
-
this.#setHookResult(result, finishedTest, beforeOrAfter);
|
|
1062
|
+
this.#setHookResult(result, finishedTest, beforeOrAfter, required);
|
|
987
1063
|
} else {
|
|
988
1064
|
let defaultResult;
|
|
989
1065
|
if (result == void 0) {
|
|
990
1066
|
defaultResult = this.#createDefaultResult(finishedTest == true ? "Hook Ran Successfully" : `Failed${error != null ? `:
|
|
991
1067
|
${error.message}` : ""}`, finishedTest);
|
|
992
|
-
this.#setHookResult(defaultResult, finishedTest, beforeOrAfter);
|
|
1068
|
+
this.#setHookResult(defaultResult, finishedTest, beforeOrAfter, required);
|
|
993
1069
|
} else if (typeof result == "string") {
|
|
994
1070
|
defaultResult = this.#createDefaultResult(`${result}${error == null ? "" : `:
|
|
995
1071
|
${error.message}`}`, finishedTest);
|
|
996
|
-
this.#setHookResult(defaultResult, finishedTest, beforeOrAfter);
|
|
1072
|
+
this.#setHookResult(defaultResult, finishedTest, beforeOrAfter, required);
|
|
997
1073
|
} else if (typeof result == "object") {
|
|
998
1074
|
const objectResult = result;
|
|
999
1075
|
if (objectResult.success != void 0 && objectResult.expected != void 0 && objectResult.value != void 0) {
|
|
@@ -1003,7 +1079,7 @@ Expected:${objectResult.expected}
|
|
|
1003
1079
|
Result:${objectResult.value}`,
|
|
1004
1080
|
objectResult.success
|
|
1005
1081
|
);
|
|
1006
|
-
this.#setHookResult(defaultResult, finishedTest, beforeOrAfter);
|
|
1082
|
+
this.#setHookResult(defaultResult, finishedTest, beforeOrAfter, required);
|
|
1007
1083
|
}
|
|
1008
1084
|
}
|
|
1009
1085
|
}
|
|
@@ -1096,9 +1172,10 @@ Result:${objectResult.value}`,
|
|
|
1096
1172
|
codeElement.appendChild(preElement);
|
|
1097
1173
|
return codeElement;
|
|
1098
1174
|
}
|
|
1099
|
-
#setHookResult(valueElement, success, beforeOrAfter) {
|
|
1100
|
-
const
|
|
1101
|
-
const
|
|
1175
|
+
#setHookResult(valueElement, success, beforeOrAfter, required) {
|
|
1176
|
+
const selector = required == true ? `required-${beforeOrAfter}-any` : `${beforeOrAfter}-all`;
|
|
1177
|
+
const detailsElement = this.getElement(`${selector}-details`);
|
|
1178
|
+
const resultsElement = this.getElement(`${selector}-results`);
|
|
1102
1179
|
detailsElement.setAttribute("success", success == true ? "true" : "false");
|
|
1103
1180
|
detailsElement.classList.toggle("success", success);
|
|
1104
1181
|
detailsElement.part.toggle("success", success);
|
|
@@ -1178,13 +1255,10 @@ if (customElements.get(COMPONENT_TAG_NAME) == null) {
|
|
|
1178
1255
|
customElements.define(COMPONENT_TAG_NAME, CodeTestsElement);
|
|
1179
1256
|
}
|
|
1180
1257
|
export {
|
|
1181
|
-
AFTERALL,
|
|
1182
|
-
AFTEREACH,
|
|
1183
|
-
BEFOREALL,
|
|
1184
|
-
BEFOREEACH,
|
|
1185
1258
|
CodeTestEventType,
|
|
1186
1259
|
CodeTests,
|
|
1187
1260
|
CodeTestsElement,
|
|
1261
|
+
HookType,
|
|
1188
1262
|
expect,
|
|
1189
1263
|
prompt
|
|
1190
1264
|
};
|
package/dist/code-tests.min.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var
|
|
1
|
+
var w=`:host
|
|
2
2
|
{
|
|
3
3
|
/*** gray ***/
|
|
4
4
|
--uchu-light-gray-raw: 95.57% 0.003 286.35;
|
|
@@ -128,10 +128,24 @@ var S=`:host
|
|
|
128
128
|
display: none;
|
|
129
129
|
}
|
|
130
130
|
:host(.has-before-hook) #before-all-details
|
|
131
|
-
,:host(.has-
|
|
131
|
+
,:host(.has-after-hook) #after-all-details
|
|
132
132
|
{
|
|
133
133
|
display: initial;
|
|
134
134
|
}
|
|
135
|
+
:host(.has-required-before-hook) #required-before-any-details
|
|
136
|
+
,:host(.has-required-after-hook) #required-after-any-details
|
|
137
|
+
{
|
|
138
|
+
display: initial;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
#required-before-any-summary
|
|
142
|
+
,#required-after-any-summary
|
|
143
|
+
{
|
|
144
|
+
background: var(--surface-process);
|
|
145
|
+
color: var(--text-process);
|
|
146
|
+
border: solid 1px var(--text-process);
|
|
147
|
+
grid-template-columns: auto auto 1fr;
|
|
148
|
+
}
|
|
135
149
|
|
|
136
150
|
#tests
|
|
137
151
|
{
|
|
@@ -393,7 +407,7 @@ pre
|
|
|
393
407
|
{
|
|
394
408
|
from { transform: rotate(0deg); }
|
|
395
409
|
to { transform: rotate(360deg); }
|
|
396
|
-
}`;var
|
|
410
|
+
}`;var x=`<slot name="header">
|
|
397
411
|
<header id="header">
|
|
398
412
|
<span id="title"><slot name="title"><span id="title-text">Tests</span></slot></span>
|
|
399
413
|
<slot name="play-button">
|
|
@@ -406,6 +420,13 @@ pre
|
|
|
406
420
|
<slot name="details"></slot>
|
|
407
421
|
</header>
|
|
408
422
|
</slot>
|
|
423
|
+
<details id="required-before-any-details" class="hook">
|
|
424
|
+
<summary id="required-before-any-summary">
|
|
425
|
+
<span id="required-before-any-result-icon" class="result-icon"></span>
|
|
426
|
+
<span id="required-before-any-description" class="description">Results from Required Before Any Hook</span>
|
|
427
|
+
</summary>
|
|
428
|
+
<div id="required-before-any-results" class="results"></div>
|
|
429
|
+
</details>
|
|
409
430
|
<details id="before-all-details" class="hook">
|
|
410
431
|
<summary id="before-all-summary">
|
|
411
432
|
<span id="before-all-result-icon" class="result-icon"></span>
|
|
@@ -421,6 +442,13 @@ pre
|
|
|
421
442
|
</summary>
|
|
422
443
|
<div id="after-all-results" class="results"></div>
|
|
423
444
|
</details>
|
|
445
|
+
<details id="required-after-any-details" class="hook">
|
|
446
|
+
<summary id="required-after-any-summary">
|
|
447
|
+
<span id="required-after-any-result-icon" class="result-icon"></span>
|
|
448
|
+
<span id="required-after-any-description" class="description">Results from Required After Any Hook</span>
|
|
449
|
+
</summary>
|
|
450
|
+
<div id="required-after-any-results" class="results"></div>
|
|
451
|
+
</details>
|
|
424
452
|
|
|
425
453
|
<template id="prompt-template">
|
|
426
454
|
<div class="prompt" part="prompt">
|
|
@@ -433,15 +461,15 @@ pre
|
|
|
433
461
|
<button class="prompt-button reject" type="button">Reject</button>
|
|
434
462
|
</div>
|
|
435
463
|
</div>
|
|
436
|
-
</template>`;var
|
|
437
|
-
Expected: ${
|
|
438
|
-
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")}},v=Symbol("beforeAll"),y=Symbol("beforeEach"),k=Symbol("afterAll"),x=Symbol("afterEach"),L=class d{static timeoutMS=500;static#e;static#p;static expect(t){return new T(async(e,r)=>{if(t instanceof Promise){let n=await t;e(n);return}e(t)})}static expectSync(t){return new T(async(e,r)=>{if(t instanceof Promise){let n=await t;e(n);return}e(t)})}static expectBefore(t){return new T(async(e,r)=>{if(t instanceof Promise){let n=await t;e(n);return}e(t)})}static async prompt(t,s,e,r){return new Promise((n,o)=>{let a=t.findElement("prompt-template"),l=d.createElementFromTemplate(a);l.querySelector(".label").textContent=e;let c=h=>{let f=h.composedPath();if(f.find(i=>i instanceof HTMLButtonElement&&i.classList.contains("accept"))!=null){let i=r?.onAccept?.()??!0;l.removeEventListener("click",c),n(i);return}if(f.find(i=>i instanceof HTMLButtonElement&&i.classList.contains("reject"))!=null){let i=r?.onReject?.()??!1;l.removeEventListener("click",c),n(i);return}};l.addEventListener("click",c),r?.acceptLabel!=null&&(l.querySelector(".accept").textContent=r.acceptLabel),r?.rejectLabel!=null&&(l.querySelector(".reject").textContent=r.rejectLabel);let u=s instanceof HTMLDetailsElement?s:s.querySelector(".test-details");u!=null&&(u.open=!0),s.querySelector(".result")?.append(l)})}static createElementFromTemplate(t,s){let e=t instanceof HTMLTemplateElement?t:document.querySelector(t);if(e==null)throw new Error(`Unable to find template element from selector: ${t}`);let r=e.content.cloneNode(!0).querySelector("*");if(r==null)throw new Error("Unable to find first child of template element");return s?.append(r),r}};function I(d){return L.expect(d)}function U(d,t,s,e){return L.prompt(d,t,s,e)}var $=":not(slot,defs,g,rect,path,circle,ellipse,line,polygon,text,tspan,use,svg image,svg title,desc,template,template *)";function P(d){let t=[...d.querySelectorAll(`${$}[id]`)];for(let e=0;e<t.length;e++)t[e].part.add(t[e].id);let s=[...d.querySelectorAll(`${$}[class]`)];for(let e=0;e<s.length;e++)s[e].part.add(...s[e].classList)}var z=(n=>(n.BeforeAll="beforeall",n.AfterAll="afterall",n.BeforeTest="beforetest",n.AfterTest="aftertest",n.Cancel="cancel",n))(z||{}),H=Symbol("No Test Defined"),D=new CSSStyleSheet;D.replaceSync(S);var B="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={[v]:C(),[y]:C(),[x]:C(),[k]:C()};#t=!0;constructor(){super(),this.attachShadow({mode:"open"}),this.shadowRoot.innerHTML=F,this.shadowRoot.adoptedStyleSheets.push(D),this.#c=this.#h.bind(this)}connectedCallback(){if(P(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(o=>o instanceof HTMLButtonElement&&o.classList.contains("run"));if(s==null)return;let e=s.closest("li");if(e==null){if(s.hasAttribute("data-all")==!0)if(this.classList.contains("running")){if(this.classList.contains("canceled"))return;this.cancel()}else this.runTests();return}let r=e.dataset.testId;if(r==null)return;let n=this.#s.get(r);n!=null&&(this.isCanceled=!1,this.classList.remove("canceled"),this.part.remove("canceled"),this.#u(r,n))}#f(){return this.getAttribute("src")??this.getAttribute("test")??this.getAttribute("tests")??this.getAttribute("run")??this.getAttribute("path")}async loadTests(t){let s=t??this.#f();if(s!=null)try{this.getElement("tests").innerHTML="",this.#s.clear(),this.classList.remove("has-before-hook"),this.classList.remove("has-after-hook");let e=window.location.href.lastIndexOf("/"),n=window.location.href.substring(e).indexOf(".")!=-1==!0?window.location.href.substring(0,e+1):window.location.href,o=n+s.substring(0,s.lastIndexOf("/")+1),a=n+s,l=await(await fetch(a)).text();l=l.replaceAll(/['"`](((\.\/)|(\.\.\/))+(.*))['"`]/g,`'${o}$1'`);let c=new File([l],s.substring(s.lastIndexOf("/")),{type:"text/javascript"}),h=await import(URL.createObjectURL(c)),f=h.tests??h.default;if(f==null)throw new Error(`Unable to find tests definition in file at path: ${s}`);let E=f[v];if(E!=null){if(this.#e.get(v)==null){let p=new Map;p.set(E,new Set),this.#e.set(v,p)}this.classList.add("has-before-hook")}let b=f[y];if(b!=null&&this.#e.get(y)==null){let p=new Map;p.set(b,new Set),this.#e.set(y,p)}let i=f[k];if(i!=null){if(this.#e.get(k)==null){let p=new Map;p.set(i,new Set),this.#e.set(k,p)}this.classList.add("has-after-hook")}let A=f[x];if(A!=null&&this.#e.get(x)==null){let p=new Map;p.set(A,new Set),this.#e.set(x,p)}for(let[w,p]of Object.entries(f)){let M=this.#g(w,p);if(E!=null){let m=this.#e.get(v);if(m!=null){let g=m.get(E);g?.add(M)}}if(b!=null){let m=this.#e.get(y);if(m!=null){let g=m.get(b);g?.add(M)}}if(i!=null){let m=this.#e.get(k);if(m!=null){let g=m.get(i);g?.add(M)}}if(A!=null){let m=this.#e.get(x);if(m!=null){let g=m.get(A);g?.add(M)}}}}catch(e){this.#i("An error occurred while loading the tasks:",e)}}isCanceled=!1;cancel(){this.isCanceled=!0,this.classList.add("canceled"),this.part.add("canceled"),this.dispatchEvent(new CustomEvent("cancel",{bubbles:!0,composed:!0}))}async runTests(){this.dispatchEvent(new CustomEvent("beforeall",{bubbles:!0,composed:!0})),this.#t=!0,this.classList.add("running"),this.isCanceled=!1,this.classList.remove("canceled"),this.part.remove("canceled"),this.toggleAttribute("success",!1);let t=this.findElement("play-button-label");t!=null&&(t.textContent="Cancel"),this.#m();let s=this.hasAttribute("in-order"),e=this.#e.get(v);if(e!=null){let o;try{let a=this.getElement("before-all-details");a.classList.add("running"),a.part.add("running");for(let[l,c]of e){if(this.isCanceled==!0)throw new Error("Test has been cancelled");o=await l(this,a),this.#a(o,!0,"before")}a.part.remove("running"),a.classList.remove("running")}catch(a){this.#a(o,!1,"before",a),console.error(a),this.#t=!1,this.classList.remove("running"),this.part.remove("running"),t!=null&&(t.textContent="Run Tests"),this.dispatchEvent(new CustomEvent("afterall",{bubbles:!0,composed:!0}));return}}if(s==!1){let o=[];for(let[a,l]of this.#s)o.push(this.#u(a,l));await Promise.all(o)}else for(let[o,a]of this.#s){if(this.#t==!1)break;await this.#u(o,a)}if(this.#t==!1){this.classList.remove("running"),this.part.remove("running"),t!=null&&(t.textContent="Run Tests"),this.dispatchEvent(new CustomEvent("afterall",{bubbles:!0,composed:!0}));return}let r=this.#e.get(k);if(r!=null){let o;try{let a=this.getElement("after-all-details");a.classList.add("running"),a.part.add("running");for(let[l,c]of r){if(this.isCanceled==!0)throw new Error("Test has been cancelled");o=await l(this,a),this.#a(o,!0,"after")}a.part.remove("running"),a.classList.remove("running")}catch(a){this.#a(o,!1,"after",a),console.error(a),this.#t=!1,this.classList.remove("running"),this.part.remove("running"),t!=null&&(t.textContent="Run Tests"),this.dispatchEvent(new CustomEvent("afterall",{bubbles:!0,composed:!0}));return}}let n=this.shadowRoot.querySelectorAll('[success="false"]');this.setAttribute("success",n.length==0?"true":"false"),this.classList.remove("running"),this.part.remove("running"),t!=null&&(t.textContent="Run Tests"),this.dispatchEvent(new CustomEvent("afterall",{bubbles:!0,composed:!0}))}#m(){for(let[e,r]of this.#s){let n=this.getElement("tests").querySelector(`[data-test-id="${e}"]`);if(n==null){this.#i(`Unable to find test element for test: ${e}`);return}n.toggleAttribute("success",!1),n.classList.remove("success","fail"),n.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 n=e.querySelector(".error-message");n!=null&&(n.textContent="");let o=e.querySelector("details");o!=null&&(o.open=!1);let a=H,l,c=H,u;try{if(this.dispatchEvent(new CustomEvent("beforetest",{bubbles:!0,cancelable:!0,composed:!0,detail:{testElement:e}}))==!1||this.isCanceled==!0)throw new Error("Test has been cancelled");let f=this.#e.get(y);if(f!=null){for(let[b,i]of f)if(i.has(t)){a=await b(this,e);break}}if(this.isCanceled==!0)throw new Error("Test has been cancelled");if(l=await s(this,e),this.isCanceled==!0)throw new Error("Test has been cancelled");let E=this.#e.get(x);if(E!=null){for(let[b,i]of E)if(i.has(t)){c=await b(this,e);break}}u="before",a!=H&&this.#n(e,a,!0,void 0,u),u=void 0,this.#n(e,l,!0,void 0,u),u="after",c!=H&&this.#n(e,c,!0,void 0,u)}catch(h){this.#n(e,l,!1,h,u),console.error(h),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}}))}}#n(t,s,e,r,n){if(s instanceof HTMLElement)this.#o(t,s,e,n);else if(s==null){let a=n==null?"Passed":"Hook Ran Successfully",l=this.#r(e==!0?`${a}`:`Failed${r!=null?`:
|
|
439
|
-
${
|
|
440
|
-
${
|
|
441
|
-
Expected:${
|
|
442
|
-
Result:${
|
|
443
|
-
${
|
|
444
|
-
${
|
|
445
|
-
Expected:${
|
|
446
|
-
Result:${
|
|
447
|
-
${
|
|
464
|
+
</template>`;var y=class extends Promise{async toBeDefined(e){if(await this==null)throw new Error(`${e??"Value"} is undefined`)}async toBe(e,r=!1){let t=await this;if((r==!0?t===e:t==e)==!1)throw new Error(` Value is not equal.
|
|
465
|
+
Expected: ${e}
|
|
466
|
+
Result: ${t}`)}async toContainText(e){let r=await this}async toHaveAttribute(e){let r=await this;if(!(r instanceof HTMLElement))throw new Error("Unable to check for attribute on non-HTMLElement target");if(r.getAttribute(e))throw new Error("Taret does not have attribute")}},E=class f{static timeoutMS=500;static#e;static#r;static expect(e){return new y(async(t,s)=>{if(e instanceof Promise){let n=await e;t(n);return}t(e)})}static expectSync(e){return new y(async(t,s)=>{if(e instanceof Promise){let n=await e;t(n);return}t(e)})}static expectBefore(e){return new y(async(t,s)=>{if(e instanceof Promise){let n=await e;t(n);return}t(e)})}static async prompt(e,r,t,s){return new Promise((n,l)=>{let i=e.findElement("prompt-template"),o=f.createElementFromTemplate(i);o.querySelector(".label").textContent=t;let a=u=>{let c=u.composedPath();if(c.find(h=>h instanceof HTMLButtonElement&&h.classList.contains("accept"))!=null){let h=s?.onAccept?.()??!0;o.removeEventListener("click",a),n(h);return}if(c.find(h=>h instanceof HTMLButtonElement&&h.classList.contains("reject"))!=null){let h=s?.onReject?.()??!1;o.removeEventListener("click",a),n(h);return}};o.addEventListener("click",a),s?.acceptLabel!=null&&(o.querySelector(".accept").textContent=s.acceptLabel),s?.rejectLabel!=null&&(o.querySelector(".reject").textContent=s.rejectLabel);let p=r instanceof HTMLDetailsElement?r:r.querySelector(".test-details");p!=null&&(p.open=!0),r.querySelector(".result")?.append(o)})}static createElementFromTemplate(e,r){let t=e instanceof HTMLTemplateElement?e:document.querySelector(e);if(t==null)throw new Error(`Unable to find template element from selector: ${e}`);let s=t.content.cloneNode(!0).querySelector("*");if(s==null)throw new Error("Unable to find first child of template element");return r?.append(s),s}};function S(f){return E.expect(f)}function $(f,e,r,t){return E.prompt(f,e,r,t)}var A=":not(slot,defs,g,rect,path,circle,ellipse,line,polygon,text,tspan,use,svg image,svg title,desc,template,template *)";function L(f){let e=[...f.querySelectorAll(`${A}[id]`)];for(let t=0;t<e.length;t++)e[t].part.add(e[t].id);let r=[...f.querySelectorAll(`${A}[class]`)];for(let t=0;t<r.length;t++)r[t].part.add(...r[t].classList)}var P=(l=>(l.BeforeAll="beforeall",l.AfterAll="afterall",l.BeforeEach="beforeeach",l.AfterEach="aftereach",l.RequiredBeforeAny="requiredbeforeany",l.RequiredAfterAny="requiredafterany",l))(P||{}),F=(n=>(n.BeforeAll="beforeall",n.AfterAll="afterall",n.BeforeTest="beforetest",n.AfterTest="aftertest",n.Cancel="cancel",n))(F||{}),v=Symbol("No Test Defined"),H=new CSSStyleSheet;H.replaceSync(w);var C="code-tests",k=class extends HTMLElement{componentParts=new Map;getElement(e){if(this.componentParts.get(e)==null){let r=this.findElement(e);r!=null&&this.componentParts.set(e,r)}return this.componentParts.get(e)}findElement(e){return this.shadowRoot.getElementById(e)}#e={};#r=!0;constructor(){super(),this.attachShadow({mode:"open"}),this.shadowRoot.innerHTML=x,this.shadowRoot.adoptedStyleSheets.push(H),this.#c=this.#h.bind(this)}connectedCallback(){if(L(this.shadowRoot),this.addEventListener("click",this.#c),this.getAttribute("auto")=="false")return;let e=this.#d();e!=null&&this.loadTests(e)}disconnectedCallback(){this.removeEventListener("click",this.#c)}#c;#h(e){let r=e.composedPath().find(l=>l instanceof HTMLButtonElement&&l.classList.contains("run"));if(r==null)return;let t=r.closest("li");if(t==null){if(r.hasAttribute("data-all")==!0)if(this.classList.contains("running")){if(this.classList.contains("canceled"))return;this.cancel()}else this.runTests();return}let s=t.dataset.testId;if(s==null)return;let n=this.#s.get(s);n!=null&&(this.isCanceled=!1,this.classList.remove("canceled"),this.part.remove("canceled"),this.#u(s,n))}#d(){return this.getAttribute("src")??this.getAttribute("test")??this.getAttribute("tests")??this.getAttribute("run")??this.getAttribute("path")}async loadTests(e){let r=e??this.#d();if(r!=null)try{this.getElement("tests").innerHTML="",this.#s.clear(),this.classList.remove("has-before-hook"),this.classList.remove("has-after-hook");let t=window.location.href.lastIndexOf("/"),n=window.location.href.substring(t).indexOf(".")!=-1==!0?window.location.href.substring(0,t+1):window.location.href,l=n+r.substring(0,r.lastIndexOf("/")+1),i=n+r,o=await(await fetch(i)).text();o=o.replaceAll(/['"`](((\.\/)|(\.\.\/))+(.*))['"`]/g,`'${l}$1'`);let a=new File([o],r.substring(r.lastIndexOf("/")),{type:"text/javascript"}),u=await import(URL.createObjectURL(a)),c=u.tests??u.default;if(c==null)throw new Error(`Unable to find tests definition in file at path: ${r}`);let g=c.beforeall;g!=null&&(this.#e.beforeall=g,delete c.beforeall,this.classList.add("has-before-hook"));let b=c.afterall;b!=null&&(this.#e.afterall=b,delete c.afterall,this.classList.add("has-after-hook"));let h=c.beforeeach;h!=null&&(this.#e.beforeeach=h,delete c.beforeeach);let m=c.aftereach;m!=null&&(this.#e.aftereach=m,delete c.aftereach);let d=c.requiredbeforeany;d!=null&&(this.#e.requiredbeforeany=d,delete c.requiredbeforeany,this.classList.add("has-required-before-hook"),this.part.add("has-required-before-hook"));let T=c.requiredafterany;T!=null&&(this.#e.requiredafterany=T,delete c.requiredafterany,this.classList.add("has-required-after-hook"),this.part.add("has-required-after-hook"));for(let[q,R]of Object.entries(c))this.#m(q,R)}catch(t){this.#i("An error occurred while loading the tasks:",t)}}isCanceled=!1;cancel(){this.isCanceled=!0,this.classList.add("canceled"),this.part.add("canceled"),this.dispatchEvent(new CustomEvent("cancel",{bubbles:!0,composed:!0}))}async runTests(){this.dispatchEvent(new CustomEvent("beforeall",{bubbles:!0,composed:!0})),this.#r=!0,this.classList.add("running"),this.isCanceled=!1,this.classList.remove("canceled"),this.part.remove("canceled"),this.toggleAttribute("success",!1);let e=this.findElement("play-button-label");e!=null&&(e.textContent="Cancel"),this.#f();let r=this.hasAttribute("in-order"),t=this.#e.requiredbeforeany;if(t!=null){let o;try{let a=this.getElement("required-before-any-details");if(a.classList.add("running"),a.part.add("running"),this.isCanceled==!0)throw new Error("Test has been cancelled");o=await t(this,a),this.#t(o,!0,"before",!0),a.part.remove("running"),a.classList.remove("running")}catch(a){this.#t(o,!1,"before",!0,a),console.error(a),this.#r=!1,this.classList.remove("running"),this.part.remove("running"),e!=null&&(e.textContent="Run Tests"),this.dispatchEvent(new CustomEvent("afterall",{bubbles:!0,composed:!0}));return}}let s=this.#e.beforeall;if(s!=null){let o;try{let a=this.getElement("before-all-details");if(a.classList.add("running"),a.part.add("running"),this.isCanceled==!0)throw new Error("Test has been cancelled");o=await s(this,a),this.#t(o,!0,"before",!1),a.part.remove("running"),a.classList.remove("running")}catch(a){this.#t(o,!1,"before",!1,a),console.error(a),this.#r=!1,this.classList.remove("running"),this.part.remove("running"),e!=null&&(e.textContent="Run Tests"),this.dispatchEvent(new CustomEvent("afterall",{bubbles:!0,composed:!0}));return}}if(r==!1){let o=[];for(let[a,p]of this.#s)o.push(this.#u(a,p));await Promise.all(o)}else for(let[o,a]of this.#s){if(this.#r==!1)break;await this.#u(o,a,!1)}if(this.#r==!1){this.classList.remove("running"),this.part.remove("running"),e!=null&&(e.textContent="Run Tests"),this.dispatchEvent(new CustomEvent("afterall",{bubbles:!0,composed:!0}));return}let n=this.#e.afterall;if(n!=null){let o;try{let a=this.getElement("after-all-details");if(a.classList.add("running"),a.part.add("running"),this.isCanceled==!0)throw new Error("Test has been cancelled");o=await n(this,a),this.#t(o,!0,"after",!1),a.part.remove("running"),a.classList.remove("running")}catch(a){this.#t(o,!1,"after",!1,a),console.error(a);let p=this.#e.requiredafterany;if(p!=null){let u;try{let c=this.getElement("required-after-any-details");if(c.classList.add("running"),c.part.add("running"),this.isCanceled==!0)throw new Error("Test has been cancelled");u=await p(this,c),this.#t(u,!0,"after",!0),c.part.remove("running"),c.classList.remove("running")}catch(c){this.#t(u,!1,"after",!0,c),console.error(c)}}this.#r=!1,this.classList.remove("running"),this.part.remove("running"),e!=null&&(e.textContent="Run Tests"),this.dispatchEvent(new CustomEvent("afterall",{bubbles:!0,composed:!0}));return}}let l=this.#e.requiredafterany;if(l!=null){let o;try{let a=this.getElement("required-after-any-details");if(a.classList.add("running"),a.part.add("running"),this.isCanceled==!0)throw new Error("Test has been cancelled");o=await l(this,a),this.#t(o,!0,"after",!0),a.part.remove("running"),a.classList.remove("running")}catch(a){this.#t(o,!1,"after",!0,a),console.error(a),this.#r=!1}}let i=this.shadowRoot.querySelectorAll('[success="false"]');this.setAttribute("success",i.length==0?"true":"false"),this.classList.remove("running"),this.part.remove("running"),e!=null&&(e.textContent="Run Tests"),this.dispatchEvent(new CustomEvent("afterall",{bubbles:!0,composed:!0}))}#f(){for(let[t,s]of this.#s){let n=this.getElement("tests").querySelector(`[data-test-id="${t}"]`);if(n==null){this.#i(`Unable to find test element for test: ${t}`);return}n.toggleAttribute("success",!1),n.classList.remove("success","fail"),n.part.remove("success","fail")}let e=this.getElement("before-all-details");e.toggleAttribute("success",!1),e.classList.remove("success","fail"),e.part.remove("success","fail");let r=this.getElement("after-all-details");r.toggleAttribute("success",!1),r.classList.remove("success","fail"),r.part.remove("success","fail")}async#u(e,r,t=!0){let s=this.getElement("tests").querySelector(`[data-test-id="${e}"]`);if(s==null){this.#i(`Unable to find test element for test: ${e}`);return}s.toggleAttribute("success",!1),s.classList.add("running"),s.part.add("running"),s.classList.remove("success","fail"),s.part.remove("success","fail");let n=s.querySelector(".result-icon");n?.classList.remove("success","fail"),n?.part.remove("success","fail"),n?.classList.add("running"),n?.part.add("running");let l=s.querySelector(".error-message");l!=null&&(l.textContent="");let i=s.querySelector("details");i!=null&&(i.open=!1);let o=v,a,p=v,u;try{let c=this.dispatchEvent(new CustomEvent("beforetest",{bubbles:!0,cancelable:!0,composed:!0,detail:{testElement:s}}));if(t==!0){let h=this.#e.requiredbeforeany;if(h!=null){let m;try{let d=this.getElement("required-before-any-details");if(d.classList.add("running"),d.part.add("running"),this.isCanceled==!0)throw new Error("Test has been cancelled");m=await h(this,d),this.#t(m,!0,"before",!0),d.part.remove("running"),d.classList.remove("running")}catch(d){this.#t(m,!0,"before",!0,d),console.error(d),this.#r=!1;return}}}if(this.#r==!1)throw new Error("Tests have been disabled from continuing to run.");if(c==!1||this.isCanceled==!0)throw new Error("Test has been cancelled");let g=this.#e.beforeeach;if(g!=null&&(o=await g(this,s)),this.isCanceled==!0)throw new Error("Test has been cancelled");if(a=await r(this,s),this.isCanceled==!0)throw new Error("Test has been cancelled");let b=this.#e.aftereach;if(b!=null&&(p=await b(this,s)),t==!0){let h=this.#e.requiredafterany;if(h!=null){let m;try{let d=this.getElement("required-before-any-details");if(d.classList.add("running"),d.part.add("running"),this.isCanceled==!0)throw new Error("Test has been cancelled");m=await h(this,d),this.#t(m,!0,"after",!0),d.part.remove("running"),d.classList.remove("running")}catch(d){this.#t(m,!0,"after",!0,d),console.error(d),this.#r=!1;return}}}u="before",o!=v&&this.#a(s,o,!0,void 0,u),u=void 0,this.#a(s,a,!0,void 0,u),u="after",p!=v&&this.#a(s,p,!0,void 0,u)}catch(c){this.#a(s,a,!1,c,u),console.error(c),this.#r=!1}finally{s?.classList.remove("running"),s?.part.remove("running"),n?.classList.remove("running"),n?.part.remove("running"),this.dispatchEvent(new CustomEvent("aftertest",{bubbles:!0,cancelable:!0,composed:!0,detail:{testElement:s}}))}}#a(e,r,t,s,n){if(r instanceof HTMLElement)this.#o(e,r,t,n);else if(r==null){let i=n==null?"Passed":"Hook Ran Successfully",o=this.#n(t==!0?`${i}`:`Failed${s!=null?`:
|
|
467
|
+
${s.message}`:""}`,t,n);this.#o(e,o,t,n)}else if(typeof r=="string"){let i=this.#n(`${r}${s==null?"":`:
|
|
468
|
+
${s.message}`}`,t,n);this.#o(e,i,t,n)}else if(typeof r=="object"){let i=r;if(i.success!=null&&i.expected!=null&&i.value!=null){let o=n==null?"Passed":"Success",a=n==null?"Failed":"Fail",p=this.#n(`${i.success==!0?`${o}:`:`${a}:`}
|
|
469
|
+
Expected:${i.expected}
|
|
470
|
+
Result:${i.value}`,i.success,n);this.#o(e,p,t,n)}}let l=e.querySelector("details");l!=null&&(l.open=!0)}#t(e,r,t,s,n){if(e instanceof HTMLElement)this.#l(e,r,t,s);else{let i;if(e==null)i=this.#n(r==!0?"Hook Ran Successfully":`Failed${n!=null?`:
|
|
471
|
+
${n.message}`:""}`,r),this.#l(i,r,t,s);else if(typeof e=="string")i=this.#n(`${e}${n==null?"":`:
|
|
472
|
+
${n.message}`}`,r),this.#l(i,r,t,s);else if(typeof e=="object"){let o=e;o.success!=null&&o.expected!=null&&o.value!=null&&(i=this.#n(`${o.success==!0?"Success:":"Fail:"}
|
|
473
|
+
Expected:${o.expected}
|
|
474
|
+
Result:${o.value}`,o.success),this.#l(i,r,t,s))}}let l=this.getElement(`${t}-all-details`);l!=null&&(l.open=!0)}static create(e){return document.createElement("code-tests")}#s=new Map;#m(e,r){let t=D();this.#s.set(t,r);let s=this.#g(t,e);return this.getElement("tests").append(s),t}#g(e,r){let t=document.createElement("li");t.dataset.testId=e,t.classList.add("test"),t.part.add("test");let s=document.createElement("details");s.classList.add("test-details"),s.part.add("test-details");let n=document.createElement("summary");n.classList.add("test-summary"),n.part.add("test-summary");let l=document.createElement("div");l.classList.add("result-icon"),l.part.add("result-icon"),n.append(l);let i=document.createElement("span");i.classList.add("description","test-description"),i.textContent=r,n.append(i);let o=document.createElement("button");o.classList.add("run","test-run"),o.part.add("run","test-run"),o.textContent="Run Test",o.title="Run Test",n.append(o);let a=document.createElement("div");a.classList.add("before-result","test-before-result"),a.part.add("before-result","test-before-result");let p=document.createElement("div");p.classList.add("result","test-result"),p.part.add("result","test-result");let u=document.createElement("div");return u.classList.add("after-result","test-after-result"),u.part.add("after-result","test-after-result"),s.append(n),s.append(a),s.append(p),s.append(u),t.append(s),t}#o(e,r,t,s){e.setAttribute("success",t==!0?"true":"false"),e.classList.toggle("success",t),e.part.toggle("success",t),e.classList.toggle("fail",!t),e.part.toggle("fail",!t);let n=e.querySelector(".result-icon");n?.classList.toggle("success",t),n?.part.toggle("success",t),n?.classList.toggle("fail",!t),n?.part.toggle("fail",!t);let l=e.querySelector(`.${s==null?"result":s=="before"?"before-result":"after-result"}`);if(l==null){this.#i("Unable to find result element");return}l.innerHTML="",l.appendChild(r)}#n(e,r,t){let s=document.createElement("code");s.classList.add("code"),s.part.add("code");let n=document.createElement("pre");n.textContent=e;let l=r==!0?"success-message":"error-message";return n.classList.add("pre",l),n.part.add("pre",l),s.appendChild(n),s}#l(e,r,t,s){let n=s==!0?`required-${t}-any`:`${t}-all`,l=this.getElement(`${n}-details`),i=this.getElement(`${n}-results`);l.setAttribute("success",r==!0?"true":"false"),l.classList.toggle("success",r),l.part.toggle("success",r),l.classList.toggle("fail",!r),l.part.toggle("fail",!r),i.innerHTML="",i.appendChild(e)}#i(e,r){r instanceof Error&&(e+=`
|
|
475
|
+
${r.message}`,console.error(r));let t=document.createElement("li");t.classList.add("error","process-error"),t.part.add("error","process-error");let s=document.createElement("code");s.classList.add("code","process-error-code"),s.part.add("code","process-error-code");let n=document.createElement("pre");n.classList.add("pre","process-error-pre"),n.part.add("pre","process-error-pre"),n.textContent=e,s.append(n),t.append(s),this.getElement("tests").append(t)}#p(e){if(e=="ordered"){let r=this.shadowRoot.querySelector("ul");if(r==null)return;let t=this.shadowRoot?.querySelectorAll("li"),s=document.createElement("ol");t!=null&&s.append(...t),s.id="tests",r.replaceWith(s)}else{let r=this.shadowRoot.querySelector("ol");if(r==null)return;let t=this.shadowRoot?.querySelectorAll("li"),s=document.createElement("ul");s.id="tests",t!=null&&s.append(...t),r.replaceWith(s)}}static observedAttributes=["in-order"];attributeChangedCallback(e,r,t){e=="in-order"&&(t==null?this.#p("unordered"):this.#p("ordered"))}};function D(){let f=new Uint8Array(20);crypto.getRandomValues(f);let e=[].slice.apply(f).map(function(t){return String.fromCharCode(t)}).join("");return btoa(e).replace(/\//g,"_").replace(/\+/g,"-").replace(/=/g,"")}customElements.get(C)==null&&customElements.define(C,k);export{F as CodeTestEventType,E as CodeTests,k as CodeTestsElement,P as HookType,S as expect,$ as prompt};
|