require "./spec_helper"

class ConcretePendingExample < Spectator::PendingExample
  def what
    "PENDING_TEST_EXAMPLE"
  end

  def source
    ::Spectator::Source.new(__FILE__, __LINE__)
  end

  def symbolic?
    false
  end

  def instance
    nil
  end
end

def new_pending_example(group : Spectator::ExampleGroup? = nil)
  ConcretePendingExample.new(group || new_root_group, Spectator::Internals::SampleValues.empty)
end

def new_pending_example_with_hooks(hooks)
  group = new_root_group(hooks)
  new_pending_example(group)
end

describe Spectator::PendingExample do
  describe "#run" do
    it "returns a pending result" do
      new_pending_example.run.should be_a(Spectator::PendingResult)
    end

    it "doesn't run before_all hooks" do
      called = false
      hooks = new_hooks(before_all: ->{ called = true; nil })
      example = new_pending_example_with_hooks(hooks)
      Spectator::Internals::Harness.run(example)
      called.should be_false
    end

    it "doesn't run before_each hooks" do
      called = false
      hooks = new_hooks(before_each: ->{ called = true; nil })
      example = new_pending_example_with_hooks(hooks)
      Spectator::Internals::Harness.run(example)
      called.should be_false
    end

    it "doesn't run after_all hooks" do
      called = false
      hooks = new_hooks(after_all: ->{ called = true; nil })
      example = new_pending_example_with_hooks(hooks)
      Spectator::Internals::Harness.run(example)
      called.should be_false
    end

    it "doesn't run after_each hooks" do
      called = false
      hooks = new_hooks(after_each: ->{ called = true; nil })
      example = new_pending_example_with_hooks(hooks)
      Spectator::Internals::Harness.run(example)
      called.should be_false
    end

    it "doesn't run around_each hooks" do
      called = false
      hooks = new_hooks(around_each: ->(proc : ->) { called = true; proc.call })
      example = new_pending_example_with_hooks(hooks)
      Spectator::Internals::Harness.run(example)
      called.should be_false
    end
  end

  describe "#finished?" do
    it "is initially false" do
      new_pending_example.finished?.should be_false
    end

    it "is true after #run is called" do
      example = new_pending_example
      Spectator::Internals::Harness.run(example)
      example.finished?.should be_true
    end
  end

  describe "#group" do
    it "is the expected value" do
      group = new_root_group
      example = new_pending_example(group)
      example.group.should eq(group)
    end
  end

  describe "#example_count" do
    it "is one" do
      new_pending_example.example_count.should eq(1)
    end
  end

  describe "#[]" do
    it "returns self" do
      example = new_pending_example
      example[0].should eq(example)
    end
  end

  describe "#to_s" do
    it "contains #what" do
      example = new_pending_example
      example.to_s.should contain(example.what)
    end

    it "contains the group's #what" do
      group = new_nested_group
      example = new_pending_example(group)
      example.to_s.should contain(group.what.to_s)
    end
  end
end