1
1
import importlib
2
+ import traceback
2
3
from typing import Optional , Callable
3
4
4
5
import pytest
5
6
6
- import basilisp .lang .exception as lexc
7
7
import basilisp .lang .keyword as kw
8
8
import basilisp .lang .map as lmap
9
9
import basilisp .lang .runtime as runtime
@@ -52,6 +52,29 @@ def _reset_collected_tests() -> None:
52
52
return var .value .reset (vec .Vector .empty ())
53
53
54
54
55
+ class TestFailuresInfo (Exception ):
56
+ __slots__ = ('_msg' , '_data' ,)
57
+
58
+ def __init__ (self , message : str , data : lmap .Map ) -> None :
59
+ super ().__init__ ()
60
+ self ._msg = message
61
+ self ._data = data
62
+
63
+ def __repr__ (self ):
64
+ return f"basilisp.testrunner.TestFailuresInfo({ self ._msg } , { lrepr (self ._data )} )"
65
+
66
+ def __str__ (self ):
67
+ return f"{ self ._msg } { lrepr (self ._data )} "
68
+
69
+ @property
70
+ def data (self ) -> lmap .Map :
71
+ return self ._data
72
+
73
+ @property
74
+ def message (self ) -> str :
75
+ return self ._msg
76
+
77
+
55
78
TestFunction = Callable [[], Optional [vec .Vector ]]
56
79
57
80
@@ -112,12 +135,12 @@ def runtest(self):
112
135
results : lmap .Map = self ._run_test ()
113
136
failures : Optional [vec .Vector ] = results .entry (_FAILURES_KW )
114
137
if runtime .to_seq (failures ):
115
- raise lexc . ExceptionInfo ("Test failures" , lmap .map (results ))
138
+ raise TestFailuresInfo ("Test failures" , lmap .map (results ))
116
139
117
140
def repr_failure (self , excinfo ):
118
141
"""Representation function called when self.runtest() raises an
119
142
exception."""
120
- if isinstance (excinfo .value , lexc . ExceptionInfo ):
143
+ if isinstance (excinfo .value , TestFailuresInfo ):
121
144
exc = excinfo .value
122
145
failures = exc .data .entry (_FAILURES_KW )
123
146
messages = []
@@ -142,7 +165,13 @@ def repr_failure(self, excinfo):
142
165
]))
143
166
144
167
return "\n \n " .join (messages )
145
- return None
168
+ elif isinstance (excinfo .value , Exception ):
169
+ exc = excinfo .value
170
+ messages = [f"ERROR in ({ self .name } ) ({ self ._filename } )" , "\n \n " ]
171
+ messages .extend (traceback .format_exception (Exception , exc , exc .__traceback__ ))
172
+ return "" .join (messages )
173
+ else :
174
+ return None
146
175
147
176
def reportinfo (self ):
148
177
return self .fspath , 0 , self .name
0 commit comments