@magnit-ce/code-tests 0.0.1 → 0.0.2

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