The core gains Swift's virtual file system (paths, case-insensitive lookup that keeps the spelling, quotas, atomic changes, the defaults of a new device) and the string behaviour the ported code relies on without saying so. Both are measured in the Swift oracle: 11 file system cases (the three Swift tests among them) step by step, and trimming, lower case, equality, ordering and Base64 case by case — whitespace and control characters over all of Unicode. Found by measuring: - Swift trims NEL and ZERO WIDTH SPACE, not the BOM; JS trim() does the opposite. The .fls import now trims with swiftTrim. - lowercased() maps scalar by scalar: a word-final sigma stays σ. - Foundation decodes "====" and "Y===" as empty data. - Foundation on Linux counts 24,735 plane-14 scalars as control characters, a table artefact; the port keeps Unicode Cc+Cf. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
61 lines
2.8 KiB
Markdown
61 lines
2.8 KiB
Markdown
# Swift-Orakel
|
|
|
|
Der Swift-Kern von `filius-ipad` (Laufzeit, Modell, `.fls`, Berichte — alles
|
|
ohne Oberfläche) lässt sich unter Linux bauen. Dieses Werkzeug nutzt das als
|
|
**Maßstab für die Übertragung**: Ein Szenario wird einmal als JSON
|
|
beschrieben, in Swift abgespielt, und die TypeScript-Übertragung muss
|
|
dieselbe Ausgabe liefern — jedes einzelne Spurereignis, jede Antwort, den
|
|
Endzustand.
|
|
|
|
```bash
|
|
npm run oracle # = tools/swift-oracle/run.sh (braucht Docker)
|
|
npm test # vergleicht mit den geschriebenen *.swift.json
|
|
```
|
|
|
|
* Szenarien: `packages/core/test/scenarios/<name>.scenario.json`
|
|
* Ergebnis aus Swift: `<name>.swift.json` daneben — **wird eingecheckt**, damit
|
|
die Tests ohne Docker und ohne Swift laufen.
|
|
* Vergleich: `packages/core/test/oracle.test.ts`. Er meldet das **erste**
|
|
abweichende Spurereignis mit Nummer.
|
|
|
|
## Korpus
|
|
|
|
`--corpus` importiert jede `.fls` unter `corpus/` und schreibt
|
|
`corpus/corpus.swift.json`: je Datei die Zählwerte und Warnungen des Imports
|
|
und unter `state` Swifts ganzes importiertes Modell ohne die zufälligen UUIDs
|
|
(Geräte, Ports und Kabel als Indizes, IP-Konfiguration, Doku-Elemente mit
|
|
ihren abgeleiteten IDs). Daran misst `packages/fls/test/importProject.test.ts`
|
|
den Umbau — auf den 13 Dateien, die Swift vollständig liest.
|
|
|
|
## Dateisystem und Strings
|
|
|
|
`--vfs` spielt die Fälle aus `packages/core/test/vfs.cases.json` im
|
|
virtuellen Dateisystem ab (jedes Ergebnis, jeder Fehler samt Werten, der
|
|
Endzustand mit SHA-256 der Binärdaten). `--strings` misst, was Swift aus
|
|
Strings macht, wo JavaScript abweicht: Trimmen, Kleinschreibung, Gleichheit,
|
|
Sortierung, Base64 — und die ganzen Mengen `whitespacesAndNewlines` und
|
|
`controlCharacters` über alle Unicode-Skalare. Grenze: Das ist Foundation
|
|
unter Linux; ihre Steuerzeichen-Tabelle hat in Ebene 14 einen Fehler, den
|
|
der Port nicht übernimmt.
|
|
|
|
## Wie es gebaut wird
|
|
|
|
`fetch-upstream.sh` holt `filius-ipad` am festen Stand `3b5ded0` und kopiert
|
|
die oberflächenfreien Quellen nach `Sources/FiliusCore/` (nicht eingecheckt).
|
|
Apple-Module, die es unter Linux nicht gibt, sind auf das Nötige verkleinert:
|
|
|
|
| Modul | Ersatz |
|
|
| --- | --- |
|
|
| `CoreGraphics` | `Foundation` (hat `CGPoint`/`CGFloat` unter Linux) |
|
|
| `CryptoKit` | `swift-crypto` (gleiche Schnittstelle) |
|
|
| `Compression` | eine Funktion, `compression_decode_buffer` mit rohem DEFLATE über zlib |
|
|
| `Network` | entfällt: `TopologyRemoteLinkLANController.swift` wird nicht mitgebaut |
|
|
|
|
`patches/linux-type-checker.patch` teilt zwei lange Ausdrücke auf, an denen der
|
|
Linux-Compiler die Typprüfung abbricht. Das Verhalten ändert sich dadurch nicht.
|
|
|
|
## Neue Schrittarten
|
|
|
|
Eine Schrittart gibt es zweimal — in `Sources/Oracle/main.swift` und in
|
|
`packages/core/test/oracle.test.ts`. Beide müssen dasselbe JSON schreiben.
|