1# -*- Autotest -*- 2 3AT_BANNER([M4sugar.]) 4 5# Copyright (C) 2000, 2001, 2002, 2005, 2006 Free Software Foundation, Inc. 6# 7# This program is free software; you can redistribute it and/or modify 8# it under the terms of the GNU General Public License as published by 9# the Free Software Foundation; either version 2, or (at your option) 10# any later version. 11# 12# This program is distributed in the hope that it will be useful, 13# but WITHOUT ANY WARRANTY; without even the implied warranty of 14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15# GNU General Public License for more details. 16# 17# You should have received a copy of the GNU General Public License 18# along with this program; if not, write to the Free Software 19# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 20# 02110-1301, USA. 21 22 23# AT_CHECK_M4SUGAR_TEXT(CODE, STDOUT, STDERR) 24# ------------------------------------------- 25# Check that m4sugar CODE expands to STDOUT and emits STDERR. 26m4_define([AT_CHECK_M4SUGAR_TEXT], 27[ 28AT_DATA_M4SUGAR([script.4s], 29[[m4_init 30m4_divert_push(0)[]dnl 31]$1[[]dnl 32m4_divert_pop(0) 33]]) 34 35AT_CHECK_M4SUGAR([-o-],, [$2], [$3]) 36])# AT_CHECK_M4SUGAR_TEXT 37 38 39# Order of the tests: 40# - m4_warn 41# 42# - m4_require 43# uses warn/error code. 44# 45# - m4_text_wrap 46 47## --------- ## 48## m4_warn. ## 49## --------- ## 50 51AT_SETUP([m4@&t@_warn]) 52 53# m4_text_wrap is used to display the help strings. Also, check that 54# commas are not swallowed. This can easily happen because of 55# m4-listification. 56 57# FIXME: For the time being we use -f to make sure we do issue the 58# warnings. But maybe autom4te should handle that by itself? 59 60AT_DATA_M4SUGAR([script.4s], 61[[m4_init 62m4_defun([cross_warning], [m4_warn([cross], [cross])]) 63 64m4_divert([0])dnl 65m4_warn([obsolete], [obsolete])dnl 66cross_warning[]dnl 67m4_warn([syntax], [syntax])dnl 68]]) 69 70AT_CHECK_M4SUGAR([-o-], 0, [], 71[script.4s:7: warning: syntax 72]) 73 74AT_CHECK_M4SUGAR([-o- -Wall -f], 0, [], 75[script.4s:5: warning: obsolete 76script.4s:6: warning: cross 77script.4s:2: cross_warning is expanded from... 78script.4s:6: the top level 79script.4s:7: warning: syntax 80]) 81 82AT_CHECK_M4SUGAR([-o- -Wnone,cross -f], 0, [], 83[script.4s:6: warning: cross 84script.4s:2: cross_warning is expanded from... 85script.4s:6: the top level 86]) 87 88AT_CHECK_M4SUGAR([-o- -Wnone,cross,error -f], 1, [], 89[[script.4s:6: warning: cross 90script.4s:2: cross_warning is expanded from... 91script.4s:6: the top level 92]]) 93 94AT_CLEANUP 95 96 97## --------------------------- ## 98## m4_require: error message. ## 99## --------------------------- ## 100 101AT_SETUP([m4@&t@_require: error message]) 102 103AT_DATA_M4SUGAR([script.4s], 104[[m4_defun([foo], [FOO]) 105m4_require([foo]) 106]]) 107 108AT_CHECK_M4SUGAR([], 1, [], 109[[script.4s:2: error: m4@&t@_require(foo): cannot be used outside of an m4_defun'd macro 110script.4s:2: the top level 111autom4te: m4 failed with exit status: 1 112]]) 113AT_CLEANUP 114 115 116## ----------------------------------- ## 117## m4_require: circular dependencies. ## 118## ----------------------------------- ## 119 120AT_SETUP([m4@&t@_require: circular dependencies]) 121 122# m4_text_wrap is used to display the help strings. Also, check that 123# commas are not swallowed. This can easily happen because of 124# m4-listification. 125 126AT_DATA_M4SUGAR([script.4s], 127[[m4_defun([foo], [m4_require([bar])]) 128 129m4_defun([bar], [m4_require([foo])]) 130 131m4_defun([baz], [m4_require([foo])]) 132 133m4_init 134m4_divert([0])dnl 135baz 136]]) 137 138AT_CHECK_M4SUGAR([], 1, [], 139[[script.4s:9: error: m4@&t@_require: circular dependency of foo 140script.4s:3: bar is expanded from... 141script.4s:1: foo is expanded from... 142script.4s:5: baz is expanded from... 143script.4s:9: the top level 144autom4te: m4 failed with exit status: 1 145]]) 146AT_CLEANUP 147 148 149## -------------- ## 150## m4_text_wrap. ## 151## -------------- ## 152 153AT_SETUP([m4@&t@_text_wrap]) 154 155# m4_text_wrap is used to display the help strings. Also, check that 156# commas are not swallowed. This can easily happen because of 157# m4-listification. 158 159AT_DATA_M4SUGAR([script.4s], 160[[m4_divert([0])dnl 161m4_text_wrap([Short string */], [ ], [/* ], 20) 162 163m4_text_wrap([Much longer string */], [ ], [/* ], 20) 164 165m4_text_wrap([Short doc.], [ ], [ --short ], 30) 166 167m4_text_wrap([Short doc.], [ ], [ --too-wide], 30) 168 169m4_text_wrap([Super long documentation.], [ ], [ --too-wide], 30) 170 171m4_text_wrap([First, second , third, [,quoted]]) 172]]) 173 174AT_DATA([expout], 175[[/* Short string */ 176 177/* Much longer 178 string */ 179 180 --short Short doc. 181 182 --too-wide 183 Short doc. 184 185 --too-wide 186 Super long 187 documentation. 188 189First, second , third, [,quoted] 190]]) 191 192AT_CHECK_M4SUGAR([-o-], 0, [expout]) 193 194AT_CLEANUP 195 196## ------------------------------ ## 197## Standard regular expressions. ## 198## ------------------------------ ## 199 200AT_SETUP([Standard regular expressions]) 201 202# AT_CHECK_M4RE(RE-NAME, TEXT, INTENT = `ok' | `') 203# ------------------------------------------------ 204# Check whether RE-NAME (a macro whose definition is a regular expression) 205# matches TEXT. INTENT = `ok' if the match should succeed or else empty. 206m4_define([AT_CHECK_M4RE], 207[AT_CHECK_M4SUGAR_TEXT( 208[[m4_bregexp([$2], ^m4_defn([$1])$, [ok]) 209]], [$3 210])]) 211 212AT_CHECK_M4RE([m4_re_word], [ab9_c], [ok]) 213AT_CHECK_M4RE([m4_re_word], [_9abc], [ok]) 214AT_CHECK_M4RE([m4_re_word], [9ab_c]) 215 216AT_CHECK_M4RE([m4_re_string], [ab9_c], [ok]) 217AT_CHECK_M4RE([m4_re_string], [_9abc], [ok]) 218AT_CHECK_M4RE([m4_re_string], [9ab_c], [ok]) 219AT_CHECK_M4RE([m4_re_string], [9a@_c]) 220 221AT_CLEANUP 222 223## ---------- ## 224## M4 Loops. ## 225## ---------- ## 226 227AT_SETUP([M4 loops]) 228 229AT_CHECK_M4SUGAR_TEXT([[dnl 230m4_define([myvar], [outer value])dnl 231m4_for([myvar], 1, 3, 1, [ myvar]) 232m4_for([myvar], 1, 3, , [ myvar]) 233m4_for([myvar], 3, 1,-1, [ myvar]) 234m4_for([myvar], 3, 1, , [ myvar]) 235m4_for([myvar], 1, 3, 2, [ myvar]) 236m4_for([myvar], 3, 1,-2, [ myvar]) 237m4_for([myvar],-1,-3,-2, [ myvar]) 238m4_for([myvar],-3,-1, 2, [ myvar]) 239dnl Make sure we recalculate the bounds correctly: 240m4_for([myvar], 1, 3, 3, [ myvar]) 241m4_for([myvar], 1, 6, 3, [ myvar]) 242m4_for([myvar],22,-7,-5, [ myvar]) 243m4_for([myvar],-2,-7,-4, [ myvar]) 244m4_for([myvar],-7,-2, 4, [ myvar]) 245dnl Make sure we are not exposed to division truncation: 246m4_for([myvar], 2, 5, 2, [ myvar]) 247m4_for([myvar],-5,-2, 2, [ myvar]) 248m4_for([myvar], 5, 2,-2, [ myvar]) 249m4_for([myvar],-2,-5,-2, [ myvar]) 250dnl Make sure we do not divide by zero: 251m4_for([myvar], 1, 1, , [ myvar]) 252m4_for([myvar], 1, 1,+2, [ myvar]) 253m4_for([myvar], 1, 1,-2, [ myvar]) 254dnl Make sure we do not loop endlessly 255m4_for([myval], 1, 1, 0, [ myval]) 256dnl Make sure to properly parenthesize 257m4_for([myvar], 3-5, -2+8, , [ myvar]) 258m4_for([myvar], -2+8, 3-5, , [ myvar]) 259m4_for([myvar], 8, 16, 3 * 2, [ myvar]) 260m4_for([myvar], 8, 16, -3 * -2, [ myvar]) 261m4_for([myvar], [2<<2], [2<<3], [-3 * (-2)], [ myvar]) 262m4_foreach([myvar], [[a], [b, c], [d], [e 263],[f]], [ myvar|]) 264m4_foreach_w([myvar], [a b c, d,e f 265g], [ myvar|]) 266myvar 267]], 268[[ 1 2 3 269 1 2 3 270 3 2 1 271 3 2 1 272 1 3 273 3 1 274 -1 -3 275 -3 -1 276 1 277 1 4 278 22 17 12 7 2 -3 279 -2 -6 280 -7 -3 281 2 4 282 -5 -3 283 5 3 284 -2 -4 285 1 286 1 287 1 288 1 289 -2 -1 0 1 2 3 4 5 6 290 6 5 4 3 2 1 0 -1 -2 291 8 14 292 8 14 293 8 14 294 a| b, c| d| e 295| f| 296 a| b| c,| d,e| f| g| 297outer value 298]], []) 299 300AT_DATA_M4SUGAR([script.4s], 301[[m4_init 302m4_divert([0])dnl 303m4_for([myvar], 1, 3,-1, [ myvar]) 304]]) 305 306AT_CHECK_M4SUGAR([], 1, [], 307[[script.4s:3: error: assert failed: -1 > 0 308script.4s:3: the top level 309autom4te: m4 failed with exit status: 1 310]]) 311 312AT_DATA_M4SUGAR([script.4s], 313[[m4_init 314m4_divert([0])dnl 315m4_for([myvar], 1, 2, 0, [ myvar]) 316]]) 317 318AT_CHECK_M4SUGAR([], 1, [], 319[[script.4s:3: error: assert failed: 0 > 0 320script.4s:3: the top level 321autom4te: m4 failed with exit status: 1 322]]) 323 324AT_DATA_M4SUGAR([script.4s], 325[[m4_init 326m4_divert([0])dnl 327m4_for([myvar], 2, 1, 0, [ myvar]) 328]]) 329 330AT_CHECK_M4SUGAR([], 1, [], 331[[script.4s:3: error: assert failed: 0 < 0 332script.4s:3: the top level 333autom4te: m4 failed with exit status: 1 334]]) 335AT_CLEANUP 336