| 
									
										
										
										
											2012-08-21 18:14:13 +01:00
										 |  |  | # Tests are groups of three lines: program, input, expected output | 
					
						
							|  |  |  | # Blank lines and lines starting with # are ignored | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Simple value tests to check parser. Input is irrelevant | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | true | 
					
						
							|  |  |  | null | 
					
						
							|  |  |  | true | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | false | 
					
						
							|  |  |  | null | 
					
						
							|  |  |  | false | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-06 21:44:46 +01:00
										 |  |  | null | 
					
						
							|  |  |  | 42 | 
					
						
							|  |  |  | null | 
					
						
							| 
									
										
										
										
											2012-08-21 18:14:13 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 1 | 
					
						
							|  |  |  | null | 
					
						
							|  |  |  | 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # FIXME: much more number testing needed | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | {} | 
					
						
							|  |  |  | null | 
					
						
							|  |  |  | {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [] | 
					
						
							|  |  |  | null | 
					
						
							|  |  |  | [] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-12-02 23:53:55 +00:00
										 |  |  | # The input line starts with a 0xFEFF (byte order mark) codepoint | 
					
						
							|  |  |  | # No, there is no reason to have a byte order mark in UTF8 text. | 
					
						
							|  |  |  | # But apparently people do, so jq shouldn't break on it. | 
					
						
							|  |  |  | . | 
					
						
							|  |  |  | "byte order mark" | 
					
						
							|  |  |  | "byte order mark" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-20 00:09:20 +01:00
										 |  |  | # We test escapes by matching them against Unicode codepoints | 
					
						
							|  |  |  | # FIXME: more tests needed for weird unicode stuff (e.g. utf16 pairs) | 
					
						
							|  |  |  | "Aa\r\n\t\b\f\u03bc" | 
					
						
							|  |  |  | null | 
					
						
							|  |  |  | "Aa\u000d\u000a\u0009\u0008\u000c\u03bc" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | . | 
					
						
							|  |  |  | "Aa\r\n\t\b\f\u03bc" | 
					
						
							|  |  |  | "Aa\u000d\u000a\u0009\u0008\u000c\u03bc" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | "inter\("pol" + "ation")" | 
					
						
							|  |  |  | null | 
					
						
							|  |  |  | "interpolation" | 
					
						
							| 
									
										
										
										
											2012-08-21 18:14:13 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Dictionary construction syntax | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | {a: 1} | 
					
						
							|  |  |  | null | 
					
						
							|  |  |  | {"a":1} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-06 21:44:46 +01:00
										 |  |  | {a,b,(.d):.a,e:.b} | 
					
						
							|  |  |  | {"a":1, "b":2, "c":3, "d":"c"} | 
					
						
							|  |  |  | {"a":1, "b":2, "c":1, "e":2} | 
					
						
							| 
									
										
										
										
											2012-08-21 18:14:13 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-12-03 20:31:40 +00:00
										 |  |  | {"a",b,"a$\(1+1)"} | 
					
						
							|  |  |  | {"a":1, "b":2, "c":3, "a$2":4} | 
					
						
							|  |  |  | {"a":1, "b":2, "a$2":4} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-21 18:14:13 +01:00
										 |  |  | # | 
					
						
							|  |  |  | # Field access, piping | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .foo | 
					
						
							|  |  |  | {"foo": 42, "bar": 43} | 
					
						
							|  |  |  | 42 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .foo | .bar | 
					
						
							|  |  |  | {"foo": {"bar": 42}, "bar": "badvalue"} | 
					
						
							|  |  |  | 42 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .foo.bar | 
					
						
							|  |  |  | {"foo": {"bar": 42}, "bar": "badvalue"} | 
					
						
							|  |  |  | 42 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-22 14:03:46 +01:00
										 |  |  | .foo_bar | 
					
						
							|  |  |  | {"foo_bar": 2} | 
					
						
							|  |  |  | 2 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-03 16:16:14 +01:00
										 |  |  | .["foo"].bar | 
					
						
							|  |  |  | {"foo": {"bar": 42}, "bar": "badvalue"} | 
					
						
							|  |  |  | 42 | 
					
						
							| 
									
										
										
										
											2012-08-21 18:14:13 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Multiple outputs, iteration | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .[] | 
					
						
							|  |  |  | [1,2,3] | 
					
						
							|  |  |  | 1 | 
					
						
							|  |  |  | 2 | 
					
						
							|  |  |  | 3 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-02 21:45:27 +01:00
										 |  |  | 1,1 | 
					
						
							|  |  |  | [] | 
					
						
							|  |  |  | 1 | 
					
						
							|  |  |  | 1 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-11-25 23:49:57 +00:00
										 |  |  | 1,. | 
					
						
							|  |  |  | [] | 
					
						
							|  |  |  | 1 | 
					
						
							|  |  |  | [] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-02 21:45:27 +01:00
										 |  |  | [.] | 
					
						
							|  |  |  | [2] | 
					
						
							|  |  |  | [[2]] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [[2]] | 
					
						
							|  |  |  | [3] | 
					
						
							|  |  |  | [[2]] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [{}] | 
					
						
							|  |  |  | [2] | 
					
						
							|  |  |  | [{}] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [.[]] | 
					
						
							|  |  |  | ["a"] | 
					
						
							|  |  |  | ["a"] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-21 18:14:13 +01:00
										 |  |  | [(.,1),((.,.[]),(2,3))] | 
					
						
							|  |  |  | ["a","b"] | 
					
						
							|  |  |  | [["a","b"],1,["a","b"],"a","b",2,3] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [([5,5][]),.,.[]] | 
					
						
							|  |  |  | [1,2,3] | 
					
						
							|  |  |  | [5,5,[1,2,3],1,2,3] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | {x: (1,2)},{x:3} | .x | 
					
						
							|  |  |  | null | 
					
						
							|  |  |  | 1 | 
					
						
							|  |  |  | 2 | 
					
						
							|  |  |  | 3 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Variables | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 1 as $x | 2 as $y | [$x,$y,$x] | 
					
						
							|  |  |  | null | 
					
						
							|  |  |  | [1,2,1] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [1,2,3][] as $x | [[4,5,6,7][$x]] | 
					
						
							|  |  |  | null | 
					
						
							|  |  |  | [5] | 
					
						
							|  |  |  | [6] | 
					
						
							|  |  |  | [7] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-12-02 22:22:08 +00:00
										 |  |  | 42 as $x | . | . | . + 432 | $x + 1 | 
					
						
							|  |  |  | 34324 | 
					
						
							|  |  |  | 43 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-21 18:14:13 +01:00
										 |  |  | 1 as $x | [$x,$x,$x as $x | $x] | 
					
						
							|  |  |  | null | 
					
						
							|  |  |  | [1,1,1] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # [.,(.[] | {x:.},.),.,.[]] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Builtin functions | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 1+1 | 
					
						
							|  |  |  | null | 
					
						
							| 
									
										
										
										
											2012-09-02 21:45:27 +01:00
										 |  |  | 2 | 
					
						
							| 
									
										
										
										
											2012-08-21 18:14:13 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-03 16:50:38 +01:00
										 |  |  | 1+1 | 
					
						
							|  |  |  | "wtasdf" | 
					
						
							|  |  |  | 2.0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 1e+0+0.001e3 | 
					
						
							|  |  |  | "I wonder what this will be?" | 
					
						
							|  |  |  | 20e-1 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-21 18:14:13 +01:00
										 |  |  | .+4 | 
					
						
							|  |  |  | 15 | 
					
						
							|  |  |  | 19.0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [1,2,3] + [.] | 
					
						
							|  |  |  | null | 
					
						
							|  |  |  | [1,2,3,null] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-09 19:17:07 +01:00
										 |  |  | {"a":1} + {"b":2} + {"c":3} | 
					
						
							|  |  |  | "asdfasdf" | 
					
						
							|  |  |  | {"a":1, "b":2, "c":3} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-17 19:41:41 +01:00
										 |  |  | "asdf" + "jkl;" + . + . + . | 
					
						
							| 
									
										
										
										
											2012-09-10 16:16:39 +01:00
										 |  |  | "some string" | 
					
						
							| 
									
										
										
										
											2012-09-17 19:41:41 +01:00
										 |  |  | "asdfjkl;some stringsome stringsome string" | 
					
						
							| 
									
										
										
										
											2012-09-10 16:16:39 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | "\u0000\u0020\u0000" + . | 
					
						
							|  |  |  | "\u0000\u0020\u0000" | 
					
						
							|  |  |  | "\u0000 \u0000\u0000 \u0000" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-10 16:49:25 +01:00
										 |  |  | 42 - . | 
					
						
							|  |  |  | 11 | 
					
						
							|  |  |  | 31 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [1,2,3,4,1] - [.,3] | 
					
						
							|  |  |  | 1 | 
					
						
							|  |  |  | [2,4] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-10 16:57:17 +01:00
										 |  |  | [10 * 20, 20 / .] | 
					
						
							|  |  |  | 4 | 
					
						
							|  |  |  | [200, 5] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 1 + 2 * 2 + 10 / 2 | 
					
						
							|  |  |  | null | 
					
						
							|  |  |  | 10 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-10 18:08:00 +01:00
										 |  |  | [16 / 4 / 2, 16 / 4 * 2, 16 - 4 - 2, 16 - 4 + 2] | 
					
						
							|  |  |  | null | 
					
						
							|  |  |  | [2, 8, 10, 14] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-10 17:08:13 +01:00
										 |  |  | 1 + tonumber + ("10" | tonumber) | 
					
						
							|  |  |  | 4 | 
					
						
							|  |  |  | 15 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-10 18:08:00 +01:00
										 |  |  | [{"a":42},.object,10,.num,false,true,null,"b",[1,4]] | .[] as $x | [$x == .[]] | 
					
						
							|  |  |  | {"object": {"a":42}, "num":10.0} | 
					
						
							|  |  |  | [true,  true,  false, false, false, false, false, false, false] | 
					
						
							|  |  |  | [true,  true,  false, false, false, false, false, false, false] | 
					
						
							|  |  |  | [false, false, true,  true,  false, false, false, false, false] | 
					
						
							|  |  |  | [false, false, true,  true,  false, false, false, false, false] | 
					
						
							|  |  |  | [false, false, false, false, true,  false, false, false, false] | 
					
						
							|  |  |  | [false, false, false, false, false, true,  false, false, false] | 
					
						
							|  |  |  | [false, false, false, false, false, false, true,  false, false] | 
					
						
							|  |  |  | [false, false, false, false, false, false, false, true,  false] | 
					
						
							|  |  |  | [false, false, false, false, false, false, false, false, true ] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-16 11:08:42 +01:00
										 |  |  | [.[] | length] | 
					
						
							|  |  |  | [[], {}, [1,2], {"a":42}, "asdf"] | 
					
						
							|  |  |  | [0, 0, 2, 1, 4] | 
					
						
							| 
									
										
										
										
											2012-09-10 18:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-20 00:26:37 +01:00
										 |  |  | map(keys) | 
					
						
							|  |  |  | [{}, {"abcd":1,"abc":2,"abcde":3}, {"x":1, "z": 3, "y":2}] | 
					
						
							|  |  |  | [[], ["abc","abcd","abcde"], ["x","y","z"]] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-17 20:59:34 +01:00
										 |  |  | [1,2,empty,3,empty,4] | 
					
						
							|  |  |  | null | 
					
						
							|  |  |  | [1,2,3,4] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-18 23:32:24 +01:00
										 |  |  | map(add) | 
					
						
							|  |  |  | [[], [1,2,3], ["a","b","c"], [[3],[4,5],[6]], [{"a":1}, {"b":2}, {"a":3}]] | 
					
						
							|  |  |  | [null, 6, "abc", [3,4,5,6], {"a":3, "b": 2}] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-21 18:14:13 +01:00
										 |  |  | # | 
					
						
							|  |  |  | # User-defined functions | 
					
						
							|  |  |  | # Oh god. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-27 11:19:42 +01:00
										 |  |  | def f: . + 1; def g: def g: . + 100; f | g | f; (f | g), g | 
					
						
							| 
									
										
										
										
											2012-08-21 18:14:13 +01:00
										 |  |  | 3.0 | 
					
						
							|  |  |  | 106.0 | 
					
						
							|  |  |  | 105.0 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-27 11:19:42 +01:00
										 |  |  | def f: (1000,2000); f | 
					
						
							| 
									
										
										
										
											2012-08-22 19:05:53 +01:00
										 |  |  | 123412345 | 
					
						
							|  |  |  | 1000 | 
					
						
							|  |  |  | 2000 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-02 21:45:27 +01:00
										 |  |  | ([1,2] + [4,5]) | 
					
						
							|  |  |  | [1,2,3] | 
					
						
							|  |  |  | [1,2,4,5] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | true | 
					
						
							|  |  |  | [1] | 
					
						
							|  |  |  | true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-03 16:16:14 +01:00
										 |  |  | null,1,null | 
					
						
							|  |  |  | "hello" | 
					
						
							|  |  |  | null | 
					
						
							|  |  |  | 1 | 
					
						
							|  |  |  | null | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-02 21:45:27 +01:00
										 |  |  | [1,2,3] | 
					
						
							|  |  |  | [5,6] | 
					
						
							|  |  |  | [1,2,3] | 
					
						
							| 
									
										
										
										
											2012-08-26 14:25:56 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-27 11:19:42 +01:00
										 |  |  | def f(x): x | x; f([.], . + [42]) | 
					
						
							| 
									
										
										
										
											2012-08-26 14:25:56 +01:00
										 |  |  | [1,2,3] | 
					
						
							|  |  |  | [[[1,2,3]]] | 
					
						
							|  |  |  | [[1,2,3],42] | 
					
						
							|  |  |  | [[1,2,3,42]] | 
					
						
							|  |  |  | [1,2,3,42,42] | 
					
						
							| 
									
										
										
										
											2012-08-27 10:11:55 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-28 18:38:30 +01:00
										 |  |  | # test closures and lexical scoping | 
					
						
							|  |  |  | def id(x):x; 2000 as $x | def f(x):1 as $x | id([$x, x, x]); def g(x): 100 as $x | f($x,$x+x); g($x) | 
					
						
							|  |  |  | "more testing" | 
					
						
							|  |  |  | [1,100,2100.0,100,2100.0] | 
					
						
							| 
									
										
										
										
											2012-09-02 21:45:27 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | # test backtracking through function calls and returns | 
					
						
							|  |  |  | # this test is *evil* | 
					
						
							|  |  |  | [[20,10][1,0] as $x | def f: (100,200) as $y | def g: [$x + $y, .]; . + $x | g; f[0] | [f][0][1] | f] | 
					
						
							| 
									
										
										
										
											2012-09-10 16:07:03 +01:00
										 |  |  | 999999999 | 
					
						
							| 
									
										
										
										
											2012-09-02 21:45:27 +01:00
										 |  |  | [[110.0, 130.0], [210.0, 130.0], [110.0, 230.0], [210.0, 230.0], [120.0, 160.0], [220.0, 160.0], [120.0, 260.0], [220.0, 260.0]] | 
					
						
							| 
									
										
										
										
											2012-09-03 16:16:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-17 22:32:06 +01:00
										 |  |  | # test recursion | 
					
						
							|  |  |  | def fac: if . == 1 then 1 else . * (. - 1 | fac) end; [.[] | fac] | 
					
						
							|  |  |  | [1,2,3,4] | 
					
						
							|  |  |  | [1,2,6,24] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-12-18 17:36:24 +00:00
										 |  |  | # test stack overflow and reallocation | 
					
						
							|  |  |  | # this test is disabled for now, it takes a realllllly long time. | 
					
						
							|  |  |  | # def f: if length > 1000 then . else .+[1]|f end; f | length | 
					
						
							|  |  |  | # [] | 
					
						
							|  |  |  | # 1001 | 
					
						
							| 
									
										
										
										
											2012-09-17 22:32:06 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-03 16:16:14 +01:00
										 |  |  | # | 
					
						
							|  |  |  | # Assignment | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | .message = "goodbye" | 
					
						
							|  |  |  | {"message": "hello"} | 
					
						
							|  |  |  | {"message": "goodbye"} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .foo = .bar | 
					
						
							|  |  |  | {"bar":42} | 
					
						
							|  |  |  | {"foo":42, "bar":42} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-03 17:18:10 +01:00
										 |  |  | .foo |= .+1 | 
					
						
							|  |  |  | {"foo": 42} | 
					
						
							|  |  |  | {"foo": 43} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-11 23:55:59 +01:00
										 |  |  | .[] += 2, .[] *= 2, .[] -= 2, .[] /= 2 | 
					
						
							|  |  |  | [1,3,5] | 
					
						
							|  |  |  | [3,5,7] | 
					
						
							|  |  |  | [2,6,10] | 
					
						
							|  |  |  | [-1,1,3] | 
					
						
							|  |  |  | [0.5, 1.5, 2.5] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-03 17:18:10 +01:00
										 |  |  | .[0].a |= {"old":., "new":(.+1)} | 
					
						
							|  |  |  | [{"a":1,"b":2}] | 
					
						
							|  |  |  | [{"a":{"old":1, "new":2},"b":2}] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-03 16:16:14 +01:00
										 |  |  | def inc(x): x |= .+1; inc(.[].a) | 
					
						
							|  |  |  | [{"a":1,"b":2},{"a":2,"b":4},{"a":7,"b":8}] | 
					
						
							|  |  |  | [{"a":2,"b":2},{"a":3,"b":4},{"a":8,"b":8}] | 
					
						
							| 
									
										
										
										
											2012-09-03 16:50:38 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | .[2][3] = 1 | 
					
						
							|  |  |  | [4] | 
					
						
							|  |  |  | [4, null, [null, null, null, 1]] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .foo[2].bar = 1 | 
					
						
							|  |  |  | {"foo":[11], "bar":42} | 
					
						
							|  |  |  | {"foo":[11,null,{"bar":1}], "bar":42} | 
					
						
							| 
									
										
										
										
											2012-09-04 15:34:34 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Conditionals | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [.[] | if .foo then "yep" else "nope" end] | 
					
						
							|  |  |  | [{"foo":0},{"foo":1},{"foo":[]},{"foo":true},{"foo":false},{"foo":null},{"foo":"foo"},{}] | 
					
						
							|  |  |  | ["yep","yep","yep","yep","nope","nope","yep","nope"] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-04 16:05:24 +01:00
										 |  |  | [.[] | if .baz then "strange" elif .foo then "yep" else "nope" end] | 
					
						
							|  |  |  | [{"foo":0},{"foo":1},{"foo":[]},{"foo":true},{"foo":false},{"foo":null},{"foo":"foo"},{}] | 
					
						
							|  |  |  | ["yep","yep","yep","yep","nope","nope","yep","nope"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-04 15:34:34 +01:00
										 |  |  | # FIXME: define/test behaviour of 'if (.foo,.bar) then A else B end' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [.[] | [.foo[] // .bar]] | 
					
						
							|  |  |  | [{"foo":[1,2], "bar": 42}, {"foo":[1], "bar": null}, {"foo":[null,false,3], "bar": 18}, {"foo":[], "bar":42}, {"foo": [null,false,null], "bar": 41}] | 
					
						
							|  |  |  | [[1,2], [1], [3], [42], [41]] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-16 11:07:36 +01:00
										 |  |  | # FIXME: behaviour of update operators | 
					
						
							|  |  |  | # .[] //= .[0] | 
					
						
							|  |  |  | # ["hello",true,false,[false],null] | 
					
						
							|  |  |  | # ["hello",true,"hello",[false],"hello"] | 
					
						
							| 
									
										
										
										
											2012-09-11 23:55:59 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-04 20:38:59 +01:00
										 |  |  | .[] | [.[0] and .[1], .[0] or .[1]] | 
					
						
							|  |  |  | [[true,[]], [false,1], [42,null], [null,false]] | 
					
						
							|  |  |  | [true,true] | 
					
						
							|  |  |  | [false,true] | 
					
						
							|  |  |  | [false,true] | 
					
						
							|  |  |  | [false,false] | 
					
						
							| 
									
										
										
										
											2012-09-04 20:43:40 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-17 21:08:43 +01:00
										 |  |  | [.[] | not] | 
					
						
							| 
									
										
										
										
											2012-09-04 20:43:40 +01:00
										 |  |  | [1,0,false,null,true,"hello"] | 
					
						
							|  |  |  | [false,false,true,true,false,false] | 
					
						
							| 
									
										
										
										
											2012-10-07 22:34:12 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | # Check numeric comparison binops | 
					
						
							|  |  |  | [10 > 0, 10 > 10, 10 > 20, 10 < 0, 10 < 10, 10 < 20] | 
					
						
							|  |  |  | {} | 
					
						
							|  |  |  | [true,false,false,false,false,true] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [10 >= 0, 10 >= 10, 10 >= 20, 10 <= 0, 10 <= 10, 10 <= 20] | 
					
						
							|  |  |  | {} | 
					
						
							| 
									
										
										
										
											2012-10-23 21:12:47 +02:00
										 |  |  | [true,true,false,false,true,true] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # And some in/equality tests | 
					
						
							|  |  |  | [ 10 == 10, 10 != 10, 10 != 11, 10 == 11] | 
					
						
							|  |  |  | {} | 
					
						
							|  |  |  | [true,false,true,false] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ["hello" == "hello", "hello" != "hello", "hello" == "world", "hello" != "world" ] | 
					
						
							|  |  |  | {} | 
					
						
							|  |  |  | [true,false,false,true] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [[1,2,3] == [1,2,3], [1,2,3] != [1,2,3], [1,2,3] == [4,5,6], [1,2,3] != [4,5,6]] | 
					
						
							|  |  |  | {} | 
					
						
							|  |  |  | [true,false,false,true] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [{"foo":42} == {"foo":42},{"foo":42} != {"foo":42}, {"foo":42} != {"bar":42}, {"foo":42} == {"bar":42}] | 
					
						
							|  |  |  | {} | 
					
						
							|  |  |  | [true,false,true,false] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # ugly complicated thing | 
					
						
							|  |  |  | [{"foo":[1,2,{"bar":18},"world"]} == {"foo":[1,2,{"bar":18},"world"]},{"foo":[1,2,{"bar":18},"world"]} == {"foo":[1,2,{"bar":19},"world"]}] | 
					
						
							|  |  |  | {} | 
					
						
							|  |  |  | [true,false] | 
					
						
							| 
									
										
										
										
											2012-10-24 11:42:25 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | # containment operator | 
					
						
							| 
									
										
										
										
											2012-12-02 22:24:02 +00:00
										 |  |  | [("foo" | contains("foo")), ("foobar" | contains("foo")), ("foo" | contains("foobar"))] | 
					
						
							| 
									
										
										
										
											2012-10-24 11:42:25 -07:00
										 |  |  | {} | 
					
						
							|  |  |  | [true, true, false] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-12-02 22:24:02 +00:00
										 |  |  | map(.[1] as $needle | .[0] | contains($needle)) | 
					
						
							|  |  |  | [[[],[]], [[1,2,3], [1,2]], [[1,2,3], [3,1]], [[1,2,3], [4]], [[1,2,3], [1,4]]] | 
					
						
							| 
									
										
										
										
											2012-10-24 11:42:25 -07:00
										 |  |  | [true, true, true, false, false] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-12-02 22:24:02 +00:00
										 |  |  | map(.[1] as $needle | .[0] | contains($needle)) | 
					
						
							|  |  |  | [[["foobar", "foobaz"], ["baz", "bar"]], [["foobar", "foobaz"], ["foo"]], [["foobar", "foobaz"], ["blap"]]] | 
					
						
							| 
									
										
										
										
											2012-10-24 11:42:25 -07:00
										 |  |  | [true, true, false] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-12-02 22:24:02 +00:00
										 |  |  | [({foo: 12, bar:13} | contains({foo: 12})), ({foo: 12} | contains({})), ({foo: 12, bar:13} | contains({baz:14}))] | 
					
						
							| 
									
										
										
										
											2012-10-24 11:42:25 -07:00
										 |  |  | {} | 
					
						
							|  |  |  | [true, true, false] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-12-02 22:24:02 +00:00
										 |  |  | {foo: {baz: 12, blap: {bar: 13}}, bar: 14} | contains({bar: 14, foo: {blap: {}}}) | 
					
						
							| 
									
										
										
										
											2012-10-24 11:42:25 -07:00
										 |  |  | {} | 
					
						
							|  |  |  | true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-12-02 22:24:02 +00:00
										 |  |  | {foo: {baz: 12, blap: {bar: 13}}, bar: 14} | contains({bar: 14, foo: {blap: {bar: 14}}}) | 
					
						
							| 
									
										
										
										
											2012-10-24 11:42:25 -07:00
										 |  |  | {} | 
					
						
							| 
									
										
										
										
											2012-11-26 22:23:30 +00:00
										 |  |  | false | 
					
						
							| 
									
										
										
										
											2012-11-30 20:27:16 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | sort | 
					
						
							|  |  |  | [42,[2,5,3,11],10,{"a":42,"b":2},{"a":42},true,2,[2,6],"hello",null,[2,5,6],{"a":[],"b":1},"abc","ab",[3,10],{},false,"abcd",null] | 
					
						
							|  |  |  | [null,null,false,true,2,10,42,"ab","abc","abcd","hello",[2,5,3,11],[2,5,6],[2,6],[3,10],{},{"a":42},{"a":42,"b":2},{"a":[],"b":1}] | 
					
						
							| 
									
										
										
										
											2012-12-02 23:22:15 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | (sort_by(.b) | sort_by(.a)), sort_by(.a, .b), sort_by(.b, .c), group_by(.b), group_by(.a + .b - .c == 2) | 
					
						
							|  |  |  | [{"a": 1, "b": 4, "c": 14}, {"a": 4, "b": 1, "c": 3}, {"a": 1, "b": 4, "c": 3}, {"a": 0, "b": 2, "c": 43}] | 
					
						
							|  |  |  | [{"a": 0, "b": 2, "c": 43}, {"a": 1, "b": 4, "c": 14}, {"a": 1, "b": 4, "c": 3}, {"a": 4, "b": 1, "c": 3}] | 
					
						
							|  |  |  | [{"a": 0, "b": 2, "c": 43}, {"a": 1, "b": 4, "c": 14}, {"a": 1, "b": 4, "c": 3}, {"a": 4, "b": 1, "c": 3}] | 
					
						
							|  |  |  | [{"a": 4, "b": 1, "c": 3}, {"a": 0, "b": 2, "c": 43}, {"a": 1, "b": 4, "c": 3}, {"a": 1, "b": 4, "c": 14}] | 
					
						
							|  |  |  | [[{"a": 4, "b": 1, "c": 3}], [{"a": 0, "b": 2, "c": 43}], [{"a": 1, "b": 4, "c": 14}, {"a": 1, "b": 4, "c": 3}]] | 
					
						
							|  |  |  | [[{"a": 1, "b": 4, "c": 14}, {"a": 0, "b": 2, "c": 43}], [{"a": 4, "b": 1, "c": 3}, {"a": 1, "b": 4, "c": 3}]] | 
					
						
							| 
									
										
										
										
											2012-12-03 02:02:12 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | unique | 
					
						
							|  |  |  | [1,2,5,3,5,3,1,3] | 
					
						
							|  |  |  | [1,2,3,5] | 
					
						
							| 
									
										
										
										
											2012-12-04 22:45:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | [min, max, min_by(.[1]), max_by(.[1]), min_by(.[2]), max_by(.[2])] | 
					
						
							|  |  |  | [[4,2,"a"],[3,1,"a"],[2,4,"a"],[1,3,"a"]] | 
					
						
							|  |  |  | [[1,3,"a"],[4,2,"a"],[3,1,"a"],[2,4,"a"],[4,2,"a"],[1,3,"a"]] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [min,max,min_by(.),max_by(.)] | 
					
						
							|  |  |  | [] | 
					
						
							|  |  |  | [null,null,null,null] | 
					
						
							| 
									
										
										
										
											2012-12-07 00:26:00 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | .foo[.baz] | 
					
						
							|  |  |  | {"foo":{"bar":4},"baz":"bar"} | 
					
						
							|  |  |  | 4 |