@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.
@@ -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.runTests();
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
- const beforeHooks = this.#hooks.get(BEFOREEACH);
858
- if (beforeHooks != null) {
859
- for (const [hook, ids] of beforeHooks) {
860
- if (ids.has(testId)) {
861
- beforeResult = await hook(this, testElement);
862
- break;
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
- testResult = await test(this, testElement);
867
- const afterHooks = this.#hooks.get(AFTEREACH);
868
- if (afterHooks != null) {
869
- for (const [hook, ids] of afterHooks) {
870
- if (ids.has(testId)) {
871
- afterResult = await hook(this, testElement);
872
- break;
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
- testType = "before";
877
- if (beforeResult != NOTESTDEFINED) {
878
- this.#handleTestResult(testElement, beforeResult, true, void 0, testType);
879
- }
880
- testType = void 0;
881
- this.#handleTestResult(testElement, testResult, true, void 0, testType);
882
- testType = "after";
883
- if (afterResult != NOTESTDEFINED) {
884
- this.#handleTestResult(testElement, afterResult, true, void 0, testType);
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();
@@ -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[];
@@ -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[];
@@ -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.runTests();
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
- const beforeHooks = this.#hooks.get(BEFOREEACH);
824
- if (beforeHooks != null) {
825
- for (const [hook, ids] of beforeHooks) {
826
- if (ids.has(testId)) {
827
- beforeResult = await hook(this, testElement);
828
- break;
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
- testResult = await test(this, testElement);
833
- const afterHooks = this.#hooks.get(AFTEREACH);
834
- if (afterHooks != null) {
835
- for (const [hook, ids] of afterHooks) {
836
- if (ids.has(testId)) {
837
- afterResult = await hook(this, testElement);
838
- break;
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
- testType = "before";
843
- if (beforeResult != NOTESTDEFINED) {
844
- this.#handleTestResult(testElement, beforeResult, true, void 0, testType);
845
- }
846
- testType = void 0;
847
- this.#handleTestResult(testElement, testResult, true, void 0, testType);
848
- testType = "after";
849
- if (afterResult != NOTESTDEFINED) {
850
- this.#handleTestResult(testElement, afterResult, true, void 0, testType);
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();
@@ -1,4 +1,4 @@
1
- var R=`:host
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")}},y=Symbol("beforeAll"),v=Symbol("beforeEach"),k=Symbol("afterAll"),x=Symbol("afterEach"),L=class d{static timeoutMS=500;static#e;static#p;static expect(t){return new T(async(e,r)=>{if(t instanceof Promise){let 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)})}static async prompt(t,s,e,r){return new Promise((a,n)=>{let o=t.findElement("prompt-template"),l=d.createElementFromTemplate(o);l.querySelector(".label").textContent=e;let u=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",u),a(i);return}if(f.find(i=>i instanceof HTMLButtonElement&&i.classList.contains("reject"))!=null){let i=r?.onReject?.()??!1;l.removeEventListener("click",u),a(i);return}};l.addEventListener("click",u),r?.acceptLabel!=null&&(l.querySelector(".accept").textContent=r.acceptLabel),r?.rejectLabel!=null&&(l.querySelector(".reject").textContent=r.rejectLabel);let c=s instanceof HTMLDetailsElement?s:s.querySelector(".test-details");c!=null&&(c.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(R);var B="code-tests",S=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]:C(),[v]:C(),[x]:C(),[k]:C()};#t=!0;constructor(){super(),this.attachShadow({mode:"open"}),this.shadowRoot.innerHTML=F,this.shadowRoot.adoptedStyleSheets.push(D),this.#c=this.#h.bind(this)}connectedCallback(){if(P(this.shadowRoot),this.addEventListener("click",this.#c),this.getAttribute("auto")=="false")return;let t=this.getAttribute("src")??this.getAttribute("test")??this.getAttribute("tests")??this.getAttribute("run")??this.getAttribute("path");t!=null&&this.loadTests(t)}disconnectedCallback(){this.removeEventListener("click",this.#c)}#c;#h(t){let s=t.composedPath().find(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)}#f(){return this.getAttribute("src")??this.getAttribute("test")??this.getAttribute("tests")??this.getAttribute("run")??this.getAttribute("path")}async loadTests(t){let s=t??this.#f();if(s!=null)try{this.getElement("tests").innerHTML="",this.#s.clear(),this.classList.remove("has-before-hook"),this.classList.remove("has-after-hook");let e=window.location.href.lastIndexOf("/"),a=window.location.href.substring(e).indexOf(".")!=-1==!0?window.location.href.substring(0,e+1):window.location.href,n=a+s.substring(0,s.lastIndexOf("/")+1),o=a+s,l=await(await fetch(o)).text();l=l.replaceAll(/['"`](((\.\/)|(\.\.\/))+(.*))['"`]/g,`'${n}$1'`);let u=new File([l],s.substring(s.lastIndexOf("/")),{type:"text/javascript"}),h=await import(URL.createObjectURL(u)),f=h.tests??h.default;if(f==null)throw new Error(`Unable to find tests definition in file at path: ${s}`);let E=f[y];if(E!=null){if(this.#e.get(y)==null){let p=new Map;p.set(E,new Set),this.#e.set(y,p)}this.classList.add("has-before-hook")}let b=f[v];if(b!=null&&this.#e.get(v)==null){let p=new Map;p.set(b,new Set),this.#e.set(v,p)}let i=f[k];if(i!=null){if(this.#e.get(k)==null){let p=new Map;p.set(i,new Set),this.#e.set(k,p)}this.classList.add("has-after-hook")}let A=f[x];if(A!=null&&this.#e.get(x)==null){let p=new Map;p.set(A,new Set),this.#e.set(x,p)}for(let[w,p]of Object.entries(f)){let M=this.#g(w,p);if(E!=null){let m=this.#e.get(y);if(m!=null){let g=m.get(E);g?.add(M)}}if(b!=null){let m=this.#e.get(v);if(m!=null){let g=m.get(b);g?.add(M)}}if(i!=null){let m=this.#e.get(k);if(m!=null){let g=m.get(i);g?.add(M)}}if(A!=null){let m=this.#e.get(x);if(m!=null){let g=m.get(A);g?.add(M)}}}}catch(e){this.#i("An error occurred while loading the tasks:",e)}}async runTests(){this.dispatchEvent(new CustomEvent("beforeall",{bubbles:!0,composed:!0})),this.#t=!0,this.classList.add("running"),this.toggleAttribute("success",!1),this.#m();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),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),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}))}#m(){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=H,l,u=H,c;try{if(this.dispatchEvent(new CustomEvent("beforetest",{bubbles:!0,cancelable:!0,composed:!0,detail:{testElement:e}}))==!0){let f=this.#e.get(v);if(f!=null){for(let[b,i]of f)if(i.has(t)){o=await b(this,e);break}}l=await s(this,e);let E=this.#e.get(x);if(E!=null){for(let[b,i]of E)if(i.has(t)){u=await b(this,e);break}}c="before",o!=H&&this.#a(e,o,!0,void 0,c),c=void 0,this.#a(e,l,!0,void 0,c),c="after",u!=H&&this.#a(e,u,!0,void 0,c)}}catch(h){this.#a(e,l,!1,h,c),console.error(h),this.#t=!1}finally{e?.classList.remove("running"),e?.part.remove("running"),r?.classList.remove("running"),r?.part.remove("running"),this.dispatchEvent(new CustomEvent("aftertest",{bubbles:!0,cancelable:!0,composed:!0,detail:{testElement:e}}))}}#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?`:
402
- ${r.message}`:""}`,e,a);this.#o(t,l,e,a)}else if(typeof s=="string"){let o=this.#r(`${s}${r==null?"":`:
403
- ${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",u=a==null?"Failed":"Fail",c=this.#r(`${o.success==!0?`${l}:`:`${u}:`}
404
- Expected:${o.expected}
405
- Result:${o.value}`,o.success,a);this.#o(t,c,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?`:
406
- ${r.message}`:""}`,s),this.#l(n,s,e);else if(typeof t=="string")n=this.#r(`${t}${r==null?"":`:
407
- ${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:"}
408
- Expected:${o.expected}
409
- 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=C();this.#s.set(e,s);let r=this.#b(e,t);return this.getElement("tests").append(r),e}#b(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 u=document.createElement("div");u.classList.add("before-result","test-before-result"),u.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 h=document.createElement("div");return h.classList.add("after-result","test-after-result"),h.part.add("after-result","test-after-result"),r.append(a),r.append(u),r.append(c),r.append(h),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+=`
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 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 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,S);export{k as AFTERALL,x as AFTEREACH,y as BEFOREALL,v as BEFOREEACH,N as CodeTestEventType,L as CodeTests,S as CodeTestsElement,I as expect,U as prompt};
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};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@magnit-ce/code-tests",
3
- "version": "0.0.6",
3
+ "version": "0.0.8",
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",