fUnit 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README +1 -4
- data/Rakefile +7 -2
- data/bin/funit +3 -0
- data/docs/html/classes/Funit.html +48 -48
- data/docs/html/classes/Funit/Assertions.html +56 -54
- data/docs/html/classes/Funit/Compiler.html +6 -6
- data/docs/html/classes/Funit/Depend.html +60 -60
- data/docs/html/classes/Funit/TestSuite.html +48 -48
- data/docs/html/classes/String.html +170 -0
- data/docs/html/created.rid +1 -1
- data/docs/html/files/README.html +2 -11
- data/docs/html/files/lib/funit/assertions_rb.html +8 -1
- data/docs/html/fr_class_index.html +1 -0
- data/docs/html/fr_method_index.html +34 -33
- data/lib/funit/assertions.rb +42 -13
- data/tests/tc_compile.rb +22 -22
- data/tests/tc_fortran_deps.rb +139 -132
- data/tests/tc_funit.rb +91 -92
- data/tests/tc_test_suite.rb +83 -83
- data/utils/funit-mode.el +115 -0
- metadata +4 -2
data/tests/tc_fortran_deps.rb
CHANGED
@@ -8,95 +8,105 @@ require 'fileutils'
|
|
8
8
|
|
9
9
|
class TestFortranDeps < Test::Unit::TestCase
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
11
|
+
def setup
|
12
|
+
Dir.mkdir 'DependenciesFixture'
|
13
|
+
Dir.chdir 'DependenciesFixture'
|
14
|
+
Dir.mkdir 'lib'
|
15
|
+
Dir.chdir 'lib'
|
16
|
+
File.open('solution.f90','w') do |f|
|
17
|
+
f.puts "module solution\nuse area\nend module solution"
|
18
|
+
end
|
19
|
+
Dir.chdir '..'
|
20
|
+
Dir.mkdir 'src'
|
21
|
+
Dir.chdir 'src'
|
22
|
+
File.open('main.F90','w') do |f|
|
23
|
+
f.puts 'program whizzard'
|
24
|
+
f.puts " use grid\n use solution\n use circle"
|
25
|
+
f.puts 'end program whizzard'
|
26
|
+
end
|
27
|
+
File.open('grid.f90','w') do |f|
|
28
|
+
f.puts "module grid\nuse area\nend module grid"
|
29
|
+
end
|
30
|
+
File.open('shapes.f90','w') do |f|
|
31
|
+
f.puts "module rectangle_fun3d\nend module rectangle_fun3d"
|
32
|
+
f.puts "module circle\n use area\nend module circle"
|
33
|
+
end
|
34
|
+
File.open('area.f90','w'){ |f| f.puts "module area\nend module area" }
|
35
|
+
File.open('externalUse.f90','w') do |f|
|
36
|
+
f.puts "program user\nuse cantFindModule\nend program"
|
37
|
+
end
|
38
|
+
@dep = Funit::Depend.new
|
18
39
|
end
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
40
|
+
|
41
|
+
def teardown
|
42
|
+
Dir.chdir '../..'
|
43
|
+
FileUtils.rm_rf 'DependenciesFixture'
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_finds_which_modules_a_source_file_uses
|
47
|
+
assert_equal %w[grid solution circle], @dep.modules_used_in( 'main.F90' )
|
26
48
|
end
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
49
|
+
|
50
|
+
def test_finds_modules_defined_in_source_file
|
51
|
+
assert_equal %w[rectangle_fun3d circle],
|
52
|
+
@dep.modules_defined_in( 'shapes.f90' )
|
31
53
|
end
|
32
|
-
|
33
|
-
|
34
|
-
|
54
|
+
|
55
|
+
def test_create_module_definition_hash
|
56
|
+
assert_equal %w[circle rectangle_fun3d],
|
57
|
+
@dep.build_dictionary_of_modules_in( 'shapes.f90' ).keys.sort
|
35
58
|
end
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
def test_finds_modules_defined_in_source_file
|
44
|
-
assert_equal %w[rectangle_fun3d circle], @dep.modules_defined_in( 'shapes.f90' )
|
45
|
-
end
|
46
|
-
|
47
|
-
def test_create_module_definition_hash
|
48
|
-
assert_equal %w[circle rectangle_fun3d],
|
49
|
-
@dep.build_dictionary_of_modules_in( 'shapes.f90' ).keys.sort
|
50
|
-
end
|
51
|
-
|
52
|
-
def test_locating_all_fortran_files_in_search_path
|
53
|
-
files = %w[ ../lib/solution.f90 ./area.f90 ./externalUse.f90
|
54
|
-
./grid.f90 ./main.F90 ./shapes.f90 ]
|
55
|
-
@dep.fortran_files_within.each do |file|
|
56
|
-
assert files.include?(file)
|
59
|
+
|
60
|
+
def test_locating_all_fortran_files_in_search_path
|
61
|
+
files = %w[ ../lib/solution.f90 ./area.f90 ./externalUse.f90
|
62
|
+
./grid.f90 ./main.F90 ./shapes.f90 ]
|
63
|
+
@dep.fortran_files_within.each do |file|
|
64
|
+
assert files.include?(file)
|
65
|
+
end
|
57
66
|
end
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
67
|
+
|
68
|
+
def test_build_hash_with_source_files
|
69
|
+
f90 = %w[./grid.f90 ../lib/solution.f90 ./shapes.f90 ./area.f90]
|
70
|
+
hash = @dep.build_dictionary_of_modules_in( f90 )
|
71
|
+
assert_equal %w[ ./shapes.f90 ./shapes.f90 ./area.f90
|
72
|
+
../lib/solution.f90 ./grid.f90 ].sort,
|
73
|
+
hash.values.sort
|
74
|
+
assert_equal %w[ rectangle_fun3d circle area solution grid ].sort,
|
75
|
+
hash.keys.sort
|
76
|
+
assert_equal hash , @dep.build_hash_of_modules_in_files_within
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_dependency_generation_elements
|
80
|
+
directoryHash = @dep.build_hash_of_modules_in_files_within
|
81
|
+
|
82
|
+
sourceFile = "main.F90"
|
83
|
+
modules = @dep.modules_used_in( sourceFile )
|
84
|
+
assert_equal %w[grid solution circle], modules
|
85
|
+
|
86
|
+
newSourceFiles = modules.collect{ |mod| directoryHash[mod] }
|
87
|
+
assert_equal %w[ ./grid.f90 ../lib/solution.f90 ./shapes.f90],
|
88
|
+
newSourceFiles
|
89
|
+
|
90
|
+
newModules = newSourceFiles.collect do |file|
|
91
|
+
@dep.modules_used_in( file )
|
92
|
+
end.flatten.uniq
|
93
|
+
|
94
|
+
assert_equal ["area"], newModules
|
95
|
+
end
|
96
|
+
|
97
|
+
def test_makefile_dependency_line_generation
|
98
|
+
sourceFile = "main.F90"
|
99
|
+
makeGolden=String.new <<-GOLDEN
|
90
100
|
main.o: main.F90 \\
|
91
101
|
grid.o \\
|
92
102
|
solution.o \\
|
93
103
|
shapes.o
|
94
|
-
|
95
|
-
|
96
|
-
|
104
|
+
GOLDEN
|
105
|
+
assert_equal makeGolden, @dep.makefile_dependency_line(sourceFile)
|
106
|
+
end
|
97
107
|
|
98
|
-
|
99
|
-
|
108
|
+
def test_makefile_dependency_recurses_properly
|
109
|
+
makeGolden=String.new <<-GOLDEN
|
100
110
|
main.o: main.F90 \\
|
101
111
|
grid.o \\
|
102
112
|
solution.o \\
|
@@ -110,61 +120,58 @@ solution.o: solution.f90 \\
|
|
110
120
|
area.o
|
111
121
|
shapes.o: shapes.f90 \\
|
112
122
|
area.o
|
113
|
-
|
123
|
+
GOLDEN
|
124
|
+
|
125
|
+
goldSplit = makeGolden.split("\n")
|
126
|
+
testSplit = @dep.dependencies('main.F90').split("\n")
|
127
|
+
|
128
|
+
while (gold = goldSplit.shift) && (test = testSplit.shift)
|
129
|
+
assert_equal gold, test
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
def test_source_file_dependency_hash
|
134
|
+
@dep.source_file_dependencies('main.F90')
|
135
|
+
assert_equal( 5, @dep.file_dependencies.size )
|
136
|
+
expected = {
|
137
|
+
"./area.f90" => [],
|
138
|
+
"./grid.f90" => ["./area.f90"],
|
139
|
+
"../lib/solution.f90" => ["./area.f90"],
|
140
|
+
"./shapes.f90" => ["./area.f90"],
|
141
|
+
"main.F90" => ["./grid.f90", "../lib/solution.f90", "./shapes.f90"]
|
142
|
+
}
|
143
|
+
assert_equal expected, @dep.file_dependencies
|
144
|
+
end
|
114
145
|
|
115
|
-
|
116
|
-
|
146
|
+
def test_finds_required_source_files
|
147
|
+
expected = %w[ ./area.f90 ./shapes.f90 ../lib/solution.f90
|
148
|
+
./grid.f90 ./main.F90 ]
|
149
|
+
found = @dep.required_source_files('./main.F90')
|
150
|
+
assert_equal expected.size, found.size
|
151
|
+
assert_equal './main.F90', found.last
|
152
|
+
assert_equal './area.f90', found.first
|
153
|
+
end
|
154
|
+
|
155
|
+
def test_finds_required_source_files_unordered
|
156
|
+
@dep.dependencies('main.F90')
|
157
|
+
sources = @dep.source_files
|
158
|
+
expected = %w[ main.F90 grid.f90 area.f90 solution.f90 shapes.f90 ]
|
159
|
+
assert_equal expected.size, sources.size
|
160
|
+
assert_equal 'shapes.f90', sources.last
|
161
|
+
assert_equal 'main.F90', sources.first
|
162
|
+
assert_equal expected, sources
|
163
|
+
end
|
164
|
+
|
165
|
+
def test_can_find_required_source_files_twice
|
166
|
+
files = %w[ ./main.F90 ./shapes.f90 ./area.f90
|
167
|
+
../lib/solution.f90 ./grid.f90 ]
|
168
|
+
@dep.required_source_files('./main.F90')
|
169
|
+
assert_equal files.sort, @dep.required_source_files('./main.F90').sort
|
170
|
+
end
|
117
171
|
|
118
|
-
|
119
|
-
|
172
|
+
def test_recognizes_external_modules
|
173
|
+
file = './externalUse.f90'
|
174
|
+
assert_equal [file], @dep.required_source_files(file).sort
|
120
175
|
end
|
121
|
-
end
|
122
|
-
|
123
|
-
def test_source_file_dependency_hash
|
124
|
-
@dep.source_file_dependencies('main.F90')
|
125
|
-
assert_equal( 5, @dep.file_dependencies.size )
|
126
|
-
expected = {
|
127
|
-
"./area.f90" => [],
|
128
|
-
"./grid.f90" => ["./area.f90"],
|
129
|
-
"../lib/solution.f90" => ["./area.f90"],
|
130
|
-
"./shapes.f90" => ["./area.f90"],
|
131
|
-
"main.F90" => ["./grid.f90", "../lib/solution.f90", "./shapes.f90"]
|
132
|
-
}
|
133
|
-
assert_equal expected, @dep.file_dependencies
|
134
|
-
end
|
135
|
-
|
136
|
-
def test_finds_required_source_files
|
137
|
-
expected = %w[./area.f90 ./shapes.f90 ../lib/solution.f90 ./grid.f90 ./main.F90]
|
138
|
-
found = @dep.required_source_files('./main.F90')
|
139
|
-
assert_equal expected.size, found.size
|
140
|
-
assert_equal './main.F90', found.last
|
141
|
-
assert_equal './area.f90', found.first
|
142
|
-
end
|
143
|
-
|
144
|
-
def test_finds_required_source_files_unordered
|
145
|
-
@dep.dependencies('main.F90')
|
146
|
-
sources = @dep.source_files
|
147
|
-
expected = %w[ main.F90 grid.f90 area.f90 solution.f90 shapes.f90 ]
|
148
|
-
assert_equal expected.size, sources.size
|
149
|
-
assert_equal 'shapes.f90', sources.last
|
150
|
-
assert_equal 'main.F90', sources.first
|
151
|
-
assert_equal expected, sources
|
152
|
-
end
|
153
|
-
|
154
|
-
def test_can_find_required_source_files_twice
|
155
|
-
files = %w[./main.F90 ./shapes.f90 ./area.f90 ../lib/solution.f90 ./grid.f90]
|
156
|
-
@dep.required_source_files('./main.F90')
|
157
|
-
assert_equal files.sort, @dep.required_source_files('./main.F90').sort
|
158
|
-
end
|
159
|
-
|
160
|
-
def test_recognizes_external_modules
|
161
|
-
file = './externalUse.f90'
|
162
|
-
assert_equal [file], @dep.required_source_files(file).sort
|
163
|
-
end
|
164
|
-
|
165
|
-
def teardown
|
166
|
-
Dir.chdir '../..'
|
167
|
-
FileUtils.rm_rf 'DependenciesFixture'
|
168
|
-
end
|
169
176
|
|
170
177
|
end
|
data/tests/tc_funit.rb
CHANGED
@@ -8,111 +8,110 @@ require 'ftools'
|
|
8
8
|
|
9
9
|
class TestFunit < Test::Unit::TestCase
|
10
10
|
|
11
|
-
|
12
|
-
|
11
|
+
include Funit
|
12
|
+
include Funit::Assertions
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
14
|
+
def setup
|
15
|
+
File.rm_f(*Dir["dummyunit*"])
|
16
|
+
File.rm_f(*Dir["unit*"])
|
17
|
+
File.rm_f(*Dir["ydsbe*"])
|
18
|
+
File.rm_f(*Dir["lmzd*"])
|
19
|
+
File.rm_f(*Dir["ldfdl*"])
|
20
|
+
File.rm_f(*Dir["ydsbe*"])
|
21
|
+
File.rm_f(*Dir["TestRunner*"])
|
22
|
+
File.rm_f(*Dir["a.out"])
|
23
|
+
end
|
24
|
+
|
25
|
+
def teardown
|
26
|
+
File.rm_f(*Dir["dummyunit*"])
|
27
|
+
File.rm_f(*Dir["unit*"])
|
28
|
+
File.rm_f(*Dir["ydsbe*"])
|
29
|
+
File.rm_f(*Dir["lmzd*"])
|
30
|
+
File.rm_f(*Dir["ldfdl*"])
|
31
|
+
File.rm_f(*Dir["ydsbe*"])
|
32
|
+
File.rm_f(*Dir["TestRunner*"])
|
33
|
+
File.rm_f(*Dir["a.out"])
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_main_driver_compiles
|
37
|
+
writeTestRunner []
|
38
|
+
assert File.exists?("TestRunner.f90")
|
39
|
+
assert system("#{Compiler.new.name} TestRunner.f90")
|
40
|
+
assert File.exists?("a.out")
|
41
|
+
end
|
20
42
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
43
|
+
def test_is_equal
|
44
|
+
@suiteName = "dummy"
|
45
|
+
@testName = "dummy"
|
46
|
+
@lineNumber = "dummy"
|
47
|
+
isequal("IsEqual(1.0,m(1,1))")
|
48
|
+
assert_equal '.not.(1.0==m(1,1))', @condition
|
49
|
+
end
|
28
50
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
ans =
|
51
|
+
def test_is_real_equal
|
52
|
+
@suiteName = "dummy"
|
53
|
+
@testName = "dummy"
|
54
|
+
@lineNumber = "dummy"
|
55
|
+
isrealequal("IsRealEqual(a,b)")
|
56
|
+
ans = <<-EOF
|
35
57
|
.not.(a+2*spacing(real(a)).ge.b &
|
36
58
|
.and.a-2*spacing(real(a)).le.b)
|
37
|
-
EOF
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
ans = <<EOF
|
59
|
+
EOF
|
60
|
+
assert_equal ans.chomp, @condition
|
61
|
+
assert_equal '"b (",b,") is not",a,"within",2*spacing(real(a))', @message
|
62
|
+
isrealequal("IsRealEqual(1.0,m(1,1))")
|
63
|
+
ans = <<-EOF
|
43
64
|
.not.(1.0+2*spacing(real(1.0)).ge.m(1,1) &
|
44
65
|
.and.1.0-2*spacing(real(1.0)).le.m(1,1))
|
45
|
-
EOF
|
46
|
-
|
47
|
-
end
|
48
|
-
|
49
|
-
def test_handles_dependency
|
50
|
-
File.open('unit.f90','w') do |f|
|
51
|
-
f.printf "module unit\n use unita, only : a\nend module unit\n"
|
52
|
-
end
|
53
|
-
File.open('unita.f90','w') do |f|
|
54
|
-
f.printf "module unita\n integer :: a = 5\nend module unita\n"
|
66
|
+
EOF
|
67
|
+
assert_equal ans.chomp, @condition
|
55
68
|
end
|
56
|
-
File.open('unit.fun','w') do |f|
|
57
|
-
f.printf "beginTest a_gets_set\n IsEqual(5, a)\nendTest\n"
|
58
|
-
end
|
59
|
-
assert_nothing_raised{run_tests}
|
60
|
-
end
|
61
69
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
70
|
+
def test_handles_dependency
|
71
|
+
File.open('unit.f90','w') do |f|
|
72
|
+
f.printf "module unit\n use unita, only : a\nend module unit\n"
|
73
|
+
end
|
74
|
+
File.open('unita.f90','w') do |f|
|
75
|
+
f.printf "module unita\n integer :: a = 5\nend module unita\n"
|
76
|
+
end
|
77
|
+
File.open('unit.fun','w') do |f|
|
78
|
+
f.printf "beginTest a_gets_set\n IsEqual(5, a)\nendTest\n"
|
79
|
+
end
|
80
|
+
assert_nothing_raised{run_tests}
|
71
81
|
end
|
72
|
-
File.open('unit.fun','w') do |f|
|
73
|
-
f.printf "beginTest a_gets_set\n IsEqual(5, a)\nendTest\n"
|
74
|
-
end
|
75
|
-
assert_nothing_raised{run_tests}
|
76
|
-
end
|
77
|
-
|
78
|
-
def test_requested_modules
|
79
|
-
assert_equal ["asdfga"], requestedModules(["asdfga"])
|
80
|
-
assert_equal ["asd","fga"], requestedModules(["asd","fga"])
|
81
|
-
assert requestedModules([]).empty?
|
82
|
-
modules = %w[ldfdl lmzd]
|
83
|
-
funits = modules.map{|f| f+'.fun'}.join(' ')
|
84
|
-
system "touch "+funits
|
85
|
-
assert_equal modules, requestedModules([])
|
86
|
-
end
|
87
82
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
83
|
+
def test_embedded_dependencies
|
84
|
+
File.open('unit.f90','w') do |f|
|
85
|
+
f.printf "module unit\n use unita, only : a\nend module unit\n"
|
86
|
+
end
|
87
|
+
File.open('unita.f90','w') do |f|
|
88
|
+
f.printf "module unita\n use unitb, only : b \n integer :: a = b\nend module unita\n"
|
89
|
+
end
|
90
|
+
File.open('unitb.f90','w') do |f|
|
91
|
+
f.printf "module unitb\n integer,parameter :: b = 5\nend module unitb\n"
|
92
|
+
end
|
93
|
+
File.open('unit.fun','w') do |f|
|
94
|
+
f.printf "beginTest a_gets_set\n IsEqual(5, a)\nendTest\n"
|
95
|
+
end
|
96
|
+
assert_nothing_raised{run_tests}
|
94
97
|
end
|
95
98
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
end
|
99
|
+
def test_requested_modules
|
100
|
+
assert_equal ["asdfga"], requestedModules(["asdfga"])
|
101
|
+
assert_equal ["asd","fga"], requestedModules(["asd","fga"])
|
102
|
+
assert requestedModules([]).empty?
|
103
|
+
modules = %w[ldfdl lmzd]
|
104
|
+
funits = modules.map{|f| f+'.fun'}.join(' ')
|
105
|
+
system "touch "+funits
|
106
|
+
assert_equal modules, requestedModules([])
|
107
|
+
end
|
106
108
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
File.rm_f(*Dir["TestRunner*"])
|
115
|
-
File.rm_f(*Dir["a.out"])
|
116
|
-
end
|
109
|
+
def test_funit_exists_method
|
110
|
+
moduleName = "ydsbe"
|
111
|
+
File.rm_f(moduleName+".fun")
|
112
|
+
assert_equal false, funit_exists?(moduleName)
|
113
|
+
system "touch "+moduleName+".fun"
|
114
|
+
assert funit_exists?(moduleName)
|
115
|
+
end
|
117
116
|
|
118
117
|
end
|