This format is based on Keep a Changelog and this project adheres to Semantic Versioning.
mix mneme.test
, which is functionally equivalent tomix test
except that it allows Mneme's configuration options to be passed at the command line.
mix mneme.watch
now usesmix 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
inmix.exs
:preferred_cli_env: ["mneme.test": :test, "mneme.watch": :test]
. - Running
MIX_ENV=test mix mneme.install
will update this for you.
- This means that
- Ensure that the module is loaded before generating struct patterns (#102).
- If an existing string pattern is using
"""
, use the same by default if the string changes (#80).
mix mneme.install
, an Igniter task that simplifies setup.
- Don't simplify structs used as keys in maps (#96).
- [mix mneme.watch] Ensure the
:ex_unit
application is started before accessing its application config (#95).
- Added
--exit-on-success
flag tomix mneme.watch
, which reruns tests until all of them pass, then exits.
- 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.
- Don't override existing ExUnit formatters (#87).
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.
- Fix crash that could occur when generating heredoc strings with repeated newlines (#85).
- Added
J
andK
to jump to the first and last pattern when multiple patterns are offered in a prompt. (J
andK
were previously equivalent toj
andk
, respectively.)
- 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.
- Fix a diff bug that could cause some deleted or added code to go unhighlighted.
- @am-kantox - Variables bound in
auto_assert
patterns remain in scope (#1). - Print a warning when an auto-assertion that will always succeed is encountered.
This is the first version supporting Elixir 1.17.0 and Erlang/OTP 27.
- Update docs to reflect
-0.0
being a possible generated value when using Erlang/OTP 27 or later.
- Fix diff highlighting of the map opening delimiter
%{
when using Elixir 1.17+. - Fix warnings during testing when using Elixir 1.17+.
- Update map and struct patterns that ignore keys more intelligently, e.g.
%{x: 1, y: _}
will now still use_
for:y
when:x
changes.
- Fix a crash that would occur when generating a pattern for a non-existing struct, e.g.
%{__struct__: Foo}
whenFoo
is not a module defining a struct (#67). - Generate the signed pattern
+0.0
for the float0.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.)
- Calling
Mneme.start/1
multiple times now has the same behavior asMneme.start(restart: true)
. The:restart
option is now a no-op and specifying it will print a notice.
- 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).
- Updated some dependencies for better compatibility with other libraries.
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.
- Empty maps will no longer be suggested as patterns for non-empty maps. For instance,
auto_assert %{foo: 1}
will no longer suggestauto_assert %{} <- %{foo: 1}
. Note that empty structs will still be suggested (#55, #56, #57).
- Generate struct patterns for
DateTime
when the sigil cannot be used (#59). - Correctly escape non-printable characters in string literals, like
\r
(#62). - Fix a crash that could occur due to incorrect handling of the source file being changed while Mneme was running.
- 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).
- Suppress "unused alias" warnings when the aliases are only used in auto-assertions (#54).
- 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).
- Fix a crash that could occur when diffing sigils (#52).
Mneme.start/1
now accepts all of Mneme's configuration options that will be applied to the entire test run.
-
Breaking: Removed support for
:mneme
application config. This has been replaced by passing config options directly toMneme.start/1
:# Old: config/test.exs config :mneme, defaults: [default_pattern: :last, ...] # New: test/test_helper.exs Mneme.start(default_pattern: :last, ...)
- Support multi-letter sigils when using Elixir 1.15.0+.
- 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.
- 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 for more context.
- 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 varpid1
). - 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)
).
- Generated vars will no longer shadow variables in scope (e.g. if
- Numerous fixes related to pattern generation, especially in regards to map keys.
- 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.
- Multi-line string patterns will now always appear in the same order (heredoc format will always be the last option).
- Raise a more comprehensible error if
Mneme.start()
is called multiple times withoutrestart: 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
, andauto_assert_received
.
- Multi-line strings will now generate both a heredoc and a single-line option.
- No longer depend on
libgraph
.
It is recommended to now use Elixir v1.14.4 or later.
- Add three new auto-assertions:
- Add a
:force_update
option that forces re-generating assertion patterns even when they succeed. See the Options documentation 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.
- 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). - Ranges now use range syntax like
1..10
and1..10//2
instead of generating a%Range{}
struct.
- Breaking:
auto_assert
no longer supports value comparisons using==
.
- 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).
- Fix a confusing diff result that could occur with some binary operations (#11).
- Preceding comments are no longer shown in diffs (#26).
- Fix a number of diffing errors related to structs.
- Fix a crash related to escaped string interpolation characters (#29).
- 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 theMneme
module doc for more.
- Semantic diff formatting has been improved for clarity.
- Don't overwrite test files if their content changes after starting the test run (#23).
- Fix a crash that occurred when a value contained nested strings with newlines, e.g.
{:ok, "hello\nworld"}
(#25). - The
j/k
options will no longer be rendered when prompting if there is only a single pattern option.
- Remove unnecessary files from Hex package. This cuts the package size down drastically.
- Fix diffing for certain sigil variations.
- Fix
dbg
-related error when runningMIX_ENV=test iex -S mix
(#20). - Fix ETS-related error when calling
Mneme.start/1
multiple times (#20).
- Disable a semantic diffing optimization that caused poor diff results in certain cases, usually manifesting as incorrect branches being compared.
- More consistent formatting between
:semantic
and:text
diffs.
- 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 theMneme
module doc for more.
- Breaking: Mneme now requires Elixir v1.14 or later.
- 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.
- Improved compile-time error message when
auto_assert
is used outside of atest
block (#9).
- 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).
- Fix a bug that could cause
auto_assert
expressions to revert to the previous value when usingMneme.start(restart: true)
(#7).
- Add a
:default_pattern
configuration option for auto-assertions which controls the pattern that should be selected by default when prompted.
- When converting an auto-assertion to an ExUnit assertion, select the identical pattern when the
:default_pattern
is:infer
(set by default).
- Add a
:restart
option toMneme.start/1
to restart Mneme if called multiple times.
- Dramatically reduce the performance gap between
auto_assert
and ExUnit'sassert
.
First release.