SUNDIAL solar dial v0.3: round screen, NOAA solar math, day/night arc
- 466px round layout, designWidth 466 (S4 41mm 466x466) - solar position + dayProgress in src/common/solar.js (pure, TDD'd) - sunrise/sunset sweep, night moon, countdown, 30s refresh - tests: solar math, page logic, circle geometry/contrast
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
const fs = require('node:fs');
|
||||
const vm = require('node:vm');
|
||||
const assert = require('node:assert/strict');
|
||||
const ux = fs.readFileSync('src/pages/index/index.ux', 'utf8');
|
||||
const script = ux.match(/<script>([\s\S]*?)<\/script>/)[1];
|
||||
function page() {
|
||||
const spec = vm.runInNewContext(script.replace('export default', 'globalThis.spec =') + '\nspec');
|
||||
return Object.assign({}, spec.private, spec);
|
||||
}
|
||||
const p = page();
|
||||
assert.equal(typeof p.press, 'function', 'Keypress handler must exist');
|
||||
['2','+','3','='].forEach(k => p.press(k));
|
||||
assert.equal(p.display, '5');
|
||||
console.log('PASS addition through page keypress handler');
|
||||
const cases = [
|
||||
['subtract',['9','-','4','='],'5'],
|
||||
['multiply',['6','x','7','='],'42'],
|
||||
['divide',['8','/','2','='],'4'],
|
||||
['decimals',['0','.','1','+','0','.','2','='],'0.3'],
|
||||
['duplicate dot',['1','.','.','2'],'1.2'],
|
||||
['sign',['5','+/-','x','2','='],'-10'],
|
||||
['percent',['5','0','%'],'0.5'],
|
||||
['percent add',['2','0','0','+','1','0','%','='],'220'],
|
||||
['percent multiply',['2','0','0','x','1','0','%','='],'20'],
|
||||
['clear',['9','+','AC','2','='],'2'],
|
||||
['zero division',['8','/','0','='],'Error'],
|
||||
['recover',['8','/','0','=','3'],'3'],
|
||||
['chain',['2','+','3','x','4','='],'20'],
|
||||
['replace operator',['2','+','x','3','='],'6'],
|
||||
['repeat equals',['2','+','3','=','=', '='],'11'],
|
||||
['fresh entry',['2','+','3','=','7'],'7'],
|
||||
['input cap',Array(20).fill('9'),'999999999'],
|
||||
['leading zero',['0','0','2'],'2']
|
||||
];
|
||||
for(const [name,keys,expected] of cases) {
|
||||
const c=page(); keys.forEach(k=>c.press(k)); assert.equal(c.display,expected,name);
|
||||
}
|
||||
assert.match(ux, /\{\{ display \}\}/);
|
||||
const keys=[...ux.matchAll(/<text[^>]*onclick="press\('([^']+)'\)"/g)].map(m=>m[1]);
|
||||
assert.equal(keys.length,19,'every button must have handler');
|
||||
assert.equal(new Set(keys).size,19);
|
||||
console.log('PASS',cases.length,'edge cases and all 19 button bindings');
|
||||
Reference in New Issue
Block a user