# Copyright © 2012, 2020 Nick Bowler
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
AT_BANNER([Randomized tests])
dnl Verify that randomdecl actually produces all keywords and a variety
dnl of different declarations.
AT_SETUP([randomdecl sanity])
TEST_NEED_PROGRAM([randomdecl])
m4_define([sanity_tests], [dnl
[[^declare], [declaration of an identifier]],
[[^type], [type name]],
[[inline], [inline function specifier]],
[[inline inline], [redundant function specifiers]],
[[function (@<:@@<:@:alnum:@:>@_@:>@* as], [named function parameter]],
[[function (void)], [empty prototype declaration]],
[[function returning], [non-prototype function declaration]],
[[\.\.\.], [variadic function]],
[[const], [const qualifier]],
[[volatile], [volatile qualifier]],
[[restrict], [restrict qualifier]],
[[const const], [redundant type qualifiers]],
[[variable-length array], [variable-length array]],
[[static], [static storage-class specifier]],
[[extern], [extern storage-class specifier]],
[[typedef], [typedef storage-class specifier]],
[[auto], [auto storage-class specifier]],
[[register], [register storage-class specifier]],
[[void], [void type specifier]],
[[char], [char type specifier]],
[[short], [short type specifier]],
[[int], [int type specifier]],
[[long], [long type specifier]],
[[float], [float type specifier]],
[[double], [double type specifier]],
[[signed], [signed type specifier]],
[[unsigned], [unsigned type specifier]],
[[_Bool], [_Bool type specifier]],
[[_Complex], [_Complex type specifier]],
[[_Imaginary], [_Imaginary type specifier]],
[[union], [union type specifier]],
[[enum], [enum type specifier]],
[[pointer to array], [pointer to an array]],
[[pointer to function], [pointer to a function]],
])
m4_define([sanity_sed], [/$1/i\
AS_TR_SH([$2])=:])
AT_DATA([sanity.sed], [#n
m4_map_sep([sanity_sed], [m4_newline], [sanity_tests])
])
printf 'Using seed %d\n' "$random_seed" >&AS_MESSAGE_LOG_FD
AT_CHECK([randomdecl -En 10000 -s "$random_seed" >decls], [0], [ignore-nolog])
AT_CHECK([sed -f sanity.sed decls], [0], [stdout-nolog])
sort -u stdout >decls.chk
exec 3&AS_MESSAGE_LOG_FD
AT_CHECK([randomdecl -n "$random_iter" -s "$random_seed"],, [stdout-nolog])
AT_CHECK([crossparse -f stdout])
AT_CLEANUP