//require('../../../support/test_helper');
var assert = require('assert');

var MapConfigAdapter = require('../../../../lib/cartodb/models/mapconfig/adapter');

describe('MapConfigAdapter', function() {
    var user = 'wadus';
    function requestMapConfig() {
        return {
            val: 0
        };
    }
    function params() {
        return {};
    }
    function context() {
        return {};
    }

    function createAdapter(valOperatorFn) {
        return function ValMapConfigAdapter() {
            this.getMapConfig = function(user, requestMapConfig, params, context, callback) {
                requestMapConfig.val = valOperatorFn(requestMapConfig.val);
                return callback(null, requestMapConfig);
            };
        };
    }
    var IncValMapConfigAdapter = createAdapter(function(val) { return val + 1; });
    var Mul2ValMapConfigAdapter = createAdapter(function(val) { return val * 2; });

    function validateMapConfig(adapter, expectedNumAdapters, validatorFn, callback) {
        assert.equal(adapter.adapters.length, expectedNumAdapters);
        adapter.getMapConfig(user, requestMapConfig(), params(), context(), function(err, mapConfig) {
            validatorFn(mapConfig);
            return callback(err);
        });
    }

    it('works with no adapters', function(done) {
        var adapter = new MapConfigAdapter();
        validateMapConfig(adapter, 0, function(mapConfig) {
            assert.equal(mapConfig.val, 0);
        }, done);
    });

    it('works with no adapters as empty array', function(done) {
        var adapter = new MapConfigAdapter([]);
        validateMapConfig(adapter, 0, function(mapConfig) {
            assert.equal(mapConfig.val, 0);
        }, done);
    });

    it('works with basic adapter', function(done) {
        var adapter = new MapConfigAdapter(new IncValMapConfigAdapter());
        validateMapConfig(adapter, 1, function(mapConfig) {
            assert.equal(mapConfig.val, 1);
        }, done);
    });

    it('works with basic adapter as array', function(done) {
        var adapter = new MapConfigAdapter([new IncValMapConfigAdapter()]);
        validateMapConfig(adapter, 1, function(mapConfig) {
            assert.equal(mapConfig.val, 1);
        }, done);
    });

    it('works with several adapters', function(done) {
        var adapter = new MapConfigAdapter(new IncValMapConfigAdapter(), new IncValMapConfigAdapter());
        validateMapConfig(adapter, 2, function(mapConfig) {
            assert.equal(mapConfig.val, 2);
        }, done);
    });

    it('works with several adapters as array', function(done) {
        var adapter = new MapConfigAdapter([new IncValMapConfigAdapter(), new IncValMapConfigAdapter()]);
        validateMapConfig(adapter, 2, function(mapConfig) {
            assert.equal(mapConfig.val, 2);
        }, done);
    });

    it('should execute in order 1', function(done) {
        var adapter = new MapConfigAdapter([new Mul2ValMapConfigAdapter(), new IncValMapConfigAdapter()]);
        validateMapConfig(adapter, 2, function(mapConfig) {
            assert.equal(mapConfig.val, 1);
        }, done);
    });

    it('should execute in order 2', function(done) {
        var adapter = new MapConfigAdapter([new IncValMapConfigAdapter(), new Mul2ValMapConfigAdapter()]);
        validateMapConfig(adapter, 2, function(mapConfig) {
            assert.equal(mapConfig.val, 2);
        }, done);
    });

    it('should execute in order 3', function(done) {
        var adapter = new MapConfigAdapter([new Mul2ValMapConfigAdapter(), new Mul2ValMapConfigAdapter()]);
        validateMapConfig(adapter, 2, function(mapConfig) {
            assert.equal(mapConfig.val, 0);
        }, done);
    });

    it('should execute in order 4', function(done) {
        var Mul5ValMapConfigAdapter = createAdapter(function(val) { return val * 5; });
        var adapter = new MapConfigAdapter(
            new IncValMapConfigAdapter(),
            new Mul2ValMapConfigAdapter(),
            new Mul5ValMapConfigAdapter()
        );
        validateMapConfig(adapter, 3, function(mapConfig) {
            assert.equal(mapConfig.val, 10);
        }, done);
    });
});

@@ -987,27 +987,27 @@
 apters, 
-validatorFn
+expectedVal
 , callba
@@ -1199,29 +1199,47 @@
     
-validatorFn(mapConfig
+assert.equal(mapConfig.val, expectedVal
 );%0A 
@@ -1428,83 +1428,9 @@
  0, 
-function(mapConfig) %7B%0A            assert.equal(mapConfig.val, 0);%0A        %7D
+0
 , do
@@ -1598,83 +1598,9 @@
  0, 
-function(mapConfig) %7B%0A            assert.equal(mapConfig.val, 0);%0A        %7D
+0
 , do
@@ -1781,83 +1781,9 @@
  1, 
-function(mapConfig) %7B%0A            assert.equal(mapConfig.val, 1);%0A        %7D
+1
 , do
@@ -1975,83 +1975,9 @@
  1, 
-function(mapConfig) %7B%0A            assert.equal(mapConfig.val, 1);%0A        %7D
+1
 , do
@@ -2191,83 +2191,9 @@
  2, 
-function(mapConfig) %7B%0A            assert.equal(mapConfig.val, 2);%0A        %7D
+2
 , do
@@ -2418,83 +2418,9 @@
  2, 
-function(mapConfig) %7B%0A            assert.equal(mapConfig.val, 2);%0A        %7D
+2
 , do
@@ -2635,83 +2635,9 @@
  2, 
-function(mapConfig) %7B%0A            assert.equal(mapConfig.val, 1);%0A        %7D
+1
 , do
@@ -2852,83 +2852,9 @@
  2, 
-function(mapConfig) %7B%0A            assert.equal(mapConfig.val, 2);%0A        %7D
+2
 , do
@@ -3070,83 +3070,9 @@
  2, 
-function(mapConfig) %7B%0A            assert.equal(mapConfig.val, 0);%0A        %7D
+0
 , do
@@ -3450,84 +3450,10 @@
  3, 
-function(mapConfig) %7B%0A            assert.equal(mapConfig.val, 10);%0A        %7D
+10
 , do

Simplify test as we just validate val value