@@ -59,6 +59,76 @@ reveal_type(Truth.true.name) # N: Revealed type is 'Literal['true']?'
5959reveal_type(Truth.false.value) # N: Revealed type is 'builtins.bool'
6060[builtins fixtures/bool.pyi]
6161
62+ [case testEnumValueExtended]
63+ from enum import Enum
64+ class Truth(Enum):
65+ true = True
66+ false = False
67+
68+ def infer_truth(truth: Truth) -> None:
69+ reveal_type(truth.value) # N: Revealed type is 'builtins.bool'
70+ [builtins fixtures/bool.pyi]
71+
72+ [case testEnumValueAllAuto]
73+ from enum import Enum, auto
74+ class Truth(Enum):
75+ true = auto()
76+ false = auto()
77+
78+ def infer_truth(truth: Truth) -> None:
79+ reveal_type(truth.value) # N: Revealed type is 'builtins.int'
80+ [builtins fixtures/primitives.pyi]
81+
82+ [case testEnumValueSomeAuto]
83+ from enum import Enum, auto
84+ class Truth(Enum):
85+ true = 8675309
86+ false = auto()
87+
88+ def infer_truth(truth: Truth) -> None:
89+ reveal_type(truth.value) # N: Revealed type is 'builtins.int'
90+ [builtins fixtures/primitives.pyi]
91+
92+ [case testEnumValueExtraMethods]
93+ from enum import Enum, auto
94+ class Truth(Enum):
95+ true = True
96+ false = False
97+
98+ def foo(self) -> str:
99+ return 'bar'
100+
101+ def infer_truth(truth: Truth) -> None:
102+ reveal_type(truth.value) # N: Revealed type is 'builtins.bool'
103+ [builtins fixtures/bool.pyi]
104+
105+ [case testEnumValueCustomAuto]
106+ from enum import Enum, auto
107+ class AutoName(Enum):
108+
109+ # In `typeshed`, this is a staticmethod and has more arguments,
110+ # but I have lied a bit to keep the test stubs lean.
111+ def _generate_next_value_(self) -> str:
112+ return "name"
113+
114+ class Truth(AutoName):
115+ true = auto()
116+ false = auto()
117+
118+ def infer_truth(truth: Truth) -> None:
119+ reveal_type(truth.value) # N: Revealed type is 'builtins.str'
120+ [builtins fixtures/primitives.pyi]
121+
122+ [case testEnumValueInhomogenous]
123+ from enum import Enum
124+ class Truth(Enum):
125+ true = 'True'
126+ false = 0
127+
128+ def cannot_infer_truth(truth: Truth) -> None:
129+ reveal_type(truth.value) # N: Revealed type is 'Any'
130+ [builtins fixtures/bool.pyi]
131+
62132[case testEnumUnique]
63133import enum
64134@enum.unique
@@ -497,8 +567,8 @@ reveal_type(A1.x.value) # N: Revealed type is 'Any'
497567reveal_type(A1.x._value_) # N: Revealed type is 'Any'
498568is_x(reveal_type(A2.x.name)) # N: Revealed type is 'Literal['x']'
499569is_x(reveal_type(A2.x._name_)) # N: Revealed type is 'Literal['x']'
500- reveal_type(A2.x.value) # N: Revealed type is 'Any '
501- reveal_type(A2.x._value_) # N: Revealed type is 'Any '
570+ reveal_type(A2.x.value) # N: Revealed type is 'builtins.int '
571+ reveal_type(A2.x._value_) # N: Revealed type is 'builtins.int '
502572is_x(reveal_type(A3.x.name)) # N: Revealed type is 'Literal['x']'
503573is_x(reveal_type(A3.x._name_)) # N: Revealed type is 'Literal['x']'
504574reveal_type(A3.x.value) # N: Revealed type is 'builtins.int'
@@ -519,7 +589,7 @@ reveal_type(B1.x._value_) # N: Revealed type is 'Any'
519589is_x(reveal_type(B2.x.name)) # N: Revealed type is 'Literal['x']'
520590is_x(reveal_type(B2.x._name_)) # N: Revealed type is 'Literal['x']'
521591reveal_type(B2.x.value) # N: Revealed type is 'builtins.int'
522- reveal_type(B2.x._value_) # N: Revealed type is 'Any '
592+ reveal_type(B2.x._value_) # N: Revealed type is 'builtins.int '
523593is_x(reveal_type(B3.x.name)) # N: Revealed type is 'Literal['x']'
524594is_x(reveal_type(B3.x._name_)) # N: Revealed type is 'Literal['x']'
525595reveal_type(B3.x.value) # N: Revealed type is 'builtins.int'
@@ -540,8 +610,8 @@ reveal_type(C1.x.value) # N: Revealed type is 'Any'
540610reveal_type(C1.x._value_) # N: Revealed type is 'Any'
541611is_x(reveal_type(C2.x.name)) # N: Revealed type is 'Literal['x']'
542612is_x(reveal_type(C2.x._name_)) # N: Revealed type is 'Literal['x']'
543- reveal_type(C2.x.value) # N: Revealed type is 'Any '
544- reveal_type(C2.x._value_) # N: Revealed type is 'Any '
613+ reveal_type(C2.x.value) # N: Revealed type is 'builtins.int '
614+ reveal_type(C2.x._value_) # N: Revealed type is 'builtins.int '
545615is_x(reveal_type(C3.x.name)) # N: Revealed type is 'Literal['x']'
546616is_x(reveal_type(C3.x._name_)) # N: Revealed type is 'Literal['x']'
547617reveal_type(C3.x.value) # N: Revealed type is 'builtins.int'
@@ -559,8 +629,8 @@ reveal_type(D1.x.value) # N: Revealed type is 'Any'
559629reveal_type(D1.x._value_) # N: Revealed type is 'Any'
560630is_x(reveal_type(D2.x.name)) # N: Revealed type is 'Literal['x']'
561631is_x(reveal_type(D2.x._name_)) # N: Revealed type is 'Literal['x']'
562- reveal_type(D2.x.value) # N: Revealed type is 'Any '
563- reveal_type(D2.x._value_) # N: Revealed type is 'Any '
632+ reveal_type(D2.x.value) # N: Revealed type is 'builtins.int '
633+ reveal_type(D2.x._value_) # N: Revealed type is 'builtins.int '
564634is_x(reveal_type(D3.x.name)) # N: Revealed type is 'Literal['x']'
565635is_x(reveal_type(D3.x._name_)) # N: Revealed type is 'Literal['x']'
566636reveal_type(D3.x.value) # N: Revealed type is 'builtins.int'
@@ -578,8 +648,8 @@ class E3(Parent):
578648
579649is_x(reveal_type(E2.x.name)) # N: Revealed type is 'Literal['x']'
580650is_x(reveal_type(E2.x._name_)) # N: Revealed type is 'Literal['x']'
581- reveal_type(E2.x.value) # N: Revealed type is 'Any '
582- reveal_type(E2.x._value_) # N: Revealed type is 'Any '
651+ reveal_type(E2.x.value) # N: Revealed type is 'builtins.int '
652+ reveal_type(E2.x._value_) # N: Revealed type is 'builtins.int '
583653is_x(reveal_type(E3.x.name)) # N: Revealed type is 'Literal['x']'
584654is_x(reveal_type(E3.x._name_)) # N: Revealed type is 'Literal['x']'
585655reveal_type(E3.x.value) # N: Revealed type is 'builtins.int'
0 commit comments