README.md

# Criterion

A library to write ExUnit tests BDD style

## Installation

The package can be installed
by adding `criterion` to your list of dependencies in `mix.exs`:

```elixir
def deps do
  [
    {:criterion, "~> 0.1", only: [:test, :dev]}
  ]
end
```

## Usage

- Define a feature using `feature/2` macro
- Define scenarios under the feature using the `scenario/2` macro.
- Inside each scenario, define steps using `step/2` block.
- Steps can have either inline or external implementation.
- External implementations can be reused and can be defined using `defstep/2` macro.

## Example

```elixir
defmodule CriterionTest do
  use ExUnit.Case
  import Criterion

  feature "Math" do
    setup do
      {:ok, pi: 3.14}
    end

    scenario "Square" do
      # Step with external implementation
      step("Given a number greater than 5",
        via: &random_number/2,
        where: [min: 2] # Options passed as second argument to the function
      )

      # Step with inline implementation
      step "When the number is multiplied by it self", %{number: number} do
        result = number * number
        %{result: result} # will be merged to the test context
      end

      step "Then the result is greater than the number", %{result: result, number: number} do
        assert result > number
      end

      # You can access data from the initial context of the test
      step "And pi is a constant", %{pi: pi} do
        assert pi == 3.14
      end
    end

    # External step implementation
    defstep random_number(_context, args) do
      min = args[:min] || 0
      %{number: min + Enum.random(0..100)}
    end
  end
end
```

### Generating feature files

```
mix criterion.gen.features
```

#### Options

- `--dir` - specify the directory to read test files from. default is `test`
- `--file` - to generate feature files for a list of test files
- `--output` - specify the directory to generate feature files in. default is `test/features`
  `test/features/Math.feature`

```feature
Feature: Math

  Scenario: Square
    Given a number greater than 1
    When the number is multiplied by it self
    Then the result is greater than the number
    And pi is a constant
```

### Generating test files

```
mix criterion.gen.tests
```

#### Options

- `--dir` - specify the directory to read feature files from. default is `test/features`
- `--file` - to generate test for a list of files
- `--output` - specify the directory to generate the test files in. default is `test/features`

`test/features/math_test.exs`

```elixir
defmodule MathTest do
  use ExUnit.Case
  import Criterion

  feature "Math" do
    scenario "Square" do
      step "Given a number greater than 1" do
      end

      step "When the number is multiplied by it self" do
      end

      step "Then the result is greater than the number" do
      end

      step "And pi is a constant" do
      end
    end
  end
end
```