# 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