Add fail() from bats-assert
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8f89bb1..c57df7c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,6 +9,7 @@
 ### Added
 
 - `npm` support
+- Reporting arbitrary failures with `fail()` (moved from `bats-assert`)
 
 ### Changed
 
diff --git a/README.md b/README.md
index bb8fcc1..cd3fee1 100644
--- a/README.md
+++ b/README.md
@@ -17,6 +17,7 @@
 test helper libraries written for [Bats][bats].
 
 Features:
+- [error reporting](#error-reporting)
 - [output formatting](#output-formatting)
 
 See the [shared documentation][bats-docs] to learn how to install and
@@ -27,6 +28,36 @@
 files](src).
 
 
+## Error reporting
+
+### `fail`
+
+Display an error message and fail. This function provides a convenient
+way to report failure in arbitrary situations. You can use it to
+implement your own helpers when the ones available do not meet your
+needs. Other functions use it internally as well.
+
+```bash
+@test 'fail()' {
+  fail 'this test always fails'
+}
+```
+
+The message can also be specified on the standard input.
+
+```bash
+@test 'fail() with pipe' {
+  echo 'this test always fails' | fail
+}
+```
+
+This function always fails and simply outputs the given message.
+
+```
+this test always fails
+```
+
+
 ## Output formatting
 
 Many test helpers need to produce human readable output. This library
diff --git a/load.bash b/load.bash
index 325c5b1..0d4a5ac 100644
--- a/load.bash
+++ b/load.bash
@@ -1 +1,2 @@
 source "$(dirname "${BASH_SOURCE[0]}")/src/output.bash"
+source "$(dirname "${BASH_SOURCE[0]}")/src/error.bash"
diff --git a/src/error.bash b/src/error.bash
new file mode 100644
index 0000000..e5d9791
--- /dev/null
+++ b/src/error.bash
@@ -0,0 +1,41 @@
+#
+# bats-support - Supporting library for Bats test helpers
+#
+# Written in 2016 by Zoltan Tombol <zoltan dot tombol at gmail dot com>
+#
+# To the extent possible under law, the author(s) have dedicated all
+# copyright and related and neighboring rights to this software to the
+# public domain worldwide. This software is distributed without any
+# warranty.
+#
+# You should have received a copy of the CC0 Public Domain Dedication
+# along with this software. If not, see
+# <http://creativecommons.org/publicdomain/zero/1.0/>.
+#
+
+#
+# error.bash
+# ----------
+#
+# Functions implementing error reporting. Used by public helper
+# functions or test suits directly.
+#
+
+# Fail and display a message. When no parameters are specified, the
+# message is read from the standard input. Other functions use this to
+# report failure.
+#
+# Globals:
+#   none
+# Arguments:
+#   $@ - [=STDIN] message
+# Returns:
+#   1 - always
+# Inputs:
+#   STDIN - [=$@] message
+# Outputs:
+#   STDERR - message
+fail() {
+  (( $# == 0 )) && batslib_err || batslib_err "$@"
+  return 1
+}
diff --git a/test/51-error-10-fail.bats b/test/51-error-10-fail.bats
new file mode 100755
index 0000000..1d8691a
--- /dev/null
+++ b/test/51-error-10-fail.bats
@@ -0,0 +1,16 @@
+#!/usr/bin/env bats
+
+load test_helper
+
+@test 'fail() <message>: returns 1 and displays <message>' {
+  run fail 'message'
+  [ "$status" -eq 1 ]
+  [ "$output" == 'message' ]
+}
+
+@test 'fail(): reads <message> from STDIN' {
+  run bash -c "source '${TEST_MAIN_DIR}/load.bash'
+               echo 'message' | fail"
+  [ "$status" -eq 1 ]
+  [ "$output" == 'message' ]
+}