require 'spec_helper'

module Spec
  module Example
    describe ExampleMatcher, "#matches?" do

      Spec::Matchers.define :match_examples do |examples|
        match do |actual|
          actual.matches?(examples)
        end
      end
      
      it "should match correct example_group and example" do
        matcher = ExampleMatcher.new("example_group", "example")
        matcher.should match_examples(["example_group example"])
      end
      
      it "should not match wrong example" do
        matcher = ExampleMatcher.new("example_group", "other example")
        matcher.should_not match_examples(["example_group example"])
      end
      
      it "should not match wrong example_group" do
        matcher = ExampleMatcher.new("other example_group", "example")
        matcher.should_not match_examples(["example_group example"])
      end
      
      it "should match example only" do
        matcher = ExampleMatcher.new("example_group", "example")
        matcher.should match_examples(["example"])
      end

      it "should match example_group only" do
        matcher = ExampleMatcher.new("example_group", "example")
        matcher.should match_examples(["example_group"])
      end

      it "should match example_group ending with before(:all)" do
        matcher = ExampleMatcher.new("example_group", "example")
        matcher.should match_examples(["example_group before(:all)"])
      end
      
      it "should escape regexp chars" do
        matcher = ExampleMatcher.new("(con|text)", "[example]")
        matcher.should_not match_examples(["con p"])
      end
      
      it "should match when example_group is modularized" do
        matcher = ExampleMatcher.new("MyModule::MyClass", "example")
        matcher.should match_examples(["MyClass example"])
      end      
    end

    describe ExampleMatcher, "#matches? normal case" do
      it "matches when passed in example matches" do
        matcher = ExampleMatcher.new("Foo", "bar")
        matcher.matches?(["no match", "Foo bar"]).should == true
      end

      it "does not match when no passed in examples match" do
        matcher = ExampleMatcher.new("Foo", "bar")
        matcher.matches?(["no match1", "no match2"]).should == false
      end
    end

    describe ExampleMatcher, "#matches? where description has '::' in it" do
      it "matches when passed in example matches" do
        matcher = ExampleMatcher.new("Foo::Bar", "baz")
        matcher.matches?(["no match", "Foo::Bar baz"]).should == true
      end

      it "does not match when no passed in examples match" do
        matcher = ExampleMatcher.new("Foo::Bar", "baz")
        matcher.matches?(["no match1", "no match2"]).should == false
      end
    end
    
    describe ExampleMatcher, "called with nil example" do
      it "does not puke" do
        matcher = ExampleMatcher.new("Foo::Bar", nil)
        matcher.matches?(["anything"]).should == false
      end
    end
  end
end
