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.
1. Example project structure
. ├── mod ├── src │ └── <your_module>.f90 ├── test │ ├── <your_module>_test.f90 │ ├── fruit_generator.rb | ├── fruit.f90 | └── Makefile └── rake_base.rb
- fruit.f90 - fruit source code
- mod - directory used to store .mod files
- <your_module>.f90 - your actual module
- <your_module>_test.f90 - file with unit tests for your module
- fruit_geneator.rb - script used to generate test driver and basket files
- Makefile - used to compile and run all tests
2. Install requirements
2.1. FRUIT source code
cd <project_dir>/test wget https://raw.githubusercontent.com/mortele/FRUIT/master/src/fruit.f90
2.2. Ruby
sudo apt install ruby-full ruby --version
2.3. Rake
sudo gem install rake
2.4. Fruit_processor_gem
2.4.1. Download fruit_processog_gem direcotry from FRUIT repository
This could be downloaded to any location, just to install additional ruby package.
https://github.com/mortele/FRUIT/tree/master/fruit_processor_gem
NOTE: you will need to download whole repository and extract fruit_processor_gem, or download one folder from github online editor.
To download 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:
git clone https://github.com/mortele/FRUIT
2.4.2. Install fruit_processog_gem
cd ./fruit_processor_gem #or cd FRUIT/fruit_processor_gem sudo rake install
2.5. rake_base.rb
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.
cd <project_dir> wget https://raw.githubusercontent.com/mortele/FRUIT/master/rake_base.rb
3. Create project files
3.1. calculator_test.f90
This file contains your tests, setup and teardown subroutines.
!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
NOTE: in order to autogenerate test_driver and test_basket files, you need to follow naming convention:
- files containing tests must be named: *_test.f90
- test module must be named: *_test
- test subroutines must be named: test_*
3.2. calculator.f90
This is your module.
!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
4. Create driving files
4.1. fruit_generator.rb
This is script needed to run FRUIT processor. You create it once and never modify in basic usage scenario.
#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
4.2. 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.
#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
5. Run tests
Run commands listed below.
cd <project_dir>/test make