Skip to content

Commit 026f3d8

Browse files
committed
test(assert): call assert interf w/test_diag expr
1 parent 42611ed commit 026f3d8

6 files changed

Lines changed: 127 additions & 19 deletions

File tree

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
submodule (julienne_test_diagnosis_m) julienne_assertion_diagnosis_s
2+
use assert_m, only : assert_library_assert => assert
3+
implicit none
4+
5+
contains
6+
7+
module procedure construct_from_components
8+
assertion_diagnosis%test_diagnosis_t = test_diagnosis_t(success, diagnostics_string)
9+
end procedure
10+
11+
module procedure construct_with_string
12+
assertion_diagnosis%test_diagnosis_t = test_diagnosis_t(success, diagnostics_string%string())
13+
end procedure
14+
15+
module procedure julienne_assert
16+
call assert_library_assert(test_diagnosis%test_passed_, test_diagnosis%diagnostics_string_)
17+
end procedure
18+
19+
end submodule

src/julienne/julienne_assertion_s.f90

Lines changed: 0 additions & 15 deletions
This file was deleted.

src/julienne/julienne_test_diagnosis_m.F90

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,19 +56,29 @@ module julienne_test_diagnosis_m
5656

5757
interface assertion_diagnosis_t
5858

59-
pure module function construct_from_parent(test_diagnosis) result(assertion_diagnosis)
59+
pure module function construct_from_components(success, diagnostics_string) result(assertion_diagnosis)
6060
implicit none
61-
type(test_diagnosis_t), intent(in) :: test_diagnosis
61+
logical, intent(in) :: success
62+
character(len=*), intent(in) :: diagnostics_string
63+
type(assertion_diagnosis_t) assertion_diagnosis
64+
end function
65+
66+
pure module function construct_with_string(success, diagnostics_string) result(assertion_diagnosis)
67+
implicit none
68+
logical, intent(in) :: success
69+
type(string_t), intent(in) :: diagnostics_string
6270
type(assertion_diagnosis_t) assertion_diagnosis
6371
end function
6472

6573
end interface
6674

6775
interface assert
6876

69-
pure module subroutine julienne_assert(assertion_diagnosis)
77+
pure module subroutine julienne_assert(test_diagnosis)
78+
!! If the actual argument is an instance of a child type (e.g., assertion_diagnosis_t),
79+
!! the dummy argument will be the child's test_diagnosis_t parent component.
7080
implicit none
71-
type(assertion_diagnosis_t), intent(in) :: assertion_diagnosis
81+
type(test_diagnosis_t), intent(in) :: test_diagnosis
7282
end subroutine
7383

7484
end interface

src/julienne_m.f90

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ module julienne_m
1212
use julienne_test_description_m, only : test_description_t, diagnosis_function_i
1313
use julienne_test_diagnosis_m, only : &
1414
test_diagnosis_t &
15+
,assertion_diagnosis_t &
16+
,assert &
1517
,operator(.all.) &
1618
,operator(.and.) &
1719
,operator(.approximates.) &

test/assert_test_m.F90

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
! Copyright (c) 2024, The Regents of the University of California and Sourcery Institute
2+
! Terms of use are as specified in LICENSE.txt
3+
4+
#include "language-support.F90"
5+
6+
module assert_test_m
7+
!! Test Julienne's assert generic interface
8+
9+
use julienne_m, only : &
10+
assert &
11+
,test_diagnosis_t &
12+
,test_t &
13+
,test_description_t &
14+
,test_description_substring &
15+
,test_result_t &
16+
,operator(.approximates.) &
17+
,operator(.within.)
18+
implicit none
19+
20+
private
21+
public :: assert_test_t
22+
23+
type, extends(test_t) :: assert_test_t
24+
contains
25+
procedure, nopass :: subject
26+
procedure, nopass :: results
27+
end type
28+
29+
contains
30+
31+
pure function subject() result(specimen)
32+
character(len=:), allocatable :: specimen
33+
specimen = "The assert generic interface"
34+
end function
35+
36+
#if HAVE_PROCEDURE_ACTUAL_FOR_POINTER_DUMMY
37+
38+
function results() result(test_results)
39+
type(test_result_t), allocatable :: test_results(:)
40+
41+
associate(descriptions => [ &
42+
test_description_t("invocation with an test_diagnosis_t expression", check_test_diagnosis_expression) &
43+
])
44+
associate(substring_in_subject => index(subject(), test_description_substring) /= 0)
45+
associate(substring_in_assertion_diagnosis => descriptions%contains_text(test_description_substring))
46+
associate(matching_descriptions => pack(descriptions, substring_in_subject .or. substring_in_assertion_diagnosis))
47+
test_results = matching_descriptions%run()
48+
end associate
49+
end associate
50+
end associate
51+
end associate
52+
53+
end function
54+
55+
#else
56+
57+
function results() result(test_results)
58+
use julienne_m, only : diagnosis_function_i
59+
!! Work around missing Fortran 2008 feature: associating a procedure actual argument with a procedure pointer dummy argument
60+
type(test_result_t), allocatable :: test_results(:)
61+
type(test_description_t), allocatable :: descriptions(:)
62+
procedure(diagnosis_function_i), pointer :: &
63+
check_test_diagnosis_expression_ptr => check_test_diagnosis_expression
64+
65+
descriptions = [ &
66+
test_description_t("invocation with an test_diagnosis_t expression", check_test_diagnosis_expression_ptr) &
67+
]
68+
69+
block
70+
logical substring_in_subject
71+
logical, allocatable :: substring_in_assertion_diagnosis(:)
72+
type(test_description_t), allocatable :: matching_descriptions(:)
73+
74+
substring_in_subject = index(subject(), test_description_substring) /= 0
75+
substring_in_assertion_diagnosis = descriptions%contains_text(test_description_substring)
76+
matching_descriptions = pack(descriptions, substring_in_subject .or. substring_in_assertion_diagnosis)
77+
test_results = matching_descriptions%run()
78+
end block
79+
end function
80+
81+
#endif
82+
83+
function check_test_diagnosis_expression() result(test_diagnosis)
84+
type(test_diagnosis_t) test_diagnosis
85+
call assert(1. .approximates. 2. .within. 3.)
86+
test_diagnosis = test_diagnosis_t(.true., "")
87+
end function
88+
89+
end module assert_test_m

test/main.F90

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ program main
1010
use julienne_m ,only : command_line_t, GitHub_CI
1111

1212
! Test modules
13+
use assert_test_m ,only : assert_test_t
1314
use bin_test_m ,only : bin_test_t
1415
use command_line_test_m ,only : command_line_test_t
1516
use formats_test_m ,only : formats_test_t
@@ -20,6 +21,7 @@ program main
2021
use vector_test_description_test_m ,only : vector_test_description_test_t
2122
implicit none
2223

24+
type(assert_test_t) assert_test
2325
type(bin_test_t) bin_test
2426
type(command_line_test_t) command_line_test
2527
type(formats_test_t) formats_test
@@ -45,6 +47,7 @@ program main
4547

4648
print "(a)", new_line("") // "Append '-- --help' or '-- -h' to your `fpm test` command to display usage information."
4749

50+
call assert_test%report(passes, tests, skips)
4851
call bin_test%report(passes, tests, skips)
4952
call formats_test%report(passes, tests, skips)
5053
call string_test%report(passes, tests, skips)

0 commit comments

Comments
 (0)