docs(tests): add tests/README.md and stable ForEach / LazyLoad / VirtualScroll tests - #24

Merged
joaodibba merged 2 commits into
TypeComposer:mainfrom
lucas-spin:docs/tests-readme-and-async-component-tests
Jun 15, 2026
Merged

docs(tests): add tests/README.md and stable ForEach / LazyLoad / VirtualScroll tests#24
joaodibba merged 2 commits into
TypeComposer:mainfrom
lucas-spin:docs/tests-readme-and-async-component-tests

Conversation

@lucas-spin

@lucas-spinlucas-spin commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

Summary

Closes two deferred roadmap items from PR #15:

  1. tests/README.md — contributor documentation for the test suite.
  2. tests/async-components.test.ts — stable tests for ForEach, LazyLoad, and VirtualScroll.

What's in each file

tests/README.md

SectionWhat it covers
Running testsnpm run test (watch) vs npm run test:run (CI)
Test structureEvery file in tests/, what each one tests
tests/utils.ts render helperrender() signature, auto-cleanup, example
tests/setup.tsMemoryStorage polyfill, beforeEach storage clear
Assertion patternsDOM structure, styles, reactivity, async flush
happy-dom layout limitationsWhich APIs return 0 and how to avoid brittle tests
vitest.config.ts referenceEnvironment, globals, setupFiles
Adding new testsStep-by-step checklist

tests/async-components.test.ts

ForEach (11 tests): custom element tag, empty innerHTML, item getter default, of setter/getAttribute round-trip, apply() no-throw and innerHTML-clear contract.

LazyLoad (11 tests): custom element tag, loader/loaderProps stored correctly, Component.lazyLoad spy asserts it is called with correct fallback/props on onConnected, not called when no loader provided.

VirtualScroll (13 tests, 1 skipped): custom element tag, inner container presence and position: relative, total height = items.length × itemHeight, overflow-y: auto, initial render slice under happy-dom (scrollTop=0buffer items), custom buffer, empty items, absolute positioning + px top + 100% width, renderItem factory call count, top = index × itemHeight, scroll event no-throw. Scroll-position windowing skipped with a note pointing to E2E.


Validation

npm run test:run
npx tsc --noEmit
Test Files 10 passed (10)
Tests 207 passed | 1 skipped (208)
Duration ~9s
tsc --noEmit: no errors

All pre-existing tests continue to pass.


Reviewers

@zico15

TypeComposer Contributorand others added 2 commits June 15, 2026 20:21
…croll tests
- Add tests/README.md documenting npm run test, npm run test:run,
the render() helper in tests/utils.ts, setup.ts behavior,
and recommended assertion patterns including happy-dom limitations.
- Add tests/async-components.test.ts covering:
* ForEach: construction, attribute handling, apply() contract,
and notes on why HTML-template rendering requires an HTML fixture
(the #content capture is commented out in the current source).
* LazyLoad: construction with and without loader, loaderProps storage,
Component.lazyLoad invocation via the onConnected event path,
and notes on why IntersectionObserver tests need a real browser.
* VirtualScroll: construction, inner container height/position,
overflow style, initial render slice under happy-dom (scrollTop=0
collapses the window to [0, buffer)), renderItem factory invocation,
absolute positioning of rendered items, and a skipped describe block
documenting the scroll-windowing tests deferred to E2E.
All 209 tests pass; 1 test skipped with explanation.
@joaodibba
joaodibba merged commit 0b8c361 into TypeComposer:mainJun 15, 2026
2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@lucas-spin@joaodibba
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

docs(tests): add tests/README.md and stable ForEach / LazyLoad / VirtualScroll tests - #24

Merged
joaodibba merged 2 commits into
TypeComposer:mainfrom
lucas-spin:docs/tests-readme-and-async-component-tests
Jun 15, 2026
Merged

docs(tests): add tests/README.md and stable ForEach / LazyLoad / VirtualScroll tests#24
joaodibba merged 2 commits into
TypeComposer:mainfrom
lucas-spin:docs/tests-readme-and-async-component-tests

Conversation

@lucas-spin

@lucas-spinlucas-spin commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

Summary

Closes two deferred roadmap items from PR #15:

  1. tests/README.md — contributor documentation for the test suite.
  2. tests/async-components.test.ts — stable tests for ForEach, LazyLoad, and VirtualScroll.

What's in each file

tests/README.md

SectionWhat it covers
Running testsnpm run test (watch) vs npm run test:run (CI)
Test structureEvery file in tests/, what each one tests
tests/utils.ts render helperrender() signature, auto-cleanup, example
tests/setup.tsMemoryStorage polyfill, beforeEach storage clear
Assertion patternsDOM structure, styles, reactivity, async flush
happy-dom layout limitationsWhich APIs return 0 and how to avoid brittle tests
vitest.config.ts referenceEnvironment, globals, setupFiles
Adding new testsStep-by-step checklist

tests/async-components.test.ts

ForEach (11 tests): custom element tag, empty innerHTML, item getter default, of setter/getAttribute round-trip, apply() no-throw and innerHTML-clear contract.

LazyLoad (11 tests): custom element tag, loader/loaderProps stored correctly, Component.lazyLoad spy asserts it is called with correct fallback/props on onConnected, not called when no loader provided.

VirtualScroll (13 tests, 1 skipped): custom element tag, inner container presence and position: relative, total height = items.length × itemHeight, overflow-y: auto, initial render slice under happy-dom (scrollTop=0buffer items), custom buffer, empty items, absolute positioning + px top + 100% width, renderItem factory call count, top = index × itemHeight, scroll event no-throw. Scroll-position windowing skipped with a note pointing to E2E.


Validation

npm run test:run
npx tsc --noEmit
Test Files 10 passed (10)
Tests 207 passed | 1 skipped (208)
Duration ~9s
tsc --noEmit: no errors

All pre-existing tests continue to pass.


Reviewers

@zico15

TypeComposer Contributorand others added 2 commits June 15, 2026 20:21
…croll tests
- Add tests/README.md documenting npm run test, npm run test:run,
the render() helper in tests/utils.ts, setup.ts behavior,
and recommended assertion patterns including happy-dom limitations.
- Add tests/async-components.test.ts covering:
* ForEach: construction, attribute handling, apply() contract,
and notes on why HTML-template rendering requires an HTML fixture
(the #content capture is commented out in the current source).
* LazyLoad: construction with and without loader, loaderProps storage,
Component.lazyLoad invocation via the onConnected event path,
and notes on why IntersectionObserver tests need a real browser.
* VirtualScroll: construction, inner container height/position,
overflow style, initial render slice under happy-dom (scrollTop=0
collapses the window to [0, buffer)), renderItem factory invocation,
absolute positioning of rendered items, and a skipped describe block
documenting the scroll-windowing tests deferred to E2E.
All 209 tests pass; 1 test skipped with explanation.
@joaodibba
joaodibba merged commit 0b8c361 into TypeComposer:mainJun 15, 2026
2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@lucas-spin@joaodibba
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

docs(tests): add tests/README.md and stable ForEach / LazyLoad / VirtualScroll tests - #24

Merged
joaodibba merged 2 commits into
TypeComposer:mainfrom
lucas-spin:docs/tests-readme-and-async-component-tests
Jun 15, 2026
Merged

docs(tests): add tests/README.md and stable ForEach / LazyLoad / VirtualScroll tests#24
joaodibba merged 2 commits into
TypeComposer:mainfrom
lucas-spin:docs/tests-readme-and-async-component-tests

Conversation

@lucas-spin

@lucas-spinlucas-spin commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

Summary

Closes two deferred roadmap items from PR #15:

  1. tests/README.md — contributor documentation for the test suite.
  2. tests/async-components.test.ts — stable tests for ForEach, LazyLoad, and VirtualScroll.

What's in each file

tests/README.md

SectionWhat it covers
Running testsnpm run test (watch) vs npm run test:run (CI)
Test structureEvery file in tests/, what each one tests
tests/utils.ts render helperrender() signature, auto-cleanup, example
tests/setup.tsMemoryStorage polyfill, beforeEach storage clear
Assertion patternsDOM structure, styles, reactivity, async flush
happy-dom layout limitationsWhich APIs return 0 and how to avoid brittle tests
vitest.config.ts referenceEnvironment, globals, setupFiles
Adding new testsStep-by-step checklist

tests/async-components.test.ts

ForEach (11 tests): custom element tag, empty innerHTML, item getter default, of setter/getAttribute round-trip, apply() no-throw and innerHTML-clear contract.

LazyLoad (11 tests): custom element tag, loader/loaderProps stored correctly, Component.lazyLoad spy asserts it is called with correct fallback/props on onConnected, not called when no loader provided.

VirtualScroll (13 tests, 1 skipped): custom element tag, inner container presence and position: relative, total height = items.length × itemHeight, overflow-y: auto, initial render slice under happy-dom (scrollTop=0buffer items), custom buffer, empty items, absolute positioning + px top + 100% width, renderItem factory call count, top = index × itemHeight, scroll event no-throw. Scroll-position windowing skipped with a note pointing to E2E.


Validation

npm run test:run
npx tsc --noEmit
Test Files 10 passed (10)
Tests 207 passed | 1 skipped (208)
Duration ~9s
tsc --noEmit: no errors

All pre-existing tests continue to pass.


Reviewers

@zico15

TypeComposer Contributorand others added 2 commits June 15, 2026 20:21
…croll tests
- Add tests/README.md documenting npm run test, npm run test:run,
the render() helper in tests/utils.ts, setup.ts behavior,
and recommended assertion patterns including happy-dom limitations.
- Add tests/async-components.test.ts covering:
* ForEach: construction, attribute handling, apply() contract,
and notes on why HTML-template rendering requires an HTML fixture
(the #content capture is commented out in the current source).
* LazyLoad: construction with and without loader, loaderProps storage,
Component.lazyLoad invocation via the onConnected event path,
and notes on why IntersectionObserver tests need a real browser.
* VirtualScroll: construction, inner container height/position,
overflow style, initial render slice under happy-dom (scrollTop=0
collapses the window to [0, buffer)), renderItem factory invocation,
absolute positioning of rendered items, and a skipped describe block
documenting the scroll-windowing tests deferred to E2E.
All 209 tests pass; 1 test skipped with explanation.
@joaodibba
joaodibba merged commit 0b8c361 into TypeComposer:mainJun 15, 2026
2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@lucas-spin@joaodibba
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

docs(tests): add tests/README.md and stable ForEach / LazyLoad / VirtualScroll tests - #24

Merged
joaodibba merged 2 commits into
TypeComposer:mainfrom
lucas-spin:docs/tests-readme-and-async-component-tests
Jun 15, 2026
Merged

docs(tests): add tests/README.md and stable ForEach / LazyLoad / VirtualScroll tests#24
joaodibba merged 2 commits into
TypeComposer:mainfrom
lucas-spin:docs/tests-readme-and-async-component-tests

Conversation

@lucas-spin

@lucas-spinlucas-spin commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

Summary

Closes two deferred roadmap items from PR #15:

  1. tests/README.md — contributor documentation for the test suite.
  2. tests/async-components.test.ts — stable tests for ForEach, LazyLoad, and VirtualScroll.

What's in each file

tests/README.md

SectionWhat it covers
Running testsnpm run test (watch) vs npm run test:run (CI)
Test structureEvery file in tests/, what each one tests
tests/utils.ts render helperrender() signature, auto-cleanup, example
tests/setup.tsMemoryStorage polyfill, beforeEach storage clear
Assertion patternsDOM structure, styles, reactivity, async flush
happy-dom layout limitationsWhich APIs return 0 and how to avoid brittle tests
vitest.config.ts referenceEnvironment, globals, setupFiles
Adding new testsStep-by-step checklist

tests/async-components.test.ts

ForEach (11 tests): custom element tag, empty innerHTML, item getter default, of setter/getAttribute round-trip, apply() no-throw and innerHTML-clear contract.

LazyLoad (11 tests): custom element tag, loader/loaderProps stored correctly, Component.lazyLoad spy asserts it is called with correct fallback/props on onConnected, not called when no loader provided.

VirtualScroll (13 tests, 1 skipped): custom element tag, inner container presence and position: relative, total height = items.length × itemHeight, overflow-y: auto, initial render slice under happy-dom (scrollTop=0buffer items), custom buffer, empty items, absolute positioning + px top + 100% width, renderItem factory call count, top = index × itemHeight, scroll event no-throw. Scroll-position windowing skipped with a note pointing to E2E.


Validation

npm run test:run
npx tsc --noEmit
Test Files 10 passed (10)
Tests 207 passed | 1 skipped (208)
Duration ~9s
tsc --noEmit: no errors

All pre-existing tests continue to pass.


Reviewers

@zico15

TypeComposer Contributorand others added 2 commits June 15, 2026 20:21
…croll tests
- Add tests/README.md documenting npm run test, npm run test:run,
the render() helper in tests/utils.ts, setup.ts behavior,
and recommended assertion patterns including happy-dom limitations.
- Add tests/async-components.test.ts covering:
* ForEach: construction, attribute handling, apply() contract,
and notes on why HTML-template rendering requires an HTML fixture
(the #content capture is commented out in the current source).
* LazyLoad: construction with and without loader, loaderProps storage,
Component.lazyLoad invocation via the onConnected event path,
and notes on why IntersectionObserver tests need a real browser.
* VirtualScroll: construction, inner container height/position,
overflow style, initial render slice under happy-dom (scrollTop=0
collapses the window to [0, buffer)), renderItem factory invocation,
absolute positioning of rendered items, and a skipped describe block
documenting the scroll-windowing tests deferred to E2E.
All 209 tests pass; 1 test skipped with explanation.
@joaodibba
joaodibba merged commit 0b8c361 into TypeComposer:mainJun 15, 2026
2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@lucas-spin@joaodibba
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

docs(tests): add tests/README.md and stable ForEach / LazyLoad / VirtualScroll tests - #24

Merged
joaodibba merged 2 commits into
TypeComposer:mainfrom
lucas-spin:docs/tests-readme-and-async-component-tests
Jun 15, 2026
Merged

docs(tests): add tests/README.md and stable ForEach / LazyLoad / VirtualScroll tests#24
joaodibba merged 2 commits into
TypeComposer:mainfrom
lucas-spin:docs/tests-readme-and-async-component-tests

Conversation

@lucas-spin

@lucas-spinlucas-spin commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

Summary

Closes two deferred roadmap items from PR #15:

  1. tests/README.md — contributor documentation for the test suite.
  2. tests/async-components.test.ts — stable tests for ForEach, LazyLoad, and VirtualScroll.

What's in each file

tests/README.md

SectionWhat it covers
Running testsnpm run test (watch) vs npm run test:run (CI)
Test structureEvery file in tests/, what each one tests
tests/utils.ts render helperrender() signature, auto-cleanup, example
tests/setup.tsMemoryStorage polyfill, beforeEach storage clear
Assertion patternsDOM structure, styles, reactivity, async flush
happy-dom layout limitationsWhich APIs return 0 and how to avoid brittle tests
vitest.config.ts referenceEnvironment, globals, setupFiles
Adding new testsStep-by-step checklist

tests/async-components.test.ts

ForEach (11 tests): custom element tag, empty innerHTML, item getter default, of setter/getAttribute round-trip, apply() no-throw and innerHTML-clear contract.

LazyLoad (11 tests): custom element tag, loader/loaderProps stored correctly, Component.lazyLoad spy asserts it is called with correct fallback/props on onConnected, not called when no loader provided.

VirtualScroll (13 tests, 1 skipped): custom element tag, inner container presence and position: relative, total height = items.length × itemHeight, overflow-y: auto, initial render slice under happy-dom (scrollTop=0buffer items), custom buffer, empty items, absolute positioning + px top + 100% width, renderItem factory call count, top = index × itemHeight, scroll event no-throw. Scroll-position windowing skipped with a note pointing to E2E.


Validation

npm run test:run
npx tsc --noEmit
Test Files 10 passed (10)
Tests 207 passed | 1 skipped (208)
Duration ~9s
tsc --noEmit: no errors

All pre-existing tests continue to pass.


Reviewers

@zico15

TypeComposer Contributorand others added 2 commits June 15, 2026 20:21
…croll tests
- Add tests/README.md documenting npm run test, npm run test:run,
the render() helper in tests/utils.ts, setup.ts behavior,
and recommended assertion patterns including happy-dom limitations.
- Add tests/async-components.test.ts covering:
* ForEach: construction, attribute handling, apply() contract,
and notes on why HTML-template rendering requires an HTML fixture
(the #content capture is commented out in the current source).
* LazyLoad: construction with and without loader, loaderProps storage,
Component.lazyLoad invocation via the onConnected event path,
and notes on why IntersectionObserver tests need a real browser.
* VirtualScroll: construction, inner container height/position,
overflow style, initial render slice under happy-dom (scrollTop=0
collapses the window to [0, buffer)), renderItem factory invocation,
absolute positioning of rendered items, and a skipped describe block
documenting the scroll-windowing tests deferred to E2E.
All 209 tests pass; 1 test skipped with explanation.
@joaodibba
joaodibba merged commit 0b8c361 into TypeComposer:mainJun 15, 2026
2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@lucas-spin@joaodibba
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

docs(tests): add tests/README.md and stable ForEach / LazyLoad / VirtualScroll tests - #24

Merged
joaodibba merged 2 commits into
TypeComposer:mainfrom
lucas-spin:docs/tests-readme-and-async-component-tests
Jun 15, 2026
Merged

docs(tests): add tests/README.md and stable ForEach / LazyLoad / VirtualScroll tests#24
joaodibba merged 2 commits into
TypeComposer:mainfrom
lucas-spin:docs/tests-readme-and-async-component-tests

Conversation

@lucas-spin

@lucas-spinlucas-spin commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

Summary

Closes two deferred roadmap items from PR #15:

  1. tests/README.md — contributor documentation for the test suite.
  2. tests/async-components.test.ts — stable tests for ForEach, LazyLoad, and VirtualScroll.

What's in each file

tests/README.md

SectionWhat it covers
Running testsnpm run test (watch) vs npm run test:run (CI)
Test structureEvery file in tests/, what each one tests
tests/utils.ts render helperrender() signature, auto-cleanup, example
tests/setup.tsMemoryStorage polyfill, beforeEach storage clear
Assertion patternsDOM structure, styles, reactivity, async flush
happy-dom layout limitationsWhich APIs return 0 and how to avoid brittle tests
vitest.config.ts referenceEnvironment, globals, setupFiles
Adding new testsStep-by-step checklist

tests/async-components.test.ts

ForEach (11 tests): custom element tag, empty innerHTML, item getter default, of setter/getAttribute round-trip, apply() no-throw and innerHTML-clear contract.

LazyLoad (11 tests): custom element tag, loader/loaderProps stored correctly, Component.lazyLoad spy asserts it is called with correct fallback/props on onConnected, not called when no loader provided.

VirtualScroll (13 tests, 1 skipped): custom element tag, inner container presence and position: relative, total height = items.length × itemHeight, overflow-y: auto, initial render slice under happy-dom (scrollTop=0buffer items), custom buffer, empty items, absolute positioning + px top + 100% width, renderItem factory call count, top = index × itemHeight, scroll event no-throw. Scroll-position windowing skipped with a note pointing to E2E.


Validation

npm run test:run
npx tsc --noEmit
Test Files 10 passed (10)
Tests 207 passed | 1 skipped (208)
Duration ~9s
tsc --noEmit: no errors

All pre-existing tests continue to pass.


Reviewers

@zico15

TypeComposer Contributorand others added 2 commits June 15, 2026 20:21
…croll tests
- Add tests/README.md documenting npm run test, npm run test:run,
the render() helper in tests/utils.ts, setup.ts behavior,
and recommended assertion patterns including happy-dom limitations.
- Add tests/async-components.test.ts covering:
* ForEach: construction, attribute handling, apply() contract,
and notes on why HTML-template rendering requires an HTML fixture
(the #content capture is commented out in the current source).
* LazyLoad: construction with and without loader, loaderProps storage,
Component.lazyLoad invocation via the onConnected event path,
and notes on why IntersectionObserver tests need a real browser.
* VirtualScroll: construction, inner container height/position,
overflow style, initial render slice under happy-dom (scrollTop=0
collapses the window to [0, buffer)), renderItem factory invocation,
absolute positioning of rendered items, and a skipped describe block
documenting the scroll-windowing tests deferred to E2E.
All 209 tests pass; 1 test skipped with explanation.
@joaodibba
joaodibba merged commit 0b8c361 into TypeComposer:mainJun 15, 2026
2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@lucas-spin@joaodibba
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

docs(tests): add tests/README.md and stable ForEach / LazyLoad / VirtualScroll tests - #24

Merged
joaodibba merged 2 commits into
TypeComposer:mainfrom
lucas-spin:docs/tests-readme-and-async-component-tests
Jun 15, 2026
Merged

docs(tests): add tests/README.md and stable ForEach / LazyLoad / VirtualScroll tests#24
joaodibba merged 2 commits into
TypeComposer:mainfrom
lucas-spin:docs/tests-readme-and-async-component-tests

Conversation

@lucas-spin

@lucas-spinlucas-spin commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

Summary

Closes two deferred roadmap items from PR #15:

  1. tests/README.md — contributor documentation for the test suite.
  2. tests/async-components.test.ts — stable tests for ForEach, LazyLoad, and VirtualScroll.

What's in each file

tests/README.md

SectionWhat it covers
Running testsnpm run test (watch) vs npm run test:run (CI)
Test structureEvery file in tests/, what each one tests
tests/utils.ts render helperrender() signature, auto-cleanup, example
tests/setup.tsMemoryStorage polyfill, beforeEach storage clear
Assertion patternsDOM structure, styles, reactivity, async flush
happy-dom layout limitationsWhich APIs return 0 and how to avoid brittle tests
vitest.config.ts referenceEnvironment, globals, setupFiles
Adding new testsStep-by-step checklist

tests/async-components.test.ts

ForEach (11 tests): custom element tag, empty innerHTML, item getter default, of setter/getAttribute round-trip, apply() no-throw and innerHTML-clear contract.

LazyLoad (11 tests): custom element tag, loader/loaderProps stored correctly, Component.lazyLoad spy asserts it is called with correct fallback/props on onConnected, not called when no loader provided.

VirtualScroll (13 tests, 1 skipped): custom element tag, inner container presence and position: relative, total height = items.length × itemHeight, overflow-y: auto, initial render slice under happy-dom (scrollTop=0buffer items), custom buffer, empty items, absolute positioning + px top + 100% width, renderItem factory call count, top = index × itemHeight, scroll event no-throw. Scroll-position windowing skipped with a note pointing to E2E.


Validation

npm run test:run
npx tsc --noEmit
Test Files 10 passed (10)
Tests 207 passed | 1 skipped (208)
Duration ~9s
tsc --noEmit: no errors

All pre-existing tests continue to pass.


Reviewers

@zico15

TypeComposer Contributorand others added 2 commits June 15, 2026 20:21
…croll tests
- Add tests/README.md documenting npm run test, npm run test:run,
the render() helper in tests/utils.ts, setup.ts behavior,
and recommended assertion patterns including happy-dom limitations.
- Add tests/async-components.test.ts covering:
* ForEach: construction, attribute handling, apply() contract,
and notes on why HTML-template rendering requires an HTML fixture
(the #content capture is commented out in the current source).
* LazyLoad: construction with and without loader, loaderProps storage,
Component.lazyLoad invocation via the onConnected event path,
and notes on why IntersectionObserver tests need a real browser.
* VirtualScroll: construction, inner container height/position,
overflow style, initial render slice under happy-dom (scrollTop=0
collapses the window to [0, buffer)), renderItem factory invocation,
absolute positioning of rendered items, and a skipped describe block
documenting the scroll-windowing tests deferred to E2E.
All 209 tests pass; 1 test skipped with explanation.
@joaodibba
joaodibba merged commit 0b8c361 into TypeComposer:mainJun 15, 2026
2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@lucas-spin@joaodibba
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

docs(tests): add tests/README.md and stable ForEach / LazyLoad / VirtualScroll tests - #24

Merged
joaodibba merged 2 commits into
TypeComposer:mainfrom
lucas-spin:docs/tests-readme-and-async-component-tests
Jun 15, 2026
Merged

docs(tests): add tests/README.md and stable ForEach / LazyLoad / VirtualScroll tests#24
joaodibba merged 2 commits into
TypeComposer:mainfrom
lucas-spin:docs/tests-readme-and-async-component-tests

Conversation

@lucas-spin

@lucas-spinlucas-spin commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

Summary

Closes two deferred roadmap items from PR #15:

  1. tests/README.md — contributor documentation for the test suite.
  2. tests/async-components.test.ts — stable tests for ForEach, LazyLoad, and VirtualScroll.

What's in each file

tests/README.md

SectionWhat it covers
Running testsnpm run test (watch) vs npm run test:run (CI)
Test structureEvery file in tests/, what each one tests
tests/utils.ts render helperrender() signature, auto-cleanup, example
tests/setup.tsMemoryStorage polyfill, beforeEach storage clear
Assertion patternsDOM structure, styles, reactivity, async flush
happy-dom layout limitationsWhich APIs return 0 and how to avoid brittle tests
vitest.config.ts referenceEnvironment, globals, setupFiles
Adding new testsStep-by-step checklist

tests/async-components.test.ts

ForEach (11 tests): custom element tag, empty innerHTML, item getter default, of setter/getAttribute round-trip, apply() no-throw and innerHTML-clear contract.

LazyLoad (11 tests): custom element tag, loader/loaderProps stored correctly, Component.lazyLoad spy asserts it is called with correct fallback/props on onConnected, not called when no loader provided.

VirtualScroll (13 tests, 1 skipped): custom element tag, inner container presence and position: relative, total height = items.length × itemHeight, overflow-y: auto, initial render slice under happy-dom (scrollTop=0buffer items), custom buffer, empty items, absolute positioning + px top + 100% width, renderItem factory call count, top = index × itemHeight, scroll event no-throw. Scroll-position windowing skipped with a note pointing to E2E.


Validation

npm run test:run
npx tsc --noEmit
Test Files 10 passed (10)
Tests 207 passed | 1 skipped (208)
Duration ~9s
tsc --noEmit: no errors

All pre-existing tests continue to pass.


Reviewers

@zico15

TypeComposer Contributorand others added 2 commits June 15, 2026 20:21
…croll tests
- Add tests/README.md documenting npm run test, npm run test:run,
the render() helper in tests/utils.ts, setup.ts behavior,
and recommended assertion patterns including happy-dom limitations.
- Add tests/async-components.test.ts covering:
* ForEach: construction, attribute handling, apply() contract,
and notes on why HTML-template rendering requires an HTML fixture
(the #content capture is commented out in the current source).
* LazyLoad: construction with and without loader, loaderProps storage,
Component.lazyLoad invocation via the onConnected event path,
and notes on why IntersectionObserver tests need a real browser.
* VirtualScroll: construction, inner container height/position,
overflow style, initial render slice under happy-dom (scrollTop=0
collapses the window to [0, buffer)), renderItem factory invocation,
absolute positioning of rendered items, and a skipped describe block
documenting the scroll-windowing tests deferred to E2E.
All 209 tests pass; 1 test skipped with explanation.
@joaodibba
joaodibba merged commit 0b8c361 into TypeComposer:mainJun 15, 2026
2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@lucas-spin@joaodibba