text: /*jshint globalstrict:false, strict:false, maxlen: 500 */
  /*global assertUndefined, assertEqual, assertTrue, assertFalse*/
  
  ////////////////////////////////////////////////////////////////////////////////
  /// @brief tests for iresearch usage
  ///
  /// @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");
  var db = require("@arangodb").db;
  
  ////////////////////////////////////////////////////////////////////////////////
  /// @brief test suite
  ////////////////////////////////////////////////////////////////////////////////
  
  function IResearchAqlTestSuite(numberOfShards, replicationFactor) {
    var c;
    var v;
  
    // provided arguments
    var args = {
      numberOfShards: numberOfShards, 
      replicationFactor: replicationFactor 
    };
    console.info("Test suite arguments: " + JSON.stringify(args));
  
    return {
      setUp : function () {
        db._drop("UnitTestsCollection");
        c = db._create("UnitTestsCollection", args);
  
        db._drop("AnotherUnitTestsCollection");
        var ac = db._create("AnotherUnitTestsCollection", args);
  
        db._dropView("UnitTestsView");
        v = db._createView("UnitTestsView", "arangosearch", {});
        var meta = {
          links: { 
            "UnitTestsCollection": { 
              includeAllFields: true,
              storeValues: "id",
              fields: {
                text: { analyzers: [ "text_en" ] }
              }
            }
          }
        };
        v.properties(meta);
  
        ac.save({ a: "foo", id : 0 });
        ac.save({ a: "ba", id : 1 });
  
        for (let i = 0; i < 5; i++) {
          c.save({ a: "foo", b: "bar", c: i });
          c.save({ a: "foo", b: "baz", c: i });
          c.save({ a: "bar", b: "foo", c: i });
          c.save({ a: "baz", b: "foo", c: i });
        }
  
        c.save({ name: "full", text: "the quick brown fox jumps over the lazy dog" });
        c.save({ name: "half", text: "quick fox over lazy" });
        c.save({ name: "other half", text: "the brown jumps the dog" });
        c.save({ name: "quarter", text: "quick over" });
  
        c.save({ name: "numeric", anotherNumericField: 0 });
        c.save({ name: "null", anotherNullField: null });
        c.save({ name: "bool", anotherBoolField: true });
        c.save({ _key: "foo", xyz: 1 });
      },
  
      tearDown : function () {
        var meta = { links : { "UnitTestsCollection": null } };
        v.properties(meta);
        v.drop();
        db._drop("UnitTestsCollection");
        db._drop("AnotherUnitTestsCollection");
      },
  
      testInTokensFilterSortTFIDF : function () {
        var result = db._query("FOR doc IN UnitTestsView SEARCH ANALYZER(doc.text IN TOKENS('the quick brown', 'text_en'), 'text_en') OPTIONS { waitForSync: true } SORT TFIDF(doc) LIMIT 4 RETURN doc").toArray();
  
        assertEqual(result.length, 4);
        assertEqual(result[0].name, 'other half');
        assertEqual(result[1].name, 'full');
        assertEqual(result[2].name, 'half');
        assertEqual(result[3].name, 'quarter');
      },
  
  /*    testViewInInnerLoopSortByTFIDF_BM25_Attribute : function() {
        var expected = [];
        expected.push({ a: "baz", b: "foo", c: 1 });
        expected.push({ a: "bar", b: "foo", c: 1 });
        expected.push({ a: "foo", b: "bar", c: 0 });
        expected.push({ a: "foo", b: "baz", c: 0 });
  
        var result = db._query(
          "FOR adoc IN AnotherUnitTestsCollection" +
          "  FOR doc IN UnitTestsView SEARCH adoc.id == doc.c && STARTS_WITH(doc['a'], adoc.a) " +
          "OPTIONS { waitForSync: true } SORT TFIDF(doc) DESC, BM25(doc) DESC, doc.a DESC, doc.b " +
          "RETURN doc").toArray();
  
        assertEqual(result.length, expected.length);
        var i = 0;
        result.forEach(function(res) {
          var doc = expected[i++];
          assertEqual(doc.a, res.a);
          assertEqual(doc.b, res.b);
          assertEqual(doc.c, res.c);
        });
      }*/
  
    };
  }
  
  ////////////////////////////////////////////////////////////////////////////////
  /// @brief executes the test suite
  ////////////////////////////////////////////////////////////////////////////////
  
  jsunity.run(function IResearchAqlTestSuite_s1_r1() {
    return IResearchAqlTestSuite({ numberOfShards: 1, replicationFactor: 1 });
  });
  
  jsunity.run(function IResearchAqlTestSuite_s4_r1() {
    return IResearchAqlTestSuite({ numberOfShards: 4, replicationFactor: 1 });
  });
  
  jsunity.run(function IResearchAqlTestSuite_s1_r2() {
    return IResearchAqlTestSuite({ numberOfShards: 1, replicationFactor: 2 });
  });
  
  jsunity.run(function IResearchAqlTestSuite_s4_r3() {
    return IResearchAqlTestSuite({ numberOfShards: 4, replicationFactor: 3 });
  });
  
  return jsunity.done();
  