# `Statifier.Validator.Checks.DefaultTransition`
[🔗](https://github.com/riddler/statifier-ex/blob/v2.0.0/lib/statifier/validator/checks/default_transition.ex#L1)

The sub-check checks 4 and 5 share: an `<initial>` element's
and a `:history` state's whole content model is one constrained
`<transition>` - required, exactly one, a non-null `target`, no `event`,
no `cond`. Spec 3.6 states this for `<initial>`; spec 3.10 states it for
`<history>`'s default transition, more strictly than a looser
"when present" reading - the spec's stricter wording wins.

`Statifier.Document.Initial.transitions` and a `:history` state's own
`transitions` share the same `[Transition.t()]` shape
(`lib/statifier/document/initial.ex`), so one function serves both -
`check/3` never needs to know which element it is looking at beyond the
`owner` tag it is handed.

This module is not itself one of `Statifier.Validator`'s `@checks` - it
has no standalone entry, only a `check/3` consumed by
`Statifier.Validator.Checks.InitialElement` and
`Statifier.Validator.Checks.History`.

The `event` oracle is `Map.has_key?(transition.attribute_locations, :event)`,
because `Statifier.Lowering.Attributes.list/2` returns `[]` for both an
absent `event` and `event=""` - the list alone cannot tell the two apart.
This inherits a narrowing already accepted for `Statifier.Lowering.Attributes.put_location/4`:
a written attribute whose `value_location` is `nil` (the parser handler's
short-scan tolerance) never gets an `attribute_locations` entry either, so
a document that trips *both* that tolerance *and* writes `event=""` slips
past this check unreported. Accepted: it is the only oracle available at
this layer, and closing it means changing what lowering records, which
belongs to `Statifier.Lowering.Attributes`, not this check. `cond` needs no such oracle - it is
`nil` when absent and `""` when written empty, so `!= nil` is exact.

# `check`

```elixir
@spec check(
  owner :: Statifier.Validator.Error.owner(),
  transitions :: [Statifier.Document.Transition.t()],
  owner_location :: Statifier.Parser.Location.t()
) :: [Statifier.Validator.Error.t()]
```

`owner` identifies which element's content model is being checked
(`{:initial, id}` or `{:history, id}`); `transitions` is that element's
transition list; `owner_location` is where a wrong *count* is reported -
the element itself has no transition to point at when the count is zero.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
