You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 7 Next »

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

Rake 12.3.3 is the latest Rake version supported by Ruby 2.0.0.

gem install rake -v 12.3.3

You will also need to add rake to your PATH.

cd ~
nano .bashrc

#add below line to the end of the .bashrc
export PATH=~/.gem/ruby/gems/rake-12.3.3/bin:$PATH"
#to save click ctrl+O and ctrl+X to exit
source .bashrc


2.4.  Fruit_processor_gem

2.4.1. Download fruit_processor_gem

git clone --recursive https://github.com/mortele/FRUIT

2.4.2. Install fruit_processor_gem

cd .FRUIT/fruit_processor_gem
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

6. Example output


  • No labels