The Swift oracle reads the 43 account files Java read (--email-files, with TopologyRuntimeEmailStorage.decodeJavaServer and decodeJavaClient). The accounts the model takes match Swift's except where Swift checks names, hosts and addresses and fails the whole file on one it rejects, or reads the format otherwise (the first client line instead of the last, exactly nine fields, a required messages field). Every departure is named with its reason; Java's reading is right in each, none is a Java error Swift fixes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
70 lines
3.2 KiB
Markdown
70 lines
3.2 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.
|
|
|
|
`--email-files server|client` liest die Kontodateien
|
|
(`packages/fls/test/email-*.cases.txt`) mit Swifts
|
|
`TopologyRuntimeEmailStorage.decodeJavaServer`/`decodeJavaClient`.
|
|
|
|
`--dns-hosts` liest dieselben `/dns/hosts`-Fälle wie das Java-Orakel
|
|
(`packages/fls/test/dns-hosts.cases.txt`) mit Swifts
|
|
`TopologyDNSHostsFileCodec`; unter `state` stehen die DNS-Einträge jedes
|
|
Servers (`dnsServer.records`) und E-Mail-Client und -Server mit Konten und Nachrichten (`emailClient`, `emailServer`).
|
|
|
|
## 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.
|