CHANGELOG.md

# Changelog

This format is based on [Keep a Changelog](https://keepachangelog.com) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## Unreleased (v0.10.0)

### Added

  * `mix mneme.test`, which is functionally equivalent to `mix test` except that it allows Mneme's configuration options to be passed at the command line.

### Changed

  * `mix mneme.watch` now uses `mix mneme.test` under the hood so that it can accept the same options.
    * This means that `mneme.test` needs to be added to your `:preferred_cli_env` in `mix.exs`: `preferred_cli_env: ["mneme.test": :test, "mneme.watch": :test]`.
    * Running `MIX_ENV=test mix mneme.install` will update this for you.

### Fixed

  * Ensure that the module is loaded before generating struct patterns ([#102](https://github.com/zachallaun/mneme/issues/102)).

## v0.9.4 (2024-10-28)

### Added

  * `mix mneme.install`, an [Igniter](https://github.com/ash-project/igniter) task that simplifies setup.

## v0.9.3 (2024-10-21)

### Fixed

  * Don't simplify structs used as keys in maps ([#96](https://github.com/zachallaun/mneme/issues/96)).
  * [mix mneme.watch] Ensure the `:ex_unit` application is started before accessing its application config ([#95](https://github.com/zachallaun/mneme/issues/95)).

## v0.9.2 (2024-10-14)

### Added

  * Added `--exit-on-success` flag to `mix mneme.watch`, which reruns tests until all of them pass, then exits.

### Fixed

  * Prevent an increasing number of "Running ExUnit with seed..." messages from printing during runs of `mix mneme.watch`. This was a regression introduced in v0.9.1.

## v0.9.1 (2024-10-14)

### Fixed

  * Don't override existing ExUnit formatters ([#87](https://github.com/zachallaun/mneme/issues/87)).

## v0.9.0 (2024-10-08)

### Added

  * `mix mneme.watch`, a test runner that watches source files for changes and automatically re-runs your tests. It's Mneme-aware, which means it can interrupt prompts and save already-accepted tests if a file system change is detected mid-run.

### Fixed

  * Fix crash that could occur when generating heredoc strings with repeated newlines ([#85](https://github.com/zachallaun/mneme/issues/85)).

## v0.8.2 (2024-07-11)

### Added

  * Added `J` and `K` to jump to the first and last pattern when multiple patterns are offered in a prompt. (`J` and `K` were previously equivalent to `j` and `k`, respectively.)

### Fixed

  * Don't suggest duplicate patterns when updating lists (or other containers of) maps.
  * Don't generate incorrect map patterns when updating an existing pattern that is a partial match of a new value. For instance, when updating the pattern `%{x: 1, y: 2, z: 3}` for the new value `%{x: 1, y: 2}`, the incorrect pattern `%{x: 1, y: 2, z: nil}` would be suggested.

## v0.8.1 (2024-06-20)

### Fixed

  * Fix a diff bug that could cause some deleted or added code to go unhighlighted.

## v0.8.0 (2024-06-20)

### Added

  * [@am-kantox](https://github.com/am-kantox) - Variables bound in `auto_assert` patterns remain in scope ([#1](https://github.com/zachallaun/mneme/issues/1)).
  * Print a warning when an auto-assertion that will always succeed is encountered.

## v0.7.0 (2024-05-27)

This is the first version supporting Elixir 1.17.0 and Erlang/OTP 27.

### Changed

  * Update docs to reflect `-0.0` being a possible generated value when using Erlang/OTP 27 or later.

### Fixed

  * Fix diff highlighting of the map opening delimiter `%{` when using Elixir 1.17+.
  * Fix warnings during testing when using Elixir 1.17+.

## v0.6.1 (2024-05-21)

### Added

  * Update map and struct patterns that ignore keys more intelligently, e.g. `%{x: 1, y: _}` will now still use `_` for `:y` when `:x` changes.

### Fixed

  * Fix a crash that would occur when generating a pattern for a non-existing struct, e.g. `%{__struct__: Foo}` when `Foo` is not a module defining a struct ([#67](https://github.com/zachallaun/mneme/issues/67)).
  * Generate the signed pattern `+0.0` for the float `0.0` to avoid the warning about `+0.0` and `-0.0` no longer matching in Erlang/OTP 27. (Mneme will gain support for generating `-0.0` patterns in the future.)

## v0.6.0 (2024-04-15)

### Changed

  * Calling `Mneme.start/1` multiple times now has the same behavior as `Mneme.start(restart: true)`. The `:restart` option is now a no-op and specifying it will print a notice.

### Fixed

  * Tests using Mneme can now be compiled individually without having first called `Mneme.start/1`. Previously, an error would be raised at compile-time, interfering with some language servers ([lexical-lsp/lexical#507](https://github.com/lexical-lsp/lexical/issues/507)).

## v0.5.1 (2024-04-13)

### Changed

  * Updated some dependencies for better compatibility with other libraries.

## v0.5.0 (2024-02-06)

While this release does not include breaking changes, the minor version is being bumped because the change to map patterns described below may be unexpected.

### Changed

  * Empty maps will no longer be suggested as patterns for non-empty maps. For instance, `auto_assert %{foo: 1}` will no longer suggest `auto_assert %{} <- %{foo: 1}`. Note that empty structs will still be suggested ([#55](https://github.com/zachallaun/mneme/issues/55), [#56](https://github.com/zachallaun/mneme/issues/56), [#57](https://github.com/zachallaun/mneme/issues/57)).

### Fixed

  * Generate struct patterns for `DateTime` when the sigil cannot be used ([#59](https://github.com/zachallaun/mneme/issues/59)).
  * Correctly escape non-printable characters in string literals, like `\r` ([#62](https://github.com/zachallaun/mneme/issues/62)).
  * Fix a crash that could occur due to incorrect handling of the source file being changed while Mneme was running.

## v0.4.3 (2023-11-02)

### Fixed

  * Fix a regression introduced in v0.4.1 that caused auto-assertions to fail if an earlier one in the same file added or removed lines when formatted ([#53](https://github.com/zachallaun/mneme/issues/53)).
  * Suppress "unused alias" warnings when the aliases are only used in auto-assertions ([#54](https://github.com/zachallaun/mneme/issues/54)).

## v0.4.2 (2023-11-01)

### Fixed

  * Fix a crash that would occur if a test file containing an auto-assertion is changed before the auto-assertion is run (for instance, while Mneme is waiting on input from an auto-assertion in a different test file).

## v0.4.1 (2023-10-25)

### Fixed

  * Fix a crash that could occur when diffing sigils ([#52](https://github.com/zachallaun/mneme/issues/52)).

## v0.4.0 (2023-07-04)

### Added

  * `Mneme.start/1` now accepts all of Mneme's configuration options that will be applied to the entire test run.

### Removed

  * **Breaking:** Removed support for `:mneme` application config. This has been replaced by passing config options directly to `Mneme.start/1`:

      ```elixir
      # Old: config/test.exs
      config :mneme, defaults: [default_pattern: :last, ...]

      # New: test/test_helper.exs
      Mneme.start(default_pattern: :last, ...)
      ```

## v0.3.5 (2023-06-30)

### Fixed

  * Support multi-letter sigils when using Elixir 1.15.0+.

## v0.3.4 (2023-05-22)

### Added

  * Tested to support OTP 26.0 when using Elixir 1.14.4.
  * Support expressions that return functions, serializing them with an `is_function(fun, arity)` guard.
  * When generating a pattern for a MapSet, add a note suggesting using `MapSet.to_list/1` for better serialization.

### Changed

  * Format pattern notes to be more obvious when they're present.
  * Generate charlist patterns using `sigil_c` instead of single quotes, e.g. `~c"foo"` instead of `'foo'`. See [this discussion](https://elixirforum.com/t/convert-charlists-into-c-charlists/49455) for more context.

### Fixed

  * Numerous fixes related to vars used in guards:
    * Generated vars will no longer shadow variables in scope (e.g. if `pid` is in scope, a different pid will use the var `pid1`).
    * The same var will no longer be used for different values of the same type.
    * Multiple, redundant guards will no longer be emitted for the same var (e.g. `[self(), self()]` would result in `[pid, pid] when is_pid(pid) and is_pid(pid)`).
  * Numerous fixes related to pattern generation, especially in regards to map keys.

## v0.3.3 (2023-05-01)

### Changed

  * Improve stacktraces and ExUnit assertion errors when an auto-assertion fails or is rejected.
  * When an `auto_assert` updates, a default pattern that is more similar to the existing one will be selected in more cases when the `:default_pattern` option is set to `:infer` (the default).
  * When updating an assertion with an existing map pattern that only asserts a subset of keys, generate a pattern using that subset as well.

## v0.3.2 (2023-04-16)

### Changed

  * Multi-line string patterns will now always appear in the same order (heredoc format will always be the last option).

### Fixed

  * Raise a more comprehensible error if `Mneme.start()` is called multiple times without `restart: true`.
  * Fix an incorrect guard that could cause semantic diffing to fail and fall back to text diffing.
  * Fix multi-line string formatting issues with `auto_assert_raise`, `auto_assert_receive`, and `auto_assert_received`.

## v0.3.1 (2023-04-14)

### Changed

  * Multi-line strings will now generate both a heredoc and a single-line option.

### Removed

  * No longer depend on `libgraph`.

## v0.3.0 (2023-04-10)

It is recommended to now use Elixir v1.14.4 or later.

### Added

  * Add three new auto-assertions:
    * [`auto_assert_raise`](https://hexdocs.pm/mneme/Mneme.html#auto_assert_raise/3)
    * [`auto_assert_receive`](https://hexdocs.pm/mneme/Mneme.html#auto_assert_receive/2)
    * [`auto_assert_received`](https://hexdocs.pm/mneme/Mneme.html#auto_assert_received/1)
  * Add a `:force_update` option that forces re-generating assertion patterns even when they succeed. See the [Options documentation](https://hexdocs.pm/mneme/Mneme.html#module-options) for more info.
  * Prompts will now show options that were overridden from the defaults.
  * Mneme now prints a one-line summary at the end of the test run.

### Changed

  * For falsy values, `auto_assert` now generates `<-` pattern matches instead of `==` value comparisons, which have been removed.
  * Existing auto-assertions will now run when `Mneme.start()` is not called, but new or failing auto-assertions will fail without prompting ([#32](https://github.com/zachallaun/mneme/issues/32)).
  * Ranges now use range syntax like `1..10` and `1..10//2` instead of generating a `%Range{}` struct.

### Removed

  * **Breaking:** `auto_assert` no longer supports value comparisons using `==`.

### Fixed

  * Fix a configuration precedence bug that caused options set in application config to always override module, describe, or test options.
  * Fix a compatibility issue with Ecto ~> 3.9.4 ([#34](https://github.com/zachallaun/mneme/issues/34)).
  * Fix a confusing diff result that could occur with some binary operations ([#11](https://github.com/zachallaun/mneme/issues/11)).
  * Preceding comments are no longer shown in diffs ([#26](https://github.com/zachallaun/mneme/issues/26)).
  * Fix a number of diffing errors related to structs.

## v0.2.7 (2023-03-29)

### Fixed

  * Fix a crash related to escaped string interpolation characters ([#29](https://github.com/zachallaun/mneme/issues/29)).

## v0.2.6 (2023-03-27)

### Added

  * Auto-assertion prompts can now be skipped (`s`) in addition to accepted (`y`) or rejected (`n`). This allows the test clause to continue so that later assertions might be run, but fails the test run once the suite finishes.
  * Semantic diffs will now be displayed side-by-side if terminal width allows. To always display diffs stacked, use the `diff_style: :stacked` option; see the "Configuration" section of the `Mneme` module doc for more.

### Changed

  * Semantic diff formatting has been improved for clarity.

### Fixed

  * Don't overwrite test files if their content changes after starting the test run ([#23](https://github.com/zachallaun/mneme/issues/23)).
  * Fix a crash that occurred when a value contained nested strings with newlines, e.g. `{:ok, "hello\nworld"}` ([#25](https://github.com/zachallaun/mneme/issues/25)).
  * The `j/k` options will no longer be rendered when prompting if there is only a single pattern option.

## v0.2.4, v0.2.5 (2023-03-25)

### Fixed

  * Remove unnecessary files from Hex package. This cuts the package size down drastically.

## v0.2.3 (2023-03-25)

### Fixed

  * Fix diffing for certain sigil variations.
  * Fix `dbg`-related error when running `MIX_ENV=test iex -S mix` ([#20](https://github.com/zachallaun/mneme/issues/20)).
  * Fix ETS-related error when calling `Mneme.start/1` multiple times ([#20](https://github.com/zachallaun/mneme/issues/20#issuecomment-1483878101)).

## v0.2.2 (2023-03-20)

### Fixed

  * Disable a semantic diffing optimization that caused poor diff results in certain cases, usually manifesting as incorrect branches being compared.

## v0.2.1 (2023-03-19)

### Changed

  * More consistent formatting between `:semantic` and `:text` diffs.

## v0.2.0 (2023-03-18)

### Added

  * Adds semantic diffs which selectively highlight only meaningful changes when updating an assertion. This can be disabled with the `diff: :text` option; see the "Configuration" section of the `Mneme` module doc for more.

### Changed

  * **Breaking:** Mneme now requires Elixir v1.14 or later.

### Fixed

  * Invalid options now cause a warning instead of crashing test process.
  * Internal errors now show an error instead of crashing test process.
  * Fix bug causing multiple identical choices to be presented in some cases where empty lists were a part of the value.

## v0.1.6 (2023-03-04)

### Changed

  * Improved compile-time error message when `auto_assert` is used outside of a `test` block ([#9](https://github.com/zachallaun/mneme/issues/9)).

## v0.1.5 (2023-02-25)

### Changed

  * More consistent handling of charlists: lists of integers will now generate themselves as a pattern as well as a charlist if the list is ASCII printable ([#6](https://github.com/zachallaun/mneme/issues/6)).

## v0.1.4 (2023-02-23)

### Fixed

  * Fix a bug that could cause `auto_assert` expressions to revert to the previous value when using `Mneme.start(restart: true)` ([#7](https://github.com/zachallaun/mneme/issues/7)).

## v0.1.3 (2023-02-22)

### Added

  * Add a `:default_pattern` configuration option for auto-assertions which controls the pattern that should be selected by default when prompted.

### Fixed

  * When converting an auto-assertion to an ExUnit assertion, select the identical pattern when the `:default_pattern` is `:infer` (set by default).

## v0.1.2 (2023-02-21)

### Added

  * Add a `:restart` option to `Mneme.start/1` to restart Mneme if called multiple times.

## v0.1.1 (2023-02-20)

### Changed

  * Dramatically reduce the performance gap between `auto_assert` and ExUnit's `assert`.

## v0.1.0 (2023-02-19)

First release.