Skip to content

RumataEstor/exmatch

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

61 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Extended match

This library is meant to provide an ergonomic way to pattern match and bind data in complex types such as maps and structs during testing.

Build status Hex.pm version Hex.pm downloads

Installation

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

defp deps do
  [
    {:exmatch, "~> 0.17.0", only: [:dev, :test]}
  ]
end

Usage

The library depends on ExUnit.AssertionError and therefore is meant to be used only in testing.

Notice {: .neutral}

The examples below display ExMatchTest.AssertionError as they are used as doctests. When used in your tests the ExUnit.AssertionError would be used instead. Using plain IEx environment will use basic struct formatter different from ExUnit.CLIFormatter.

iex> ExMatch.match(%{a: 1, b: 2, c: 3}, %{c: 3, a: 2, b: {1, 0}})
** (ExMatchTest.AssertionError)
left:  %{a: 1, b: 2}
right: %{a: 2, b: {1, 0}}
iex> opts = ExMatch.options([{Decimal, [:match_integer]}])
iex> ExMatch.match([10, eleven, _], [Decimal.new("10"), 11, 12], opts)
iex> eleven == 11
true
iex> eleven = 11
iex> ExMatch.match(%Decimal{coef: ^eleven, exp: 1 - 1, sign: 1}, Decimal.add(1, eleven))
** (ExMatchTest.AssertionError)
left:  %Decimal{coef: ^eleven = 11}
right: %Decimal{coef: 12}
iex> ExMatch.match(%ExMatchTest.Dummy{
...>    a: %ExMatchTest.Dummy1{a: 1},
...>    b: ~U[2022-02-19 05:10:08.387165Z]
...>  }, %ExMatchTest.Dummy{
...>    a: %ExMatchTest.Dummy{a: 1},
...>    b: Timex.parse!("2022-02-19 14:55:08.387165+09:45", "{ISO:Extended}")
...>  })
** (ExMatchTest.AssertionError)
left:  %ExMatchTest.Dummy{a: %ExMatchTest.Dummy1{}}
right: %ExMatchTest.Dummy{a: %ExMatchTest.Dummy{}}
iex> url = URI.parse("https://elixir-lang.org/")
iex> ExMatch.match(%URI{url | path: path}, URI.parse("https://elixir-lang.org/cases.html"))
iex> path == "/cases.html"
true
iex> url = URI.parse("https://elixir-lang.org/")
iex> ExMatch.match(%URI{url | scheme: "http"}, URI.parse("http://localhost:3000"))
** (ExMatchTest.AssertionError)
left:  url = %URI{authority: "elixir-lang.org", host: "elixir-lang.org", path: "/", port: 443}
right: %URI{authority: "localhost:3000", host: "localhost", path: nil, port: 3000}

Packages

No packages published

Languages