# feature tests for Radio Buttons
# revision: $Revision$

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

class TC_Radios < Test::Unit::TestCase
  include Watir::Exception
  
  def setup
    goto_page "radioButtons1.html"
  end
  
  def test_Radio_Exists
    assert(browser.radio(:name, "box1").exists?)   
    assert(browser.radio(:id, "box5").exists?)   
    
    assert_false(browser.radio(:name, "missingname").exists?)   
    assert_false(browser.radio(:id, "missingid").exists?)   
  end
  
  def test_radio_class
    assert_raises(UnknownObjectException) { browser.radio(:name, "noName").class_name }  
    assert_equal("radio_style", browser.radio(:name, "box1").class_name)   
    assert_equal("", browser.radio(:id, "box5").class_name)   
  end
  
  def test_Radio_Enabled
    assert_raises(UnknownObjectException, "UnknownObjectException was supposed to be thrown" ) {   browser.radio(:name, "noName").enabled?  }  
    assert_raises(UnknownObjectException, "UnknownObjectException was supposed to be thrown" ) {   browser.radio(:id, "noName").enabled?  }  
    assert_raises(UnknownObjectException, "UnknownObjectException was supposed to be thrown" ) {   browser.radio(:name, "box4" , 6).enabled?  }  
    
    assert_false(browser.radio(:name, "box2").enabled?)   
    assert(browser.radio(:id, "box5").enabled?)   
    assert(browser.radio(:name, "box1").enabled?)   
  end
  
  def test_little
    assert_false(browser.button(:value, "foo").enabled?)
  end
  
  def test_onClick
    
    assert_false(browser.radio(:name, "box5").isSet?)
    assert_false(browser.button(:value , "foo").enabled?)
    
    # first click the button is enabled and the radio is set
    browser.radio(:name, "box5", 1).set
    assert(browser.radio(:name, "box5",1).isSet?)
    assert(browser.radio(:name, "box5",1).checked?)    
    assert(browser.button(:value, "foo").enabled?)
    
    # second click the button is disabled and the radio is still set
    browser.radio(:name, "box5", 1).set
    assert(browser.radio(:name, "box5",1).isSet?)
    assert(browser.radio(:name, "box5",1).checked?)    
    assert_false(browser.button(:value, "foo").enabled?)
    
    # third click the button is enabled and the radio is still set
    browser.radio(:name, "box5", 1).set
    assert(browser.radio(:name, "box5", 1).isSet?)
    assert(browser.radio(:name, "box5", 1).checked?)
    assert(browser.button(:value, "foo").enabled?)
    
    # click the radio with a value of 2 , button is disabled and the radio is still set
    browser.radio(:name, "box5", 2).set
    assert_false(browser.radio(:name, "box5", 1).isSet?)
    assert_false(browser.radio(:name, "box5", 1).checked?)    
    assert(browser.radio(:name, "box5", 2).isSet?)
    assert(browser.radio(:name, "box5", 2).checked?)    
    assert_false(browser.button(:value, "foo").enabled?)
  end
  
  def test_Radio_isSet
    assert_raises(UnknownObjectException) { browser.radio(:name, "noName").isSet?  }  
    
    assert_false(browser.radio(:name, "box1").isSet?)   
    assert( browser.radio(:name, "box3").isSet?)   
    assert_false(browser.radio(:name, "box2").isSet?)   
    assert( browser.radio(:name, "box4", 1).isSet?)   
    assert_false(browser.radio(:name, "box4", 2).isSet?)  

    assert_false(browser.radio(:name, "box1").checked?)   
    assert( browser.radio(:name, "box3").checked?)   
    assert_false(browser.radio(:name, "box2").checked?)   
    assert( browser.radio(:name, "box4", 1).checked?)   
    assert_false(browser.radio(:name, "box4", 2).checked?)   
  end
  
  def test_radio_clear
    assert_raises(UnknownObjectException) {   browser.radio(:name, "noName").clear  }  
    
    browser.radio(:name, "box1").clear
    assert_false(browser.radio(:name, "box1").isSet?)   
    
    assert_raises(ObjectDisabledException, "ObjectDisabledException was supposed to be thrown" ) {   browser.radio(:name, "box2").clear  } 
    assert_false(browser.radio(:name, "box2").isSet?)   
    
    browser.radio(:name, "box3").clear
    assert_false(browser.radio(:name, "box3").isSet?)   
    
    browser.radio(:name, "box4" , 1).clear
    assert_false(browser.radio(:name, "box4" , 1).isSet?)   
  end
  
  def test_radio_getState
    assert_raises(UnknownObjectException, "UnknownObjectException was supposed to be thrown" ) {   browser.radio(:name, "noName").getState  }  
    
    assert_equal( false , browser.radio(:name, "box1").getState )   
    assert_equal( true , browser.radio(:name, "box3").getState)   
    
    # radioes that have the same name but different values
    assert_equal( false , browser.radio(:name, "box4" , 2).getState )   
    assert_equal( true , browser.radio(:name, "box4" , 1).getState)   
  end
  
  def test_radio_set
    assert_raises(UnknownObjectException, "UnknownObjectException was supposed to be thrown" ) {   browser.radio(:name, "noName").set  }  
    browser.radio(:name, "box1").set
    assert(browser.radio(:name, "box1").isSet?)   
    
    assert_raises(ObjectDisabledException, "ObjectDisabledException was supposed to be thrown" ) {   browser.radio(:name, "box2").set  }  
    
    browser.radio(:name, "box3").set
    assert(browser.radio(:name, "box3").isSet?)   
    
    # radioes that have the same name but different values
    browser.radio(:name, "box4" , 3).set
    assert(browser.radio(:name, "box4" , 3).isSet?)   
  end
  
  def test_radio_properties
    
    assert_raises(UnknownObjectException, "UnknownObjectException  was supposed to be thrown" ) {   browser.radio(:index, 199).value}  
    assert_raises(UnknownObjectException, "UnknownObjectException  was supposed to be thrown" ) {   browser.radio(:index, 199).name }  
    assert_raises(UnknownObjectException, "UnknownObjectException  was supposed to be thrown" ) {   browser.radio(:index, 199).id }  
    assert_raises(UnknownObjectException, "UnknownObjectException  was supposed to be thrown" ) {   browser.radio(:index, 199).disabled }  
    assert_raises(UnknownObjectException, "UnknownObjectException  was supposed to be thrown" ) {   browser.radio(:index, 199).type }  
    
    assert_equal("on"   ,    browser.radio(:index, 1).value)  
    assert_equal("box1" ,    browser.radio(:index, 1).name )  
    assert_equal(""     ,    browser.radio(:index, 1).id )  
    assert_equal("radio",    browser.radio(:index, 1).type )  
    
    assert_equal( false, browser.radio(:index, 1).disabled )
    assert_equal( true,  browser.radio(:index, 3).disabled )
    
    assert_equal("box5"  ,    browser.radio(:index, 2).id )  
    assert_equal(""      ,    browser.radio(:index, 2).name )  
    
    assert_equal("box4-value5", browser.radio(:name , "box4" , 5 ).title  )
    assert_equal("", browser.radio(:name , "box4" , 4 ).title  )
  end
  
  def test_radio_iterators
    assert_equal(13, browser.radios.length)
    assert_equal("box5" , browser.radios[2].id )
    assert_equal(true ,  browser.radios[3].disabled )
    assert_equal(false ,  browser.radios[1].disabled )
    
    index = 1
    browser.radios.each do |r|
      assert_equal( browser.radio(:index, index).name , r.name )
      assert_equal( browser.radio(:index, index).id , r.id )
      assert_equal( browser.radio(:index, index).value, r.value)
      assert_equal( browser.radio(:index, index).disabled , r.disabled )
      index+=1
    end
    assert_equal(index -1, browser.radios.length)
  end
  
  # test radio buttons that have a string as a value
  def test_value_string
    tea = browser.radio(:name, 'box6', 'Tea')
    milk = browser.radio(:name, 'box6', 'Milk')
    
    assert(tea.exists?)
    assert(milk.exists?)

    milk.set
    assert(milk.isSet?)   
    assert_false(tea.isSet?)   

    tea.set
    assert_false(milk.isSet?)   
    assert(tea.isSet?)   

    tea.clear
    assert_false(tea.isSet?)
  end

  def test_value_specified
    tea = browser.radio(:name => 'box6', :value => 'Tea')
    milk = browser.radio(:name => 'box6', :value => 'Milk')
    
    assert(tea.exists?)
    assert(milk.exists?)

    milk.set
    assert(milk.isSet?)   
    assert_false(tea.isSet?)   

    tea.set
    assert_false(milk.isSet?)   
    assert(tea.isSet?)   

    tea.clear
    assert_false(tea.isSet?)
  end
  
end