# feature tests for Forms
# revision: $Revision$

$LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..') unless $SETUP_LOADED
require 'unittests/setup'

class TC_Forms2 < Test::Unit::TestCase # Note: there is no TC_Forms1
  def setup
    uses_page "forms2.html"
  end
  
  def test_form_exists
    assert(browser.form(:name, "test2").exists?)   
    assert_false(browser.form(:name, "missing").exists?)   
    
    assert(browser.form("test2").exists?)   
    assert_false(browser.form("missing").exists?)   

    assert(browser.form(:index, 1).exists?)   
    assert_false(browser.form(:index, 88).exists?)   
    
    assert(browser.form(:method, "get").exists?)   
    assert_false(browser.form(:method, "missing").exists?)   
    
    assert(browser.form(:id, 'f2').exists?)   
    assert_false(browser.form(:id, 'missing').exists?)   
    
    assert(browser.form(:action, "pass.html").exists?)   
    assert_false(browser.form(:action, "missing").exists?)   
  end
  
  def test_button_in_form
    assert(browser.form(:name, "test2").button(:caption, "Submit").exists?)
  end     
  def test_form_sub_element
    assert_equal('Click Me', browser.form(:index, 1).button(:name, 'b1').value)
  end

  # The following tests form bug 2261 
  tag_method :test_form_outer_html, :fails_on_firefox
  def test_form_outer_html 
    expected = "\r\n<FORM id=f2 name=test2 action=pass2.html method=get><BR><INPUT type=submit value=Submit> </FORM>"
    assert_equal(expected, browser.form(:name, 'test2').html)
  end
  tag_method :test_form_inner_html, :fails_on_ie
  def test_form_inner_html
    expected = "\n<br><input value=\"Submit\" type=\"submit\">\n"
    assert_equal(expected, browser.form(:name, 'test2').html)
  end
  def test_form_flash
    assert_nothing_raised{ browser.form(:name, 'test2').flash }
  end
end

class TC_Form_Display < Test::Unit::TestCase
  include CaptureIOHelper
  def test_showforms
    goto_page "forms2.html"
    actual = capture_stdout { browser.showForms }
    assert_equal(<<END_OF_MESSAGE, actual)
There are 4 forms
Form name: 
       id: 
   method: get
   action: pass.html
Form name: test2
       id: f2
   method: get
   action: pass2.html
Form name: test3
       id: 
   method: get
   action: pass2.html
Form name: test2
       id: 
   method: get
   action: pass2.html
END_OF_MESSAGE
  end
end

class TC_Forms3 < Test::Unit::TestCase
  def setup
    goto_page "forms3.html"
  end
  
  # The following tests form bug 2261 
  def test_p_in_form
    assert_equal "This form has a submit button that is an image", 
      browser.form(:name, 'buttonsubmit').p(:index, 1).text
  end
  
  # test for bug reported by Scott Pack,  http://rubyforge.org/pipermail/wtr-general/2005-June/002223.html
  def test_index_other_element_before_it
    assert_equal("check1" , browser.checkbox(:index,1).name)
  end
  
  tag_method :test_reset, :fails_on_firefox
  def test_reset
    browser.text_field(:id, "t1").set("Hello, reset test!")
    assert_equal(browser.text_field(:id, 't1').value, 'Hello, reset test!')
    
    browser.button(:id, "reset_button").click
    assert_equal("" , browser.text_field(:id, 't1').value)
    
    # also verify it works under a form
    browser.text_field(:id, "t1").set("reset test - using a form")
    assert_equal(browser.text_field(:id, 't1').value, 'reset test - using a form')
    
    browser.form(:index,2).button(:index,2).click
    assert_equal("" , browser.text_field(:id, 't1').value)
    
    # also verify it works under a form, this time using the :id attribute
    browser.text_field(:id, "t1").set("reset test - using a form")
    assert_equal(browser.text_field(:id, 't1').value, 'reset test - using a form')
    
    browser.form(:index,2).button(:id,'reset_button').click
    assert_equal("" , browser.text_field(:id, 't1').value)
  end
  
  def test_flash1
    assert_nothing_raised do
      browser.form(:name, "test2").button(:caption , "Submit").flash
    end
  end 
  
  def test_objects_with_same_name
    assert_equal('textfield' ,browser.text_field( :name, 'g1').value )
    assert_equal('button'    ,browser.button(     :name, 'g1').value )
    assert_equal('1'         ,browser.checkbox(   :name, 'g1').value )
    assert_equal('2'         ,browser.radio(      :name, 'g1').value )
    
    assert_equal('textfield' ,browser.text_field( :name, /g1/).value )
    assert_equal('button'    ,browser.button(     :name, /g1/).value )
    assert_equal('1'         ,browser.checkbox(   :name, /g1/).value )
    assert_equal('2'         ,browser.radio(      :name, /g1/).value )
    
    assert_equal('textfield_id' ,browser.text_field( :id, 'g1').value )
    assert_equal('button_id'    ,browser.button(     :id, 'g1').value )
    assert_equal('1_id'         ,browser.checkbox(   :id, 'g1').value )
    assert_equal('2_id'         ,browser.radio(      :id, 'g1').value )

    assert_equal('textfield_id' ,browser.text_field( :id, /g1/).value )
    assert_equal('button_id'    ,browser.button(     :id, /g1/).value )
    assert_equal('1_id'         ,browser.checkbox(   :id, /g1/).value )
    assert_equal('2_id'         ,browser.radio(      :id, /g1/).value )
  end
  
  def test_flash2
    browser.button(:value, 'Click Me').flash
    assert_raises(UnknownObjectException) { browser.text_field( :name , 'g177').flash }
  end
  
  def test_submitWithImage
    assert( browser.button(:alt, "submit").exists? )
    assert( browser.button(:alt, /sub/).exists? )
    
    assert_false( browser.button(:alt, "missing").exists? )
    assert_false( browser.button(:alt, /missing/).exists? )
    
    #assert( browser.button(:src , "file:///#{$myDir}/html/images/button.jpg").exists? )    # this doesnt work for everybody
    assert( browser.button(:src, /button/).exists? )
    
    assert_false( browser.button(:src, "missing").exists? )
    assert_false( browser.button(:src, /missing/).exists? )
    assert_nothing_raised("raised an exception when it shouldnt have") { browser.button(:src , /button/).click }
    
    assert( browser.text.include?("PASS") )
  end
end

class TC_Forms4 < Test::Unit::TestCase
  def setup
    uses_page "forms4.html"
  end
  
  def test_find_text_field_ignoring_form
    assert_equal(browser.text_field(:name, 'name').value, 'apple')
  end
  
  def test_correct_form_field_is_found_using_form_name
    assert_equal(browser.form(:name, 'apple_form').text_field(:name, 'name').value, 'apple')
    assert_equal(browser.form(:name, 'banana_form').text_field(:name, 'name').value, 'banana')
  end
  
  def test_correct_form_field_is_found_using_form_index
    assert_equal(browser.form(:index, 1).text_field(:name, 'name').value, 'apple')
    assert_equal(browser.form(:index, 2).text_field(:name, 'name').value, 'banana')
  end
  
  def test_using_text_on_form
    browser.form(:name, 'apple_form').text_field(:name, 'name').set('strudel')
    assert_equal(browser.form(:index, 1).text_field(:name, 'name').value, 'strudel')
  end 
  
  def test_submit
    browser.form(:name, 'apple_form').submit
    assert(browser.text.include?("PASS"))
  end
end

class TC_Hidden_Fields < Test::Unit::TestCase
  def setup
    goto_page "forms3.html"
  end
  
  def test_hidden
    
    # test using index
    assert( browser.hidden(:index, 1).exists? )
    assert( browser.hidden(:index, 2).exists? )
    assert_false( browser.hidden(:index, 3).exists? )
    
    browser.hidden(:index, 1).value = 44
    browser.hidden(:index, 2).value = 55
    
    browser.button(:value, "Show Hidden").click
    
    assert_equal("44", browser.text_field(:name, "vis1").value ) 
    assert_equal("55", browser.text_field(:name, "vis2").value )
    
    # test using name and ID
    assert( browser.hidden(:name, "hid1").exists? )
    assert( browser.hidden(:id, "hidden_1").exists? )
    assert_false( browser.hidden(:name, "hidden_44").exists? )
    assert_false( browser.hidden(:id, "hidden_55").exists? )
    
    browser.hidden(:name, "hid1").value = 444
    browser.hidden(:id, "hidden_1").value = 555
    
    browser.button(:value, "Show Hidden").click
    
    assert_equal("444", browser.text_field(:name, "vis1").value) 
    assert_equal("555", browser.text_field(:name, "vis2").value)
    
    # test the over-ridden append method
    browser.hidden(:name, "hid1").append("a")
    browser.button(:value, "Show Hidden").click
    assert_equal("444a", browser.text_field(:name, "vis1").value ) 
    assert_equal("555", browser.text_field(:name, "vis2").value )
    
    # test the over-ridden clear method
    browser.hidden(:name, "hid1").clear
    browser.button(:value, "Show Hidden").click
    assert_equal("", browser.text_field(:name, "vis1").value) 
    assert_equal("555", browser.text_field(:name, "vis2").value)
    
    # test using a form
    assert( browser.form(:name, "has_a_hidden").hidden(:name, "hid1").exists? )
    assert( browser.form(:name, "has_a_hidden").hidden(:id, "hidden_1").exists? )
    assert_false( browser.form(:name, "has_a_hidden").hidden(:name, "hidden_44").exists? )
    assert_false( browser.form(:name, "has_a_hidden").hidden(:id, "hidden_55").exists? )
    
    browser.form(:name, "has_a_hidden").hidden(:name, "hid1").value = 222
    browser.form(:name, "has_a_hidden").hidden(:id, "hidden_1").value = 333
    
    browser.button(:value, "Show Hidden").click
    
    assert_equal("222", browser.text_field(:name, "vis1").value) 
    assert_equal("333", browser.text_field(:name, "vis2").value)
    
    # iterators
    assert_equal(2, browser.hiddens.length)
    count = 1
    browser.hiddens.each do |h|
      case count
      when 1
        assert_equal("", h.id)
        assert_equal("hid1", h.name)
      when 2
        assert_equal("", h.name)
        assert_equal("hidden_1", h.id)
      end
      count += 1
    end
    
    assert_equal("hid1", browser.hiddens[1].name)
    assert_equal("hidden_1", browser.hiddens[2].id)
  end
end