1#!/usr/local/bin/python3.8
2
3# Copyright 2008 Jurko Gospodnetic
4# Distributed under the Boost Software License, Version 1.0.
5# (See accompanying file LICENSE_1_0.txt or copy at
6# http://www.boost.org/LICENSE_1_0.txt)
7
8# Tests that properties conditioned on more than one other property work as
9# expected.
10
11import BoostBuild
12
13
14###############################################################################
15#
16# test_multiple_conditions()
17# --------------------------
18#
19###############################################################################
20
21def test_multiple_conditions():
22    """Basic tests for properties conditioned on multiple other properties."""
23
24    t = BoostBuild.Tester(["--user-config=", "--ignore-site-config",
25        "toolset=testToolset"], pass_toolset=False, use_test_config=False)
26
27    t.write("testToolset.jam", """\
28import feature ;
29feature.extend toolset : testToolset ;
30rule init ( ) { }
31""")
32
33    t.write("testToolset.py", """\
34from b2.build import feature
35feature.extend('toolset', ["testToolset"])
36def init ( ): pass
37""")
38
39    t.write("jamroot.jam", """\
40import feature ;
41import notfile ;
42import toolset ;
43
44feature.feature description : : free incidental ;
45feature.feature aaa : 1 0 : incidental ;
46feature.feature bbb : 1 0 : incidental ;
47feature.feature ccc : 1 0 : incidental ;
48
49rule buildRule ( name : targets ? : properties * )
50{
51    for local description in [ feature.get-values description : $(properties) ]
52    {
53        ECHO "description:" /$(description)/ ;
54    }
55}
56
57notfile testTarget1 : @buildRule : :
58    <description>d
59    <aaa>0:<description>a0
60    <aaa>1:<description>a1
61    <aaa>0,<bbb>0:<description>a0-b0
62    <aaa>0,<bbb>1:<description>a0-b1
63    <aaa>1,<bbb>0:<description>a1-b0
64    <aaa>1,<bbb>1:<description>a1-b1
65    <aaa>0,<bbb>0,<ccc>0:<description>a0-b0-c0
66    <aaa>0,<bbb>0,<ccc>1:<description>a0-b0-c1
67    <aaa>0,<bbb>1,<ccc>1:<description>a0-b1-c1
68    <aaa>1,<bbb>0,<ccc>1:<description>a1-b0-c1
69    <aaa>1,<bbb>1,<ccc>0:<description>a1-b1-c0
70    <aaa>1,<bbb>1,<ccc>1:<description>a1-b1-c1 ;
71""")
72
73    t.run_build_system(["aaa=1", "bbb=1", "ccc=1"])
74    t.expect_output_lines("description: /d/"              )
75    t.expect_output_lines("description: /a0/"      , False)
76    t.expect_output_lines("description: /a1/"             )
77    t.expect_output_lines("description: /a0-b0/"   , False)
78    t.expect_output_lines("description: /a0-b1/"   , False)
79    t.expect_output_lines("description: /a1-b0/"   , False)
80    t.expect_output_lines("description: /a1-b1/"          )
81    t.expect_output_lines("description: /a0-b0-c0/", False)
82    t.expect_output_lines("description: /a0-b0-c1/", False)
83    t.expect_output_lines("description: /a0-b1-c1/", False)
84    t.expect_output_lines("description: /a1-b0-c1/", False)
85    t.expect_output_lines("description: /a1-b1-c0/", False)
86    t.expect_output_lines("description: /a1-b1-c1/"       )
87
88    t.run_build_system(["aaa=0", "bbb=0", "ccc=1"])
89    t.expect_output_lines("description: /d/"              )
90    t.expect_output_lines("description: /a0/"             )
91    t.expect_output_lines("description: /a1/"      , False)
92    t.expect_output_lines("description: /a0-b0/"          )
93    t.expect_output_lines("description: /a0-b1/"   , False)
94    t.expect_output_lines("description: /a1-b0/"   , False)
95    t.expect_output_lines("description: /a1-b1/"   , False)
96    t.expect_output_lines("description: /a0-b0-c0/", False)
97    t.expect_output_lines("description: /a0-b0-c1/"       )
98    t.expect_output_lines("description: /a0-b1-c1/", False)
99    t.expect_output_lines("description: /a1-b0-c1/", False)
100    t.expect_output_lines("description: /a1-b1-c0/", False)
101    t.expect_output_lines("description: /a1-b1-c1/", False)
102
103    t.run_build_system(["aaa=0", "bbb=0", "ccc=0"])
104    t.expect_output_lines("description: /d/"              )
105    t.expect_output_lines("description: /a0/"             )
106    t.expect_output_lines("description: /a1/"      , False)
107    t.expect_output_lines("description: /a0-b0/"          )
108    t.expect_output_lines("description: /a0-b1/"   , False)
109    t.expect_output_lines("description: /a1-b0/"   , False)
110    t.expect_output_lines("description: /a1-b1/"   , False)
111    t.expect_output_lines("description: /a0-b0-c0/"       )
112    t.expect_output_lines("description: /a0-b0-c1/", False)
113    t.expect_output_lines("description: /a0-b1-c1/", False)
114    t.expect_output_lines("description: /a1-b0-c1/", False)
115    t.expect_output_lines("description: /a1-b1-c0/", False)
116    t.expect_output_lines("description: /a1-b1-c1/", False)
117
118    t.cleanup()
119
120
121###############################################################################
122#
123# test_multiple_conditions_with_toolset_version()
124# -----------------------------------------------
125#
126###############################################################################
127
128def test_multiple_conditions_with_toolset_version():
129    """
130      Regression tests for properties conditioned on the toolset version
131    subfeature and some additional properties.
132
133    """
134    toolset = "testToolset" ;
135
136    t = BoostBuild.Tester(["--user-config=", "--ignore-site-config"],
137        pass_toolset=False, use_test_config=False)
138
139    t.write(toolset + ".jam", """\
140import feature ;
141feature.extend toolset : %(toolset)s ;
142feature.subfeature toolset %(toolset)s : version : 0 1 ;
143rule init ( version ? ) { }
144""" % {"toolset": toolset})
145
146    t.write("testToolset.py", """\
147from b2.build import feature
148feature.extend('toolset', ["%(toolset)s"])
149feature.subfeature('toolset', "%(toolset)s", "version", ['0','1'])
150def init (version=''): pass
151""" % {"toolset": toolset})
152
153    t.write("jamroot.jam", """\
154import feature ;
155import notfile ;
156import toolset ;
157
158toolset.using testToolset ;
159
160feature.feature description : : free incidental ;
161feature.feature aaa : 0 1 : incidental ;
162feature.feature bbb : 0 1 : incidental ;
163feature.feature ccc : 0 1 : incidental ;
164
165rule buildRule ( name : targets ? : properties * )
166{
167    local ttt = [ feature.get-values toolset                     : $(properties) ] ;
168    local vvv = [ feature.get-values "toolset-testToolset:version" : $(properties) ] ;
169    local aaa = [ feature.get-values aaa                         : $(properties) ] ;
170    local bbb = [ feature.get-values bbb                         : $(properties) ] ;
171    local ccc = [ feature.get-values ccc                         : $(properties) ] ;
172    ECHO "toolset:" /$(ttt)/ "version:" /$(vvv)/ "aaa/bbb/ccc:" /$(aaa)/$(bbb)/$(ccc)/ ;
173    for local description in [ feature.get-values description : $(properties) ]
174    {
175        ECHO "description:" /$(description)/ ;
176    }
177}
178
179notfile testTarget1 : @buildRule : :
180    <toolset>testToolset,<aaa>0:<description>t-a0
181    <toolset>testToolset,<aaa>1:<description>t-a1
182
183    <toolset>testToolset-0,<aaa>0:<description>t0-a0
184    <toolset>testToolset-0,<aaa>1:<description>t0-a1
185    <toolset>testToolset-1,<aaa>0:<description>t1-a0
186    <toolset>testToolset-1,<aaa>1:<description>t1-a1
187
188    <toolset>testToolset,<aaa>0,<bbb>0:<description>t-a0-b0
189    <toolset>testToolset,<aaa>0,<bbb>1:<description>t-a0-b1
190    <toolset>testToolset,<aaa>1,<bbb>0:<description>t-a1-b0
191    <toolset>testToolset,<aaa>1,<bbb>1:<description>t-a1-b1
192
193    <aaa>0,<toolset>testToolset,<bbb>0:<description>a0-t-b0
194    <aaa>0,<toolset>testToolset,<bbb>1:<description>a0-t-b1
195    <aaa>1,<toolset>testToolset,<bbb>0:<description>a1-t-b0
196    <aaa>1,<toolset>testToolset,<bbb>1:<description>a1-t-b1
197
198    <aaa>0,<bbb>0,<toolset>testToolset:<description>a0-b0-t
199    <aaa>0,<bbb>1,<toolset>testToolset:<description>a0-b1-t
200    <aaa>1,<bbb>0,<toolset>testToolset:<description>a1-b0-t
201    <aaa>1,<bbb>1,<toolset>testToolset:<description>a1-b1-t
202
203    <toolset>testToolset-0,<aaa>0,<bbb>0:<description>t0-a0-b0
204    <toolset>testToolset-0,<aaa>0,<bbb>1:<description>t0-a0-b1
205    <toolset>testToolset-0,<aaa>1,<bbb>0:<description>t0-a1-b0
206    <toolset>testToolset-0,<aaa>1,<bbb>1:<description>t0-a1-b1
207    <toolset>testToolset-1,<aaa>0,<bbb>0:<description>t1-a0-b0
208    <toolset>testToolset-1,<aaa>0,<bbb>1:<description>t1-a0-b1
209    <toolset>testToolset-1,<aaa>1,<bbb>0:<description>t1-a1-b0
210    <toolset>testToolset-1,<aaa>1,<bbb>1:<description>t1-a1-b1
211
212    <aaa>0,<toolset>testToolset-1,<bbb>0:<description>a0-t1-b0
213    <aaa>0,<toolset>testToolset-1,<bbb>1:<description>a0-t1-b1
214    <aaa>1,<toolset>testToolset-0,<bbb>0:<description>a1-t0-b0
215    <aaa>1,<toolset>testToolset-0,<bbb>1:<description>a1-t0-b1
216
217    <bbb>0,<aaa>1,<toolset>testToolset-0:<description>b0-a1-t0
218    <bbb>0,<aaa>0,<toolset>testToolset-1:<description>b0-a0-t1
219    <bbb>0,<aaa>1,<toolset>testToolset-1:<description>b0-a1-t1
220    <bbb>1,<aaa>0,<toolset>testToolset-1:<description>b1-a0-t1
221    <bbb>1,<aaa>1,<toolset>testToolset-0:<description>b1-a1-t0
222    <bbb>1,<aaa>1,<toolset>testToolset-1:<description>b1-a1-t1 ;
223""")
224
225    t.run_build_system(["aaa=1", "bbb=1", "ccc=1", "toolset=%s-0" % toolset])
226    t.expect_output_lines("description: /t-a0/"    , False)
227    t.expect_output_lines("description: /t-a1/"           )
228    t.expect_output_lines("description: /t0-a0/"   , False)
229    t.expect_output_lines("description: /t0-a1/"          )
230    t.expect_output_lines("description: /t1-a0/"   , False)
231    t.expect_output_lines("description: /t1-a1/"   , False)
232    t.expect_output_lines("description: /t-a0-b0/" , False)
233    t.expect_output_lines("description: /t-a0-b1/" , False)
234    t.expect_output_lines("description: /t-a1-b0/" , False)
235    t.expect_output_lines("description: /t-a1-b1/"        )
236    t.expect_output_lines("description: /a0-t-b0/" , False)
237    t.expect_output_lines("description: /a0-t-b1/" , False)
238    t.expect_output_lines("description: /a1-t-b0/" , False)
239    t.expect_output_lines("description: /a1-t-b1/"        )
240    t.expect_output_lines("description: /a0-b0-t/" , False)
241    t.expect_output_lines("description: /a0-b1-t/" , False)
242    t.expect_output_lines("description: /a1-b0-t/" , False)
243    t.expect_output_lines("description: /a1-b1-t/"        )
244    t.expect_output_lines("description: /t0-a0-b0/", False)
245    t.expect_output_lines("description: /t0-a0-b1/", False)
246    t.expect_output_lines("description: /t0-a1-b0/", False)
247    t.expect_output_lines("description: /t0-a1-b1/"       )
248    t.expect_output_lines("description: /t1-a0-b0/", False)
249    t.expect_output_lines("description: /t1-a0-b1/", False)
250    t.expect_output_lines("description: /t1-a1-b0/", False)
251    t.expect_output_lines("description: /t1-a1-b1/", False)
252    t.expect_output_lines("description: /a0-t1-b0/", False)
253    t.expect_output_lines("description: /a0-t1-b1/", False)
254    t.expect_output_lines("description: /a1-t0-b0/", False)
255    t.expect_output_lines("description: /a1-t0-b1/"       )
256    t.expect_output_lines("description: /b0-a1-t0/", False)
257    t.expect_output_lines("description: /b0-a0-t1/", False)
258    t.expect_output_lines("description: /b0-a1-t1/", False)
259    t.expect_output_lines("description: /b1-a0-t1/", False)
260    t.expect_output_lines("description: /b1-a1-t0/"       )
261    t.expect_output_lines("description: /b1-a1-t1/", False)
262
263    t.run_build_system(["aaa=1", "bbb=1", "ccc=1", "toolset=%s-1" % toolset])
264    t.expect_output_lines("description: /t-a0/"    , False)
265    t.expect_output_lines("description: /t-a1/"           )
266    t.expect_output_lines("description: /t0-a0/"   , False)
267    t.expect_output_lines("description: /t0-a1/"   , False)
268    t.expect_output_lines("description: /t1-a0/"   , False)
269    t.expect_output_lines("description: /t1-a1/"          )
270    t.expect_output_lines("description: /t-a0-b0/" , False)
271    t.expect_output_lines("description: /t-a0-b1/" , False)
272    t.expect_output_lines("description: /t-a1-b0/" , False)
273    t.expect_output_lines("description: /t-a1-b1/"        )
274    t.expect_output_lines("description: /a0-t-b0/" , False)
275    t.expect_output_lines("description: /a0-t-b1/" , False)
276    t.expect_output_lines("description: /a1-t-b0/" , False)
277    t.expect_output_lines("description: /a1-t-b1/"        )
278    t.expect_output_lines("description: /a0-b0-t/" , False)
279    t.expect_output_lines("description: /a0-b1-t/" , False)
280    t.expect_output_lines("description: /a1-b0-t/" , False)
281    t.expect_output_lines("description: /a1-b1-t/"        )
282    t.expect_output_lines("description: /t0-a0-b0/", False)
283    t.expect_output_lines("description: /t0-a0-b1/", False)
284    t.expect_output_lines("description: /t0-a1-b0/", False)
285    t.expect_output_lines("description: /t0-a1-b1/", False)
286    t.expect_output_lines("description: /t1-a0-b0/", False)
287    t.expect_output_lines("description: /t1-a0-b1/", False)
288    t.expect_output_lines("description: /t1-a1-b0/", False)
289    t.expect_output_lines("description: /t1-a1-b1/"       )
290    t.expect_output_lines("description: /a0-t1-b0/", False)
291    t.expect_output_lines("description: /a0-t1-b1/", False)
292    t.expect_output_lines("description: /a1-t0-b0/", False)
293    t.expect_output_lines("description: /a1-t0-b1/", False)
294    t.expect_output_lines("description: /b0-a1-t0/", False)
295    t.expect_output_lines("description: /b0-a0-t1/", False)
296    t.expect_output_lines("description: /b0-a1-t1/", False)
297    t.expect_output_lines("description: /b1-a0-t1/", False)
298    t.expect_output_lines("description: /b1-a1-t0/", False)
299    t.expect_output_lines("description: /b1-a1-t1/"       )
300
301    t.cleanup()
302
303
304###############################################################################
305#
306# main()
307# ------
308#
309###############################################################################
310
311test_multiple_conditions()
312test_multiple_conditions_with_toolset_version()
313