Skip to content

Commit a67a33e

Browse files
committed
Update functions to pass latest compliance test updates
1 parent e0a0b99 commit a67a33e

File tree

4 files changed

+277
-12
lines changed

4 files changed

+277
-12
lines changed

jmespath.js

Lines changed: 67 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -992,17 +992,27 @@
992992
contains: {
993993
func: this.functionContains,
994994
signature: [{types: ["string", "array"]}, {types: ["any"]}]},
995+
ends_with: {
996+
func: this.functionEndsWith,
997+
signature: [{types: ["string"]}, {types: ["string"]}]},
995998
floor: {func: this.functionFloor, signature: [{types: ["number"]}]},
996999
length: {
9971000
func: this.functionLength,
9981001
signature: [{types: ["string", "array", "object"]}]},
999-
max: {func: this.functionMax, signature: [{types: ["array-number"]}]},
1002+
max: {
1003+
func: this.functionMax,
1004+
signature: [{types: ["array-number", "array-string"]}]},
10001005
"max_by": {
10011006
func: this.functionMaxBy,
10021007
signature: [{types: ["array"]}, {types: ["expref"]}]
10031008
},
10041009
sum: {func: this.functionSum, signature: [{types: ["array-number"]}]},
1005-
min: {func: this.functionMin, signature: [{types: ["array-number"]}]},
1010+
starts_with: {
1011+
func: this.functionStartsWith,
1012+
signature: [{types: ["string"]}, {types: ["string"]}]},
1013+
min: {
1014+
func: this.functionMin,
1015+
signature: [{types: ["array-number", "array-string"]}]},
10061016
"min_by": {
10071017
func: this.functionMinBy,
10081018
signature: [{types: ["array"]}, {types: ["expref"]}]
@@ -1022,6 +1032,9 @@
10221032
{types: ["array-string"]}
10231033
]
10241034
},
1035+
reverse: {
1036+
func: this.functionReverse,
1037+
signature: [{types: ["string", "array"]}]},
10251038
"to_string": {func: this.functionToString, signature: [{types: ["any"]}]},
10261039
"to_number": {func: this.functionToNumber, signature: [{types: ["any"]}]},
10271040
"not_null": {
@@ -1135,6 +1148,32 @@
11351148
}
11361149
},
11371150

1151+
functionStartsWith: function(resolvedArgs) {
1152+
return resolvedArgs[0].lastIndexOf(resolvedArgs[1]) === 0;
1153+
},
1154+
1155+
functionEndsWith: function(resolvedArgs) {
1156+
var search = resolvedArgs[0];
1157+
var suffix = resolvedArgs[1];
1158+
return search.indexOf(suffix, search.length - suffix.length) !== -1;
1159+
},
1160+
1161+
functionReverse: function(resolvedArgs) {
1162+
var typeName = this.getTypeName(resolvedArgs[0]);
1163+
if (typeName === "string") {
1164+
var originalStr = resolvedArgs[0];
1165+
var reversedStr = "";
1166+
for (var i = originalStr.length - 1; i >= 0; i--) {
1167+
reversedStr += originalStr[i]
1168+
}
1169+
return reversedStr;
1170+
} else {
1171+
var reversedArray = resolvedArgs[0].slice(0);
1172+
reversedArray.reverse();
1173+
return reversedArray;
1174+
}
1175+
},
1176+
11381177
functionAbs: function(resolvedArgs) {
11391178
return Math.abs(resolvedArgs[0]);
11401179
},
@@ -1172,15 +1211,39 @@
11721211

11731212
functionMax: function(resolvedArgs) {
11741213
if (resolvedArgs[0].length > 0) {
1175-
return Math.max.apply(Math, resolvedArgs[0]);
1214+
var typeName = this.getTypeName(resolvedArgs[0][0]);
1215+
if (typeName === "number") {
1216+
return Math.max.apply(Math, resolvedArgs[0]);
1217+
} else {
1218+
var elements = resolvedArgs[0];
1219+
var maxElement = elements[0];
1220+
for (var i = 1; i < elements.length; i++) {
1221+
if (maxElement.localeCompare(elements[i]) < 0) {
1222+
maxElement = elements[i];
1223+
}
1224+
}
1225+
return maxElement;
1226+
}
11761227
} else {
11771228
return null;
11781229
}
11791230
},
11801231

11811232
functionMin: function(resolvedArgs) {
11821233
if (resolvedArgs[0].length > 0) {
1183-
return Math.min.apply(Math, resolvedArgs[0]);
1234+
var typeName = this.getTypeName(resolvedArgs[0][0]);
1235+
if (typeName === "number") {
1236+
return Math.min.apply(Math, resolvedArgs[0]);
1237+
} else {
1238+
var elements = resolvedArgs[0];
1239+
var minElement = elements[0];
1240+
for (var i = 1; i < elements.length; i++) {
1241+
if (elements[i].localeCompare(minElement) < 0) {
1242+
minElement = elements[i];
1243+
}
1244+
}
1245+
return minElement;
1246+
}
11841247
} else {
11851248
return null;
11861249
}

test/compliance.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ function addTestSuitesFromFile(filename) {
4343
})(testcase, given);
4444
} else {
4545
(function(testcase, given) {
46-
it('should pass test ' + j, function() {
46+
it('should pass test ' + j + " expression: " + testcase.expression, function() {
4747
assert.deepEqual(search(given, testcase.expression),
4848
testcase.result);
4949
});

test/compliance/functions.json

Lines changed: 79 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,30 @@
127127
"expression": "contains(decimals, `false`)",
128128
"result": false
129129
},
130+
{
131+
"expression": "ends_with(str, `r`)",
132+
"result": true
133+
},
134+
{
135+
"expression": "ends_with(str, `tr`)",
136+
"result": true
137+
},
138+
{
139+
"expression": "ends_with(str, `Str`)",
140+
"result": true
141+
},
142+
{
143+
"expression": "ends_with(str, `SStr`)",
144+
"result": false
145+
},
146+
{
147+
"expression": "ends_with(str, `foo`)",
148+
"result": false
149+
},
150+
{
151+
"expression": "ends_with(str, `0`)",
152+
"error": "invalid-type"
153+
},
130154
{
131155
"expression": "floor(`1.2`)",
132156
"result": 1
@@ -195,6 +219,10 @@
195219
"expression": "max(decimals)",
196220
"result": 1.2
197221
},
222+
{
223+
"expression": "max(strings)",
224+
"result": "c"
225+
},
198226
{
199227
"expression": "max(abc)",
200228
"error": "invalid-type"
@@ -235,6 +263,10 @@
235263
"expression": "min(decimals)",
236264
"result": -1.5
237265
},
266+
{
267+
"expression": "min(strings)",
268+
"result": "a"
269+
},
238270
{
239271
"expression": "type(`abc`)",
240272
"result": "string"
@@ -339,6 +371,46 @@
339371
"expression": "join(`|`, empty_list)",
340372
"result": ""
341373
},
374+
{
375+
"expression": "reverse(numbers)",
376+
"result": [5, 4, 3, -1]
377+
},
378+
{
379+
"expression": "reverse(array)",
380+
"result": ["100", "a", 5, 4, 3, -1]
381+
},
382+
{
383+
"expression": "reverse(`[]`)",
384+
"result": []
385+
},
386+
{
387+
"expression": "reverse(``)",
388+
"result": ""
389+
},
390+
{
391+
"expression": "reverse(`hello world`)",
392+
"result": "dlrow olleh"
393+
},
394+
{
395+
"expression": "starts_with(str, `S`)",
396+
"result": true
397+
},
398+
{
399+
"expression": "starts_with(str, `St`)",
400+
"result": true
401+
},
402+
{
403+
"expression": "starts_with(str, `Str`)",
404+
"result": true
405+
},
406+
{
407+
"expression": "starts_with(str, `String`)",
408+
"result": false
409+
},
410+
{
411+
"expression": "starts_with(str, `0`)",
412+
"error": "invalid-type"
413+
},
342414
{
343415
"expression": "sum(numbers)",
344416
"result": 11
@@ -547,6 +619,10 @@
547619
"expression": "max_by(people, &age)",
548620
"result": {"age": 50, "age_str": "50", "bool": false, "name": "d"}
549621
},
622+
{
623+
"expression": "max_by(people, &age_str)",
624+
"result": {"age": 50, "age_str": "50", "bool": false, "name": "d"}
625+
},
550626
{
551627
"expression": "max_by(people, &bool)",
552628
"error": "invalid-type"
@@ -560,11 +636,11 @@
560636
"result": {"age": 50, "age_str": "50", "bool": false, "name": "d"}
561637
},
562638
{
563-
"expression": "max_by(people, &age_str)",
564-
"error": "invalid-type"
639+
"expression": "min_by(people, &age)",
640+
"result": {"age": 10, "age_str": "10", "bool": true, "name": 3}
565641
},
566642
{
567-
"expression": "min_by(people, &age)",
643+
"expression": "min_by(people, &age_str)",
568644
"result": {"age": 10, "age_str": "10", "bool": true, "name": 3}
569645
},
570646
{
@@ -578,10 +654,6 @@
578654
{
579655
"expression": "min_by(people, &to_number(age_str))",
580656
"result": {"age": 10, "age_str": "10", "bool": true, "name": 3}
581-
},
582-
{
583-
"expression": "min_by(people, &age_str)",
584-
"error": "invalid-type"
585657
}
586658
]
587659
}, {

test/compliance/slice.json

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
[{
2+
"given": {
3+
"foo": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
4+
"bar": {
5+
"baz": 1
6+
}
7+
},
8+
"cases": [
9+
{
10+
"expression": "bar[0:10]",
11+
"result": null
12+
},
13+
{
14+
"expression": "foo[0:10:1]",
15+
"result": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
16+
},
17+
{
18+
"expression": "foo[0:10]",
19+
"result": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
20+
},
21+
{
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]
56+
},
57+
{
58+
"expression": "foo[1:9]",
59+
"result": [1, 2, 3, 4, 5, 6, 7, 8]
60+
},
61+
{
62+
"expression": "foo[0:10:2]",
63+
"result": [0, 2, 4, 6, 8]
64+
},
65+
{
66+
"expression": "foo[5:]",
67+
"result": [5, 6, 7, 8, 9]
68+
},
69+
{
70+
"expression": "foo[5::2]",
71+
"result": [5, 7, 9]
72+
},
73+
{
74+
"expression": "foo[::2]",
75+
"result": [0, 2, 4, 6, 8]
76+
},
77+
{
78+
"expression": "foo[::-1]",
79+
"result": [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
80+
},
81+
{
82+
"expression": "foo[1::2]",
83+
"result": [1, 3, 5, 7, 9]
84+
},
85+
{
86+
"expression": "foo[10:0:-1]",
87+
"result": [9, 8, 7, 6, 5, 4, 3, 2, 1]
88+
},
89+
{
90+
"expression": "foo[10:5:-1]",
91+
"result": [9, 8, 7, 6]
92+
},
93+
{
94+
"expression": "foo[8:2:-2]",
95+
"result": [8, 6, 4]
96+
},
97+
{
98+
"expression": "foo[0:20]",
99+
"result": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
100+
},
101+
{
102+
"expression": "foo[10:-20:-1]",
103+
"result": [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
104+
},
105+
{
106+
"expression": "foo[10:-20]",
107+
"result": []
108+
},
109+
{
110+
"expression": "foo[-4:-1]",
111+
"result": [6, 7, 8]
112+
},
113+
{
114+
"expression": "foo[:-5:-1]",
115+
"result": [9, 8, 7, 6]
116+
},
117+
{
118+
"expression": "foo[8:2:0]",
119+
"error": "invalid-value"
120+
},
121+
{
122+
"expression": "foo[8:2:0:1]",
123+
"error": "syntax"
124+
},
125+
{
126+
"expression": "foo[8:2&]",
127+
"error": "syntax"
128+
}
129+
]
130+
}]

0 commit comments

Comments
 (0)