xref: /aosp_15_r20/external/starlark-go/starlark/testdata/control.star (revision 4947cdc739c985f6d86941e22894f5cefe7c9e9a)
1*4947cdc7SCole Faust# Tests of Starlark control flow
2*4947cdc7SCole Faust
3*4947cdc7SCole Faustload("assert.star", "assert")
4*4947cdc7SCole Faust
5*4947cdc7SCole Faustdef controlflow():
6*4947cdc7SCole Faust  # elif
7*4947cdc7SCole Faust  x = 0
8*4947cdc7SCole Faust  if True:
9*4947cdc7SCole Faust    x=1
10*4947cdc7SCole Faust  elif False:
11*4947cdc7SCole Faust    assert.fail("else of true")
12*4947cdc7SCole Faust  else:
13*4947cdc7SCole Faust    assert.fail("else of else of true")
14*4947cdc7SCole Faust  assert.true(x)
15*4947cdc7SCole Faust
16*4947cdc7SCole Faust  x = 0
17*4947cdc7SCole Faust  if False:
18*4947cdc7SCole Faust    assert.fail("then of false")
19*4947cdc7SCole Faust  elif True:
20*4947cdc7SCole Faust    x = 1
21*4947cdc7SCole Faust  else:
22*4947cdc7SCole Faust    assert.fail("else of true")
23*4947cdc7SCole Faust  assert.true(x)
24*4947cdc7SCole Faust
25*4947cdc7SCole Faust  x = 0
26*4947cdc7SCole Faust  if False:
27*4947cdc7SCole Faust    assert.fail("then of false")
28*4947cdc7SCole Faust  elif False:
29*4947cdc7SCole Faust    assert.fail("then of false")
30*4947cdc7SCole Faust  else:
31*4947cdc7SCole Faust    x = 1
32*4947cdc7SCole Faust  assert.true(x)
33*4947cdc7SCole Faustcontrolflow()
34*4947cdc7SCole Faust
35*4947cdc7SCole Faustdef loops():
36*4947cdc7SCole Faust  y = ""
37*4947cdc7SCole Faust  for x in [1, 2, 3, 4, 5]:
38*4947cdc7SCole Faust    if x == 2:
39*4947cdc7SCole Faust      continue
40*4947cdc7SCole Faust    if x == 4:
41*4947cdc7SCole Faust      break
42*4947cdc7SCole Faust    y = y + str(x)
43*4947cdc7SCole Faust  return y
44*4947cdc7SCole Faustassert.eq(loops(), "13")
45*4947cdc7SCole Faust
46*4947cdc7SCole Faust# return
47*4947cdc7SCole Faustg = 123
48*4947cdc7SCole Faustdef f(x):
49*4947cdc7SCole Faust  for g in (1, 2, 3):
50*4947cdc7SCole Faust    if g == x:
51*4947cdc7SCole Faust      return g
52*4947cdc7SCole Faustassert.eq(f(2), 2)
53*4947cdc7SCole Faustassert.eq(f(4), None) # falling off end => return None
54*4947cdc7SCole Faustassert.eq(g, 123) # unchanged by local use of g in function
55*4947cdc7SCole Faust
56*4947cdc7SCole Faust# infinite sequences
57*4947cdc7SCole Faustdef fib(n):
58*4947cdc7SCole Faust  seq = []
59*4947cdc7SCole Faust  for x in fibonacci: # fibonacci is an infinite iterable defined in eval_test.go
60*4947cdc7SCole Faust    if len(seq) == n:
61*4947cdc7SCole Faust      break
62*4947cdc7SCole Faust    seq.append(x)
63*4947cdc7SCole Faust  return seq
64*4947cdc7SCole Faustassert.eq(fib(10),  [0, 1, 1, 2, 3, 5, 8, 13, 21, 34])
65