Commit c5da414
authored
Align string member empty needle semantics (#1084)
## Motivation
`std.member` accepts either an array or a string as its first argument.
For strings, the official Jsonnet stdlib defines membership through
`std.findSubstr(x, arr)`, and `std.findSubstr("", "abc")` returns an
empty array. That means an empty string should not be considered a
string member.
sjsonnet's native implementation delegated directly to JVM
`String.contains`, which treats the empty string as contained in every
string. This made `std.member("abc", "")` and `std.member("", "")`
return `true`, even though the official stdlib-derived semantics return
`false`.
## Modification
- Require the string needle in `std.member` to be non-empty before
calling `String.contains`.
- Add regression coverage for empty string needles in string membership.
- Add array membership coverage to show that `std.member([""], "")`
remains `true`.
## Result
| Implementation | `std.member("abc", "")` | `std.member("", "")` |
`std.member([""], "")` | `std.findSubstr("", "abc")` |
| --- | --- | --- | --- | --- |
| cpp-jsonnet | `false` | `false` | `true` | `[]` |
| go-jsonnet | `true` | `true` | `true` | `[]` |
| jrsonnet | `false` | `false` | `true` | `[]` |
| sjsonnet before this PR | `true` | `true` | `true` | `[]` |
| sjsonnet after this PR | `false` | `false` | `true` | `[]` |
sjsonnet now matches cpp-jsonnet and jrsonnet for string membership with
an empty needle, while preserving normal substring membership and array
element membership.
## References
- Jsonnet stdlib docs for `std.member`:
https://jsonnet.org/ref/stdlib.html#std-member
- Jsonnet stdlib docs for `std.findSubstr`:
https://jsonnet.org/ref/stdlib.html#std-findSubstr
- Official Jsonnet stdlib `member` definition:
https://github.com/google/jsonnet/blob/master/stdlib/std.jsonnet
- go-jsonnet native `member` implementation:
https://github.com/google/go-jsonnet/blob/master/builtins.go1 parent fe92c46 commit c5da414
3 files changed
Lines changed: 8 additions & 1 deletion
File tree
- sjsonnet
- src/sjsonnet/stdlib
- test/resources/new_test_suite
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
574 | 574 | | |
575 | 575 | | |
576 | 576 | | |
577 | | - | |
| 577 | + | |
578 | 578 | | |
579 | 579 | | |
580 | 580 | | |
| |||
Lines changed: 6 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
Lines changed: 1 addition & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
0 commit comments