Fruit could be use along with Ruby pre-processor as part of the simple standalone FORTRAN approach. The advantage of using the pre-processor is it removes the need to maintain the basket and driver files and keep them up to date.
IMPORTANT: Notice all file code blocks have first line commented with their location. This will help you understanding where should they be placed.
Example project structure
...
NOTE: you will need to download whole repository and extract fruit_processor_gem, or download one folder from github online editor.
To do thisdownload one folder:
- Open in your browser https://github.dev/mortele/FRUIT/tree/master/fruit_processor_gem
- Login if asked
- Right click fruit_processor_gem directory on the project explorer panel and click download
To download whole repository:
Code Block |
---|
git clone https://github.com/mortele/FRUIT |
Install fruit_processog_gem
Code Block |
---|
cd ./fruit_processor_gem
#or cd FRUIT/fruit_processor_gem
sudo rake install |
...
You will need to download rake_base.rb file from FRUIT repository in order to run fruit_generator script. You will never modify it's content.
Code Block |
---|
cd <project_dir> wget https://raw.githubusercontent.com/mortele/FRUIT/master/rake_base.rb |
Create project files
calculator_test.f90
This file contains your tests, setup and teardown subroutines.
Code Block |
---|
!file <project_directory>/test/calculator_test.f90 module calculator_test use fruit contains subroutine setup print *, "setup subroutine ran" end subroutine setup subroutine teardown print *, "teardown subroutine ran" end subroutine teardown subroutine test_calculator use calculator integer :: result !test add subroutine call add (2,2,result) call assert_equals(4,result) end subroutine test_calculator end module calculator_test |
...
- files containing tests must be named: *_test.f90
- test module must be named: *_test
- test subroutines must be named: test_*
calculator.f90
This is your module.
Code Block |
---|
!file <project_directory>/src/calculator.f90 module calculator implicit none contains subroutine add(a,b,output) integer, intent (in) :: a,b integer, intent (out) :: output output=a+b end subroutine add end module calculator |
Create driving files
fruit_generator.rb
This is script needed to run FRUIT processor. You create it once and never modify in basic usage scenario.
Code Block |
---|
#file <project_dir>/test/fruit_generator.rb require 'rubygems' require 'fruit_processor' load "../rake_base.rb" $build_dir = "" $goal = "fruit_driver_dummy" fp = FruitProcessor.new fp.pre_process |
Makefile
This is file with build instruction. You will not have to modify it unless you stick to project structure. Just copy it's content and save as Makefile in <project_dir>/test directory.
Code Block |
---|
#file <project_dir>/test/Makefile compiler=gfortran option=-Wall -Wextra -Wno-tabs -pedantic -fbounds-check -Wuninitialized -O -g \ -Wno-unused-parameter -cpp fruit_code = ./fruit.f90 code = ../src/*.f90 ./*_test.f90 code_gen = fruit_basket_gen.f90 fruit_driver_gen.f90 all_code = $(fruit_code) $(code) $(code_gen) driver = fruit_driver all : build run build : $(driver) fruit_basket_gen.f90 : $(code) ruby fruit_generator.rb fruit_driver_gen.f90 : $(code) ruby fruit_generator.rb fruit_driver : $(all_code) $(compiler) $(option) $(all_code) -J ../mod -o fruit_driver clean : rm -f *.o *.mod *.obj fruit_driver rm -f fruit_driver_gen.f90 rm -f fruit_basket_gen.f90 rm -f result.xml result_tmp.xml run : $(driver) ./$(driver) .PHONY : all clean run |
Run tests
Run commands listed below.
Code Block |
---|
cd <project_dir>/test make |
...