@magnit-ce/code-tests 0.0.1 → 0.0.2
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 +53 -15
- package/dist/code-tests.js +53 -15
- package/dist/code-tests.min.js +11 -11
- package/package.json +6 -2
package/dist/code-tests.cjs
CHANGED
|
@@ -469,6 +469,19 @@ function expect(value) {
|
|
|
469
469
|
return CodeTests.expect(value);
|
|
470
470
|
}
|
|
471
471
|
|
|
472
|
+
// node_modules/.pnpm/ce-part-utils@0.0.0/node_modules/ce-part-utils/dist/ce-part-utils.js
|
|
473
|
+
var DEFAULT_ELEMENT_SELECTOR = ":not(slot,defs,g,rect,path,circle,ellipse,line,polygon,text,tspan,use,svg image,svg title,desc,template,template *)";
|
|
474
|
+
function assignClassAndIdToPart(shadowRoot) {
|
|
475
|
+
const identifiedElements = [...shadowRoot.querySelectorAll(`${DEFAULT_ELEMENT_SELECTOR}[id]`)];
|
|
476
|
+
for (let i = 0; i < identifiedElements.length; i++) {
|
|
477
|
+
identifiedElements[i].part.add(identifiedElements[i].id);
|
|
478
|
+
}
|
|
479
|
+
const classedElements = [...shadowRoot.querySelectorAll(`${DEFAULT_ELEMENT_SELECTOR}[class]`)];
|
|
480
|
+
for (let i = 0; i < classedElements.length; i++) {
|
|
481
|
+
classedElements[i].part.add(...classedElements[i].classList);
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
|
|
472
485
|
// src/code-tests.ts
|
|
473
486
|
var NOTESTDEFINED = Symbol("No Test Defined");
|
|
474
487
|
var COMPONENT_STYLESHEET = new CSSStyleSheet();
|
|
@@ -510,6 +523,7 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
510
523
|
return;
|
|
511
524
|
}
|
|
512
525
|
this.loadTests(testsPath);
|
|
526
|
+
assignClassAndIdToPart(this.shadowRoot);
|
|
513
527
|
}
|
|
514
528
|
disconnectedCallback() {
|
|
515
529
|
this.removeEventListener("click", this.#boundClickHandler);
|
|
@@ -647,17 +661,15 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
647
661
|
if (beforeHooks != null) {
|
|
648
662
|
let hookResult;
|
|
649
663
|
try {
|
|
650
|
-
const
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
hookElement.part.add("running");
|
|
654
|
-
hookElement.classList.remove("success", "fail");
|
|
655
|
-
hookElement.part.remove("success", "fail");
|
|
664
|
+
const beforeAllHookElement = this.getElement(`before-all-details`);
|
|
665
|
+
beforeAllHookElement.classList.add("running");
|
|
666
|
+
beforeAllHookElement.part.add("running");
|
|
656
667
|
for (const [hook, ids] of beforeHooks) {
|
|
657
668
|
hookResult = await hook();
|
|
658
669
|
this.#handleHookResult(hookResult, true, "before");
|
|
659
670
|
}
|
|
660
|
-
|
|
671
|
+
beforeAllHookElement.part.remove("running");
|
|
672
|
+
beforeAllHookElement.classList.remove("running");
|
|
661
673
|
} catch (error) {
|
|
662
674
|
this.#handleHookResult(hookResult, false, "before", error);
|
|
663
675
|
console.error(error);
|
|
@@ -686,17 +698,15 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
686
698
|
if (afterHooks != null) {
|
|
687
699
|
let hookResult;
|
|
688
700
|
try {
|
|
689
|
-
const
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
hookElement.part.add("running");
|
|
693
|
-
hookElement.classList.remove("success", "fail");
|
|
694
|
-
hookElement.part.remove("success", "fail");
|
|
701
|
+
const afterAllHookElement = this.getElement(`after-all-details`);
|
|
702
|
+
afterAllHookElement.classList.add("running");
|
|
703
|
+
afterAllHookElement.part.add("running");
|
|
695
704
|
for (const [hook, ids] of afterHooks) {
|
|
696
705
|
hookResult = await hook();
|
|
697
706
|
this.#handleHookResult(hookResult, true, "after");
|
|
698
707
|
}
|
|
699
|
-
|
|
708
|
+
afterAllHookElement.part.remove("running");
|
|
709
|
+
afterAllHookElement.classList.remove("running");
|
|
700
710
|
} catch (error) {
|
|
701
711
|
this.#handleHookResult(hookResult, false, "after", error);
|
|
702
712
|
console.error(error);
|
|
@@ -707,6 +717,7 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
707
717
|
const failedTests = this.shadowRoot.querySelectorAll('[success="false"]');
|
|
708
718
|
this.setAttribute("success", failedTests.length == 0 ? "true" : "false");
|
|
709
719
|
this.classList.remove("running");
|
|
720
|
+
this.part.remove("running");
|
|
710
721
|
}
|
|
711
722
|
#clearTestStatuses() {
|
|
712
723
|
for (const [testId, test] of this.#tests) {
|
|
@@ -719,6 +730,14 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
719
730
|
testElement.classList.remove("success", "fail");
|
|
720
731
|
testElement.part.remove("success", "fail");
|
|
721
732
|
}
|
|
733
|
+
const beforeAllHookElement = this.getElement(`before-all-details`);
|
|
734
|
+
beforeAllHookElement.toggleAttribute("success", false);
|
|
735
|
+
beforeAllHookElement.classList.remove("success", "fail");
|
|
736
|
+
beforeAllHookElement.part.remove("success", "fail");
|
|
737
|
+
const afterAllHookElement = this.getElement(`after-all-details`);
|
|
738
|
+
afterAllHookElement.toggleAttribute("success", false);
|
|
739
|
+
afterAllHookElement.classList.remove("success", "fail");
|
|
740
|
+
afterAllHookElement.part.remove("success", "fail");
|
|
722
741
|
}
|
|
723
742
|
async #runTest(testId, test) {
|
|
724
743
|
const testElement = this.getElement("tests").querySelector(`[data-test-id="${testId}"]`);
|
|
@@ -779,6 +798,7 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
779
798
|
this.#continueRunningTests = false;
|
|
780
799
|
} finally {
|
|
781
800
|
testElement?.classList.remove("running");
|
|
801
|
+
testElement?.part.remove("running");
|
|
782
802
|
}
|
|
783
803
|
}
|
|
784
804
|
#handleTestResult(testElement, result, finishedTest, error, beforeOrAfter) {
|
|
@@ -861,12 +881,16 @@ Result:${objectResult.value}`,
|
|
|
861
881
|
const testElement = document.createElement("li");
|
|
862
882
|
testElement.dataset.testId = testId;
|
|
863
883
|
testElement.classList.add("test");
|
|
884
|
+
testElement.part.add("test");
|
|
864
885
|
const detailsElement = document.createElement("details");
|
|
865
886
|
detailsElement.classList.add("test-details");
|
|
887
|
+
detailsElement.part.add("test-details");
|
|
866
888
|
const summaryElement = document.createElement("summary");
|
|
867
889
|
summaryElement.classList.add("test-summary");
|
|
890
|
+
summaryElement.part.add("test-summary");
|
|
868
891
|
const resultIcon = document.createElement("div");
|
|
869
892
|
resultIcon.classList.add("result-icon");
|
|
893
|
+
resultIcon.part.add("result-icon");
|
|
870
894
|
summaryElement.append(resultIcon);
|
|
871
895
|
const descriptionElement = document.createElement("span");
|
|
872
896
|
descriptionElement.classList.add("description", "test-description");
|
|
@@ -874,15 +898,19 @@ Result:${objectResult.value}`,
|
|
|
874
898
|
summaryElement.append(descriptionElement);
|
|
875
899
|
const runButton = document.createElement("button");
|
|
876
900
|
runButton.classList.add("run", "test-run");
|
|
901
|
+
runButton.part.add("run", "test-run");
|
|
877
902
|
runButton.textContent = "Run Test";
|
|
878
903
|
runButton.title = "Run Test";
|
|
879
904
|
summaryElement.append(runButton);
|
|
880
905
|
const beforeResultElement = document.createElement("div");
|
|
881
906
|
beforeResultElement.classList.add("before-result", "test-before-result");
|
|
907
|
+
beforeResultElement.part.add("before-result", "test-before-result");
|
|
882
908
|
const resultElement = document.createElement("div");
|
|
883
909
|
resultElement.classList.add("result", "test-result");
|
|
910
|
+
resultElement.part.add("result", "test-result");
|
|
884
911
|
const afterResultElement = document.createElement("div");
|
|
885
912
|
afterResultElement.classList.add("after-result", "test-after-result");
|
|
913
|
+
afterResultElement.part.add("after-result", "test-after-result");
|
|
886
914
|
detailsElement.append(summaryElement);
|
|
887
915
|
detailsElement.append(beforeResultElement);
|
|
888
916
|
detailsElement.append(resultElement);
|
|
@@ -906,9 +934,13 @@ Result:${objectResult.value}`,
|
|
|
906
934
|
}
|
|
907
935
|
#createDefaultResult(message, success, beforeOrAfter) {
|
|
908
936
|
const codeElement = document.createElement("code");
|
|
937
|
+
codeElement.classList.add("code");
|
|
938
|
+
codeElement.part.add("code");
|
|
909
939
|
const preElement = document.createElement("pre");
|
|
910
940
|
preElement.textContent = message;
|
|
911
|
-
|
|
941
|
+
const className = success == true ? "success-message" : "error-message";
|
|
942
|
+
preElement.classList.add("pre", className);
|
|
943
|
+
preElement.part.add("pre", className);
|
|
912
944
|
codeElement.appendChild(preElement);
|
|
913
945
|
return codeElement;
|
|
914
946
|
}
|
|
@@ -930,8 +962,14 @@ ${error.message}`;
|
|
|
930
962
|
console.error(error);
|
|
931
963
|
}
|
|
932
964
|
const errorElement = document.createElement("li");
|
|
965
|
+
errorElement.classList.add("error", "process-error");
|
|
966
|
+
errorElement.part.add("error", "process-error");
|
|
933
967
|
const codeElement = document.createElement("code");
|
|
968
|
+
codeElement.classList.add("code", "process-error-code");
|
|
969
|
+
codeElement.part.add("code", "process-error-code");
|
|
934
970
|
const preElement = document.createElement("pre");
|
|
971
|
+
preElement.classList.add("pre", "process-error-pre");
|
|
972
|
+
preElement.part.add("pre", "process-error-pre");
|
|
935
973
|
preElement.textContent = message;
|
|
936
974
|
codeElement.append(preElement);
|
|
937
975
|
errorElement.append(codeElement);
|
package/dist/code-tests.js
CHANGED
|
@@ -437,6 +437,19 @@ function expect(value) {
|
|
|
437
437
|
return CodeTests.expect(value);
|
|
438
438
|
}
|
|
439
439
|
|
|
440
|
+
// node_modules/.pnpm/ce-part-utils@0.0.0/node_modules/ce-part-utils/dist/ce-part-utils.js
|
|
441
|
+
var DEFAULT_ELEMENT_SELECTOR = ":not(slot,defs,g,rect,path,circle,ellipse,line,polygon,text,tspan,use,svg image,svg title,desc,template,template *)";
|
|
442
|
+
function assignClassAndIdToPart(shadowRoot) {
|
|
443
|
+
const identifiedElements = [...shadowRoot.querySelectorAll(`${DEFAULT_ELEMENT_SELECTOR}[id]`)];
|
|
444
|
+
for (let i = 0; i < identifiedElements.length; i++) {
|
|
445
|
+
identifiedElements[i].part.add(identifiedElements[i].id);
|
|
446
|
+
}
|
|
447
|
+
const classedElements = [...shadowRoot.querySelectorAll(`${DEFAULT_ELEMENT_SELECTOR}[class]`)];
|
|
448
|
+
for (let i = 0; i < classedElements.length; i++) {
|
|
449
|
+
classedElements[i].part.add(...classedElements[i].classList);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
|
|
440
453
|
// src/code-tests.ts
|
|
441
454
|
var NOTESTDEFINED = Symbol("No Test Defined");
|
|
442
455
|
var COMPONENT_STYLESHEET = new CSSStyleSheet();
|
|
@@ -478,6 +491,7 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
478
491
|
return;
|
|
479
492
|
}
|
|
480
493
|
this.loadTests(testsPath);
|
|
494
|
+
assignClassAndIdToPart(this.shadowRoot);
|
|
481
495
|
}
|
|
482
496
|
disconnectedCallback() {
|
|
483
497
|
this.removeEventListener("click", this.#boundClickHandler);
|
|
@@ -615,17 +629,15 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
615
629
|
if (beforeHooks != null) {
|
|
616
630
|
let hookResult;
|
|
617
631
|
try {
|
|
618
|
-
const
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
hookElement.part.add("running");
|
|
622
|
-
hookElement.classList.remove("success", "fail");
|
|
623
|
-
hookElement.part.remove("success", "fail");
|
|
632
|
+
const beforeAllHookElement = this.getElement(`before-all-details`);
|
|
633
|
+
beforeAllHookElement.classList.add("running");
|
|
634
|
+
beforeAllHookElement.part.add("running");
|
|
624
635
|
for (const [hook, ids] of beforeHooks) {
|
|
625
636
|
hookResult = await hook();
|
|
626
637
|
this.#handleHookResult(hookResult, true, "before");
|
|
627
638
|
}
|
|
628
|
-
|
|
639
|
+
beforeAllHookElement.part.remove("running");
|
|
640
|
+
beforeAllHookElement.classList.remove("running");
|
|
629
641
|
} catch (error) {
|
|
630
642
|
this.#handleHookResult(hookResult, false, "before", error);
|
|
631
643
|
console.error(error);
|
|
@@ -654,17 +666,15 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
654
666
|
if (afterHooks != null) {
|
|
655
667
|
let hookResult;
|
|
656
668
|
try {
|
|
657
|
-
const
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
hookElement.part.add("running");
|
|
661
|
-
hookElement.classList.remove("success", "fail");
|
|
662
|
-
hookElement.part.remove("success", "fail");
|
|
669
|
+
const afterAllHookElement = this.getElement(`after-all-details`);
|
|
670
|
+
afterAllHookElement.classList.add("running");
|
|
671
|
+
afterAllHookElement.part.add("running");
|
|
663
672
|
for (const [hook, ids] of afterHooks) {
|
|
664
673
|
hookResult = await hook();
|
|
665
674
|
this.#handleHookResult(hookResult, true, "after");
|
|
666
675
|
}
|
|
667
|
-
|
|
676
|
+
afterAllHookElement.part.remove("running");
|
|
677
|
+
afterAllHookElement.classList.remove("running");
|
|
668
678
|
} catch (error) {
|
|
669
679
|
this.#handleHookResult(hookResult, false, "after", error);
|
|
670
680
|
console.error(error);
|
|
@@ -675,6 +685,7 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
675
685
|
const failedTests = this.shadowRoot.querySelectorAll('[success="false"]');
|
|
676
686
|
this.setAttribute("success", failedTests.length == 0 ? "true" : "false");
|
|
677
687
|
this.classList.remove("running");
|
|
688
|
+
this.part.remove("running");
|
|
678
689
|
}
|
|
679
690
|
#clearTestStatuses() {
|
|
680
691
|
for (const [testId, test] of this.#tests) {
|
|
@@ -687,6 +698,14 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
687
698
|
testElement.classList.remove("success", "fail");
|
|
688
699
|
testElement.part.remove("success", "fail");
|
|
689
700
|
}
|
|
701
|
+
const beforeAllHookElement = this.getElement(`before-all-details`);
|
|
702
|
+
beforeAllHookElement.toggleAttribute("success", false);
|
|
703
|
+
beforeAllHookElement.classList.remove("success", "fail");
|
|
704
|
+
beforeAllHookElement.part.remove("success", "fail");
|
|
705
|
+
const afterAllHookElement = this.getElement(`after-all-details`);
|
|
706
|
+
afterAllHookElement.toggleAttribute("success", false);
|
|
707
|
+
afterAllHookElement.classList.remove("success", "fail");
|
|
708
|
+
afterAllHookElement.part.remove("success", "fail");
|
|
690
709
|
}
|
|
691
710
|
async #runTest(testId, test) {
|
|
692
711
|
const testElement = this.getElement("tests").querySelector(`[data-test-id="${testId}"]`);
|
|
@@ -747,6 +766,7 @@ var CodeTestsElement = class extends HTMLElement {
|
|
|
747
766
|
this.#continueRunningTests = false;
|
|
748
767
|
} finally {
|
|
749
768
|
testElement?.classList.remove("running");
|
|
769
|
+
testElement?.part.remove("running");
|
|
750
770
|
}
|
|
751
771
|
}
|
|
752
772
|
#handleTestResult(testElement, result, finishedTest, error, beforeOrAfter) {
|
|
@@ -829,12 +849,16 @@ Result:${objectResult.value}`,
|
|
|
829
849
|
const testElement = document.createElement("li");
|
|
830
850
|
testElement.dataset.testId = testId;
|
|
831
851
|
testElement.classList.add("test");
|
|
852
|
+
testElement.part.add("test");
|
|
832
853
|
const detailsElement = document.createElement("details");
|
|
833
854
|
detailsElement.classList.add("test-details");
|
|
855
|
+
detailsElement.part.add("test-details");
|
|
834
856
|
const summaryElement = document.createElement("summary");
|
|
835
857
|
summaryElement.classList.add("test-summary");
|
|
858
|
+
summaryElement.part.add("test-summary");
|
|
836
859
|
const resultIcon = document.createElement("div");
|
|
837
860
|
resultIcon.classList.add("result-icon");
|
|
861
|
+
resultIcon.part.add("result-icon");
|
|
838
862
|
summaryElement.append(resultIcon);
|
|
839
863
|
const descriptionElement = document.createElement("span");
|
|
840
864
|
descriptionElement.classList.add("description", "test-description");
|
|
@@ -842,15 +866,19 @@ Result:${objectResult.value}`,
|
|
|
842
866
|
summaryElement.append(descriptionElement);
|
|
843
867
|
const runButton = document.createElement("button");
|
|
844
868
|
runButton.classList.add("run", "test-run");
|
|
869
|
+
runButton.part.add("run", "test-run");
|
|
845
870
|
runButton.textContent = "Run Test";
|
|
846
871
|
runButton.title = "Run Test";
|
|
847
872
|
summaryElement.append(runButton);
|
|
848
873
|
const beforeResultElement = document.createElement("div");
|
|
849
874
|
beforeResultElement.classList.add("before-result", "test-before-result");
|
|
875
|
+
beforeResultElement.part.add("before-result", "test-before-result");
|
|
850
876
|
const resultElement = document.createElement("div");
|
|
851
877
|
resultElement.classList.add("result", "test-result");
|
|
878
|
+
resultElement.part.add("result", "test-result");
|
|
852
879
|
const afterResultElement = document.createElement("div");
|
|
853
880
|
afterResultElement.classList.add("after-result", "test-after-result");
|
|
881
|
+
afterResultElement.part.add("after-result", "test-after-result");
|
|
854
882
|
detailsElement.append(summaryElement);
|
|
855
883
|
detailsElement.append(beforeResultElement);
|
|
856
884
|
detailsElement.append(resultElement);
|
|
@@ -874,9 +902,13 @@ Result:${objectResult.value}`,
|
|
|
874
902
|
}
|
|
875
903
|
#createDefaultResult(message, success, beforeOrAfter) {
|
|
876
904
|
const codeElement = document.createElement("code");
|
|
905
|
+
codeElement.classList.add("code");
|
|
906
|
+
codeElement.part.add("code");
|
|
877
907
|
const preElement = document.createElement("pre");
|
|
878
908
|
preElement.textContent = message;
|
|
879
|
-
|
|
909
|
+
const className = success == true ? "success-message" : "error-message";
|
|
910
|
+
preElement.classList.add("pre", className);
|
|
911
|
+
preElement.part.add("pre", className);
|
|
880
912
|
codeElement.appendChild(preElement);
|
|
881
913
|
return codeElement;
|
|
882
914
|
}
|
|
@@ -898,8 +930,14 @@ ${error.message}`;
|
|
|
898
930
|
console.error(error);
|
|
899
931
|
}
|
|
900
932
|
const errorElement = document.createElement("li");
|
|
933
|
+
errorElement.classList.add("error", "process-error");
|
|
934
|
+
errorElement.part.add("error", "process-error");
|
|
901
935
|
const codeElement = document.createElement("code");
|
|
936
|
+
codeElement.classList.add("code", "process-error-code");
|
|
937
|
+
codeElement.part.add("code", "process-error-code");
|
|
902
938
|
const preElement = document.createElement("pre");
|
|
939
|
+
preElement.classList.add("pre", "process-error-pre");
|
|
940
|
+
preElement.part.add("pre", "process-error-pre");
|
|
903
941
|
preElement.textContent = message;
|
|
904
942
|
codeElement.append(preElement);
|
|
905
943
|
errorElement.append(codeElement);
|
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;
|
|
@@ -382,15 +382,15 @@ pre
|
|
|
382
382
|
<span id="after-all-description" class="description">Results from After All Hook</span>
|
|
383
383
|
</summary>
|
|
384
384
|
<div id="after-all-results" class="results"></div>
|
|
385
|
-
</details>`;var
|
|
386
|
-
Expected: ${
|
|
387
|
-
Result: ${
|
|
388
|
-
${a.message}`:""}`,
|
|
389
|
-
${a.message}`}`,
|
|
385
|
+
</details>`;var x=class extends Promise{async toBeDefined(t){if(await this==null)throw new Error(`${t??"Value"} is undefined`)}async toBe(t,s=!1){let e=await this;if((s==!0?e===t:e==t)==!1)throw new Error(` Value is not equal.
|
|
386
|
+
Expected: ${t}
|
|
387
|
+
Result: ${e}`)}async toContainText(t){let s=await this}async toHaveAttribute(t){let s=await this;if(!(s instanceof HTMLElement))throw new Error("Unable to check for attribute on non-HTMLElement target");if(s.getAttribute(t))throw new Error("Taret does not have attribute")}},b=Symbol("beforeAll"),y=Symbol("beforeEach"),E=Symbol("afterAll"),k=Symbol("afterEach"),A=class{static timeoutMS=500;static#e;static#p;static expect(t){return new x(async(e,a)=>{if(t instanceof Promise){let r=await t;e(r);return}e(t)})}static expectSync(t){return new x(async(e,a)=>{if(t instanceof Promise){let r=await t;e(r);return}e(t)})}static expectBefore(t){return new x(async(e,a)=>{if(t instanceof Promise){let r=await t;e(r);return}e(t)})}};function q(f){return A.expect(f)}var H=":not(slot,defs,g,rect,path,circle,ellipse,line,polygon,text,tspan,use,svg image,svg title,desc,template,template *)";function $(f){let t=[...f.querySelectorAll(`${H}[id]`)];for(let e=0;e<t.length;e++)t[e].part.add(t[e].id);let s=[...f.querySelectorAll(`${H}[class]`)];for(let e=0;e<s.length;e++)s[e].part.add(...s[e].classList)}var M=Symbol("No Test Defined"),P=new CSSStyleSheet;P.replaceSync(S);var D="code-tests",R=class extends HTMLElement{componentParts=new Map;getElement(t){if(this.componentParts.get(t)==null){let s=this.findElement(t);s!=null&&this.componentParts.set(t,s)}return this.componentParts.get(t)}findElement(t){return this.shadowRoot.getElementById(t)}#e=new Map;#p={[b]:w(),[y]:w(),[k]:w(),[E]:w()};#t=!0;constructor(){super(),this.attachShadow({mode:"open"}),this.shadowRoot.innerHTML=F,this.shadowRoot.adoptedStyleSheets.push(P),this.#c=this.#h.bind(this)}connectedCallback(){this.addEventListener("click",this.#c);let t=this.getAttribute("src")??this.getAttribute("test")??this.getAttribute("tests")??this.getAttribute("run")??this.getAttribute("path");t!=null&&(this.loadTests(t),$(this.shadowRoot))}disconnectedCallback(){this.removeEventListener("click",this.#c)}#c;#h(t){let s=t.composedPath().find(n=>n instanceof HTMLButtonElement&&n.classList.contains("run"));if(s==null)return;let e=s.closest("li");if(e==null){s.hasAttribute("data-all")==!0&&this.runTests();return}let a=e.dataset.testId;if(a==null)return;let r=this.#r.get(a);r!=null&&this.#u(a,r)}async loadTests(t){this.classList.remove("has-before-hook"),this.classList.remove("has-after-hook");try{let s=window.location.href.lastIndexOf("/"),a=window.location.href.substring(s).indexOf(".")!=-1==!0?window.location.href.substring(0,s+1):window.location.href,r=a+t.substring(0,t.lastIndexOf("/")+1),n=a+t,o=await(await fetch(n)).text();o=o.replaceAll(/['"`](((\.\/)|(\.\.\/))+(.*))['"`]/g,`'${r}$1'`);let l=new File([o],t.substring(t.lastIndexOf("/")),{type:"text/javascript"}),c=await import(URL.createObjectURL(l)),u=c.tests??c.default;if(u==null)throw new Error(`Unable to find tests definition in file at path: ${t}`);let g=u[b];if(g!=null){if(this.#e.get(b)==null){let d=new Map;d.set(g,new Set),this.#e.set(b,d)}this.classList.add("has-before-hook")}let m=u[y];if(m!=null&&this.#e.get(y)==null){let d=new Map;d.set(m,new Set),this.#e.set(y,d)}let T=u[E];if(T!=null){if(this.#e.get(E)==null){let d=new Map;d.set(T,new Set),this.#e.set(E,d)}this.classList.add("has-after-hook")}let L=u[k];if(L!=null&&this.#e.get(k)==null){let d=new Map;d.set(L,new Set),this.#e.set(k,d)}for(let[v,d]of Object.entries(u)){let C=this.#g(v,d);if(g!=null){let p=this.#e.get(b);if(p!=null){let h=p.get(g);h?.add(C)}}if(m!=null){let p=this.#e.get(y);if(p!=null){let h=p.get(m);h?.add(C)}}if(T!=null){let p=this.#e.get(E);if(p!=null){let h=p.get(T);h?.add(C)}}if(L!=null){let p=this.#e.get(k);if(p!=null){let h=p.get(L);h?.add(C)}}}}catch(s){this.#i("An error occurred while loading the tasks:",s)}}async runTests(){this.#t=!0,this.classList.add("running"),this.toggleAttribute("success",!1),this.#f();let t=this.hasAttribute("in-order"),s=this.#e.get(b);if(s!=null){let r;try{let n=this.getElement("before-all-details");n.classList.add("running"),n.part.add("running");for(let[o,l]of s)r=await o(),this.#n(r,!0,"before");n.part.remove("running"),n.classList.remove("running")}catch(n){this.#n(r,!1,"before",n),console.error(n),this.#t=!1;return}}if(t==!1){let r=[];for(let[n,o]of this.#r)r.push(this.#u(n,o));await Promise.all(r)}else for(let[r,n]of this.#r){if(this.#t==!1)break;await this.#u(r,n)}if(this.#t==!1)return;let e=this.#e.get(E);if(e!=null){let r;try{let n=this.getElement("after-all-details");n.classList.add("running"),n.part.add("running");for(let[o,l]of e)r=await o(),this.#n(r,!0,"after");n.part.remove("running"),n.classList.remove("running")}catch(n){this.#n(r,!1,"after",n),console.error(n),this.#t=!1;return}}let a=this.shadowRoot.querySelectorAll('[success="false"]');this.setAttribute("success",a.length==0?"true":"false"),this.classList.remove("running"),this.part.remove("running")}#f(){for(let[e,a]of this.#r){let r=this.getElement("tests").querySelector(`[data-test-id="${e}"]`);if(r==null){this.#i(`Unable to find test element for test: ${e}`);return}r.toggleAttribute("success",!1),r.classList.remove("success","fail"),r.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 a=e.querySelector(".error-message");a!=null&&(a.textContent="");let r=e.querySelector("details");r!=null&&(r.open=!1);let n=M,o,l=M,i;try{let c=this.#e.get(y);if(c!=null){for(let[g,m]of c)if(m.has(t)){n=await g();break}}o=await s();let u=this.#e.get(k);if(u!=null){for(let[g,m]of u)if(m.has(t)){l=await g();break}}i="before",n!=M&&this.#a(e,n,!0,void 0,i),i=void 0,this.#a(e,o,!0,void 0,i),i="after",l!=M&&this.#a(e,l,!0,void 0,i)}catch(c){this.#a(e,o,!1,c,i),console.error(c),this.#t=!1}finally{e?.classList.remove("running"),e?.part.remove("running")}}#a(t,s,e,a,r){if(s instanceof HTMLElement)this.#o(t,s,e,r);else if(s==null){let o=r==null?"Passed":"Hook Ran Successfully",l=this.#s(e==!0?`${o}`:`Failed${a!=null?`:
|
|
388
|
+
${a.message}`:""}`,e,r);this.#o(t,l,e,r)}else if(typeof s=="string"){let o=this.#s(`${s}${a==null?"":`:
|
|
389
|
+
${a.message}`}`,e,r);this.#o(t,o,e,r)}else if(typeof s=="object"){let o=s;if(o.success!=null&&o.expected!=null&&o.value!=null){let l=r==null?"Passed":"Success",i=r==null?"Failed":"Fail",c=this.#s(`${o.success==!0?`${l}:`:`${i}:`}
|
|
390
390
|
Expected:${o.expected}
|
|
391
|
-
Result:${o.value}`,o.success,r);this.#o(
|
|
392
|
-
${a.message}`:""}`,s),this.#l(n,s,
|
|
393
|
-
${a.message}`}`,s),this.#l(n,s,
|
|
391
|
+
Result:${o.value}`,o.success,r);this.#o(t,c,e,r)}}let n=t.querySelector("details");n!=null&&(n.open=!0)}#n(t,s,e,a){if(t instanceof HTMLElement)this.#l(t,s,e);else{let n;if(t==null)n=this.#s(s==!0?"Hook Ran Successfully":`Failed${a!=null?`:
|
|
392
|
+
${a.message}`:""}`,s),this.#l(n,s,e);else if(typeof t=="string")n=this.#s(`${t}${a==null?"":`:
|
|
393
|
+
${a.message}`}`,s),this.#l(n,s,e);else if(typeof t=="object"){let o=t;o.success!=null&&o.expected!=null&&o.value!=null&&(n=this.#s(`${o.success==!0?"Success:":"Fail:"}
|
|
394
394
|
Expected:${o.expected}
|
|
395
|
-
Result:${o.value}`,o.success),this.#l(n,s,
|
|
396
|
-
${s.message}`,console.error(s));let
|
|
395
|
+
Result:${o.value}`,o.success),this.#l(n,s,e))}}let r=this.getElement(`${e}-all-details`);r!=null&&(r.open=!0)}static create(t){let s=document.createElement("code-tests");return console.log(t),s}#r=new Map;#g(t,s){let e=w();this.#r.set(e,s);let a=this.#m(e,t);return this.getElement("tests").append(a),e}#m(t,s){let e=document.createElement("li");e.dataset.testId=t,e.classList.add("test"),e.part.add("test");let a=document.createElement("details");a.classList.add("test-details"),a.part.add("test-details");let r=document.createElement("summary");r.classList.add("test-summary"),r.part.add("test-summary");let n=document.createElement("div");n.classList.add("result-icon"),n.part.add("result-icon"),r.append(n);let o=document.createElement("span");o.classList.add("description","test-description"),o.textContent=s,r.append(o);let l=document.createElement("button");l.classList.add("run","test-run"),l.part.add("run","test-run"),l.textContent="Run Test",l.title="Run Test",r.append(l);let i=document.createElement("div");i.classList.add("before-result","test-before-result"),i.part.add("before-result","test-before-result");let c=document.createElement("div");c.classList.add("result","test-result"),c.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"),a.append(r),a.append(i),a.append(c),a.append(u),e.append(a),e}#o(t,s,e,a){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 r=t.querySelector(`.${a==null?"result":a=="before"?"before-result":"after-result"}`);if(r==null){this.#i("Unable to find result element");return}r.innerHTML="",r.appendChild(s)}#s(t,s,e){let a=document.createElement("code");a.classList.add("code"),a.part.add("code");let r=document.createElement("pre");r.textContent=t;let n=s==!0?"success-message":"error-message";return r.classList.add("pre",n),r.part.add("pre",n),a.appendChild(r),a}#l(t,s,e){let a=this.getElement(`${e}-all-details`),r=this.getElement(`${e}-all-results`);a.setAttribute("success",s==!0?"true":"false"),a.classList.toggle("success",s),a.part.toggle("success",s),a.classList.toggle("fail",!s),a.part.toggle("fail",!s),r.innerHTML="",r.appendChild(t)}#i(t,s){s instanceof Error&&(t+=`
|
|
396
|
+
${s.message}`,console.error(s));let e=document.createElement("li");e.classList.add("error","process-error"),e.part.add("error","process-error");let a=document.createElement("code");a.classList.add("code","process-error-code"),a.part.add("code","process-error-code");let r=document.createElement("pre");r.classList.add("pre","process-error-pre"),r.part.add("pre","process-error-pre"),r.textContent=t,a.append(r),e.append(a),this.getElement("tests").append(e)}#d(t){if(t=="ordered"){let s=this.shadowRoot.querySelector("ul");if(s==null)return;let e=this.shadowRoot?.querySelectorAll("li"),a=document.createElement("ol");e!=null&&a.append(...e),a.id="tests",s.replaceWith(a)}else{let s=this.shadowRoot.querySelector("ol");if(s==null)return;let e=this.shadowRoot?.querySelectorAll("li"),a=document.createElement("ul");a.id="tests",e!=null&&a.append(...e),s.replaceWith(a)}}static observedAttributes=["in-order"];attributeChangedCallback(t,s,e){t=="in-order"&&(e==null?this.#d("unordered"):this.#d("ordered"))}};function w(){let f=new Uint8Array(20);crypto.getRandomValues(f);let t=[].slice.apply(f).map(function(e){return String.fromCharCode(e)}).join("");return btoa(t).replace(/\//g,"_").replace(/\+/g,"-").replace(/=/g,"")}customElements.get(D)==null&&customElements.define(D,R);export{E as AFTERALL,k as AFTEREACH,b as BEFOREALL,y as BEFOREEACH,A as CodeTests,R as CodeTestsElement,q as expect};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@magnit-ce/code-tests",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.2",
|
|
4
4
|
"description": "A custom html element that provides a selection gallery as a dialog, to mimic an os-native file browser.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/code-tests.js",
|
|
@@ -34,11 +34,15 @@
|
|
|
34
34
|
"tsup": "^8.2.0",
|
|
35
35
|
"typescript": "^5.5.3"
|
|
36
36
|
},
|
|
37
|
+
"dependencies": {
|
|
38
|
+
"ce-part-utils": "^0.0.0"
|
|
39
|
+
},
|
|
37
40
|
"scripts": {
|
|
38
41
|
"build": "tsup src/code-tests.ts --format cjs,esm --dts --clean",
|
|
39
42
|
"minify": "tsup src/code-tests.ts --format esm --config ./tsup.config.min.ts --outDir ./dist --minify",
|
|
43
|
+
"copyToDemo": "node -e \"const fs = require('fs'); fs.cpSync('dist', 'demo/dist', {recursive: true});\"",
|
|
40
44
|
"lint": "tsup src/code-tests.ts --format esm --tsconfig ./tsconfig.lint.json",
|
|
41
|
-
"package": "npm run build && npm run minify",
|
|
45
|
+
"package": "npm run build && npm run minify && npm run copyToDemo",
|
|
42
46
|
"release": "npm run package && changeset publish"
|
|
43
47
|
}
|
|
44
48
|
}
|