rscons-try1/spec/build_tests_spec.rb

101 lines
3.0 KiB
Ruby

require 'fileutils'
describe Rscons do
FileUtils.rm_rf('build_test')
def setup_testdir(files, &blk)
FileUtils.mkdir_p('build_test')
files.each do |fname|
src = "spec/build_items/#{fname}"
dst = "build_test/#{fname}"
FileUtils.mkdir_p(File.dirname(dst))
FileUtils.cp_r(src, dst)
end
Dir.chdir('build_test', &blk)
FileUtils.rm_rf('build_test')
end
def clear_cache
Rscons::Cache.open.clear
end
before do
$stdout.stub(:puts) { nil }
clear_cache
end
###########################################################################
# Build Tests
###########################################################################
it 'builds a C program with one source file' do
setup_testdir(['simple.c']) do
env = Rscons::Environment.new
env.Program('simple', 'simple.c')
File.exist?('simple.o').should be_true
`./simple`.should =~ /This is a simple C program/
end
end
it 'supports short echo mode' do
$stdout.should_receive(:puts).once.with('CC simple.o')
$stdout.should_receive(:puts).once.with('LD simple')
setup_testdir(['simple.c']) do
env = Rscons::Environment.new(echo: :short)
env.Program('simple', 'simple.c')
File.exist?('simple.o').should be_true
`./simple`.should =~ /This is a simple C program/
end
end
it 'does not rebuild the program if no sources changed' do
$stdout.should_receive(:puts).once.with("gcc -c -o simple.o -MMD -MF simple.mf simple.c")
$stdout.should_receive(:puts).once.with('gcc -o simple simple.o')
setup_testdir(['simple.c']) do
env = Rscons::Environment.new
env.Program('simple', 'simple.c')
env.Program('simple', 'simple.c')
end
end
it 'rebuilds the application when the source file changes' do
setup_testdir(['simple.c']) do
env = Rscons::Environment.new
env.Program('simple', 'simple.c')
`./simple`.should =~ /This is a simple C program/
c = File.read('simple.c')
File.open('simple.c', 'w') do |fh|
fh.puts c.sub('simple', 'modified')
end
clear_cache
env.Program('simple', 'simple.c')
`./simple`.should =~ /This is a modified C program/
end
end
it 'builds a C program with a header file' do
setup_testdir(['header.c', 'header.h']) do
env = Rscons::Environment.new
env.Program('header', 'header.c')
File.exist?('header.o').should be_true
`./header`.should =~ /The value is 33/
end
end
it 'rebuilds a C source when a header it uses changes' do
setup_testdir(['header.c', 'header.h']) do
env = Rscons::Environment.new
env.Program('header', 'header.c')
File.exist?('header.o').should be_true
`./header`.should =~ /The value is 33/
h = File.read('header.h')
File.open('header.h', 'w') do |fh|
fh.puts h.sub('33', '42')
end
clear_cache
env.Program('header', 'header.c')
`./header`.should =~ /The value is 42/
end
end
end