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.
65 lines
2.3 KiB
Swift
65 lines
2.3 KiB
Swift
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
|
|
}
|
|
}
|