Skip to content

Commit 36d98ff

Browse files
committed
Fixing a bug in determining slice endpoint
1 parent 88b6d64 commit 36d98ff

File tree

3 files changed

+89
-62
lines changed

3 files changed

+89
-62
lines changed

src/Utils.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ private static function adjustEndpoint($length, $endpoint, $step)
155155
if ($endpoint < 0) {
156156
$endpoint += $length;
157157
if ($endpoint < 0) {
158-
$endpoint = 0;
158+
$endpoint = $step < 0 ? -1 : 0;
159159
}
160160
} elseif ($endpoint >= $length) {
161161
$endpoint = $step < 0 ? $length - 1 : $length;

tests/compliance/functions.json

Lines changed: 42 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -542,11 +542,11 @@
542542
"given":
543543
{
544544
"foo": [
545-
{"b": "b", "a": "a"},
546-
{"c": "c", "b": "b"},
547-
{"d": "d", "c": "c"},
548-
{"e": "e", "d": "d"},
549-
{"f": "f", "e": "e"}
545+
{"b": "b", "a": "a"},
546+
{"c": "c", "b": "b"},
547+
{"d": "d", "c": "c"},
548+
{"e": "e", "d": "d"},
549+
{"f": "f", "e": "e"}
550550
]
551551
},
552552
"cases": [
@@ -560,34 +560,34 @@
560560
"given":
561561
{
562562
"people": [
563-
{"age": 20, "age_str": "20", "bool": true, "name": "a", "extra": "foo"},
564-
{"age": 40, "age_str": "40", "bool": false, "name": "b", "extra": "bar"},
565-
{"age": 30, "age_str": "30", "bool": true, "name": "c"},
566-
{"age": 50, "age_str": "50", "bool": false, "name": "d"},
567-
{"age": 10, "age_str": "10", "bool": true, "name": 3}
563+
{"age": 20, "age_str": "20", "bool": true, "name": "a", "extra": "foo"},
564+
{"age": 40, "age_str": "40", "bool": false, "name": "b", "extra": "bar"},
565+
{"age": 30, "age_str": "30", "bool": true, "name": "c"},
566+
{"age": 50, "age_str": "50", "bool": false, "name": "d"},
567+
{"age": 10, "age_str": "10", "bool": true, "name": 3}
568568
]
569569
},
570570
"cases": [
571571
{
572572
"description": "function projection on variadic function",
573573
"expression": "sort_by(people, &age)",
574574
"result": [
575-
{"age": 10, "age_str": "10", "bool": true, "name": 3},
576-
{"age": 20, "age_str": "20", "bool": true, "name": "a", "extra": "foo"},
577-
{"age": 30, "age_str": "30", "bool": true, "name": "c"},
578-
{"age": 40, "age_str": "40", "bool": false, "name": "b", "extra": "bar"},
579-
{"age": 50, "age_str": "50", "bool": false, "name": "d"}
575+
{"age": 10, "age_str": "10", "bool": true, "name": 3},
576+
{"age": 20, "age_str": "20", "bool": true, "name": "a", "extra": "foo"},
577+
{"age": 30, "age_str": "30", "bool": true, "name": "c"},
578+
{"age": 40, "age_str": "40", "bool": false, "name": "b", "extra": "bar"},
579+
{"age": 50, "age_str": "50", "bool": false, "name": "d"}
580580
]
581581
},
582582
{
583583
"description": "function projection on variadic function",
584584
"expression": "sort_by(people, &to_number(age_str))",
585585
"result": [
586-
{"age": 10, "age_str": "10", "bool": true, "name": 3},
587-
{"age": 20, "age_str": "20", "bool": true, "name": "a", "extra": "foo"},
588-
{"age": 30, "age_str": "30", "bool": true, "name": "c"},
589-
{"age": 40, "age_str": "40", "bool": false, "name": "b", "extra": "bar"},
590-
{"age": 50, "age_str": "50", "bool": false, "name": "d"}
586+
{"age": 10, "age_str": "10", "bool": true, "name": 3},
587+
{"age": 20, "age_str": "20", "bool": true, "name": "a", "extra": "foo"},
588+
{"age": 30, "age_str": "30", "bool": true, "name": "c"},
589+
{"age": 40, "age_str": "40", "bool": false, "name": "b", "extra": "bar"},
590+
{"age": 50, "age_str": "50", "bool": false, "name": "d"}
591591
]
592592
},
593593
{
@@ -660,35 +660,35 @@
660660
"given":
661661
{
662662
"people": [
663-
{"age": 10, "order": "1"},
664-
{"age": 10, "order": "2"},
665-
{"age": 10, "order": "3"},
666-
{"age": 10, "order": "4"},
667-
{"age": 10, "order": "5"},
668-
{"age": 10, "order": "6"},
669-
{"age": 10, "order": "7"},
670-
{"age": 10, "order": "8"},
671-
{"age": 10, "order": "9"},
672-
{"age": 10, "order": "10"},
673-
{"age": 10, "order": "11"}
663+
{"age": 10, "order": "1"},
664+
{"age": 10, "order": "2"},
665+
{"age": 10, "order": "3"},
666+
{"age": 10, "order": "4"},
667+
{"age": 10, "order": "5"},
668+
{"age": 10, "order": "6"},
669+
{"age": 10, "order": "7"},
670+
{"age": 10, "order": "8"},
671+
{"age": 10, "order": "9"},
672+
{"age": 10, "order": "10"},
673+
{"age": 10, "order": "11"}
674674
]
675675
},
676676
"cases": [
677677
{
678678
"description": "stable sort order",
679679
"expression": "sort_by(people, &age)",
680680
"result": [
681-
{"age": 10, "order": "1"},
682-
{"age": 10, "order": "2"},
683-
{"age": 10, "order": "3"},
684-
{"age": 10, "order": "4"},
685-
{"age": 10, "order": "5"},
686-
{"age": 10, "order": "6"},
687-
{"age": 10, "order": "7"},
688-
{"age": 10, "order": "8"},
689-
{"age": 10, "order": "9"},
690-
{"age": 10, "order": "10"},
691-
{"age": 10, "order": "11"}
681+
{"age": 10, "order": "1"},
682+
{"age": 10, "order": "2"},
683+
{"age": 10, "order": "3"},
684+
{"age": 10, "order": "4"},
685+
{"age": 10, "order": "5"},
686+
{"age": 10, "order": "6"},
687+
{"age": 10, "order": "7"},
688+
{"age": 10, "order": "8"},
689+
{"age": 10, "order": "9"},
690+
{"age": 10, "order": "10"},
691+
{"age": 10, "order": "11"}
692692
]
693693
}
694694
]

tests/compliance/slice.json

Lines changed: 46 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,56 @@
33
"foo": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
44
"bar": {
55
"baz": 1
6-
},
7-
"str": "abc 123, and above all listen to me"
6+
}
87
},
98
"cases": [
109
{
1110
"expression": "bar[0:10]",
1211
"result": null
1312
},
13+
{
14+
"expression": "foo[0:10:1]",
15+
"result": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
16+
},
1417
{
1518
"expression": "foo[0:10]",
1619
"result": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1720
},
1821
{
19-
"expression": "foo[0:9]",
20-
"result": [0, 1, 2, 3, 4, 5, 6, 7, 8]
22+
"expression": "foo[0:10:]",
23+
"result": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
24+
},
25+
{
26+
"expression": "foo[0::1]",
27+
"result": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
28+
},
29+
{
30+
"expression": "foo[0::]",
31+
"result": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
32+
},
33+
{
34+
"expression": "foo[0:]",
35+
"result": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
36+
},
37+
{
38+
"expression": "foo[:10:1]",
39+
"result": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
40+
},
41+
{
42+
"expression": "foo[::1]",
43+
"result": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
44+
},
45+
{
46+
"expression": "foo[:10:]",
47+
"result": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
48+
},
49+
{
50+
"expression": "foo[::]",
51+
"result": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
52+
},
53+
{
54+
"expression": "foo[:]",
55+
"result": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2156
},
2257
{
2358
"expression": "foo[1:9]",
@@ -39,6 +74,10 @@
3974
"expression": "foo[::2]",
4075
"result": [0, 2, 4, 6, 8]
4176
},
77+
{
78+
"expression": "foo[::-1]",
79+
"result": [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
80+
},
4281
{
4382
"expression": "foo[1::2]",
4483
"result": [1, 3, 5, 7, 9]
@@ -61,7 +100,7 @@
61100
},
62101
{
63102
"expression": "foo[10:-20:-1]",
64-
"result": [9, 8, 7, 6, 5, 4, 3, 2, 1]
103+
"result": [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
65104
},
66105
{
67106
"expression": "foo[10:-20]",
@@ -77,27 +116,15 @@
77116
},
78117
{
79118
"expression": "foo[8:2:0]",
80-
"error": "runtime"
119+
"error": "invalid-value"
81120
},
82121
{
83122
"expression": "foo[8:2:0:1]",
84123
"error": "syntax"
85124
},
86125
{
87-
"expression": "[8:2 0 1]",
126+
"expression": "foo[8:2&]",
88127
"error": "syntax"
89-
},
90-
{
91-
"expression": "str[::-1]",
92-
"result": "em ot netsil lla evoba dna ,321 cba"
93-
},
94-
{
95-
"expression": "str[:-5:-1]",
96-
"result": "em o"
97-
},
98-
{
99-
"expression": "str[2:3]",
100-
"result": "c"
101128
}
102129
]
103130
}]

0 commit comments

Comments
 (0)