Files
mdg-filius/tools/swift-oracle

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.

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.