Permalink
Find file
Fetching contributors…
Cannot retrieve contributors at this time
221 lines (178 sloc) 7.22 KB
require File.expand_path("../../test_helper", __FILE__)
module Unit
class TestMass < MiniTest::Unit::TestCase
describe Mass do
before do
class Foo
attr_accessor :foo
class Bar
attr_accessor :fool
end
end
class Thing
attr_accessor :food
end
class OneMoreThing
attr_accessor :thing
end
end
after do
GC.start
end
it "should be able to return the object corresponding to the passed object_id" do
f = Foo.new
o = Mass[f.object_id]
assert_equal true, f.object_id == o.object_id
f = nil
o = nil
end
it "should be able to index objects" do
assert_equal({}, Mass.index(Foo))
f = Foo.new
b1 = Foo::Bar.new
b2 = Foo::Bar.new
t = Thing.new
assert_equal({"Unit::TestMass::Foo" => [f.object_id], "Unit::TestMass::Foo::Bar" => [b1.object_id, b2.object_id].sort}, Mass.index(Foo))
assert_equal({"Unit::TestMass::Foo::Bar" => [b1.object_id, b2.object_id].sort}, Mass.index(Foo::Bar))
assert_equal({"Unit::TestMass::Thing" => [t.object_id]}, Mass.index(Thing))
assert_equal({"Unit::TestMass::Foo::Bar" => [b1.object_id, b2.object_id].sort, "Unit::TestMass::Thing" => [t.object_id]}, Mass.index(Foo::Bar, Thing))
assert_equal({}, Mass.index(OneMoreThing))
index = Mass.index
assert_equal true, index.keys.include?("String")
assert_equal true, index.keys.include?("Array")
assert_equal true, index.keys.include?("Hash")
assert_equal true, index["String"].size > 1000
f = nil
b1 = nil
b2 = nil
t = nil
end
it "should be able to count objects" do
assert_equal({}, Mass.count(Foo))
f = Foo.new
b1 = Foo::Bar.new
b2 = Foo::Bar.new
t = Thing.new
assert_equal({"Unit::TestMass::Foo" => 1, "Unit::TestMass::Foo::Bar" => 2}, Mass.count(Foo))
assert_equal({"Unit::TestMass::Foo::Bar" => 2}, Mass.count(Foo::Bar))
assert_equal({"Unit::TestMass::Thing" => 1}, Mass.count(Thing))
assert_equal({"Unit::TestMass::Foo::Bar" => 2, "Unit::TestMass::Thing" => 1}, Mass.count(Foo::Bar, Thing))
assert_equal({}, Mass.count(OneMoreThing))
count = Mass.count
assert_equal true, count.keys.include?("String")
assert_equal true, count.keys.include?("Array")
assert_equal true, count.keys.include?("Hash")
assert_equal true, count["String"] > 1000
f = nil
b1 = nil
b2 = nil
t = nil
end
it "should tackle nil objects" do
assert_equal({}, Mass.references(nil))
assert_equal(false, Mass.detach(nil))
assert_equal(false, Mass.detach!(nil))
end
# NOTE: The first assertion fails sometimes (maybe multiple test runs related?). If so, retry running the tests.
it "should be able to locate object references" do
f1 = Foo.new
assert_equal({}, Mass.references(f1))
f2 = Foo.new
f2.foo = f1
assert_equal({"Unit::TestMass::Foo##{f2.object_id}" => ["@foo"]}, Mass.references(f1))
assert_equal({"Unit::TestMass::Foo##{f2.object_id}" => ["@foo"]}, Mass.references(f1, Foo))
assert_equal({}, Mass.references(f1, Foo::Bar))
assert_equal({}, Mass.references(f1, Foo::Bar, OneMoreThing))
b = Foo::Bar.new
b.fool = f1
t = Thing.new
t.food = f1
assert_equal({
"Unit::TestMass::Foo##{f2.object_id}" => ["@foo"],
"Unit::TestMass::Foo::Bar##{b.object_id}" => ["@fool"],
"Unit::TestMass::Thing##{t.object_id}" => ["@food"]
}, Mass.references(f1))
assert_equal({
"Unit::TestMass::Foo##{f2.object_id}" => ["@foo"],
"Unit::TestMass::Foo::Bar##{b.object_id}" => ["@fool"]
}, Mass.references(f1, Foo))
assert_equal({
"Unit::TestMass::Foo##{f2.object_id}" => ["@foo"],
"Unit::TestMass::Foo::Bar##{b.object_id}" => ["@fool"]
}, f1._references(Foo, Foo::Bar))
assert_equal({
"Unit::TestMass::Foo::Bar##{b.object_id}" => ["@fool"]
}, Mass.references(f1, Foo::Bar))
assert_equal({
"Unit::TestMass::Thing##{t.object_id}" => ["@food"]
}, Mass.references(f1, Thing))
assert_equal({}, Mass.references(f1, Hash, OneMoreThing))
f1 = nil
f2 = nil
b = nil
t = nil
end
describe "using simple objects" do
# NOTE: I don't know why the last assertion fails (maybe test environment related?) as the same steps to succeed within script/console (see contents of the file)
it "should be able to detach objects" do
f1 = Foo.new
object_id = f1.object_id
assert_equal({}, Mass.references(f1))
f2 = Foo.new
f2.foo = f1
b = Foo::Bar.new
b.fool = f1
t = Thing.new
t.food = f1
assert_equal({
"Unit::TestMass::Foo" => [object_id, f2.object_id].sort,
"Unit::TestMass::Foo::Bar" => [b.object_id]
}, Mass.index(Foo))
assert_equal({
"Unit::TestMass::Foo##{f2.object_id}" => ["@foo"],
"Unit::TestMass::Foo::Bar##{b.object_id}" => ["@fool"],
"Unit::TestMass::Thing##{t.object_id}" => ["@food"]
}, Mass.references(f1))
assert_equal(false, Mass.detach(f1, OneMoreThing){f1 = nil})
assert_equal({
"Unit::TestMass::Foo" => [object_id, f2.object_id].sort,
"Unit::TestMass::Foo::Bar" => [b.object_id]
}, Mass.index(Foo))
assert_equal({
"Unit::TestMass::Foo##{f2.object_id}" => ["@foo"],
"Unit::TestMass::Foo::Bar##{b.object_id}" => ["@fool"],
"Unit::TestMass::Thing##{t.object_id}" => ["@food"]
}, Mass.references(f1))
assert_equal(false, Mass.detach(f1, OneMoreThing, Thing){f1 = nil})
assert_equal({
"Unit::TestMass::Foo" => [object_id, f2.object_id].sort,
"Unit::TestMass::Foo::Bar" => [b.object_id]
}, Mass.index(Foo))
assert_equal({
"Unit::TestMass::Foo##{f2.object_id}" => ["@foo"],
"Unit::TestMass::Foo::Bar##{b.object_id}" => ["@fool"]
}, Mass.references(f1))
assert_equal(false, f1.detach(Foo::Bar){f1 = nil})
assert_equal({
"Unit::TestMass::Foo" => [object_id, f2.object_id].sort,
"Unit::TestMass::Foo::Bar" => [b.object_id]
}, Mass.index(Foo))
assert_equal({
"Unit::TestMass::Foo##{f2.object_id}" => ["@foo"]
}, Mass.references(f1))
assert_equal(true, Mass.detach(f1){f1 = nil})
Mass.gc!(f1)
assert_equal({
"Unit::TestMass::Foo" => [f2.object_id],
"Unit::TestMass::Foo::Bar" => [b.object_id]
}, Mass.index(Foo))
end
end
describe "using complex objects" do
it "should be able to detach objects" do
# TODO: although RubyMass is used within a very complex project using DataMapper write tests within a similar situation
end
end
end
end
end