require "watirspec_helper"

describe "TableRow" do

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

  describe "#exists?" do
    it "returns true if the table row exists" do
      expect(browser.tr(id: "outer_first")).to exist
      expect(browser.tr(id: /outer_first/)).to exist
      expect(browser.tr(index: 0)).to exist
      browser.tr(xpath: "//tr[@id='outer_first']")
    end

    it "returns the first row if given no args" do
      expect(browser.tr).to exist
    end

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

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

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

  describe "#click" do
    not_compliant_on :internet_explorer, :chrome, :firefox do
      it "fires the row's onclick event" do
        browser.tr(id: 'inner_first').click
        expect(messages).to include('tr')
      end
    end
  end

  bug "Safari does not strip text", :safari do
    describe "#[]" do
      let(:table) { browser.table(id: 'outer') }

      it "returns the nth cell of the row" do
        expect(table[0][0].text).to eq "Table 1, Row 1, Cell 1"
        expect(table[2][0].text).to eq "Table 1, Row 3, Cell 1"
      end
    end
  end

  describe "#cells" do
    let(:table) { browser.table(id: 'outer') }

    it "returns the correct number of cells" do
      expect(table[0].cells.length).to eq 2
      expect(table[1].cells.length).to eq 2
      expect(table[2].cells.length).to eq 2
    end

    it "finds cells in the table" do
      expect(table[0].cells(text: /Table 1/).size).to eq 2
    end

    it "does not find cells from nested tables" do
      expect(table[1].cell(id: "t2_r1_c1")).to_not exist
      expect(table[1].cell(id: /t2_r1_c1/)).to_not exist
    end

    it "iterates correctly through the cells of the row" do
      browser.table(id: 'outer').row(index: 1).cells.each_with_index do |cell, idx|
        expect(cell.id).to eq "t1_r2_c#{idx + 1}"
      end
    end
  end

end