@magnit-ce/code-tests 0.0.2 → 0.0.4

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