Merge branch 'testing'
This commit is contained in:
commit
66f809162b
@ -99,9 +99,10 @@ their editor or terminal.
|
||||
|
||||
For usage text and help messages, do not implement a -h option. Instead, print
|
||||
usage information when any erroneous option is specified. Follow the NetBSD
|
||||
style guide for the usage text’s output format [1].
|
||||
style guide for the usage text’s output format [0].
|
||||
|
||||
[1] <http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/share/misc/style>
|
||||
If committing a new utility, please include tests and documentation (see
|
||||
tests/ and docs/) for the new tool.
|
||||
|
||||
If committing a new source file, format the commit message following these
|
||||
guidelines:
|
||||
@ -130,6 +131,7 @@ $ git commit -m 'tool(1): fix #42 & add feature x'
|
||||
|
||||
Commit messages should be written in the present tense.
|
||||
|
||||
[0] <http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/share/misc/style>
|
||||
--
|
||||
This work © 2023–2024 by Emma Tebibyte is licensed under CC BY-SA 4.0. To view a
|
||||
copy of this license, visit <http://creativecommons.org/licenses/by-sa/4.0/>
|
||||
|
12
Makefile
12
Makefile
@ -30,6 +30,12 @@ RUSTFLAGS += --extern getopt=build/o/libgetopt.rlib \
|
||||
--extern strerror=build/o/libstrerror.rlib
|
||||
CFLAGS += -I$(SYSEXITS)
|
||||
|
||||
# testing requires the absolute path to the bin directory set
|
||||
BIN = build/bin
|
||||
|
||||
.PHONY: default
|
||||
default: all test
|
||||
|
||||
.PHONY: all
|
||||
all: dj false fop hru intcmp mm npc rpn scrut str strcmp swab true
|
||||
|
||||
@ -52,9 +58,9 @@ install: dist
|
||||
cp -r $(DESTDIR)/* /
|
||||
|
||||
.PHONY: test
|
||||
test: build /tmp/getopt
|
||||
test: all $(TESTS) /tmp/getopt
|
||||
@echo $(TESTS)
|
||||
/tmp/getopt
|
||||
tests/posix-compat.sh
|
||||
|
||||
/tmp/getopt: src/libgetopt.rs
|
||||
$(RUSTC) --test -o /tmp/getopt src/libgetopt.rs
|
||||
@ -150,3 +156,5 @@ build/bin/swab: src/swab.rs build rustlibs
|
||||
true: build/bin/true
|
||||
build/bin/true: src/true.c build
|
||||
$(CC) $(CFLAGS) -o $@ src/true.c
|
||||
|
||||
include tests/tests.mk
|
||||
|
@ -33,6 +33,7 @@ line:
|
||||
.RS
|
||||
printf 'hello world!\(rsn' | swab
|
||||
.RE
|
||||
.\" If you change this, make sure to change it in tests/bonsai/swab.mk too.
|
||||
|
||||
Produces the following output:
|
||||
|
||||
|
36
tests/README
Normal file
36
tests/README
Normal file
@ -0,0 +1,36 @@
|
||||
The testing suite contains two trees: the Bonsai tree and the POSIX tree:
|
||||
|
||||
.
|
||||
├── README
|
||||
├── bonsai/
|
||||
│ ├── dj.mk
|
||||
│ ├── false.mk
|
||||
│ ├── fop.mk
|
||||
│ └── ...
|
||||
├── posix/
|
||||
└── tests.mk
|
||||
|
||||
The Bonsai tree tests the functionality of Harakit utilities for regressions and
|
||||
other issues relating to compliance to our standards of practice.
|
||||
|
||||
The POSIX tests are currently a work-in-progress. Their status in this
|
||||
repository is uncertain.
|
||||
|
||||
Both sets of tests also inherit the environment set by the top-level Makefile,
|
||||
which sets the BIN variable to the build/bin directory at the root of the
|
||||
project; therefore, each binary is located at $(BIN)/tool for idiomatic access.
|
||||
|
||||
Each test contains a set of PHONY targets which are prefixed with the name of
|
||||
the tool being tested and an underscore. The first target is tests, which
|
||||
depends on all the other targets in the test file. These test files are each
|
||||
included in the top Makefile, so they can be called from the root of the
|
||||
repository. This also means that BIN can be set manually so that tests can be
|
||||
run using make(1) inside of the tests directory:
|
||||
|
||||
$ make -f tests.mk BIN=../build/bin dj_tests
|
||||
|
||||
--
|
||||
Copyright © 2024 Emma Tebibyte <emma@tebibyte.media>
|
||||
|
||||
This work is licensed under CC BY-SA 4.0. To view a copy of this license, visit
|
||||
<http://creativecommons.org/licenses/by-sa/4.0/>.
|
48
tests/bonsai/dj.mk
Executable file
48
tests/bonsai/dj.mk
Executable file
@ -0,0 +1,48 @@
|
||||
# Copyright (c) 2024 DTB <trinity@trinity.moe>
|
||||
# Copyright (c) 2024 Emma Tebibyte <emma@tebibyte.media>
|
||||
# SPDX-License-Identifier: FSFAP
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice and this
|
||||
# notice are preserved. This file is offered as-is, without any warranty.
|
||||
|
||||
.PRAGMA: command_comment
|
||||
|
||||
/dev/full:
|
||||
/dev/null:
|
||||
|
||||
.PHONY: dj_tests
|
||||
dj_tests: dj_help dj_full dj_null # dj_skip_stdin
|
||||
|
||||
.PHONY: dj_full
|
||||
# Linux has a /dev/full pseudodevice useful for testing errors.
|
||||
dj_full: $(BIN)/dj /dev/full
|
||||
case "$$(uname)" in \
|
||||
Linux) \
|
||||
$(BIN)/dj -Hi /dev/zero -o /dev/full 2>&1 \
|
||||
| tee /dev/stderr \
|
||||
| xargs -I out test '1+0 > 0+0; 1024 > 0' = out \
|
||||
;; \
|
||||
esac
|
||||
|
||||
.PHONY: dj_help
|
||||
dj_help: $(BIN)/dj
|
||||
! $(BIN)/dj -h
|
||||
|
||||
.PHONY: dj_null
|
||||
# Read nothing from /dev/null, write nothing to /dev/null.
|
||||
dj_null: $(BIN)/dj /dev/null
|
||||
$(BIN)/dj -Hi /dev/null -o /dev/null 2>&1 \
|
||||
| tee /dev/stderr \
|
||||
| xargs -I out test '0+0 > 0+0; 0 > 0' = out
|
||||
|
||||
# This test currently fails. This is probably due to dj(1) being stale relative
|
||||
# to the main harakit branch. TODO: Reassess once the testing branch is merged.
|
||||
# .PHONY: dj_skip_stdin
|
||||
# # Test skipping stdin.
|
||||
# dj_skip_stdin: $(BIN)/dj
|
||||
# # Pipe 1024B of '\0' into dj(1); skip the first 24B; expect 1000B written.
|
||||
# dd count=1 bs=1024 </dev/zero 2>/dev/null \
|
||||
# | $(BIN)/dj -H -s 24 -o /dev/null 2>&1 \
|
||||
# | tee /dev/stderr \
|
||||
# | xargs -I out test '1+0 > 1+0; 1024 > 1000' = out
|
18
tests/bonsai/false.mk
Executable file
18
tests/bonsai/false.mk
Executable file
@ -0,0 +1,18 @@
|
||||
# Copyright (c) 2024 DTB <trinity@trinity.moe>
|
||||
# Copyright (c) 2024 Emma Tebibyte <emma@tebibyte.media>
|
||||
# SPDX-License-Identifier: FSFAP
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice and this
|
||||
# notice are preserved. This file is offered as-is, without any warranty.
|
||||
|
||||
.PHONY: false_tests
|
||||
false_tests: false_test false_help
|
||||
|
||||
.PHONY: false
|
||||
false_test: $(BIN)/false
|
||||
! $(BIN)/false
|
||||
|
||||
.PHONY: false_help
|
||||
false_help: $(BIN)/false
|
||||
! $(BIN)/false -h
|
31
tests/bonsai/fop.mk
Executable file
31
tests/bonsai/fop.mk
Executable file
@ -0,0 +1,31 @@
|
||||
# Copyright (c) 2024 Emma Tebibyte <emma@tebibyte.media>
|
||||
# SPDX-License-Identifier: FSFAP
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice and this
|
||||
# notice are preserved. This file is offered as-is, without any warranty.
|
||||
|
||||
.PHONY: fop_tests
|
||||
fop_tests: fop_functionality fop_delimiter fop_help fop_fail
|
||||
|
||||
.PHONY: fop_help
|
||||
fop_help: $(BIN)/fop
|
||||
! $(BIN)/fop -h
|
||||
|
||||
.PHONY: fop_delimiter
|
||||
fop_delimiter: $(BIN)/fop
|
||||
test "$$(printf 'test1 test1 test1\n' | $(BIN)/fop -d' ' 2 sed 's/2/4/g')" \
|
||||
= 'test1 test1 test4'
|
||||
test "$$(printf 'meowsetwoofsetribbit\n' \
|
||||
| $(BIN)/fop -d 'set' 1 sed 's/woof/meow/g')" = 'meowsetmeowsetribbit'
|
||||
|
||||
.PHONY: fop_fail
|
||||
fop_fail: $(BIN)/fop
|
||||
! printf 'test\n' | $(BIN)/fop 1 cat
|
||||
! printf 'test\n' | $(BIN)/fop 'test' cat
|
||||
! printf 'test\n' | $(BIN)/fop -d'test' cat
|
||||
|
||||
.PHONY: fop_functionality
|
||||
fop_functionality: $(BIN)/fop
|
||||
test "$$(printf 'test1\036test1\036test1\n' | $(BIN)/fop 1 sed 's/1/4/g')" \
|
||||
= "$$(printf 'test1\036test4\036test1\n')"
|
31
tests/bonsai/hru.mk
Executable file
31
tests/bonsai/hru.mk
Executable file
@ -0,0 +1,31 @@
|
||||
# Copyright (c) 2024 Emma Tebibyte <emma@tebibyte.media>
|
||||
# SPDX-License-Identifier: FSFAP
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice and this
|
||||
# notice are preserved. This file is offered as-is, without any warranty.
|
||||
|
||||
.PHONY: hru_tests
|
||||
hru_tests: hru_help hru_functionality hru_negative hru_regression
|
||||
|
||||
.PHONY: hru_help
|
||||
hru_help: $(BIN)/hru
|
||||
! $(BIN)/hru -h
|
||||
|
||||
.PHONY: hru_functionality
|
||||
hru_functionality: $(BIN)/hru
|
||||
test "$(printf '1234\n' | $(BIN)/hru)" = '1.2 kB'
|
||||
test "$(printf '0\n' | $(BIN)/hru)" = '0 B'
|
||||
|
||||
.PHONY: hru_negative
|
||||
hru_negative: $(BIN)/hru
|
||||
! printf '%s\n' '-1' | $(BIN)/hru
|
||||
|
||||
.PHONY: hru_regressions
|
||||
hru_regressions: $(BIN)/hru
|
||||
n=1; \
|
||||
while true; \
|
||||
do n="$$(($$n * 10))"; \
|
||||
printf '%s\n' "$$n" | $(BIN)/hru || break; \
|
||||
done; \
|
||||
printf 'Max float: %s\n' "$$n"
|
63
tests/bonsai/intcmp.mk
Executable file
63
tests/bonsai/intcmp.mk
Executable file
@ -0,0 +1,63 @@
|
||||
# Copyright (c) 2024 DTB <trinity@trinity.moe>
|
||||
# Copyright (c) 2024 Emma Tebibyte <emma@tebibyte.media>
|
||||
# SPDX-License-Identifier: FSFAP
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice and this
|
||||
# notice are preserved. This file is offered as-is, without any warranty.
|
||||
|
||||
.PHONY: intcmp_tests
|
||||
intcmp_tests: intcmp_help intcmp_e intcmp_g intcmp_l intcmp_combined
|
||||
|
||||
.PHONY: intcmp_help
|
||||
intcmp_help: $(BIN)/intcmp
|
||||
! $(BIN)/intcmp -h
|
||||
|
||||
# These test that integer comparisons are working as they should. For the sake
|
||||
# of readability (to facilitate faster skimming) these recipes follow a
|
||||
# columned format:
|
||||
# $binary -flags d d d d # op
|
||||
# For flag meanings reference intcmp(1) (though they are somewhat self
|
||||
# explanatory). d here refers to a decimal number; a mixture of 1s, 2s, and 3s
|
||||
# (a particularly lovely number) arranged to demonstrate easily the operation
|
||||
# under scrutiny. The commented op is the operation that is true for the given
|
||||
# numbers. For example:
|
||||
# $(BIN)/intcmp -e 3 3 3 3 # ==
|
||||
# op here is ==; 3 == 3 == 3 == 3. The flag being used is -e, to test for
|
||||
# equality, so this test should succeed.
|
||||
# ! $(BIN)/intcmp -l 3 2 1 # >
|
||||
# op here is >; 3 > 2 > 1. The flag being used is -l, to test for each integer
|
||||
# being less than the next, so intcmp should fail - hence the ! at the start of
|
||||
# the invocation. If this test failed, intcmp(1) would be confusing -l for -g,
|
||||
# so that would be a good place to start looking for bugs.
|
||||
|
||||
.PHONY: intcmp_e
|
||||
intcmp_e: $(BIN)/intcmp
|
||||
$(BIN)/intcmp -e 3 3 3 # ==
|
||||
! $(BIN)/intcmp -e 1 2 3 # <
|
||||
! $(BIN)/intcmp -e 3 2 1 # >
|
||||
|
||||
.PHONY: intcmp_g
|
||||
intcmp_g: $(BIN)/intcmp
|
||||
$(BIN)/intcmp -g 3 2 1 # >
|
||||
! $(BIN)/intcmp -g 3 3 3 # ==
|
||||
! $(BIN)/intcmp -g 1 2 3 # <
|
||||
$(BIN)/intcmp -ge 3 3 1 # >=
|
||||
! $(BIN)/intcmp -ge 1 2 3 # <
|
||||
|
||||
.PHONY: intcmp_l
|
||||
intcmp_l: $(BIN)/intcmp
|
||||
$(BIN)/intcmp -l 1 2 3 # <
|
||||
! $(BIN)/intcmp -l 3 3 3 # ==
|
||||
! $(BIN)/intcmp -l 3 2 1 # >
|
||||
$(BIN)/intcmp -le 1 3 3 # <=
|
||||
! $(BIN)/intcmp -le 3 2 1 # >
|
||||
|
||||
.PHONY: intcmp_combined
|
||||
intcmp_combined: $(BIN)/intcmp
|
||||
$(BIN)/intcmp -gl 1 2 3 # <
|
||||
$(BIN)/intcmp -gl 3 2 1 # >
|
||||
$(BIN)/intcmp -gl 1 3 1 # !=
|
||||
! $(BIN)/intcmp -gl 3 3 3 # ==
|
||||
$(BIN)/intcmp -egl 3 1 1 3 # >, ==, <
|
||||
! $(BIN)/intcmp -egl foo # huh?
|
27
tests/bonsai/mm.mk
Executable file
27
tests/bonsai/mm.mk
Executable file
@ -0,0 +1,27 @@
|
||||
# Copyright (c) 2024 E$(NAME)a Tebibyte <e$(NAME)a@tebibyte.media>
|
||||
# SPDX-License-Identifier: FSFAP
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice and this
|
||||
# notice are preserved. This file is offered as-is, without any warranty.
|
||||
|
||||
NAME = mm
|
||||
TARGET = $(NAME)_tests
|
||||
BINARY = $(BIN)/$(NAME)
|
||||
|
||||
.PHONY: mm_tests
|
||||
mm_tests: mm_args mm_help mm_stderr
|
||||
|
||||
.PHONY: mm_args
|
||||
# mm(1) will error if positional arguments are given without -i or -o
|
||||
mm_args: $(BIN)/mm
|
||||
! $(BIN)/mm argument
|
||||
|
||||
.PHONY: mm_help
|
||||
mm_help: $(BIN)/mm
|
||||
! $(BIN)/mm -h
|
||||
|
||||
.PHONY: mm_stderr
|
||||
# check if stderr is empty upon specifying -e
|
||||
mm_stderr: $(BIN)/mm
|
||||
! test "$$(printf 'test\n' | $(BIN)/mm -i - -e 2>&1 >/dev/null)" = "test"
|
72
tests/bonsai/npc.mk
Executable file
72
tests/bonsai/npc.mk
Executable file
@ -0,0 +1,72 @@
|
||||
#!/bin/sh
|
||||
# Copyright (c) 2024 DTB <trinity@trinity.moe>
|
||||
# Copyright (c) 2024 Emma Tebibyte <emma@tebibyte.media>
|
||||
# SPDX-License-Identifier: FSFAP
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice and this
|
||||
# notice are preserved. This file is offered as-is, without any warranty.
|
||||
|
||||
.PRAGMA: command_comment
|
||||
|
||||
.PHONY: npc_tests
|
||||
npc_tests: npc_help npc_args npc_ascii
|
||||
|
||||
.PHONY: npc_help
|
||||
npc_help: $(BIN)/npc
|
||||
! $(BIN)/npc -h
|
||||
|
||||
.PHONY: npc_args
|
||||
# arg parsing
|
||||
npc_args:
|
||||
$(BIN)/npc -e </dev/null
|
||||
$(BIN)/npc -t </dev/null
|
||||
$(BIN)/npc -et </dev/null
|
||||
! $(BIN)/npc -et 5 </dev/null
|
||||
|
||||
.PHONY: npc_ascii
|
||||
# Test 0x00 to 0x7f in input; in other words, the full 7b ASCII range.
|
||||
npc_ascii: npc_ascii_controls npc_ascii_symbols npc_ascii_uppers # \
|
||||
# npc_ascii_lowers
|
||||
|
||||
.PHONY: npc_ascii_controls
|
||||
# (control characters)
|
||||
npc_ascii_controls:
|
||||
# ASCII 0x00 to 0x0a (before the newline, due to xargs(1p) issues)
|
||||
awk 'BEGIN{ for (i = 0; i < 32; ++i) printf("%c", i); }' \
|
||||
| $(BIN)/npc \
|
||||
| head -n 1 \
|
||||
| xargs -I out test "^@^A^B^C^D^E^F^G^H" = out
|
||||
|
||||
# ASCII 0x0a (otherwise the head|tail sequence won't work) to 0x1f
|
||||
awk 'BEGIN{ for (i = 0; i < 32; ++i) printf("%c", i); print }' \
|
||||
| $(BIN)/npc \
|
||||
| head -n 2 \
|
||||
| tail -n 1 \
|
||||
| xargs -I out test "^K^L^M^N^O^P^Q^R^S^T^U^V^W^X^Y^Z^[^\^]^^^_"
|
||||
|
||||
.PHONY: npc_ascii_symbols
|
||||
# ASCII 0x1f to 0x3f (^_ and symbols)
|
||||
npc_ascii_symbols:
|
||||
# shell quoting olympics
|
||||
awk 'BEGIN{ for (i = 31; i < 64; ++i) printf("%c", i); print }' \
|
||||
| $(BIN)/npc \
|
||||
| sed -e s"/\'/\\\'/g" -e 's/"/\\"/g' \
|
||||
| xargs -I out test "^_ !\"#$$%&'()*+,-./0123456789:;<=>?" = out
|
||||
|
||||
.PHONY: npc_ascii_uppers
|
||||
# ASCII 0x40 to 0x5f (uppercases)
|
||||
npc_ascii_uppers:
|
||||
awk 'BEGIN{ for (i = 64; i < 96; ++i) printf("%c", i); print }' \
|
||||
| $(BIN)/npc \
|
||||
| sed 's/\\/\\\\/' \
|
||||
| xargs -I out test @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_ = out
|
||||
|
||||
# This test is broken and will need closer inspection along with the npc(1)
|
||||
# source.
|
||||
# .PHONY: npc_ascii_lowers
|
||||
# # ASCII 0x60 to 0x7f (lowercases)
|
||||
# npc_ascii_lowers:
|
||||
# awk 'BEGIN{ for (i = 96; i < 128; ++i) printf("%c", i); print }' \
|
||||
# | $(BIN)/npc \
|
||||
# | xargs -I out test "\`abcdefghijklmnopqrstuvwxyz{|}~^?" = out
|
43
tests/bonsai/rpn.mk
Executable file
43
tests/bonsai/rpn.mk
Executable file
@ -0,0 +1,43 @@
|
||||
# Copyright (c) 2024 Emma Tebibyte <emma@tebibyte.media>
|
||||
# SPDX-License-Identifier: FSFAP
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice and this
|
||||
# notice are preserved. This file is offered as-is, without any warranty.
|
||||
|
||||
.PHONY: rpn_tests
|
||||
rpn_tests: rpn_help rpn_add
|
||||
|
||||
.PHONY: rpn_help
|
||||
rpn_help: $(BIN)/rpn
|
||||
! $(BIN)/rpn -h
|
||||
|
||||
.PHONY: rpn_add
|
||||
rpn_add: $(BIN)/rpn
|
||||
test "$$($(BIN)/rpn 1 2 +)" -eq 3
|
||||
test "$$($(BIN)/rpn 0.2 0.1 +)" = 0.3
|
||||
|
||||
.PHONY: rpn_sub
|
||||
rpn_sub: $(BIN)/rpn
|
||||
test "$$($(BIN)/rpn 23 5 -)" -eq 18
|
||||
test "$$($(BIN)/rpn 0.3 0.1)" = 0.2
|
||||
|
||||
.PHONY: rpn_mul
|
||||
rpn_mul: $(BIN)/rpn
|
||||
test "$$($(BIN)/rpn 1.2 3 '*')" = 3.6
|
||||
test "$$($(BIN)/rpn 0 3 '*')" -eq 0
|
||||
|
||||
.PHONY: rpn_div
|
||||
rpn_div: $(BIN)/rpn
|
||||
test "$$($(BIN)/rpn 12 5 /)" = 2.4
|
||||
test "$$($(BIN)/rpn 3 0 /)" -eq inf
|
||||
|
||||
.PHONY: rpn_mod
|
||||
rpn_mod: $(BIN)/rpn
|
||||
test "$$($(BIN)/rpn 12 5 %)" -eq 2
|
||||
test "$$($(BIN)/rpn 9 4 %)" -eq 1
|
||||
|
||||
.PHONY: rpn_flr
|
||||
rpn_flr: $(BIN)/rpn
|
||||
test "$$($(BIN)/rpn 12 5 //)" -eq 2
|
||||
test "$$($(BIN)/rpn 9 4 //)" -eq 2
|
46
tests/bonsai/scrut.mk
Executable file
46
tests/bonsai/scrut.mk
Executable file
@ -0,0 +1,46 @@
|
||||
#!/bin/sh
|
||||
# Copyright (c) 2024 DTB <trinity@trinity.moe>
|
||||
# SPDX-License-Identifier: FSFAP
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice and this
|
||||
# notice are preserved. This file is offered as-is, without any warranty.
|
||||
|
||||
.PRAGMA: command_comment
|
||||
|
||||
.PHONY: scrut_tests
|
||||
scrut_tests: scrut_help scrut_options
|
||||
|
||||
.PHONY: scrut_help
|
||||
scrut_help: $(BIN)/scrut
|
||||
! $(BIN)/scrut -h
|
||||
|
||||
.PHONY: scrut_options
|
||||
# scrut tests file attributes, but files of a certain attribute aren't
|
||||
# guaranteed to be present on a system. This test checks all of the files in
|
||||
# harakit and, if test(1p) says a file matches a certain attribute, then checks
|
||||
# scrut.
|
||||
# opts are space-delimited (for command splitting), sel is not
|
||||
scrut_options: $(BIN)/scrut
|
||||
set -e; \
|
||||
opts="b c d e f g k p r s u w x L S"; \
|
||||
sel=; \
|
||||
find . -name .git -prune -o -print \
|
||||
| while read -r f; do \
|
||||
for opt in $$opts; \
|
||||
do if ! printf "%s\n" $$sel | grep $$opt >/dev/null; then \
|
||||
if test -$$opt "$$f"; then \
|
||||
if ! $(BIN)/scrut -$$opt "$$f"; \
|
||||
then printf "[!!] scrut -%s failed on %s.\n" \
|
||||
$$opt "$$f"; \
|
||||
fi; \
|
||||
sel="$$sel$$opt"; \
|
||||
printf "[OK] Tested scrut -%s using %s\n" \
|
||||
$$opt "$$f"; \
|
||||
fi; \
|
||||
fi; \
|
||||
done; \
|
||||
if printf "%s\n" "$$opts" | sed 's/ //g' | xargs test "$$sel" =; \
|
||||
then break; \
|
||||
fi; \
|
||||
done
|
20
tests/bonsai/str.mk
Executable file
20
tests/bonsai/str.mk
Executable file
@ -0,0 +1,20 @@
|
||||
# Copyright (c) 2024 DTB <trinity@trinity.moe>
|
||||
# SPDX-License-Identifier: FSFAP
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice and this
|
||||
# notice are preserved. This file is offered as-is, without any warranty.
|
||||
|
||||
.PRAGMA: command_comment
|
||||
|
||||
.PHONY: str_tests
|
||||
str_tests: str_help str_isalpha
|
||||
|
||||
.PHONY: str_help
|
||||
str_help: $(BIN)/str
|
||||
! $(BIN)/str -h
|
||||
|
||||
.PHONY: str_isalpha
|
||||
str_isalpha: $(BIN)/str
|
||||
$(BIN)/str isalpha c
|
||||
! $(BIN)/str isalpha 3
|
31
tests/bonsai/strcmp.mk
Executable file
31
tests/bonsai/strcmp.mk
Executable file
@ -0,0 +1,31 @@
|
||||
# Copyright (c) 2024 DTB <trinity@trinity.moe>
|
||||
# Copyright (c) 2024 Emma Tebibyte <emma@tebibyte.media>
|
||||
# SPDX-License-Identifier: FSFAP
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice and this
|
||||
# notice are preserved. This file is offered as-is, without any warranty.
|
||||
|
||||
NAME = strcmp
|
||||
TARGET = $(NAME)_tests
|
||||
BINARY = $(BIN)/$(NAME)
|
||||
|
||||
.PHONY: strcmp_tests
|
||||
strcmp_tests: strcmp_equals strcmp_help strcmp_nocmp strcmp_unequals
|
||||
|
||||
.PHONY: strcmp_equals
|
||||
strcmp_equals: $(BIN)/strcmp
|
||||
$(BIN)/strcmp equals equals
|
||||
$(BIN)/strcmp - -
|
||||
|
||||
.PHONY: strcmp_help
|
||||
strcmp_help: $(BIN)/strcmp
|
||||
! $(BIN)/strcmp -h
|
||||
|
||||
.PHONY: strcmp_nocmp
|
||||
strcmp_nocmp: $(BIN)/strcmp
|
||||
! $(BIN)/strcmp nocmp
|
||||
|
||||
.PHONY: strcmp_unequals
|
||||
strcmp_unequals: $(BIN)/strcmp
|
||||
! $(BIN)/strcmp unequals equals
|
22
tests/bonsai/swab.mk
Executable file
22
tests/bonsai/swab.mk
Executable file
@ -0,0 +1,22 @@
|
||||
# Copyright (c) 2024 DTB <trinity@trinity.moe>
|
||||
# SPDX-License-Identifier: FSFAP
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice and this
|
||||
# notice are preserved. This file is offered as-is, without any warranty.
|
||||
|
||||
.PRAGMA: command_comment
|
||||
|
||||
.PHONY: swab_tests
|
||||
swab_tests: swab_help swab_examples
|
||||
|
||||
.PHONY: swab_help
|
||||
swab_help: $(BIN)/swab
|
||||
! $(BIN)/swab -h
|
||||
|
||||
.PHONY: swab_examples
|
||||
# These are the examples present in the man page.
|
||||
swab_examples: $(BIN)/swab
|
||||
printf 'hello world!\n' \
|
||||
| $(BIN)/swab \
|
||||
| xargs -I out test 'ehll oowlr!d' = out
|
19
tests/bonsai/true.mk
Executable file
19
tests/bonsai/true.mk
Executable file
@ -0,0 +1,19 @@
|
||||
#!/bin/sh
|
||||
# Copyright (c) 2024 DTB <trinity@trinity.moe>
|
||||
# Copyright (c) 2024 Emma Tebibyte <emma@tebibyte.media>
|
||||
# SPDX-License-Identifier: FSFAP
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice and this
|
||||
# notice are preserved. This file is offered as-is, without any warranty.
|
||||
|
||||
.PHONY: true_tests
|
||||
true_tests: true_test
|
||||
|
||||
.PHONY: true_help
|
||||
true_help: $(BIN)/true
|
||||
$(BIN)/true -h
|
||||
|
||||
.PHONY: true_test
|
||||
true_test: $(BIN)/true
|
||||
$(BIN)/true
|
@ -1,24 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Copyright (c) 2023–2024 Emma Tebibyte <emma@tebibyte.media>
|
||||
# SPDX-License-Identifier: FSFAP
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice and this
|
||||
# notice are preserved. This file is offered as-is, without any warranty.
|
||||
|
||||
set -e
|
||||
|
||||
if ! ls Makefile >/dev/null 2>&1
|
||||
then
|
||||
printf '%s: Run this script in the root of the project.\n' "$0" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
printf "Starting POSIX compatibility testing.\n"
|
||||
|
||||
for utility in tests/posix/*; do
|
||||
printf '%s: %s: Testing utility.\n' "$0" "$utility"
|
||||
"$utility"
|
||||
printf '\n'
|
||||
done
|
22
tests/posix/bin/cat
Executable file
22
tests/posix/bin/cat
Executable file
@ -0,0 +1,22 @@
|
||||
#!/bin/sh
|
||||
# Copyright (c) 2024 Emma Tebibyte <emma@tebibyte.media>
|
||||
# SPDX-License-Identifier: FSFAP
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice and this
|
||||
# notice are preserved. This file is offered as-is, without any warranty.
|
||||
|
||||
# Strictly POSIX-compliant cat(1) implementation. See cat(1p)
|
||||
|
||||
for arg in "$@"; do
|
||||
case "$arg" in
|
||||
-u) args="$(printf '%s %s\n' "$args" "$arg")" ;;
|
||||
*) args="$(printf -- '%s -i %s\n' "$args" "$arg")" ;;
|
||||
esac
|
||||
done
|
||||
|
||||
# See IEEE Std 1003.1-2017 3.282
|
||||
# https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_282
|
||||
IFS=' '
|
||||
|
||||
mm $args
|
12
tests/posix/bin/false
Executable file
12
tests/posix/bin/false
Executable file
@ -0,0 +1,12 @@
|
||||
#!/bin/sh
|
||||
# Copyright (c) 2024 DTB <trinity@trinity.moe>
|
||||
# Copyright (c) 2024 Emma Tebibyte <emma@tebibyte.media>
|
||||
# SPDX-License-Identifier: FSFAP
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice and this
|
||||
# notice are preserved. This file is offered as-is, without any warranty.
|
||||
|
||||
# Strictly POSIX-compliant false(1) implementation. See false(1p)
|
||||
|
||||
false "$@"
|
11
tests/posix/bin/true
Executable file
11
tests/posix/bin/true
Executable file
@ -0,0 +1,11 @@
|
||||
#!/bin/sh
|
||||
# Copyright (c) 2024 DTB <trinity@trinity.moe>
|
||||
# Copyright (c) 2024 Emma Tebibyte <emma@tebibyte.media>
|
||||
# SPDX-License-Identifier: FSFAP
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice and this
|
||||
# notice are preserved. This file is offered as-is, without any warranty.
|
||||
|
||||
# Strictly POSIX-compliant true(1) implementation. See true(1p)
|
||||
true "$@"
|
5
tests/posix/posix_env
Normal file
5
tests/posix/posix_env
Normal file
@ -0,0 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -ex
|
||||
|
||||
PATH="$PWD/bin:$PATH"
|
15
tests/tests.mk
Normal file
15
tests/tests.mk
Normal file
@ -0,0 +1,15 @@
|
||||
# Copyright (c) 2024 Emma Tebibyte <emma@tebibyte.media>
|
||||
# SPDX-License-Identifier: FSFAP
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice and this
|
||||
# notice are preserved. This file is offered as-is, without any warranty.
|
||||
|
||||
|
||||
#TESTFILES != for file in tests/bonsai/*.mk tests/posix/*.mk; do printf '%s ' "$$file"; done;
|
||||
TESTFILES != for file in tests/bonsai/*.mk; do printf '%s ' "$$file"; done;
|
||||
|
||||
TESTS != printf '%s\n' "$(TESTFILES)" | xargs -n1 basename \
|
||||
| sed 's/\.mk/_tests/g'
|
||||
|
||||
include $(TESTFILES)
|
Loading…
Reference in New Issue
Block a user