Skip to content

Commit

Permalink
Add failing specs for Set#one?
Browse files Browse the repository at this point in the history
Implement List#group_by.
  • Loading branch information
Simon Harris committed Jan 17, 2010
1 parent f7353d0 commit f84db96
Show file tree
Hide file tree
Showing 5 changed files with 168 additions and 5 deletions.
17 changes: 13 additions & 4 deletions lib/hamster/list.rb
Expand Up @@ -2,6 +2,7 @@
require 'monitor'

require 'hamster/tuple'
require 'hamster/hash'
require 'hamster/set'

module Hamster
Expand Down Expand Up @@ -43,6 +44,10 @@ module List

extend Forwardable

Undefined = Object.new

CADR = /^c([ad]+)r$/

def_delegator :self, :head, :first

def_delegator :self, :empty?, :null?
Expand Down Expand Up @@ -478,16 +483,20 @@ def inspect
to_a.inspect
end

def group_by(&block)
return group_by { |item| item } unless block_given?
reduce(Hamster::Hash.new) do |hash, item|
key = yield(item)
hash.put(key, (hash.get(key) || EmptyList).cons(item))
end
end

def respond_to?(name, include_private = false)
super || CADR === name
end

private

Undefined = Object.new

CADR = /^c([ad]+)r$/

def method_missing(name, *args, &block)
if CADR === name
accessor($1)
Expand Down
4 changes: 4 additions & 0 deletions lib/hamster/set.rb
Expand Up @@ -116,6 +116,10 @@ def none?
true
end

def one?
return one? { |item| item } unless block_given?
end

def find
return nil unless block_given?
each { |item| return item if yield(item) }
Expand Down
2 changes: 1 addition & 1 deletion lib/hamster/trie.rb
Expand Up @@ -91,7 +91,7 @@ def include?(key, value)

# Returns <tt>true</tt> if . <tt>eql?</tt> is synonymous with <tt>==</tt>
def eql?(other)
return true if other.equal?(self)
# return true if other.equal?(self)
return false unless other.is_a?(self.class) && other.size == size
each do |entry|
return false unless other.include?(entry.key, entry.value)
Expand Down
73 changes: 73 additions & 0 deletions spec/hamster/list/group_by_spec.rb
@@ -0,0 +1,73 @@
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')

require 'hamster/list'

describe Hamster::List do

describe "#group_by" do

describe "on a really big list" do

before do
@list = Hamster.interval(0, STACK_OVERFLOW_DEPTH)
end

it "doesn't run out of stack" do
lambda { @list.group_by }.should_not raise_error
end

end

describe "with a block" do

[
[[], []],
[[1], [true => Hamster.list(1)]],
[[1, 2, 3, 4], [true => Hamster.list(3, 1), false => Hamster.list(4, 2)]],
].each do |values, expected|

describe "on #{values.inspect}" do

before do
original = Hamster.list(*values)
@result = original.group_by(&:odd?)
end

it "returns #{expected.inspect}" do
@result.should == Hamster.hash(*expected)
end

end

end

end

describe "without a block" do

[
[[], []],
[[1], [1 => Hamster.list(1)]],
[[1, 2, 3, 4], [1 => Hamster.list(1), 2 => Hamster.list(2), 3 => Hamster.list(3), 4 => Hamster.list(4)]],
].each do |values, expected|

describe "on #{values.inspect}" do

before do
original = Hamster.list(*values)
@result = original.group_by
end

it "returns #{expected.inspect}" do
@result.should == Hamster.hash(*expected)
end

end

end

end

end

end
77 changes: 77 additions & 0 deletions spec/hamster/set/one_spec.rb
@@ -0,0 +1,77 @@
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')

require 'hamster/set'

describe Hamster::Set do

describe "#one?" do

describe "when empty" do

before do
@set = Hamster.set
end

it "with a block returns false" do
pending do
@set.one? {}.should == false
end
end

it "with no block returns false" do
pending do
@set.one?.should == false
end
end

end

describe "when not empty" do

describe "with a block" do

before do
@set = Hamster.set("A", "B", "C")
end

it "returns false if the block returns true more than once" do
pending do
@set.one? { |item| true }.should == false
end
end

it "returns fale if the block never returns true" do
pending do
@set.one? { |item| false }.should == false
end
end

it "returns true if the block only returns true once" do
pending do
@set.one? { |item| item == "A" }.should == true
end
end

end

describe "with no block" do

it "returns false if more than one value is truthy" do
pending do
Hamster.set(nil, true, "A").one?.should == false
end
end

it "returns true if only one value is truthy" do
pending do
Hamster.set(nil, true, false).one?.should == true
end
end

end

end

end

end

0 comments on commit f84db96

Please sign in to comment.