Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

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.

Example project structure

Code Block
.
├── 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

Install requirements

 FRUIT source code

Code Block
cd <project_dir>/test
wget https://raw.githubusercontent.com/mortele/FRUIT/master/src/fruit.f90

Ruby

Code Block
sudo apt install ruby-full
ruby --version

Rake

Code Block
sudo gem install rake

 Fruit_processor_gem

Download fruit_processog_gem direcotry from FRUIT repository

This could be downloaded to any location, just to install additional ruby package.

...

Install fruit_processog_gem

Code Block
cd ./fruit_processor_gem
sudo rake install

rake_base.rb

You will need to download rake_base.rb file from FRUIT repository in order to run fruit_generator script

Code Block
cd <project_dir>
wget https://raw.githubusercontent.com/mortele/FRUIT/master/rake_base.rb

Create project files

calculator.f90

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

calculator_test.f90

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_*

Create driving files

fruit_generator.rb

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

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

Code Block
cd <project_dir>/test
make

Example output