view tests.js @ 20:1d8e0d388549

reduce phase now supports progress callbacks/asynchronous behavior.
author Atul Varma <varmaa@toolness.com>
date Mon, 13 Apr 2009 11:55:53 -0700
parents 3dd04250a3d2
children 95a1e6ad3f57
line wrap: on
line source

var Tests = {
  run: function(listener, container, setTimeout) {
    if (!container)
      container = this;
    if (!setTimeout)
      setTimeout = window.setTimeout;

    var tests = [];

    for (name in container)
      if (name.indexOf("test") == "0") {
        var test = {
          name: name,
          func: container[name],
          isAsync: name.indexOf("_async") != -1,
          console: console,
          id: tests.length,
          assertEqual: function assertEqual(a, b) {
            if (a != b)
              throw new Error(a + " != " + b);
          }
        };
        tests.push(test);
      }

    listener.onReady(tests);
    var nextTest = 0;

    function runNextTest() {
      if (nextTest < tests.length) {
        var test = tests[nextTest];
        listener.onRun(test);
        test.done = function() {
          listener.onFinish(this);
          setTimeout(runNextTest, 0);
        };
        test.func(test);
        if (!test.isAsync)
          test.done();
        nextTest++;
      }
    }

    runNextTest();
  },
  testDictionary: function(self) {
    var dict = new BrowserCouch._Dictionary();
    dict.set('foo', {a: 'hello'});
    dict.set('bar', {b: 'goodbye'});
    self.assertEqual(dict.get('foo').a, 'hello');
    self.assertEqual(dict.get('bar').b, 'goodbye');
    self.assertEqual(dict.getKeys().length, 2);
    self.assertEqual(dict.has('foo'), true);
    self.assertEqual(dict.has('bar'), true);
    self.assertEqual(dict.has('spatula'), false);
    dict.delete('bar');
    self.assertEqual(dict.getKeys().length, 1);
    self.assertEqual(dict.has('foo'), true);
  },
  testDbView_async: function(self) {
    BrowserCouch.get(
      "blarg",
      function(db) {
        var progressCalled = false;
        db.put(
          [{id: "monkey",
            content: "hello there dude"},
           {id: "chunky",
            content: "hello there dogen"}],
          function() {
            var timesProgressCalled = 0;
            db.view(
              {map: function(doc, emit) {
                 var words = doc.content.split(" ");
                 for (var i = 0; i < words.length; i++)
                   emit(words[i], 1);
               },
               reduce: function(keys, values) {
                 var sum = 0;
                 for (var i = 0; i < values.length; i++)
                   sum += values[i];
                 return sum;
               },
               chunkSize: 1,
               progress: function(phase, percentDone, resume) {
                 if (phase == "map") {
                   self.assertEqual(percentDone, 0.5);
                   progressCalled = true;
                 }
                 resume();
               },
               finished: function(result) {
                 self.assertEqual(progressCalled, true);

                 var expected = {rows: [{key: "dogen", value: 1},
                                        {key: "dude", value: 1},
                                        {key: "hello", value: 2},
                                        {key: "there", value: 2}]};

                 self.assertEqual(JSON.stringify(expected),
                                  JSON.stringify(result));
                 self.done();
               }});
          });
      });
  }
};