funit 0.11.1 → 0.12.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d0c1b7e86685588f2c956c94b7db107ad3e5b701
4
+ data.tar.gz: d67d36f40691f235e6245f4505bad8dcb8400550
5
+ SHA512:
6
+ metadata.gz: 737765bd524762b7e426851d1cb0108b8d8a0e354c6de3868b006390754fcbb9092246e230436d675e17814679f9074a49c8a8248410c09226591626039334ce
7
+ data.tar.gz: 86fc8af4c54a5d62ff3c9412472cc46a8516b97b7d68faf707032155cb0b70fc5eb333699b29d3eaa4ce2feb933b02b05a42423ea381eb968a7e03047b710a2a
@@ -1,3 +1,29 @@
1
+ === 0.12.3 / 2016-2-05
2
+
3
+ * 1 minor enhancement
4
+ * Enable funit to track inlined function dependencies in makefile
5
+
6
+ * 1 bug fix
7
+ * reverting back to gem fortran, since access to original gem has been restored
8
+
9
+ === 0.12.2 / 2016-1-20
10
+
11
+ * 1 minor enhancement
12
+ * Enable funit to read files with .F90 extension
13
+
14
+ === 0.12.1 / 2016-1-19
15
+
16
+ * 1 bug fix
17
+ * Changed required gem fortran -> fortran_dependencies to track forked gem of "fortran"
18
+
19
+ === 0.12.0 / 2016-1-14
20
+
21
+ * major enhancement
22
+ * Allow user to specify C/C++ code needed by fortran unit test
23
+
24
+ * minor enhancement
25
+ * Refactored option input using optparse
26
+
1
27
  === 0.11.1 / 2009-11-01
2
28
 
3
29
  * 1 bug fix
@@ -1,7 +1,7 @@
1
- History.txt
1
+ History.rdoc
2
2
  License.txt
3
3
  Manifest.txt
4
- README.txt
4
+ README.rdoc
5
5
  Rakefile
6
6
  bin/funit
7
7
  examples/CFD/FluxFunctions.f90
@@ -18,6 +18,7 @@ lib/funit/assertions.rb
18
18
  lib/funit/compiler.rb
19
19
  lib/funit/functions.rb
20
20
  lib/funit/testsuite.rb
21
+ lib/funit/c_tools.rb
21
22
  pitch/slides.tex
22
23
  test/test_compiler.rb
23
24
  test/test_functions.rb
@@ -1,21 +1,22 @@
1
- = FUnit
1
+ = funit
2
2
 
3
- * http://rubyforge.org/projects/nasarb
4
- * http://nasarb.rubyforge.org/funit
5
- * mailto:nasarb-developers@rubyforge.org
3
+ home :: https://rubygems.org/gems/funit
4
+ code :: https://github.com/kleb/nasarb/tree/master/funit
5
+ bugs :: https://github.com/kleb/nasarb/issues
6
+ rdoc :: http://www.rubydoc.info/gems/funit
6
7
 
7
8
  == DESCRIPTION:
8
9
 
9
- FUnit is a unit testing framework for Fortran.
10
+ funit is a unit testing framework for Fortran.
10
11
 
11
12
  Unit tests are written as Fortran fragments that use a small
12
- set of testing-specific keywords and functions. FUnit transforms
13
+ set of testing-specific keywords and functions. funit transforms
13
14
  these fragments into valid Fortran code, compiles, links, and
14
15
  runs them against the code under test.
15
16
 
16
- FUnit is
17
+ funit is
17
18
  {opinionated software}[http://www.oreillynet.com/pub/a/network/2005/08/30/ruby-rails-david-heinemeier-hansson.html],
18
- which values convention over configuration. Specifically, FUnit requires,
19
+ which values convention over configuration. Specifically, funit requires,
19
20
 
20
21
  * a Fortran 95 compiler,
21
22
  * tests to be stored along side the code under test, and
@@ -73,15 +74,15 @@ and run the tests, viz,
73
74
  gas_physics test suite:
74
75
  Passed 2 of 2 possible asserts comprising 1 of 1 tests.
75
76
 
76
- This and other examples come with the FUnit distribution in the
77
+ This and other examples come with the funit distribution in the
77
78
  <tt>examples</tt> directory. There is also an emacs mode in
78
- the <tt>utils</tt> directory. If you installed the FUnit via Rubygems,
79
+ the <tt>utils</tt> directory. If you installed funit via Rubygems,
79
80
  these directories can be found in your Rubygems library directory, e.g., <tt>/usr/local/lib/ruby/gems</tt>.
80
81
 
81
82
  == REQUIREMENTS:
82
83
 
83
- * Fortran 90/95/2003 compiler
84
- * Ruby with Rubygems package manager
84
+ * Fortran compiler (and setting FC environment variable to point to it)
85
+ * Ruby
85
86
  * The fortran Rubygem
86
87
 
87
88
  == INSTALL:
@@ -94,7 +95,7 @@ these directories can be found in your Rubygems library directory, e.g., <tt>/us
94
95
 
95
96
  == LICENSE:
96
97
 
97
- FUnit is released under the NASA Open Source Agreement -- see License.txt[link:files/License_txt.html] for details.
98
+ funit is released under the NASA Open Source Agreement -- see License.txt[link:files/License_txt.html] for details.
98
99
 
99
100
  == ORIGIN:
100
101
 
data/Rakefile CHANGED
@@ -1,20 +1,17 @@
1
1
  # -*- ruby -*-
2
2
 
3
- require 'rubygems'
4
3
  require 'hoe'
4
+ #Hoe.plugin :rdoc
5
5
 
6
- $LOAD_PATH.unshift File.join( File.dirname(__FILE__), 'lib')
7
-
8
- require 'funit.rb'
9
-
10
- Hoe.new('funit', Funit::VERSION) do |funit|
11
- funit.rubyforge_name = 'nasarb'
6
+ Hoe.spec 'funit' do |funit|
7
+ funit.group_name = 'nasarb'
12
8
  funit.remote_rdoc_dir = 'funit'
13
- funit.extra_deps << [ 'fortran', '>= 1.1.0' ]
9
+ funit.licenses = ['NASA-1.3']
10
+ funit.extra_deps << [ 'fortran', '~> 1.0', '>= 1.3.0' ]
14
11
  funit.spec_extras[:requirements] = "A Fortran compiler."
15
12
  funit.author =
16
13
  [ 'Karen Bibb', 'Bil Kleb', 'Beth Lee-Rausch', 'Mike Park', 'Bill Wood' ]
17
- funit.email = 'nasarb-developers@rubyforge.org'
14
+ funit.email = [ 'bil.kleb@nasa.gov' ]
18
15
  funit.clean_globs.
19
16
  concat %w[ **/*_fun.f90 **/makeTestRunner examples/**/TestRunner* **/*.o **/*.mod **/*.MOD ]
20
17
  funit.rsync_args = '-rpv --delete' # to preserve group permissions
data/bin/funit CHANGED
@@ -2,63 +2,62 @@
2
2
 
3
3
  # Main fUnit routine
4
4
 
5
- begin require 'rubygems'; rescue LoadError; end
6
-
7
5
  $:.push "#{File.dirname $0}/../lib"
8
6
  require 'funit'
9
- require 'getoptlong'
7
+ require 'optparse'
8
+ require 'ostruct'
10
9
 
11
10
  include Funit
12
11
 
13
- prog_source_dirs = ['.']
12
+ funit_data = OpenStruct.new
13
+ funit_data.prog_source_dirs = ['.']
14
+ funit_data.c_code = Funit::C_compile.new
15
+
16
+ OptionParser.new do |opts|
17
+ opts.banner = <<-END_OF_HELP
18
+ To use fUnit, type:
19
+ funit [-options] [test_file_name(s)]
20
+ The argument(s) is optional. If no argument is given, then all the .fun files inside the working directory will be used.
21
+ END_OF_HELP
22
+
23
+ opts.separator ""
24
+ opts.separator "Specific options:"
25
+
26
+ opts.on("-s","--source <dir>",String,"Specify a directory for the non-test source") do |dir|
27
+ funit_data.prog_source_dirs << dir.chomp("/")
28
+ end
29
+
30
+ opts.on("-l","--link_c_code <dir>",String,"Specify a directory of C/C++ code that must be compiled/linked") do |dir|
31
+ funit_data.c_code.compile_library(dir)
32
+ end
14
33
 
15
- opts = GetoptLong.new(
16
- ['--help', '-h', GetoptLong::NO_ARGUMENT],
17
- ['--clean', '-c', GetoptLong::NO_ARGUMENT],
18
- ['--version', '-V', GetoptLong::NO_ARGUMENT],
19
- ['--source', '-s', GetoptLong::REQUIRED_ARGUMENT]
20
- )
34
+ opts.on_tail("--clean","To remove the files generated by funit") do
35
+ funit_data.c_code.clean_c_code
36
+ Funit::clean_genFiles
37
+ exit
38
+ end
39
+
40
+ opts.separator ""
41
+ opts.separator "Common options:"
42
+
43
+ opts.on_tail("-v","--version","Print version") do
44
+ puts "funit version #{Funit::VERSION}"
45
+ exit
46
+ end
47
+
48
+ opts.on_tail("-h", "--help", "Detailed overview of funit options") do
49
+ puts opts
50
+ exit
51
+ end
21
52
 
22
- opts.each do |opt,arg|
23
- begin
24
- case opt
25
- when '--help'
26
- Funit::print_help
27
- exit
28
- when '--version'
29
- puts Funit::VERSION
30
- exit
31
- when '--clean'
32
- Funit::clean_genFiles
33
- exit
34
- when '--source'
35
- if(ENV['FSFLAG'].nil?) then
36
- puts <<-EOF
37
- No environment variable FSFLAG set.
53
+ end.parse!
38
54
 
39
- For example for most compilers such as gfortran you will need: -I
40
- sh: export FSFLAG=-I
41
- csh: setenv FSFLAG -I
42
- windows: set FSFLAG=-I
55
+ funit_data.prog_source_dirs.flatten!
56
+ funit_data.prog_source_dirs.uniq!
43
57
 
44
- but for some such as Sun's f95 compiler you will need: -M
45
- sh: export FSFLAG=-M
46
- csh: setenv FSFLAG -M
47
- windows: set FSFLAG=-M
48
- EOF
49
- exit
50
- end
51
- prog_source_dirs << arg.split
52
- prog_source_dirs.flatten!
53
- prog_source_dirs.uniq!
54
- end
55
- rescue => err
56
- puts err
57
- break
58
- end
59
- end
58
+ Funit::check_for_FSFLAG
60
59
 
61
- Funit::run_tests(prog_source_dirs)
60
+ Funit::run_tests(funit_data)
62
61
 
63
62
  #--
64
63
  # Copyright 2006-2007 United States Government as represented by
@@ -6,7 +6,7 @@ real :: seconds
6
6
  setup
7
7
  NotInitialized = .TRUE.
8
8
  last = 0
9
- seconds = HUGE(0.0)
9
+ seconds = 0.0
10
10
  end setup
11
11
 
12
12
  test SystemDateAndTimeWorks
@@ -42,22 +42,23 @@ end test
42
42
  test InitiallyReturnsZero
43
43
  seconds = secSinceLast()
44
44
  Assert_Real_Equal( 0.0, seconds )
45
- call timeDelay(seconds)
45
+ call timeDelay
46
46
  seconds = secSinceLast()
47
47
  Assert_True( seconds /= 0.0 )
48
48
  end test
49
49
 
50
- subroutine timeDelay (sum)
51
- integer :: i
52
- real :: sum
50
+ subroutine timeDelay
51
+ integer :: i, sum
53
52
  do i = 1, 1000000
54
53
  sum = sum + i
55
54
  enddo
55
+ print*, sum
56
56
  end subroutine timeDelay
57
57
 
58
58
  test ComputesSeconds
59
59
  seconds = secSinceLast()
60
- call timeDelay (seconds)
60
+ call timeDelay
61
+ print*, seconds
61
62
  seconds = secSinceLast()
62
63
  Assert_True( seconds > 0.0 )
63
64
  end test
@@ -67,7 +68,7 @@ test ComputesSecondsSpecial
67
68
 
68
69
  seconds = secSinceLast()
69
70
  dateAndTime1 = last
70
- call timeDelay (seconds)
71
+ call timeDelay
71
72
  seconds = secSinceLast()
72
73
  dateAndTime2 = last
73
74
  expectedSeconds = secBetween(dateAndTime1,dateAndTime2)
@@ -1,5 +1,4 @@
1
1
  begin
2
- require 'rubygems'
3
2
  require 'fortran'
4
3
  rescue LoadError
5
4
  STDERR.puts "gem install fortran"
@@ -10,16 +9,17 @@ require 'funit/compiler'
10
9
  require 'funit/functions'
11
10
  require 'funit/assertions'
12
11
  require 'funit/testsuite'
12
+ require 'funit/c_tools'
13
13
  require 'fileutils'
14
14
 
15
15
  module Funit
16
16
 
17
- VERSION = '0.11.1'
17
+ VERSION = '0.12.3'
18
18
 
19
19
  ##
20
20
  # run all tests
21
21
 
22
- def run_tests(prog_source_dirs=['.'])
22
+ def run_tests(funit_data)
23
23
  Compiler.new# a test for compiler env set (FIXME: remove this later)
24
24
  write_test_runner( test_files = parse_command_line )
25
25
  test_suites = []
@@ -29,7 +29,8 @@ module Funit
29
29
  ts_name = $1
30
30
  ts_content = $2
31
31
  if((!File.exist?(ts_name+"_fun.f90")) || File.mtime(ts_name+"_fun.f90") < File.mtime(test_file+".fun")) then
32
- if ( File.read(ts_name+'.f90').match(/\s*module\s+#{ts_name}/i) ) then
32
+ source_file = Dir.glob("#{ts_name}.*90").first
33
+ if ( File.read(source_file).match(/\s*module\s+#{ts_name}/i) ) then
33
34
  TestSuite.new(ts_name, ts_content, false)
34
35
  else
35
36
  TestSuite.new(ts_name, ts_content, true)
@@ -38,7 +39,7 @@ module Funit
38
39
  test_suites.push(ts_name)
39
40
  }
40
41
  }
41
- compile_tests(test_suites,prog_source_dirs)
42
+ compile_tests(test_suites,funit_data)
42
43
  exit 1 unless system "env PATH='.' TestRunner"
43
44
  end
44
45
 
@@ -55,22 +56,24 @@ module Funit
55
56
  FileUtils.rm_f(tbCancelled)
56
57
  end
57
58
 
58
- ##
59
- # prints a usage help for the user
59
+ def check_for_FSFLAG
60
+ if(ENV['FSFLAG'].nil?) then
61
+ puts <<-EOF
62
+ No environment variable FSFLAG set.
60
63
 
61
- def print_help
62
- puts <<-END_OF_HELP
63
- To use fUnit, type:
64
- funit [-options] [test_file_name(s)]
65
- The argument(s) is optional. If no argument is given, then all the .fun files inside the working directory will be used.
64
+ For example for most compilers such as gfortran you will need: -I
65
+ sh: export FSFLAG=-I
66
+ csh: setenv FSFLAG -I
67
+ windows: set FSFLAG=-I
66
68
 
67
- The options are:
68
- --clean => To remove the files generated by fUnit
69
- -h, --help => Prints this help
70
- -s <dir>, --source <dir> => To specify a directory for the non-test source
71
- END_OF_HELP
69
+ but for some such as Sun's f95 compiler you will need: -M
70
+ sh: export FSFLAG=-M
71
+ csh: setenv FSFLAG -M
72
+ windows: set FSFLAG=-M
73
+ EOF
74
+ exit
75
+ end
72
76
  end
73
-
74
77
  end
75
78
 
76
79
  #--
@@ -0,0 +1,205 @@
1
+ module Funit
2
+ class C_compile
3
+ def initialize
4
+ check_c_compiler
5
+ @libraries = {}
6
+ end
7
+
8
+ def check_c_compiler
9
+ if(ENV['CXX'].nil?) then
10
+ puts <<-EOF
11
+
12
+ You have not specified a C++ compiler. Please specify a compiler via the $(CXX) environment variable.
13
+
14
+ In bash, for example:
15
+
16
+ export CXX="g++"
17
+
18
+ EOF
19
+ elsif(ENV['CC'].nil?) then
20
+ puts <<-EOF
21
+
22
+ You have not specified a C compiler. Please specify a compiler via the $(CC) environment variable.
23
+
24
+ In bash, for example:
25
+
26
+ export CC="gcc"
27
+
28
+ EOF
29
+ exit
30
+ end
31
+ end
32
+
33
+ def compile_library(dir)
34
+ puts "building: #{dir}"
35
+ Dir.chdir(dir) do
36
+ static_lib = make_objs
37
+ @libraries[dir]=static_lib.match(/lib(\w+)\.a/).captures.join
38
+ end
39
+ end
40
+
41
+ def make_objs(dir=Dir.getwd)
42
+ if File.exist?("Makefile.am")
43
+ sources = parse_automake_file
44
+ static_library = sources[0]
45
+ File.open("makeTestRunner", "w") {|file| file.puts write_custom_c_makefile(sources)}
46
+ else
47
+ static_library = "lib#{File.basename(Dir.getwd)}.a"
48
+ File.open("makeTestRunner", "w") {|file| file.puts write_generic_c_makefile(static_library)}
49
+ end
50
+ compile = "make -f makeTestRunner"
51
+ raise "Compile failed in #{dir}." unless system compile
52
+ static_library
53
+ end
54
+
55
+ def parse_automake_file
56
+ sources = []
57
+ lines = IO.readlines("Makefile.am")
58
+ while line = lines.shift
59
+ sources << $1 if line.match(/^\s*lib_LIBRARIES\s*=\s*(\w+\.a)/)
60
+ if line.match(/^\s*\w+_SOURCES\s*=/)
61
+ sources << line.scan(/\w+\.cpp/)
62
+ while line.match(/\\\s*$/)
63
+ line = lines.shift
64
+ sources << line.scan(/(\w+\.cpp)|(\w+\.c)/)
65
+ end
66
+ end
67
+ end
68
+ sources.uniq.flatten.compact
69
+ end
70
+
71
+ def print_linker_flags
72
+ output_string = ''
73
+ @libraries.each do |k,v|
74
+ output_string += " -L#{k} -l#{v}"
75
+ end
76
+ output_string += " -lstdc++"
77
+ end
78
+
79
+ def clean_c_code
80
+ @libraries.keys.each do |k|
81
+ Dir.chdir(k) do
82
+ puts "cleaning C code in #{k}"
83
+ make_clean = "make -f makeTestRunner clean"
84
+ system make_clean
85
+ FileUtils.rm "makeTestRunner"
86
+ end
87
+ end
88
+ end
89
+
90
+ def write_generic_c_makefile(library)
91
+ c_makefile = %Q{
92
+ # makefile to compile c++ code
93
+ # Add .d to Make's recognized suffixes.
94
+ SUFFIXES += .d
95
+
96
+ #Archive command and options
97
+ AR = ar
98
+ AR_OPTS = cru
99
+
100
+ LIBRARY = #{library}
101
+
102
+ #We don't need to clean up when we're making these targets
103
+ NODEPS:=clean tags svn
104
+ #Find all the C++ files in this directory
105
+ SOURCES:=$(shell find . -name "*.cpp")
106
+ SOURCES+=$(shell find . -name "*.c")
107
+
108
+ #These are the dependency files, which make will clean up after it creates them
109
+ CFILES:=$(SOURCES:.cpp=.c)
110
+ DEPFILES:=$(CFILES:.c=.d)
111
+
112
+ OBJS:=$(CFILES:.c=.o)
113
+
114
+ all: $(LIBRARY)
115
+
116
+ #Rule to create library archive
117
+ $(LIBRARY): $(OBJS)
118
+ \t$(AR) $(AR_OPTS) $@ $^
119
+
120
+ #Don't create dependencies when we're cleaning, for instance
121
+ ifeq (0, $(words $(findstring $(MAKECMDGOALS), $(NODEPS))))
122
+ #Chances are, these files don't exist. GMake will create them and
123
+ #clean up automatically afterwards
124
+ -include $(DEPFILES)
125
+ endif
126
+
127
+ #This is the rule for creating the C++ dependency files
128
+ %.d: %.cpp
129
+ \t$(CXX) $(CXXFLAGS) -MM -MT '$(patsubst %.cpp,%.o,$<)' $< -MF $@
130
+
131
+ #This is the rule for creating the C dependency files
132
+ %.d: %.c
133
+ \t$(CC) $(CFLAGS) -MM -MT '$(patsubst %.c,%.o,$<)' $< -MF $@
134
+
135
+ #This rule does the compilation for C++ files
136
+ %.o: %.cpp %.d %.h
137
+ \t$(CXX) $(CXXFLAGS) -o $@ -c $<
138
+
139
+ #This rule does the compilation for C files
140
+ %.o: %.c %.d %.h
141
+ \t$(CC) $(CFLAGS) -o $@ -c $<
142
+
143
+ clean:
144
+ \trm -rf *.o *.d *.a
145
+
146
+ }.gsub!(/^ /,'')
147
+ end
148
+
149
+ def write_custom_c_makefile(sources)
150
+ library = sources.shift
151
+ source_files = sources.join(" ")
152
+ c_makefile = %Q{
153
+ # makefile to compile c++ code
154
+ # Add .d to Make's recognized suffixes.
155
+ SUFFIXES += .d
156
+
157
+ #Archive command and options
158
+ AR = ar
159
+ AR_OPTS = cru
160
+
161
+ LIBRARY = #{library}
162
+
163
+ SOURCES = #{source_files}
164
+
165
+ #These are the dependency files, which make will clean up after it creates them
166
+ CFILES:=$(SOURCES:.cpp=.c)
167
+ DEPFILES:=$(CFILES:.c=.d)
168
+
169
+ OBJS:=$(CFILES:.c=.o)
170
+
171
+ all: $(LIBRARY)
172
+
173
+ #Rule to create library archive
174
+ $(LIBRARY): $(OBJS)
175
+ \t$(AR) $(AR_OPTS) $@ $^
176
+
177
+ #Don't create dependencies when we're cleaning, for instance
178
+ ifeq (0, $(words $(findstring $(MAKECMDGOALS), $(NODEPS))))
179
+ #Chances are, these files don't exist. GMake will create them and
180
+ #clean up automatically afterwards
181
+ -include $(DEPFILES)
182
+ endif
183
+
184
+ #This is the rule for creating the C++ dependency files
185
+ %.d: %.cpp
186
+ \t$(CXX) $(CXXFLAGS) -MM -MT '$(patsubst %.cpp,%.o,$<)' $< -MF $@
187
+
188
+ #This is the rule for creating the C dependency files
189
+ %.d: %.c
190
+ \t$(CC) $(CFLAGS) -MM -MT '$(patsubst %.c,%.o,$<)' $< -MF $@
191
+
192
+ #This rule does the compilation for C++ files
193
+ %.o: %.cpp %.d %.h
194
+ \t$(CXX) $(CXXFLAGS) -o $@ -c $<
195
+
196
+ #This rule does the compilation for C files
197
+ %.o: %.c %.d %.h
198
+ \t$(CC) $(CFLAGS) -o $@ -c $<
199
+
200
+ clean:
201
+ \trm -rf *.o *.d *.a
202
+ }.gsub!(/^ /,'')
203
+ end
204
+ end
205
+ end
@@ -24,7 +24,7 @@ module Funit
24
24
  ( numTests(<%= i+1 %>), numAsserts(<%= i+1 %>), numAssertsTested(<%= i+1 %>), numFailures(<%= i+1 %>) )
25
25
  write(*,1) numAssertsTested(<%= i+1 %>), numAsserts(<%= i+1 %>), &
26
26
  numTests(<%= i+1 %>)-numFailures(<%= i+1 %>), numTests(<%= i+1 %>)
27
- 1 format('Passed ',i0,' of ',i0,' possible asserts comprising ',i0,' of ',i0,' tests.')
27
+ <%= i+1 %> format('Passed ',i0,' of ',i0,' possible asserts comprising ',i0,' of ',i0,' tests.')
28
28
  <% end -%>
29
29
 
30
30
  write(*,*)
@@ -51,14 +51,15 @@ module Funit
51
51
  # <%= File.basename $0 %> generated this file on <%= Time.now %>.
52
52
 
53
53
  OBJ=<%= required_objects.join(' ') %>
54
+ LDFLAGS=<%= c_code.print_linker_flags %>
54
55
 
55
56
  all:testrunner
56
57
 
57
58
  testrunner: $(OBJ)
58
- <%= "\t#{ENV['FC']} #{ENV['FCFLAGS']} #{ENV['LDFLAGS']}" %> -o TestRunner $(OBJ)
59
+ <%= "\t#{ENV['FC']} #{ENV['FCFLAGS']} #{ENV['LDFLAGS']}" %> -o TestRunner $(OBJ) $(LDFLAGS)
59
60
 
60
61
  <% file_dependencies.each do |source,dep| -%>
61
- <%= "#{source.sub(/\.f90/i,'.o')}: #{source} #{dep.map{ |d| d.sub(/\.f90/i,'.o') }.join(' ')}" %>
62
+ <%= "#{source.sub(/\.f90/i,'.o')}: #{source} #{dep.map{ |d| d.sub(/\.f90/i,'.o') }.join(' ')} #{inlined_dependencies[source].join(' ')}" %>
62
63
  <%= "\t(cd #{File.dirname(source)}; #{ENV['FC']} #{ENV['FCFLAGS']} #{sourceflag} -c #{File.basename(source)})" %>
63
64
  <% end -%>
64
65
  }.gsub(/^ /,''), nil, '-' ) # turn off newlines for <% -%>
@@ -71,7 +72,7 @@ module Funit
71
72
  end
72
73
 
73
74
  def funit_exists?(module_name)
74
- File.exists? "#{module_name}.fun"
75
+ File.exist? "#{module_name}.fun"
75
76
  end
76
77
 
77
78
  def parse_command_line
@@ -111,7 +112,10 @@ module Funit
111
112
  $stderr.puts "\n *Warning: #{message} [#{test_suite}.fun:#$.]"
112
113
  end
113
114
 
114
- def compile_tests(test_suites,prog_source_dirs=['.'])
115
+ def compile_tests(test_suites,funit_data)
116
+ prog_source_dirs = funit_data.prog_source_dirs
117
+ c_code = funit_data.c_code
118
+
115
119
  puts "computing dependencies"
116
120
 
117
121
  sourceflag = ''
@@ -123,6 +127,7 @@ module Funit
123
127
  puts "locating associated source files and sorting for compilation"
124
128
  dependencies.source_file_dependencies('TestRunner.f90')
125
129
  file_dependencies = dependencies.file_dependencies
130
+ inlined_dependencies = dependencies.inlined_dependencies
126
131
  required_objects = file_dependencies.values.flatten.uniq.map{|s|s.sub(/\.f90/i,'.o')}
127
132
  required_objects << 'TestRunner.o'
128
133
 
@@ -1,5 +1,3 @@
1
- require 'funit'
2
-
3
1
  module Funit
4
2
 
5
3
  include Assertions # FIXME
@@ -20,7 +18,7 @@ module Funit
20
18
  @suite_name = suite_name
21
19
  @suite_content = suite_content
22
20
  return nil unless funit_exists?(suite_name)
23
- File.delete(suite_name+"_fun.f90") if File.exists?(suite_name+"_fun.f90")
21
+ File.delete(suite_name+"_fun.f90") if File.exist?(suite_name+"_fun.f90")
24
22
  super(suite_name+"_fun.f90","w")
25
23
  @tests, @setup, @teardown = [], [], []
26
24
  header
@@ -1,6 +1,7 @@
1
1
  require 'test/unit'
2
2
  require 'funit'
3
- require 'ftools' # FIXME: migrate to fileutils
3
+ require 'fileutils'
4
+ require 'ostruct'
4
5
 
5
6
  class TestFunit < Test::Unit::TestCase
6
7
 
@@ -10,34 +11,37 @@ class TestFunit < Test::Unit::TestCase
10
11
  include Funit::Assertions # FIXME
11
12
 
12
13
  def setup
13
- File.rm_f(*Dir["dummyunit*"])
14
- File.rm_f(*Dir["unit*"])
15
- File.rm_f(*Dir["another*"])
16
- File.rm_f(*Dir["ydsbe*"])
17
- File.rm_f(*Dir["lmzd*"])
18
- File.rm_f(*Dir["ldfdl*"])
19
- File.rm_f(*Dir["ydsbe*"])
20
- File.rm_f(*Dir["*TestRunner*"])
14
+ FileUtils.rm_f Dir.glob("dummyunit*")
15
+ FileUtils.rm_f Dir.glob("unit*")
16
+ FileUtils.rm_f Dir.glob("another*")
17
+ FileUtils.rm_f Dir.glob("ydsbe*")
18
+ FileUtils.rm_f Dir.glob("lmzd*")
19
+ FileUtils.rm_f Dir.glob("ldfdl*")
20
+ FileUtils.rm_f Dir.glob("ydsbe*")
21
+ FileUtils.rm_f Dir.glob("*TestRunner*")
22
+ @@funit_data = OpenStruct.new
23
+ @@funit_data.prog_source_dirs = ['.']
24
+ @@funit_data.c_code = Funit::C_compile.new
21
25
  end
22
26
 
23
27
  def teardown
24
- File.rm_f(*Dir["dummyunit*"])
25
- File.rm_f(*Dir["unit*"])
26
- File.rm_f(*Dir["another*"])
27
- File.rm_f(*Dir["ydsbe*"])
28
- File.rm_f(*Dir["lmzd*"])
29
- File.rm_f(*Dir["ldfdl*"])
30
- File.rm_f(*Dir["ydsbe*"])
31
- File.rm_f(*Dir["*TestRunner*"])
28
+ FileUtils.rm_f Dir.glob("dummyunit*")
29
+ FileUtils.rm_f Dir.glob("unit*")
30
+ FileUtils.rm_f Dir.glob("another*")
31
+ FileUtils.rm_f Dir.glob("ydsbe*")
32
+ FileUtils.rm_f Dir.glob("lmzd*")
33
+ FileUtils.rm_f Dir.glob("ldfdl*")
34
+ FileUtils.rm_f Dir.glob("ydsbe*")
35
+ FileUtils.rm_f Dir.glob("*TestRunner*")
32
36
  end
33
37
 
34
38
  def test_empty_test_runner_created_and_compilable
35
39
  write_test_runner []
36
- assert File.exists?("TestRunner.f90"), 'TestRunner.f90 not created.'
37
- compile_tests []
38
- assert File.exists?("makeTestRunner"), 'makeTestRunner.f90 not created.'
40
+ assert File.exist?("TestRunner.f90"), 'TestRunner.f90 not created.'
41
+ compile_tests([],@@funit_data)
42
+ assert File.exist?("makeTestRunner"), 'makeTestRunner.f90 not created.'
39
43
  assert system("make -f makeTestRunner"), 'make -f makeTestRunner failed.'
40
- assert File.exists?("TestRunner"), 'TestRunner executable not created.'
44
+ assert File.exist?("TestRunner"), 'TestRunner executable not created.'
41
45
  end
42
46
 
43
47
  def test_is_equal
@@ -75,7 +79,7 @@ class TestFunit < Test::Unit::TestCase
75
79
  File.open('unit.fun','w') do |f|
76
80
  f.puts "test_suite unit\ntest a_gets_set\nAssert_Equal(5,a)\nend test\nend test_suite"
77
81
  end
78
- assert_nothing_raised{run_tests}
82
+ assert_nothing_raised{run_tests(@@funit_data)}
79
83
  end
80
84
 
81
85
  def test_should_accommodate_doubly_embedded_use_dependencies
@@ -91,8 +95,8 @@ class TestFunit < Test::Unit::TestCase
91
95
  File.open('unit.fun','w') do |f|
92
96
  f.puts "begin test_suite unit\ntest a_gets_set\n Assert_Equal(5, a)\nend test\nend test_suite"
93
97
  end
94
- assert_nothing_raised{run_tests}
95
- end
98
+ assert_nothing_raised{run_tests(@@funit_data)}
99
+ end
96
100
 
97
101
  def test_should_accommodate_cap_F_extensions
98
102
  File.open('unit.F90','w') do |f|
@@ -101,8 +105,8 @@ class TestFunit < Test::Unit::TestCase
101
105
  File.open('unit.fun','w') do |f|
102
106
  f.puts "begin test_suite unit\ntest a_gets_set\n Assert_Equal(1, a)\nend test\nend test_suite"
103
107
  end
104
- assert_nothing_raised{run_tests}
105
- end
108
+ assert_nothing_raised{run_tests(@@funit_data)}
109
+ end
106
110
 
107
111
  def test_requested_modules
108
112
  tu_assert_equal ["asdfga"], requested_modules(["asdfga"])
@@ -116,7 +120,7 @@ class TestFunit < Test::Unit::TestCase
116
120
 
117
121
  def test_funit_exists_method
118
122
  module_name = "ydsbe"
119
- File.rm_f(module_name+".fun")
123
+ FileUtils.rm_f module_name+".fun"
120
124
  tu_assert_equal false, funit_exists?(module_name)
121
125
  system "touch "+module_name+".fun"
122
126
  assert funit_exists?(module_name)
@@ -18,8 +18,8 @@ class TestTestSuite < Test::Unit::TestCase
18
18
 
19
19
  def test_nonexistent_funit_file_is_not_created
20
20
  Funit::TestSuite.new 'dummyf90test', '', false
21
- assert !File.exists?("dummyf90test.fun")
22
- assert !File.exists?("dummyf90test_fun.f90")
21
+ assert !File.exist?("dummyf90test.fun")
22
+ assert !File.exist?("dummyf90test_fun.f90")
23
23
  end
24
24
 
25
25
  def create_funit_file funit_contents
metadata CHANGED
@@ -1,9 +1,9 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: funit
3
- version: !ruby/object:Gem::Version
4
- version: 0.11.1
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.12.3
5
5
  platform: ruby
6
- authors:
6
+ authors:
7
7
  - Karen Bibb
8
8
  - Bil Kleb
9
9
  - Beth Lee-Rausch
@@ -12,46 +12,86 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
-
16
- date: 2009-11-01 01:00:00 -04:00
17
- default_executable:
18
- dependencies:
19
- - !ruby/object:Gem::Dependency
15
+ date: 2016-02-05 00:00:00.000000000 Z
16
+ dependencies:
17
+ - !ruby/object:Gem::Dependency
20
18
  name: fortran
19
+ requirement: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ~>
22
+ - !ruby/object:Gem::Version
23
+ version: '1.0'
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: 1.3.0
21
27
  type: :runtime
22
- version_requirement:
23
- version_requirements: !ruby/object:Gem::Requirement
24
- requirements:
25
- - - ">="
26
- - !ruby/object:Gem::Version
27
- version: 1.1.0
28
- version:
29
- - !ruby/object:Gem::Dependency
28
+ prerelease: false
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '1.0'
34
+ - - '>='
35
+ - !ruby/object:Gem::Version
36
+ version: 1.3.0
37
+ - !ruby/object:Gem::Dependency
38
+ name: rdoc
39
+ requirement: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ version: '4.0'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - ~>
49
+ - !ruby/object:Gem::Version
50
+ version: '4.0'
51
+ - !ruby/object:Gem::Dependency
30
52
  name: hoe
53
+ requirement: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ~>
56
+ - !ruby/object:Gem::Version
57
+ version: '3.14'
31
58
  type: :development
32
- version_requirement:
33
- version_requirements: !ruby/object:Gem::Requirement
34
- requirements:
35
- - - ">="
36
- - !ruby/object:Gem::Version
37
- version: 2.3.3
38
- version:
39
- description: FUnit is a unit testing framework for Fortran. Unit tests are written as Fortran fragments that use a small set of testing-specific keywords and functions. FUnit transforms these fragments into valid Fortran code, compiles, links, and runs them against the code under test. FUnit is {opinionated software}[http://www.oreillynet.com/pub/a/network/2005/08/30/ruby-rails-david-heinemeier-hansson.html], which values convention over configuration. Specifically, FUnit requires, * a Fortran 95 compiler, * tests to be stored along side the code under test, and * test files to be named appropriately.
40
- email: nasarb-developers@rubyforge.org
41
- executables:
59
+ prerelease: false
60
+ version_requirements: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - ~>
63
+ - !ruby/object:Gem::Version
64
+ version: '3.14'
65
+ description: |-
66
+ funit is a unit testing framework for Fortran.
67
+
68
+ Unit tests are written as Fortran fragments that use a small
69
+ set of testing-specific keywords and functions. funit transforms
70
+ these fragments into valid Fortran code, compiles, links, and
71
+ runs them against the code under test.
72
+
73
+ funit is
74
+ {opinionated software}[http://www.oreillynet.com/pub/a/network/2005/08/30/ruby-rails-david-heinemeier-hansson.html],
75
+ which values convention over configuration. Specifically, funit requires,
76
+
77
+ * a Fortran 95 compiler,
78
+ * tests to be stored along side the code under test, and
79
+ * test files to be named appropriately.
80
+ email:
81
+ - bil.kleb@nasa.gov
82
+ executables:
42
83
  - funit
43
84
  extensions: []
44
-
45
- extra_rdoc_files:
46
- - History.txt
85
+ extra_rdoc_files:
86
+ - History.rdoc
47
87
  - License.txt
48
88
  - Manifest.txt
49
- - README.txt
50
- files:
51
- - History.txt
89
+ - README.rdoc
90
+ files:
91
+ - History.rdoc
52
92
  - License.txt
53
93
  - Manifest.txt
54
- - README.txt
94
+ - README.rdoc
55
95
  - Rakefile
56
96
  - bin/funit
57
97
  - examples/CFD/FluxFunctions.f90
@@ -65,6 +105,7 @@ files:
65
105
  - examples/StopWatch/StopWatch.fun
66
106
  - lib/funit.rb
67
107
  - lib/funit/assertions.rb
108
+ - lib/funit/c_tools.rb
68
109
  - lib/funit/compiler.rb
69
110
  - lib/funit/functions.rb
70
111
  - lib/funit/testsuite.rb
@@ -76,35 +117,31 @@ files:
76
117
  - utils/errorFinder.el
77
118
  - utils/funit-generic-mode.el
78
119
  - utils/funit-mode.el
79
- has_rdoc: true
80
- homepage: http://rubyforge.org/projects/nasarb
120
+ homepage: https://rubygems.org/gems/funit
121
+ licenses:
122
+ - NASA-1.3
123
+ metadata: {}
81
124
  post_install_message:
82
- rdoc_options:
125
+ rdoc_options:
83
126
  - --main
84
- - README.txt
85
- require_paths:
127
+ - README.rdoc
128
+ require_paths:
86
129
  - lib
87
- required_ruby_version: !ruby/object:Gem::Requirement
88
- requirements:
89
- - - ">="
90
- - !ruby/object:Gem::Version
91
- version: "0"
92
- version:
93
- required_rubygems_version: !ruby/object:Gem::Requirement
94
- requirements:
95
- - - ">="
96
- - !ruby/object:Gem::Version
97
- version: "0"
98
- version:
99
- requirements:
130
+ required_ruby_version: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - '>='
133
+ - !ruby/object:Gem::Version
134
+ version: '0'
135
+ required_rubygems_version: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - '>='
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ requirements:
100
141
  - A Fortran compiler.
101
- rubyforge_project: nasarb
102
- rubygems_version: 1.3.1
142
+ rubyforge_project:
143
+ rubygems_version: 2.4.8
103
144
  signing_key:
104
- specification_version: 2
105
- summary: FUnit is a unit testing framework for Fortran
106
- test_files:
107
- - test/test_compiler.rb
108
- - test/test_functions.rb
109
- - test/test_funit.rb
110
- - test/test_testsuite.rb
145
+ specification_version: 4
146
+ summary: funit is a unit testing framework for Fortran
147
+ test_files: []