lean4-htt/tests/elab/isInstanceCongrRegression.lean
Garmelon 08eb78a5b2
chore: switch to new test/bench suite (#12590)
This PR sets up the new integrated test/bench suite. It then migrates
all benchmarks and some related tests to the new suite. There's also
some documentation and some linting.

For now, a lot of the old tests are left alone so this PR doesn't become
even larger than it already is. Eventually, all tests should be migrated
to the new suite though so there isn't a confusing mix of two systems.
2026-02-25 13:51:53 +00:00

82 lines
3.6 KiB
Text
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/-!
# Regression tests for isInstance changes in congruence lemma generation
These tests verify that `congr` works correctly for structures and classes
with class-typed fields. They catch regressions from changes to how instance
parameters are detected (e.g., using `isClass?` instead of binder info).
Both tests pass on v4.28.0-rc1 (before the isInstance changes).
## Test 1: Structure extending classes (mirrors Mathlib's GroupTopology)
When a structure extends both a data class and a Prop class, the parent class
field may be marked as `isInstance = true`. If this causes `.fixed` treatment
in congruence lemma generation, dependent Prop fields will require HEq.
**Failure mode:** `⊢ toIsContinuousMul✝¹ ≍ toIsContinuousMul✝`
## Test 2: Class with explicit class-typed field (mirrors Mathlib's PseudoEMetricSpace)
When a class has an explicit class-typed field (not from `extends`), that field
may be marked as `isInstance = true`. If this causes `.fixed` treatment, then
dependent Prop fields whose types mention that field will require HEq.
**Failure mode:** `⊢ dist_self✝¹ ≍ dist_self✝` and `⊢ uniformity_dist✝¹ ≍ uniformity_dist✝`
-/
/-! ### Test 1: Structure extending classes -/
-- Setup: mimic Mathlib's GroupTopology structure
class MyTopology (α : Type) where
isOpen : (α → Prop) → Prop
-- A Prop-valued class that depends on MyTopology
class IsContinuousMul (α : Type) [MyTopology α] : Prop where
continuous_mul : True -- simplified
-- Structure extending both a data class and a Prop class
structure MyGroupTopology (α : Type) extends MyTopology α, IsContinuousMul α
-- Key test: proving injectivity of the parent projection using `congr`
-- If the toMyTopology field gets `.fixed` treatment, the Prop-valued
-- toIsContinuousMul field will require HEq: `⊢ toIsContinuousMul✝¹ ≍ toIsContinuousMul✝`
theorem MyGroupTopology.toMyTopology_injective {α : Type} :
Function.Injective (MyGroupTopology.toMyTopology : MyGroupTopology α → MyTopology α) := by
intro f g h
cases f
cases g
congr
/-! ### Test 2: Class with explicit class-typed field -/
-- Setup: mimic Mathlib's PseudoEMetricSpace pattern
-- A class that extends one class but has another class-typed field explicitly
class MyDist (α : Type) where
dist : αα → Nat
class MyUniformity (α : Type) where
uniformity : (αα → Prop) → Prop
-- Class that extends MyDist but has an explicit MyUniformity field
-- This mirrors PseudoEMetricSpace which extends EDist but has explicit toUniformSpace
class MyMetricSpace (α : Type) extends MyDist α where
dist_self : ∀ x : α, dist x x = 0
-- Explicit class-typed field (NOT from extends)
toMyUniformity : MyUniformity α
-- Prop field whose type depends on toMyUniformity
uniformity_dist : toMyUniformity.uniformity (fun x y => dist x y = 0)
-- Key test: extensionality theorem using `congr`
-- If toMyUniformity gets `.fixed` treatment (because it's class-typed but not
-- a subobject field), then `congr` will produce HEq goals for dependent fields
protected theorem MyMetricSpace.ext {α : Type} {m m' : MyMetricSpace α}
(h : m.toMyDist = m'.toMyDist) (hU : m.toMyUniformity = m'.toMyUniformity) : m = m' := by
cases m
cases m'
-- After cases, we need to prove the constructors are equal
-- `congr` should produce goals for data fields (dist, toMyUniformity)
-- and automatically handle Prop fields (dist_self, uniformity_dist) via casting
-- If toMyUniformity gets `.fixed` treatment, we'd see HEq goals like:
-- `⊢ dist_self✝¹ ≍ dist_self✝` or `⊢ uniformity_dist✝¹ ≍ uniformity_dist✝`
congr 1 <;> assumption