diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2016-04-06 07:46:43 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2016-04-06 07:46:43 +0200 |
commit | a9663e16d5765a42175ce6131b8cae5ecc622b17 (patch) | |
tree | 453decd61ca8fdff3bdcc3d73e6fdd989204232a /tests/variable/override | |
parent | f079a626a03d4a6e7be1031ddb2e971c8b9a9a75 (diff) |
Test and fix override logic
Diffstat (limited to 'tests/variable/override')
-rw-r--r-- | tests/variable/override/build/bootstrap.build | 2 | ||||
-rw-r--r-- | tests/variable/override/buildfile | 58 | ||||
-rw-r--r-- | tests/variable/override/cache | 13 | ||||
-rw-r--r-- | tests/variable/override/p/build/bootstrap.build | 1 | ||||
-rw-r--r-- | tests/variable/override/p/buildfile | 49 | ||||
-rw-r--r-- | tests/variable/override/simple | 3 | ||||
-rwxr-xr-x | tests/variable/override/test.sh | 240 |
7 files changed, 366 insertions, 0 deletions
diff --git a/tests/variable/override/build/bootstrap.build b/tests/variable/override/build/bootstrap.build new file mode 100644 index 0000000..1c2e239 --- /dev/null +++ b/tests/variable/override/build/bootstrap.build @@ -0,0 +1,2 @@ +project = override +amalgamation = # Disabled. diff --git a/tests/variable/override/buildfile b/tests/variable/override/buildfile new file mode 100644 index 0000000..18c9831 --- /dev/null +++ b/tests/variable/override/buildfile @@ -0,0 +1,58 @@ +if ("$t" != "") +{ + [$t] v = [null] +} + +print "/ :" $(/: v) + +if ($a == as) +{ + v = x +} +elif ($a == ap) +{ + v += s +} +elif ($a == pr) +{ + v =+ p +} + +print ". :" $v + +d/: +{ + if ($d_a == as) + { + v = x + } + elif ($d_a == ap) + { + v += s + } + elif ($d_a == pr) + { + v =+ p + } + + print "d :" $v + + + if ($d_t_a == as) + { + file{t}: v = x + } + elif ($d_t_a == ap) + { + file{t}: v += s + } + elif ($d_t_a == pr) + { + file{t}: v =+ p + } + + print "d/t :" $(file{t}: v) +} + +include p/ +./: diff --git a/tests/variable/override/cache b/tests/variable/override/cache new file mode 100644 index 0000000..8378688 --- /dev/null +++ b/tests/variable/override/cache @@ -0,0 +1,13 @@ +x = [string] 0 +print $x + +x = [uint64] 1 +print $x + +y = 0 +print $y + +[uint64] y = [null] +print $y + +./: diff --git a/tests/variable/override/p/build/bootstrap.build b/tests/variable/override/p/build/bootstrap.build new file mode 100644 index 0000000..723e2a3 --- /dev/null +++ b/tests/variable/override/p/build/bootstrap.build @@ -0,0 +1 @@ +project = override-p diff --git a/tests/variable/override/p/buildfile b/tests/variable/override/p/buildfile new file mode 100644 index 0000000..527b9ae --- /dev/null +++ b/tests/variable/override/p/buildfile @@ -0,0 +1,49 @@ +if ($p_a == as) +{ + v = x +} +elif ($p_a == ap) +{ + v += s +} +elif ($p_a == pr) +{ + v =+ p +} + +print "p :" $v + +d/: +{ + if ($p_d_a == as) + { + v = x + } + elif ($p_d_a == ap) + { + v += s + } + elif ($p_d_a == pr) + { + v =+ p + } + + print "p/d :" $v + + if ($p_d_t_a == as) + { + file{t}: v = x + } + elif ($p_d_t_a == ap) + { + file{t}: v += s + } + elif ($p_d_t_a == pr) + { + file{t}: v =+ p + } + + print "p/d/t :" $(file{t}: v) +} + +./: diff --git a/tests/variable/override/simple b/tests/variable/override/simple new file mode 100644 index 0000000..899daa2 --- /dev/null +++ b/tests/variable/override/simple @@ -0,0 +1,3 @@ +print $foo + +./: diff --git a/tests/variable/override/test.sh b/tests/variable/override/test.sh new file mode 100755 index 0000000..a195766 --- /dev/null +++ b/tests/variable/override/test.sh @@ -0,0 +1,240 @@ +#! /usr/bin/env bash + +verbose=n + +function error () { echo "$*" 1>&2; exit 1; } + +function fail () +{ + if [ "$verbose" = "y" ]; then + b $* + else + b -q $* 2>/dev/null + fi + + if [ $? -eq 0 ]; then + error "succeeded: b $*" + fi + + return 0 +} + +function test () +{ + # There is no way to get the exit code in process substitution + # so ruin the output. + # + diff -u - <(b -q $* || echo "<invalid output>") + + if [ $? -ne 0 ]; then + error "failed: b $*" + fi +} + +fail foo=bar[] # error: unexpected [ in variable assignment 'foo=bar[]' +fail foo=[string]bar # error: typed override of variable foo +fail "!foo=bar" "!foo=BAR" # error: multiple global overrides of variable foo +fail "foo=bar" "foo=BAR" # error: multiple project overrides of variable foo +fail "%foo=bar" "%foo=BAR" # error: multiple project overrides of variable foo + +test --buildfile simple foo=bar ./ ./ <<< "bar" # Multiple bootstraps of the same project. + +# Visibility. +# +test !v=X <<EOF +/ : X +. : X +d : X +d/t : X +p : X +p/d : X +p/d/t : X +EOF + +test v=X <<EOF +/ : +. : X +d : X +d/t : X +p : X +p/d : X +p/d/t : X +EOF + +test v=X p_a=assing <<EOF +/ : +. : X +d : X +d/t : X +p : X +p/d : X +p/d/t : X +EOF + +test %v=X <<EOF +/ : +. : X +d : X +d/t : X +p : X +p/d : X +p/d/t : X +EOF + +test %v=X p_a=as <<EOF +/ : +. : X +d : X +d/t : X +p : x +p/d : x +p/d/t : x +EOF + +test %v+=S %v=+P a=as <<EOF +/ : +. : P x S +d : P x S +d/t : P x S +p : P x S +p/d : P x S +p/d/t : P x S +EOF + +test %v+=S %v=+P a=as p_a=as <<EOF +/ : +. : P x S +d : P x S +d/t : P x S +p : x +p/d : x +p/d/t : x +EOF + +# Append/Prepend in override. +# +test v+=S <<EOF +/ : +. : S +d : S +d/t : S +p : S +p/d : S +p/d/t : S +EOF + +test v+=S a=as <<EOF +/ : +. : x S +d : x S +d/t : x S +p : x S +p/d : x S +p/d/t : x S +EOF + +test %v=+P a=as p_a=as <<EOF +/ : +. : P x +d : P x +d/t : P x +p : x +p/d : x +p/d/t : x +EOF + +test %v+=S v=+P a=as p_a=as <<EOF +/ : +. : P x S +d : P x S +d/t : P x S +p : P x +p/d : P x +p/d/t : P x +EOF + +# Append/Prepend in both. +# +test v=X a=ap d_a=ap p_a=ap p_d_a=ap <<EOF +/ : +. : X +d : X +d/t : X +p : X +p/d : X +p/d/t : X +EOF + +test v+=S v=+P a=as d_a=ap d_t_a=ap p_a=ap p_d_a=ap p_d_t_a=ap <<EOF +/ : +. : P x S +d : P x s S +d/t : P x s s S +p : P x s S +p/d : P x s s S +p/d/t : P x s s s S +EOF + +# These ones are surprising. I guess the moral is we shouldn't do "blind" +# cross-project append/prepend. +# +test %v=X a=as d_a=ap p_a=ap p_d_a=ap <<EOF +/ : +. : X +d : X +d/t : X +p : x s +p/d : x s s +p/d/t : x s s +EOF + +test %v+=S a=as d_a=ap p_a=ap p_d_a=ap <<EOF +/ : +. : x S +d : x s S +d/t : x s S +p : x s +p/d : x s s +p/d/t : x s s +EOF + +test %v+=S a=as d_a=ap p_a=ap p_d_a=ap ./ p/ <<EOF +/ : +. : x S +d : x s S +d/t : x s S +p : x s S +p/d : x s s S +p/d/t : x s s S +EOF + +# Typed override. +# +test v+=S v=+P t=string <<EOF +/ : +. : PS +d : PS +d/t : PS +p : PS +p/d : PS +p/d/t : PS +EOF + +test v+=S v=+P t=string a=as d_a=ap d_t_a=ap p_a=ap p_d_a=ap p_d_t_a=ap <<EOF +/ : +. : PxS +d : PxsS +d/t : PxssS +p : PxsS +p/d : PxssS +p/d/t : PxsssS +EOF + +# Cache overwrite. +# +test --buildfile cache x+=01 y+=01 <<EOF +001 +2 +0 01 +1 +EOF |