39 lines
2.1 KiB
JavaScript
39 lines
2.1 KiB
JavaScript
const assert = require('node:assert/strict')
|
|
const fs = require('node:fs')
|
|
const vm = require('node:vm')
|
|
const src = fs.readFileSync('src/pages/index/index.ux', 'utf8')
|
|
const body = src.match(/<script>([\s\S]*?)<\/script>/)[1].replace(/import\s+\w+\s+from\s+'[^']*';?/, '').replace('export default', 'globalThis.spec =')
|
|
const ctx = {prayer: require('../src/common/prayer.js'), setInterval: () => 1, clearInterval: () => {}}
|
|
vm.createContext(ctx); vm.runInContext(body, ctx)
|
|
const p = Object.assign({}, ctx.spec, JSON.parse(JSON.stringify(ctx.spec.private)))
|
|
p.update()
|
|
let rows = p.rows, writes = 0
|
|
Object.defineProperty(p, 'rows', {get: () => rows, set: value => {writes++; rows = value}})
|
|
const original = JSON.stringify(rows)
|
|
for (let i=0; i<500; i++) p.onScroll({scrollY: i, scrollState: i < 250 ? 1 : 2})
|
|
console.log('Row-array replacements during 500 gesture/inertia events:', writes)
|
|
assert.equal(writes, 0, 'native scrolling must not rebuild reactive rows')
|
|
assert.equal(JSON.stringify(rows), original, 'no font changes while scrolling')
|
|
p.update()
|
|
assert.equal(writes, 0, 'periodic refresh must defer during scrolling')
|
|
p.onScroll({scrollY: 520, scrollState: 0})
|
|
assert.equal(parseFloat(p.rows[5].timeStyle.fontSize), 60, 'last row grows after stop')
|
|
assert.ok(writes <= 1, 'one focus update at stop')
|
|
const settled = writes
|
|
p.onScrollEnd()
|
|
assert.equal(writes, settled, 'duplicate stop event is a no-op')
|
|
p.onScroll({scrollY: 208, scrollState: 1})
|
|
p.onScrollEnd()
|
|
assert.equal(parseFloat(p.rows[2].timeStyle.fontSize), 60, 'scrollend fallback applies nearest row')
|
|
assert.equal(parseFloat(p.rows[1].timeStyle.fontSize), 30)
|
|
const saved = JSON.stringify(p.rows)
|
|
for (const e of [undefined, {}, {scrollY: NaN}, {scrollY: Infinity}]) p.onScroll(e)
|
|
assert.equal(JSON.stringify(p.rows), saved)
|
|
p.onScroll({scrollY: 312, scrollState: 1})
|
|
p.onHide()
|
|
p.onShow()
|
|
assert.equal(p._scrolling, false, 'hiding during a swipe must not freeze refresh after resume')
|
|
assert.equal(parseFloat(p.rows[3].timeStyle.fontSize), 60)
|
|
assert.match(src, /onscrollend="onScrollEnd"/)
|
|
console.log('Scroll workload, deferred refresh, settled focus and duplicate-event checks passed')
|