Loading the parity record
Fetching the measured run — the pinned upstream oracle, every symbol and every case.
Fetching the measured run — the pinned upstream oracle, every symbol and every case.
Parity / LiveView
Every number on this page was produced by running both implementations over the same cases: the real phoenix_live_view package pinned at 1.2.9 answers first, and its answer is the expectation the Go port is held to. Nothing is a hand-written expectation, so a new upstream release re-scores the port on its own. See LiveView for the port's own documentation. Source: github.com/malcolmston/liveview.
Not a generic diagram: every node below names an artefact of this harness — the pinned package it installed, the runner files it started, the case files it streamed, and the counts it wrote out.
| Case group | Cases | Match | Mismatch | Group parity |
|---|---|---|---|---|
| static-split | 21 | 0 | 0 | 0.0% |
| events | 18 | 0 | 0 | 0.0% |
| diff-minimality | 15 | 0 | 0 | 0.0% |
| components | 14 | 0 | 0 | 0.0% |
| comprehension | 14 | 0 | 0 | 0.0% |
| escaping | 12 | 0 | 0 | 0.0% |
Every exported symbol of the upstream package, and what the port offers for it. The upstream list is derived mechanically, never from a README: run from parity/liveview/elixir with: mix run --no-start <this file>
Application.load(:phoenix_live_view)
skip = [:module_info, :__info__, :__struct__, :__impl__, :behaviour_info,
:__protocol__, :__using__, :__after_compile__, :__opts__,
:__components__, :__mix_recompile__?, :__phoenix_verify_routes__,
:__live__, :__templates__, :__mix_recompile__]
for m <- Enum.sort(Application.spec(:phoenix_live_view, :modules)) do
exports =
m.module_info(:exports)
|> Enum.reject(fn {f, _a} -> f in skip end)
|> Enum.reject(fn {f, _a} -> String.starts_with?(Atom.to_string…. A symbol with no case is untested, never a match.
| Upstream symbol | Go symbol | Status | Cases | Note |
|---|---|---|---|---|
| Enumerable.Phoenix.LiveView.LiveStream *(hidden)* | 4 | untested | — | needs a running Phoenix endpoint, a compile-time macro context, or a live process |
| Inspect.Phoenix.LiveView.Socket *(hidden)* | 1 | untested | — | needs a running Phoenix endpoint, a compile-time macro context, or a live process |
| Inspect.Phoenix.LiveView.Socket.AssignsNotInSocket *(hidden)* | 1 | untested | — | needs a running Phoenix endpoint, a compile-time macro context, or a live process |
| Inspect.Phoenix.LiveView.UploadConfig *(hidden)* | 1 | untested | — | needs a running Phoenix endpoint, a compile-time macro context, or a live process |
| Inspect.Phoenix.LiveViewTest.Element *(hidden)* | 1 | untested | — | needs a running Phoenix endpoint, a compile-time macro context, or a live process |
| Inspect.Phoenix.LiveViewTest.Upload *(hidden)* | 1 | untested | — | needs a running Phoenix endpoint, a compile-time macro context, or a live process |
| Inspect.Phoenix.LiveViewTest.View *(hidden)* | 1 | untested | — | needs a running Phoenix endpoint, a compile-time macro context, or a live process |
| JSON.Encoder.Phoenix.LiveView.JS *(hidden)* | 1 | untested | — | the encodable form of a JS command; only the browser consumes it |
| Jason.Encoder.Phoenix.LiveView.JS *(hidden)* | 1 | untested | — | as above |
| Mix.Tasks.Compile.PhoenixLiveView | 1 | untested | — | a Mix compiler task |
| Mix.Tasks.PhoenixLiveView.Upgrade *(hidden)* | 1 | untested | — | a Mix upgrade task |
| Phoenix.Component | 42 | untested | — | MACRO-sigil_H/3 is exercised transitively by every case (it produces the Rendered being diffed) but is not named in any upstreamFn. assign/2,3, assign_new/3, update/3, changed?/2 are mirrored by (*liveview.Socket).Assign and friends, whose only observable output is the diff. The ~20 built-in components (form/1, link/1, inputs_for/1, focus_wrap/1, portal/1, live_file_input/1, …) need an endpoint or a %Phoenix.HTML.Form{} |
| Phoenix.Component.Declarative *(hidden)* | 12 | untested | — | compile-time attr/slot validation |
| Phoenix.Component.MacroComponent *(hidden)* | 5 | untested | — | compile-time macro components |
| Phoenix.HTML.Safe.Phoenix.LiveComponent.CID *(hidden)* | 1 | untested | — | protocol impl |
| Phoenix.HTML.Safe.Phoenix.LiveView.Component *(hidden)* | 1 | untested | — | protocol impl |
| Phoenix.HTML.Safe.Phoenix.LiveView.Comprehension *(hidden)* | 1 | untested | — | protocol impl; the comprehension *encoding* is compared separately |
| Phoenix.HTML.Safe.Phoenix.LiveView.JS *(hidden)* | 1 | untested | — | protocol impl |
| Phoenix.HTML.Safe.Phoenix.LiveView.Rendered *(hidden)* | 1 | untested | — | the Safe protocol impl; the port's HTML materialisation is compared through Diff.to_iodata/1 instead |
| Phoenix.LiveComponent | 2 | untested | — | only __using__ macros; the behaviour itself is compared through Diff.write_component/4 |
| Phoenix.LiveComponent.CID | 0 | untested | — | 0 exports (a struct); the cid *scheme* is compared by the components cases |
| Phoenix.LiveView | 47 | untested | — | every export needs a live socket: uploads, streams, async, flash, navigation, hooks, send_update/2,3, transport_pid/1 |
| Phoenix.LiveView.Application *(hidden)* | 2 | untested | — | the OTP application callback |
| Phoenix.LiveView.Async *(hidden)* | 11 | missing | — | assign_async/start_async spawn tasks against a live process |
| Phoenix.LiveView.AsyncResult | 6 | missing | — | the port has no async-assign story |
| Phoenix.LiveView.Channel *(hidden)* | 19 | untested | — | the per-view WebSocket channel GenServer |
| Phoenix.LiveView.ColocatedAssets *(hidden)* | 2 | untested | — | build-time asset extraction |
| Phoenix.LiveView.ColocatedAssets.Entry *(hidden)* | 0 | untested | — | struct |
| Phoenix.LiveView.ColocatedCSS | 3 | missing | — | build-time asset extraction |
| Phoenix.LiveView.ColocatedHook | 1 | missing | — | build-time asset extraction |
| Phoenix.LiveView.ColocatedJS | 3 | missing | — | build-time asset extraction |
| Phoenix.LiveView.Component | 0 | untested | — | 0 exports (a struct): the placeholder a live_component/1 call leaves in the dynamics |
| Phoenix.LiveView.Comprehension | 0 | differs | — | 0 exports (a struct), but its *encoding* is what the 14 comprehension cases compare; the port has no comprehension construct at all |
| Phoenix.LiveView.Controller | 2 | missing | — | live_render/2,3 from a Phoenix controller |
| Phoenix.LiveView.Debug | 4 | missing | — | live-process introspection |
| Phoenix.LiveView.Diff *(hidden)* | 14 | differs | — | the comparison target.** render/4, write_component/4 and to_iodata/1 are cased; the other 11 exports are fingerprint/component bookkeeping with no port counterpart |
| Phoenix.LiveView.Engine | 17 | differs | — | the change-tracking template compiler. MACRO-to_safe/2 is cased (escaping); changed_assign?/2 and nested_changed_assign?/4 have no counterpart — the port compares rendered values instead of tracking assigns |
| Phoenix.LiveView.HTMLAlgebra *(hidden)* | 3 | untested | — | the formatter's layout algebra |
| Phoenix.LiveView.HTMLEngine | 12 | untested | — | attribute-level escaping (attributes_escape/1, class_attribute_encode/1, void?/1); the port's AttrList/ClassList are sorted-map helpers with no upstream analogue, so there is no like-for-like call |
| Phoenix.LiveView.HTMLFormatter | 2 | missing | — | mix format plugin |
| Phoenix.LiveView.HTMLFormatter.TagFormatter | 0 | untested | — | struct |
| Phoenix.LiveView.Helpers *(hidden)* | 7 | untested | — | deprecated ~L / live_patch helpers |
| Phoenix.LiveView.JS | 61 | untested | — | the port has a close analogue (AddClass, Toggle, Transition, …), but upstream's answer is a %JS{} struct serialised into an HTML attribute and interpreted by the JS client; there is no server-side result to compare that is not simply the port's own JSON |
| Phoenix.LiveView.Lifecycle *(hidden)* | 12 | untested | — | hook staging around a live process |
| Phoenix.LiveView.LiveStream *(hidden)* | 8 | untested | — | stream inserts land in the diff under "stream"; upstream's shape needs stream_configure/3 on a live socket |
| Phoenix.LiveView.Logger | 9 | missing | — | telemetry logging |
| Phoenix.LiveView.Plug *(hidden)* | 2 | untested | — | the router plug |
| Phoenix.LiveView.ReloadError *(hidden)* | 2 | untested | — | exception |
| Phoenix.LiveView.Rendered | 0 | untested | — | 0 exports (a struct); its static/dynamic fields are compared indirectly, through the diff |
| Phoenix.LiveView.Renderer *(hidden)* | 2 | untested | — | render/1 resolution at compile time |
| Phoenix.LiveView.Route *(hidden)* | 3 | untested | — | route metadata |
| Phoenix.LiveView.Router | 8 | untested | — | live/3 and live_session/3 are router macros |
| Phoenix.LiveView.Session *(hidden)* | 3 | untested | — | the signed session struct |
| Phoenix.LiveView.Socket | 12 | untested | — | a Phoenix.Socket transport, not the assigns holder the port's Socket is |
| Phoenix.LiveView.Socket.AssignsNotInSocket *(hidden)* | 0 | untested | — | struct |
| Phoenix.LiveView.Static *(hidden)* | 7 | untested | — | the dead render: needs a Plug.Conn and an endpoint |
| Phoenix.LiveView.TagEngine | 11 | untested | — | the HEEx tag engine; the port's template parser has a different grammar (see "template syntax is out of scope") |
| Phoenix.LiveView.TagEngine.Compiler *(hidden)* | 1 | untested | — | HEEx compilation |
| Phoenix.LiveView.TagEngine.Parser *(hidden)* | 5 | untested | — | HEEx parsing |
| Phoenix.LiveView.TagEngine.Tokenizer *(hidden)* | 3 | untested | — | HEEx tokenising |
| Phoenix.LiveView.TagEngine.Tokenizer.ParseError *(hidden)* | 4 | untested | — | exception |
| Phoenix.LiveView.Upload *(hidden)* | 19 | untested | — | needs the upload channel and a writer process |
| Phoenix.LiveView.UploadChannel *(hidden)* | 11 | untested | — | a separate channel process per entry |
| Phoenix.LiveView.UploadConfig | 19 | untested | — | needs a live socket |
| Phoenix.LiveView.UploadEntry | 1 | untested | — | needs a live socket |
| Phoenix.LiveView.UploadTmpFileWriter *(hidden)* | 4 | untested | — | writer process |
| Phoenix.LiveView.UploadWriter | 0 | untested | — | behaviour |
| Phoenix.LiveView.Utils *(hidden)* | 38 | untested | — | assign/3's rule that an identical value is *not* marked changed is mirrored by the Elixir runner and pinned by ev-label-same-value; the flash and token halves need an endpoint secret |
| Phoenix.LiveViewTest | 86 | untested | — | the whole test client — live/2, render_click/2, element/3 — requires an Endpoint and a ClientProxy process |
| Phoenix.LiveViewTest.ClientProxy *(hidden)* | 12 | untested | — | the simulated client process |
| Phoenix.LiveViewTest.DOM *(hidden)* | 26 | untested | — | test-only DOM helpers |
| Phoenix.LiveViewTest.Diff *(hidden)* | 4 | untested | — | test-only diff merging (the client-side half of the wire format) |
| Phoenix.LiveViewTest.Element | 0 | untested | — | struct |
| Phoenix.LiveViewTest.TreeDOM *(hidden)* | 30 | untested | — | test-only DOM helpers |
| Phoenix.LiveViewTest.Upload | 1 | untested | — | test-only upload client |
| Phoenix.LiveViewTest.UploadClient *(hidden)* | 14 | untested | — | test-only upload client |
| Phoenix.LiveViewTest.Utils *(hidden)* | 3 | untested | — | test helpers |
| Phoenix.LiveViewTest.View | 0 | untested | — | struct |
| String.Chars.Phoenix.LiveComponent.CID *(hidden)* | 1 | untested | — | protocol impl |
| Phoenix.LiveView.Diff.render/4 | liveview.FullDiff, liveview.DiffRendered, (*liveview.Session).InitialDiff, (*liveview.Session).Event | differs | 66 (static-split, diff-minimality, components, events, and the render_diff half of comprehension) — 48/66 agree | see the divergence list |
| Phoenix.LiveView.Diff.to_iodata/1 | (*liveview.Rendered).HTML | match | split-html-counter, split-html-nested, split-html-plain, esc-html-string, esc-raw-html, comp-html-two, comp-html-empty — 7/7 agree | the *materialised* HTML agrees even where the encoding does not |
| MACRO-Phoenix.LiveView.Engine.to_safe/2 | (*liveview.Template).Render (via the unexported htmlEscape) | match | esc-all-five, esc-none, esc-double-quote, esc-apostrophe, esc-existing-entity, esc-whitespace, esc-unicode, esc-script-tag — 8/8 agree | the port emits " and ', matching Phoenix rather than Go's html.EscapeString |
| Phoenix.HTML.raw/1 *(from phoenix_html 4.3.0, a hard dependency)* | liveview.Safe | match | esc-raw-passthrough, esc-raw-quotes — 2/2 agree | |
| Phoenix.LiveView.Comprehension *(struct)* | — | differs | comp-two-entries, comp-one-entry, comp-empty, comp-five-entries, comp-escape-entry, comp-multi-slot — 0/6 agree | the port has no comprehension construct |
| Phoenix.LiveView.Diff.write_component/4 | (*liveview.Session).ComponentEvent | differs | cmp-event-bump, cmp-event-bump-cid2, cmp-event-set-number, cmp-event-unhandled, cmp-event-unknown-cid — 4/5 agree | only the unknown-cid case diverges |
Every case the harness streamed to both runners, with the exact upstream symbol and Go symbol it exercised. A deliberate, documented difference is a deviation and is counted apart from a mismatch.
| Case | Group | Upstream symbol | Go symbol | Status | Note |
|---|---|---|---|---|---|
| cmp-initial-one | components | Phoenix.LiveView.Diff.render/4 | (*liveview.Session).InitialDiff | unknown | one component: slot 1 carries the cid, "c" carries its full diff |
| cmp-initial-two | components | Phoenix.LiveView.Diff.render/4 | (*liveview.Session).InitialDiff | unknown | two components of the same module |
| cmp-initial-two-wire | components | Phoenix.LiveView.Diff.render/4 | (*liveview.Session).InitialDiff | unknown | the un-normalised wire form: does the second component's statics get shared with the first? |
| cmp-initial-titled | components | Phoenix.LiveView.Diff.render/4 | (*liveview.Session).InitialDiff | unknown | |
| cmp-parent-change-only | components | Phoenix.LiveView.Diff.render/4 | (*liveview.Session).Event | unknown | an unchanged component must contribute nothing: no cid re-send, no "c" entry |
| cmp-parent-change-only-two | components | Phoenix.LiveView.Diff.render/4 | (*liveview.Session).Event | unknown | |
| cmp-parent-change-no-initial | components | Phoenix.LiveView.Diff.render/4 | (*liveview.Session).Event | unknown | the port's HTTP event path never calls InitialDiff, so nothing marks the component statics as sent |
| cmp-parent-change-no-initial-two | components | Phoenix.LiveView.Diff.render/4 | (*liveview.Session).Event | unknown | |
| cmp-parent-no-change | components | Phoenix.LiveView.Diff.render/4 | (*liveview.Session).Event | unknown | an event nobody handles must produce an empty diff |
| cmp-event-bump | components | Phoenix.LiveView.Diff.write_component/4 | (*liveview.Session).ComponentEvent | unknown | only the changed slot inside "c" |
| cmp-event-bump-cid2 | components | Phoenix.LiveView.Diff.write_component/4 | (*liveview.Session).ComponentEvent | unknown | the sibling component must contribute nothing |
| cmp-event-set-number | components | Phoenix.LiveView.Diff.write_component/4 | (*liveview.Session).ComponentEvent | unknown | |
| cmp-event-unhandled | components | Phoenix.LiveView.Diff.write_component/4 | (*liveview.Session).ComponentEvent | unknown | |
| cmp-event-unknown-cid | components | Phoenix.LiveView.Diff.write_component/4 | (*liveview.Session).ComponentEvent | unknown | addressing a cid that does not exist |
| comp-two-entries | comprehension | Phoenix.LiveView.Comprehension | liveview.FullDiff | unknown | |
| comp-one-entry | comprehension | Phoenix.LiveView.Comprehension | liveview.FullDiff | unknown | |
| comp-empty | comprehension | Phoenix.LiveView.Comprehension | liveview.FullDiff | unknown | |
| comp-five-entries | comprehension | Phoenix.LiveView.Comprehension | liveview.FullDiff | unknown | the per-entry statics must be shared, not repeated five times |
| comp-escape-entry | comprehension | Phoenix.LiveView.Comprehension | liveview.FullDiff | unknown | |
| comp-multi-slot | comprehension | Phoenix.LiveView.Comprehension | liveview.FullDiff | unknown | two slots per entry |
| comp-append-one | comprehension | Phoenix.LiveView.Diff.render/4 | liveview.DiffRendered | unknown | appending one entry must not re-send the statics or the untouched entry |
| comp-change-one | comprehension | Phoenix.LiveView.Diff.render/4 | liveview.DiffRendered | unknown | |
| comp-remove-one | comprehension | Phoenix.LiveView.Diff.render/4 | liveview.DiffRendered | unknown | |
| comp-unchanged | comprehension | Phoenix.LiveView.Diff.render/4 | liveview.DiffRendered | unknown | |
| comp-grow-from-empty | comprehension | Phoenix.LiveView.Diff.render/4 | liveview.DiffRendered | unknown | |
| comp-rows-change-one | comprehension | Phoenix.LiveView.Diff.render/4 | liveview.DiffRendered | unknown | |
| comp-html-two | comprehension | Phoenix.LiveView.Diff.to_iodata/1 | (*liveview.Rendered).HTML | unknown | the materialised HTML should agree even where the encoding does not |
| comp-html-empty | comprehension | Phoenix.LiveView.Diff.to_iodata/1 | (*liveview.Rendered).HTML | unknown | |
| min-count-only | diff-minimality | Phoenix.LiveView.Diff.render/4 | liveview.DiffRendered | unknown | only slot 1 may travel, and no "s" |
| min-label-only | diff-minimality | Phoenix.LiveView.Diff.render/4 | liveview.DiffRendered | unknown | |
| min-both | diff-minimality | Phoenix.LiveView.Diff.render/4 | liveview.DiffRendered | unknown | |
| min-nothing | diff-minimality | Phoenix.LiveView.Diff.render/4 | liveview.DiffRendered | unknown | identical renders must produce an empty diff |
| min-empty-to-value | diff-minimality | Phoenix.LiveView.Diff.render/4 | liveview.DiffRendered | unknown | |
| min-value-to-empty | diff-minimality | Phoenix.LiveView.Diff.render/4 | liveview.DiffRendered | unknown | |
| min-pair-first-only | diff-minimality | Phoenix.LiveView.Diff.render/4 | liveview.DiffRendered | unknown | |
| min-pair-second-only | diff-minimality | Phoenix.LiveView.Diff.render/4 | liveview.DiffRendered | unknown | |
| min-nested-inner-only | diff-minimality | Phoenix.LiveView.Diff.render/4 | liveview.DiffRendered | unknown | only the nested sub-diff may travel |
| min-nested-outer-only | diff-minimality | Phoenix.LiveView.Diff.render/4 | liveview.DiffRendered | unknown | the nested slot must be omitted entirely |
| min-nested-nothing | diff-minimality | Phoenix.LiveView.Diff.render/4 | liveview.DiffRendered | unknown | |
| min-nested-both | diff-minimality | Phoenix.LiveView.Diff.render/4 | liveview.DiffRendered | unknown | |
| min-reassign-same-values | diff-minimality | Phoenix.LiveView.Diff.render/4 | liveview.DiffRendered | unknown | every assign re-assigned to the same value |
| min-reassign-one-changed | diff-minimality | Phoenix.LiveView.Diff.render/4 | liveview.DiffRendered | unknown | every assign re-assigned, one value actually different |
| min-reassign-nested | diff-minimality | Phoenix.LiveView.Diff.render/4 | liveview.DiffRendered | unknown | |
| esc-all-five | escaping | MACRO-Phoenix.LiveView.Engine.to_safe/2 | (*liveview.Template).Render | unknown | all five HTML metacharacters at once |
| esc-none | escaping | MACRO-Phoenix.LiveView.Engine.to_safe/2 | (*liveview.Template).Render | unknown | |
| esc-double-quote | escaping | MACRO-Phoenix.LiveView.Engine.to_safe/2 | (*liveview.Template).Render | unknown | pins " against Go's html.EscapeString " |
| esc-apostrophe | escaping | MACRO-Phoenix.LiveView.Engine.to_safe/2 | (*liveview.Template).Render | unknown | |
| esc-existing-entity | escaping | MACRO-Phoenix.LiveView.Engine.to_safe/2 | (*liveview.Template).Render | unknown | an already-escaped entity must be escaped again |
| esc-whitespace | escaping | MACRO-Phoenix.LiveView.Engine.to_safe/2 | (*liveview.Template).Render | unknown | newlines and tabs must pass through untouched |
| esc-unicode | escaping | MACRO-Phoenix.LiveView.Engine.to_safe/2 | (*liveview.Template).Render | unknown | non-ASCII must not be entity-encoded |
| esc-script-tag | escaping | MACRO-Phoenix.LiveView.Engine.to_safe/2 | (*liveview.Template).Render | unknown | |
| esc-html-string | escaping | Phoenix.LiveView.Diff.to_iodata/1 | (*liveview.Rendered).HTML | unknown | |
| esc-raw-passthrough | escaping | Phoenix.HTML.raw/1 | liveview.Safe | unknown | raw/safe values must not be escaped |
| esc-raw-quotes | escaping | Phoenix.HTML.raw/1 | liveview.Safe | unknown | |
| esc-raw-html | escaping | Phoenix.LiveView.Diff.to_iodata/1 | (*liveview.Rendered).HTML | unknown | |
| ev-mount-default | events | Phoenix.LiveView.Diff.render/4 | (*liveview.Session).Mount | unknown | |
| ev-mount-label | events | Phoenix.LiveView.Diff.render/4 | (*liveview.Counter).Mount | unknown | |
| ev-mount-empty-label | events | Phoenix.LiveView.Diff.render/4 | (*liveview.Counter).Mount | unknown | empty label must fall back to "Counter" |
| ev-mount-start | events | Phoenix.LiveView.Diff.render/4 | (*liveview.Counter).Mount | unknown | params["start"] arrives as a JSON number |
| ev-inc | events | Phoenix.LiveView.Diff.render/4 | (*liveview.Counter).HandleEvent | unknown | |
| ev-dec | events | Phoenix.LiveView.Diff.render/4 | (*liveview.Counter).HandleEvent | unknown | |
| ev-inc-no-initial | events | Phoenix.LiveView.Diff.render/4 | (*liveview.Session).Event | unknown | control for cmp-parent-change-no-initial: no components, so nothing can be re-sent |
| ev-set-int | events | Phoenix.LiveView.Diff.render/4 | (*liveview.Counter).HandleEvent | unknown | JSON number: decodes as float64 in Go, so the int type assertion is a silent no-op |
| ev-set-zero | events | Phoenix.LiveView.Diff.render/4 | (*liveview.Counter).HandleEvent | unknown | |
| ev-set-float | events | Phoenix.LiveView.Diff.render/4 | (*liveview.Counter).HandleEvent | unknown | |
| ev-set-string | events | Phoenix.LiveView.Diff.render/4 | (*liveview.Counter).HandleEvent | unknown | |
| ev-set-missing-value | events | Phoenix.LiveView.Diff.render/4 | (*liveview.Counter).HandleEvent | unknown | both sides must no-op |
| ev-label | events | Phoenix.LiveView.Diff.render/4 | (*liveview.Counter).HandleEvent | unknown | |
| ev-label-escaped | events | Phoenix.LiveView.Diff.render/4 | (*liveview.Counter).HandleEvent | unknown | |
| ev-label-same-value | events | Phoenix.LiveView.Diff.render/4 | (*liveview.Counter).HandleEvent | unknown | assigning the same value again |
| ev-label-nonstring | events | Phoenix.LiveView.Diff.render/4 | (*liveview.Counter).HandleEvent | unknown | both sides must ignore a non-string |
| ev-label-missing-text | events | Phoenix.LiveView.Diff.render/4 | (*liveview.Counter).HandleEvent | unknown | |
| ev-unknown-event | events | Phoenix.LiveView.Diff.render/4 | (*liveview.Counter).HandleEvent | unknown | an unhandled event must produce an empty diff |
| split-counter-full | static-split | Phoenix.LiveView.Diff.render/4 | liveview.FullDiff | unknown | the port's own Counter template, two slots |
| split-pair-adjacent | static-split | Phoenix.LiveView.Diff.render/4 | liveview.FullDiff | unknown | two adjacent slots: the static between them must be "" |
| split-lead | static-split | Phoenix.LiveView.Diff.render/4 | liveview.FullDiff | unknown | slot first: statics[0] must be "" |
| split-trail | static-split | Phoenix.LiveView.Diff.render/4 | liveview.FullDiff | unknown | slot last: the final static must be "" |
| split-plain-no-slots | static-split | Phoenix.LiveView.Diff.render/4 | liveview.FullDiff | unknown | no dynamics at all |
| split-one | static-split | Phoenix.LiveView.Diff.render/4 | liveview.FullDiff | unknown | |
| split-empty-string | static-split | Phoenix.LiveView.Diff.render/4 | liveview.FullDiff | unknown | |
| split-nested-subtemplate | static-split | Phoenix.LiveView.Diff.render/4 | liveview.FullDiff | unknown | a nested Rendered: the sub-template's own statics live inside the slot |
| split-missing-assign | static-split | Phoenix.LiveView.Diff.render/4 | liveview.FullDiff | unknown | slot names an assign that was never set |
| split-int | static-split | Phoenix.LiveView.Diff.render/4 | liveview.FullDiff | unknown | |
| split-int-zero | static-split | Phoenix.LiveView.Diff.render/4 | liveview.FullDiff | unknown | |
| split-int-negative | static-split | Phoenix.LiveView.Diff.render/4 | liveview.FullDiff | unknown | |
| split-float-whole | static-split | Phoenix.LiveView.Diff.render/4 | liveview.FullDiff | unknown | JSON 1.0 — how is a whole float stringified? |
| split-float-frac | static-split | Phoenix.LiveView.Diff.render/4 | liveview.FullDiff | unknown | |
| split-bool-true | static-split | Phoenix.LiveView.Diff.render/4 | liveview.FullDiff | unknown | |
| split-bool-false | static-split | Phoenix.LiveView.Diff.render/4 | liveview.FullDiff | unknown | |
| split-nil | static-split | Phoenix.LiveView.Diff.render/4 | liveview.FullDiff | unknown | |
| split-list-interp | static-split | Phoenix.LiveView.Diff.render/4 | liveview.FullDiff | unknown | a list interpolated into a single slot |
| split-html-counter | static-split | Phoenix.LiveView.Diff.to_iodata/1 | (*liveview.Rendered).HTML | unknown | same split, materialised as HTML |
| split-html-nested | static-split | Phoenix.LiveView.Diff.to_iodata/1 | (*liveview.Rendered).HTML | unknown | |
| split-html-plain | static-split | Phoenix.LiveView.Diff.to_iodata/1 | (*liveview.Rendered).HTML | unknown |