1*efb6347dSDaniel Golle#!/bin/sh 2*efb6347dSDaniel Golle# SPDX-License-Identifier: GPL-2.0-only 3*efb6347dSDaniel Golle# 4*efb6347dSDaniel Golle# Run dt-check-style against fixtures under good/ and bad/. 5*efb6347dSDaniel Golle# good/ files must produce no output and exit 0 in both modes. 6*efb6347dSDaniel Golle# bad/ files must produce the expected output (in expected/<name>.txt) 7*efb6347dSDaniel Golle# and exit 1. 8*efb6347dSDaniel Golle# 9*efb6347dSDaniel Golle# The mode used for a bad fixture is whichever produces a violation: 10*efb6347dSDaniel Golle# trailing-whitespace and tab fixtures use the default (relaxed), 11*efb6347dSDaniel Golle# the rest use --mode=strict. The expected output files name the 12*efb6347dSDaniel Golle# mode in their first line. 13*efb6347dSDaniel Golle 14*efb6347dSDaniel Golleset -u 15*efb6347dSDaniel Golle 16*efb6347dSDaniel Gollehere=$(cd "$(dirname "$0")" && pwd) 17*efb6347dSDaniel Golletool="$here/../dt-check-style" 18*efb6347dSDaniel Gollefail=0 19*efb6347dSDaniel Golle 20*efb6347dSDaniel Gollerun() { 21*efb6347dSDaniel Golle file=$1 22*efb6347dSDaniel Golle mode=$2 23*efb6347dSDaniel Golle "$tool" --mode="$mode" "$file" 2>&1 24*efb6347dSDaniel Golle} 25*efb6347dSDaniel Golle 26*efb6347dSDaniel Golle# good/ -- must exit 0 and produce no output in both modes 27*efb6347dSDaniel Gollefor f in "$here"/good/*; do 28*efb6347dSDaniel Golle [ -e "$f" ] || continue 29*efb6347dSDaniel Golle for mode in relaxed strict; do 30*efb6347dSDaniel Golle out=$(run "$f" "$mode") 31*efb6347dSDaniel Golle rc=$? 32*efb6347dSDaniel Golle if [ -n "$out" ] || [ "$rc" -ne 0 ]; then 33*efb6347dSDaniel Golle echo "FAIL good/$mode: $(basename "$f") (exit $rc, want 0):" 34*efb6347dSDaniel Golle echo "$out" | sed 's/^/ /' 35*efb6347dSDaniel Golle fail=$((fail + 1)) 36*efb6347dSDaniel Golle fi 37*efb6347dSDaniel Golle done 38*efb6347dSDaniel Golledone 39*efb6347dSDaniel Golle 40*efb6347dSDaniel Golle# bad/ -- must match expected/<name>.txt 41*efb6347dSDaniel Gollefor f in "$here"/bad/*; do 42*efb6347dSDaniel Golle [ -e "$f" ] || continue 43*efb6347dSDaniel Golle name=$(basename "$f") 44*efb6347dSDaniel Golle expected="$here/expected/$name.txt" 45*efb6347dSDaniel Golle if [ ! -f "$expected" ]; then 46*efb6347dSDaniel Golle echo "FAIL bad: missing $expected" 47*efb6347dSDaniel Golle fail=$((fail + 1)) 48*efb6347dSDaniel Golle continue 49*efb6347dSDaniel Golle fi 50*efb6347dSDaniel Golle mode=$(head -1 "$expected" | sed 's/^# mode=//') 51*efb6347dSDaniel Golle body=$(tail -n +2 "$expected") 52*efb6347dSDaniel Golle out=$(run "$f" "$mode") 53*efb6347dSDaniel Golle rc=$? 54*efb6347dSDaniel Golle # Strip the directory prefix so expected files are portable. 55*efb6347dSDaniel Golle out=$(printf '%s\n' "$out" | sed "s|$here/bad/|bad/|g") 56*efb6347dSDaniel Golle if [ "$out" != "$body" ] || [ "$rc" -ne 1 ]; then 57*efb6347dSDaniel Golle echo "FAIL bad/$mode: $name (exit $rc, want 1):" 58*efb6347dSDaniel Golle bf=$(mktemp) 59*efb6347dSDaniel Golle printf '%s\n' "$body" > "$bf" 60*efb6347dSDaniel Golle printf '%s\n' "$out" | diff -u "$bf" - | sed 's/^/ /' 61*efb6347dSDaniel Golle rm -f "$bf" 62*efb6347dSDaniel Golle fail=$((fail + 1)) 63*efb6347dSDaniel Golle fi 64*efb6347dSDaniel Golledone 65*efb6347dSDaniel Golle 66*efb6347dSDaniel Golleif [ "$fail" -eq 0 ]; then 67*efb6347dSDaniel Golle echo "PASS" 68*efb6347dSDaniel Golle exit 0 69*efb6347dSDaniel Gollefi 70*efb6347dSDaniel Golleecho "FAILED ($fail)" 71*efb6347dSDaniel Golleexit 1 72