# Part of the A-A-P recipe executive: Testing of scopes

# Copyright (C) 2002-2003 Stichting NLnet Labs
# Permission to copy and use this file is specified in the file COPYING.
# If this file is missing you can find it here: http://www.a-a-p.org/COPYING

import sys, os, stat, shutil, string

def runaap(args):
    res = os.system("%s ..%sMain.py %s" % (sys.argv[1], os.sep, args))
    if res:
        print "Aap exited with error value %d" % res
    return res

os.chdir("rectest")

# Create a recipe to test whether the recipe scope is passed to build commands
# and reading a local variable before it is written results in a warning.

rec1 = "rectest1.aap"
rec2 = "rectest2.aap"
rec3 = "rectest3.aap"
rec4 = "rectest4.aap"
rec5 = "rectest5.aap"
rec6 = "rectest6.aap"
rec7 = "rectest7.aap"
aapout = "rectest.aap.out"

def cleanup():
    for n in [ rec1, rec2, rec3, rec4, rec5, rec6, rec7, aapout ]:
        try:
            os.remove(n)
        except:
            pass

cleanup()

f = open(rec1, "w")
f.write("""
var1 = toplevel
var2 = toplevel2
:include %s
:child %s
:print from grandchild: $var6
:child {nopass} %s
:print toplevel TOP: $TOP

CFLAGS = nonsense
:execute %s
:execute {pass} %s

all:
        var2 = all
        :print no scope: $var1 $var2 $var3 $var4 $var5
        :print _no scope: $_no.var1 $_no.var2
        :print _recipe scope: $_recipe.var1 $_recipe.var2
        :print _up scope: $_up.var1 $_up.var2
        var1 = get no error here
        var2 = nothing
        :print after the error: $var1 $var2
        TOP += all            # check appending
        :print TOP local: $TOP recipe: $_recipe.TOP
        TOP ?= nothing             # won't do anything
        BUILD ?= buildd            # set $BUILD
        _recipe.TOP += build
        :print build TOP local: $TOP recipe: $_recipe.TOP BUILD: `BUILD`
""" % (rec2, rec3, rec4, rec6, rec7))
f.close()

# Included recipe, will be at the toplevel.
f = open(rec2, "w")
f.write("""
var3 = toplevel3
var4 = toplevel4
TOP = toplevel
""")
f.close()

# Normal child recipe, will see the parent recipe variables.
f = open(rec3, "w")
f.write("""
var2 = child2
_top.var3 = child3  # set var3 in parent/toplevel recipe
:print child: $var1 $var2 $var3 $var4
_parent.var4 = child4
# Check default variable $OBJSUF
@if _no.OBJSUF == _parent.OBJSUF:
   :print OBJSUF OK
TOP += child     # append to local var
:print TOP child: $TOP _up: $_up.TOP
:child %s           # nested child
:print from grandchild: $var6
""" % rec5)
f.close()

# {nopass} child recipe, will not see the parent recipe variables.
f = open(rec4, "w")
f.write("""
var2 = child22
_top.var3 = child33   # Check toplevel is this recipe, _parent.var3 unchanged
@try:
   :print this should generate an error: $var1
@except:
   :print child: error generated correctly for var1
:print child: $var2 $var3 $_parent.var4
# Check we can set a variable in the parent recipe.
_parent.var5 = child5
# Check default variable $OBJSUF
@if _no.OBJSUF == _parent.OBJSUF:
   :print OBJSUF OK
# Check ":progsearch" with a scope name.
:progsearch _recipe.SHELL sh csh command cmd
@if not SHELL:
   :print Could not find a shell!?
""")
f.close()

# Nested child recipe.
f = open(rec5, "w")
f.write("""
var6 = grandchild-local
_parent.var6 = grandchild-parent
_top.var6 = grandchild-top
:print grandchild: $var1 $var2 $var4 $var6
""")
f.close()

# Executed recipe.  Will have a new toplevel.
f = open(rec6, "w")
f.write("""
var3 = executed
@if CFLAGS == "nonsense":
   :print CFLAGS wasn't set to default value!
all:
    var4 = all
    @try:
       :print this should generate an error: $var1
    @except:
       :print executed: error generated correctly for var1
    :print executed: $_parent.var2 $_recipe.var3 $var4
""")
f.close()

# Executed recipe with passed toplevel.
f = open(rec7, "w")
f.write("""
var3 = executed
@if _no.CFLAGS != "nonsense":
    :print CFLAGS was set to default value!
all:
    :print executed: $_parent.var2 $_recipe.var3 $var4
""")
f.close()

def check_contents(fname, expected):
    f = open(fname)
    actual = f.read()
    f.close()
    if actual != expected:
	print ('File contents wrong for "%s":\n%s\n--- instead of ---\n%s\n---'
						   % (fname, actual, expected))
        return 1
    return 0

# The first time running should result in two files being copied.
res = runaap("-f %s > %s" % (rec1, aapout))

failed = res + check_contents(aapout,
"""child: toplevel child2 child3 toplevel4
OBJSUF OK
TOP child: toplevel child _up: toplevel
grandchild: toplevel child2 child4 grandchild-local
from grandchild: grandchild-parent
from grandchild: grandchild-top
child: error generated correctly for var1
child: child22 child33 child4
OBJSUF OK
toplevel TOP: toplevel
executed: error generated correctly for var1
executed: toplevel2 executed all
executed: toplevel2 executed child4
no scope: toplevel all child3 child4 child5
_no scope: toplevel all
_recipe scope: toplevel toplevel2
_up scope: toplevel toplevel2
after the error: get no error here nothing
TOP local: toplevel all recipe: toplevel
build TOP local: toplevel all recipe: toplevel build BUILD: buildd
""")

cleanup()

sys.exit(failed)


# vim: set sw=4 et sts=4 tw=79 fo+=l:


syntax highlighted by Code2HTML, v. 0.9.1