mirror of https://gitee.com/bigwinds/arangodb
Added brute force tests in AQL functions.
This commit is contained in:
parent
ca836216fc
commit
4f674220ab
|
@ -0,0 +1,461 @@
|
|||
/*jshint globalstrict:false, strict:false, maxlen: 500 */
|
||||
/*global AQL_EXECUTE */
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief tests for query language, functions
|
||||
///
|
||||
/// @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 internal = require("internal");
|
||||
var errors = internal.errors;
|
||||
var jsunity = require("jsunity");
|
||||
var db = internal.db;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief test suite
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
function ahuacatlFunctionsBruteTestSuite () {
|
||||
var c = null;
|
||||
|
||||
var all = [
|
||||
"IS_NULL",
|
||||
"IS_BOOL",
|
||||
"IS_NUMBER",
|
||||
"IS_STRING",
|
||||
"IS_ARRAY",
|
||||
"IS_LIST",
|
||||
"IS_OBJECT",
|
||||
"IS_DOCUMENT",
|
||||
"IS_DATESTRING",
|
||||
"TO_NUMBER",
|
||||
"TO_STRING",
|
||||
"TO_BOOL",
|
||||
"TO_ARRAY",
|
||||
"TO_LIST",
|
||||
"CONCAT",
|
||||
"CONCAT_SEPARATOR",
|
||||
"CHAR_LENGTH",
|
||||
"LOWER",
|
||||
"UPPER",
|
||||
"SUBSTRING",
|
||||
"CONTAINS",
|
||||
"LIKE",
|
||||
"LEFT",
|
||||
"RIGHT",
|
||||
"TRIM",
|
||||
"LTRIM",
|
||||
"RTRIM",
|
||||
"FIND_FIRST",
|
||||
"FIND_LAST",
|
||||
"SPLIT",
|
||||
"SUBSTITUTE",
|
||||
"MD5",
|
||||
"SHA1",
|
||||
"RANDOM_TOKEN",
|
||||
"FLOOR",
|
||||
"CEIL",
|
||||
"ROUND",
|
||||
"ABS",
|
||||
"RAND",
|
||||
"SQRT",
|
||||
"POW",
|
||||
"RANGE",
|
||||
"UNION",
|
||||
"UNION_DISTINCT",
|
||||
"MINUS",
|
||||
"INTERSECTION",
|
||||
"FLATTEN",
|
||||
"LENGTH",
|
||||
"COUNT",
|
||||
"MIN",
|
||||
"MAX",
|
||||
"SUM",
|
||||
"MEDIAN",
|
||||
"PERCENTILE",
|
||||
"AVERAGE",
|
||||
"AVG",
|
||||
"VARIANCE_SAMPLE",
|
||||
"VARIANCE_POPULATION",
|
||||
"STDDEV_SAMPLE",
|
||||
"STDDEV_POPULATION",
|
||||
"STDDEV",
|
||||
"UNIQUE",
|
||||
"SLICE",
|
||||
"REVERSE",
|
||||
"FIRST",
|
||||
"LAST",
|
||||
"NTH",
|
||||
"POSITION",
|
||||
"CALL",
|
||||
"APPLY",
|
||||
"PUSH",
|
||||
"APPEND",
|
||||
"POP",
|
||||
"SHIFT",
|
||||
"UNSHIFT",
|
||||
"REMOVE_VALUE",
|
||||
"REMOVE_VALUES",
|
||||
"REMOVE_NTH",
|
||||
"HAS",
|
||||
"ATTRIBUTES",
|
||||
"VALUES",
|
||||
"MERGE",
|
||||
"MERGE_RECURSIVE",
|
||||
"DOCUMENT",
|
||||
"MATCHES",
|
||||
"UNSET",
|
||||
"UNSET_RECURSIVE",
|
||||
"KEEP",
|
||||
"TRANSLATE",
|
||||
"ZIP",
|
||||
"NEAR",
|
||||
"WITHIN",
|
||||
"WITHIN_RECTANGLE",
|
||||
"IS_IN_POLYGON",
|
||||
"FULLTEXT",
|
||||
"PATHS",
|
||||
"GRAPH_PATHS",
|
||||
"SHORTEST_PATH",
|
||||
"GRAPH_SHORTEST_PATH",
|
||||
"GRAPH_DISTANCE_TO",
|
||||
"TRAVERSAL",
|
||||
"GRAPH_TRAVERSAL",
|
||||
"TRAVERSAL_TREE",
|
||||
"GRAPH_TRAVERSAL_TREE",
|
||||
"EDGES",
|
||||
"GRAPH_EDGES",
|
||||
"GRAPH_VERTICES",
|
||||
"NEIGHBORS",
|
||||
"GRAPH_NEIGHBORS",
|
||||
"GRAPH_COMMON_NEIGHBORS",
|
||||
"GRAPH_COMMON_PROPERTIES",
|
||||
"GRAPH_ECCENTRICITY",
|
||||
"GRAPH_BETWEENNESS",
|
||||
"GRAPH_CLOSENESS",
|
||||
"GRAPH_ABSOLUTE_ECCENTRICITY",
|
||||
"GRAPH_ABSOLUTE_BETWEENNESS",
|
||||
"GRAPH_ABSOLUTE_CLOSENESS",
|
||||
"GRAPH_DIAMETER",
|
||||
"GRAPH_RADIUS",
|
||||
"DATE_NOW",
|
||||
"DATE_TIMESTAMP",
|
||||
"DATE_ISO8601",
|
||||
"DATE_DAYOFWEEK",
|
||||
"DATE_YEAR",
|
||||
"DATE_MONTH",
|
||||
"DATE_DAY",
|
||||
"DATE_HOUR",
|
||||
"DATE_MINUTE",
|
||||
"DATE_SECOND",
|
||||
"DATE_MILLISECOND",
|
||||
"DATE_DAYOFYEAR",
|
||||
"DATE_ISOWEEK",
|
||||
"DATE_LEAPYEAR",
|
||||
"DATE_QUARTER",
|
||||
"DATE_DAYS_IN_MONTH",
|
||||
"DATE_ADD",
|
||||
"DATE_SUBTRACT",
|
||||
"DATE_DIFF",
|
||||
"DATE_COMPARE",
|
||||
"DATE_FORMAT",
|
||||
"NOT_NULL",
|
||||
"FIRST_LIST",
|
||||
"FIRST_DOCUMENT",
|
||||
"PARSE_IDENTIFIER",
|
||||
"IS_SAME_COLLECTION"
|
||||
];
|
||||
|
||||
// find all functions that have parameters
|
||||
var funcs = [];
|
||||
all.forEach(function(func) {
|
||||
var query = "RETURN " + func + "()";
|
||||
try {
|
||||
AQL_EXECUTE(query);
|
||||
} catch (err) {
|
||||
var s = String(err);
|
||||
var re = s.match(/minimum: (\d+), maximum: (\d+)/);
|
||||
if (re) {
|
||||
var min = Number(re[1]);
|
||||
var max = Number(re[2]);
|
||||
|
||||
if (max >= 1000) {
|
||||
max = min + 1;
|
||||
}
|
||||
if (max > 0) {
|
||||
funcs.push({ name: func, min: min, max: max });
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
var oneArgument = function(func) {
|
||||
return func.min === 1;
|
||||
};
|
||||
|
||||
var twoArguments = function(func) {
|
||||
return func.min === 2;
|
||||
};
|
||||
|
||||
var skip = function(err) {
|
||||
if (!err.hasOwnProperty('errorNum')) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return [
|
||||
errors.ERROR_ARANGO_CROSS_COLLECTION_REQUEST.code,
|
||||
errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code,
|
||||
errors.ERROR_QUERY_FUNCTION_NOT_FOUND.code,
|
||||
errors.ERROR_GRAPH_NOT_FOUND.code,
|
||||
errors.ERROR_GRAPH_INVALID_GRAPH.code,
|
||||
].indexOf(err.errorNum) !== -1;
|
||||
};
|
||||
|
||||
return {
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief set up
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
setUp : function () {
|
||||
db._drop("UnitTestsFunctions");
|
||||
c = db._create("UnitTestsFunctions");
|
||||
c.insert({ _key: "test", value: "test" });
|
||||
},
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief tear down
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
tearDown : function () {
|
||||
db._drop("UnitTestsFunctions");
|
||||
},
|
||||
|
||||
testFunctionsOneWithDoc : function() {
|
||||
funcs.filter(oneArgument).forEach(function(func) {
|
||||
var query = "FOR doc IN @@collection RETURN " + func.name + "(doc)";
|
||||
try {
|
||||
AQL_EXECUTE(query, { "@collection" : c.name() });
|
||||
} catch (err) {
|
||||
if (!skip(err)) {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
testFunctionsOneWithDocArray : function() {
|
||||
funcs.filter(oneArgument).forEach(function(func) {
|
||||
var query = "FOR doc IN @@collection RETURN " + func.name + "([ doc ])";
|
||||
try {
|
||||
AQL_EXECUTE(query, { "@collection" : c.name() });
|
||||
} catch (err) {
|
||||
if (!skip(err)) {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
testFunctionsOneWithKey : function() {
|
||||
funcs.filter(oneArgument).forEach(function(func) {
|
||||
var query = "FOR doc IN @@collection RETURN " + func.name + "(doc._key)";
|
||||
try {
|
||||
AQL_EXECUTE(query, { "@collection" : c.name() });
|
||||
} catch (err) {
|
||||
if (!skip(err)) {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
testFunctionsOneWithId : function() {
|
||||
funcs.filter(oneArgument).forEach(function(func) {
|
||||
var query = "FOR doc IN @@collection RETURN " + func.name + "(doc._id)";
|
||||
try {
|
||||
AQL_EXECUTE(query, { "@collection" : c.name() });
|
||||
} catch (err) {
|
||||
if (!skip(err)) {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
testFunctionsOneWithIdArray : function() {
|
||||
funcs.filter(oneArgument).forEach(function(func) {
|
||||
var query = "FOR doc IN @@collection RETURN " + func.name + "([ doc._id ])";
|
||||
try {
|
||||
AQL_EXECUTE(query, { "@collection" : c.name() });
|
||||
} catch (err) {
|
||||
if (!skip(err)) {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
testFunctionsTwoWithDoc : function() {
|
||||
funcs.filter(twoArguments).forEach(function(func) {
|
||||
var query = "FOR doc IN @@collection RETURN " + func.name + "(doc, doc)";
|
||||
try {
|
||||
AQL_EXECUTE(query, { "@collection" : c.name() });
|
||||
} catch (err) {
|
||||
if (!skip(err)) {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
testFunctionsTwoWithDocArray : function() {
|
||||
funcs.filter(twoArguments).forEach(function(func) {
|
||||
var query = "FOR doc IN @@collection RETURN " + func.name + "([ doc ], [ doc ])";
|
||||
try {
|
||||
AQL_EXECUTE(query, { "@collection" : c.name() });
|
||||
} catch (err) {
|
||||
if (!skip(err)) {
|
||||
require("internal").print(query);
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
testFunctionTwoWithKey : function() {
|
||||
funcs.filter(twoArguments).forEach(function(func) {
|
||||
var query = "FOR doc IN @@collection RETURN " + func.name + "(doc._key, doc._key)";
|
||||
try {
|
||||
AQL_EXECUTE(query, { "@collection" : c.name() });
|
||||
} catch (err) {
|
||||
if (!skip(err)) {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
testFunctionsTwoWithId : function() {
|
||||
funcs.filter(twoArguments).forEach(function(func) {
|
||||
var query = "FOR doc IN @@collection RETURN " + func.name + "(doc._id, doc._id)";
|
||||
try {
|
||||
AQL_EXECUTE(query, { "@collection" : c.name() });
|
||||
} catch (err) {
|
||||
if (!skip(err)) {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
testFunctionsTwoWithIdArray : function() {
|
||||
funcs.filter(twoArguments).forEach(function(func) {
|
||||
var query = "FOR doc IN @@collection RETURN " + func.name + "([ doc._id ], [ doc._id ])";
|
||||
try {
|
||||
AQL_EXECUTE(query, { "@collection" : c.name() });
|
||||
} catch (err) {
|
||||
if (!skip(err)) {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
testFunctionsTwoWithDocId : function() {
|
||||
funcs.filter(twoArguments).forEach(function(func) {
|
||||
var query = "FOR doc IN @@collection RETURN " + func.name + "(doc, doc._id)";
|
||||
try {
|
||||
AQL_EXECUTE(query, { "@collection" : c.name() });
|
||||
} catch (err) {
|
||||
if (!skip(err)) {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
testFunctionsTwoWithDocIdArray : function() {
|
||||
funcs.filter(twoArguments).forEach(function(func) {
|
||||
var query = "FOR doc IN @@collection RETURN " + func.name + "(doc, [ doc._id ])";
|
||||
try {
|
||||
AQL_EXECUTE(query, { "@collection" : c.name() });
|
||||
} catch (err) {
|
||||
if (!skip(err)) {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
testFunctionsTwoWithIdDoc : function() {
|
||||
funcs.filter(twoArguments).forEach(function(func) {
|
||||
var query = "FOR doc IN @@collection RETURN " + func.name + "(doc._id, doc)";
|
||||
try {
|
||||
AQL_EXECUTE(query, { "@collection" : c.name() });
|
||||
} catch (err) {
|
||||
if (!skip(err)) {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
testFunctionsTwoWithIdDocArray : function() {
|
||||
funcs.filter(twoArguments).forEach(function(func) {
|
||||
var query = "FOR doc IN @@collection RETURN " + func.name + "([ doc._id ], doc)";
|
||||
try {
|
||||
AQL_EXECUTE(query, { "@collection" : c.name() });
|
||||
} catch (err) {
|
||||
if (!skip(err)) {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
testFunctionsTwoWithIdArrayDocArray : function() {
|
||||
funcs.filter(twoArguments).forEach(function(func) {
|
||||
var query = "FOR doc IN @@collection RETURN " + func.name + "([ doc._id ], [ doc ])";
|
||||
try {
|
||||
AQL_EXECUTE(query, { "@collection" : c.name() });
|
||||
} catch (err) {
|
||||
if (!skip(err)) {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief executes the test suite
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
jsunity.run(ahuacatlFunctionsBruteTestSuite);
|
||||
|
||||
return jsunity.done();
|
||||
|
Loading…
Reference in New Issue