@magnit-ce/code-tests 0.0.6 → 0.0.8
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 +96 -28
- package/dist/code-tests.d.cts +1 -0
- package/dist/code-tests.d.ts +1 -0
- package/dist/code-tests.js +96 -28
- package/dist/code-tests.min.js +32 -11
- package/package.json +1 -1
package/dist/code-tests.cjs
CHANGED
|
@@ -115,6 +115,7 @@ var code_tests_default = `:host
|
|
|
115
115
|
--surface-button: var(--uchu-blue); /* --uchu-blue: #3984f2 */
|
|
116
116
|
--surface-button-hover: var(--uchu-light-blue);
|
|
117
117
|
--surface-button-active: var(--uchu-dark-blue);
|
|
118
|
+
--surface-button-cancel: var(--uchu-dark-blue);
|
|
118
119
|
|
|
119
120
|
--border-test: solid 1px var(--uchu-dark-gray);
|
|
120
121
|
--border-hook: solid 1px var(--uchu-dark-purple);
|
|
@@ -210,6 +211,26 @@ summary::before
|
|
|
210
211
|
/* background: var(--surface-test-summary); */
|
|
211
212
|
}
|
|
212
213
|
|
|
214
|
+
:host(.running) .run[data-all]
|
|
215
|
+
{
|
|
216
|
+
background-color: var(--surface-test-summary);
|
|
217
|
+
border-color: var(--surface-test-summary);
|
|
218
|
+
}
|
|
219
|
+
:host(.running) .run[data-all]:hover
|
|
220
|
+
{
|
|
221
|
+
background-color: var(--uchu-dark-gray);
|
|
222
|
+
border-color: var(--uchu-dark-gray);
|
|
223
|
+
}
|
|
224
|
+
:host(.running) .run[data-all]:active
|
|
225
|
+
{
|
|
226
|
+
background-color: var(--surface-test);
|
|
227
|
+
border-color: var(--surface-test);
|
|
228
|
+
}
|
|
229
|
+
:host(.running) .run[data-all]::before
|
|
230
|
+
{
|
|
231
|
+
display: none;
|
|
232
|
+
}
|
|
233
|
+
|
|
213
234
|
#before-all-summary
|
|
214
235
|
,#after-all-summary
|
|
215
236
|
{
|
|
@@ -602,7 +623,14 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
602
623
|
if (parentListItem == null) {
|
|
603
624
|
const isRunAll = runButton.hasAttribute("data-all");
|
|
604
625
|
if (isRunAll == true) {
|
|
605
|
-
this.
|
|
626
|
+
if (this.classList.contains("running")) {
|
|
627
|
+
if (this.classList.contains("canceled")) {
|
|
628
|
+
return;
|
|
629
|
+
}
|
|
630
|
+
this.cancel();
|
|
631
|
+
} else {
|
|
632
|
+
this.runTests();
|
|
633
|
+
}
|
|
606
634
|
}
|
|
607
635
|
return;
|
|
608
636
|
}
|
|
@@ -614,6 +642,9 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
614
642
|
if (test == null) {
|
|
615
643
|
return;
|
|
616
644
|
}
|
|
645
|
+
this.#isCanceled = false;
|
|
646
|
+
this.classList.remove("canceled");
|
|
647
|
+
this.part.remove("canceled");
|
|
617
648
|
this.#runTest(testId, test);
|
|
618
649
|
}
|
|
619
650
|
#getCurrentTestsPath() {
|
|
@@ -724,11 +755,24 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
724
755
|
this.#addProcessError("An error occurred while loading the tasks:", error);
|
|
725
756
|
}
|
|
726
757
|
}
|
|
758
|
+
#isCanceled = false;
|
|
759
|
+
cancel() {
|
|
760
|
+
this.#isCanceled = true;
|
|
761
|
+
this.classList.add("canceled");
|
|
762
|
+
this.part.add("canceled");
|
|
763
|
+
}
|
|
727
764
|
async runTests() {
|
|
728
765
|
this.dispatchEvent(new CustomEvent("beforeall" /* BeforeAll */, { bubbles: true, composed: true }));
|
|
729
766
|
this.#continueRunningTests = true;
|
|
730
767
|
this.classList.add("running");
|
|
768
|
+
this.#isCanceled = false;
|
|
769
|
+
this.classList.remove("canceled");
|
|
770
|
+
this.part.remove("canceled");
|
|
731
771
|
this.toggleAttribute("success", false);
|
|
772
|
+
const playButtonLabel = this.findElement("play-button-label");
|
|
773
|
+
if (playButtonLabel != null) {
|
|
774
|
+
playButtonLabel.textContent = "Cancel";
|
|
775
|
+
}
|
|
732
776
|
this.#clearTestStatuses();
|
|
733
777
|
const inOrder = this.hasAttribute("in-order");
|
|
734
778
|
const beforeHooks = this.#hooks.get(BEFOREALL);
|
|
@@ -739,6 +783,9 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
739
783
|
beforeAllHookElement.classList.add("running");
|
|
740
784
|
beforeAllHookElement.part.add("running");
|
|
741
785
|
for (const [hook, ids] of beforeHooks) {
|
|
786
|
+
if (this.#isCanceled == true) {
|
|
787
|
+
throw new Error("Test has been cancelled");
|
|
788
|
+
}
|
|
742
789
|
hookResult = await hook(this, beforeAllHookElement);
|
|
743
790
|
this.#handleHookResult(hookResult, true, "before");
|
|
744
791
|
}
|
|
@@ -750,6 +797,9 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
750
797
|
this.#continueRunningTests = false;
|
|
751
798
|
this.classList.remove("running");
|
|
752
799
|
this.part.remove("running");
|
|
800
|
+
if (playButtonLabel != null) {
|
|
801
|
+
playButtonLabel.textContent = "Run Tests";
|
|
802
|
+
}
|
|
753
803
|
this.dispatchEvent(new CustomEvent("afterall" /* AfterAll */, { bubbles: true, composed: true }));
|
|
754
804
|
return;
|
|
755
805
|
}
|
|
@@ -771,6 +821,9 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
771
821
|
if (this.#continueRunningTests == false) {
|
|
772
822
|
this.classList.remove("running");
|
|
773
823
|
this.part.remove("running");
|
|
824
|
+
if (playButtonLabel != null) {
|
|
825
|
+
playButtonLabel.textContent = "Run Tests";
|
|
826
|
+
}
|
|
774
827
|
this.dispatchEvent(new CustomEvent("afterall" /* AfterAll */, { bubbles: true, composed: true }));
|
|
775
828
|
return;
|
|
776
829
|
}
|
|
@@ -782,6 +835,9 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
782
835
|
afterAllHookElement.classList.add("running");
|
|
783
836
|
afterAllHookElement.part.add("running");
|
|
784
837
|
for (const [hook, ids] of afterHooks) {
|
|
838
|
+
if (this.#isCanceled == true) {
|
|
839
|
+
throw new Error("Test has been cancelled");
|
|
840
|
+
}
|
|
785
841
|
hookResult = await hook(this, afterAllHookElement);
|
|
786
842
|
this.#handleHookResult(hookResult, true, "after");
|
|
787
843
|
}
|
|
@@ -793,6 +849,9 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
793
849
|
this.#continueRunningTests = false;
|
|
794
850
|
this.classList.remove("running");
|
|
795
851
|
this.part.remove("running");
|
|
852
|
+
if (playButtonLabel != null) {
|
|
853
|
+
playButtonLabel.textContent = "Run Tests";
|
|
854
|
+
}
|
|
796
855
|
this.dispatchEvent(new CustomEvent("afterall" /* AfterAll */, { bubbles: true, composed: true }));
|
|
797
856
|
return;
|
|
798
857
|
}
|
|
@@ -801,6 +860,9 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
801
860
|
this.setAttribute("success", failedTests.length == 0 ? "true" : "false");
|
|
802
861
|
this.classList.remove("running");
|
|
803
862
|
this.part.remove("running");
|
|
863
|
+
if (playButtonLabel != null) {
|
|
864
|
+
playButtonLabel.textContent = "Run Tests";
|
|
865
|
+
}
|
|
804
866
|
this.dispatchEvent(new CustomEvent("afterall" /* AfterAll */, { bubbles: true, composed: true }));
|
|
805
867
|
}
|
|
806
868
|
#clearTestStatuses() {
|
|
@@ -853,36 +915,43 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
853
915
|
let testType;
|
|
854
916
|
try {
|
|
855
917
|
const allowTest = this.dispatchEvent(new CustomEvent("beforetest" /* BeforeTest */, { bubbles: true, cancelable: true, composed: true, detail: { testElement } }));
|
|
856
|
-
if (allowTest == true) {
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
918
|
+
if (allowTest == false || this.#isCanceled == true) {
|
|
919
|
+
throw new Error("Test has been cancelled");
|
|
920
|
+
}
|
|
921
|
+
const beforeHooks = this.#hooks.get(BEFOREEACH);
|
|
922
|
+
if (beforeHooks != null) {
|
|
923
|
+
for (const [hook, ids] of beforeHooks) {
|
|
924
|
+
if (ids.has(testId)) {
|
|
925
|
+
beforeResult = await hook(this, testElement);
|
|
926
|
+
break;
|
|
864
927
|
}
|
|
865
928
|
}
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
929
|
+
}
|
|
930
|
+
if (this.#isCanceled == true) {
|
|
931
|
+
throw new Error("Test has been cancelled");
|
|
932
|
+
}
|
|
933
|
+
testResult = await test(this, testElement);
|
|
934
|
+
if (this.#isCanceled == true) {
|
|
935
|
+
throw new Error("Test has been cancelled");
|
|
936
|
+
}
|
|
937
|
+
const afterHooks = this.#hooks.get(AFTEREACH);
|
|
938
|
+
if (afterHooks != null) {
|
|
939
|
+
for (const [hook, ids] of afterHooks) {
|
|
940
|
+
if (ids.has(testId)) {
|
|
941
|
+
afterResult = await hook(this, testElement);
|
|
942
|
+
break;
|
|
874
943
|
}
|
|
875
944
|
}
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
945
|
+
}
|
|
946
|
+
testType = "before";
|
|
947
|
+
if (beforeResult != NOTESTDEFINED) {
|
|
948
|
+
this.#handleTestResult(testElement, beforeResult, true, void 0, testType);
|
|
949
|
+
}
|
|
950
|
+
testType = void 0;
|
|
951
|
+
this.#handleTestResult(testElement, testResult, true, void 0, testType);
|
|
952
|
+
testType = "after";
|
|
953
|
+
if (afterResult != NOTESTDEFINED) {
|
|
954
|
+
this.#handleTestResult(testElement, afterResult, true, void 0, testType);
|
|
886
955
|
}
|
|
887
956
|
} catch (error) {
|
|
888
957
|
this.#handleTestResult(testElement, testResult, false, error, testType);
|
|
@@ -961,7 +1030,6 @@ Result:${objectResult.value}`,
|
|
|
961
1030
|
}
|
|
962
1031
|
static create(properties) {
|
|
963
1032
|
const element = document.createElement("code-tests");
|
|
964
|
-
console.log(properties);
|
|
965
1033
|
return element;
|
|
966
1034
|
}
|
|
967
1035
|
#tests = /* @__PURE__ */ new Map();
|
package/dist/code-tests.d.cts
CHANGED
|
@@ -42,6 +42,7 @@ declare class CodeTestsElement extends HTMLElement {
|
|
|
42
42
|
connectedCallback(): void;
|
|
43
43
|
disconnectedCallback(): void;
|
|
44
44
|
loadTests(testsPath?: string): Promise<void>;
|
|
45
|
+
cancel(): void;
|
|
45
46
|
runTests(): Promise<void>;
|
|
46
47
|
static create(properties: CodeTestsProperties): HTMLElement;
|
|
47
48
|
static observedAttributes: string[];
|
package/dist/code-tests.d.ts
CHANGED
|
@@ -42,6 +42,7 @@ declare class CodeTestsElement extends HTMLElement {
|
|
|
42
42
|
connectedCallback(): void;
|
|
43
43
|
disconnectedCallback(): void;
|
|
44
44
|
loadTests(testsPath?: string): Promise<void>;
|
|
45
|
+
cancel(): void;
|
|
45
46
|
runTests(): Promise<void>;
|
|
46
47
|
static create(properties: CodeTestsProperties): HTMLElement;
|
|
47
48
|
static observedAttributes: string[];
|
package/dist/code-tests.js
CHANGED
|
@@ -81,6 +81,7 @@ var code_tests_default = `:host
|
|
|
81
81
|
--surface-button: var(--uchu-blue); /* --uchu-blue: #3984f2 */
|
|
82
82
|
--surface-button-hover: var(--uchu-light-blue);
|
|
83
83
|
--surface-button-active: var(--uchu-dark-blue);
|
|
84
|
+
--surface-button-cancel: var(--uchu-dark-blue);
|
|
84
85
|
|
|
85
86
|
--border-test: solid 1px var(--uchu-dark-gray);
|
|
86
87
|
--border-hook: solid 1px var(--uchu-dark-purple);
|
|
@@ -176,6 +177,26 @@ summary::before
|
|
|
176
177
|
/* background: var(--surface-test-summary); */
|
|
177
178
|
}
|
|
178
179
|
|
|
180
|
+
:host(.running) .run[data-all]
|
|
181
|
+
{
|
|
182
|
+
background-color: var(--surface-test-summary);
|
|
183
|
+
border-color: var(--surface-test-summary);
|
|
184
|
+
}
|
|
185
|
+
:host(.running) .run[data-all]:hover
|
|
186
|
+
{
|
|
187
|
+
background-color: var(--uchu-dark-gray);
|
|
188
|
+
border-color: var(--uchu-dark-gray);
|
|
189
|
+
}
|
|
190
|
+
:host(.running) .run[data-all]:active
|
|
191
|
+
{
|
|
192
|
+
background-color: var(--surface-test);
|
|
193
|
+
border-color: var(--surface-test);
|
|
194
|
+
}
|
|
195
|
+
:host(.running) .run[data-all]::before
|
|
196
|
+
{
|
|
197
|
+
display: none;
|
|
198
|
+
}
|
|
199
|
+
|
|
179
200
|
#before-all-summary
|
|
180
201
|
,#after-all-summary
|
|
181
202
|
{
|
|
@@ -568,7 +589,14 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
568
589
|
if (parentListItem == null) {
|
|
569
590
|
const isRunAll = runButton.hasAttribute("data-all");
|
|
570
591
|
if (isRunAll == true) {
|
|
571
|
-
this.
|
|
592
|
+
if (this.classList.contains("running")) {
|
|
593
|
+
if (this.classList.contains("canceled")) {
|
|
594
|
+
return;
|
|
595
|
+
}
|
|
596
|
+
this.cancel();
|
|
597
|
+
} else {
|
|
598
|
+
this.runTests();
|
|
599
|
+
}
|
|
572
600
|
}
|
|
573
601
|
return;
|
|
574
602
|
}
|
|
@@ -580,6 +608,9 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
580
608
|
if (test == null) {
|
|
581
609
|
return;
|
|
582
610
|
}
|
|
611
|
+
this.#isCanceled = false;
|
|
612
|
+
this.classList.remove("canceled");
|
|
613
|
+
this.part.remove("canceled");
|
|
583
614
|
this.#runTest(testId, test);
|
|
584
615
|
}
|
|
585
616
|
#getCurrentTestsPath() {
|
|
@@ -690,11 +721,24 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
690
721
|
this.#addProcessError("An error occurred while loading the tasks:", error);
|
|
691
722
|
}
|
|
692
723
|
}
|
|
724
|
+
#isCanceled = false;
|
|
725
|
+
cancel() {
|
|
726
|
+
this.#isCanceled = true;
|
|
727
|
+
this.classList.add("canceled");
|
|
728
|
+
this.part.add("canceled");
|
|
729
|
+
}
|
|
693
730
|
async runTests() {
|
|
694
731
|
this.dispatchEvent(new CustomEvent("beforeall" /* BeforeAll */, { bubbles: true, composed: true }));
|
|
695
732
|
this.#continueRunningTests = true;
|
|
696
733
|
this.classList.add("running");
|
|
734
|
+
this.#isCanceled = false;
|
|
735
|
+
this.classList.remove("canceled");
|
|
736
|
+
this.part.remove("canceled");
|
|
697
737
|
this.toggleAttribute("success", false);
|
|
738
|
+
const playButtonLabel = this.findElement("play-button-label");
|
|
739
|
+
if (playButtonLabel != null) {
|
|
740
|
+
playButtonLabel.textContent = "Cancel";
|
|
741
|
+
}
|
|
698
742
|
this.#clearTestStatuses();
|
|
699
743
|
const inOrder = this.hasAttribute("in-order");
|
|
700
744
|
const beforeHooks = this.#hooks.get(BEFOREALL);
|
|
@@ -705,6 +749,9 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
705
749
|
beforeAllHookElement.classList.add("running");
|
|
706
750
|
beforeAllHookElement.part.add("running");
|
|
707
751
|
for (const [hook, ids] of beforeHooks) {
|
|
752
|
+
if (this.#isCanceled == true) {
|
|
753
|
+
throw new Error("Test has been cancelled");
|
|
754
|
+
}
|
|
708
755
|
hookResult = await hook(this, beforeAllHookElement);
|
|
709
756
|
this.#handleHookResult(hookResult, true, "before");
|
|
710
757
|
}
|
|
@@ -716,6 +763,9 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
716
763
|
this.#continueRunningTests = false;
|
|
717
764
|
this.classList.remove("running");
|
|
718
765
|
this.part.remove("running");
|
|
766
|
+
if (playButtonLabel != null) {
|
|
767
|
+
playButtonLabel.textContent = "Run Tests";
|
|
768
|
+
}
|
|
719
769
|
this.dispatchEvent(new CustomEvent("afterall" /* AfterAll */, { bubbles: true, composed: true }));
|
|
720
770
|
return;
|
|
721
771
|
}
|
|
@@ -737,6 +787,9 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
737
787
|
if (this.#continueRunningTests == false) {
|
|
738
788
|
this.classList.remove("running");
|
|
739
789
|
this.part.remove("running");
|
|
790
|
+
if (playButtonLabel != null) {
|
|
791
|
+
playButtonLabel.textContent = "Run Tests";
|
|
792
|
+
}
|
|
740
793
|
this.dispatchEvent(new CustomEvent("afterall" /* AfterAll */, { bubbles: true, composed: true }));
|
|
741
794
|
return;
|
|
742
795
|
}
|
|
@@ -748,6 +801,9 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
748
801
|
afterAllHookElement.classList.add("running");
|
|
749
802
|
afterAllHookElement.part.add("running");
|
|
750
803
|
for (const [hook, ids] of afterHooks) {
|
|
804
|
+
if (this.#isCanceled == true) {
|
|
805
|
+
throw new Error("Test has been cancelled");
|
|
806
|
+
}
|
|
751
807
|
hookResult = await hook(this, afterAllHookElement);
|
|
752
808
|
this.#handleHookResult(hookResult, true, "after");
|
|
753
809
|
}
|
|
@@ -759,6 +815,9 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
759
815
|
this.#continueRunningTests = false;
|
|
760
816
|
this.classList.remove("running");
|
|
761
817
|
this.part.remove("running");
|
|
818
|
+
if (playButtonLabel != null) {
|
|
819
|
+
playButtonLabel.textContent = "Run Tests";
|
|
820
|
+
}
|
|
762
821
|
this.dispatchEvent(new CustomEvent("afterall" /* AfterAll */, { bubbles: true, composed: true }));
|
|
763
822
|
return;
|
|
764
823
|
}
|
|
@@ -767,6 +826,9 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
767
826
|
this.setAttribute("success", failedTests.length == 0 ? "true" : "false");
|
|
768
827
|
this.classList.remove("running");
|
|
769
828
|
this.part.remove("running");
|
|
829
|
+
if (playButtonLabel != null) {
|
|
830
|
+
playButtonLabel.textContent = "Run Tests";
|
|
831
|
+
}
|
|
770
832
|
this.dispatchEvent(new CustomEvent("afterall" /* AfterAll */, { bubbles: true, composed: true }));
|
|
771
833
|
}
|
|
772
834
|
#clearTestStatuses() {
|
|
@@ -819,36 +881,43 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
819
881
|
let testType;
|
|
820
882
|
try {
|
|
821
883
|
const allowTest = this.dispatchEvent(new CustomEvent("beforetest" /* BeforeTest */, { bubbles: true, cancelable: true, composed: true, detail: { testElement } }));
|
|
822
|
-
if (allowTest == true) {
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
884
|
+
if (allowTest == false || this.#isCanceled == true) {
|
|
885
|
+
throw new Error("Test has been cancelled");
|
|
886
|
+
}
|
|
887
|
+
const beforeHooks = this.#hooks.get(BEFOREEACH);
|
|
888
|
+
if (beforeHooks != null) {
|
|
889
|
+
for (const [hook, ids] of beforeHooks) {
|
|
890
|
+
if (ids.has(testId)) {
|
|
891
|
+
beforeResult = await hook(this, testElement);
|
|
892
|
+
break;
|
|
830
893
|
}
|
|
831
894
|
}
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
895
|
+
}
|
|
896
|
+
if (this.#isCanceled == true) {
|
|
897
|
+
throw new Error("Test has been cancelled");
|
|
898
|
+
}
|
|
899
|
+
testResult = await test(this, testElement);
|
|
900
|
+
if (this.#isCanceled == true) {
|
|
901
|
+
throw new Error("Test has been cancelled");
|
|
902
|
+
}
|
|
903
|
+
const afterHooks = this.#hooks.get(AFTEREACH);
|
|
904
|
+
if (afterHooks != null) {
|
|
905
|
+
for (const [hook, ids] of afterHooks) {
|
|
906
|
+
if (ids.has(testId)) {
|
|
907
|
+
afterResult = await hook(this, testElement);
|
|
908
|
+
break;
|
|
840
909
|
}
|
|
841
910
|
}
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
911
|
+
}
|
|
912
|
+
testType = "before";
|
|
913
|
+
if (beforeResult != NOTESTDEFINED) {
|
|
914
|
+
this.#handleTestResult(testElement, beforeResult, true, void 0, testType);
|
|
915
|
+
}
|
|
916
|
+
testType = void 0;
|
|
917
|
+
this.#handleTestResult(testElement, testResult, true, void 0, testType);
|
|
918
|
+
testType = "after";
|
|
919
|
+
if (afterResult != NOTESTDEFINED) {
|
|
920
|
+
this.#handleTestResult(testElement, afterResult, true, void 0, testType);
|
|
852
921
|
}
|
|
853
922
|
} catch (error) {
|
|
854
923
|
this.#handleTestResult(testElement, testResult, false, error, testType);
|
|
@@ -927,7 +996,6 @@ Result:${objectResult.value}`,
|
|
|
927
996
|
}
|
|
928
997
|
static create(properties) {
|
|
929
998
|
const element = document.createElement("code-tests");
|
|
930
|
-
console.log(properties);
|
|
931
999
|
return element;
|
|
932
1000
|
}
|
|
933
1001
|
#tests = /* @__PURE__ */ new Map();
|
package/dist/code-tests.min.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var
|
|
1
|
+
var S=`:host
|
|
2
2
|
{
|
|
3
3
|
/*** gray ***/
|
|
4
4
|
--uchu-light-gray-raw: 95.57% 0.003 286.35;
|
|
@@ -80,6 +80,7 @@ var R=`:host
|
|
|
80
80
|
--surface-button: var(--uchu-blue); /* --uchu-blue: #3984f2 */
|
|
81
81
|
--surface-button-hover: var(--uchu-light-blue);
|
|
82
82
|
--surface-button-active: var(--uchu-dark-blue);
|
|
83
|
+
--surface-button-cancel: var(--uchu-dark-blue);
|
|
83
84
|
|
|
84
85
|
--border-test: solid 1px var(--uchu-dark-gray);
|
|
85
86
|
--border-hook: solid 1px var(--uchu-dark-purple);
|
|
@@ -175,6 +176,26 @@ summary::before
|
|
|
175
176
|
/* background: var(--surface-test-summary); */
|
|
176
177
|
}
|
|
177
178
|
|
|
179
|
+
:host(.running) .run[data-all]
|
|
180
|
+
{
|
|
181
|
+
background-color: var(--surface-test-summary);
|
|
182
|
+
border-color: var(--surface-test-summary);
|
|
183
|
+
}
|
|
184
|
+
:host(.running) .run[data-all]:hover
|
|
185
|
+
{
|
|
186
|
+
background-color: var(--uchu-dark-gray);
|
|
187
|
+
border-color: var(--uchu-dark-gray);
|
|
188
|
+
}
|
|
189
|
+
:host(.running) .run[data-all]:active
|
|
190
|
+
{
|
|
191
|
+
background-color: var(--surface-test);
|
|
192
|
+
border-color: var(--surface-test);
|
|
193
|
+
}
|
|
194
|
+
:host(.running) .run[data-all]::before
|
|
195
|
+
{
|
|
196
|
+
display: none;
|
|
197
|
+
}
|
|
198
|
+
|
|
178
199
|
#before-all-summary
|
|
179
200
|
,#after-all-summary
|
|
180
201
|
{
|
|
@@ -398,13 +419,13 @@ pre
|
|
|
398
419
|
</div>
|
|
399
420
|
</template>`;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.
|
|
400
421
|
Expected: ${t}
|
|
401
|
-
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")}},
|
|
402
|
-
${r.message}`:""}`,e,
|
|
403
|
-
${r.message}`}`,e,
|
|
404
|
-
Expected:${
|
|
405
|
-
Result:${
|
|
406
|
-
${r.message}`:""}`,s),this.#
|
|
407
|
-
${r.message}`}`,s),this.#
|
|
408
|
-
Expected:${
|
|
409
|
-
Result:${
|
|
410
|
-
${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
|
|
422
|
+
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"),w=Symbol("afterEach"),L=class d{static timeoutMS=500;static#e;static#h;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 N=(r=>(r.BeforeAll="beforeall",r.AfterAll="afterall",r.BeforeTest="beforetest",r.AfterTest="aftertest",r))(N||{}),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;#h={[v]:C(),[y]:C(),[w]:C(),[k]:C()};#s=!0;constructor(){super(),this.attachShadow({mode:"open"}),this.shadowRoot.innerHTML=F,this.shadowRoot.adoptedStyleSheets.push(D),this.#u=this.#f.bind(this)}connectedCallback(){if(P(this.shadowRoot),this.addEventListener("click",this.#u),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.#u)}#u;#f(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.#r.get(r);n!=null&&(this.#t=!1,this.classList.remove("canceled"),this.part.remove("canceled"),this.#d(r,n))}#m(){return this.getAttribute("src")??this.getAttribute("test")??this.getAttribute("tests")??this.getAttribute("run")??this.getAttribute("path")}async loadTests(t){let s=t??this.#m();if(s!=null)try{this.getElement("tests").innerHTML="",this.#r.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[w];if(A!=null&&this.#e.get(w)==null){let p=new Map;p.set(A,new Set),this.#e.set(w,p)}for(let[x,p]of Object.entries(f)){let M=this.#b(x,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(w);if(m!=null){let g=m.get(A);g?.add(M)}}}}catch(e){this.#c("An error occurred while loading the tasks:",e)}}#t=!1;cancel(){this.#t=!0,this.classList.add("canceled"),this.part.add("canceled")}async runTests(){this.dispatchEvent(new CustomEvent("beforeall",{bubbles:!0,composed:!0})),this.#s=!0,this.classList.add("running"),this.#t=!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.#g();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.#t==!0)throw new Error("Test has been cancelled");o=await l(this,a),this.#o(o,!0,"before")}a.part.remove("running"),a.classList.remove("running")}catch(a){this.#o(o,!1,"before",a),console.error(a),this.#s=!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.#r)o.push(this.#d(a,l));await Promise.all(o)}else for(let[o,a]of this.#r){if(this.#s==!1)break;await this.#d(o,a)}if(this.#s==!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.#t==!0)throw new Error("Test has been cancelled");o=await l(this,a),this.#o(o,!0,"after")}a.part.remove("running"),a.classList.remove("running")}catch(a){this.#o(o,!1,"after",a),console.error(a),this.#s=!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}))}#g(){for(let[e,r]of this.#r){let n=this.getElement("tests").querySelector(`[data-test-id="${e}"]`);if(n==null){this.#c(`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#d(t,s){let e=this.getElement("tests").querySelector(`[data-test-id="${t}"]`);if(e==null){this.#c(`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.#t==!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.#t==!0)throw new Error("Test has been cancelled");if(l=await s(this,e),this.#t==!0)throw new Error("Test has been cancelled");let E=this.#e.get(w);if(E!=null){for(let[b,i]of E)if(i.has(t)){c=await b(this,e);break}}u="before",a!=H&&this.#a(e,a,!0,void 0,u),u=void 0,this.#a(e,l,!0,void 0,u),u="after",c!=H&&this.#a(e,c,!0,void 0,u)}catch(h){this.#a(e,l,!1,h,u),console.error(h),this.#s=!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,n){if(s instanceof HTMLElement)this.#l(t,s,e,n);else if(s==null){let a=n==null?"Passed":"Hook Ran Successfully",l=this.#n(e==!0?`${a}`:`Failed${r!=null?`:
|
|
423
|
+
${r.message}`:""}`,e,n);this.#l(t,l,e,n)}else if(typeof s=="string"){let a=this.#n(`${s}${r==null?"":`:
|
|
424
|
+
${r.message}`}`,e,n);this.#l(t,a,e,n)}else if(typeof s=="object"){let a=s;if(a.success!=null&&a.expected!=null&&a.value!=null){let l=n==null?"Passed":"Success",c=n==null?"Failed":"Fail",u=this.#n(`${a.success==!0?`${l}:`:`${c}:`}
|
|
425
|
+
Expected:${a.expected}
|
|
426
|
+
Result:${a.value}`,a.success,n);this.#l(t,u,e,n)}}let o=t.querySelector("details");o!=null&&(o.open=!0)}#o(t,s,e,r){if(t instanceof HTMLElement)this.#i(t,s,e);else{let o;if(t==null)o=this.#n(s==!0?"Hook Ran Successfully":`Failed${r!=null?`:
|
|
427
|
+
${r.message}`:""}`,s),this.#i(o,s,e);else if(typeof t=="string")o=this.#n(`${t}${r==null?"":`:
|
|
428
|
+
${r.message}`}`,s),this.#i(o,s,e);else if(typeof t=="object"){let a=t;a.success!=null&&a.expected!=null&&a.value!=null&&(o=this.#n(`${a.success==!0?"Success:":"Fail:"}
|
|
429
|
+
Expected:${a.expected}
|
|
430
|
+
Result:${a.value}`,a.success),this.#i(o,s,e))}}let n=this.getElement(`${e}-all-details`);n!=null&&(n.open=!0)}static create(t){return document.createElement("code-tests")}#r=new Map;#b(t,s){let e=C();this.#r.set(e,s);let r=this.#E(e,t);return this.getElement("tests").append(r),e}#E(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 n=document.createElement("summary");n.classList.add("test-summary"),n.part.add("test-summary");let o=document.createElement("div");o.classList.add("result-icon"),o.part.add("result-icon"),n.append(o);let a=document.createElement("span");a.classList.add("description","test-description"),a.textContent=s,n.append(a);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",n.append(l);let c=document.createElement("div");c.classList.add("before-result","test-before-result"),c.part.add("before-result","test-before-result");let u=document.createElement("div");u.classList.add("result","test-result"),u.part.add("result","test-result");let h=document.createElement("div");return h.classList.add("after-result","test-after-result"),h.part.add("after-result","test-after-result"),r.append(n),r.append(c),r.append(u),r.append(h),e.append(r),e}#l(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 n=t.querySelector(".result-icon");n?.classList.toggle("success",e),n?.part.toggle("success",e),n?.classList.toggle("fail",!e),n?.part.toggle("fail",!e);let o=t.querySelector(`.${r==null?"result":r=="before"?"before-result":"after-result"}`);if(o==null){this.#c("Unable to find result element");return}o.innerHTML="",o.appendChild(s)}#n(t,s,e){let r=document.createElement("code");r.classList.add("code"),r.part.add("code");let n=document.createElement("pre");n.textContent=t;let o=s==!0?"success-message":"error-message";return n.classList.add("pre",o),n.part.add("pre",o),r.appendChild(n),r}#i(t,s,e){let r=this.getElement(`${e}-all-details`),n=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),n.innerHTML="",n.appendChild(t)}#c(t,s){s instanceof Error&&(t+=`
|
|
431
|
+
${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 n=document.createElement("pre");n.classList.add("pre","process-error-pre"),n.part.add("pre","process-error-pre"),n.textContent=t,r.append(n),e.append(r),this.getElement("tests").append(e)}#p(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.#p("unordered"):this.#p("ordered"))}};function C(){let d=new Uint8Array(20);crypto.getRandomValues(d);let t=[].slice.apply(d).map(function(e){return String.fromCharCode(e)}).join("");return btoa(t).replace(/\//g,"_").replace(/\+/g,"-").replace(/=/g,"")}customElements.get(B)==null&&customElements.define(B,R);export{k as AFTERALL,w as AFTEREACH,v as BEFOREALL,y as BEFOREEACH,N as CodeTestEventType,L as CodeTests,R as CodeTestsElement,I as expect,U as prompt};
|