require 'watirspec_helper'

describe Watir::Locators::Element::Locator do
  describe 'Visible Elements' do
    before do
      browser.goto(WatirSpec.url_for('wait.html'))
    end

    context 'when true' do
      it 'finds single element' do
        element = browser.body.element(visible: true)
        expect(element.id).to eq 'foo'
      end

      it 'handles tag_name and index' do
        element = browser.div(visible: true, index: 1)
        expect(element.id).to eq 'buttons'
      end

      it 'handles :tag_name and a single regexp attribute' do
        element = browser.div(visible: true, id: /ons/)
        expect(element.id).to eq 'buttons'
      end

      it 'handles :xpath' do
        element = browser.element(visible: true, xpath: './/div[@id="foo"]')
        expect(element.id).to eq 'foo'
      end

      it 'handles :css' do
        element = browser.element(visible: true, css: 'div#foo')
        expect(element.id).to eq 'foo'
      end

      it 'handles in collections' do
        elements = browser.divs(visible: true)
        expect(elements.size).to eq 3
      end
    end

    context 'when false' do
      it 'finds single element' do
        element = browser.body.element(visible: false)
        expect(element.id).to eq 'bar'
      end

      it 'handles tag_name and index' do
        element = browser.div(visible: false, index: 1)
        expect(element.id).to eq 'also_hidden'
      end

      it 'handles :tag_name and a single regexp attribute' do
        element = browser.div(visible: false, id: /_/)
        expect(element.id).to eq 'also_hidden'
      end

      it 'handles :xpath' do
        element = browser.element(visible: false, xpath: './/div[@id="bar"]')
        expect(element.id).to eq 'bar'
      end

      it 'handles :css' do
        element = browser.element(visible: false, css: 'div#bar')
        expect(element.id).to eq 'bar'
      end

      it 'handles in collections' do
        elements = browser.divs(visible: false)
        expect(elements.size).to eq 3
      end
    end

    it 'raises exception when value is not Boolean' do
      msg = 'expected one of [TrueClass, FalseClass], got "true":String'
      expect { browser.body.element(visible: 'true') }.to raise_exception(TypeError, msg)
    end
  end
end