{"input": "TP53", "source_db": "hgnc", "how": "pattern", "expect": {"valid": true, "normalized": "TP53"}, "note": "well-formed symbol shape"}
{"input": "C9orf72", "source_db": "hgnc", "how": "pattern", "expect": {"valid": true, "normalized": "C9orf72"}, "note": "mixed-case symbol is a valid shape"}
{"input": "TP 53", "source_db": "hgnc", "how": "pattern", "expect": {"valid": false}, "note": "a space is not part of a symbol token"}
{"input": "TP53", "source_db": "hgnc", "how": "cache", "version": "sample", "expect": {"valid": true, "normalized": "TP53"}, "note": "approved symbol in the sample"}
{"input": "C9orf72", "source_db": "hgnc", "how": "cache", "version": "sample", "expect": {"valid": true, "normalized": "C9orf72"}, "note": "mixed-case approved symbol"}
{"input": "MLL", "source_db": "hgnc", "how": "cache", "version": "sample", "expect": {"valid": false, "suggestion": "KMT2A"}, "note": "withdrawn previous symbol, approved is KMT2A"}
{"input": "MLL2", "source_db": "hgnc", "how": "cache", "version": "sample", "expect": {"valid": false, "suggestion": "KMT2D"}, "note": "previous symbol, approved is KMT2D"}
{"input": "CARS", "source_db": "hgnc", "how": "cache", "version": "sample", "expect": {"valid": false, "suggestion": "CARS1"}, "note": "previous symbol, approved is CARS1"}
{"input": "C9ORF72", "source_db": "hgnc", "how": "cache", "version": "sample", "expect": {"valid": false, "suggestion": "C9orf72"}, "note": "symbols are case-sensitive, so the all-caps form is not approved, but it differs only by case and suggests the approved C9orf72"}
{"input": "c9orf72", "source_db": "hgnc", "how": "cache", "version": "sample", "expect": {"valid": false, "suggestion": "C9orf72"}, "note": "the suggestion is the snapshot's own spelling, not an uppercased form"}
{"input": "tp53", "source_db": "hgnc", "how": "cache", "version": "sample", "expect": {"valid": false, "suggestion": "TP53"}, "note": "a lowercase symbol differs only by case and suggests the approved form; without case_insensitive it is 2 edits from both TP53 and CD53 and the tie-break picks the wrong gene"}
{"input": "kmt2a", "source_db": "hgnc", "how": "cache", "version": "sample", "expect": {"valid": false, "suggestion": "KMT2A"}, "note": "case costs no edits, so a longer symbol still resolves rather than falling outside the distance"}
{"input": "NOTAGENE", "source_db": "hgnc", "how": "cache", "version": "sample", "expect": {"valid": false}, "note": "well-formed shape but not an approved or previous symbol"}
{"input": "TP53", "source_db": "hgnc", "how": "cache", "version": "2026-07-07", "expect": {"valid": true, "normalized": "TP53"}, "note": "approved symbol in the pinned full snapshot"}
{"input": "BRCA1", "source_db": "hgnc", "how": "cache", "version": "2026-07-07", "expect": {"valid": true, "normalized": "BRCA1"}, "note": "approved symbol in the pinned full snapshot"}
{"input": "MLL", "source_db": "hgnc", "how": "cache", "version": "2026-07-07", "expect": {"valid": false, "suggestion": "KMT2A"}, "note": "previous symbol maps to its approved successor"}
{"input": "LEPRE1", "source_db": "hgnc", "how": "cache", "version": "2026-07-07", "expect": {"valid": false, "suggestion": "P3H1"}, "note": "previous symbol LEPRE1 was renamed P3H1"}
{"input": "notagene", "source_db": "hgnc", "how": "cache", "version": "2026-07-07", "expect": {"valid": false}, "note": "well-formed shape but not an approved or previous symbol, and no approved symbol is within the edit distance in any case"}
{"input": "brca1", "source_db": "hgnc", "how": "cache", "version": "2026-07-07", "expect": {"valid": false, "suggestion": "BRCA1"}, "note": "a lowercase symbol against the full snapshot; without case_insensitive it is 4 edits away and gets no suggestion at all"}
{"input": "tp52", "source_db": "hgnc", "how": "cache", "version": "2026-07-07", "expect": {"valid": false, "suggestion": "TP53"}, "note": "a lowercase typo: case costs no edits, so the one real edit still resolves to TP53 rather than to CD52"}
{"input": "TP52", "source_db": "hgnc", "how": "cache", "version": "sample", "expect": {"valid": false, "suggestion": "TP53"}, "note": "a one-edit typo suggests the nearest approved symbol"}
{"input": "KMT2E", "source_db": "hgnc", "how": "cache", "version": "sample", "expect": {"valid": false, "suggestion": "KMT2A"}, "note": "a tie at the nearest distance breaks to the code-point-smallest, KMT2A over KMT2D"}
