test(anchors): den Anker-Vertrag um die Randfaelle erweitern - #44
Draft
goldnead wants to merge 2 commits into
Draft
test(anchors): den Anker-Vertrag um die Randfaelle erweitern#44goldnead wants to merge 2 commits into
goldnead wants to merge 2 commits into
Conversation
Leere Ueberschriften, Titel ohne slugfaehige Zeichen, eine manuell gesetzte id unterhalb der kollidierenden Ueberschrift, andere Anfuehrungszeichen und Grossschreibung, und ein Markdown-Feld, dessen Liste aus der Quelle und dessen ids aus dem gerenderten HTML kommen. Ausserdem zwei Loecher in den Hilfsfunktionen des Tests geschlossen: anchors() sah wegen [^"]+ ein leeres href="#" gar nicht, und ids() erkannte weder einfache Anfuehrungszeichen noch Grossschreibung.
Die Mutationsprobe hat gezeigt, dass der neue Notations-Test allein nicht greift: erkennt der Injektor eine einfach quotierte id nicht, haengt er eine zweite daneben. Der Browser behaelt die erste, die Liste zeigt auf denselben Wert, und der Vertrag sah eingehalten aus, obwohl das HTML kaputt war. assertAnchorsResolve() prueft jetzt zusaetzlich, dass keine Ueberschrift zwei id-Attribute traegt. Ausserdem den Klassenkommentar korrigiert: er kuendigte noch an, die Tests wuerden bis zum v2-Umbau rot sein.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Was hier drin ist
Nur Tests. Kein Produktivcode angefasst, keine API-Änderung, kein Breaking Change.
Der Auftrag war, den Umbau aus
backlog-statamic-toc-v2-anker-vertragzu bauen: eine Quelle für Überschriften und Anker-IDs. Der Umbau steht bereits vollständig aufmain—Registry,Slugger,IdInjector,Extractors/{Bard,Html,Markdown}, und der Modifier rechnet keine IDs mehr aus. Ich habe das gegen den Code geprüft, nicht aus dem Ticket übernommen. Es gab also nichts zu bauen.Offen war die zweite Hälfte des Auftrags: die Randfälle, die der Vertragstest noch nicht festhielt.
Neu im Vertrag
<h2></h2>)<br>, leeres Inline-Markup)???)section-Fallback inSlugger::uniquewar nirgends gepinnt.idunterhalb der kollidierenden Überschriftidimmer oben. DassSlugger::assignvorhandene IDs in einem eigenen Vorlauf beansprucht, hing an nichts.idin anderer Notation (einfache Anführungszeichen, Großschreibung)hasId-Guard im Injektor ist tolerant, der Test war es nicht.Registry-Fingerprint überbrücken muss.Zwei Löcher in den Hilfsfunktionen des Tests
Beide fanden sich beim Schreiben, beide hätten Zusicherungen aus dem falschen Grund grün gehalten:
anchors()matchtehref="#([^"]+)". Ein leereshref="#"fiel damit aus dem Ergebnis heraus — ein Listeneintrag, der nirgendwohin zeigt, sah aus wie kein Listeneintrag.ids()las nurid="…"in Kleinschreibung mit doppelten Anführungszeichen. Für eine Überschrift, die sichtbar eineidträgt, meldete es „keine id".Was die Mutationsprobe gefunden hat
M4 (
hasIderkennt nur doppelt quotierte Kleinschreibung) überlebte im ersten Durchlauf. Grund: erkennt der Injektor die einfach quotierteidnicht, hängt er eine zweite daneben. Der Browser behält die erste, die Liste zeigt auf denselben Wert — der Vertrag sah eingehalten aus, obwohl das HTML kaputt war.Deshalb prüft
assertAnchorsResolve()jetzt zusätzlich, dass keine Überschrift zweiid-Attribute trägt. Danach fällt M4.Testlauf
Vor dem Branch:
OK (129 Tests, 292 Assertions)Auf dem Branch:
OK (137 Tests, 363 Assertions)pint --testgrün.phpstan analysekonnte ich lokal nicht auswerten: interner Fehler beim Auflösen derphpstorm-stubs(dom_c.stub), Artefakt eines quer kopiertenvendor/. Derselbe Fehler tritt auf einem unverändertenmain-Checkout auf, hat also nichts mit diesem Branch zu tun. Die CI hat es entschieden: Static analysis grün, ebenso alle sechs Matrix-Zeilen und Code style.Mutationsprobe (real gelaufen, jeweils einzeln eingespielt und zurückgesetzt)
idals die Liste verlinkt (nur Dokumentseite)Sluggerbehandelt eine textlose Überschrift nicht mehr als leersection-Fallback für einen nicht slugfähigen Titelids werden erst beim Vorbeilaufen beanspruchthasIderkennt nurid="…"in KleinschreibungNach jeder Rücknahme wieder
OK (18 Tests, 99 Assertions)im Vertragstest, Working Tree am Ende sauber.Zwei Tests überleben M0, beide zu Recht:
test_no_heading_carries_two_idsprüft nur Duplikate, undtest_excluding_a_heading_…arbeitet direkt amParserohne zu rendern.Ehrliche Grenze, unverändert gegenüber der Prüfung vom 01.08.: der Test prüft das Ergebnis, nicht die Architektur. Ein Modifier, der die
Registryumgeht und einen frischen, zustandslosenSluggerbenutzt, überlebt. Sobald die zweite Rechenstelle abweicht — und genau das war der v1-Fehler — fällt der Test.Nicht gemacht, bewusst
Kein Merge, kein Tag, kein Release, kein Packagist-Push. Draft, weil Adrian im Urlaub ist.
Offene Fragen für Adrian
#sectionzeigen zu lassen. Kein Ticket sagt dazu etwas.section-Fallback ist ein magischer String inSlugger::unique, nicht konfigurierbar. Für ein englischsprachig ausgeliefertes Addon vermutlich in Ordnung, aber niemand hat das entschieden.v1.9, obwohlv2.0.0undv2.1.0getaggt sind), Packagist-Verifikation (packagist.org ist aus dieser Umgebung nicht erreichbar), und der veraltete Zahlenstand im Ticket-Text.