require "watirspec_helper"

describe "TableBody" do

  before :each do
    browser.goto(WatirSpec.url_for("tables.html"))
  end

  describe "#exists?" do
    it "returns true if the table body exists (page context)" do
      expect(browser.tbody(id: 'first')).to exist
      expect(browser.tbody(id: /first/)).to exist
      expect(browser.tbody(index: 0)).to exist
      expect(browser.tbody(xpath: "//tbody[@id='first']")).to exist
    end

    it "returns true if the table body exists (table context)" do
      expect(browser.table(index: 0).tbody(id: 'first')).to exist
      expect(browser.table(index: 0).tbody(id: /first/)).to exist
      expect(browser.table(index: 0).tbody(index: 1)).to exist
      expect(browser.table(index: 0).tbody(xpath: "//tbody[@id='first']")).to exist
    end

    it "returns the first table body if given no args" do
      expect(browser.table.tbody).to exist
    end

    it "returns false if the table body doesn't exist (page context)" do
      expect(browser.tbody(id: 'no_such_id')).to_not exist
      expect(browser.tbody(id: /no_such_id/)).to_not exist
      expect(browser.tbody(index: 1337)).to_not exist
      expect(browser.tbody(xpath: "//tbody[@id='no_such_id']")).to_not exist
    end

    it "returns false if the table body doesn't exist (table context)" do
      expect(browser.table(index: 0).tbody(id: 'no_such_id')).to_not exist
      expect(browser.table(index: 0).tbody(id: /no_such_id/)).to_not exist
      expect(browser.table(index: 0).tbody(index: 1337)).to_not exist
      expect(browser.table(index: 0).tbody(xpath: "//tbody[@id='no_such_id']")).to_not exist
    end

    it "raises TypeError when 'what' argument is invalid" do
      expect { browser.tbody(id: 3.14).exists? }.to raise_error(TypeError)
      expect { browser.table(index: 0).tbody(id: 3.14).exists? }.to raise_error(TypeError)
    end

    it "raises MissingWayOfFindingObjectException when 'how' argument is invalid" do
      expect { browser.tbody(no_such_how: 'some_value').exists? }.to raise_error(Watir::Exception::MissingWayOfFindingObjectException)
      expect { browser.table(index: 0).tbody(no_such_how: 'some_value').exists? }.to raise_error(Watir::Exception::MissingWayOfFindingObjectException)
    end
  end

  describe "#[]" do
    it "returns the row at the given index (page context)" do
      expect(browser.tbody(id: 'first')[0].text).to eq 'March 2008'
      expect(browser.tbody(id: 'first')[1][0].text).to eq 'Gregory House'
      expect(browser.tbody(id: 'first')[2][0].text).to eq 'Hugh Laurie'
    end

    it "returns the row at the given index (table context)" do
      expect(browser.table(index: 0).tbody(id: 'first')[0].text).to eq 'March 2008'
      expect(browser.table(index: 0).tbody(id: 'first')[1][0].text).to eq 'Gregory House'
      expect(browser.table(index: 0).tbody(id: 'first')[2][0].text).to eq 'Hugh Laurie'
    end
  end

  describe "#row" do
    it "finds the first row matching the selector" do
      row = browser.tbody(id: 'first').row(id: "gregory")

      expect(row.tag_name).to eq "tr"
      expect(row.id).to eq "gregory"
    end
  end

  describe "#rows" do
    it "finds rows matching the selector" do
      rows = browser.tbody(id: 'first').rows(id: /h$/)

      expect(rows.size).to eq 2

      expect(rows.first.id).to eq "march"
      expect(rows.last.id).to eq "hugh"
    end
  end

  describe "#strings" do
    it "returns the text of child cells" do
      expect(browser.tbody(id: 'first').strings).to eq [
        ["March 2008", "", "", ""],
        ["Gregory House", "5 934", "1 347", "4 587"],
        ["Hugh Laurie", "6 300", "1 479", "4 821"]
      ]
    end
  end
end