Write smooth assertions in a fluent and readable way.
The crate is heavily inspired by AssertJ
- simple and readable syntax
- assertions based on the type of the asserted value
- assertion values use type conversion traits to make assertions readable
All asserted are stared by calling assert_that
on a value.
After that various assertions based on the type of the asserted value can be made.
use smoothy::assert_that;
assert_that(42).equals(42);
use smoothy::assert_that;
assert_that(1u8).try_into_equals(1i8);
use smoothy::assert_that;
assert_that(true).is_true();
use smoothy::assert_that;
assert_that(String::from("Hello")).equals("Hello");
use smoothy::assert_that;
assert_that("Hello World").contains_string("Hello").and().contains_string("World");
use smoothy::assert_that;
let result: Result<u8, String> = Ok(42);
assert_that(result)
.is_ok()
.and_value()
.equals(42);
use smoothy::assert_that;
let result: Result<(), String> = Err(String::from("ups!"));
assert_that(result)
.is_err()
.and_error()
.to_string()
.equals("ups!");
use smoothy::assert_that;
let option: Option<()> = None;
assert_that(option).is_none();
use smoothy::assert_that;
let option: Option<u8> = Some(1);
assert_that(option)
.is_some()
.and_value()
.equals(1);
use smoothy::assert_that;
let iterable: Vec<String> = vec![];
assert_that(iterable).is_empty();
use smoothy::assert_that;
assert_that(vec![1, 2, 3]).is_not_empty();
use smoothy::assert_that;
assert_that([1, 2, 3]).first().is(1);
use smoothy::assert_that;
assert_that([1, 2, 3]).nth(1).is(2);
stateDiagram-v2
[*] --> BasicAsserter<Assertable> : assert_that
BasicAsserter<Assertable> --> Anything
state "Assertable is any type" as Anything {
[*] --> AssertionConnector<Assertable> : is
[*] --> AssertionConnector<Assertable> : is_not
[*] --> AssertionConnector<Assertable> : equals
[*] --> AssertionConnector<Assertable> : not_equals
[*] --> AssertionConnector<Assertable> : try_into_equals
[*] --> AssertionConnector<Assertable> : try_into_not_equals
[*] --> AssertionConnector<Assertable> : map
AssertionConnector<Assertable> --> [*] : and
}
BasicAsserter<Assertable> --> Result
state "Assertable is Result<Ok, Err>" as Result {
[*] --> OkAsserter<Ok> : is_ok
OkAsserter<Ok> --> BasicAsserter<Ok> : and_value
[*] --> ErrAsserter<Err> : is_err
ErrAsserter<Err> --> BasicAsserter<Err> : and_error
}
BasicAsserter<Assertable> --> Option
state "Assertable is Option<Some>" as Option {
[*] --> [*] : is_none
[*] --> SomeAsserter<Some> : is_some
SomeAsserter<Some> --> BasicAsserter<Some> : and_value
}
BasicAsserter<Assertable> --> ImplString
state "Assertable implements ToString" as ImplString {
[*] --> BasicAsserter<String> : to_string
}
BasicAsserter<Assertable> --> ImplToBool
state "Assertable implements Into<bool>" as ImplToBool {
[*] --> BasicAsserter<bool> : is_true
[*] --> BasicAsserter<bool> : is_false
}
BasicAsserter<Assertable> --> ImplAsRefStr
state "Assertable implements AsRef<str>" as ImplAsRefStr {
[*] --> AssertionConnector<AsRef<str>> : contains
[*] --> AssertionConnector<AsRef<str>> : is_matching
AssertionConnector<AsRef<str>> --> [*] : and
}
BasicAsserter<Assertable> --> ImplIntoIter
state "Assertable implements IntoIter<Item>" as ImplIntoIter {
[*] --> [*] : is_empty
[*] --> [*] : is_not_empty
[*] --> BasicAsserter<Item>: first
[*] --> BasicAsserter<Item>: second
[*] --> BasicAsserter<Item>: third
[*] --> BasicAsserter<Item>: nth
}