Skip to content

Commit 1fd8c7b

Browse files
committed
feat(assert): add idiomatic assertion capability
This commit implements the idiomatic assertion feature described by Rouson et al. [1]. The leverages the machinery for writing test-diagnosis expressions inspired by natural language and supports the same for assertion diagnoses. To accomplish this, the commit adds 1. An assertion_diagnosis_t type that trivially extends Julienne's test_diagnosis_t type, i.e., without adding components or procedure bindings, and 2. A generic assert interface and corresponding julienne_assert subroutine, wherein a. The subroutine's interface body contains only one dummy argument: an assertion_diagnosis_t object and where b. The subroutine's definition contains only one executable statement: a call to the Assert dependency's "assert" subroutine. [1] Rouson, D., Bonachea, D., and Rasmussen, K. (2025) "Idiomatic correctness-checking via Fortran 2023 using Julienne," US-RSE '25, under review.
1 parent 9fd8749 commit 1fd8c7b

2 files changed

Lines changed: 39 additions & 0 deletions

File tree

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
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_parent
8+
assertion_diagnosis%test_diagnosis_t = test_diagnosis
9+
end procedure
10+
11+
module procedure julienne_assert
12+
call assert_library_assert(assertion_diagnosis%test_passed_, assertion_diagnosis%diagnostics_string_)
13+
end procedure
14+
15+
end submodule

src/julienne/julienne_test_diagnosis_m.F90

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ module julienne_test_diagnosis_m
1010

1111
private
1212
public :: test_diagnosis_t
13+
public :: assertion_diagnosis_t
14+
public :: assert
1315
public :: operator(.all.)
1416
public :: operator(.and.)
1517
public :: operator(.approximates.)
@@ -30,6 +32,9 @@ module julienne_test_diagnosis_m
3032
procedure diagnostics_string
3133
end type
3234

35+
type, extends(test_diagnosis_t) :: assertion_diagnosis_t
36+
end type
37+
3338
integer, parameter :: default_real = kind(1.), double_precision = kind(1D0)
3439

3540
#if HAVE_DERIVED_TYPE_KIND_PARAMETERS
@@ -47,6 +52,25 @@ module julienne_test_diagnosis_m
4752
end type
4853
#endif
4954

55+
interface assertion_diagnosis_t
56+
57+
pure module function construct_from_parent(test_diagnosis) result(assertion_diagnosis)
58+
implicit none
59+
type(test_diagnosis_t), intent(in) :: test_diagnosis
60+
type(assertion_diagnosis_t) assertion_diagnosis
61+
end function
62+
63+
end interface
64+
65+
interface assert
66+
67+
pure module subroutine julienne_assert(assertion_diagnosis)
68+
implicit none
69+
type(assertion_diagnosis_t), intent(in) :: assertion_diagnosis
70+
end subroutine
71+
72+
end interface
73+
5074
interface operator(.all.)
5175

5276
pure module function aggregate_diagnosis(diagnoses) result(diagnosis)

0 commit comments

Comments
 (0)