Cucumber Data Tables using Ruby

Build Status

All the source for this lesson is on Github.

Data tables are text structures built with pipes | and even spaces following right after the step that is written in the feature file. By default all tables are 2 dimensional arrays. During this lesson we will look at how to process these arrays in 3 different ways. Horizontally, vertically and full 2D array.

Horizontal Data Table

features/data-table.feature

Scenario: Add numbers in a horizontal tables
    Given a list of numbers horizontally
        | 1 | 3 | 5 |
    Then the total for the horizontal list is 9

features/step_definitions/data_table.rb

Given("a list of numbers horizontally") do |table|
    @list = table.raw
end

Then("the total for the horizontal list is {int}") do |int|
    total = 0
    @list.first.each { |a| total += a.to_i }
    expect(total).to eq(int)
end

Vertical Data Table

Scenario: Add numbers in a vertical table
    Given a list of numbers vertically
        | 1 |
        | 2 |
        | 4 |
    Then the total for the vertical list is 7
Given("a list of numbers vertically") do |table|
    @list = table.raw
end

Then("the total for the vertical list is {int}") do |int|
  total = 0
  @list.each { |a| total += a.first.to_i }
  expect(total).to eq(int)
end

2 Dimensional

Scenario: Add numbers in a 2D array
    Given a list of numbers in 2D array
        | 1 | 3 | 5 |
        | 2 | 6 | 3 |
        | 4 | 2 | 2 |
    Then the total for all numbers in 2D array is 28
Given("a list of numbers in 2D array") do |table|
  @list = table.raw
end

Then("the total for all numbers in 2D array is {int}") do |int|
  total = 0
  @list.each { |a| a.each { |b| total += b.to_i } }
  expect(total).to eq(int)
end

If you wanted to DRY this code up a little bit. You could actually use the same Given statement for all of these 3 scenarios.