Skip to content

Commit a2ae20c

Browse files
committed
test(formats_m): more robust unit tests
1 parent 322b14e commit a2ae20c

File tree

5 files changed

+44
-57
lines changed

5 files changed

+44
-57
lines changed

src/sourcery/sourcery_string_m.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ elemental module function from_real(x) result(string)
5757

5858
interface operator(.cat.)
5959

60-
pure module function concatenate_elements(strings) result(concatenated_strings)
60+
pure module function concatenate_elements(strings) result(concatenated_strings)
6161
implicit none
6262
type(string_t), intent(in) :: strings(:)
6363
type(string_t) concatenated_strings

src/sourcery/sourcery_string_s.f90

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,17 +25,14 @@
2525
end procedure
2626

2727
module procedure from_real
28-
integer, parameter :: sign_ = 1, decimal_ = 1, digits = precision(x) + 6, exponent = 4
29-
character(len=sign_ + decimal_ + digits + exponent) characters
28+
character(len=100) characters
3029
write(characters, '(g0)') x
3130
string = string_t(characters)
3231
end procedure
3332

3433
module procedure concatenate_elements
3534
integer s
3635

37-
!allocate(concatenated_strings(sum(len(strings%string()))))
38-
3936
concatenated_strings = ""
4037
do s = 1, size(strings)
4138
concatenated_strings = concatenated_strings // strings(s)%string()

test/formats_test.f90

Lines changed: 28 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ module formats_test_m
1616

1717
pure function subject() result(specimen)
1818
character(len=:), allocatable :: specimen
19-
specimen = "The csv format"
19+
specimen = "A format string"
2020
end function
2121

2222
function results() result(test_results)
@@ -32,68 +32,54 @@ function results() result(test_results)
3232

3333
function check_csv_reals() result(test_passes)
3434
logical test_passes
35-
character(len=*), parameter :: longest_expected_output = "0.00000000,1.00000000,2.00000000"
36-
character(len=len(longest_expected_output)) captured_output
37-
character(len=:), allocatable :: substring
35+
character(len=100) captured_output
36+
real zero, one, two
3837

3938
write(captured_output, fmt = separated_values(separator=",", mold=[integer::])) [0.,1.,2.]
4039

41-
substring = adjustl(trim(captured_output))
42-
associate(leading_real_zero => index(substring, "0.") == 1)
43-
substring = adjustl(substring(index(substring, ",")+1:)) ! get remaining string after fierst comma
44-
associate(followed_by_real_one => index(substring, "1.") == 1 )
45-
substring = adjustl(substring(index(substring, ",")+1:)) ! get remaining string after fierst comma
46-
associate(followed_by_real_two => index(substring, "2.") == 1 )
47-
test_passes = leading_real_zero .and. followed_by_real_one .and.followed_by_real_two
48-
end associate
40+
associate(first_comma => index(captured_output, ','))
41+
associate(second_comma => first_comma + index(captured_output(first_comma+1:), ','))
42+
read(captured_output(:first_comma-1), *) zero
43+
read(captured_output(first_comma+1:second_comma-1), *) one
44+
read(captured_output(second_comma+1:), *) two
45+
test_passes = (zero==0.) .and. (one==1.) .and. (two==2.)
4946
end associate
5047
end associate
5148
end function
5249

5350
function check_space_separated_complex() result(test_passes)
5451
logical test_passes
55-
character(len=*), parameter :: longest_expected_output = "(0.00000000,1.00000000) (1.00000000,0.00000000)"
56-
character(len=len(longest_expected_output)) captured_output
52+
character(len=100) captured_output
53+
character(len=:), allocatable :: i_string, one_string
5754
complex, parameter :: i = (0.,1.), one = (1.,0.)
58-
character(len=:), allocatable :: i_imag_part, one_imag_part, i_string, one_string
55+
complex i_read, one_read
5956

6057
write(captured_output, fmt = separated_values(separator=" ", mold=[complex::])) i,one
6158

62-
i_string = adjustl(trim(captured_output(:index(captured_output,")"))))
63-
one_string = adjustl(trim(captured_output(len(i_string)+1:)))
64-
65-
associate( &
66-
i_real_part_zero => index(i_string,"(0.") == 1, &
67-
one_real_part_one => index(one_string,"(1.") == 1 &
68-
)
69-
i_imag_part = adjustl(i_string(index(i_string,",")+1:index(i_string,")")-1))
70-
one_imag_part = adjustl(one_string(index(one_string,",")+1:index(one_string,")")-1))
71-
associate( &
72-
i_imag_part_one => index(i_imag_part,"1.") == 1, &
73-
one_imag_part_zero => index(one_imag_part,"0.") == 1 &
74-
)
75-
test_passes = i_real_part_zero .and. i_imag_part_one .and. one_real_part_one .and. one_imag_part_zero
76-
end associate
77-
end associate
59+
i_string = captured_output(:index(captured_output,")"))
60+
one_string = captured_output(len(i_string)+1:)
61+
62+
read(i_string,*) i_read
63+
read(one_string,*) one_read
64+
65+
test_passes = i_read == i .and. one_read == one
7866
end function
7967

80-
pure function check_new_line_separated_integers() result(test_passes)
68+
function check_csv_character() result(test_passes)
8169
logical test_passes
82-
character(len=*), parameter :: expected_output = ( "0" // new_line("") // "1" //new_line("") // "2")
83-
character(len=len(expected_output)) captured_output
70+
character(len=200) captured_output
71+
character(len=*), parameter :: expected_output = "Yodel, Ay, Hee, Hoo!"
8472

85-
write(captured_output, fmt = separated_values(separator=new_line(""), mold=[integer::])) [0,1,2]
86-
test_passes = captured_output == "0" // new_line("") // "1" //new_line("") // "2"
73+
write(captured_output, fmt = separated_values(separator=", ", mold=[integer::])) "Yodel", "Ay", "Hee", "Hoo!"
74+
test_passes = expected_output == captured_output
8775
end function
8876

89-
pure function check_csv_character() result(test_passes)
77+
function check_new_line_separated_integers() result(test_passes)
9078
logical test_passes
91-
integer, parameter :: num_spaces=3
92-
character(len=*), parameter :: expected_output = "Yodel, Ay, Hee, Hoo!"
93-
character(len=len(expected_output)+num_spaces) captured_output
79+
character(len=100) captured_output
9480

95-
write(captured_output, fmt = separated_values(separator=", ", mold=[integer::])) "Yodel", "Ay", "Hee", "Hoo!"
96-
test_passes= expected_output == captured_output
81+
write(captured_output, fmt = separated_values(separator=new_line(""), mold=[integer::])) [0,1,2]
82+
test_passes = captured_output == "0" // new_line("") // "1" //new_line("") // "2"
9783
end function
9884

9985
end module formats_test_m

test/main.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ program main
2525
call data_partition_test%report(passes, tests)
2626
call collectives_test%report(passes, tests)
2727
call object_test%report(passes, tests)
28-
call formats_test%report(passes, tests)
2928
call test_result_test%report(passes, tests)
29+
call formats_test%report(passes, tests)
3030
call string_test%report(passes, tests)
3131

3232
if (.not. GitHub_CI()) call command_line_test%report(passes, tests)

test/string_test.F90

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -225,16 +225,23 @@ function constructs_from_default_integer() result(passed)
225225

226226
function constructs_from_real() result(passed)
227227
logical passed
228+
real, parameter :: real_value = -1./1024. ! use a negative power of 2 an exactly representable rational number
229+
real read_value
228230

229231
#ifndef _CRAYFTN
230-
associate(string => string_t(-1.53018260E-15))
231-
passed = adjustl(trim(string%string())) == "-0.153018260E-14"
232+
associate(string => string_t(real_value)
233+
read(string%string(), *) read_value
234+
passed = read_value == real_value
232235
end associate
233236
#else
234-
type(string_t) string
235-
string = string_t(-1.53018260E-15)
236-
passed = adjustl(trim(string%string())) == "-0.153018260E-14"
237+
block
238+
type(string_t) string
239+
string = string_t(real_value)
240+
read(string%string(), *) read_value
241+
passed = read_value == real_value
242+
end block
237243
#endif
244+
238245
end function
239246

240247
function extracts_file_base_name() result(passed)
@@ -267,10 +274,7 @@ function extracts_file_name_extension() result(passed)
267274

268275
function concatenates_elements() result(passed)
269276
logical passed
270-
271-
associate(elements => [string_t("foo"), string_t("bar")])
272-
passed = .cat. elements == "foobar"
273-
end associate
277+
passed = (.cat. [string_t("foo"), string_t("bar")]) == "foobar"
274278
end function
275279

276280
end module string_test_m

0 commit comments

Comments
 (0)