# feature tests for Forms

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

class TC_Forms2_XPath < Test::Unit::TestCase
  def setup
    goto_page "forms2.html"
  end
  
  def test_Form_Exists
    assert(browser.form(:xpath , "//form[@name='test2']/").exists?)   
    assert_false(browser.form(:xpath , "//form[@name='missing']/").exists?)   
    
    assert(browser.form(:xpath , "//form[@method='get']/").exists?)   
    assert_false(browser.form(:xpath , "//form[@method='missing']/").exists?)   
    
    assert(browser.form(:xpath , "//form[@action='pass.html']/").exists?)   
    assert_false(browser.form(:xpath , "//form[@action='missing']/").exists?)   
  end
  
  def test_ButtonInForm
    assert(browser.form(:xpath , "//form[@name='test2']/").button(:caption , "Submit").exists?)
  end     
end

class TC_Form_Display_XPath < Test::Unit::TestCase
  include CaptureIOHelper                
  def test_showforms
    goto_page "forms2.html"

    actual = capture_stdout { browser.show_forms }
    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_XPath < Test::Unit::TestCase
  def setup
    goto_page "forms3.html"
  end
  
  def test_Form_Exists
    assert(browser.form(:xpath , "//form[@name='test2']/").exists?)   
    assert_false(browser.form(:xpath , "//form[@name='missing']/").exists?)   
    
    assert(browser.form(:xpath , "//form[@method='get']/").exists?)   
    assert_false(browser.form(:xpath , "//form[@method='missing']/").exists?)   
    
    assert(browser.form(:xpath , "//form[@action='pass.html']/").exists?)   
    assert_false(browser.form(:xpath , "//form[@action='missing']/").exists?)   
  end
  
  def test_getObject_when_non_watir_object_before_it
    # test for bug reported by Scott Pack,  http://rubyforge.org/pipermail/wtr-general/2005-June/002223.html
    assert_equal("check1" , browser.checkbox(:index,1).name )
  end
  
  def test_showforms # add verification of output!
    browser.show_forms
  end
  
  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(:caption, "Reset").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')
        
    # 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')    
  end
    
  def test_flash1
    browser.form(:xpath , "//form[@name='test2']/").button(:caption , "Submit").flash
  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_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( Watir::UnknownObjectException ) { browser.text_field( :name , 'g177').flash }
  end
  
  def test_showElements # add verification!
    browser.show_all_objects
  end
  
  def test_showText
    puts browser.text
  end
  
  def test_showHTML
    puts browser.html
  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.contains_text("PASS") )
  end
end

class TC_Forms4_XPath < Test::Unit::TestCase
  def setup
    goto_page "forms4.html"
  end
  
  def test_find_text_field_ignoring_form
    assert_equal(browser.text_field(:name, 'name').value, 'apple') # should it raise a not-unique error instead?
  end
  
  def test_correct_form_field_is_found_using_form_name
    assert_equal(browser.form(:xpath , "//form[@name='apple_form']/").text_field(:name, 'name').value, 'apple')
    assert_equal(browser.form(:xpath , "//form[@name='banana_form']/").text_field(:name, 'name').value, 'banana')
  end
  
  def test_using_text_on_form
    browser.form(:xpath , "//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(:xpath , "//form[@name='apple_form']/").submit
    assert( browser.contains_text("PASS") )
  end
end

class TC_Hidden_Fields_XPath < 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(:xpath , "//form[@name='has_a_hidden']/").hidden(:name ,"hid1").exists? )
    assert( browser.form(:xpath , "//form[@name='has_a_hidden']/").hidden(:id,"hidden_1").exists? )
    assert_false( browser.form(:xpath , "//form[@name='has_a_hidden']/").hidden(:name,"hidden_44").exists? )
    assert_false( browser.form(:xpath , "//form[@name='has_a_hidden']/").hidden(:id,"hidden_55").exists? )
    
    browser.form(:xpath , "//form[@name='has_a_hidden']/").hidden(:name ,"hid1").value = 222
    browser.form(:xpath , "//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