Merge pull request #1213 from samalba/stdlib-bats
Bats integration in stdlib
This commit is contained in:
commit
446f593e16
@ -14,6 +14,7 @@
|
|||||||
- [azure/resourcegroup](./azure/resourcegroup.md) - -
|
- [azure/resourcegroup](./azure/resourcegroup.md) - -
|
||||||
- [azure/staticwebapp](./azure/staticwebapp.md) - -
|
- [azure/staticwebapp](./azure/staticwebapp.md) - -
|
||||||
- [azure/storage](./azure/storage.md) - -
|
- [azure/storage](./azure/storage.md) - -
|
||||||
|
- [bats](./bats.md) - -
|
||||||
- [dagger](./dagger/README.md) - Dagger core types
|
- [dagger](./dagger/README.md) - Dagger core types
|
||||||
- [dagger/engine](./dagger/engine.md) - -
|
- [dagger/engine](./dagger/engine.md) - -
|
||||||
- [dagger/op](./dagger/op.md) - op: low-level operations for Dagger processing pipelines
|
- [dagger/op](./dagger/op.md) - op: low-level operations for Dagger processing pipelines
|
||||||
|
22
docs/reference/bats.md
Normal file
22
docs/reference/bats.md
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
---
|
||||||
|
sidebar_label: bats
|
||||||
|
---
|
||||||
|
|
||||||
|
# alpha.dagger.io/bats
|
||||||
|
|
||||||
|
```cue
|
||||||
|
import "alpha.dagger.io/bats"
|
||||||
|
```
|
||||||
|
|
||||||
|
## bats.#Bats
|
||||||
|
|
||||||
|
### bats.#Bats Inputs
|
||||||
|
|
||||||
|
| Name | Type | Description |
|
||||||
|
| ------------- |:-------------: |:-------------: |
|
||||||
|
|*source* | `dagger.#Artifact` |Source containing bats files |
|
||||||
|
|*ctr.mount."/src".from* | `dagger.#Artifact` |- |
|
||||||
|
|
||||||
|
### bats.#Bats Outputs
|
||||||
|
|
||||||
|
_No output._
|
91
docs/reference/dagger/engine.md
Normal file
91
docs/reference/dagger/engine.md
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
---
|
||||||
|
sidebar_label: engine
|
||||||
|
---
|
||||||
|
|
||||||
|
# alpha.dagger.io/dagger/engine
|
||||||
|
|
||||||
|
```cue
|
||||||
|
import "alpha.dagger.io/dagger/engine"
|
||||||
|
```
|
||||||
|
|
||||||
|
## engine.#Context
|
||||||
|
|
||||||
|
### engine.#Context Inputs
|
||||||
|
|
||||||
|
_No input._
|
||||||
|
|
||||||
|
### engine.#Context Outputs
|
||||||
|
|
||||||
|
_No output._
|
||||||
|
|
||||||
|
## engine.#FS
|
||||||
|
|
||||||
|
A reference to a filesystem tree. For example: - The root filesystem of a container - A source code repository - A directory containing binary artifacts Rule of thumb: if it fits in a tar archive, it fits in a #FS.
|
||||||
|
|
||||||
|
### engine.#FS Inputs
|
||||||
|
|
||||||
|
_No input._
|
||||||
|
|
||||||
|
### engine.#FS Outputs
|
||||||
|
|
||||||
|
_No output._
|
||||||
|
|
||||||
|
## engine.#ImageConfig
|
||||||
|
|
||||||
|
Container image config. See [OCI](https://opencontainers.org/). Spec left open on purpose to account for additional fields. [Image Spec](https://github.com/opencontainers/image-spec/blob/main/specs-go/v1/config.go) [Docker Superset](https://github.com/moby/buildkit/blob/master/frontend/dockerfile/dockerfile2llb/image.go)
|
||||||
|
|
||||||
|
### engine.#ImageConfig Inputs
|
||||||
|
|
||||||
|
_No input._
|
||||||
|
|
||||||
|
### engine.#ImageConfig Outputs
|
||||||
|
|
||||||
|
_No output._
|
||||||
|
|
||||||
|
## engine.#Plan
|
||||||
|
|
||||||
|
A deployment plan executed by `dagger up`
|
||||||
|
|
||||||
|
### engine.#Plan Inputs
|
||||||
|
|
||||||
|
_No input._
|
||||||
|
|
||||||
|
### engine.#Plan Outputs
|
||||||
|
|
||||||
|
_No output._
|
||||||
|
|
||||||
|
## engine.#Pull
|
||||||
|
|
||||||
|
Download a container image from a remote repository
|
||||||
|
|
||||||
|
### engine.#Pull Inputs
|
||||||
|
|
||||||
|
_No input._
|
||||||
|
|
||||||
|
### engine.#Pull Outputs
|
||||||
|
|
||||||
|
_No output._
|
||||||
|
|
||||||
|
## engine.#Secret
|
||||||
|
|
||||||
|
A reference to an external secret, for example: - A password - A SSH private key - An API token Secrets are never merged in the Cue tree. They can only be used by a special filesystem mount designed to minimize leak risk.
|
||||||
|
|
||||||
|
### engine.#Secret Inputs
|
||||||
|
|
||||||
|
_No input._
|
||||||
|
|
||||||
|
### engine.#Secret Outputs
|
||||||
|
|
||||||
|
_No output._
|
||||||
|
|
||||||
|
## engine.#Service
|
||||||
|
|
||||||
|
A reference to a network service endpoint, for example: - A TCP or UDP port - A unix or npipe socket - An HTTPS endpoint
|
||||||
|
|
||||||
|
### engine.#Service Inputs
|
||||||
|
|
||||||
|
_No input._
|
||||||
|
|
||||||
|
### engine.#Service Outputs
|
||||||
|
|
||||||
|
_No output._
|
2
stdlib/.dagger/env/bats/.gitignore
vendored
Normal file
2
stdlib/.dagger/env/bats/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
# dagger state
|
||||||
|
state/**
|
27
stdlib/.dagger/env/bats/values.yaml
vendored
Normal file
27
stdlib/.dagger/env/bats/values.yaml
vendored
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
plan:
|
||||||
|
package: ./bats/tests
|
||||||
|
name: bats
|
||||||
|
inputs:
|
||||||
|
TestBats.source:
|
||||||
|
dir:
|
||||||
|
path: ./bats/tests/testfile
|
||||||
|
sops:
|
||||||
|
kms: []
|
||||||
|
gcp_kms: []
|
||||||
|
azure_kv: []
|
||||||
|
hc_vault: []
|
||||||
|
age:
|
||||||
|
- recipient: age1gxwmtwahzwdmrskhf90ppwlnze30lgpm056kuesrxzeuyclrwvpsupwtpk
|
||||||
|
enc: |
|
||||||
|
-----BEGIN AGE ENCRYPTED FILE-----
|
||||||
|
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBlcFZKTkhBdy95aW1uTDdq
|
||||||
|
OFdiMEtFcUt2UWY4bGR1R2RMOVhGaTc2L3drCjNyTEdjK3hDNEk5U1B6MVZqU3hn
|
||||||
|
V1BnUHRKMktEVEFlWkJvS3YyeUpSY1kKLS0tIGIxQTdRUkZmR0lPRDN1RTgxN2RE
|
||||||
|
b05uK3JiMU5Edmg2WXMvWklKWW1rYzQKXMFWBurdM3edyKq1uifIF6RXLsUaFuwP
|
||||||
|
hYwgmcFroCYdNILt0sPgzOCQntWQevZIqITqs1vhvnxNgzDOONY7tg==
|
||||||
|
-----END AGE ENCRYPTED FILE-----
|
||||||
|
lastmodified: "2021-12-14T00:03:36Z"
|
||||||
|
mac: ENC[AES256_GCM,data:4fAHWs24hyuGNjM3XryPXUPd2lPsQP4dvsjbEStrbZtlbEY7wP31W9ZfBXTeU92t1ocpEmcsqsR9ihQnBndvhyY5bXhdFglWV54K83R6xDAZjGknIPilvwtt/VkEZg2uSGvu6VO7MlX4hZlO6YJ7dN1EAQxmQW6yG6POuSchPfE=,iv:fPim6bWX7KqE0DS7bLBHanl4DX+EBBijvltKQl7fo8s=,tag:GWKAre5MzXtRjlCEH4yFIA==,type:str]
|
||||||
|
pgp: []
|
||||||
|
encrypted_suffix: secret
|
||||||
|
version: 3.7.1
|
56
stdlib/bats/bats.cue
Normal file
56
stdlib/bats/bats.cue
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
package bats
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"alpha.dagger.io/dagger"
|
||||||
|
"alpha.dagger.io/os"
|
||||||
|
"alpha.dagger.io/alpine"
|
||||||
|
)
|
||||||
|
|
||||||
|
#Bats: {
|
||||||
|
// Source containing bats files
|
||||||
|
source: dagger.#Artifact & dagger.#Input
|
||||||
|
|
||||||
|
// bats options
|
||||||
|
options: [...string]
|
||||||
|
|
||||||
|
// mount points passed to the bats container
|
||||||
|
mount: [string]: from: dagger.#Artifact
|
||||||
|
|
||||||
|
// environment variables
|
||||||
|
env: [string]: string
|
||||||
|
|
||||||
|
// socket mounts for the bats container
|
||||||
|
socket: [string]: dagger.#Stream
|
||||||
|
|
||||||
|
// setup commands to run only once (for installing dependencies)
|
||||||
|
setupCommands: [...string]
|
||||||
|
|
||||||
|
// init script to run right before bats
|
||||||
|
initScript: string | *""
|
||||||
|
|
||||||
|
defaultOptions: ["--print-output-on-failure", "--show-output-of-passing-tests"]
|
||||||
|
|
||||||
|
ctr: os.#Container & {
|
||||||
|
image: alpine.#Image & {
|
||||||
|
package: curl: true
|
||||||
|
package: bash: "~=5.1"
|
||||||
|
package: jq: "~=1.6"
|
||||||
|
package: npm: true
|
||||||
|
package: git: true
|
||||||
|
}
|
||||||
|
shell: path: "/bin/bash"
|
||||||
|
setup: ["npm install -g bats"] + setupCommands
|
||||||
|
command: #"""
|
||||||
|
\#(initScript)
|
||||||
|
bats \#(strings.Join(defaultOptions, " ")) \#(strings.Join(options, " ")) ../src
|
||||||
|
"""#
|
||||||
|
|
||||||
|
dir: "/app"
|
||||||
|
"mount": mount
|
||||||
|
"mount": "/src": from: source
|
||||||
|
"env": env
|
||||||
|
"socket": socket
|
||||||
|
}
|
||||||
|
}
|
7
stdlib/bats/tests/bats.cue
Normal file
7
stdlib/bats/tests/bats.cue
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"alpha.dagger.io/bats"
|
||||||
|
)
|
||||||
|
|
||||||
|
TestBats: bats.#Bats
|
39
stdlib/bats/tests/testfile/mods/bats-assert/CHANGELOG.md
Normal file
39
stdlib/bats/tests/testfile/mods/bats-assert/CHANGELOG.md
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
# Change Log
|
||||||
|
|
||||||
|
All notable changes to this project will be documented in this file.
|
||||||
|
This project adheres to [Semantic Versioning](http://semver.org/).
|
||||||
|
|
||||||
|
|
||||||
|
## [0.3.0] - 2016-03-22
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
- Move `fail()` to `bats-support`
|
||||||
|
|
||||||
|
|
||||||
|
## [0.2.0] - 2016-03-11
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- `refute()` to complement `assert()`
|
||||||
|
- `npm` support
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Not consuming the `--` when stopping option parsing in
|
||||||
|
`assert_output`, `refute_output`, `assert_line` and `refute_line`
|
||||||
|
|
||||||
|
|
||||||
|
## 0.1.0 - 2016-02-16
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Reporting arbitrary failures with `fail()`
|
||||||
|
- Generic assertions with `assert()` and `assert_equal()`
|
||||||
|
- Testing exit status with `assert_success()` and `assert_failure()`
|
||||||
|
- Testing output with `assert_output()` and `refute_output()`
|
||||||
|
- Testing individual lines with `assert_line()` and `refute_line()`
|
||||||
|
|
||||||
|
|
||||||
|
[0.3.0]: https://github.com/ztombol/bats-assert/compare/v0.2.0...v0.3.0
|
||||||
|
[0.2.0]: https://github.com/ztombol/bats-assert/compare/v0.1.0...v0.2.0
|
116
stdlib/bats/tests/testfile/mods/bats-assert/LICENSE
Normal file
116
stdlib/bats/tests/testfile/mods/bats-assert/LICENSE
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
CC0 1.0 Universal
|
||||||
|
|
||||||
|
Statement of Purpose
|
||||||
|
|
||||||
|
The laws of most jurisdictions throughout the world automatically confer
|
||||||
|
exclusive Copyright and Related Rights (defined below) upon the creator and
|
||||||
|
subsequent owner(s) (each and all, an "owner") of an original work of
|
||||||
|
authorship and/or a database (each, a "Work").
|
||||||
|
|
||||||
|
Certain owners wish to permanently relinquish those rights to a Work for the
|
||||||
|
purpose of contributing to a commons of creative, cultural and scientific
|
||||||
|
works ("Commons") that the public can reliably and without fear of later
|
||||||
|
claims of infringement build upon, modify, incorporate in other works, reuse
|
||||||
|
and redistribute as freely as possible in any form whatsoever and for any
|
||||||
|
purposes, including without limitation commercial purposes. These owners may
|
||||||
|
contribute to the Commons to promote the ideal of a free culture and the
|
||||||
|
further production of creative, cultural and scientific works, or to gain
|
||||||
|
reputation or greater distribution for their Work in part through the use and
|
||||||
|
efforts of others.
|
||||||
|
|
||||||
|
For these and/or other purposes and motivations, and without any expectation
|
||||||
|
of additional consideration or compensation, the person associating CC0 with a
|
||||||
|
Work (the "Affirmer"), to the extent that he or she is an owner of Copyright
|
||||||
|
and Related Rights in the Work, voluntarily elects to apply CC0 to the Work
|
||||||
|
and publicly distribute the Work under its terms, with knowledge of his or her
|
||||||
|
Copyright and Related Rights in the Work and the meaning and intended legal
|
||||||
|
effect of CC0 on those rights.
|
||||||
|
|
||||||
|
1. Copyright and Related Rights. A Work made available under CC0 may be
|
||||||
|
protected by copyright and related or neighboring rights ("Copyright and
|
||||||
|
Related Rights"). Copyright and Related Rights include, but are not limited
|
||||||
|
to, the following:
|
||||||
|
|
||||||
|
i. the right to reproduce, adapt, distribute, perform, display, communicate,
|
||||||
|
and translate a Work;
|
||||||
|
|
||||||
|
ii. moral rights retained by the original author(s) and/or performer(s);
|
||||||
|
|
||||||
|
iii. publicity and privacy rights pertaining to a person's image or likeness
|
||||||
|
depicted in a Work;
|
||||||
|
|
||||||
|
iv. rights protecting against unfair competition in regards to a Work,
|
||||||
|
subject to the limitations in paragraph 4(a), below;
|
||||||
|
|
||||||
|
v. rights protecting the extraction, dissemination, use and reuse of data in
|
||||||
|
a Work;
|
||||||
|
|
||||||
|
vi. database rights (such as those arising under Directive 96/9/EC of the
|
||||||
|
European Parliament and of the Council of 11 March 1996 on the legal
|
||||||
|
protection of databases, and under any national implementation thereof,
|
||||||
|
including any amended or successor version of such directive); and
|
||||||
|
|
||||||
|
vii. other similar, equivalent or corresponding rights throughout the world
|
||||||
|
based on applicable law or treaty, and any national implementations thereof.
|
||||||
|
|
||||||
|
2. Waiver. To the greatest extent permitted by, but not in contravention of,
|
||||||
|
applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and
|
||||||
|
unconditionally waives, abandons, and surrenders all of Affirmer's Copyright
|
||||||
|
and Related Rights and associated claims and causes of action, whether now
|
||||||
|
known or unknown (including existing as well as future claims and causes of
|
||||||
|
action), in the Work (i) in all territories worldwide, (ii) for the maximum
|
||||||
|
duration provided by applicable law or treaty (including future time
|
||||||
|
extensions), (iii) in any current or future medium and for any number of
|
||||||
|
copies, and (iv) for any purpose whatsoever, including without limitation
|
||||||
|
commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes
|
||||||
|
the Waiver for the benefit of each member of the public at large and to the
|
||||||
|
detriment of Affirmer's heirs and successors, fully intending that such Waiver
|
||||||
|
shall not be subject to revocation, rescission, cancellation, termination, or
|
||||||
|
any other legal or equitable action to disrupt the quiet enjoyment of the Work
|
||||||
|
by the public as contemplated by Affirmer's express Statement of Purpose.
|
||||||
|
|
||||||
|
3. Public License Fallback. Should any part of the Waiver for any reason be
|
||||||
|
judged legally invalid or ineffective under applicable law, then the Waiver
|
||||||
|
shall be preserved to the maximum extent permitted taking into account
|
||||||
|
Affirmer's express Statement of Purpose. In addition, to the extent the Waiver
|
||||||
|
is so judged Affirmer hereby grants to each affected person a royalty-free,
|
||||||
|
non transferable, non sublicensable, non exclusive, irrevocable and
|
||||||
|
unconditional license to exercise Affirmer's Copyright and Related Rights in
|
||||||
|
the Work (i) in all territories worldwide, (ii) for the maximum duration
|
||||||
|
provided by applicable law or treaty (including future time extensions), (iii)
|
||||||
|
in any current or future medium and for any number of copies, and (iv) for any
|
||||||
|
purpose whatsoever, including without limitation commercial, advertising or
|
||||||
|
promotional purposes (the "License"). The License shall be deemed effective as
|
||||||
|
of the date CC0 was applied by Affirmer to the Work. Should any part of the
|
||||||
|
License for any reason be judged legally invalid or ineffective under
|
||||||
|
applicable law, such partial invalidity or ineffectiveness shall not
|
||||||
|
invalidate the remainder of the License, and in such case Affirmer hereby
|
||||||
|
affirms that he or she will not (i) exercise any of his or her remaining
|
||||||
|
Copyright and Related Rights in the Work or (ii) assert any associated claims
|
||||||
|
and causes of action with respect to the Work, in either case contrary to
|
||||||
|
Affirmer's express Statement of Purpose.
|
||||||
|
|
||||||
|
4. Limitations and Disclaimers.
|
||||||
|
|
||||||
|
a. No trademark or patent rights held by Affirmer are waived, abandoned,
|
||||||
|
surrendered, licensed or otherwise affected by this document.
|
||||||
|
|
||||||
|
b. Affirmer offers the Work as-is and makes no representations or warranties
|
||||||
|
of any kind concerning the Work, express, implied, statutory or otherwise,
|
||||||
|
including without limitation warranties of title, merchantability, fitness
|
||||||
|
for a particular purpose, non infringement, or the absence of latent or
|
||||||
|
other defects, accuracy, or the present or absence of errors, whether or not
|
||||||
|
discoverable, all to the greatest extent permissible under applicable law.
|
||||||
|
|
||||||
|
c. Affirmer disclaims responsibility for clearing rights of other persons
|
||||||
|
that may apply to the Work or any use thereof, including without limitation
|
||||||
|
any person's Copyright and Related Rights in the Work. Further, Affirmer
|
||||||
|
disclaims responsibility for obtaining any necessary consents, permissions
|
||||||
|
or other rights required for any use of the Work.
|
||||||
|
|
||||||
|
d. Affirmer understands and acknowledges that Creative Commons is not a
|
||||||
|
party to this document and has no duty or obligation with respect to this
|
||||||
|
CC0 or use of the Work.
|
||||||
|
|
||||||
|
For more information, please see
|
||||||
|
<http://creativecommons.org/publicdomain/zero/1.0/>
|
712
stdlib/bats/tests/testfile/mods/bats-assert/README.md
Normal file
712
stdlib/bats/tests/testfile/mods/bats-assert/README.md
Normal file
@ -0,0 +1,712 @@
|
|||||||
|
# bats-assert
|
||||||
|
|
||||||
|
[![License](https://img.shields.io/npm/l/bats-assert.svg)](https://github.com/jasonkarns/bats-assert-1/blob/master/LICENSE)
|
||||||
|
[![GitHub release](https://img.shields.io/github/release/jasonkarns/bats-assert-1.svg)](https://github.com/jasonkarns/bats-assert-1/releases)
|
||||||
|
[![npm release](https://img.shields.io/npm/v/bats-assert.svg)](https://www.npmjs.com/package/bats-assert)
|
||||||
|
[![Build Status](https://travis-ci.org/jasonkarns/bats-assert-1.svg?branch=master)](https://travis-ci.org/jasonkarns/bats-assert-1)
|
||||||
|
|
||||||
|
`bats-assert` is a helper library providing common assertions for
|
||||||
|
[Bats][bats].
|
||||||
|
|
||||||
|
Assertions are functions that perform a test and output relevant
|
||||||
|
information on failure to help debugging. They return 1 on failure and 0
|
||||||
|
otherwise. Output, [formatted][bats-support-output] for readability, is
|
||||||
|
sent to the standard error to make assertions usable outside of `@test`
|
||||||
|
blocks too.
|
||||||
|
|
||||||
|
Assertions testing exit code and output operate on the results of the
|
||||||
|
most recent invocation of `run`.
|
||||||
|
|
||||||
|
Dependencies:
|
||||||
|
- [`bats-support`][bats-support] (formerly `bats-core`) - output
|
||||||
|
formatting
|
||||||
|
|
||||||
|
See the [shared documentation][bats-docs] to learn how to install and
|
||||||
|
load this library.
|
||||||
|
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
### `assert`
|
||||||
|
|
||||||
|
Fail if the given expression evaluates to false.
|
||||||
|
|
||||||
|
***Note:*** *The expression must be a simple command. [Compound
|
||||||
|
commands][bash-comp-cmd], such as `[[`, can be used only when executed
|
||||||
|
with `bash -c`.*
|
||||||
|
|
||||||
|
```bash
|
||||||
|
@test 'assert()' {
|
||||||
|
touch '/var/log/test.log'
|
||||||
|
assert [ -e '/var/log/test.log' ]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
On failure, the failed expression is displayed.
|
||||||
|
|
||||||
|
```
|
||||||
|
-- assertion failed --
|
||||||
|
expression : [ -e /var/log/test.log ]
|
||||||
|
--
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### `refute`
|
||||||
|
|
||||||
|
Fail if the given expression evaluates to true.
|
||||||
|
|
||||||
|
***Note:*** *The expression must be a simple command. [Compound
|
||||||
|
commands][bash-comp-cmd], such as `[[`, can be used only when executed
|
||||||
|
with `bash -c`.*
|
||||||
|
|
||||||
|
```bash
|
||||||
|
@test 'refute()' {
|
||||||
|
rm -f '/var/log/test.log'
|
||||||
|
refute [ -e '/var/log/test.log' ]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
On failure, the successful expression is displayed.
|
||||||
|
|
||||||
|
```
|
||||||
|
-- assertion succeeded, but it was expected to fail --
|
||||||
|
expression : [ -e /var/log/test.log ]
|
||||||
|
--
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### `assert_equal`
|
||||||
|
|
||||||
|
Fail if the two parameters, actual and expected value respectively, do
|
||||||
|
not equal.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
@test 'assert_equal()' {
|
||||||
|
assert_equal 'have' 'want'
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
On failure, the expected and actual values are displayed.
|
||||||
|
|
||||||
|
```
|
||||||
|
-- values do not equal --
|
||||||
|
expected : want
|
||||||
|
actual : have
|
||||||
|
--
|
||||||
|
```
|
||||||
|
|
||||||
|
If either value is longer than one line both are displayed in
|
||||||
|
*multi-line* format.
|
||||||
|
|
||||||
|
|
||||||
|
### `assert_success`
|
||||||
|
|
||||||
|
Fail if `$status` is not 0.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
@test 'assert_success() status only' {
|
||||||
|
run bash -c "echo 'Error!'; exit 1"
|
||||||
|
assert_success
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
On failure, `$status` and `$output` are displayed.
|
||||||
|
|
||||||
|
```
|
||||||
|
-- command failed --
|
||||||
|
status : 1
|
||||||
|
output : Error!
|
||||||
|
--
|
||||||
|
```
|
||||||
|
|
||||||
|
If `$output` is longer than one line, it is displayed in *multi-line*
|
||||||
|
format.
|
||||||
|
|
||||||
|
|
||||||
|
### `assert_failure`
|
||||||
|
|
||||||
|
Fail if `$status` is 0.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
@test 'assert_failure() status only' {
|
||||||
|
run echo 'Success!'
|
||||||
|
assert_failure
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
On failure, `$output` is displayed.
|
||||||
|
|
||||||
|
```
|
||||||
|
-- command succeeded, but it was expected to fail --
|
||||||
|
output : Success!
|
||||||
|
--
|
||||||
|
```
|
||||||
|
|
||||||
|
If `$output` is longer than one line, it is displayed in *multi-line*
|
||||||
|
format.
|
||||||
|
|
||||||
|
#### Expected status
|
||||||
|
|
||||||
|
When one parameter is specified, fail if `$status` does not equal the
|
||||||
|
expected status specified by the parameter.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
@test 'assert_failure() with expected status' {
|
||||||
|
run bash -c "echo 'Error!'; exit 1"
|
||||||
|
assert_failure 2
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
On failure, the expected and actual status, and `$output` are displayed.
|
||||||
|
|
||||||
|
```
|
||||||
|
-- command failed as expected, but status differs --
|
||||||
|
expected : 2
|
||||||
|
actual : 1
|
||||||
|
output : Error!
|
||||||
|
--
|
||||||
|
```
|
||||||
|
|
||||||
|
If `$output` is longer than one line, it is displayed in *multi-line*
|
||||||
|
format.
|
||||||
|
|
||||||
|
|
||||||
|
### `assert_output`
|
||||||
|
|
||||||
|
This function helps to verify that a command or function produces the
|
||||||
|
correct output by checking that the specified expected output matches
|
||||||
|
the actual output. Matching can be literal (default), partial or regular
|
||||||
|
expression. This function is the logical complement of `refute_output`.
|
||||||
|
|
||||||
|
#### Literal matching
|
||||||
|
|
||||||
|
By default, literal matching is performed. The assertion fails if
|
||||||
|
`$output` does not equal the expected output.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
@test 'assert_output()' {
|
||||||
|
run echo 'have'
|
||||||
|
assert_output 'want'
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
On failure, the expected and actual output are displayed.
|
||||||
|
|
||||||
|
```
|
||||||
|
-- output differs --
|
||||||
|
expected : want
|
||||||
|
actual : have
|
||||||
|
--
|
||||||
|
```
|
||||||
|
|
||||||
|
If either value is longer than one line both are displayed in
|
||||||
|
*multi-line* format.
|
||||||
|
|
||||||
|
#### Existence
|
||||||
|
|
||||||
|
To assert that any (non-empty) output exists at all, simply omit the matching
|
||||||
|
argument.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
@test 'assert_output()' {
|
||||||
|
run echo 'have'
|
||||||
|
assert_output
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
On failure, an error message is displayed.
|
||||||
|
|
||||||
|
```
|
||||||
|
-- no output --
|
||||||
|
expected non-empty output, but output was empty
|
||||||
|
--
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Partial matching
|
||||||
|
|
||||||
|
Partial matching can be enabled with the `--partial` option (`-p` for
|
||||||
|
short). When used, the assertion fails if the expected *substring* is
|
||||||
|
not found in `$output`.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
@test 'assert_output() partial matching' {
|
||||||
|
run echo 'ERROR: no such file or directory'
|
||||||
|
assert_output --partial 'SUCCESS'
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
On failure, the substring and the output are displayed.
|
||||||
|
|
||||||
|
```
|
||||||
|
-- output does not contain substring --
|
||||||
|
substring : SUCCESS
|
||||||
|
output : ERROR: no such file or directory
|
||||||
|
--
|
||||||
|
```
|
||||||
|
|
||||||
|
This option and regular expression matching (`--regexp` or `-e`) are
|
||||||
|
mutually exclusive. An error is displayed when used simultaneously.
|
||||||
|
|
||||||
|
#### Regular expression matching
|
||||||
|
|
||||||
|
Regular expression matching can be enabled with the `--regexp` option
|
||||||
|
(`-e` for short). When used, the assertion fails if the *extended
|
||||||
|
regular expression* does not match `$output`.
|
||||||
|
|
||||||
|
*Note: The anchors `^` and `$` bind to the beginning and the end of the
|
||||||
|
entire output (not individual lines), respectively.*
|
||||||
|
|
||||||
|
```bash
|
||||||
|
@test 'assert_output() regular expression matching' {
|
||||||
|
run echo 'Foobar 0.1.0'
|
||||||
|
assert_output --regexp '^Foobar v[0-9]+\.[0-9]+\.[0-9]$'
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
On failure, the regular expression and the output are displayed.
|
||||||
|
|
||||||
|
```
|
||||||
|
-- regular expression does not match output --
|
||||||
|
regexp : ^Foobar v[0-9]+\.[0-9]+\.[0-9]$
|
||||||
|
output : Foobar 0.1.0
|
||||||
|
--
|
||||||
|
```
|
||||||
|
|
||||||
|
An error is displayed if the specified extended regular expression is
|
||||||
|
invalid.
|
||||||
|
|
||||||
|
This option and partial matching (`--partial` or `-p`) are mutually
|
||||||
|
exclusive. An error is displayed when used simultaneously.
|
||||||
|
|
||||||
|
#### Standard Input, HereDocs and HereStrings
|
||||||
|
|
||||||
|
The expected output can be specified via standard input (also
|
||||||
|
heredoc/herestring) with the `-`/`--stdin` option.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
@test 'assert_output() with pipe' {
|
||||||
|
run echo 'hello'
|
||||||
|
echo 'hello' | assert_output -
|
||||||
|
}
|
||||||
|
|
||||||
|
@test 'assert_output() with herestring' {
|
||||||
|
run echo 'hello'
|
||||||
|
assert_output - <<< hello
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### `refute_output`
|
||||||
|
|
||||||
|
This function helps to verify that a command or function produces the
|
||||||
|
correct output by checking that the specified unexpected output does not
|
||||||
|
match the actual output. Matching can be literal (default), partial or
|
||||||
|
regular expression. This function is the logical complement of
|
||||||
|
`assert_output`.
|
||||||
|
|
||||||
|
#### Literal matching
|
||||||
|
|
||||||
|
By default, literal matching is performed. The assertion fails if
|
||||||
|
`$output` equals the unexpected output.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
@test 'refute_output()' {
|
||||||
|
run echo 'want'
|
||||||
|
refute_output 'want'
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
On failure, the output is displayed.
|
||||||
|
|
||||||
|
```
|
||||||
|
-- output equals, but it was expected to differ --
|
||||||
|
output : want
|
||||||
|
--
|
||||||
|
```
|
||||||
|
|
||||||
|
If output is longer than one line it is displayed in *multi-line*
|
||||||
|
format.
|
||||||
|
|
||||||
|
#### Existence
|
||||||
|
|
||||||
|
To assert that there is no output at all, simply omit the matching argument.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
@test 'refute_output()' {
|
||||||
|
run foo --silent
|
||||||
|
refute_output
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
On failure, an error message is displayed.
|
||||||
|
|
||||||
|
```
|
||||||
|
-- unexpected output --
|
||||||
|
expected no output, but output was non-empty
|
||||||
|
--
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Partial matching
|
||||||
|
|
||||||
|
Partial matching can be enabled with the `--partial` option (`-p` for
|
||||||
|
short). When used, the assertion fails if the unexpected *substring* is
|
||||||
|
found in `$output`.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
@test 'refute_output() partial matching' {
|
||||||
|
run echo 'ERROR: no such file or directory'
|
||||||
|
refute_output --partial 'ERROR'
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
On failure, the substring and the output are displayed.
|
||||||
|
|
||||||
|
```
|
||||||
|
-- output should not contain substring --
|
||||||
|
substring : ERROR
|
||||||
|
output : ERROR: no such file or directory
|
||||||
|
--
|
||||||
|
```
|
||||||
|
|
||||||
|
This option and regular expression matching (`--regexp` or `-e`) are
|
||||||
|
mutually exclusive. An error is displayed when used simultaneously.
|
||||||
|
|
||||||
|
#### Regular expression matching
|
||||||
|
|
||||||
|
Regular expression matching can be enabled with the `--regexp` option
|
||||||
|
(`-e` for short). When used, the assertion fails if the *extended
|
||||||
|
regular expression* matches `$output`.
|
||||||
|
|
||||||
|
*Note: The anchors `^` and `$` bind to the beginning and the end of the
|
||||||
|
entire output (not individual lines), respectively.*
|
||||||
|
|
||||||
|
```bash
|
||||||
|
@test 'refute_output() regular expression matching' {
|
||||||
|
run echo 'Foobar v0.1.0'
|
||||||
|
refute_output --regexp '^Foobar v[0-9]+\.[0-9]+\.[0-9]$'
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
On failure, the regular expression and the output are displayed.
|
||||||
|
|
||||||
|
```
|
||||||
|
-- regular expression should not match output --
|
||||||
|
regexp : ^Foobar v[0-9]+\.[0-9]+\.[0-9]$
|
||||||
|
output : Foobar v0.1.0
|
||||||
|
--
|
||||||
|
```
|
||||||
|
|
||||||
|
An error is displayed if the specified extended regular expression is
|
||||||
|
invalid.
|
||||||
|
|
||||||
|
This option and partial matching (`--partial` or `-p`) are mutually
|
||||||
|
exclusive. An error is displayed when used simultaneously.
|
||||||
|
|
||||||
|
#### Standard Input, HereDocs and HereStrings
|
||||||
|
|
||||||
|
The unexpected output can be specified via standard input (also
|
||||||
|
heredoc/herestring) with the `-`/`--stdin` option.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
@test 'refute_output() with pipe' {
|
||||||
|
run echo 'hello'
|
||||||
|
echo 'world' | refute_output -
|
||||||
|
}
|
||||||
|
|
||||||
|
@test 'refute_output() with herestring' {
|
||||||
|
run echo 'hello'
|
||||||
|
refute_output - <<< world
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### `assert_line`
|
||||||
|
|
||||||
|
Similarly to `assert_output`, this function helps to verify that a
|
||||||
|
command or function produces the correct output. It checks that the
|
||||||
|
expected line appears in the output (default) or in a specific line of
|
||||||
|
it. Matching can be literal (default), partial or regular expression.
|
||||||
|
This function is the logical complement of `refute_line`.
|
||||||
|
|
||||||
|
***Warning:*** *Due to a [bug in Bats][bats-93], empty lines are
|
||||||
|
discarded from `${lines[@]}`, causing line indices to change and
|
||||||
|
preventing testing for empty lines.*
|
||||||
|
|
||||||
|
[bats-93]: https://github.com/sstephenson/bats/pull/93
|
||||||
|
|
||||||
|
#### Looking for a line in the output
|
||||||
|
|
||||||
|
By default, the entire output is searched for the expected line. The
|
||||||
|
assertion fails if the expected line is not found in `${lines[@]}`.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
@test 'assert_line() looking for line' {
|
||||||
|
run echo $'have-0\nhave-1\nhave-2'
|
||||||
|
assert_line 'want'
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
On failure, the expected line and the output are displayed.
|
||||||
|
|
||||||
|
***Warning:*** *The output displayed does not contain empty lines. See
|
||||||
|
the Warning above for more.*
|
||||||
|
|
||||||
|
```
|
||||||
|
-- output does not contain line --
|
||||||
|
line : want
|
||||||
|
output (3 lines):
|
||||||
|
have-0
|
||||||
|
have-1
|
||||||
|
have-2
|
||||||
|
--
|
||||||
|
```
|
||||||
|
|
||||||
|
If output is not longer than one line, it is displayed in *two-column*
|
||||||
|
format.
|
||||||
|
|
||||||
|
#### Matching a specific line
|
||||||
|
|
||||||
|
When the `--index <idx>` option is used (`-n <idx>` for short) , the
|
||||||
|
expected line is matched only against the line identified by the given
|
||||||
|
index. The assertion fails if the expected line does not equal
|
||||||
|
`${lines[<idx>]}`.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
@test 'assert_line() specific line' {
|
||||||
|
run echo $'have-0\nhave-1\nhave-2'
|
||||||
|
assert_line --index 1 'want-1'
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
On failure, the index and the compared lines are displayed.
|
||||||
|
|
||||||
|
```
|
||||||
|
-- line differs --
|
||||||
|
index : 1
|
||||||
|
expected : want-1
|
||||||
|
actual : have-1
|
||||||
|
--
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Partial matching
|
||||||
|
|
||||||
|
Partial matching can be enabled with the `--partial` option (`-p` for
|
||||||
|
short). When used, a match fails if the expected *substring* is not
|
||||||
|
found in the matched line.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
@test 'assert_line() partial matching' {
|
||||||
|
run echo $'have 1\nhave 2\nhave 3'
|
||||||
|
assert_line --partial 'want'
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
On failure, the same details are displayed as for literal matching,
|
||||||
|
except that the substring replaces the expected line.
|
||||||
|
|
||||||
|
```
|
||||||
|
-- no output line contains substring --
|
||||||
|
substring : want
|
||||||
|
output (3 lines):
|
||||||
|
have 1
|
||||||
|
have 2
|
||||||
|
have 3
|
||||||
|
--
|
||||||
|
```
|
||||||
|
|
||||||
|
This option and regular expression matching (`--regexp` or `-e`) are
|
||||||
|
mutually exclusive. An error is displayed when used simultaneously.
|
||||||
|
|
||||||
|
#### Regular expression matching
|
||||||
|
|
||||||
|
Regular expression matching can be enabled with the `--regexp` option
|
||||||
|
(`-e` for short). When used, a match fails if the *extended regular
|
||||||
|
expression* does not match the line being tested.
|
||||||
|
|
||||||
|
*Note: As expected, the anchors `^` and `$` bind to the beginning and
|
||||||
|
the end of the matched line, respectively.*
|
||||||
|
|
||||||
|
```bash
|
||||||
|
@test 'assert_line() regular expression matching' {
|
||||||
|
run echo $'have-0\nhave-1\nhave-2'
|
||||||
|
assert_line --index 1 --regexp '^want-[0-9]$'
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
On failure, the same details are displayed as for literal matching,
|
||||||
|
except that the regular expression replaces the expected line.
|
||||||
|
|
||||||
|
```
|
||||||
|
-- regular expression does not match line --
|
||||||
|
index : 1
|
||||||
|
regexp : ^want-[0-9]$
|
||||||
|
line : have-1
|
||||||
|
--
|
||||||
|
```
|
||||||
|
|
||||||
|
An error is displayed if the specified extended regular expression is
|
||||||
|
invalid.
|
||||||
|
|
||||||
|
This option and partial matching (`--partial` or `-p`) are mutually
|
||||||
|
exclusive. An error is displayed when used simultaneously.
|
||||||
|
|
||||||
|
|
||||||
|
### `refute_line`
|
||||||
|
|
||||||
|
Similarly to `refute_output`, this function helps to verify that a
|
||||||
|
command or function produces the correct output. It checks that the
|
||||||
|
unexpected line does not appear in the output (default) or in a specific
|
||||||
|
line of it. Matching can be literal (default), partial or regular
|
||||||
|
expression. This function is the logical complement of `assert_line`.
|
||||||
|
|
||||||
|
***Warning:*** *Due to a [bug in Bats][bats-93], empty lines are
|
||||||
|
discarded from `${lines[@]}`, causing line indices to change and
|
||||||
|
preventing testing for empty lines.*
|
||||||
|
|
||||||
|
[bats-93]: https://github.com/sstephenson/bats/pull/93
|
||||||
|
|
||||||
|
#### Looking for a line in the output
|
||||||
|
|
||||||
|
By default, the entire output is searched for the unexpected line. The
|
||||||
|
assertion fails if the unexpected line is found in `${lines[@]}`.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
@test 'refute_line() looking for line' {
|
||||||
|
run echo $'have-0\nwant\nhave-2'
|
||||||
|
refute_line 'want'
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
On failure, the unexpected line, the index of its first match and the
|
||||||
|
output with the matching line highlighted are displayed.
|
||||||
|
|
||||||
|
***Warning:*** *The output displayed does not contain empty lines. See
|
||||||
|
the Warning above for more.*
|
||||||
|
|
||||||
|
```
|
||||||
|
-- line should not be in output --
|
||||||
|
line : want
|
||||||
|
index : 1
|
||||||
|
output (3 lines):
|
||||||
|
have-0
|
||||||
|
> want
|
||||||
|
have-2
|
||||||
|
--
|
||||||
|
```
|
||||||
|
|
||||||
|
If output is not longer than one line, it is displayed in *two-column*
|
||||||
|
format.
|
||||||
|
|
||||||
|
#### Matching a specific line
|
||||||
|
|
||||||
|
When the `--index <idx>` option is used (`-n <idx>` for short) , the
|
||||||
|
unexpected line is matched only against the line identified by the given
|
||||||
|
index. The assertion fails if the unexpected line equals
|
||||||
|
`${lines[<idx>]}`.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
@test 'refute_line() specific line' {
|
||||||
|
run echo $'have-0\nwant-1\nhave-2'
|
||||||
|
refute_line --index 1 'want-1'
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
On failure, the index and the unexpected line are displayed.
|
||||||
|
|
||||||
|
```
|
||||||
|
-- line should differ --
|
||||||
|
index : 1
|
||||||
|
line : want-1
|
||||||
|
--
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Partial matching
|
||||||
|
|
||||||
|
Partial matching can be enabled with the `--partial` option (`-p` for
|
||||||
|
short). When used, a match fails if the unexpected *substring* is found
|
||||||
|
in the matched line.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
@test 'refute_line() partial matching' {
|
||||||
|
run echo $'have 1\nwant 2\nhave 3'
|
||||||
|
refute_line --partial 'want'
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
On failure, in addition to the details of literal matching, the
|
||||||
|
substring is also displayed. When used with `--index <idx>` the
|
||||||
|
substring replaces the unexpected line.
|
||||||
|
|
||||||
|
```
|
||||||
|
-- no line should contain substring --
|
||||||
|
substring : want
|
||||||
|
index : 1
|
||||||
|
output (3 lines):
|
||||||
|
have 1
|
||||||
|
> want 2
|
||||||
|
have 3
|
||||||
|
--
|
||||||
|
```
|
||||||
|
|
||||||
|
This option and regular expression matching (`--regexp` or `-e`) are
|
||||||
|
mutually exclusive. An error is displayed when used simultaneously.
|
||||||
|
|
||||||
|
#### Regular expression matching
|
||||||
|
|
||||||
|
Regular expression matching can be enabled with the `--regexp` option
|
||||||
|
(`-e` for short). When used, a match fails if the *extended regular
|
||||||
|
expression* matches the line being tested.
|
||||||
|
|
||||||
|
*Note: As expected, the anchors `^` and `$` bind to the beginning and
|
||||||
|
the end of the matched line, respectively.*
|
||||||
|
|
||||||
|
```bash
|
||||||
|
@test 'refute_line() regular expression matching' {
|
||||||
|
run echo $'Foobar v0.1.0\nRelease date: 2015-11-29'
|
||||||
|
refute_line --index 0 --regexp '^Foobar v[0-9]+\.[0-9]+\.[0-9]$'
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
On failure, in addition to the details of literal matching, the regular
|
||||||
|
expression is also displayed. When used with `--index <idx>` the regular
|
||||||
|
expression replaces the unexpected line.
|
||||||
|
|
||||||
|
```
|
||||||
|
-- regular expression should not match line --
|
||||||
|
index : 0
|
||||||
|
regexp : ^Foobar v[0-9]+\.[0-9]+\.[0-9]$
|
||||||
|
line : Foobar v0.1.0
|
||||||
|
--
|
||||||
|
```
|
||||||
|
|
||||||
|
An error is displayed if the specified extended regular expression is
|
||||||
|
invalid.
|
||||||
|
|
||||||
|
This option and partial matching (`--partial` or `-p`) are mutually
|
||||||
|
exclusive. An error is displayed when used simultaneously.
|
||||||
|
|
||||||
|
|
||||||
|
## Options
|
||||||
|
|
||||||
|
For functions that have options, `--` disables option parsing for the
|
||||||
|
remaining arguments to allow using arguments identical to one of the
|
||||||
|
allowed options.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
assert_output -- '-p'
|
||||||
|
```
|
||||||
|
|
||||||
|
Specifying `--` as an argument is similarly simple.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
refute_line -- '--'
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
<!-- REFERENCES -->
|
||||||
|
|
||||||
|
[bats]: https://github.com/sstephenson/bats
|
||||||
|
[bats-support-output]: https://github.com/ztombol/bats-support#output-formatting
|
||||||
|
[bats-support]: https://github.com/ztombol/bats-support
|
||||||
|
[bats-docs]: https://github.com/ztombol/bats-docs
|
||||||
|
[bash-comp-cmd]: https://www.gnu.org/software/bash/manual/bash.html#Compound-Commands
|
1
stdlib/bats/tests/testfile/mods/bats-assert/load.bash
Normal file
1
stdlib/bats/tests/testfile/mods/bats-assert/load.bash
Normal file
@ -0,0 +1 @@
|
|||||||
|
source "$(dirname "${BASH_SOURCE[0]}")/src/assert.bash"
|
47
stdlib/bats/tests/testfile/mods/bats-assert/package.json
Normal file
47
stdlib/bats/tests/testfile/mods/bats-assert/package.json
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
{
|
||||||
|
"name": "bats-assert",
|
||||||
|
"version": "2.0.0",
|
||||||
|
"description": "Common assertions for Bats",
|
||||||
|
"homepage": "https://github.com/jasonkarns/bats-assert-1",
|
||||||
|
"license": "CC0-1.0",
|
||||||
|
"contributors": [
|
||||||
|
"Zoltán Tömböl (https://github.com/ztombol)",
|
||||||
|
"Sam Stephenson <sstephenson@gmail.com> (http://sstephenson.us/)",
|
||||||
|
"Jason Karns <jason.karns@gmail.com> (http://jason.karns.name)",
|
||||||
|
"Mislav Marohnić <mislav.marohnic@gmail.com> (http://mislav.net/)",
|
||||||
|
"Tim Pope (https://github.com/tpope)"
|
||||||
|
],
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/jasonkarns/bats-assert-1.git"
|
||||||
|
},
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/jasonkarns/bats-assert-1/issues"
|
||||||
|
},
|
||||||
|
"directories": {
|
||||||
|
"lib": "src",
|
||||||
|
"test": "test"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"load.bash",
|
||||||
|
"src"
|
||||||
|
],
|
||||||
|
"scripts": {
|
||||||
|
"postversion": "npm publish",
|
||||||
|
"prepublishOnly": "npm run publish:github",
|
||||||
|
"publish:github": "git push --follow-tags"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"bats-support": "git+https://github.com/ztombol/bats-support.git#v0.2.0"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"bats",
|
||||||
|
"bash",
|
||||||
|
"shell",
|
||||||
|
"test",
|
||||||
|
"unit",
|
||||||
|
"assert",
|
||||||
|
"assertion",
|
||||||
|
"helper"
|
||||||
|
]
|
||||||
|
}
|
755
stdlib/bats/tests/testfile/mods/bats-assert/src/assert.bash
Normal file
755
stdlib/bats/tests/testfile/mods/bats-assert/src/assert.bash
Normal file
@ -0,0 +1,755 @@
|
|||||||
|
#
|
||||||
|
# bats-assert - Common assertions for Bats
|
||||||
|
#
|
||||||
|
# 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/>.
|
||||||
|
#
|
||||||
|
|
||||||
|
#
|
||||||
|
# assert.bash
|
||||||
|
# -----------
|
||||||
|
#
|
||||||
|
# Assertions are functions that perform a test and output relevant
|
||||||
|
# information on failure to help debugging. They return 1 on failure
|
||||||
|
# and 0 otherwise.
|
||||||
|
#
|
||||||
|
# All output is formatted for readability using the functions of
|
||||||
|
# `output.bash' and sent to the standard error.
|
||||||
|
#
|
||||||
|
|
||||||
|
# Fail and display the expression if it evaluates to false.
|
||||||
|
#
|
||||||
|
# NOTE: The expression must be a simple command. Compound commands, such
|
||||||
|
# as `[[', can be used only when executed with `bash -c'.
|
||||||
|
#
|
||||||
|
# Globals:
|
||||||
|
# none
|
||||||
|
# Arguments:
|
||||||
|
# $1 - expression
|
||||||
|
# Returns:
|
||||||
|
# 0 - expression evaluates to TRUE
|
||||||
|
# 1 - otherwise
|
||||||
|
# Outputs:
|
||||||
|
# STDERR - details, on failure
|
||||||
|
assert() {
|
||||||
|
if ! "$@"; then
|
||||||
|
batslib_print_kv_single 10 'expression' "$*" \
|
||||||
|
| batslib_decorate 'assertion failed' \
|
||||||
|
| fail
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Fail and display the expression if it evaluates to true.
|
||||||
|
#
|
||||||
|
# NOTE: The expression must be a simple command. Compound commands, such
|
||||||
|
# as `[[', can be used only when executed with `bash -c'.
|
||||||
|
#
|
||||||
|
# Globals:
|
||||||
|
# none
|
||||||
|
# Arguments:
|
||||||
|
# $1 - expression
|
||||||
|
# Returns:
|
||||||
|
# 0 - expression evaluates to FALSE
|
||||||
|
# 1 - otherwise
|
||||||
|
# Outputs:
|
||||||
|
# STDERR - details, on failure
|
||||||
|
refute() {
|
||||||
|
if "$@"; then
|
||||||
|
batslib_print_kv_single 10 'expression' "$*" \
|
||||||
|
| batslib_decorate 'assertion succeeded, but it was expected to fail' \
|
||||||
|
| fail
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Fail and display details if the expected and actual values do not
|
||||||
|
# equal. Details include both values.
|
||||||
|
#
|
||||||
|
# Globals:
|
||||||
|
# none
|
||||||
|
# Arguments:
|
||||||
|
# $1 - actual value
|
||||||
|
# $2 - expected value
|
||||||
|
# Returns:
|
||||||
|
# 0 - values equal
|
||||||
|
# 1 - otherwise
|
||||||
|
# Outputs:
|
||||||
|
# STDERR - details, on failure
|
||||||
|
assert_equal() {
|
||||||
|
if [[ $1 != "$2" ]]; then
|
||||||
|
batslib_print_kv_single_or_multi 8 \
|
||||||
|
'expected' "$2" \
|
||||||
|
'actual' "$1" \
|
||||||
|
| batslib_decorate 'values do not equal' \
|
||||||
|
| fail
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Fail and display details if `$status' is not 0. Details include
|
||||||
|
# `$status' and `$output'.
|
||||||
|
#
|
||||||
|
# Globals:
|
||||||
|
# status
|
||||||
|
# output
|
||||||
|
# Arguments:
|
||||||
|
# none
|
||||||
|
# Returns:
|
||||||
|
# 0 - `$status' is 0
|
||||||
|
# 1 - otherwise
|
||||||
|
# Outputs:
|
||||||
|
# STDERR - details, on failure
|
||||||
|
assert_success() {
|
||||||
|
if (( status != 0 )); then
|
||||||
|
{ local -ir width=6
|
||||||
|
batslib_print_kv_single "$width" 'status' "$status"
|
||||||
|
batslib_print_kv_single_or_multi "$width" 'output' "$output"
|
||||||
|
} | batslib_decorate 'command failed' \
|
||||||
|
| fail
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Fail and display details if `$status' is 0. Details include `$output'.
|
||||||
|
#
|
||||||
|
# Optionally, when the expected status is specified, fail when it does
|
||||||
|
# not equal `$status'. In this case, details include the expected and
|
||||||
|
# actual status, and `$output'.
|
||||||
|
#
|
||||||
|
# Globals:
|
||||||
|
# status
|
||||||
|
# output
|
||||||
|
# Arguments:
|
||||||
|
# $1 - [opt] expected status
|
||||||
|
# Returns:
|
||||||
|
# 0 - `$status' is not 0, or
|
||||||
|
# `$status' equals the expected status
|
||||||
|
# 1 - otherwise
|
||||||
|
# Outputs:
|
||||||
|
# STDERR - details, on failure
|
||||||
|
assert_failure() {
|
||||||
|
(( $# > 0 )) && local -r expected="$1"
|
||||||
|
if (( status == 0 )); then
|
||||||
|
batslib_print_kv_single_or_multi 6 'output' "$output" \
|
||||||
|
| batslib_decorate 'command succeeded, but it was expected to fail' \
|
||||||
|
| fail
|
||||||
|
elif (( $# > 0 )) && (( status != expected )); then
|
||||||
|
{ local -ir width=8
|
||||||
|
batslib_print_kv_single "$width" \
|
||||||
|
'expected' "$expected" \
|
||||||
|
'actual' "$status"
|
||||||
|
batslib_print_kv_single_or_multi "$width" \
|
||||||
|
'output' "$output"
|
||||||
|
} | batslib_decorate 'command failed as expected, but status differs' \
|
||||||
|
| fail
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Fail and display details if `$output' does not match the expected
|
||||||
|
# output. The expected output can be specified either by the first
|
||||||
|
# parameter or on the standard input.
|
||||||
|
#
|
||||||
|
# By default, literal matching is performed. The assertion fails if the
|
||||||
|
# expected output does not equal `$output'. Details include both values.
|
||||||
|
#
|
||||||
|
# Option `--partial' enables partial matching. The assertion fails if
|
||||||
|
# the expected substring cannot be found in `$output'.
|
||||||
|
#
|
||||||
|
# Option `--regexp' enables regular expression matching. The assertion
|
||||||
|
# fails if the extended regular expression does not match `$output'. An
|
||||||
|
# invalid regular expression causes an error to be displayed.
|
||||||
|
#
|
||||||
|
# It is an error to use partial and regular expression matching
|
||||||
|
# simultaneously.
|
||||||
|
#
|
||||||
|
# Globals:
|
||||||
|
# output
|
||||||
|
# Options:
|
||||||
|
# -p, --partial - partial matching
|
||||||
|
# -e, --regexp - extended regular expression matching
|
||||||
|
# -, --stdin - read expected output from the standard input
|
||||||
|
# Arguments:
|
||||||
|
# $1 - expected output
|
||||||
|
# Returns:
|
||||||
|
# 0 - expected matches the actual output
|
||||||
|
# 1 - otherwise
|
||||||
|
# Inputs:
|
||||||
|
# STDIN - [=$1] expected output
|
||||||
|
# Outputs:
|
||||||
|
# STDERR - details, on failure
|
||||||
|
# error message, on error
|
||||||
|
assert_output() {
|
||||||
|
local -i is_mode_partial=0
|
||||||
|
local -i is_mode_regexp=0
|
||||||
|
local -i is_mode_nonempty=0
|
||||||
|
local -i use_stdin=0
|
||||||
|
|
||||||
|
# Handle options.
|
||||||
|
if (( $# == 0 )); then
|
||||||
|
is_mode_nonempty=1
|
||||||
|
fi
|
||||||
|
|
||||||
|
while (( $# > 0 )); do
|
||||||
|
case "$1" in
|
||||||
|
-p|--partial) is_mode_partial=1; shift ;;
|
||||||
|
-e|--regexp) is_mode_regexp=1; shift ;;
|
||||||
|
-|--stdin) use_stdin=1; shift ;;
|
||||||
|
--) shift; break ;;
|
||||||
|
*) break ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if (( is_mode_partial )) && (( is_mode_regexp )); then
|
||||||
|
echo "\`--partial' and \`--regexp' are mutually exclusive" \
|
||||||
|
| batslib_decorate 'ERROR: assert_output' \
|
||||||
|
| fail
|
||||||
|
return $?
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Arguments.
|
||||||
|
local expected
|
||||||
|
if (( use_stdin )); then
|
||||||
|
expected="$(cat -)"
|
||||||
|
else
|
||||||
|
expected="$1"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Matching.
|
||||||
|
if (( is_mode_nonempty )); then
|
||||||
|
if [ -z "$output" ]; then
|
||||||
|
echo 'expected non-empty output, but output was empty' \
|
||||||
|
| batslib_decorate 'no output' \
|
||||||
|
| fail
|
||||||
|
fi
|
||||||
|
elif (( is_mode_regexp )); then
|
||||||
|
if [[ '' =~ $expected ]] || (( $? == 2 )); then
|
||||||
|
echo "Invalid extended regular expression: \`$expected'" \
|
||||||
|
| batslib_decorate 'ERROR: assert_output' \
|
||||||
|
| fail
|
||||||
|
elif ! [[ $output =~ $expected ]]; then
|
||||||
|
batslib_print_kv_single_or_multi 6 \
|
||||||
|
'regexp' "$expected" \
|
||||||
|
'output' "$output" \
|
||||||
|
| batslib_decorate 'regular expression does not match output' \
|
||||||
|
| fail
|
||||||
|
fi
|
||||||
|
elif (( is_mode_partial )); then
|
||||||
|
if [[ $output != *"$expected"* ]]; then
|
||||||
|
batslib_print_kv_single_or_multi 9 \
|
||||||
|
'substring' "$expected" \
|
||||||
|
'output' "$output" \
|
||||||
|
| batslib_decorate 'output does not contain substring' \
|
||||||
|
| fail
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if [[ $output != "$expected" ]]; then
|
||||||
|
batslib_print_kv_single_or_multi 8 \
|
||||||
|
'expected' "$expected" \
|
||||||
|
'actual' "$output" \
|
||||||
|
| batslib_decorate 'output differs' \
|
||||||
|
| fail
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Fail and display details if `$output' matches the unexpected output.
|
||||||
|
# The unexpected output can be specified either by the first parameter
|
||||||
|
# or on the standard input.
|
||||||
|
#
|
||||||
|
# By default, literal matching is performed. The assertion fails if the
|
||||||
|
# unexpected output equals `$output'. Details include `$output'.
|
||||||
|
#
|
||||||
|
# Option `--partial' enables partial matching. The assertion fails if
|
||||||
|
# the unexpected substring is found in `$output'. The unexpected
|
||||||
|
# substring is added to details.
|
||||||
|
#
|
||||||
|
# Option `--regexp' enables regular expression matching. The assertion
|
||||||
|
# fails if the extended regular expression does matches `$output'. The
|
||||||
|
# regular expression is added to details. An invalid regular expression
|
||||||
|
# causes an error to be displayed.
|
||||||
|
#
|
||||||
|
# It is an error to use partial and regular expression matching
|
||||||
|
# simultaneously.
|
||||||
|
#
|
||||||
|
# Globals:
|
||||||
|
# output
|
||||||
|
# Options:
|
||||||
|
# -p, --partial - partial matching
|
||||||
|
# -e, --regexp - extended regular expression matching
|
||||||
|
# -, --stdin - read unexpected output from the standard input
|
||||||
|
# Arguments:
|
||||||
|
# $1 - unexpected output
|
||||||
|
# Returns:
|
||||||
|
# 0 - unexpected matches the actual output
|
||||||
|
# 1 - otherwise
|
||||||
|
# Inputs:
|
||||||
|
# STDIN - [=$1] unexpected output
|
||||||
|
# Outputs:
|
||||||
|
# STDERR - details, on failure
|
||||||
|
# error message, on error
|
||||||
|
refute_output() {
|
||||||
|
local -i is_mode_partial=0
|
||||||
|
local -i is_mode_regexp=0
|
||||||
|
local -i is_mode_empty=0
|
||||||
|
local -i use_stdin=0
|
||||||
|
|
||||||
|
# Handle options.
|
||||||
|
if (( $# == 0 )); then
|
||||||
|
is_mode_empty=1
|
||||||
|
fi
|
||||||
|
|
||||||
|
while (( $# > 0 )); do
|
||||||
|
case "$1" in
|
||||||
|
-p|--partial) is_mode_partial=1; shift ;;
|
||||||
|
-e|--regexp) is_mode_regexp=1; shift ;;
|
||||||
|
-|--stdin) use_stdin=1; shift ;;
|
||||||
|
--) shift; break ;;
|
||||||
|
*) break ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if (( is_mode_partial )) && (( is_mode_regexp )); then
|
||||||
|
echo "\`--partial' and \`--regexp' are mutually exclusive" \
|
||||||
|
| batslib_decorate 'ERROR: refute_output' \
|
||||||
|
| fail
|
||||||
|
return $?
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Arguments.
|
||||||
|
local unexpected
|
||||||
|
if (( use_stdin )); then
|
||||||
|
unexpected="$(cat -)"
|
||||||
|
else
|
||||||
|
unexpected="$1"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (( is_mode_regexp == 1 )) && [[ '' =~ $unexpected ]] || (( $? == 2 )); then
|
||||||
|
echo "Invalid extended regular expression: \`$unexpected'" \
|
||||||
|
| batslib_decorate 'ERROR: refute_output' \
|
||||||
|
| fail
|
||||||
|
return $?
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Matching.
|
||||||
|
if (( is_mode_empty )); then
|
||||||
|
if [ -n "$output" ]; then
|
||||||
|
batslib_print_kv_single_or_multi 6 \
|
||||||
|
'output' "$output" \
|
||||||
|
| batslib_decorate 'output non-empty, but expected no output' \
|
||||||
|
| fail
|
||||||
|
fi
|
||||||
|
elif (( is_mode_regexp )); then
|
||||||
|
if [[ $output =~ $unexpected ]] || (( $? == 0 )); then
|
||||||
|
batslib_print_kv_single_or_multi 6 \
|
||||||
|
'regexp' "$unexpected" \
|
||||||
|
'output' "$output" \
|
||||||
|
| batslib_decorate 'regular expression should not match output' \
|
||||||
|
| fail
|
||||||
|
fi
|
||||||
|
elif (( is_mode_partial )); then
|
||||||
|
if [[ $output == *"$unexpected"* ]]; then
|
||||||
|
batslib_print_kv_single_or_multi 9 \
|
||||||
|
'substring' "$unexpected" \
|
||||||
|
'output' "$output" \
|
||||||
|
| batslib_decorate 'output should not contain substring' \
|
||||||
|
| fail
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if [[ $output == "$unexpected" ]]; then
|
||||||
|
batslib_print_kv_single_or_multi 6 \
|
||||||
|
'output' "$output" \
|
||||||
|
| batslib_decorate 'output equals, but it was expected to differ' \
|
||||||
|
| fail
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Fail and display details if the expected line is not found in the
|
||||||
|
# output (default) or in a specific line of it.
|
||||||
|
#
|
||||||
|
# By default, the entire output is searched for the expected line. The
|
||||||
|
# expected line is matched against every element of `${lines[@]}'. If no
|
||||||
|
# match is found, the assertion fails. Details include the expected line
|
||||||
|
# and `${lines[@]}'.
|
||||||
|
#
|
||||||
|
# When `--index <idx>' is specified, only the <idx>-th line is matched.
|
||||||
|
# If the expected line does not match `${lines[<idx>]}', the assertion
|
||||||
|
# fails. Details include <idx> and the compared lines.
|
||||||
|
#
|
||||||
|
# By default, literal matching is performed. A literal match fails if
|
||||||
|
# the expected string does not equal the matched string.
|
||||||
|
#
|
||||||
|
# Option `--partial' enables partial matching. A partial match fails if
|
||||||
|
# the expected substring is not found in the target string.
|
||||||
|
#
|
||||||
|
# Option `--regexp' enables regular expression matching. A regular
|
||||||
|
# expression match fails if the extended regular expression does not
|
||||||
|
# match the target string. An invalid regular expression causes an error
|
||||||
|
# to be displayed.
|
||||||
|
#
|
||||||
|
# It is an error to use partial and regular expression matching
|
||||||
|
# simultaneously.
|
||||||
|
#
|
||||||
|
# Mandatory arguments to long options are mandatory for short options
|
||||||
|
# too.
|
||||||
|
#
|
||||||
|
# Globals:
|
||||||
|
# output
|
||||||
|
# lines
|
||||||
|
# Options:
|
||||||
|
# -n, --index <idx> - match the <idx>-th line
|
||||||
|
# -p, --partial - partial matching
|
||||||
|
# -e, --regexp - extended regular expression matching
|
||||||
|
# Arguments:
|
||||||
|
# $1 - expected line
|
||||||
|
# Returns:
|
||||||
|
# 0 - match found
|
||||||
|
# 1 - otherwise
|
||||||
|
# Outputs:
|
||||||
|
# STDERR - details, on failure
|
||||||
|
# error message, on error
|
||||||
|
# FIXME(ztombol): Display `${lines[@]}' instead of `$output'!
|
||||||
|
assert_line() {
|
||||||
|
local -i is_match_line=0
|
||||||
|
local -i is_mode_partial=0
|
||||||
|
local -i is_mode_regexp=0
|
||||||
|
|
||||||
|
# Handle options.
|
||||||
|
while (( $# > 0 )); do
|
||||||
|
case "$1" in
|
||||||
|
-n|--index)
|
||||||
|
if (( $# < 2 )) || ! [[ $2 =~ ^([0-9]|[1-9][0-9]+)$ ]]; then
|
||||||
|
echo "\`--index' requires an integer argument: \`$2'" \
|
||||||
|
| batslib_decorate 'ERROR: assert_line' \
|
||||||
|
| fail
|
||||||
|
return $?
|
||||||
|
fi
|
||||||
|
is_match_line=1
|
||||||
|
local -ri idx="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
-p|--partial) is_mode_partial=1; shift ;;
|
||||||
|
-e|--regexp) is_mode_regexp=1; shift ;;
|
||||||
|
--) shift; break ;;
|
||||||
|
*) break ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if (( is_mode_partial )) && (( is_mode_regexp )); then
|
||||||
|
echo "\`--partial' and \`--regexp' are mutually exclusive" \
|
||||||
|
| batslib_decorate 'ERROR: assert_line' \
|
||||||
|
| fail
|
||||||
|
return $?
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Arguments.
|
||||||
|
local -r expected="$1"
|
||||||
|
|
||||||
|
if (( is_mode_regexp == 1 )) && [[ '' =~ $expected ]] || (( $? == 2 )); then
|
||||||
|
echo "Invalid extended regular expression: \`$expected'" \
|
||||||
|
| batslib_decorate 'ERROR: assert_line' \
|
||||||
|
| fail
|
||||||
|
return $?
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Matching.
|
||||||
|
if (( is_match_line )); then
|
||||||
|
# Specific line.
|
||||||
|
if (( is_mode_regexp )); then
|
||||||
|
if ! [[ ${lines[$idx]} =~ $expected ]]; then
|
||||||
|
batslib_print_kv_single 6 \
|
||||||
|
'index' "$idx" \
|
||||||
|
'regexp' "$expected" \
|
||||||
|
'line' "${lines[$idx]}" \
|
||||||
|
| batslib_decorate 'regular expression does not match line' \
|
||||||
|
| fail
|
||||||
|
fi
|
||||||
|
elif (( is_mode_partial )); then
|
||||||
|
if [[ ${lines[$idx]} != *"$expected"* ]]; then
|
||||||
|
batslib_print_kv_single 9 \
|
||||||
|
'index' "$idx" \
|
||||||
|
'substring' "$expected" \
|
||||||
|
'line' "${lines[$idx]}" \
|
||||||
|
| batslib_decorate 'line does not contain substring' \
|
||||||
|
| fail
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if [[ ${lines[$idx]} != "$expected" ]]; then
|
||||||
|
batslib_print_kv_single 8 \
|
||||||
|
'index' "$idx" \
|
||||||
|
'expected' "$expected" \
|
||||||
|
'actual' "${lines[$idx]}" \
|
||||||
|
| batslib_decorate 'line differs' \
|
||||||
|
| fail
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# Contained in output.
|
||||||
|
if (( is_mode_regexp )); then
|
||||||
|
local -i idx
|
||||||
|
for (( idx = 0; idx < ${#lines[@]}; ++idx )); do
|
||||||
|
[[ ${lines[$idx]} =~ $expected ]] && return 0
|
||||||
|
done
|
||||||
|
{ local -ar single=(
|
||||||
|
'regexp' "$expected"
|
||||||
|
)
|
||||||
|
local -ar may_be_multi=(
|
||||||
|
'output' "$output"
|
||||||
|
)
|
||||||
|
local -ir width="$( batslib_get_max_single_line_key_width \
|
||||||
|
"${single[@]}" "${may_be_multi[@]}" )"
|
||||||
|
batslib_print_kv_single "$width" "${single[@]}"
|
||||||
|
batslib_print_kv_single_or_multi "$width" "${may_be_multi[@]}"
|
||||||
|
} | batslib_decorate 'no output line matches regular expression' \
|
||||||
|
| fail
|
||||||
|
elif (( is_mode_partial )); then
|
||||||
|
local -i idx
|
||||||
|
for (( idx = 0; idx < ${#lines[@]}; ++idx )); do
|
||||||
|
[[ ${lines[$idx]} == *"$expected"* ]] && return 0
|
||||||
|
done
|
||||||
|
{ local -ar single=(
|
||||||
|
'substring' "$expected"
|
||||||
|
)
|
||||||
|
local -ar may_be_multi=(
|
||||||
|
'output' "$output"
|
||||||
|
)
|
||||||
|
local -ir width="$( batslib_get_max_single_line_key_width \
|
||||||
|
"${single[@]}" "${may_be_multi[@]}" )"
|
||||||
|
batslib_print_kv_single "$width" "${single[@]}"
|
||||||
|
batslib_print_kv_single_or_multi "$width" "${may_be_multi[@]}"
|
||||||
|
} | batslib_decorate 'no output line contains substring' \
|
||||||
|
| fail
|
||||||
|
else
|
||||||
|
local -i idx
|
||||||
|
for (( idx = 0; idx < ${#lines[@]}; ++idx )); do
|
||||||
|
[[ ${lines[$idx]} == "$expected" ]] && return 0
|
||||||
|
done
|
||||||
|
{ local -ar single=(
|
||||||
|
'line' "$expected"
|
||||||
|
)
|
||||||
|
local -ar may_be_multi=(
|
||||||
|
'output' "$output"
|
||||||
|
)
|
||||||
|
local -ir width="$( batslib_get_max_single_line_key_width \
|
||||||
|
"${single[@]}" "${may_be_multi[@]}" )"
|
||||||
|
batslib_print_kv_single "$width" "${single[@]}"
|
||||||
|
batslib_print_kv_single_or_multi "$width" "${may_be_multi[@]}"
|
||||||
|
} | batslib_decorate 'output does not contain line' \
|
||||||
|
| fail
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Fail and display details if the unexpected line is found in the output
|
||||||
|
# (default) or in a specific line of it.
|
||||||
|
#
|
||||||
|
# By default, the entire output is searched for the unexpected line. The
|
||||||
|
# unexpected line is matched against every element of `${lines[@]}'. If
|
||||||
|
# a match is found, the assertion fails. Details include the unexpected
|
||||||
|
# line, the index of the first match and `${lines[@]}' with the matching
|
||||||
|
# line highlighted if `${lines[@]}' is longer than one line.
|
||||||
|
#
|
||||||
|
# When `--index <idx>' is specified, only the <idx>-th line is matched.
|
||||||
|
# If the unexpected line matches `${lines[<idx>]}', the assertion fails.
|
||||||
|
# Details include <idx> and the unexpected line.
|
||||||
|
#
|
||||||
|
# By default, literal matching is performed. A literal match fails if
|
||||||
|
# the unexpected string does not equal the matched string.
|
||||||
|
#
|
||||||
|
# Option `--partial' enables partial matching. A partial match fails if
|
||||||
|
# the unexpected substring is found in the target string. When used with
|
||||||
|
# `--index <idx>', the unexpected substring is also displayed on
|
||||||
|
# failure.
|
||||||
|
#
|
||||||
|
# Option `--regexp' enables regular expression matching. A regular
|
||||||
|
# expression match fails if the extended regular expression matches the
|
||||||
|
# target string. When used with `--index <idx>', the regular expression
|
||||||
|
# is also displayed on failure. An invalid regular expression causes an
|
||||||
|
# error to be displayed.
|
||||||
|
#
|
||||||
|
# It is an error to use partial and regular expression matching
|
||||||
|
# simultaneously.
|
||||||
|
#
|
||||||
|
# Mandatory arguments to long options are mandatory for short options
|
||||||
|
# too.
|
||||||
|
#
|
||||||
|
# Globals:
|
||||||
|
# output
|
||||||
|
# lines
|
||||||
|
# Options:
|
||||||
|
# -n, --index <idx> - match the <idx>-th line
|
||||||
|
# -p, --partial - partial matching
|
||||||
|
# -e, --regexp - extended regular expression matching
|
||||||
|
# Arguments:
|
||||||
|
# $1 - unexpected line
|
||||||
|
# Returns:
|
||||||
|
# 0 - match not found
|
||||||
|
# 1 - otherwise
|
||||||
|
# Outputs:
|
||||||
|
# STDERR - details, on failure
|
||||||
|
# error message, on error
|
||||||
|
# FIXME(ztombol): Display `${lines[@]}' instead of `$output'!
|
||||||
|
refute_line() {
|
||||||
|
local -i is_match_line=0
|
||||||
|
local -i is_mode_partial=0
|
||||||
|
local -i is_mode_regexp=0
|
||||||
|
|
||||||
|
# Handle options.
|
||||||
|
while (( $# > 0 )); do
|
||||||
|
case "$1" in
|
||||||
|
-n|--index)
|
||||||
|
if (( $# < 2 )) || ! [[ $2 =~ ^([0-9]|[1-9][0-9]+)$ ]]; then
|
||||||
|
echo "\`--index' requires an integer argument: \`$2'" \
|
||||||
|
| batslib_decorate 'ERROR: refute_line' \
|
||||||
|
| fail
|
||||||
|
return $?
|
||||||
|
fi
|
||||||
|
is_match_line=1
|
||||||
|
local -ri idx="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
-p|--partial) is_mode_partial=1; shift ;;
|
||||||
|
-e|--regexp) is_mode_regexp=1; shift ;;
|
||||||
|
--) shift; break ;;
|
||||||
|
*) break ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if (( is_mode_partial )) && (( is_mode_regexp )); then
|
||||||
|
echo "\`--partial' and \`--regexp' are mutually exclusive" \
|
||||||
|
| batslib_decorate 'ERROR: refute_line' \
|
||||||
|
| fail
|
||||||
|
return $?
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Arguments.
|
||||||
|
local -r unexpected="$1"
|
||||||
|
|
||||||
|
if (( is_mode_regexp == 1 )) && [[ '' =~ $unexpected ]] || (( $? == 2 )); then
|
||||||
|
echo "Invalid extended regular expression: \`$unexpected'" \
|
||||||
|
| batslib_decorate 'ERROR: refute_line' \
|
||||||
|
| fail
|
||||||
|
return $?
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Matching.
|
||||||
|
if (( is_match_line )); then
|
||||||
|
# Specific line.
|
||||||
|
if (( is_mode_regexp )); then
|
||||||
|
if [[ ${lines[$idx]} =~ $unexpected ]] || (( $? == 0 )); then
|
||||||
|
batslib_print_kv_single 6 \
|
||||||
|
'index' "$idx" \
|
||||||
|
'regexp' "$unexpected" \
|
||||||
|
'line' "${lines[$idx]}" \
|
||||||
|
| batslib_decorate 'regular expression should not match line' \
|
||||||
|
| fail
|
||||||
|
fi
|
||||||
|
elif (( is_mode_partial )); then
|
||||||
|
if [[ ${lines[$idx]} == *"$unexpected"* ]]; then
|
||||||
|
batslib_print_kv_single 9 \
|
||||||
|
'index' "$idx" \
|
||||||
|
'substring' "$unexpected" \
|
||||||
|
'line' "${lines[$idx]}" \
|
||||||
|
| batslib_decorate 'line should not contain substring' \
|
||||||
|
| fail
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if [[ ${lines[$idx]} == "$unexpected" ]]; then
|
||||||
|
batslib_print_kv_single 5 \
|
||||||
|
'index' "$idx" \
|
||||||
|
'line' "${lines[$idx]}" \
|
||||||
|
| batslib_decorate 'line should differ' \
|
||||||
|
| fail
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# Line contained in output.
|
||||||
|
if (( is_mode_regexp )); then
|
||||||
|
local -i idx
|
||||||
|
for (( idx = 0; idx < ${#lines[@]}; ++idx )); do
|
||||||
|
if [[ ${lines[$idx]} =~ $unexpected ]]; then
|
||||||
|
{ local -ar single=(
|
||||||
|
'regexp' "$unexpected"
|
||||||
|
'index' "$idx"
|
||||||
|
)
|
||||||
|
local -a may_be_multi=(
|
||||||
|
'output' "$output"
|
||||||
|
)
|
||||||
|
local -ir width="$( batslib_get_max_single_line_key_width \
|
||||||
|
"${single[@]}" "${may_be_multi[@]}" )"
|
||||||
|
batslib_print_kv_single "$width" "${single[@]}"
|
||||||
|
if batslib_is_single_line "${may_be_multi[1]}"; then
|
||||||
|
batslib_print_kv_single "$width" "${may_be_multi[@]}"
|
||||||
|
else
|
||||||
|
may_be_multi[1]="$( printf '%s' "${may_be_multi[1]}" \
|
||||||
|
| batslib_prefix \
|
||||||
|
| batslib_mark '>' "$idx" )"
|
||||||
|
batslib_print_kv_multi "${may_be_multi[@]}"
|
||||||
|
fi
|
||||||
|
} | batslib_decorate 'no line should match the regular expression' \
|
||||||
|
| fail
|
||||||
|
return $?
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
elif (( is_mode_partial )); then
|
||||||
|
local -i idx
|
||||||
|
for (( idx = 0; idx < ${#lines[@]}; ++idx )); do
|
||||||
|
if [[ ${lines[$idx]} == *"$unexpected"* ]]; then
|
||||||
|
{ local -ar single=(
|
||||||
|
'substring' "$unexpected"
|
||||||
|
'index' "$idx"
|
||||||
|
)
|
||||||
|
local -a may_be_multi=(
|
||||||
|
'output' "$output"
|
||||||
|
)
|
||||||
|
local -ir width="$( batslib_get_max_single_line_key_width \
|
||||||
|
"${single[@]}" "${may_be_multi[@]}" )"
|
||||||
|
batslib_print_kv_single "$width" "${single[@]}"
|
||||||
|
if batslib_is_single_line "${may_be_multi[1]}"; then
|
||||||
|
batslib_print_kv_single "$width" "${may_be_multi[@]}"
|
||||||
|
else
|
||||||
|
may_be_multi[1]="$( printf '%s' "${may_be_multi[1]}" \
|
||||||
|
| batslib_prefix \
|
||||||
|
| batslib_mark '>' "$idx" )"
|
||||||
|
batslib_print_kv_multi "${may_be_multi[@]}"
|
||||||
|
fi
|
||||||
|
} | batslib_decorate 'no line should contain substring' \
|
||||||
|
| fail
|
||||||
|
return $?
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
else
|
||||||
|
local -i idx
|
||||||
|
for (( idx = 0; idx < ${#lines[@]}; ++idx )); do
|
||||||
|
if [[ ${lines[$idx]} == "$unexpected" ]]; then
|
||||||
|
{ local -ar single=(
|
||||||
|
'line' "$unexpected"
|
||||||
|
'index' "$idx"
|
||||||
|
)
|
||||||
|
local -a may_be_multi=(
|
||||||
|
'output' "$output"
|
||||||
|
)
|
||||||
|
local -ir width="$( batslib_get_max_single_line_key_width \
|
||||||
|
"${single[@]}" "${may_be_multi[@]}" )"
|
||||||
|
batslib_print_kv_single "$width" "${single[@]}"
|
||||||
|
if batslib_is_single_line "${may_be_multi[1]}"; then
|
||||||
|
batslib_print_kv_single "$width" "${may_be_multi[@]}"
|
||||||
|
else
|
||||||
|
may_be_multi[1]="$( printf '%s' "${may_be_multi[1]}" \
|
||||||
|
| batslib_prefix \
|
||||||
|
| batslib_mark '>' "$idx" )"
|
||||||
|
batslib_print_kv_multi "${may_be_multi[@]}"
|
||||||
|
fi
|
||||||
|
} | batslib_decorate 'line should not be in output' \
|
||||||
|
| fail
|
||||||
|
return $?
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
7
stdlib/bats/tests/testfile/mods/bats-support/.travis.yml
Normal file
7
stdlib/bats/tests/testfile/mods/bats-support/.travis.yml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
language: bash
|
||||||
|
before_install:
|
||||||
|
- ./script/install-bats.sh
|
||||||
|
before_script:
|
||||||
|
- export PATH="${HOME}/.local/bin:${PATH}"
|
||||||
|
script:
|
||||||
|
- bats test
|
37
stdlib/bats/tests/testfile/mods/bats-support/CHANGELOG.md
Normal file
37
stdlib/bats/tests/testfile/mods/bats-support/CHANGELOG.md
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
# Change Log
|
||||||
|
|
||||||
|
All notable changes to this project will be documented in this file.
|
||||||
|
This project adheres to [Semantic Versioning](http://semver.org/).
|
||||||
|
|
||||||
|
|
||||||
|
## [0.2.0] - 2016-03-22
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- `npm` support
|
||||||
|
- Reporting arbitrary failures with `fail()` (moved from `bats-assert`)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Library renamed to `bats-support`
|
||||||
|
|
||||||
|
|
||||||
|
## 0.1.0 - 2016-02-16
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Two-column key-value formatting with `batslib_print_kv_single()`
|
||||||
|
- Multi-line key-value formatting with `batslib_print_kv_multi()`
|
||||||
|
- Mixed formatting with `batslib_print_kv_single_or_multi()`
|
||||||
|
- Header and footer decoration with `batslib_decorate()`
|
||||||
|
- Prefixing lines with `batslib_prefix()`
|
||||||
|
- Marking lines with `batslib_mark()`
|
||||||
|
- Common output function `batslib_err()`
|
||||||
|
- Line counting with `batslib_count_lines()`
|
||||||
|
- Checking whether a text is one line long with
|
||||||
|
`batslib_is_single_line()`
|
||||||
|
- Determining key width for two-column and mixed formatting with
|
||||||
|
`batslib_get_max_single_line_key_width()`
|
||||||
|
|
||||||
|
|
||||||
|
[0.2.0]: https://github.com/ztombol/bats-support/compare/v0.1.0...v0.2.0
|
116
stdlib/bats/tests/testfile/mods/bats-support/LICENSE
Normal file
116
stdlib/bats/tests/testfile/mods/bats-support/LICENSE
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
CC0 1.0 Universal
|
||||||
|
|
||||||
|
Statement of Purpose
|
||||||
|
|
||||||
|
The laws of most jurisdictions throughout the world automatically confer
|
||||||
|
exclusive Copyright and Related Rights (defined below) upon the creator and
|
||||||
|
subsequent owner(s) (each and all, an "owner") of an original work of
|
||||||
|
authorship and/or a database (each, a "Work").
|
||||||
|
|
||||||
|
Certain owners wish to permanently relinquish those rights to a Work for the
|
||||||
|
purpose of contributing to a commons of creative, cultural and scientific
|
||||||
|
works ("Commons") that the public can reliably and without fear of later
|
||||||
|
claims of infringement build upon, modify, incorporate in other works, reuse
|
||||||
|
and redistribute as freely as possible in any form whatsoever and for any
|
||||||
|
purposes, including without limitation commercial purposes. These owners may
|
||||||
|
contribute to the Commons to promote the ideal of a free culture and the
|
||||||
|
further production of creative, cultural and scientific works, or to gain
|
||||||
|
reputation or greater distribution for their Work in part through the use and
|
||||||
|
efforts of others.
|
||||||
|
|
||||||
|
For these and/or other purposes and motivations, and without any expectation
|
||||||
|
of additional consideration or compensation, the person associating CC0 with a
|
||||||
|
Work (the "Affirmer"), to the extent that he or she is an owner of Copyright
|
||||||
|
and Related Rights in the Work, voluntarily elects to apply CC0 to the Work
|
||||||
|
and publicly distribute the Work under its terms, with knowledge of his or her
|
||||||
|
Copyright and Related Rights in the Work and the meaning and intended legal
|
||||||
|
effect of CC0 on those rights.
|
||||||
|
|
||||||
|
1. Copyright and Related Rights. A Work made available under CC0 may be
|
||||||
|
protected by copyright and related or neighboring rights ("Copyright and
|
||||||
|
Related Rights"). Copyright and Related Rights include, but are not limited
|
||||||
|
to, the following:
|
||||||
|
|
||||||
|
i. the right to reproduce, adapt, distribute, perform, display, communicate,
|
||||||
|
and translate a Work;
|
||||||
|
|
||||||
|
ii. moral rights retained by the original author(s) and/or performer(s);
|
||||||
|
|
||||||
|
iii. publicity and privacy rights pertaining to a person's image or likeness
|
||||||
|
depicted in a Work;
|
||||||
|
|
||||||
|
iv. rights protecting against unfair competition in regards to a Work,
|
||||||
|
subject to the limitations in paragraph 4(a), below;
|
||||||
|
|
||||||
|
v. rights protecting the extraction, dissemination, use and reuse of data in
|
||||||
|
a Work;
|
||||||
|
|
||||||
|
vi. database rights (such as those arising under Directive 96/9/EC of the
|
||||||
|
European Parliament and of the Council of 11 March 1996 on the legal
|
||||||
|
protection of databases, and under any national implementation thereof,
|
||||||
|
including any amended or successor version of such directive); and
|
||||||
|
|
||||||
|
vii. other similar, equivalent or corresponding rights throughout the world
|
||||||
|
based on applicable law or treaty, and any national implementations thereof.
|
||||||
|
|
||||||
|
2. Waiver. To the greatest extent permitted by, but not in contravention of,
|
||||||
|
applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and
|
||||||
|
unconditionally waives, abandons, and surrenders all of Affirmer's Copyright
|
||||||
|
and Related Rights and associated claims and causes of action, whether now
|
||||||
|
known or unknown (including existing as well as future claims and causes of
|
||||||
|
action), in the Work (i) in all territories worldwide, (ii) for the maximum
|
||||||
|
duration provided by applicable law or treaty (including future time
|
||||||
|
extensions), (iii) in any current or future medium and for any number of
|
||||||
|
copies, and (iv) for any purpose whatsoever, including without limitation
|
||||||
|
commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes
|
||||||
|
the Waiver for the benefit of each member of the public at large and to the
|
||||||
|
detriment of Affirmer's heirs and successors, fully intending that such Waiver
|
||||||
|
shall not be subject to revocation, rescission, cancellation, termination, or
|
||||||
|
any other legal or equitable action to disrupt the quiet enjoyment of the Work
|
||||||
|
by the public as contemplated by Affirmer's express Statement of Purpose.
|
||||||
|
|
||||||
|
3. Public License Fallback. Should any part of the Waiver for any reason be
|
||||||
|
judged legally invalid or ineffective under applicable law, then the Waiver
|
||||||
|
shall be preserved to the maximum extent permitted taking into account
|
||||||
|
Affirmer's express Statement of Purpose. In addition, to the extent the Waiver
|
||||||
|
is so judged Affirmer hereby grants to each affected person a royalty-free,
|
||||||
|
non transferable, non sublicensable, non exclusive, irrevocable and
|
||||||
|
unconditional license to exercise Affirmer's Copyright and Related Rights in
|
||||||
|
the Work (i) in all territories worldwide, (ii) for the maximum duration
|
||||||
|
provided by applicable law or treaty (including future time extensions), (iii)
|
||||||
|
in any current or future medium and for any number of copies, and (iv) for any
|
||||||
|
purpose whatsoever, including without limitation commercial, advertising or
|
||||||
|
promotional purposes (the "License"). The License shall be deemed effective as
|
||||||
|
of the date CC0 was applied by Affirmer to the Work. Should any part of the
|
||||||
|
License for any reason be judged legally invalid or ineffective under
|
||||||
|
applicable law, such partial invalidity or ineffectiveness shall not
|
||||||
|
invalidate the remainder of the License, and in such case Affirmer hereby
|
||||||
|
affirms that he or she will not (i) exercise any of his or her remaining
|
||||||
|
Copyright and Related Rights in the Work or (ii) assert any associated claims
|
||||||
|
and causes of action with respect to the Work, in either case contrary to
|
||||||
|
Affirmer's express Statement of Purpose.
|
||||||
|
|
||||||
|
4. Limitations and Disclaimers.
|
||||||
|
|
||||||
|
a. No trademark or patent rights held by Affirmer are waived, abandoned,
|
||||||
|
surrendered, licensed or otherwise affected by this document.
|
||||||
|
|
||||||
|
b. Affirmer offers the Work as-is and makes no representations or warranties
|
||||||
|
of any kind concerning the Work, express, implied, statutory or otherwise,
|
||||||
|
including without limitation warranties of title, merchantability, fitness
|
||||||
|
for a particular purpose, non infringement, or the absence of latent or
|
||||||
|
other defects, accuracy, or the present or absence of errors, whether or not
|
||||||
|
discoverable, all to the greatest extent permissible under applicable law.
|
||||||
|
|
||||||
|
c. Affirmer disclaims responsibility for clearing rights of other persons
|
||||||
|
that may apply to the Work or any use thereof, including without limitation
|
||||||
|
any person's Copyright and Related Rights in the Work. Further, Affirmer
|
||||||
|
disclaims responsibility for obtaining any necessary consents, permissions
|
||||||
|
or other rights required for any use of the Work.
|
||||||
|
|
||||||
|
d. Affirmer understands and acknowledges that Creative Commons is not a
|
||||||
|
party to this document and has no duty or obligation with respect to this
|
||||||
|
CC0 or use of the Work.
|
||||||
|
|
||||||
|
For more information, please see
|
||||||
|
<http://creativecommons.org/publicdomain/zero/1.0/>
|
128
stdlib/bats/tests/testfile/mods/bats-support/README.md
Normal file
128
stdlib/bats/tests/testfile/mods/bats-support/README.md
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
*__Important:__ `bats-core` has been renamed to `bats-support`. GitHub
|
||||||
|
automatically redirects all references, e.g. submodules and clones will
|
||||||
|
continue to work, but you are encouraged to [update][github-rename]
|
||||||
|
them. Version numbering continues where `bats-core` left off.*
|
||||||
|
|
||||||
|
[github-rename]: https://help.github.com/articles/renaming-a-repository/
|
||||||
|
|
||||||
|
- - - - -
|
||||||
|
|
||||||
|
# bats-support
|
||||||
|
|
||||||
|
[![GitHub license](https://img.shields.io/badge/license-CC0-blue.svg)](https://raw.githubusercontent.com/ztombol/bats-support/master/LICENSE)
|
||||||
|
[![GitHub release](https://img.shields.io/github/release/ztombol/bats-support.svg)](https://github.com/ztombol/bats-support/releases/latest)
|
||||||
|
[![Build Status](https://travis-ci.org/ztombol/bats-support.svg?branch=master)](https://travis-ci.org/ztombol/bats-support)
|
||||||
|
|
||||||
|
`bats-support` is a supporting library providing common functions to
|
||||||
|
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
|
||||||
|
load this library.
|
||||||
|
|
||||||
|
If you want to use this library in your own helpers or just want to
|
||||||
|
learn about its internals see the developer documentation in the [source
|
||||||
|
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
|
||||||
|
provides a simple way to format simple messages and key value pairs, and
|
||||||
|
display them on the standard error.
|
||||||
|
|
||||||
|
|
||||||
|
### Simple message
|
||||||
|
|
||||||
|
Simple messages without structure, e.g. one-line error messages, are
|
||||||
|
simply wrapped in a header and a footer to help them stand out.
|
||||||
|
|
||||||
|
```
|
||||||
|
-- ERROR: assert_output --
|
||||||
|
`--partial' and `--regexp' are mutually exclusive
|
||||||
|
--
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### Key-Value pairs
|
||||||
|
|
||||||
|
Some helpers, e.g. [assertions][bats-assert], structure output as
|
||||||
|
key-value pairs. This library provides two ways to format them.
|
||||||
|
|
||||||
|
When the value is one line long, a pair can be displayed in a columnar
|
||||||
|
fashion called ***two-column*** format.
|
||||||
|
|
||||||
|
```
|
||||||
|
-- output differs --
|
||||||
|
expected : want
|
||||||
|
actual : have
|
||||||
|
--
|
||||||
|
```
|
||||||
|
|
||||||
|
When the value is longer than one line, the key and value must be
|
||||||
|
displayed on separate lines. First, the key is displayed along with the
|
||||||
|
number of lines in the value. Then, the value, indented by two spaces
|
||||||
|
for added readability, starting on the next line. This is called
|
||||||
|
***multi-line*** format.
|
||||||
|
|
||||||
|
```
|
||||||
|
-- command failed --
|
||||||
|
status : 1
|
||||||
|
output (2 lines):
|
||||||
|
Error! Something went terribly wrong!
|
||||||
|
Our engineers are panicing... \`>`;/
|
||||||
|
--
|
||||||
|
```
|
||||||
|
|
||||||
|
Sometimes, for clarity, it is a good idea to display related values also
|
||||||
|
in this format, even if they are just one line long.
|
||||||
|
|
||||||
|
```
|
||||||
|
-- output differs --
|
||||||
|
expected (1 lines):
|
||||||
|
want
|
||||||
|
actual (3 lines):
|
||||||
|
have 1
|
||||||
|
have 2
|
||||||
|
have 3
|
||||||
|
--
|
||||||
|
```
|
||||||
|
|
||||||
|
<!-- REFERENCES -->
|
||||||
|
|
||||||
|
[bats]: https://github.com/sstephenson/bats
|
||||||
|
[bats-docs]: https://github.com/ztombol/bats-docs
|
||||||
|
[bats-assert]: https://github.com/ztombol/bats-assert
|
2
stdlib/bats/tests/testfile/mods/bats-support/load.bash
Normal file
2
stdlib/bats/tests/testfile/mods/bats-support/load.bash
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
source "$(dirname "${BASH_SOURCE[0]}")/src/output.bash"
|
||||||
|
source "$(dirname "${BASH_SOURCE[0]}")/src/error.bash"
|
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"name": "bats-support",
|
||||||
|
"version": "0.2.0",
|
||||||
|
"private": true
|
||||||
|
}
|
6
stdlib/bats/tests/testfile/mods/bats-support/script/install-bats.sh
Executable file
6
stdlib/bats/tests/testfile/mods/bats-support/script/install-bats.sh
Executable file
@ -0,0 +1,6 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
set -o errexit
|
||||||
|
set -o xtrace
|
||||||
|
|
||||||
|
git clone --depth 1 https://github.com/sstephenson/bats
|
||||||
|
cd bats && ./install.sh "${HOME}/.local" && cd .. && rm -rf bats
|
41
stdlib/bats/tests/testfile/mods/bats-support/src/error.bash
Normal file
41
stdlib/bats/tests/testfile/mods/bats-support/src/error.bash
Normal file
@ -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
|
||||||
|
}
|
279
stdlib/bats/tests/testfile/mods/bats-support/src/output.bash
Normal file
279
stdlib/bats/tests/testfile/mods/bats-support/src/output.bash
Normal file
@ -0,0 +1,279 @@
|
|||||||
|
#
|
||||||
|
# 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/>.
|
||||||
|
#
|
||||||
|
|
||||||
|
#
|
||||||
|
# output.bash
|
||||||
|
# -----------
|
||||||
|
#
|
||||||
|
# Private functions implementing output formatting. Used by public
|
||||||
|
# helper functions.
|
||||||
|
#
|
||||||
|
|
||||||
|
# Print a message to the standard error. When no parameters are
|
||||||
|
# specified, the message is read from the standard input.
|
||||||
|
#
|
||||||
|
# Globals:
|
||||||
|
# none
|
||||||
|
# Arguments:
|
||||||
|
# $@ - [=STDIN] message
|
||||||
|
# Returns:
|
||||||
|
# none
|
||||||
|
# Inputs:
|
||||||
|
# STDIN - [=$@] message
|
||||||
|
# Outputs:
|
||||||
|
# STDERR - message
|
||||||
|
batslib_err() {
|
||||||
|
{ if (( $# > 0 )); then
|
||||||
|
echo "$@"
|
||||||
|
else
|
||||||
|
cat -
|
||||||
|
fi
|
||||||
|
} >&2
|
||||||
|
}
|
||||||
|
|
||||||
|
# Count the number of lines in the given string.
|
||||||
|
#
|
||||||
|
# TODO(ztombol): Fix tests and remove this note after #93 is resolved!
|
||||||
|
# NOTE: Due to a bug in Bats, `batslib_count_lines "$output"' does not
|
||||||
|
# give the same result as `${#lines[@]}' when the output contains
|
||||||
|
# empty lines.
|
||||||
|
# See PR #93 (https://github.com/sstephenson/bats/pull/93).
|
||||||
|
#
|
||||||
|
# Globals:
|
||||||
|
# none
|
||||||
|
# Arguments:
|
||||||
|
# $1 - string
|
||||||
|
# Returns:
|
||||||
|
# none
|
||||||
|
# Outputs:
|
||||||
|
# STDOUT - number of lines
|
||||||
|
batslib_count_lines() {
|
||||||
|
local -i n_lines=0
|
||||||
|
local line
|
||||||
|
while IFS='' read -r line || [[ -n $line ]]; do
|
||||||
|
(( ++n_lines ))
|
||||||
|
done < <(printf '%s' "$1")
|
||||||
|
echo "$n_lines"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Determine whether all strings are single-line.
|
||||||
|
#
|
||||||
|
# Globals:
|
||||||
|
# none
|
||||||
|
# Arguments:
|
||||||
|
# $@ - strings
|
||||||
|
# Returns:
|
||||||
|
# 0 - all strings are single-line
|
||||||
|
# 1 - otherwise
|
||||||
|
batslib_is_single_line() {
|
||||||
|
for string in "$@"; do
|
||||||
|
(( $(batslib_count_lines "$string") > 1 )) && return 1
|
||||||
|
done
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# Determine the length of the longest key that has a single-line value.
|
||||||
|
#
|
||||||
|
# This function is useful in determining the correct width of the key
|
||||||
|
# column in two-column format when some keys may have multi-line values
|
||||||
|
# and thus should be excluded.
|
||||||
|
#
|
||||||
|
# Globals:
|
||||||
|
# none
|
||||||
|
# Arguments:
|
||||||
|
# $odd - key
|
||||||
|
# $even - value of the previous key
|
||||||
|
# Returns:
|
||||||
|
# none
|
||||||
|
# Outputs:
|
||||||
|
# STDOUT - length of longest key
|
||||||
|
batslib_get_max_single_line_key_width() {
|
||||||
|
local -i max_len=-1
|
||||||
|
while (( $# != 0 )); do
|
||||||
|
local -i key_len="${#1}"
|
||||||
|
batslib_is_single_line "$2" && (( key_len > max_len )) && max_len="$key_len"
|
||||||
|
shift 2
|
||||||
|
done
|
||||||
|
echo "$max_len"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Print key-value pairs in two-column format.
|
||||||
|
#
|
||||||
|
# Keys are displayed in the first column, and their corresponding values
|
||||||
|
# in the second. To evenly line up values, the key column is fixed-width
|
||||||
|
# and its width is specified with the first parameter (possibly computed
|
||||||
|
# using `batslib_get_max_single_line_key_width').
|
||||||
|
#
|
||||||
|
# Globals:
|
||||||
|
# none
|
||||||
|
# Arguments:
|
||||||
|
# $1 - width of key column
|
||||||
|
# $even - key
|
||||||
|
# $odd - value of the previous key
|
||||||
|
# Returns:
|
||||||
|
# none
|
||||||
|
# Outputs:
|
||||||
|
# STDOUT - formatted key-value pairs
|
||||||
|
batslib_print_kv_single() {
|
||||||
|
local -ir col_width="$1"; shift
|
||||||
|
while (( $# != 0 )); do
|
||||||
|
printf '%-*s : %s\n' "$col_width" "$1" "$2"
|
||||||
|
shift 2
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# Print key-value pairs in multi-line format.
|
||||||
|
#
|
||||||
|
# The key is displayed first with the number of lines of its
|
||||||
|
# corresponding value in parenthesis. Next, starting on the next line,
|
||||||
|
# the value is displayed. For better readability, it is recommended to
|
||||||
|
# indent values using `batslib_prefix'.
|
||||||
|
#
|
||||||
|
# Globals:
|
||||||
|
# none
|
||||||
|
# Arguments:
|
||||||
|
# $odd - key
|
||||||
|
# $even - value of the previous key
|
||||||
|
# Returns:
|
||||||
|
# none
|
||||||
|
# Outputs:
|
||||||
|
# STDOUT - formatted key-value pairs
|
||||||
|
batslib_print_kv_multi() {
|
||||||
|
while (( $# != 0 )); do
|
||||||
|
printf '%s (%d lines):\n' "$1" "$( batslib_count_lines "$2" )"
|
||||||
|
printf '%s\n' "$2"
|
||||||
|
shift 2
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# Print all key-value pairs in either two-column or multi-line format
|
||||||
|
# depending on whether all values are single-line.
|
||||||
|
#
|
||||||
|
# If all values are single-line, print all pairs in two-column format
|
||||||
|
# with the specified key column width (identical to using
|
||||||
|
# `batslib_print_kv_single').
|
||||||
|
#
|
||||||
|
# Otherwise, print all pairs in multi-line format after indenting values
|
||||||
|
# with two spaces for readability (identical to using `batslib_prefix'
|
||||||
|
# and `batslib_print_kv_multi')
|
||||||
|
#
|
||||||
|
# Globals:
|
||||||
|
# none
|
||||||
|
# Arguments:
|
||||||
|
# $1 - width of key column (for two-column format)
|
||||||
|
# $even - key
|
||||||
|
# $odd - value of the previous key
|
||||||
|
# Returns:
|
||||||
|
# none
|
||||||
|
# Outputs:
|
||||||
|
# STDOUT - formatted key-value pairs
|
||||||
|
batslib_print_kv_single_or_multi() {
|
||||||
|
local -ir width="$1"; shift
|
||||||
|
local -a pairs=( "$@" )
|
||||||
|
|
||||||
|
local -a values=()
|
||||||
|
local -i i
|
||||||
|
for (( i=1; i < ${#pairs[@]}; i+=2 )); do
|
||||||
|
values+=( "${pairs[$i]}" )
|
||||||
|
done
|
||||||
|
|
||||||
|
if batslib_is_single_line "${values[@]}"; then
|
||||||
|
batslib_print_kv_single "$width" "${pairs[@]}"
|
||||||
|
else
|
||||||
|
local -i i
|
||||||
|
for (( i=1; i < ${#pairs[@]}; i+=2 )); do
|
||||||
|
pairs[$i]="$( batslib_prefix < <(printf '%s' "${pairs[$i]}") )"
|
||||||
|
done
|
||||||
|
batslib_print_kv_multi "${pairs[@]}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Prefix each line read from the standard input with the given string.
|
||||||
|
#
|
||||||
|
# Globals:
|
||||||
|
# none
|
||||||
|
# Arguments:
|
||||||
|
# $1 - [= ] prefix string
|
||||||
|
# Returns:
|
||||||
|
# none
|
||||||
|
# Inputs:
|
||||||
|
# STDIN - lines
|
||||||
|
# Outputs:
|
||||||
|
# STDOUT - prefixed lines
|
||||||
|
batslib_prefix() {
|
||||||
|
local -r prefix="${1:- }"
|
||||||
|
local line
|
||||||
|
while IFS='' read -r line || [[ -n $line ]]; do
|
||||||
|
printf '%s%s\n' "$prefix" "$line"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# Mark select lines of the text read from the standard input by
|
||||||
|
# overwriting their beginning with the given string.
|
||||||
|
#
|
||||||
|
# Usually the input is indented by a few spaces using `batslib_prefix'
|
||||||
|
# first.
|
||||||
|
#
|
||||||
|
# Globals:
|
||||||
|
# none
|
||||||
|
# Arguments:
|
||||||
|
# $1 - marking string
|
||||||
|
# $@ - indices (zero-based) of lines to mark
|
||||||
|
# Returns:
|
||||||
|
# none
|
||||||
|
# Inputs:
|
||||||
|
# STDIN - lines
|
||||||
|
# Outputs:
|
||||||
|
# STDOUT - lines after marking
|
||||||
|
batslib_mark() {
|
||||||
|
local -r symbol="$1"; shift
|
||||||
|
# Sort line numbers.
|
||||||
|
set -- $( sort -nu <<< "$( printf '%d\n' "$@" )" )
|
||||||
|
|
||||||
|
local line
|
||||||
|
local -i idx=0
|
||||||
|
while IFS='' read -r line || [[ -n $line ]]; do
|
||||||
|
if (( ${1:--1} == idx )); then
|
||||||
|
printf '%s\n' "${symbol}${line:${#symbol}}"
|
||||||
|
shift
|
||||||
|
else
|
||||||
|
printf '%s\n' "$line"
|
||||||
|
fi
|
||||||
|
(( ++idx ))
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# Enclose the input text in header and footer lines.
|
||||||
|
#
|
||||||
|
# The header contains the given string as title. The output is preceded
|
||||||
|
# and followed by an additional newline to make it stand out more.
|
||||||
|
#
|
||||||
|
# Globals:
|
||||||
|
# none
|
||||||
|
# Arguments:
|
||||||
|
# $1 - title
|
||||||
|
# Returns:
|
||||||
|
# none
|
||||||
|
# Inputs:
|
||||||
|
# STDIN - text
|
||||||
|
# Outputs:
|
||||||
|
# STDOUT - decorated text
|
||||||
|
batslib_decorate() {
|
||||||
|
echo
|
||||||
|
echo "-- $1 --"
|
||||||
|
cat -
|
||||||
|
echo '--'
|
||||||
|
echo
|
||||||
|
}
|
12
stdlib/bats/tests/testfile/test.bats
Normal file
12
stdlib/bats/tests/testfile/test.bats
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
setup() {
|
||||||
|
load 'mods/bats-support/load'
|
||||||
|
load 'mods/bats-assert/load'
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "simple bats test" {
|
||||||
|
run echo "Hello world"
|
||||||
|
assert_success
|
||||||
|
|
||||||
|
run cat /do/not/exist
|
||||||
|
assert_failure
|
||||||
|
}
|
@ -54,6 +54,9 @@ import (
|
|||||||
// Safely mount secrets (in cleartext) as non-persistent files
|
// Safely mount secrets (in cleartext) as non-persistent files
|
||||||
secret: [string]: dagger.#Secret
|
secret: [string]: dagger.#Secret
|
||||||
|
|
||||||
|
// Mount unix socket or windows npipes to the corresponding path
|
||||||
|
socket: [string]: dagger.#Stream
|
||||||
|
|
||||||
// Write file in the container
|
// Write file in the container
|
||||||
files: [string]: {
|
files: [string]: {
|
||||||
content: string
|
content: string
|
||||||
@ -120,6 +123,9 @@ import (
|
|||||||
for dest, _ in tmpfs {
|
for dest, _ in tmpfs {
|
||||||
"\(dest)": "tmpfs"
|
"\(dest)": "tmpfs"
|
||||||
}
|
}
|
||||||
|
for dest, s in socket {
|
||||||
|
"\(dest)": stream: s
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -283,4 +283,8 @@ setup() {
|
|||||||
|
|
||||||
@test "trivy" {
|
@test "trivy" {
|
||||||
dagger -e trivy up
|
dagger -e trivy up
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@test "bats" {
|
||||||
|
dagger -e bats up
|
||||||
|
}
|
||||||
|
@ -16,7 +16,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
apiKey = "cb9777c166aefe4b77b31f961508191c"
|
apiKey = "cb9777c166aefe4b77b31f961508191c" //nolint
|
||||||
telemetryURL = "https://t.dagger.io/v1"
|
telemetryURL = "https://t.dagger.io/v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user