#! /usr/libexec/atf-sh
#
# Copyright (c) 2024 Klara, Inc.
#
# SPDX-License-Identifier: BSD-2-Clause
#

atf_test_case noargs
noargs_head() {
	atf_set descr "No arguments"
}
noargs_body() {
	atf_check -s exit:1 -e match:"^usage:" \
		  lorder
}

atf_test_case onearg
onearg_head() {
	atf_set descr "One argument"
}
onearg_body() {
	echo "void a(void) { }" >a.c
	cc -o a.o -c a.c
	echo "a.o a.o" >output
	atf_check -o file:output \
		  lorder *.o
}

atf_test_case dashdash
dashdash_head() {
	atf_set descr "One argument"
}
dashdash_body() {
	echo "void a(void) { }" >a.c
	cc -o a.o -c a.c
	echo "a.o a.o" >output
	atf_check -o file:output \
		  lorder -- *.o
}

atf_test_case nonexistent
nonexistent_head() {
	atf_set descr "Nonexistent file"
}
nonexistent_body() {
	atf_check -s not-exit:0 -e match:"No such file" -o empty \
		  lorder nonexistent.o
}

atf_test_case invalid
invalid_head() {
	atf_set descr "Invalid file"
}
invalid_body() {
	echo "not an object file" >invalid.o
	atf_check -s not-exit:0 -e match:"not recognized" -o empty \
		  lorder invalid.o
}

atf_test_case objects
objects_head() {
	atf_set descr "Order objects"
}
objects_body() {
	echo "void a(void) { }" >a.c
	echo "void a(void); void b(void) { a(); }" >b.c
	echo "void b(void); void c(void) { b(); }" >c.c
	for n in a b c ; do
		cc -o $n.o -c $n.c
		echo "$n.o $n.o"
	done >output
	echo "b.o a.o" >>output
	echo "c.o b.o" >>output
	atf_check -o file:output \
		  lorder *.o
}

atf_test_case archives
archives_head() {
	atf_set descr "Order archives"
}
archives_body() {
	echo "void a(void) { }" >a.c
	echo "void a(void); void b(void) { a(); }" >b.c
	echo "void b(void); void c(void) { b(); }" >c.c
	echo "void e(void); void d(void) { e(); }" >d.c
	echo "void d(void); void e(void) { d(); }" >e.c
	for n in a b c d e ; do
		cc -o $n.o -c $n.c
	done
	for n in a b c ; do
		ar -crs $n.a $n.o
		echo "$n.a $n.a"
	done >output
	ar -crs z.a d.o e.o
	echo "z.a z.a" >>output
	echo "b.a a.a" >>output
	echo "c.a b.a" >>output
	atf_check -o file:output \
		  lorder *.a
}

atf_init_test_cases()
{
	atf_add_test_case noargs
	atf_add_test_case onearg
	atf_add_test_case dashdash
	atf_add_test_case nonexistent
	atf_add_test_case invalid
	atf_add_test_case objects
	atf_add_test_case archives
}
