class Cucumber::Salad::Widgets::FieldGroup

A group of form fields.

@todo Explain how to use locators when defining fields, including what

happens when locators are omitted.

Public Class Methods

check_box(name, locator = nil) click to toggle source

Creates a new checkbox accessor.

Adds the following methods to the widget:

<name>

Gets the current checkbox state, as a boolean. Returns true if the corresponding check box is checked, false otherwise.

<name>=

Sets the current checkbox state. Pass true to check the checkbox, false otherwise.

@example

# Given the following HTML:
#
# <form>
#   <p>
#     <label for="checked-box">
#     <input type="checkbox" value="1" id="checked-box" checked>
#   </p>
#   <p>
#     <label for="unchecked-box">
#     <input type="checkbox" value="1" id="unchecked-box">
#   </p>
# </form>
class MyFieldGroup < Cucumber::Salad::Widgets::FieldGroup
  root 'form'

  check_box :checked_box, 'checked-box'
  check_box :unchecked_box, 'unchecked-box'
end

form = widget(:my_field_group)

form.checked_box          #=> true
form.unchecked_box        #=> false

form.unchecked_box = true
form.unchecked_box        #=> true

@param name the name of the checkbox accessor. @param locator the locator for the checkbox. If nil the locator will

be derived from +name+.

@todo Handle checkbox access when the field is disabled (raise an

exception?)
# File lib/cucumber/salad/widgets/field_group.rb, line 74
def self.check_box(name, locator = nil)
  field name, locator || name_to_locator(name), CheckBox
end
default_locator(type = nil, &block) click to toggle source
# File lib/cucumber/salad/widgets/field_group.rb, line 11
def self.default_locator(type = nil, &block)
  alias_method :name_to_locator, type if type

  define_method :name_to_locator, &block if block
end
field(name, locator, type) click to toggle source

Defines a new field.

@param name the name of the field accessor. @param locator the field locator. @param type the field class name.

@api private

# File lib/cucumber/salad/widgets/field_group.rb, line 85
def self.field(name, locator, type)
  raise TypeError, "can't convert `#{name}' to Symbol" \
    unless name.respond_to?(:to_sym)

  field_names << name.to_sym

  widget name, locator, type do
    define_method :label do
      name.to_s.gsub(/_/, ' ').capitalize
    end
  end

  define_method "#{name}=" do |val|
    widget(name).set val
  end

  define_method name do
    widget(name).get
  end
end
field_names() click to toggle source

The names of all the fields that belong to this field group.

Field names are automatically added to this group as long as you use the field definition macros.

@return [Set] the field names.

@see field

# File lib/cucumber/salad/widgets/field_group.rb, line 25
def self.field_names
  @field_names ||= Set.new
end
select(name, locator = nil) click to toggle source

Creates a new select accessor.

Adds the following methods to the widget:

<name>

Gets the current selected option. Returns the label of the selected option, or nil, if no option is selected.

<name>=

Selects an option on the current select. Pass the label of the option you want to select.

@example

# Given the following HTML:
#
# <form>
#   <p>
#     <label for="selected">
#     <select id="selected">
#       <option selected>Selected option</option>
#       <option>Another option</option>
#     </select>
#   </p>
#   <p>
#     <label for="deselected">
#     <select id="deselected">
#       <option>Deselected option</option>
#       <option>Another option</option>
#     </select>
#   </p>
# </form>
class MyFieldGroup < Cucumber::Salad::Widgets::FieldGroup
  root 'form'

  select :selected, 'selected'
  select :deselected, 'deselected'
end

form = widget(:my_field_group)

form.selected                         #=> "Selected option"
form.deselected                       #=> nil

form.deselected = "Deselected option"
form.unchecked_box                    #=> "Deselected option"

@param name the name of the select accessor. @param locator the locator for the select. If nil the locator will

be derived from +name+.

@todo Handle select access when the field is disabled (raise an

exception?)

@todo Raise an exception when an option doesn’t exist. @todo Allow passing the option value to set an option. @todo Ensure an option with no text returns the empty string. @todo What to do when nil is passed to the writer?

# File lib/cucumber/salad/widgets/field_group.rb, line 159
def self.select(name, locator = nil)
  field name, locator || name_to_locator(name), Select
end
text_field(name, locator = nil) click to toggle source

Creates a new text field accessor.

Adds the following methods to the widget:

<name>

Returns the current text field value, or nil if no value has been set.

<name>=

Sets the current text field value.

@example

# Given the following HTML:
#
# <form>
#   <p>
#     <label for="text-field">
#     <input type="text" value="Content" id="text-field">
#   </p>
#   <p>
#     <label for="empty-field">
#     <input type="text" id="empty-field">
#   </p>
# </form>
class MyFieldGroup < Cucumber::Salad::Widgets::FieldGroup
  root 'form'

  text_field :filled_field, 'text-field'
  text_field :empty_field, 'empty-field'
end

form = widget(:my_field_group)

form.filled_field                #=> "Content"
form.empty_field                 #=> nil

form.empty_field = "Not anymore"
form.empty_field                 #=> "Not anymore"

@param name the name of the text field accessor. @param locator the locator for the text field. If nil the locator

will be derived from +name+.

@todo Handle text field access when the field is disabled (raise an

exception?)
# File lib/cucumber/salad/widgets/field_group.rb, line 205
def self.text_field(name, locator = nil)
  field name, locator || name_to_locator(name), TextField
end

Public Instance Methods

fields() click to toggle source

@return This field group’s field widgets.

# File lib/cucumber/salad/widgets/field_group.rb, line 212
def fields
  self.class.field_names.map { |name| widget(name) }
end
set(attributes) click to toggle source

Sets the given form attributes.

@param attributes [Hash] the attributes and values we want to set.

@return the current widget.

# File lib/cucumber/salad/widgets/field_group.rb, line 221
def set(attributes)
  attributes.each do |k, v|
    send "#{k}=", v
  end

  self
end
to_table() click to toggle source

Converts the current field group into a table suitable for diff’ing with Cucumber::Ast::Table.

Field labels are determined by the widget name.

Field values correspond to the return value of each field’s to_s.

@return [Array<Array>] the table.

# File lib/cucumber/salad/widgets/field_group.rb, line 237
def to_table
  headers = fields.map { |field| field.label.downcase }
  body    = fields.map { |field| field.to_s.downcase }

  [headers, body]
end

Private Instance Methods

label(name) click to toggle source
# File lib/cucumber/salad/widgets/field_group.rb, line 332
def label(name)
  name.to_s.humanize
end
name_to_locator(name) click to toggle source
# File lib/cucumber/salad/widgets/field_group.rb, line 336
def name_to_locator(name)
  label(name)
end