blob: a4c0b30038523a4cf9fe84fbe2a580854fa77a2b [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with this
# work for additional information regarding copyright ownership. The ASF
# licenses this file to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helpers'))
describe Buildr do
describe "#replace_extension" do
it "should replace filename extensions" do
replace = lambda { |filename, ext| Util.replace_extension(filename, ext) }
replace["foo.zip", "txt"].should eql("foo.txt")
replace["foo.", "txt"].should eql("foo.txt")
replace["foo", "txt"].should eql("foo.txt")
replace["bar/foo.zip", "txt"].should eql("bar/foo.txt")
replace["bar/foo.", "txt"].should eql("bar/foo.txt")
replace["bar/foo", "txt"].should eql("bar/foo.txt")
end
end
end
describe Hash do
describe "#only" do
it "should find value for one key" do
{:a => 1, :b => 2, :c => 3}.only(:a).should == {:a => 1}
end
it "should find values for multiple keys" do
{:a => 1, :b => 2, :c => 3}.only(:b, :c).should == {:b => 2, :c => 3}
end
end
end
describe OpenObject do
before do
@obj = OpenObject.new({:a => 1, :b => 2, :c => 3})
end
it "should be kind of Hash" do
Hash.should === @obj
end
it "should accept block that supplies default value" do
obj = OpenObject.new { |hash, key| hash[key] = "New #{key}" }
obj[:foo].should == "New foo"
obj.keys.should == [:foo]
end
it "should combine initial values from hash argument and from block" do
obj = OpenObject.new(:a => 6, :b => 2) { |h, k| h[k] = k.to_s * 2 }
obj[:a].should == 6
obj[:c].should == 'cc'
end
it "should allow reading a value by calling its name method" do
@obj.b.should == 2
end
it "should allow setting a value by calling its name= method" do
lambda { @obj.f = 32 }.should change { @obj.f }.to(32)
end
it "should allow changing a value by calling its name= method" do
lambda { @obj.c = 17 }.should change { @obj.c }.to(17)
end
it "should implement only method like a hash" do
@obj.only(:a).should == { :a => 1 }
end
end
describe File do
# Quite a few of the other specs depend on File#utime working correctly.
# These specs validate that utime is working as expected.
describe "#utime" do
it "should update mtime of directories" do
mkpath 'tmp'
begin
creation_time = File.mtime('tmp')
sleep 1
File.utime(nil, nil, 'tmp')
File.mtime('tmp').should > creation_time
ensure
Dir.rmdir 'tmp'
end
end
it "should update mtime of files" do
FileUtils.touch('tmp')
begin
creation_time = File.mtime('tmp')
sleep 1
File.utime(nil, nil, 'tmp')
File.mtime('tmp').should > creation_time
ensure
File.delete 'tmp'
end
end
it "should be able to set mtime in the past" do
FileUtils.touch('tmp')
begin
time = Time.at((Time.now - 10).to_i)
File.utime(time, time, 'tmp')
File.mtime('tmp').should == time
ensure
File.delete 'tmp'
end
end
it "should be able to set mtime in the future" do
FileUtils.touch('tmp')
begin
time = Time.at((Time.now + 10).to_i)
File.utime(time, time, 'tmp')
File.mtime('tmp').should == time
ensure
File.delete 'tmp'
end
end
end
end