2
0
mirror of https://github.com/boostorg/build.git synced 2026-02-16 13:22:11 +00:00

Upgraded some internal Boost Build tests. Minor stylistic changes.

[SVN r45095]
This commit is contained in:
Jurko Gospodnetić
2008-05-03 23:27:00 +00:00
parent 64f00b1fa4
commit a98f0c68ac
3 changed files with 124 additions and 86 deletions

View File

@@ -7,7 +7,9 @@
import errors : error-skip-frames lol->list ;
import modules ;
# assert the equality of A and B
# Assert the equality of A and B
#
rule equal ( a * : b * )
{
if $(a) != $(b)
@@ -16,8 +18,10 @@ rule equal ( a * : b * )
}
}
# assert that EXPECTED is the result of calling RULE-NAME with the
# given arguments
# Assert that EXPECTED is the result of calling RULE-NAME with the given
# arguments.
#
rule result ( expected * : rule-name args * : * )
{
local result ;
@@ -37,6 +41,7 @@ rule result ( expected * : rule-name args * : * )
}
}
rule .set.equal ( set1 * : set2 * )
{
if ( $(set1) in $(set2) ) && ( $(set2) in $(set1) )
@@ -45,8 +50,10 @@ rule .set.equal ( set1 * : set2 * )
}
}
# assert that EXPECTED is equal to the result of calling RULE-NAME with the
# given arguments
# Assert that EXPECTED is equal to the result of calling RULE-NAME with the
# given arguments.
#
rule result-equal ( expected * : rule-name args * : * )
{
local result ;
@@ -66,7 +73,9 @@ rule result-equal ( expected * : rule-name args * : * )
}
}
# assert that the given variable is nonempty.
# Assert that the given variable is nonempty.
#
rule nonempty-variable ( name )
{
local value = [ modules.peek [ CALLER_MODULE ] : $(name) ] ;
@@ -77,9 +86,10 @@ rule nonempty-variable ( name )
}
}
# assert that the result of calling RULE-NAME on the given arguments
# has a true logical value (is neither an empty list nor all empty
# strings).
# Assert that the result of calling RULE-NAME on the given arguments has a true
# logical value (is neither an empty list nor all empty strings).
#
rule true ( rule-name args * : * )
{
local result ;
@@ -99,29 +109,31 @@ rule true ( rule-name args * : * )
}
}
# assert that the result of calling RULE-NAME on the given arguments
# has a false logical value (is either an empty list or all empty
# strings).
# Assert that the result of calling RULE-NAME on the given arguments has a false
# logical value (is either an empty list or all empty strings).
#
rule false ( rule-name args * : * )
{
local result ;
module [ CALLER_MODULE ]
{
modules.poke assert : result
: [ $(1) : $(2) : $(3) : $(4)
: $(5) : $(6) : $(7) : $(8) : $(9) ] ;
modules.poke assert : result : [ $(1) : $(2) : $(3) : $(4) : $(5) : $(6)
: $(7) : $(8) : $(9) ] ;
}
if $(result)
{
error-skip-frames 3 assertion failure: expecting false result from
"[" $(rule-name)
[ lol->list $(args) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ]
"]" : got [ lol->list $(result) ] instead ;
"[" $(rule-name) [ lol->list $(args) : $(2) : $(3) : $(4) : $(5) :
$(6) : $(7) : $(8) : $(9) ] "]" : got [ lol->list $(result) ]
instead ;
}
}
# assert that 'element' is present in 'list'.
# Assert that 'element' is present in 'list'.
#
rule "in" ( element : list * )
{
if ! $(element) in $(list)
@@ -131,7 +143,9 @@ rule "in" ( element : list * )
}
}
# assert that 'element' is not present in 'list'.
# Assert that 'element' is not present in 'list'.
#
rule not-in ( element : list * )
{
if $(element) in $(list)

View File

@@ -1,7 +1,10 @@
# Copyright 2001, 2002 Dave Abrahams
# Copyright 2002, 2003 Vladimir Prus
# 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)
# Copyright 2001, 2002 Dave Abrahams
# Copyright 2002, 2003 Vladimir Prus
# 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)
import errors ;
digits = 0 1 2 3 4 5 6 7 8 9 ;
powers = 1 ;
@@ -10,9 +13,8 @@ natural = $(digits) ;
positive = $(digits[2-]) ;
incr = $(positive[2-]) ;
znatural = $(digits) ;
zero-test = is zero ; # if $(zero-test[$(n)]) == "is" "zero", n == 0
zero-test = is zero ; # if $(zero-test[$(n)]) == "is" "zero", n == 0
import errors : * ;
local rule extend ( )
{
@@ -23,6 +25,7 @@ local rule extend ( )
znatural = $(digits)$(znatural) ;
}
rule check ( numbers * )
{
for local n in $(numbers)
@@ -30,23 +33,24 @@ rule check ( numbers * )
switch $(n)
{
case *[^0-9]* :
error $(n) "in" $(numbers) : is not a number ;
errors.error $(n) "in" $(numbers) : is not a number ;
}
}
}
rule increment ( number )
{
return [ CALC $(number) + 1 ] ;
}
rule decrement ( number )
{
# Previous rule did not allow decrementing zero.
# Is that what we want?
return [ CALC $(number) - 1 ] ;
}
rule range ( start finish ? : step ? )
{
if ! $(finish)
@@ -55,7 +59,7 @@ rule range ( start finish ? : step ? )
start = 1 ;
}
step ?= 1 ;
check $(start) $(finish) $(step) ;
if $(finish) != 0
@@ -64,7 +68,7 @@ rule range ( start finish ? : step ? )
{
extend ;
}
if $(step) = 1
{
return $(positive[$(start)-$(finish)]) ;
@@ -84,26 +88,28 @@ rule range ( start finish ? : step ? )
}
}
rule less ( n1 n2 )
{
check $(n1) $(n2) ;
# avoid messy 0 case by appending 1
# Avoid messy 0 case by appending 1.
local l1 = [ range 2 [ log10 $(n1)1 ] ] ;
local l2 = [ range 2 [ log10 $(n2)1 ] ] ;
# number of digits mismatch?
# Number of digits mismatch?
if ( $(l1) < $(l2) ) || ( ( $(l1) = $(l2) ) && $(n1) < $(n2) )
{
return true ;
}
}
rule log10 ( number )
{
switch $(number)
{
case *[^0-9]* : error $(number) is not a number ;
case 0 : error can't take log of zero ;
case *[^0-9]* : errors.error $(number) is not a number ;
case 0 : errors.error can't take log of zero ;
case [1-9] : return 0 ;
case [1-9]? : return 1 ;
case [1-9]?? : return 2 ;
@@ -123,10 +129,10 @@ rule log10 ( number )
{
chars = $(chars[2-]) ;
}
if ! $(chars)
{
error can't take log of zero ;
errors.error can't take log of zero ;
}
else
{
@@ -136,10 +142,11 @@ rule log10 ( number )
}
}
rule __test__ ( )
{
import assert ;
assert.result 1 : increment 0 ;
assert.result 2 : increment 1 ;
assert.result 1 : decrement 2 ;
@@ -149,10 +156,9 @@ rule __test__ ( )
assert.result 99 : increment 98 ;
assert.result 99 : decrement 100 ;
assert.result 100 : increment 99 ;
# This just makes debugging output too large
# assert.result 1000 : increment 999 ;
# assert.result 999 : decrement 1000 ;
assert.result 999 : decrement 1000 ;
assert.result 1000 : increment 999 ;
assert.result 1 2 3 : range 3 ;
assert.result 1 2 3 4 5 6 7 8 9 10 11 12 : range 12 ;
assert.result 3 4 5 6 7 8 9 10 11 : range 3 11 ;
@@ -160,40 +166,43 @@ rule __test__ ( )
assert.result 1 4 7 10 : range 10 : 3 ;
assert.result 2 4 6 8 10 : range 2 10 : 2 ;
assert.result 25 50 75 100 : range 25 100 : 25 ;
assert.true less 1 2 ;
assert.true less 1 12 ;
assert.true less 005 217 ;
assert.true less 0005 217 ;
assert.true less 5 00217 ;
assert.true less 1 21 ;
assert.false less 0 0 ;
# TEMPORARY disabled, because nested "try"/"catch" do not work, I don't the
# time to fix that right now.
if $(0)
{
# TEMPORARY disabled, because nested "try"/"catch" do not work and I do no
# have the time to fix that right now.
if $(0)
{
try ;
{
decrement 0 ;
}
catch can't decrement zero! ;
try ;
{
check foo ;
}
catch : not a number ;
try ;
{
increment foo ;
}
catch : not a number ;
try ;
{
log10 0 ;
}
catch can't take log of zero ;
try ;
{
log10 000 ;
@@ -201,14 +210,14 @@ rule __test__ ( )
catch can't take log of zero ;
}
assert.result 0 : log10 1 ;
assert.result 0 : log10 9 ;
assert.result 1 : log10 10 ;
assert.result 1 : log10 99 ;
assert.result 2 : log10 125 ;
assert.result 11 : log10 12345678901 ;
for local x in [ range 75 110 : 5 ]
{
for local y in [ range $(x) 111 : 3 ]
@@ -219,7 +228,7 @@ rule __test__ ( )
}
}
}
for local x in [ range 90 110 : 2 ]
{
for local y in [ range 80 $(x) : 4 ]

View File

@@ -8,15 +8,17 @@ import assert ;
import numbers ;
import modules ;
# Note that algorithms in this module execute largely in the caller's
# module namespace, so that local rules can be used as function
# objects. Also note that most predicates can be multi-element
# lists. In that case, all but the first element are prepended to the
# first argument which is passed to the rule named by the first
# element.
# Return the elements e of $(sequence) for which [ $(predicate) e ]
# has a non-null value.
# Note that algorithms in this module execute largely in the caller's module
# namespace, so that local rules can be used as function objects. Also note that
# most predicates can be multi-element lists. In that case, all but the first
# element are prepended to the first argument which is passed to the rule named
# by the first element.
# Return the elements e of $(sequence) for which [ $(predicate) e ] has a
# non-null value.
#
rule filter ( predicate + : sequence * )
{
local caller = [ CALLER_MODULE ] ;
@@ -32,8 +34,10 @@ rule filter ( predicate + : sequence * )
return $(result) ;
}
# return a new sequence consisting of [ $(function) $(e) ] for each
# element e of $(sequence).
# Return a new sequence consisting of [ $(function) $(e) ] for each element e of
# $(sequence).
#
rule transform ( function + : sequence * )
{
local caller = [ CALLER_MODULE ] ;
@@ -46,6 +50,7 @@ rule transform ( function + : sequence * )
return $(result) ;
}
rule reverse ( s * )
{
local r ;
@@ -65,7 +70,9 @@ rule less ( a b )
}
}
# insertion-sort s using the BinaryPredicate ordered.
# Insertion-sort s using the BinaryPredicate ordered.
#
rule insertion-sort ( s * : ordered * )
{
if ! $(ordered)
@@ -111,14 +118,17 @@ rule insertion-sort ( s * : ordered * )
}
}
# merge two ordered sequences using the BinaryPredicate ordered.
# Merge two ordered sequences using the BinaryPredicate ordered.
#
rule merge ( s1 * : s2 * : ordered * )
{
ordered ?= sequence.less ;
local result__ ;
local caller = [ CALLER_MODULE ] ;
while $(s1) && $(s2) {
while $(s1) && $(s2)
{
if [ modules.call-in $(caller) : $(ordered) $(s1[1]) $(s2[1]) ]
{
result__ += $(s1[1]) ;
@@ -141,15 +151,19 @@ rule merge ( s1 * : s2 * : ordered * )
return $(result__) ;
}
# join the elements of s into one long string. If joint is supplied,
# it is used as a separator.
# Join the elements of s into one long string. If joint is supplied, it is used
# as a separator.
#
rule join ( s * : joint ? )
{
joint ?= "" ;
return $(s:J=$(joint)) ;
}
# Find the length of any sequence.
#
rule length ( s * )
{
local result = 0 ;
@@ -160,6 +174,7 @@ rule length ( s * )
return $(result) ;
}
rule unique ( list * : stable ? )
{
local result ;
@@ -188,8 +203,10 @@ rule unique ( list * : stable ? )
return $(result) ;
}
# Returns the maximum number in 'elements'. Uses 'ordered' for comparisons,
# or 'numbers.less' is none is provided.
# Returns the maximum number in 'elements'. Uses 'ordered' for comparisons, or
# 'numbers.less' is none is provided.
#
rule max-element ( elements + : ordered ? )
{
ordered ?= numbers.less ;
@@ -205,8 +222,10 @@ rule max-element ( elements + : ordered ? )
return $(max) ;
}
# Returns all of 'elements' for which corresponding element in parallel
# list 'rank' is equal to the maximum value in 'rank'.
# Returns all of 'elements' for which corresponding element in parallel list
# 'rank' is equal to the maximum value in 'rank'.
#
rule select-highest-ranked ( elements * : ranks * )
{
if $(elements)
@@ -230,7 +249,7 @@ NATIVE_RULE sequence : select-highest-ranked ;
local rule __test__ ( )
{
# use a unique module so we can test the use of local rules.
# Use a unique module so we can test the use of local rules.
module sequence.__test__
{
import assert ;
@@ -244,10 +263,9 @@ local rule __test__ ( )
}
}
assert.result 4 6 4 2 8
: sequence.filter is-even : 1 4 6 3 4 7 2 3 8 ;
assert.result 4 6 4 2 8 : sequence.filter is-even : 1 4 6 3 4 7 2 3 8 ;
# test that argument binding works
# Test that argument binding works.
local rule is-equal-test ( x y )
{
if $(x) = $(y)
@@ -302,18 +320,15 @@ local rule __test__ ( )
local p2 = x ;
for local i in 1 2 3 4 5 6 7 8
{
p2 = $(p2) $(p2) ;
p2 = $(p2) $(p2) ;
}
assert.result 256 : sequence.length $(p2) ;
assert.result 1 2 3 4 5
: sequence.unique 1 2 3 2 4 3 3 5 5 5 ;
assert.result 1 2 3 4 5 : sequence.unique 1 2 3 2 4 3 3 5 5 5 ;
assert.result 5
: sequence.max-element 1 3 5 0 4 ;
assert.result 5 : sequence.max-element 1 3 5 0 4 ;
assert.result e-3 h-3
: sequence.select-highest-ranked e-1 e-3 h-3 m-2 : 1 3 3 2 ;
assert.result e-3 h-3 : sequence.select-highest-ranked e-1 e-3 h-3 m-2 : 1 3 3 2 ;
assert.result 7 6 5 4 3 2 1 : sequence.reverse 1 2 3 4 5 6 7 ;
}