Commit graph

18 commits

Author SHA1 Message Date
google-labs-jules[bot]
5172fd99db 🧪 [testing improvement] Add tests for SumEngine extension API and evaluation methods
🎯 What: Tests were added for previously untested parts of `SumEngine`, primarily covering `evaluateExpression`, unknown base unit handling in `addUnit`, numeric values in `setVariable`, and type mappings (dates, percents) in `addFunction`'s arguments.
📊 Coverage:
- `addUnit` error on unknown `baseUnitId`
- `addFunction` handling conversion of `percent` and `date` arguments to `ExtensionValue`
- `setVariable` with plain numbers
- `evaluateExpression` retrieving the exact raw `Value`
✨ Result: Increased unit test line coverage for `src/engine/index.ts` covering previously overlooked functions and type mapping corner cases in the extension API.

Co-authored-by: Horizontal42 <75383519+Horizontal42@users.noreply.github.com>
2026-09-10 08:47:56 +00:00
Horizontal42
342551ca0d [Code Health] Replace generic Error with specific EvalError in tests
What: Replaced `throw new Error("test error")` with `throw new EvalError("test error")` in the `sequence error recovery` test case within `src/engine/engine.test.ts`.

Why: `EvalError` is the standard domain error used by the evaluation engine. Throwing a generic `Error` triggers a console warning in the error handling code (which treats it as an unexpected bug), whereas `EvalError` is correctly handled silently as expected evaluation failure, improving the clarity of what kind of error is being tested.

Verification: Ran `npm run test src/engine/engine.test.ts` and the full test suite via `npm run test`, which all completed successfully.

Result: More accurate test setup and adherence to the evaluation engine's specific error handling abstractions.
2026-08-14 13:39:05 +03:00
Horizontal42
573b06e245 reject duplicate ids in addUnit
addUnit() overwrote unitsById unconditionally while its own addPhrase
calls are first-wins, so an extension reusing an existing id silently
corrupted the id->Unit table for anything using that id as a
baseUnitId afterwards. Throw instead.
2026-08-12 20:04:37 +03:00
Horizontal42
d3731be6ef
add missing evaluation error tests 2026-08-09 15:59:56 +03:00
Horizontal42
1a12d75ec6 add regression test for sequence error recovery 2026-07-29 14:14:49 +03:00
Horizontal42
0345d2a33f workspace: don't cache exports from a cycle-interrupted evaluation
In an A<->B cycle, exportsFor(B) run while A is mid-resolution would
compute a wrong export set (assignments dropped by the nested
"circular reference" error) and cache it anyway. Later queries then
served that stale, cycle-broken result even after the cycle-causing
outer call had unwound, giving inconsistent error messages across
repeated evaluations of the same cyclic setup.

Skip caching whenever any line in the result carries a "circular
reference" error - that's a precise, local signal the pass was
cycle-affected, so the sheet gets re-evaluated fresh until an edit
actually breaks the cycle. Normal (non-cyclic) caching is untouched.

Also adds a positive-path test confirming LineResult.error stays
undefined on an ordinary successful line, and a workspace-level test
proving a genuine cycle now reports a stable error across repeated
queries.
2026-07-02 05:50:40 +03:00
Horizontal42
677f940043 engine: @Sheet.key cross-sheet reference syntax and resolver hook 2026-07-02 05:26:25 +03:00
Horizontal42
fbeca06f2e historical rates: 1000 USD in EUR on 2024-01-01 via frankfurter.app 2026-07-01 22:23:35 +03:00
Horizontal42
d5f458dce3 goal seek: ? * 1.2 = 1000 → 833.33 2026-07-01 22:11:55 +03:00
Horizontal42
f8f9095fca add ISO date literals and days until/since 2026-07-01 20:27:55 +03:00
Horizontal42
1d77ee45d8 add random() with deterministic line-seeded PRNG 2026-07-01 20:01:40 +03:00
Horizontal42
532c3265ad add block aggregates count/min/max/product, Ctrl+W close sheet 2026-07-01 19:58:54 +03:00
Horizontal42
b0c46c390c RU math phrases, half/полтора constants, export button
- vocab: EN+RU aliases for abs/log/ln/round; RU already had sqrt/cbrt
- engine: "half"/"a half"/"one half"/"половина" → 0.5; "one and a half"/"полтора"/"полторы" → 1.5 as named constants; widen const union in parser/tokenizer/evaluator/registry
- export: ⤓ button in statusbar dropdown — copy sheet, save .sum, export .txt, print/PDF; write_text_file Tauri command; print media CSS hides chrome
2026-06-24 00:27:06 +03:00
Horizontal42
db37218b66 кк = млн, ккк = млрд 2026-06-23 23:57:48 +03:00
Horizontal42
b0ad123fcc add trillion scale; RU к = тысяча 2026-06-23 23:56:13 +03:00
Horizontal42
37fd32501b add sterling/quid/стерлинг phrases for GBP 2026-06-23 23:30:11 +03:00
Horizontal42
ec09c93770 remove Numi brand mentions from code and lockfile 2026-06-18 21:51:31 +03:00
Horizontal42
0cef414e9a feat: Summarum — natural language calculator notebook for Windows
Write plain text, get live results per line. English + Russian, units,
live currency rates with crypto, percents, dates and timezones, bitwise
ops, variables and sheet totals. Tauri 2 + TypeScript engine +
CodeMirror 6; daily backups and a deleted-sheets bin.

Inspired by Numi for macOS (numi.app); built from scratch for Windows.
2026-06-10 22:19:24 +03:00