require 'RubyExt/require_base' require 'fileutils' require 'spec' Thread.abort_on_exception=true module RubyExt describe "Resource" do before :all do dir = "#{File.dirname(__FILE__)}/RubyExt/ForResource/ProviderChaining" Resource.add_resource_provider RubyExt::FileSystemProvider.new(lambda{["#{dir}/ProviderABaseDir"]}) Resource.add_resource_provider RubyExt::FileSystemProvider.new(lambda{["#{dir}/ProviderBBaseDir"]}) end it "class get, set, exist, delete" do Resource.class_set("RubyExt::ForResource::ClassTest", "class ClassTest; end", File.dirname(__FILE__)) Resource.class_exist?("RubyExt::ForResource::ClassTest"). should be_true Resource.class_get("RubyExt::ForResource::ClassTest"). should == "class ClassTest; end" Resource.class_delete("RubyExt::ForResource::ClassTest") Resource.class_exist?("RubyExt::ForResource::ClassTest"). should be_false end it "namespace" do Resource.class_exist?("RubyExt::ForResource").should be_true end it "resource get, set, delete, exist" do dir = "#{File.dirname(__FILE__)}/RubyExt/ForResource/ResourceTest" FileUtils.remove_dir(dir) if File.exist? dir FileUtils.mkdir dir File.write("#{dir}/Test.rb", "class Test; end") File.write("#{dir}/Test.txt", "Test.txt") FileUtils.mkdir "#{dir}/Test.res" File.write("#{dir}/Test.res/Data.txt", "Data.txt") Resource.resource_get(RubyExt::ForResource::ResourceTest::Test, "txt"). should == "Test.txt" Resource.resource_get(RubyExt::ForResource::ResourceTest::Test, "Data.txt"). should == "Data.txt" Resource.resource_exist?(RubyExt::ForResource::ResourceTest::Test, "txt"). should be_true Resource.resource_exist?(RubyExt::ForResource::ResourceTest::Test, "Data.txt"). should be_true Resource.resource_delete(RubyExt::ForResource::ResourceTest::Test, "txt") Resource.resource_delete(RubyExt::ForResource::ResourceTest::Test, "Data.txt") Resource.resource_exist?(RubyExt::ForResource::ResourceTest::Test, "txt"). should be_false Resource.resource_exist?(RubyExt::ForResource::ResourceTest::Test, "Data.txt"). should be_false Resource.resource_set(RubyExt::ForResource::ResourceTest::Test, "txt", "Test.txt") Resource.resource_set(RubyExt::ForResource::ResourceTest::Test, "Data.txt", "Data.txt") Resource.resource_get(RubyExt::ForResource::ResourceTest::Test, "txt"). should == "Test.txt" Resource.resource_get(RubyExt::ForResource::ResourceTest::Test, "Data.txt"). should == "Data.txt" end it "Class to Path" do lambda{Resource.class_to_virtual_file("A::B::C").should =~ /A\/B\/C/}.should raise_error(/doesn't exist!/) Resource.class_to_virtual_file("RubyExt::ForResource::ResourceTest::Test").should =~ /RubyExt\/ForResource\/ResourceTest\/Test/ end it "change listeners" do class CustomObserver attr_reader :classes, :resources def initialize @classes, @resources = [], [] end def update_resource type, klass, resource if type == :class @classes << klass else @classes << klass @resources << resource end end end obs = CustomObserver.new Resource.add_observer obs begin FileSystemProvider.start_watching(1, [File.dirname __FILE__]) sleep 0.1 base = "#{File.dirname(__FILE__)}/RubyExt/ForResource" File.write("#{base}/ChangedClass.rb", "class ChangedClass; end") File.write("#{base}/ChangedClass.txt", "") File.write("#{base}/ChangedClass.res/Text.txt", "") sleep 1.5 ensure FileSystemProvider.stop_watching end obs.classes.size.should == 3 obs.classes.all?{|k| k == ForResource::ChangedClass}.should be_true obs.resources.size.should == 2 obs.resources.should include("txt") obs.resources.should include("Text.txt") end it "ResourceProvider Chaining" do Resource.class_get("ChainTest").should == %{\ class ChainTest; # "ProviderB" end} Resource.resource_get(ChainTest, "resource").should == "ProviderB" end it "ResourceExtension" do require "RubyExt/require" Resource.resource_set RubyExt::ForResource::ResourceExtension, "Data.yaml", {:value => true} res = Resource.resource_get RubyExt::ForResource::ResourceExtension, "Data.yaml" res.should == {:value => true} end end end