1
0
Fork 0
arangodb/tests/js/server/aql/aql-range.js

299 lines
11 KiB
JavaScript

/*jshint globalstrict:false, strict:false, maxlen: 500 */
/*global assertEqual, assertFalse, assertTrue, AQL_EXECUTE */
////////////////////////////////////////////////////////////////////////////////
/// @brief tests for optimizer rules
///
/// @file
///
/// DISCLAIMER
///
/// Copyright 2010-2012 triagens GmbH, Cologne, Germany
///
/// Licensed under the Apache License, Version 2.0 (the "License");
/// you may not use this file except in compliance with the License.
/// You may obtain a copy of the License at
///
/// http://www.apache.org/licenses/LICENSE-2.0
///
/// Unless required by applicable law or agreed to in writing, software
/// distributed under the License is distributed on an "AS IS" BASIS,
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
/// See the License for the specific language governing permissions and
/// limitations under the License.
///
/// Copyright holder is triAGENS GmbH, Cologne, Germany
///
/// @author Jan Steemann
/// @author Copyright 2012, triAGENS GmbH, Cologne, Germany
////////////////////////////////////////////////////////////////////////////////
var jsunity = require("jsunity");
////////////////////////////////////////////////////////////////////////////////
/// @brief test suite
////////////////////////////////////////////////////////////////////////////////
function rangesSuite () {
return {
////////////////////////////////////////////////////////////////////////////////
/// @brief set up
////////////////////////////////////////////////////////////////////////////////
setUp : function () {
},
////////////////////////////////////////////////////////////////////////////////
/// @brief tear down
////////////////////////////////////////////////////////////////////////////////
tearDown : function () {
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test range as result
////////////////////////////////////////////////////////////////////////////////
testRangeAsResult : function () {
var actual = AQL_EXECUTE("RETURN 1..9").json;
assertEqual([ 1, 2, 3, 4, 5, 6, 7, 8, 9 ], actual[0]);
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test range as result
////////////////////////////////////////////////////////////////////////////////
testRangeAsResultReversed : function () {
var actual = AQL_EXECUTE("RETURN 9..1").json;
assertEqual([ 9, 8, 7, 6, 5, 4, 3, 2, 1 ], actual[0]);
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test range as result
////////////////////////////////////////////////////////////////////////////////
testRangeInInExpressionWrong : function () {
for (var i = 0; i <= 10; ++i) {
var actual = AQL_EXECUTE("RETURN 1..9 IN " + i).json;
assertFalse(actual[0]);
}
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test range as result
////////////////////////////////////////////////////////////////////////////////
testRangeInInExpression : function () {
for (var i = 0; i <= 10; ++i) {
var actual = AQL_EXECUTE("RETURN " + i + " IN 1..9").json;
var expected = (i !== 0 && i !== 10);
assertEqual(expected, actual[0]);
}
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test range as result
////////////////////////////////////////////////////////////////////////////////
testRangeInNotInExpression : function () {
for (var i = 0; i <= 10; ++i) {
var actual = AQL_EXECUTE("RETURN " + i + " NOT IN 1..9").json;
var expected = (i === 0 || i === 10);
assertEqual(expected, actual[0]);
}
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test range as result
////////////////////////////////////////////////////////////////////////////////
testRangeInEqualityExpression : function () {
var actual = AQL_EXECUTE("RETURN 1..9 == 1..9").json;
assertTrue(actual[0]);
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test range as a function parameter
////////////////////////////////////////////////////////////////////////////////
testRangeAsFunctionParameter1 : function () {
var actual = AQL_EXECUTE("RETURN IS_STRING(1..73)").json;
assertFalse(actual[0]);
actual = AQL_EXECUTE("RETURN NOOPT(IS_STRING(1..73))").json;
assertFalse(actual[0]);
actual = AQL_EXECUTE("RETURN IS_ARRAY(1..73)").json;
assertTrue(actual[0]);
actual = AQL_EXECUTE("RETURN NOOPT(IS_ARRAY(1..73))").json;
assertTrue(actual[0]);
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test range as a function parameter
////////////////////////////////////////////////////////////////////////////////
testRangeAsFunctionParameter2 : function () {
var actual = AQL_EXECUTE("RETURN MAX(1..73)").json;
assertEqual(73, actual[0]);
actual = AQL_EXECUTE("RETURN NOOPT(MAX(1..73))").json;
assertEqual(73, actual[0]);
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test range as a function parameter
////////////////////////////////////////////////////////////////////////////////
testRangeAsFunctionParameter3 : function () {
var actual = AQL_EXECUTE("RETURN LENGTH(1..73)").json;
assertEqual(73, actual[0]);
actual = AQL_EXECUTE("RETURN NOOPT(LENGTH(1..73))").json;
assertEqual(73, actual[0]);
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test range as dynamic function parameter
////////////////////////////////////////////////////////////////////////////////
testFunctionRange : function () {
var actual = AQL_EXECUTE("RETURN FLOOR(1) .. FLOOR(10)").json;
assertEqual([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], actual[0]);
actual = AQL_EXECUTE("RETURN NOOPT(FLOOR(1) .. FLOOR(10))").json;
assertEqual([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], actual[0]);
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test range as dynamic function parameter
////////////////////////////////////////////////////////////////////////////////
testDynamicRanges1 : function () {
var actual = AQL_EXECUTE("LET lower = PASSTHRU(23), upper = PASSTHRU(42) RETURN [ MIN(lower..upper), MAX(lower..upper) ]").json;
assertEqual([ 23, 42 ], actual[0]);
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test range with a dynamic bound
////////////////////////////////////////////////////////////////////////////////
testDynamicRanges2 : function () {
var actual = AQL_EXECUTE("FOR i IN 1..4 RETURN 1..i").json;
assertEqual([ [ 1 ], [ 1, 2 ], [ 1, 2, 3 ], [ 1, 2, 3, 4 ] ], actual);
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test range with a dynamic bound
////////////////////////////////////////////////////////////////////////////////
testDynamicRanges3 : function () {
var actual = AQL_EXECUTE("LET a = 1..4 RETURN MAX(a)").json;
assertEqual([ 4 ], actual);
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test range access
////////////////////////////////////////////////////////////////////////////////
testRangesAccess1 : function () {
var actual = AQL_EXECUTE("LET a = 1..5 FOR i IN a RETURN a[0]").json;
assertEqual([ 1, 1, 1, 1, 1 ], actual);
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test range access
////////////////////////////////////////////////////////////////////////////////
testRangesAccess2 : function () {
var actual = AQL_EXECUTE("LET a = 1..5 FOR i IN a RETURN a[4]").json;
assertEqual([ 5, 5, 5, 5, 5 ], actual);
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test range access
////////////////////////////////////////////////////////////////////////////////
testRangesAccess3 : function () {
var actual = AQL_EXECUTE("LET a = 1..5 FOR i IN a RETURN a[-1]").json;
assertEqual([ 5, 5, 5, 5, 5 ], actual);
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test range access
////////////////////////////////////////////////////////////////////////////////
testRangesAccess4 : function () {
var actual = AQL_EXECUTE("LET a = 1..5 FOR i IN a RETURN a[-2]").json;
assertEqual([ 4, 4, 4, 4, 4 ], actual);
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test range access
////////////////////////////////////////////////////////////////////////////////
testRangesAccess5 : function () {
var actual = AQL_EXECUTE("LET a = 5..1 FOR i IN a RETURN a[0]").json;
assertEqual([ 5, 5, 5, 5, 5 ], actual);
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test range access
////////////////////////////////////////////////////////////////////////////////
testRangesAccess6 : function () {
var actual = AQL_EXECUTE("LET a = 5..1 FOR i IN a RETURN a[4]").json;
assertEqual([ 1, 1, 1, 1, 1 ], actual);
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test range access
////////////////////////////////////////////////////////////////////////////////
testRangesAccess7 : function () {
var actual = AQL_EXECUTE("LET a = 5..1 FOR i IN a RETURN a[-1]").json;
assertEqual([ 1, 1, 1, 1, 1 ], actual);
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test range access
////////////////////////////////////////////////////////////////////////////////
testRangesAccess8 : function () {
var actual = AQL_EXECUTE("LET a = 5..1 FOR i IN a RETURN a[-2]").json;
assertEqual([ 2, 2, 2, 2, 2 ], actual);
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test multiple ranges
////////////////////////////////////////////////////////////////////////////////
testMultipleRanges1 : function () {
var actual = AQL_EXECUTE("FOR i IN 1..2 FOR j IN 3..4 RETURN i").json;
assertEqual([ 1, 1, 2, 2 ], actual);
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test multiple ranges
////////////////////////////////////////////////////////////////////////////////
testMultipleRanges2 : function () {
var actual = AQL_EXECUTE("FOR i IN 1..2 FOR j IN 3..4 RETURN [ i, j ]").json;
assertEqual([ [ 1, 3 ], [ 1, 4 ], [ 2, 3 ], [ 2, 4 ] ], actual);
}
};
}
////////////////////////////////////////////////////////////////////////////////
/// @brief executes the test suite
////////////////////////////////////////////////////////////////////////////////
jsunity.run(rangesSuite);
return jsunity.done();