Upstream Tracking
Upstream Tracking
We continue to monitor and selectively adopt changes from the upstream repository.
Implemented from Upstream
- â #1513 - JSONEqBytes
- â #1803 - Kind/NotKind assertions
- â #1805 - IsOfTypeT[T] generic assertions
- â #1685 - Partial iterator support (SeqContainsT variants)
- â #1828 - Spew panic fixes
- â #1611 - Goroutine leak in Eventually/Never (drove the context-based pollCondition refactor)
- â #1825, #1818, #1223, #1813, #1822, #1829 - Various bug fixes
- â #1606, #1087 - Consistently assertion
- â #1848 - Subset error message
- â
#1839 -
InEpsilonSymmetric(number equality with symmetric role) - â
#1840 - JSON/YAML
Redactorpattern (dynamic input redaction, inspired by Insta) - â
#1859 - Channel assertions (
Blocked/NotBlocked)
Superseded by Our Implementation
- â
#1801 - Error message on large collections for
Len - â #1845 - Fix Eventually/Never regression (superseded by context-based pollCondition)
- â
#1830 - CollectT.Halt() (implemented as
CollectT.Cancel()in v2.4 â see CHANGES) - â #1819 - Handle unexpected exits (handled by per-tick goroutine wrap in v2.4)
- â #1824 - Spew testing (superseded by property-based fuzzing)
Review frequency: Quarterly (next review: May 2026)
Appendix: Upstream References
This table catalogs all upstream PRs and issues from github.com/stretchr/testify that we have processed.
Implemented (Adapted or Merged)
| Reference | Type | Summary | Outcome in Fork |
|---|---|---|---|
| #994 | PR | Colorize expected vs actual values | â
Adapted into enable/color module with themes and configuration |
| #1087 | Issue | Consistently assertion | â Adapted |
| #1223 | PR | Display uint values in decimal instead of hex | â Merged - Applied to diff output |
| #1232 | PR | Colorized output for expected/actual/errors | â
Adapted into enable/color module |
| #1356 | PR | panic(nil) handling for Go 1.21+ | â Merged - Updated panic assertions |
| #1467 | PR | Colorized output with terminal detection | â
Adapted into enable/color module (most mature implementation) |
| #1480 | PR | Colorized diffs via TESTIFY_COLORED_DIFF env var | â
Adapted with env var support in enable/color |
| #1513 | PR | JSONEqBytes for byte slice JSON comparison | â Merged - Added to JSON domain |
| #1606 | PR | Consistently assertion | â Adapted |
| #1611 | Issue | Goroutine leak in Eventually/Never | â Fixed by using context.Context (consolidation into single pollCondition function) |
| #1685 | PR | Iterator support (iter.Seq) for Contains/ElementsMatch | â Partial - Implemented SeqContainsT and SeqNotContainsT only |
| #1772 | PR | YAML library migration to maintained fork | â
Adapted - Used gopkg.in/yaml.v3 in optional enable/yaml module |
| #1797 | PR | Codegen package consolidation and licensing | â Adapted - Complete rewrite of code generation system |
| #1803 | PR | Kind/NotKind assertions | â Merged - Added to Type domain |
| #1805 | Issue | Generic IsOfType[T]() without dummy value | â Implemented - IsOfTypeT and IsNotOfTypeT in Type domain |
| #1813 | Issue | Panic with unexported fields | â Fixed via #1828 in internalized spew |
| #1816 | Issue | Fix panic on unexported struct key in map | â Fixed in internalized go-spew |
| #1818 | PR | Fix panic on invalid regex in Regexp/NotRegexp | â Merged - Added graceful error handling |
| #1822 | Issue | Deterministic map ordering in diffs | â Fixed in internalized go-spew |
| #1825 | PR | Fix panic using EqualValues with incomparable types | â Merged - Enhanced type safety in EqualValues |
| #1826 | Issue | Type safety with spew (meta-issue) | â Addressed through comprehensive fuzzing and fixes |
| #1828 | PR | Fixed panic with unexported fields in maps | â Merged into internalized go-spew |
| #1829 | Issue | Fix time.Time rendering in diffs | â Fixed in internalized go-spew |
| #1848 | PR | Subset (garbled error message) | â Adapted |
| #1839 | PR | Number equality with symmetric role | â Adapted |
| #1840 | Issue | JSON presence check without exact values | â Adapted |
| #1859 | Issue | Channel assertions | â Adapted |
Superseded by Our Implementation
| Reference | Type | Summary | Why Superseded |
|---|---|---|---|
| #1801 | Issue | Len error printing large collections | Duplicate issue upstream. This is fixed by generalized truncation |
| #1845 | PR | Fix Eventually/Never regression | Superseded by context-based pollCondition implementation (we don’t have this bug) |
| #1819 | PR | Handle unexpected exits in Eventually | Implemented in v2.4 via per-tick goroutine wrap â a runtime.Goexit in the condition only aborts the current tick |
| #1824 | PR | Spew testing improvements | Superseded by property-based fuzzing with random type generator |
| #1830 | PR | CollectT.Halt() for stopping tests | Implemented in v2.4 as CollectT.Cancel() â see CHANGES |
Under Consideration (Monitoring)
| Reference | Type | Summary | Status |
|---|---|---|---|
| #1576 | Issue/PR | EqualValues assertion | đ Monitoring #1863- Wrong equality when comparing float32 and float64 |
| #1860 | Issue+PR | ErrorAsType[E] for Go 1.26+ - PR: #1861 | đ Monitoring - Interesting UX syntax |
Informational (Not Implemented)
| Reference | Type | Summary | Outcome |
|---|---|---|---|
| #1147 | Issue | General discussion about generics adoption | âšī¸ Marked “Not Planned” upstream - We implemented our own generics approach ( functions) |
| #1308 | PR | Comprehensive refactor with generic type parameters | âšī¸ Draft for v2.0.0 upstream - We took a different approach with the same objective |
| #1591, #1601 | PR + Issue | NoFieldIsZero recursive zero-value assertion | â Won’t do - Considered and prototyped (2026-04-26). Same conclusion as upstream maintainers: semantics is too ambiguous (map keys, []byte, pointer targets, unexported fields, cycles, time.Time-style smart-zero types) and overlaps too heavily with Equal for legitimate use cases. Each pitfall fix adds a knob; full version is a struct validator, not an assertion. |
| #1862 | Issue | CollectT redesign / testing.TB interop | â Won’t do (for now) - Studied in depth (2026-04-17). All four design options (interface widening, embedding *testing.T, opt-in CollectTB wrapper, CollectT-as-interface) carry visible costs; Go’s testing.TB.private() blocks any clean proxy. Workaround for affected users is a 3-line per-helper adapter. Revisit if traction warrants the breaking churn. |
Summary Statistics
| Category | Count |
|---|---|
| Implemented/Merged | 27 |
| Superseded | 5 |
| Monitoring | 2 |
| Informational | 4 |
| Total Processed | 38 |
Note: This fork maintains an active relationship with upstream, regularly reviewing new PRs and issues. The quarterly review process ensures we stay informed about upstream developments while maintaining our architectural independence.
See Also
- Changes from v1 - Complete list of all implemented changes and new features
- Roadmap - Future plans and development priorities
- Architecture - Technical architecture and design decisions
- Original Project - History and acknowledgments