Skip to content

Releases: JohnVerheij/MathAssertions.TUnit

v0.5.0

14 Jun 12:36
v0.5.0
9efadd0

Choose a tag to compare

[0.5.0] - 2026-06-14: scale-invariant parallelism, angle and rotation assertions

Minor release. Fixes the scale-dependence of the parallel check and adds an angle-between assertion and a proper-rotation matrix assertion.

Fixed

  • AreParallel / IsParallelTo are now scale-invariant. The check compared the raw cross-product magnitude |u x v| against an absolute tolerance, so whether two vectors read as parallel depended on their length, not just their direction: the same angular deviation passed at unit scale and failed at large scale. It now compares the sine of the angle, |u x v| / (|u| |v|), against the tolerance (an angular measure), the same normalization the package already applied in IsCollinear. A zero or shorter-than-tolerance vector is still treated as parallel to any vector. Tolerances chosen for unit vectors are unchanged in meaning; tolerances applied to non-unit vectors now express an angle rather than a magnitude.

Added

  • Assert.That(vector).HasAngleBetweenApproximately(other, expectedRadians, tolerance) asserts the unsigned angle between two vectors (on [0, pi]) is within tolerance of an expected value. The angle is computed as atan2(|u x v|, u . v), which stays accurate across the whole range where acos of the normalized dot product loses precision near 0 and pi. LinearAlgebra.AngleBetween(u, v) exposes the same computation on the framework-agnostic core.
  • Assert.That(matrix).IsRotation(tolerance) asserts a Matrix4x4 is a proper rotation: orthogonal (M * M^T = I) with determinant +1. Reflections (determinant -1) and matrices carrying translation or scale are rejected. Exposed on the core as LinearAlgebra.IsRotation.

Changed

  • Bumped PackageValidationBaselineVersion from 0.4.2 to 0.4.3 on both packages so ApiCompat strict-mode validates 0.5.0 against the most recently published baseline.

v0.4.3

12 Jun 04:20
v0.4.3
d4bcc38

Choose a tag to compare

[0.4.3] - 2026-06-12: double-precision magnitude for IsNormalized and HasMagnitudeApproximately

Patch release. Computes vector and quaternion magnitudes in double precision so a tight tolerance reflects the value's actual deviation from unit length rather than single-precision arithmetic noise. No public API change.

Fixed

  • IsNormalized (Vector3 and Quaternion) and HasMagnitudeApproximately (Vector3) now compute the magnitude in double precision. They previously called System.Numerics.Vector3.Length() / Quaternion.Length(), which compute the dot product and square root in float. The residual single-precision error could defeat a tight tolerance: a quaternion normalized to float precision could fail IsNormalized at a small tolerance, and at large coordinates the float square overflows to infinity, which makes HasMagnitudeApproximately unsatisfiable. The components now widen to double before the sum of squares and the square root, the same widening already used for PositionDistance and the 0.4.1 quaternion-angle fix. The comparison semantics and the meaning of tolerance are unchanged.

Changed

  • Bumped PackageValidationBaselineVersion from 0.4.1 to 0.4.2 on both packages so ApiCompat strict-mode validates 0.4.3 against the most recently published baseline. No public API change; only the assembly-version suppression's target moves.

v0.4.2

05 Jun 19:27
v0.4.2
b8d2990

Choose a tag to compare

[0.4.2] - 2026-06-05: pose-tolerance migration and projection docs

Documentation and release-tooling patch. No code, public API, or behavior change; the 0.4.1 ApiCompat baseline surface is unchanged.

Changed

  • README adds a "Migrating from a per-component quaternion tolerance" note under the pose section: rotationToleranceDegrees is a geodesic angle in degrees, not a per-component quaternion delta, so a component epsilon must not be reused as the rotation tolerance. The note gives the rough angle-to-component mapping (a component tolerance ε corresponds to about 115·ε degrees) so a fresh degrees value can be chosen.
  • README adds a "Projecting a non-System.Numerics pose" example: IsPoseApproximatelyEqualTo operates on System.Numerics, so a pose arriving as another shape (for example a protobuf message with separate position and orientation fields) is projected to Vector3 / Quaternion first, with a short conversion snippet.
  • The packed package README cross-references the migration note from the PoseAssertions entry.
  • Bumped PackageValidationBaselineVersion from 0.4.0 to 0.4.1 on both packages so ApiCompat strict-mode validates 0.4.2 against the most recently published baseline. Documentation-only; no CompatibilitySuppressions.xml change.
  • The release workflow now publishes the matching CHANGELOG.md section as the GitHub release body (body_path), so release notes carry the full hand-written detail instead of GitHub's auto-generated commit summary.

v0.4.1

03 Jun 18:24
v0.4.1
8a96dc8

Choose a tag to compare

What's Changed

  • fix: stabilize quaternion rotation-angle metric (atan2, normalized) by @JohnVerheij in #58

Full Changelog: v0.4.0...v0.4.1

v0.4.0

02 Jun 19:06
v0.4.0
c5222d7

Choose a tag to compare

What's Changed

  • chore: TUnit 1.44.39 + CONVENTIONS.md v0.4 (family lockstep) by @JohnVerheij in #23
  • chore(family): Release Notes pipeline, CONVENTIONS v0.5, codecov 90%, CoC v3.0 by @JohnVerheij in #24
  • chore: split CoC and security reporting channels by @JohnVerheij in #25
  • chore(family): CONVENTIONS v0.7 + six-package roster by @JohnVerheij in #26
  • ci(deps): bump github/codeql-action from 4.35.4 to 4.35.5 by @dependabot[bot] in #27
  • chore(infra): family-consistency sweep - Renovate migration by @JohnVerheij in #28
  • ci(github-actions): update codecov/codecov-action digest to e79a696 by @renovate[bot] in #30
  • ci(nuget): update dotnet monorepo by @renovate[bot] in #31
  • deps(nuget): update dependency meziantou.analyzer to 3.0.90 by @renovate[bot] in #32
  • deps(nuget): update dependency sonaranalyzer.csharp to 10.26.0.140279 by @renovate[bot] in #34
  • deps(nuget): update dependency snapshotassertions.tunit to 0.4.0 by @renovate[bot] in #33
  • deps(nuget): update tunit to v1.45.22 by @renovate[bot] in #35
  • deps(nuget): update tunit to v1.45.29 by @renovate[bot] in #36
  • deps(nuget): update dependency meziantou.analyzer to 3.0.91 by @renovate[bot] in #37
  • ci(github-actions): update github/codeql-action digest to 7211b7c by @renovate[bot] in #38
  • deps(nuget): update dependency meziantou.analyzer to 3.0.92 by @renovate[bot] in #39
  • deps(nuget): update dependency meziantou.analyzer to 3.0.93 by @renovate[bot] in #40
  • deps(nuget): update dependency meziantou.analyzer to 3.0.94 by @renovate[bot] in #41
  • deps(nuget): update dependency sonaranalyzer.csharp to 10.27.0.140913 by @renovate[bot] in #42
  • ci(github-actions): update actions/setup-dotnet digest to 9a946fd by @renovate[bot] in #43
  • deps(nuget): update dependency meziantou.analyzer to 3.0.98 by @renovate[bot] in #44
  • deps(nuget): update tunit to v1.47.0 by @renovate[bot] in #45
  • chore(ci): add GitHub Actions security scanning and supply-chain hardening by @JohnVerheij in #46
  • ci(github-actions): update actions/upload-artifact action to v7.0.1 by @renovate[bot] in #48
  • ci(github-actions): update actions/setup-dotnet action to v5.3.0 by @renovate[bot] in #50
  • ci(github-actions): update codecov/codecov-action action to v6.0.1 by @renovate[bot] in #49
  • ci(github-actions): update nuget/login action to v1.2.0 by @renovate[bot] in #52
  • ci(github-actions): update github/codeql-action action to v4.36.0 by @renovate[bot] in #51
  • ci(github-actions): update actions/checkout action to v6.0.2 by @renovate[bot] in #47
  • deps(nuget): update dependency dotnetprojectfile.analyzers to 1.14.1 by @renovate[bot] in #54
  • deps(nuget): update tunit to v1.48.6 by @renovate[bot] in #55
  • feat: pose and rigid-transform approximate-equality assertions by @JohnVerheij in #53
  • ci(github-actions): update actions/checkout action to v6.0.3 by @renovate[bot] in #56
  • ci(github-actions): update github/codeql-action action to v4.36.1 by @renovate[bot] in #57

New Contributors

Full Changelog: v0.3.0...v0.4.0

v0.3.0

14 May 13:11
v0.3.0
79fd604

Choose a tag to compare

What's Changed

  • docs: add CHANGELOG version link-reference definitions by @JohnVerheij in #21
  • feat(v0.3.0): add PoseRenderer and refresh family dependency lockstep by @JohnVerheij in #22

Full Changelog: v0.2.0...v0.3.0

v0.2.0

12 May 17:30
v0.2.0
fd596e2

Choose a tag to compare

What's Changed

  • docs: cookbook entries for quaternion / plane comparison and NaN section by @JohnVerheij in #15
  • docs: reframe positioning to match the wider math-assertion scope by @JohnVerheij in #16
  • ci(deps): bump github/codeql-action from 4.35.3 to 4.35.4 by @dependabot[bot] in #17
  • ci(deps): bump actions/attest-build-provenance from 2.4.0 to 4.1.0 by @dependabot[bot] in #18
  • feat(v0.2.0): per-component delta diagnostics + axis-angle quaternion assertion by @JohnVerheij in #19
  • chore: rewrite test doc comment by @JohnVerheij in #20

Full Changelog: v0.1.0...v0.2.0

v0.1.0

09 May 07:39
v0.1.0
6a888c1

Choose a tag to compare

What's Changed

  • ci(deps): bump actions/attest-sbom from 2.4.0 to 4.1.0 by @dependabot[bot] in #1
  • ci(deps): bump NuGet/login from ebc737b6fc418a6ca0073cf116ec8dc156d8b81e to 8d196754b4036150537f80ac539e15c2f1028841 by @dependabot[bot] in #2
  • ci(deps): bump dependabot/fetch-metadata from 2.5.0 to 3.1.0 by @dependabot[bot] in #3
  • feat(core): add Cluster 1 tolerance primitives toward 0.1.0 by @JohnVerheij in #4
  • feat(core): add Cluster 2 System.Numerics compounds toward 0.1.0 by @JohnVerheij in #5
  • feat(core): add Cluster 3 sequence-property checks toward 0.1.0 by @JohnVerheij in #6
  • feat(core): add Cluster 4 statistical-property checks toward 0.1.0 by @JohnVerheij in #7
  • feat(core): add Cluster 5 linear-algebra invariants toward 0.1.0 by @JohnVerheij in #8
  • feat(core): add Cluster 6 number-theory predicates toward 0.1.0 by @JohnVerheij in #9
  • feat(geometry3d): add Cluster 7a — primitives + property predicates by @JohnVerheij in #10
  • Feat/0.1.0 cluster7b geometry containment distance by @JohnVerheij in #11
  • Feat/0.1.0 cluster7c geometry intersection pointcloud by @JohnVerheij in #12
  • feat(adapter): expand MathAssertions.TUnit to cover the full 0.1.0 co… by @JohnVerheij in #13
  • chore(release): prepare 0.1.0 release by @JohnVerheij in #14

New Contributors

Full Changelog: v0.0.1...v0.1.0

v0.0.1

08 May 17:26
v0.0.1
2e2115f

Choose a tag to compare