describe "Searchable table spec" do
  # Override controller to properly instantiate
  def controller
    @controller ||= begin
      c = TableScreenSearchable.new
      c.on_load
      c
    end
  end

  after do
    @controller = nil
  end

  it "should show all 50 states" do
    controller.tableView(controller.tableView, numberOfRowsInSection:0).should == 50
  end

  it "should allow searching for all the 'New' states" do
    controller.willPresentSearchController(controller.search_controller)
    controller.search_controller.searchBar.text = "New"
    controller.updateSearchResultsForSearchController(controller.search_controller)
    controller.tableView(controller.tableView, numberOfRowsInSection:0).should == 4
  end

  it "should allow ending searches" do
    controller.willPresentSearchController(controller.search_controller)
    controller.search_controller.searchBar.text = "North"
    controller.updateSearchResultsForSearchController(controller.search_controller)
    controller.tableView(controller.tableView, numberOfRowsInSection:0).should == 2

    controller.willDismissSearchController(controller.search_controller)
    controller.search_controller.searchBar.text = ""
    controller.updateSearchResultsForSearchController(controller.search_controller) # iOS calls this again
    controller.searching?.should == false
    controller.tableView(controller.tableView, numberOfRowsInSection:0).should == 50
  end

  it "should call the start and stop searching callbacks properly" do
    controller.will_begin_search_called.should == nil
    controller.will_end_search_called.should == nil

    controller.willPresentSearchController(controller.search_controller)
    controller.will_begin_search_called.should == true

    controller.willDismissSearchController(controller.search_controller)
    controller.will_end_search_called.should == true
  end

  describe "custom search" do
    before do
      @stabby_controller = TableScreenStabbySearchable.new
      @proc_controller   = TableScreenSymbolSearchable.new
    end

    after do
      @stabby_controller = nil
      @proc_controller = nil
    end

    it "should allow searching for all the 'New' states using a custom search proc" do
      @stabby_controller.willPresentSearchController(@stabby_controller.search_controller)
      @stabby_controller.search_controller.searchBar.text = "New Stabby"
      @stabby_controller.updateSearchResultsForSearchController(@stabby_controller.search_controller)
      @stabby_controller.tableView(@stabby_controller.tableView, numberOfRowsInSection:0).should == 4

      rows = @stabby_controller.promotion_table_data.search("New stabby")
      rows.first[:cells].length.should == 4
      rows.first[:cells].each do |row|
        # Starts with "New" and ends with "stabby"
        row[:properties][:searched_title].should.match(/^New(.+)?stabby$/)
      end
    end

    it "should allow searching for all the 'New' states using a symbol as a search proc" do
      @proc_controller.willPresentSearchController(@proc_controller.search_controller)
      @proc_controller.search_controller.searchBar.text = "New Symbol"
      @proc_controller.updateSearchResultsForSearchController(@proc_controller.search_controller)
      cell_count = @proc_controller.tableView(@proc_controller.tableView, numberOfRowsInSection:0)
      cell_count.should == 4
      rows = @proc_controller.promotion_table_data.search("New Symbol")
      rows.first[:cells].length.should == 4
      rows.first[:cells].each do |row|
        # Starts with "New" and ends with "symbol"
        row[:properties][:searched_title].should.match(/^New(.+)?symbol$/)
      end
    end

    it "custom searches empty with stabby proc if there is no match" do
      @stabby_controller.willPresentSearchController(@stabby_controller.search_controller)
      @stabby_controller.search_controller.searchBar.text = "Totally Bogus"
      @stabby_controller.updateSearchResultsForSearchController(@stabby_controller.search_controller)
      @stabby_controller.tableView(@stabby_controller.tableView, numberOfRowsInSection:0).should == 0
    end

    it "custom searches empty with symbol for proc if there is no match" do
      @proc_controller.willPresentSearchController(@proc_controller.search_controller)
      @proc_controller.search_controller.searchBar.text = "Totally Bogus"
      @proc_controller.updateSearchResultsForSearchController(@proc_controller.search_controller)
      @proc_controller.tableView(@proc_controller.tableView, numberOfRowsInSection:0).should == 0
    end

  end
end
