@@ -115,6 +115,9 @@ defmodule ExUnit.DocTest do
115
115
116
116
inspect(map.datetime) == "#DateTime<2023-06-26 09:30:00+09:00 JST Asia/Tokyo>"
117
117
118
+ You can also control `doctest` to use certain inspect options. See the
119
+ documentation on the `:inspect_opts` option below.
120
+
118
121
Alternatively, since doctest results are actually evaluated, you can have
119
122
the `DateTime` building expression as the doctest result:
120
123
@@ -196,6 +199,10 @@ defmodule ExUnit.DocTest do
196
199
197
200
* `:tags` - a list of tags to apply to all generated doctests.
198
201
202
+ * `:inspect_opts` - A keyword list with options for `inspect/2` on opaque
203
+ types. This is useful when inspection output on opaque types utilizes
204
+ pretty printing and to keep the doctests more readable.
205
+
199
206
## Examples
200
207
201
208
defmodule MyModuleTest do
@@ -241,6 +248,10 @@ defmodule ExUnit.DocTest do
241
248
242
249
* `:tags` - a list of tags to apply to all generated doctests.
243
250
251
+ * `:inspect_opts` - A keyword list with options for `inspect/2` on opaque
252
+ types. This is useful when inspection output on opaque types utilizes
253
+ pretty printing and to keep the doctests more readable.
254
+
244
255
## Examples
245
256
246
257
defmodule ReadmeTest do
@@ -270,10 +281,15 @@ defmodule ExUnit.DocTest do
270
281
doc = File . read! ( file )
271
282
file = Path . relative_to_cwd ( file )
272
283
tags = [ doctest: file ] ++ Keyword . get ( opts , :tags , [ ] )
284
+ inspect_opts = Keyword . get ( opts , :inspect_opts , [ ] )
273
285
274
286
extract_tests ( 1 , doc , module , :moduledoc )
275
287
|> Enum . with_index ( fn test , acc ->
276
- { "#{ file } (#{ acc + 1 } )" , test_content ( test , module , false , file ) , test_tags ( test , tags ) }
288
+ {
289
+ "#{ file } (#{ acc + 1 } )" ,
290
+ test_content ( test , module , false , file , inspect_opts ) ,
291
+ test_tags ( test , tags )
292
+ }
277
293
end )
278
294
end
279
295
@@ -293,6 +309,7 @@ defmodule ExUnit.DocTest do
293
309
def __doctests__ ( module , opts ) do
294
310
tags = [ doctest: module ] ++ Keyword . get ( opts , :tags , [ ] )
295
311
import = Keyword . get ( opts , :import , false )
312
+ inspect_opts = Keyword . get ( opts , :inspect_opts , [ ] )
296
313
297
314
maybe_source =
298
315
if source = module . module_info ( :compile ) [ :source ] do
@@ -303,7 +320,7 @@ defmodule ExUnit.DocTest do
303
320
|> filter_by_opts ( module , opts )
304
321
|> Enum . sort_by ( & & 1 . line )
305
322
|> Enum . with_index ( fn test , index ->
306
- compile_test ( test , module , import , index + 1 , maybe_source , tags )
323
+ compile_test ( test , module , import , index + 1 , maybe_source , tags , inspect_opts )
307
324
end )
308
325
end
309
326
@@ -349,9 +366,12 @@ defmodule ExUnit.DocTest do
349
366
350
367
## Compilation of extracted tests
351
368
352
- defp compile_test ( test , module , do_import , n , maybe_source , tags ) do
353
- { test_name ( test , module , n ) , test_content ( test , module , do_import , maybe_source ) ,
354
- test_tags ( test , tags ) }
369
+ defp compile_test ( test , module , do_import , n , maybe_source , tags , inspect_opts ) do
370
+ {
371
+ test_name ( test , module , n ) ,
372
+ test_content ( test , module , do_import , maybe_source , inspect_opts ) ,
373
+ test_tags ( test , tags )
374
+ }
355
375
end
356
376
357
377
defp test_name ( % { fun_arity: :moduledoc } , m , n ) do
@@ -362,7 +382,7 @@ defmodule ExUnit.DocTest do
362
382
"#{ inspect ( m ) } .#{ f } /#{ a } (#{ n } )"
363
383
end
364
384
365
- defp test_content ( % { exprs: exprs , line: line } , module , do_import , maybe_source ) do
385
+ defp test_content ( % { exprs: exprs , line: line } , module , do_import , maybe_source , inspect_opts ) do
366
386
if multiple_exceptions? ( exprs ) do
367
387
raise Error ,
368
388
line: line ,
@@ -372,7 +392,9 @@ defmodule ExUnit.DocTest do
372
392
"please separate your iex> prompts by multiple newlines to start new examples"
373
393
end
374
394
375
- tests = Enum . map ( exprs , fn expr -> test_case_content ( expr , module , maybe_source ) end )
395
+ tests =
396
+ Enum . map ( exprs , fn expr -> test_case_content ( expr , module , maybe_source , inspect_opts ) end )
397
+
376
398
{ :__block__ , [ ] , test_import ( module , do_import ) ++ tests }
377
399
end
378
400
@@ -387,12 +409,17 @@ defmodule ExUnit.DocTest do
387
409
end ) > 1
388
410
end
389
411
390
- defp test_case_content ( % { expected: :test } = data , module , maybe_source ) do
412
+ defp test_case_content ( % { expected: :test } = data , module , maybe_source , _inspect_opts ) do
391
413
% { expr: expr , expr_line: expr_line , doctest: doctest } = data
392
414
string_to_quoted ( module , maybe_source , expr_line , expr , doctest ) |> insert_assertions ( )
393
415
end
394
416
395
- defp test_case_content ( % { expected: { :test , expected } } = data , module , maybe_source ) do
417
+ defp test_case_content (
418
+ % { expected: { :test , expected } } = data ,
419
+ module ,
420
+ maybe_source ,
421
+ _inspect_opts
422
+ ) do
396
423
% { expr: expr , expr_line: expr_line , expected_line: expected_line , doctest: doctest } = data
397
424
398
425
expr_ast =
@@ -419,7 +446,12 @@ defmodule ExUnit.DocTest do
419
446
end
420
447
end
421
448
422
- defp test_case_content ( % { expected: { :inspect , expected } } = data , module , maybe_source ) do
449
+ defp test_case_content (
450
+ % { expected: { :inspect , expected } } = data ,
451
+ module ,
452
+ maybe_source ,
453
+ inspect_opts
454
+ ) do
423
455
% { expr: expr , expr_line: expr_line , doctest: doctest } = data
424
456
425
457
expr_ast =
@@ -436,12 +468,18 @@ defmodule ExUnit.DocTest do
436
468
unquote ( inspect ( expected ) ) ,
437
469
unquote ( module ) ,
438
470
unquote ( maybe_source ) ,
439
- unquote ( expr_line )
471
+ unquote ( expr_line ) ,
472
+ unquote ( inspect_opts )
440
473
)
441
474
end
442
475
end
443
476
444
- defp test_case_content ( % { expected: { :error , exception , message } } = data , module , maybe_source ) do
477
+ defp test_case_content (
478
+ % { expected: { :error , exception , message } } = data ,
479
+ module ,
480
+ maybe_source ,
481
+ _inspect_opts
482
+ ) do
445
483
% { expr: expr , expr_line: expr_line , doctest: doctest } = data
446
484
expr_ast = string_to_quoted ( module , maybe_source , expr_line , expr , doctest )
447
485
@@ -478,10 +516,20 @@ defmodule ExUnit.DocTest do
478
516
end
479
517
480
518
@ doc false
481
- def __inspect__ ( value , expected , doctest , last_expr , expected_expr , module , maybe_source , line ) do
519
+ def __inspect__ (
520
+ value ,
521
+ expected ,
522
+ doctest ,
523
+ last_expr ,
524
+ expected_expr ,
525
+ module ,
526
+ maybe_source ,
527
+ line ,
528
+ inspect_opts
529
+ ) do
482
530
result =
483
531
try do
484
- inspect ( value , safe: false )
532
+ inspect ( value , Keyword . put ( inspect_opts , :safe , false ) )
485
533
rescue
486
534
e ->
487
535
stack = Enum . drop ( __STACKTRACE__ , 1 )
0 commit comments