spec/matchete_spec.rb in matchete-0.0.1 vs spec/matchete_spec.rb in matchete-0.0.2

- old
+ new

@@ -67,6 +67,179 @@ a = A.new a.play([2, 2.2]).should eq [:integer, :float] a.play([[2], Matchete]).should eq :s end -end + + it 'can use a pattern based on exact values' do + class A + include Matchete + + on 2, Integer, + def play(value, obj) + 2 + end + + on 4, Integer, + def play(value, obj) + 4 + end + end + + a = A.new + a.play(2, 4).should eq 2 + a.play(4, 4).should eq 4 + -> { a.play(8, 2) }.should raise_error(Matchete::NotResolvedError) + end + + it 'can use a pattern based on regexes' do + class A + include Matchete + + on /z/, + def play(value) + 'z' + end + + on /y/, + def play(value) + 'y' + end + end + + a = A.new + a.play('zewr').should eq 'z' + a.play('yy').should eq 'y' + end + + it 'can use a default method when everything else fails' do + class A + include Matchete + + on Integer, + def play(value) + :integer + end + end + + -> { A.new.play(2.2) }.should raise_error(Matchete::NotResolvedError) + + class A + default def play(value) + :else + end + end + + A.new.play(2.2).should eq :else + end + + it 'can use a pattern based on existing predicate methods given as symbols' do + class A + include Matchete + + on :even?, + def play(value) + value + end + + def even?(value) + value.remainder(2).zero? #so gay and gay + end + end + + A.new.play(2).should eq 2 + -> { A.new.play(5) }.should raise_error(Matchete::NotResolvedError) + end + + it 'can use a pattern based on a lambda predicate' do + class A + include Matchete + + on -> x { x % 2 == 0 }, + def play(value) + value + end + end + + A.new.play(2).should eq 2 + -> { A.new.play(7) }.should raise_error(Matchete::NotResolvedError) + end + + it 'can use a pattern based on responding to methods' do + class A + include Matchete + + on supporting(:map), + def play(value) + value + end + end + + A.new.play([]).should eq [] + -> { A.new.play(4) }.should raise_error(Matchete::NotResolvedError) + end + + it 'can match on different keyword arguments' do + class A + include Matchete + + on e: Integer, f: String, method: + def play(e:, f:) + :y + end + end + + A.new.play(e: 0, f: "y").should eq :y + -> { A.new.play(e: "f", f: Class)}.should raise_error(Matchete::NotResolvedError) + end + + it 'can match on multiple different kinds of patterns' do + class A + include Matchete + end + + A.new.match_guards([Integer, Float], {}, [8, 8.8], {}).should be_true + end + + describe '#match_guard' do + before :all do + class A + include Matchete + + def even?(value) + value.remainder(2).zero? + end + end + @a = A.new + end + + it 'matches modules and classes' do + @a.match_guard(Integer, 2).should be_true + @a.match_guard(Class, 4).should be_false + end + + it 'matches methods given as symbols' do + @a.match_guard(:even?, 2).should be_true + -> { @a.match_guard(:odd?, 4) }.should raise_error + end + + it 'matches predicates given as lambdas' do + @a.match_guard(-> x { x == {} }, {}).should be_true + end + + it 'matches on regex' do + @a.match_guard(/a/, 'aw').should be_true + @a.match_guard(/z/, 'lol').should be_false + end + + it 'matches on nested arrays' do + @a.match_guard([Integer, [:even?]], [2, [4]]).should be_true + @a.match_guard([Float, [:even?]], [2.2, [7]]).should be_false + end + + it 'matches on exact values' do + @a.match_guard(2, 2).should be_true + @a.match_guard('d', 'f').should be_false + end + end +end + \ No newline at end of file