blob: 7e00bec20c9dc20111ba783c41757bd8162dcad0 [file] [log] [blame]
# Copyright 2001, 2002 Dave Abrahams
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
# Get the recursive Jam invocation code
include recursive.jam ;
include assert-equal.jam ;
Jam "include check-bindrule.jam ;"
: "found: file-to-bind at subdir1$(SLASH)file-to-bind"
;
include check-arguments.jam ;
if $(NT)
{
# if this one fails, you don't have the line length patch
Jam "include test_nt_line_length.jam ;" ;
}
# a little utility for assertions
rule identity ( list * )
{
return $(list) ;
}
#
# test rule indirection
#
rule select ( n list * )
{
return $(list[$(n)]) ;
}
rule indirect1 ( rule + : args * )
{
return [ $(rule) $(args) ] ;
}
assert-equal a : indirect1 select 1 : a b c d e ;
assert-equal b : indirect1 select 2 : a b c d e ;
x = reset ;
rule reset-x ( new-value )
{
x = $(new-value) ;
}
$(x)-x bar ; # invokes reset-x...
assert-equal bar : identity $(x) ; # which changes x
# Check that unmatched subst returns an empty list
assert-equal # nothing
: SUBST "abc" "d+" x ;
# Check that a matched subst works
assert-equal x
: SUBST "ddd" "d+" x ;
# Check that we can get multiple substitutions from a single invocation
assert-equal x y x-y
: SUBST "x/y/z" "([^/]*)/([^/]*).*" "\\1" $2 "\\1-\\2" ;
#
# test local foreach modification
#
{
local x = 0 ;
local entered = ;
for local x in a b c # x declared local to for loop.
{
entered = 1 ;
if ! ( $(x) in a b c )
{
EXIT "local foreach: expected one of a, b, c; got" $(x) ;
}
}
if $(x) != 0 # if x was modified, it failed to be a local variable
{
EXIT "local foreach failed" ;
}
}
#
# test while loops
#
{
local x = a b c ;
local y = $(x) ;
local z = ;
while $(y)
{
z += $(y[1]) ;
y = $(y[2-]) ;
}
if $(z) != $(x)
{
EXIT "while loops failed" ;
}
}
#
# test negative list indices and slices
#
{
local x = a b c d e ;
rule assert-index ( index : list * )
{
if $(x[$(index)]) != $(list)
{
ECHO with x= $(x) ;
ECHO x[$(index)] == $(x[$(index)]) ;
EXIT expected $(list) ;
}
}
assert-index 1 : a ;
assert-index 3 : c ;
assert-index 1-2 : a b ;
assert-index -1 : e ;
assert-index -2 : d ;
assert-index 2--2 : b c d ;
assert-index -3--2 : c d ;
assert-index 1--2 : a b c d ;
assert-index 1--2 : a b c d ;
assert-index 1--10 : ;
x = a ;
assert-index 1--2 : ;
assert-index 1--2 : ;
}
#
# test module primitives
#
{
local x = a b c d e f g h i j ;
local y = $(x[3-]) ;
rule shift1 ( dummy ) { }
rule my_module.not_really ( ) { return something ; }
# import the identity rule into my_module as "id"
IMPORT : identity : my_module : id ;
module my_module
{
# assert-equal operates in its own module, so call id in here and use
# identity later.
local f = [ id x y z ] ;
assert-equal x y z : identity $(f) ;
w = ;
y = ;
x2 = 1 2 3 ;
x3 = $(x2) ;
z = $(x2) ;
x3 = ; # should reset x3
# drops one element from the head of x
# moves the first element of z from the head of z to the head of y
rule shift1 ( )
{
x = $(x[2-]) ;
y = $(z[1]) $(y) ;
z = $(z[2-]) ;
}
rule shift2 ( )
{
shift1 ;
}
shift1 ;
shift2 ;
rule get ( symbol )
{
return $($(symbol)) ;
}
local rule not_really ( ) { return nothing ; }
}
local expected = shift1 shift2 get ;
if ! ( $(expected) in [ RULENAMES my_module ] )
|| ! ( [ RULENAMES my_module ] in $(expected) )
{
EXIT "[ RULENAMES my_module ] =" [ RULENAMES my_module ] "!=" shift1 shift2 get ;
}
# show that not_really was actually a local definition
assert-equal something : my_module.not_really ;
if not_really in [ RULENAMES my_module ]
{
EXIT unexpectedly found local rule "not_really" in "my_module" ;
}
EXPORT my_module : not_really ;
if ! ( not_really in [ RULENAMES my_module ] )
{
EXIT unexpectedly failed to find exported rule "not_really" in "my_module" ;
}
# show that my_module doesn't have access to our variables
my_module.shift1 ;
assert-equal $(x[3-]) : identity $(y) ;
# check module locals
assert-equal : my_module.get w ;
assert-equal 3 2 1 : my_module.get y ;
assert-equal 1 2 3 : my_module.get x2 ;
assert-equal : my_module.get x3 ;
assert-equal : my_module.get z ;
my_module.shift2 ;
x = $(x[3-]) ;
assert-equal $(x) : identity $(y) ;
# Prove that the module's rule is not exposed to the world at large without
# qualification
shift1 nothing ;
assert-equal $(x) : identity $(y) ;
# import my_module.shift1 into the global module as "shifty", and
# my_module.shift2 into the global module as "shift2".
IMPORT my_module : shift1 shift2 : : shifty shift2 ;
shifty ;
assert-equal $(x) : identity $(y) ;
shift2 ;
assert-equal $(x) : identity $(y) ;
# Now do the same with localization
IMPORT my_module : shift1 : : shifty : LOCALIZE ;
shifty ;
y = $(y[3-]) ;
assert-equal $(x) : identity $(y) ;
# import everything from my_module into the global module using
# the same names.
IMPORT my_module : [ RULENAMES my_module ] : : [ RULENAMES my_module ] : LOCALIZE ;
shift1 ;
y = $(y[2-]) ;
assert-equal $(x) : identity $(y) ;
shift2 ;
y = $(y[2-]) ;
assert-equal $(x) : identity $(y) ;
}
#
# test CALLER_MODULE and backtrace
#
{
rule backtrace ( )
{
local bt = [ BACKTRACE ] ;
bt = $(bt[5-]) ;
while $(bt)
{
ECHO $(bt[1]):$(bt[2]): "in" $(bt[4]) ;
bt = $(bt[5-]) ;
}
}
module module1
{
rule f ( )
{
local m = [ CALLER_MODULE ] ;
assert-equal : identity $(m) ;
module2.f ;
}
}
module module2
{
rule f ( )
{
local m = [ CALLER_MODULE ] ;
assert-equal module1 : identity $(m) ;
backtrace ;
}
}
module1.f ;
}