feat: add platform shells, CLI, formatting, plugins, tests, and benchmarks
Phase 4 — Platform shells: - calcpad-macos/: SwiftUI two-column editor with Rust FFI bridge (16 files) - calcpad-windows/: iced GUI with Windows 11 Fluent theme (7 files, 13 tests) - calcpad-web/: React 18 + CodeMirror 6 + WASM Worker + PWA (20 files) - calcpad-cli/: clap-based CLI with expression eval, pipe/stdin, JSON/CSV output, and interactive REPL with rustyline history Phase 5 — Engine modules: - formatting/: answer formatting (decimal/scientific/SI notation, thousands separators, currency), line type classification, clipboard values (93 tests) - plugins/: CalcPadPlugin trait, PluginRegistry, Rhai scripting stub (43 tests) - benches/: criterion benchmarks (single-line, 100/500-line sheets, DAG, incremental) - tests/sheet_scenarios.rs: 20 real-world integration tests - tests/proptest_fuzz.rs: 12 property-based fuzz tests 771 tests passing across workspace, 0 failures.
This commit is contained in:
64
calcpad-macos/Tests/CalcPadTests/PerformanceTests.swift
Normal file
64
calcpad-macos/Tests/CalcPadTests/PerformanceTests.swift
Normal file
@@ -0,0 +1,64 @@
|
||||
import Testing
|
||||
@testable import CalcPad
|
||||
|
||||
@Suite("Performance Tests")
|
||||
struct PerformanceTests {
|
||||
let engine = StubCalculationEngine()
|
||||
|
||||
@Test("Evaluate 1000+ line sheet completes in under 1 second")
|
||||
func largeSheetEvaluation() async throws {
|
||||
// Generate a 1500-line document mixing expressions, blanks, and comments
|
||||
var lines: [String] = []
|
||||
for i in 1...1500 {
|
||||
switch i % 5 {
|
||||
case 0: lines.append("") // blank
|
||||
case 1: lines.append("// Line \(i)") // comment
|
||||
case 2: lines.append("\(i) + \(i * 2)")
|
||||
case 3: lines.append("\(i) * 3")
|
||||
case 4: lines.append("\(i) / 7")
|
||||
default: lines.append("\(i)")
|
||||
}
|
||||
}
|
||||
let text = lines.joined(separator: "\n")
|
||||
|
||||
let start = ContinuousClock.now
|
||||
let results = engine.evaluateSheet(text)
|
||||
let elapsed = ContinuousClock.now - start
|
||||
|
||||
#expect(results.count == 1500)
|
||||
#expect(elapsed < .seconds(1), "Sheet evaluation took \(elapsed), expected < 1 second")
|
||||
}
|
||||
|
||||
@Test("Evaluate 5000 line sheet completes in under 3 seconds")
|
||||
func veryLargeSheetEvaluation() async throws {
|
||||
var lines: [String] = []
|
||||
for i in 1...5000 {
|
||||
lines.append("\(i) + \(i)")
|
||||
}
|
||||
let text = lines.joined(separator: "\n")
|
||||
|
||||
let start = ContinuousClock.now
|
||||
let results = engine.evaluateSheet(text)
|
||||
let elapsed = ContinuousClock.now - start
|
||||
|
||||
#expect(results.count == 5000)
|
||||
#expect(elapsed < .seconds(3), "Sheet evaluation took \(elapsed), expected < 3 seconds")
|
||||
}
|
||||
|
||||
@Test("LineResult array construction is efficient for large documents")
|
||||
func lineResultConstruction() {
|
||||
// Verify we get correct line numbering for large documents
|
||||
let lines = (1...1000).map { "\($0) + 1" }
|
||||
let text = lines.joined(separator: "\n")
|
||||
let results = engine.evaluateSheet(text)
|
||||
|
||||
#expect(results.count == 1000)
|
||||
#expect(results.first?.lineNumber == 1)
|
||||
#expect(results.last?.lineNumber == 1000)
|
||||
|
||||
// Spot-check results
|
||||
#expect(results[0].result == "2") // 1 + 1
|
||||
#expect(results[99].result == "101") // 100 + 1
|
||||
#expect(results[999].result == "1001") // 1000 + 1
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user