Skip to content

Commit 974ff80

Browse files
authored
Merge pull request #204 from rouson/file_t-issues
Fix: work around lfortran issue 12521
2 parents 9e526ab + 62249a4 commit 974ff80

3 files changed

Lines changed: 92 additions & 4 deletions

File tree

src/julienne/julienne_file_s.F90

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,24 @@
2626

2727
module procedure write_to_character_file_name
2828
integer file_unit, l
29-
logical file_open
29+
logical file_open, i_opened
3030

3131
call_assert(allocated(self%lines_))
3232

3333
inquire(file=file_name, opened=file_open, number=file_unit)
34-
if (.not. file_open) open(newunit=file_unit, file=file_name, form='formatted', status='unknown', action='write')
34+
35+
if (.not. file_open) then
36+
open(newunit=file_unit, file=file_name, form='formatted', status='unknown', action='write')
37+
i_opened = .true.
38+
else
39+
i_opened = .false.
40+
end if
3541

3642
do l = 1, size(self%lines_)
3743
write(file_unit, '(a)') self%lines_(l)%string()
3844
end do
45+
46+
if (i_opened) close(file_unit)
3947
end procedure
4048

4149
module procedure write_to_string_file_name
@@ -70,12 +78,22 @@
7078

7179
allocate(file_object%lines_(num_lines))
7280

81+
read_and_store_lines: &
7382
do line_num = 1, num_lines
83+
#ifdef __LFORTRAN__
84+
if (lengths(line_num)==0) then
85+
file_object%lines_(line_num) = string_t("")
86+
if (allocated(line)) deallocate(line)
87+
allocate(character(len=1) :: line)
88+
read(file_unit, '(a)') line
89+
cycle read_and_store_lines
90+
end if
91+
#endif
92+
if (allocated(line)) deallocate(line)
7493
allocate(character(len=lengths(line_num)) :: line)
7594
read(file_unit, '(a)') line
7695
file_object%lines_(line_num) = string_t(line)
77-
deallocate(line)
78-
end do
96+
end do read_and_store_lines
7997

8098
end associate
8199

test/driver.F90

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ program test_suite_driver
1616
use character_stop_code_test_m ,only : character_stop_code_test_t
1717
#endif
1818
use command_line_test_m ,only : command_line_test_t
19+
use file_test_m ,only : file_test_t
1920
use formats_test_m ,only : formats_test_t
2021
use multi_image_test_m ,only : multi_image_test_t, multi_image_setup
2122
use string_test_m ,only : string_test_t
@@ -40,6 +41,7 @@ program test_suite_driver
4041
,test_fixture_t( test_description_test_t()) &
4142
,test_fixture_t( test_diagnosis_test_t()) &
4243
,test_fixture_t( test_result_test_t()) &
44+
,test_fixture_t( file_test_t()) &
4345
,test_fixture_t( command_line_test_t()) &
4446
]))
4547
call test_harness%report_results

test/modules/file_test_m.F90

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
! Copyright (c) 2024-2025, 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 file_test_m
7+
!! Check data partitioning across files
8+
use julienne_m, only : &
9+
file_t &
10+
,operator(.all.) &
11+
,operator(.also.) &
12+
,operator(.equalsExpected.) &
13+
,passing_test &
14+
,string_t &
15+
,test_description_t &
16+
,test_diagnosis_t &
17+
,test_result_t &
18+
,test_t &
19+
,usher
20+
use assert_m, only : assert
21+
implicit none
22+
23+
private
24+
public :: file_test_t
25+
26+
type, extends(test_t) :: file_test_t
27+
contains
28+
procedure, nopass :: subject
29+
procedure, nopass :: results
30+
end type
31+
32+
contains
33+
34+
pure function subject() result(specimen)
35+
character(len=:), allocatable :: specimen
36+
specimen = "A file_t object"
37+
end function
38+
39+
function results() result(test_results)
40+
type(test_result_t), allocatable :: test_results(:)
41+
type(test_description_t), allocatable :: test_descriptions(:)
42+
type(file_test_t) file_test
43+
44+
test_descriptions = [ &
45+
test_description_t(string_t("reading a written file"), usher(check_write_then_read)) &
46+
]
47+
test_results = file_test%run(test_descriptions)
48+
end function
49+
50+
function check_write_then_read() result(test_diagnosis)
51+
!! Check that a written file can be read correctly
52+
type(test_diagnosis_t) test_diagnosis
53+
character(len=*), parameter :: file_name = "build/file_t-unit-test-data.txt"
54+
55+
test_diagnosis = passing_test()
56+
57+
associate(output_lines => [string_t("foo"), string_t(""), string_t("bar ")])
58+
associate(output_file => file_t(output_lines))
59+
call output_file%write_lines(file_name)
60+
associate(input_file => file_t(file_name))
61+
test_diagnosis = test_diagnosis .also. (.all. (input_file%lines() .equalsExpected. output_lines))
62+
end associate
63+
end associate
64+
end associate
65+
66+
end function
67+
68+
end module file_test_m

0 commit comments

Comments
 (0)