describe "ProMotion::TestTableScreen functionality" do
  tests PM::TestTableScreen

  # Override controller to properly instantiate
  def controller
    rotate_device to: :portrait, button: :bottom
    @controller ||= TestTableScreen.new(nav_bar: true)
    @controller.on_load
    @controller.navigationController
  end

  def confirmation_class
    TestHelper.ios7 ? UITableViewCellDeleteConfirmationButton : UITableViewCellDeleteConfirmationControl
  end

  it "should have a navigation bar" do
    @controller.navigationController.should.be.kind_of(UINavigationController)
  end

  it "should increment the tap counter on tap" do
    tap("Increment")
    @controller.tap_counter.should == 3
  end

  it "should add a new table cell on tap" do
    tap("Add New Row")
    view("Dynamically Added").class.should == UILabel
  end

  it "should do nothing when no action specified" do
    tap("Just another blank row")
    @controller.should == @controller
  end

  it "should increment the tap counter by one on tap" do
    tap("Increment One")
    @controller.tap_counter.should == 1
  end

  it "should delete the specified row from the table view on tap" do
    @controller.tableView(@controller.tableView, numberOfRowsInSection:0).should == 7
    tap("Delete the row below")
    wait 0.3 do
      @controller.tableView(@controller.tableView, numberOfRowsInSection:0).should == 6
    end
  end

  it "should delete the specified row from the table view on tap with an animation" do
    @controller.tableView(@controller.tableView, numberOfRowsInSection:0).should == 7
    tap("Delete the row below with an animation")
    wait 0.3 do
      @controller.tableView(@controller.tableView, numberOfRowsInSection:0).should == 6
    end
  end

  # TODO: Why is it so complicated to find the delete button??
  it "should use editing_style to delete the table row" do
    @controller.tableView(@controller.tableView, numberOfRowsInSection:0).should == 7
    @controller.cell_was_deleted.should != true
    flick("Just another deletable blank row", :to => :left)

    wait 0.25 do
      # Tap the delete button
      view('Just another deletable blank row').superview.superview.subviews.each do |subview|
        if subview.class == confirmation_class
          tap subview
          wait 0.25 do
            @controller.tableView(@controller.tableView, numberOfRowsInSection:0).should == 6
            @controller.cell_was_deleted.should == true
          end
        end
      end
    end
  end

  it "should not allow deleting if on_cell_delete returns `false`" do
    @controller.tableView(@controller.tableView, numberOfRowsInSection:0).should == 7
    @controller.cell_was_deleted.should != true
    flick("A non-deletable blank row", :to => :left)

    wait 0.25 do
      # Tap the delete button
      view('A non-deletable blank row').superview.superview.subviews.each do |subview|
        if subview.class == confirmation_class
          tap subview
          wait 0.25 do
            @controller.tableView(@controller.tableView, numberOfRowsInSection:0).should == 7
            @controller.cell_was_deleted.should != false
          end
        end
      end
    end
  end

  # Disabled by Jamon 10/16/2013 -- Bacon doesn't appear to use accessibility labels?
  it "should call a method when the switch is flipped" do
  #   @controller.scroll_to_bottom
  #   tap "switch_1"
  #   wait 0.3 do
  #     @controller.tap_counter.should == 1
  #   end
  end

  it "should call the method with arguments when the switch is flipped and when the cell is tapped" do
  #   @controller.scroll_to_bottom
  #   tap "switch_3"
  #   wait 0.3 do
  #     @controller.tap_counter.should == 3

  #     tap "Switch With Cell Tap, Switch Action And Parameters"
  #     wait 0.3 do
  #       @controller.tap_counter.should == 13
  #     end
  #   end
  end

  it "should call the method with arguments when the switch is flipped" do
  #   @controller.scroll_to_bottom
  #   tap "switch_2"
  #   wait 0.3 do
  #     @controller.tap_counter.should == 3
  #   end
  end

end
