Alan Donovan | 312d1a5 | 2017-10-02 10:10:28 -0400 | [diff] [blame] | 1 | // Copyright 2017 The Bazel Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style |
| 3 | // license that can be found in the LICENSE file. |
| 4 | |
| 5 | package resolve_test |
| 6 | |
| 7 | import ( |
| 8 | "strings" |
| 9 | "testing" |
| 10 | |
Alan Donovan | 6beab7e | 2018-10-31 17:53:09 -0400 | [diff] [blame] | 11 | "go.starlark.net/internal/chunkedfile" |
| 12 | "go.starlark.net/resolve" |
| 13 | "go.starlark.net/starlarktest" |
| 14 | "go.starlark.net/syntax" |
Alan Donovan | 312d1a5 | 2017-10-02 10:10:28 -0400 | [diff] [blame] | 15 | ) |
| 16 | |
Alan Donovan | c0b6b76 | 2018-12-18 13:09:56 -0500 | [diff] [blame] | 17 | func setOptions(src string) { |
Alan Donovan | c0b6b76 | 2018-12-18 13:09:56 -0500 | [diff] [blame] | 18 | resolve.AllowGlobalReassign = option(src, "globalreassign") |
Alan Donovan | c0b6b76 | 2018-12-18 13:09:56 -0500 | [diff] [blame] | 19 | resolve.AllowRecursion = option(src, "recursion") |
| 20 | resolve.AllowSet = option(src, "set") |
alandonovan | 754257e | 2019-04-03 16:43:05 -0400 | [diff] [blame] | 21 | resolve.LoadBindsGlobally = option(src, "loadbindsglobally") |
Alan Donovan | c0b6b76 | 2018-12-18 13:09:56 -0500 | [diff] [blame] | 22 | } |
| 23 | |
| 24 | func option(chunk, name string) bool { |
| 25 | return strings.Contains(chunk, "option:"+name) |
| 26 | } |
| 27 | |
Alan Donovan | 312d1a5 | 2017-10-02 10:10:28 -0400 | [diff] [blame] | 28 | func TestResolve(t *testing.T) { |
Alan Donovan | c0b6b76 | 2018-12-18 13:09:56 -0500 | [diff] [blame] | 29 | defer setOptions("") |
Alan Donovan | 6beab7e | 2018-10-31 17:53:09 -0400 | [diff] [blame] | 30 | filename := starlarktest.DataFile("resolve", "testdata/resolve.star") |
Alan Donovan | 312d1a5 | 2017-10-02 10:10:28 -0400 | [diff] [blame] | 31 | for _, chunk := range chunkedfile.Read(filename, t) { |
Laurent Le Brun | 689fc22 | 2018-02-22 19:37:18 +0100 | [diff] [blame] | 32 | f, err := syntax.Parse(filename, chunk.Source, 0) |
Alan Donovan | 312d1a5 | 2017-10-02 10:10:28 -0400 | [diff] [blame] | 33 | if err != nil { |
| 34 | t.Error(err) |
| 35 | continue |
| 36 | } |
| 37 | |
alandonovan | cea917a | 2021-01-21 17:58:09 -0500 | [diff] [blame] | 38 | // A chunk may set options by containing e.g. "option:recursion". |
Alan Donovan | c0b6b76 | 2018-12-18 13:09:56 -0500 | [diff] [blame] | 39 | setOptions(chunk.Source) |
Alan Donovan | 312d1a5 | 2017-10-02 10:10:28 -0400 | [diff] [blame] | 40 | |
alandonovan | a1b28d8 | 2018-03-13 10:59:24 -0400 | [diff] [blame] | 41 | if err := resolve.File(f, isPredeclared, isUniversal); err != nil { |
Alan Donovan | 312d1a5 | 2017-10-02 10:10:28 -0400 | [diff] [blame] | 42 | for _, err := range err.(resolve.ErrorList) { |
| 43 | chunk.GotError(int(err.Pos.Line), err.Msg) |
| 44 | } |
| 45 | } |
| 46 | chunk.Done() |
| 47 | } |
| 48 | } |
| 49 | |
Alan Donovan | 312d1a5 | 2017-10-02 10:10:28 -0400 | [diff] [blame] | 50 | func TestDefVarargsAndKwargsSet(t *testing.T) { |
| 51 | source := "def f(*args, **kwargs): pass\n" |
Alan Donovan | e3deafe | 2018-10-23 11:05:09 -0400 | [diff] [blame] | 52 | file, err := syntax.Parse("foo.star", source, 0) |
Alan Donovan | 312d1a5 | 2017-10-02 10:10:28 -0400 | [diff] [blame] | 53 | if err != nil { |
| 54 | t.Fatal(err) |
| 55 | } |
alandonovan | a1b28d8 | 2018-03-13 10:59:24 -0400 | [diff] [blame] | 56 | if err := resolve.File(file, isPredeclared, isUniversal); err != nil { |
Alan Donovan | 312d1a5 | 2017-10-02 10:10:28 -0400 | [diff] [blame] | 57 | t.Fatal(err) |
| 58 | } |
alandonovan | 6ddc71c | 2019-06-04 09:08:55 -0400 | [diff] [blame] | 59 | fn := file.Stmts[0].(*syntax.DefStmt).Function.(*resolve.Function) |
Alan Donovan | 312d1a5 | 2017-10-02 10:10:28 -0400 | [diff] [blame] | 60 | if !fn.HasVarargs { |
| 61 | t.Error("HasVarargs not set") |
| 62 | } |
| 63 | if !fn.HasKwargs { |
| 64 | t.Error("HasKwargs not set") |
| 65 | } |
| 66 | } |
| 67 | |
| 68 | func TestLambdaVarargsAndKwargsSet(t *testing.T) { |
| 69 | resolve.AllowLambda = true |
| 70 | source := "f = lambda *args, **kwargs: 0\n" |
Alan Donovan | e3deafe | 2018-10-23 11:05:09 -0400 | [diff] [blame] | 71 | file, err := syntax.Parse("foo.star", source, 0) |
Alan Donovan | 312d1a5 | 2017-10-02 10:10:28 -0400 | [diff] [blame] | 72 | if err != nil { |
| 73 | t.Fatal(err) |
| 74 | } |
alandonovan | a1b28d8 | 2018-03-13 10:59:24 -0400 | [diff] [blame] | 75 | if err := resolve.File(file, isPredeclared, isUniversal); err != nil { |
Alan Donovan | 312d1a5 | 2017-10-02 10:10:28 -0400 | [diff] [blame] | 76 | t.Fatal(err) |
| 77 | } |
alandonovan | 6ddc71c | 2019-06-04 09:08:55 -0400 | [diff] [blame] | 78 | lam := file.Stmts[0].(*syntax.AssignStmt).RHS.(*syntax.LambdaExpr).Function.(*resolve.Function) |
Alan Donovan | 312d1a5 | 2017-10-02 10:10:28 -0400 | [diff] [blame] | 79 | if !lam.HasVarargs { |
| 80 | t.Error("HasVarargs not set") |
| 81 | } |
| 82 | if !lam.HasKwargs { |
| 83 | t.Error("HasKwargs not set") |
| 84 | } |
| 85 | } |
| 86 | |
alandonovan | a1b28d8 | 2018-03-13 10:59:24 -0400 | [diff] [blame] | 87 | func isPredeclared(name string) bool { return name == "M" } |
| 88 | |
| 89 | func isUniversal(name string) bool { return name == "U" || name == "float" } |