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 / glTF
Every number on this page was produced by running both implementations over the same cases: the real @gltf-transform/core package pinned at 4.2.1 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 glTF for the port's own documentation. Source: github.com/malcolmston/gltf.
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 |
|---|---|---|---|---|
| accessors | 48 | 48 | 0 | 100.0% |
| validation | 33 | 30 | 3 | 90.9% |
| crosswrite | 10 | 10 | 0 | 100.0% |
| roundtrip | 10 | 10 | 0 | 100.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: glTF 2.0 object types and their properties: reflect over each gltf struct and
print its `json:"…"` tags (throwaway program in a scratch module that requires
the pinned gltf version):
t := reflect.TypeOf(gltf.Document{})
for i := range t.NumField() { fmt.Println(t.Field(i).Tag.Get("json")) }
repeated for Asset, Scene, Node, Mesh, Primitive, Accessor, Sparse,
BufferView, Buffer, Material, PBRMetallicRoughness, TextureInfo,
NormalTexture, OcclusionTexture, Texture, Image, Sampler, Animation,
AnimationChannel, AnimationChannelTarget, AnimationSampler, Skin, Camera,
CameraPerspective, CameraOrthogr…. A symbol with no case is untested, never a match.
| Upstream symbol | Go symbol | Status | Cases | Note |
|---|---|---|---|---|
| glTF (root) | gltf.Document | match | describe-*, xread-* | |
| ↑ | gltf.Document | untested | — | no fixture declares a required extension |
| ↑ | gltf.Document | match | describe-*, xread-* | |
| ↑ | gltf.Document | match | describe-*, decode-* | |
| ↑ | gltf.Document | match | decode-accessors-32, decode-accessors-33 | compared through decoded values (incl. byteStride 20 interleaving) |
| ↑ | gltf.Document | match | describe-scene-gltf | |
| ↑ | gltf.Document | match | describe-scene-gltf, xread-scene-gltf | data URI on read; bufferView-backed after @gltf-transform writes GLB |
| ↑ | gltf.Document | match | describe-animated-glb | |
| asset | gltf.Asset | untested | — | |
| ↑ | gltf.Asset | untested | — | each writer stamps its own; deliberately not compared |
| ↑ | gltf.Asset | differs | describe-*, parses-bad-no-asset-gltf | values agree, but Go's parser accepts a document with no asset object where @gltf-transform throws (Validate does reject it) |
| scene | gltf.Scene | match | describe-*, xread-* | |
| ↑ | gltf.Scene | match | describe-*, xread-* | |
| ↑ | gltf.Scene | untested | — | |
| node | gltf.Node | match | describe-*, xread-* | |
| ↑ | gltf.Node | match | describe-scene-gltf | |
| ↑ | gltf.Node | match | describe-*, xread-* | |
| ↑ | gltf.Node | match | describe-animated-glb | |
| ↑ | gltf.Node | untested | — | |
| mesh | gltf.Mesh | match | describe-*, xread-* | |
| ↑ | gltf.Mesh | match | describe-*, xread-* | |
| ↑ | gltf.Mesh | match | describe-animated-glb | |
| ↑ | gltf.Mesh | untested | — | |
| mesh.primitive | gltf.Primitive | match | describe-*, xread-* | POSITION/NORMAL/TEXCOORD_0/COLOR_0/JOINTS_0/WEIGHTS_0 |
| ↑ | gltf.Primitive | match | describe-*, xread-* | |
| ↑ | gltf.Primitive | match | describe-scene-gltf | POINTS, LINES, TRIANGLES and the default |
| ↑ | gltf.Primitive | match | describe-animated-glb | morph target POSITION deltas |
| ↑ | gltf.Primitive | untested | — | |
| accessor | gltf.Accessor | match | decode-* | |
| ↑ | gltf.Accessor | match | decode-accessors-33 | non-zero offset inside an interleaved view |
| ↑ | gltf.Accessor | match | describe-*, decode-accessors-* | all six component types |
| ↑ | gltf.Accessor | match | decode-accessors-27..30, decode-scene-03 | |
| ↑ | gltf.Accessor | match | describe-*, xread-* | |
| ↑ | gltf.Accessor | differs | validate-bad-min-mismatch-gltf | declared bounds are read but never checked against the data; gltf-validator rejects the same asset (ACCESSOR_MIN_MISMATCH) |
| ↑ | gltf.Accessor | match | decode-accessors-31 | |
| ↑ | gltf.Accessor | untested | — | not described |
| accessor.sparse | gltf.Sparse | match | decode-accessors-31 | |
| ↑ | gltf.Sparse | match | decode-accessors-31 | |
| ↑ | gltf.Sparse | untested | — | |
| bufferView | gltf.BufferView | match | decode-* | |
| ↑ | gltf.BufferView | match | decode-* | |
| ↑ | gltf.BufferView | match | decode-accessors-32, decode-accessors-33 | |
| ↑ | gltf.BufferView | untested | — | @gltf-transform recomputes the target on write, so it cannot be compared |
| buffer | gltf.Buffer | match | describe-triangle-gltf, xread-* | base64 data URI and GLB BIN chunk |
| ↑ | gltf.Buffer | match | decode-* | |
| ↑ | gltf.Buffer | untested | — | |
| material | gltf.Material | match | describe-scene-gltf | |
| ↑ | gltf.Material | match | describe-scene-gltf | |
| ↑ | gltf.Material | differs | describe-scene-gltf, validate-bad-bad-alpha-mode-gltf | values agree; Go's Validate rejects an unknown alphaMode, gltf-validator only warns |
| ↑ | gltf.Material | untested | — | |
| material.pbrMetallicRoughness | gltf.PBRMetallicRoughness | match | describe-scene-gltf | |
| ↑ | gltf.PBRMetallicRoughness | match | describe-scene-gltf | |
| ↑ | gltf.PBRMetallicRoughness | untested | — | |
| textureInfo | gltf.TextureInfo | match | describe-scene-gltf | |
| ↑ | gltf.TextureInfo | match | describe-scene-gltf | |
| ↑ | gltf.TextureInfo | untested | — | |
| material.normalTextureInfo | gltf.NormalTexture | match | describe-scene-gltf | |
| ↑ | gltf.NormalTexture | match | describe-scene-gltf | |
| ↑ | gltf.NormalTexture | untested | — | |
| material.occlusionTextureInfo | gltf.OcclusionTexture | match | describe-scene-gltf | |
| ↑ | gltf.OcclusionTexture | match | describe-scene-gltf | |
| ↑ | gltf.OcclusionTexture | untested | — | |
| texture | gltf.Texture | untested | — | not described |
| ↑ | gltf.Texture | match | describe-scene-gltf | compared as the filters/wrap modes on each texture reference, matching @gltf-transform's model |
| ↑ | gltf.Texture | untested | — | |
| image | gltf.Image | untested | — | |
| ↑ | gltf.Image | match | describe-scene-gltf | base64 PNG data URI |
| ↑ | gltf.Image | match | xread-scene-gltf | exercised on the cross read: @gltf-transform moves images into the buffer when writing GLB |
| ↑ | gltf.Image | untested | — | |
| sampler | gltf.Sampler | untested | — | |
| ↑ | gltf.Sampler | match | describe-scene-gltf | |
| ↑ | gltf.Sampler | untested | — | |
| animation | gltf.Animation | match | describe-animated-glb | |
| ↑ | gltf.Animation | match | describe-animated-glb | |
| ↑ | gltf.Animation | untested | — | |
| animation.channel | gltf.AnimationChannel | match | describe-animated-glb | |
| ↑ | gltf.AnimationChannel | match | describe-animated-glb | |
| ↑ | gltf.AnimationChannel | untested | — | |
| animation.channel.target | gltf.AnimationChannelTarget | match | describe-animated-glb | |
| ↑ | gltf.AnimationChannelTarget | match | describe-animated-glb | translation, rotation, scale, weights |
| ↑ | gltf.AnimationChannelTarget | untested | — | |
| animation.sampler | gltf.AnimationSampler | match | describe-animated-glb | |
| ↑ | gltf.AnimationSampler | match | describe-animated-glb | LINEAR, STEP, CUBICSPLINE and the default |
| ↑ | gltf.AnimationSampler | untested | — | |
| skin | gltf.Skin | match | describe-animated-glb | |
| ↑ | gltf.Skin | match | describe-animated-glb, decode-animated-05 | |
| ↑ | gltf.Skin | match | describe-animated-glb | |
| ↑ | gltf.Skin | untested | — | |
| camera | gltf.Camera | match | describe-scene-gltf | |
| ↑ | gltf.Camera | match | describe-scene-gltf | |
| ↑ | gltf.Camera | untested | — | |
| camera.perspective | gltf.CameraPerspective | match | describe-scene-gltf | |
| ↑ | gltf.CameraPerspective | match | describe-scene-gltf | |
| ↑ | gltf.CameraPerspective | untested | — | |
| camera.orthographic | gltf.CameraOrthographic | match | describe-scene-gltf | |
| ↑ | gltf.CameraOrthographic | match | describe-scene-gltf | |
| ↑ | gltf.CameraOrthographic | untested | — | |
| KHR_materials_unlit | ExtMaterialsUnlit | match | describe-scene-gltf | |
| KHR_materials_emissive_strength | ExtMaterialsEmissiveStrength | match | describe-scene-gltf | |
| KHR_materials_ior | ExtMaterialsIOR | match | describe-scene-gltf |
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 |
|---|---|---|---|---|---|
| decode-accessors-00 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 / DecodeAccessorUint32 | match | |
| decode-accessors-01 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 / DecodeAccessorUint32 | match | |
| decode-accessors-02 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 / DecodeAccessorUint32 | match | |
| decode-accessors-03 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 / DecodeAccessorUint32 | match | |
| decode-accessors-04 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 / DecodeAccessorUint32 | match | |
| decode-accessors-05 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 / DecodeAccessorUint32 | match | |
| decode-accessors-06 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 / DecodeAccessorUint32 | match | |
| decode-accessors-07 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 / DecodeAccessorUint32 | match | |
| decode-accessors-08 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 / DecodeAccessorUint32 | match | |
| decode-accessors-09 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 / DecodeAccessorUint32 | match | |
| decode-accessors-10 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 / DecodeAccessorUint32 | match | |
| decode-accessors-11 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 / DecodeAccessorUint32 | match | |
| decode-accessors-12 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 / DecodeAccessorUint32 | match | |
| decode-accessors-13 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 / DecodeAccessorUint32 | match | |
| decode-accessors-14 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 / DecodeAccessorUint32 | match | |
| decode-accessors-15 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 / DecodeAccessorUint32 | match | |
| decode-accessors-16 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 / DecodeAccessorUint32 | match | |
| decode-accessors-17 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 / DecodeAccessorUint32 | match | |
| decode-accessors-18 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 / DecodeAccessorUint32 | match | |
| decode-accessors-19 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 / DecodeAccessorUint32 | match | |
| decode-accessors-20 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 / DecodeAccessorUint32 | match | |
| decode-accessors-21 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 / DecodeAccessorUint32 | match | |
| decode-accessors-22 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 / DecodeAccessorUint32 | match | |
| decode-accessors-23 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 / DecodeAccessorUint32 | match | |
| decode-accessors-24 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 / DecodeAccessorUint32 | match | |
| decode-accessors-25 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 / DecodeAccessorUint32 | match | |
| decode-accessors-26 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 / DecodeAccessorUint32 | match | |
| decode-accessors-27 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 / DecodeAccessorUint32 | match | |
| decode-accessors-28 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 / DecodeAccessorUint32 | match | |
| decode-accessors-29 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 / DecodeAccessorUint32 | match | |
| decode-accessors-30 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 / DecodeAccessorUint32 | match | |
| decode-accessors-31 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 / DecodeAccessorUint32 | match | |
| decode-accessors-32 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 / DecodeAccessorUint32 | match | |
| decode-accessors-33 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 / DecodeAccessorUint32 | match | |
| decode-accessors-34 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 / DecodeAccessorUint32 | match | |
| decode-scene-00 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 | match | POSITION |
| decode-scene-01 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 | match | NORMAL |
| decode-scene-02 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 | match | TEXCOORD_0 |
| decode-scene-03 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 | match | COLOR_0 normalized UNSIGNED_BYTE |
| decode-scene-04 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 | match | indices |
| decode-animated-05 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 | match | MAT4 inverse bind matrices |
| decode-animated-06 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 | match | animation input times |
| decode-animated-07 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 | match | translation output |
| decode-animated-08 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 | match | rotation output |
| decode-animated-09 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 | match | scale output |
| decode-animated-10 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 | match | morph weight output |
| decode-animated-11 | accessors | Accessor.getElement | Document.DecodeAccessorFloat32 | match | CUBICSPLINE output |
| decode-accessors-out-of-range | accessors | Root.listAccessors | Document.DecodeAccessorFloat32 | match | both sides must fail |
| xwrite-triangle-gltf | crosswrite | NodeIO.writeBinary | gltf.SaveGLB | match | each side writes the same fixture as GLB into the shared output directory |
| xread-triangle-gltf | crosswrite | NodeIO.readBinary | gltf.OpenGLB | match | self = own GLB re-read; cross = the other implementation's GLB. Equal values across runners prove interop in both directions. |
| xwrite-triangle-glb | crosswrite | NodeIO.writeBinary | gltf.SaveGLB | match | each side writes the same fixture as GLB into the shared output directory |
| xread-triangle-glb | crosswrite | NodeIO.readBinary | gltf.OpenGLB | match | self = own GLB re-read; cross = the other implementation's GLB. Equal values across runners prove interop in both directions. |
| xwrite-scene-gltf | crosswrite | NodeIO.writeBinary | gltf.SaveGLB | match | each side writes the same fixture as GLB into the shared output directory |
| xread-scene-gltf | crosswrite | NodeIO.readBinary | gltf.OpenGLB | match | self = own GLB re-read; cross = the other implementation's GLB. Equal values across runners prove interop in both directions. |
| xwrite-animated-glb | crosswrite | NodeIO.writeBinary | gltf.SaveGLB | match | each side writes the same fixture as GLB into the shared output directory |
| xread-animated-glb | crosswrite | NodeIO.readBinary | gltf.OpenGLB | match | self = own GLB re-read; cross = the other implementation's GLB. Equal values across runners prove interop in both directions. |
| xwrite-accessors-glb | crosswrite | NodeIO.writeBinary | gltf.SaveGLB | match | each side writes the same fixture as GLB into the shared output directory |
| xread-accessors-glb | crosswrite | NodeIO.readBinary | gltf.OpenGLB | match | self = own GLB re-read; cross = the other implementation's GLB. Equal values across runners prove interop in both directions. |
| describe-triangle-gltf | roundtrip | NodeIO.read/readBinary + Document/Root accessors | gltf.Open/gltf.OpenGLB + Document fields | match | canonical structural description: hierarchy, transforms, primitives, accessors, materials, animations, skins, cameras, extensions |
| accessor-count-triangle-gltf | roundtrip | Root.listAccessors | Document.Accessors | match | |
| describe-triangle-glb | roundtrip | NodeIO.read/readBinary + Document/Root accessors | gltf.Open/gltf.OpenGLB + Document fields | match | canonical structural description: hierarchy, transforms, primitives, accessors, materials, animations, skins, cameras, extensions |
| accessor-count-triangle-glb | roundtrip | Root.listAccessors | Document.Accessors | match | |
| describe-scene-gltf | roundtrip | NodeIO.read/readBinary + Document/Root accessors | gltf.Open/gltf.OpenGLB + Document fields | match | canonical structural description: hierarchy, transforms, primitives, accessors, materials, animations, skins, cameras, extensions |
| accessor-count-scene-gltf | roundtrip | Root.listAccessors | Document.Accessors | match | |
| describe-animated-glb | roundtrip | NodeIO.read/readBinary + Document/Root accessors | gltf.Open/gltf.OpenGLB + Document fields | match | canonical structural description: hierarchy, transforms, primitives, accessors, materials, animations, skins, cameras, extensions |
| accessor-count-animated-glb | roundtrip | Root.listAccessors | Document.Accessors | match | |
| describe-accessors-glb | roundtrip | NodeIO.read/readBinary + Document/Root accessors | gltf.Open/gltf.OpenGLB + Document fields | match | canonical structural description: hierarchy, transforms, primitives, accessors, materials, animations, skins, cameras, extensions |
| accessor-count-accessors-glb | roundtrip | Root.listAccessors | Document.Accessors | match | |
| validate-triangle-gltf | validation | gltf-validator.validateBytes | Document.Validate | match | well-formed fixture: both sides must accept |
| validate-triangle-glb | validation | gltf-validator.validateBytes | Document.Validate | match | well-formed fixture: both sides must accept |
| validate-scene-gltf | validation | gltf-validator.validateBytes | Document.Validate | match | well-formed fixture: both sides must accept |
| validate-animated-glb | validation | gltf-validator.validateBytes | Document.Validate | match | well-formed fixture: both sides must accept |
| validate-accessors-glb | validation | gltf-validator.validateBytes | Document.Validate | match | well-formed fixture: both sides must accept |
| validate-bad-accessor-too-long-gltf | validation | gltf-validator.validateBytes | gltf.Open/OpenGLB + Document.Validate | match | deliberately malformed: both sides must reject |
| validate-bad-animation-bad-sampler-gltf | validation | gltf-validator.validateBytes | gltf.Open/OpenGLB + Document.Validate | match | deliberately malformed: both sides must reject |
| validate-bad-bad-accessor-index-gltf | validation | gltf-validator.validateBytes | gltf.Open/OpenGLB + Document.Validate | match | deliberately malformed: both sides must reject |
| validate-bad-bad-accessor-type-gltf | validation | gltf-validator.validateBytes | gltf.Open/OpenGLB + Document.Validate | match | deliberately malformed: both sides must reject |
| validate-bad-bad-alpha-mode-gltf | validation | gltf-validator.validateBytes | gltf.Open/OpenGLB + Document.Validate | mismatch | deliberately malformed: both sides must reject |
| validate-bad-bad-buffer-view-range-gltf | validation | gltf-validator.validateBytes | gltf.Open/OpenGLB + Document.Validate | match | deliberately malformed: both sides must reject |
| validate-bad-bad-component-type-gltf | validation | gltf-validator.validateBytes | gltf.Open/OpenGLB + Document.Validate | match | deliberately malformed: both sides must reject |
| validate-bad-bad-glb-version-glb | validation | gltf-validator.validateBytes | gltf.Open/OpenGLB + Document.Validate | match | deliberately malformed: both sides must reject |
| validate-bad-bad-json-gltf | validation | gltf-validator.validateBytes | gltf.Open/OpenGLB + Document.Validate | match | deliberately malformed: both sides must reject |
| validate-bad-bad-magic-glb | validation | gltf-validator.validateBytes | gltf.Open/OpenGLB + Document.Validate | match | deliberately malformed: both sides must reject |
| validate-bad-bad-node-child-index-gltf | validation | gltf-validator.validateBytes | gltf.Open/OpenGLB + Document.Validate | match | deliberately malformed: both sides must reject |
| validate-bad-bad-primitive-mode-gltf | validation | gltf-validator.validateBytes | gltf.Open/OpenGLB + Document.Validate | match | deliberately malformed: both sides must reject |
| validate-bad-bad-scene-index-gltf | validation | gltf-validator.validateBytes | gltf.Open/OpenGLB + Document.Validate | match | deliberately malformed: both sides must reject |
| validate-bad-camera-missing-projection-gltf | validation | gltf-validator.validateBytes | gltf.Open/OpenGLB + Document.Validate | match | deliberately malformed: both sides must reject |
| validate-bad-empty-gltf | validation | gltf-validator.validateBytes | gltf.Open/OpenGLB + Document.Validate | match | deliberately malformed: both sides must reject |
| validate-bad-min-mismatch-gltf | validation | gltf-validator.validateBytes | gltf.Open/OpenGLB + Document.Validate | mismatch | deliberately malformed: both sides must reject |
| validate-bad-no-asset-version-gltf | validation | gltf-validator.validateBytes | gltf.Open/OpenGLB + Document.Validate | match | deliberately malformed: both sides must reject |
| validate-bad-no-asset-gltf | validation | gltf-validator.validateBytes | gltf.Open/OpenGLB + Document.Validate | match | deliberately malformed: both sides must reject |
| validate-bad-node-matrix-and-trs-gltf | validation | gltf-validator.validateBytes | gltf.Open/OpenGLB + Document.Validate | match | deliberately malformed: both sides must reject |
| validate-bad-skin-bad-joint-gltf | validation | gltf-validator.validateBytes | gltf.Open/OpenGLB + Document.Validate | match | deliberately malformed: both sides must reject |
| validate-bad-truncated-glb | validation | gltf-validator.validateBytes | gltf.Open/OpenGLB + Document.Validate | match | deliberately malformed: both sides must reject |
| validate-bad-unresolved-material-gltf | validation | gltf-validator.validateBytes | gltf.Open/OpenGLB + Document.Validate | match | deliberately malformed: both sides must reject |
| parses-bad-bad-json-gltf | validation | NodeIO.read/readBinary | gltf.Open/gltf.OpenGLB | match | container-level damage: both parsers must fail |
| parses-bad-empty-gltf | validation | NodeIO.read/readBinary | gltf.Open/gltf.OpenGLB | match | container-level damage: both parsers must fail |
| parses-bad-bad-magic-glb | validation | NodeIO.read/readBinary | gltf.Open/gltf.OpenGLB | match | container-level damage: both parsers must fail |
| parses-bad-bad-glb-version-glb | validation | NodeIO.read/readBinary | gltf.Open/gltf.OpenGLB | match | container-level damage: both parsers must fail |
| parses-bad-truncated-glb | validation | NodeIO.read/readBinary | gltf.Open/gltf.OpenGLB | match | container-level damage: both parsers must fail |