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