mirror of
https://github.com/boostorg/build.git
synced 2026-02-16 13:22:11 +00:00
Fixed a bug in the tools/build/v2/util/numbers.jam module related to numbers.log10 & numbers.less rules not working correctly with numbers that have leading zeroes. Added related regression tests.
Among other things this was breaking the new Boost Jam version detection functionality in some realistic cases. Added related regression tests. [SVN r45100]
This commit is contained in:
@@ -27,7 +27,7 @@ rule print ( )
|
||||
}
|
||||
|
||||
|
||||
# Utility rule for testing whether all elements of a sequence are equal to 0.
|
||||
# Utility rule for testing whether all elements in a sequence are equal to 0.
|
||||
#
|
||||
local rule is-all-zeroes ( sequence * )
|
||||
{
|
||||
@@ -119,23 +119,25 @@ rule __test__ ( )
|
||||
assert.true check-jam-version $(jam-version) ;
|
||||
assert.false check-jam-version $(future-version) ;
|
||||
|
||||
assert.true version-less 0 : 1 ;
|
||||
assert.false version-less 0 : 0 ;
|
||||
assert.true version-less 1 : 2 ;
|
||||
assert.false version-less 1 : 1 ;
|
||||
assert.false version-less 2 : 1 ;
|
||||
assert.true version-less 3 1 20 : 3 4 10 ;
|
||||
assert.false version-less 3 1 10 : 3 1 10 ;
|
||||
assert.false version-less 3 4 10 : 3 1 20 ;
|
||||
assert.true version-less 3 1 20 5 1 : 3 4 10 ;
|
||||
assert.false version-less 3 1 10 5 1 : 3 1 10 ;
|
||||
assert.false version-less 3 4 10 5 1 : 3 1 20 ;
|
||||
assert.true version-less 3 1 20 : 3 4 10 5 1 ;
|
||||
assert.true version-less 3 1 10 : 3 1 10 5 1 ;
|
||||
assert.false version-less 3 4 10 : 3 1 20 5 1 ;
|
||||
assert.false version-less 3 1 10 : 3 1 10 0 0 ;
|
||||
assert.false version-less 3 1 10 0 0 : 3 1 10 ;
|
||||
assert.false version-less 3 1 10 0 : 3 1 10 0 0 ;
|
||||
assert.true version-less 0 : 1 ;
|
||||
assert.false version-less 0 : 0 ;
|
||||
assert.true version-less 1 : 2 ;
|
||||
assert.false version-less 1 : 1 ;
|
||||
assert.false version-less 2 : 1 ;
|
||||
assert.true version-less 3 1 20 : 3 4 10 ;
|
||||
assert.false version-less 3 1 10 : 3 1 10 ;
|
||||
assert.false version-less 3 4 10 : 3 1 20 ;
|
||||
assert.true version-less 3 1 20 5 1 : 3 4 10 ;
|
||||
assert.false version-less 3 1 10 5 1 : 3 1 10 ;
|
||||
assert.false version-less 3 4 10 5 1 : 3 1 20 ;
|
||||
assert.true version-less 3 1 20 : 3 4 10 5 1 ;
|
||||
assert.true version-less 3 1 10 : 3 1 10 5 1 ;
|
||||
assert.false version-less 3 4 10 : 3 1 20 5 1 ;
|
||||
assert.false version-less 3 1 10 : 3 1 10 0 0 ;
|
||||
assert.false version-less 3 1 10 0 0 : 3 1 10 ;
|
||||
assert.false version-less 3 1 10 0 : 3 1 10 0 0 ;
|
||||
assert.false version-less 3 1 10 0 : 03 1 10 0 0 ;
|
||||
assert.false version-less 03 1 10 0 : 3 1 10 0 0 ;
|
||||
|
||||
# TODO: Add tests for invalid input data being sent to version-less.
|
||||
}
|
||||
|
||||
@@ -26,6 +26,18 @@ local rule extend ( )
|
||||
}
|
||||
|
||||
|
||||
rule trim-leading-zeroes ( value )
|
||||
{
|
||||
local value2 = [ MATCH "^0(.*)$" : $(value) ] ;
|
||||
while $(value2)
|
||||
{
|
||||
value = $(value2) ;
|
||||
value2 = [ MATCH "^0(.*)$" : $(value) ] ;
|
||||
}
|
||||
return $(value:E="") ;
|
||||
}
|
||||
|
||||
|
||||
rule check ( numbers * )
|
||||
{
|
||||
for local n in $(numbers)
|
||||
@@ -92,6 +104,9 @@ rule range ( start finish ? : step ? )
|
||||
rule less ( n1 n2 )
|
||||
{
|
||||
check $(n1) $(n2) ;
|
||||
n1 = [ trim-leading-zeroes $(n1) ] ;
|
||||
n2 = [ trim-leading-zeroes $(n2) ] ;
|
||||
|
||||
# Avoid messy 0 case by appending 1.
|
||||
local l1 = [ range 2 [ log10 $(n1)1 ] ] ;
|
||||
local l2 = [ range 2 [ log10 $(n2)1 ] ] ;
|
||||
@@ -129,14 +144,13 @@ rule log10 ( number )
|
||||
{
|
||||
chars = $(chars[2-]) ;
|
||||
}
|
||||
|
||||
if ! $(chars)
|
||||
{
|
||||
errors.error can't take log of zero ;
|
||||
}
|
||||
else
|
||||
{
|
||||
return [ sequence.length $(chars) ] ;
|
||||
return [ decrement [ sequence.length $(chars) ] ] ;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -167,13 +181,23 @@ rule __test__ ( )
|
||||
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.result 0 : trim-leading-zeroes 0 ;
|
||||
assert.result 1234 : trim-leading-zeroes 1234 ;
|
||||
assert.result 123456 : trim-leading-zeroes 0000123456 ;
|
||||
assert.result 10000123456 : trim-leading-zeroes 10000123456 ;
|
||||
assert.result 10000 : trim-leading-zeroes 10000 ;
|
||||
assert.result 10000 : trim-leading-zeroes 00010000 ;
|
||||
|
||||
assert.true less 1 2 ;
|
||||
assert.true less 1 12 ;
|
||||
assert.true less 1 21 ;
|
||||
assert.true less 005 217 ;
|
||||
assert.false less 0 0 ;
|
||||
assert.false less 03 3 ;
|
||||
assert.false less 3 03 ;
|
||||
assert.true less 005 217 ;
|
||||
assert.true less 0005 217 ;
|
||||
assert.true less 5 00217 ;
|
||||
|
||||
# TEMPORARY disabled, because nested "try"/"catch" do not work and I do no
|
||||
# have the time to fix that right now.
|
||||
@@ -215,8 +239,12 @@ rule __test__ ( )
|
||||
assert.result 0 : log10 9 ;
|
||||
assert.result 1 : log10 10 ;
|
||||
assert.result 1 : log10 99 ;
|
||||
assert.result 2 : log10 100 ;
|
||||
assert.result 2 : log10 101 ;
|
||||
assert.result 2 : log10 125 ;
|
||||
assert.result 11 : log10 12345678901 ;
|
||||
assert.result 2 : log10 999 ;
|
||||
assert.result 3 : log10 1000 ;
|
||||
assert.result 10 : log10 12345678901 ;
|
||||
|
||||
for local x in [ range 75 110 : 5 ]
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user