'use strict';

var assert = require('assert');
var config = require('../lib/config');
var helper = require('../helper');
var redis = config.redis;

describe("The 'incr' method", function () {

    helper.allTests(function (ip, args) {

        describe('using ' + ip, function () {

            describe('when connected and a value in Redis', function () {

                var client;
                var key = 'ABOVE_SAFE_JAVASCRIPT_INTEGER';
                var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991; // Backwards compatible

                afterEach(function () {
                    client.end(true);
                });

                /*
                    Number.MAX_SAFE_INTEGER === Math.pow(2, 53) - 1 === 9007199254740991

                    9007199254740992 -> 9007199254740992
                    9007199254740993 -> 9007199254740992
                    9007199254740994 -> 9007199254740994
                    9007199254740995 -> 9007199254740996
                    9007199254740996 -> 9007199254740996
                    9007199254740997 -> 9007199254740996
                    ...
                */
                it('count above the safe integers as numbers', function (done) {
                    client = redis.createClient.apply(null, args);
                    // Set a value to the maximum safe allowed javascript number (2^53) - 1
                    client.set(key, MAX_SAFE_INTEGER, helper.isNotError());
                    client.INCR(key, helper.isNumber(MAX_SAFE_INTEGER + 1));
                    client.INCR(key, helper.isNumber(MAX_SAFE_INTEGER + 2));
                    client.INCR(key, helper.isNumber(MAX_SAFE_INTEGER + 3));
                    client.INCR(key, helper.isNumber(MAX_SAFE_INTEGER + 4));
                    client.INCR(key, helper.isNumber(MAX_SAFE_INTEGER + 5));
                    client.INCR(key, function (err, res) {
                        helper.isNumber(MAX_SAFE_INTEGER + 6)(err, res);
                        assert.strictEqual(typeof res, 'number');
                    });
                    client.INCR(key, helper.isNumber(MAX_SAFE_INTEGER + 7));
                    client.INCR(key, helper.isNumber(MAX_SAFE_INTEGER + 8));
                    client.INCR(key, helper.isNumber(MAX_SAFE_INTEGER + 9));
                    client.INCR(key, helper.isNumber(MAX_SAFE_INTEGER + 10, done));
                });

                it('count above the safe integers as strings', function (done) {
                    args[2].string_numbers = true;
                    client = redis.createClient.apply(null, args);
                    // Set a value to the maximum safe allowed javascript number (2^53)
                    client.set(key, MAX_SAFE_INTEGER, helper.isNotError());
                    client.incr(key, helper.isString('9007199254740992'));
                    client.incr(key, helper.isString('9007199254740993'));
                    client.incr(key, helper.isString('9007199254740994'));
                    client.incr(key, helper.isString('9007199254740995'));
                    client.incr(key, helper.isString('9007199254740996'));
                    client.incr(key, function (err, res) {
                        helper.isString('9007199254740997')(err, res);
                        assert.strictEqual(typeof res, 'string');
                    });
                    client.incr(key, helper.isString('9007199254740998'));
                    client.incr(key, helper.isString('9007199254740999'));
                    client.incr(key, helper.isString('9007199254741000'));
                    client.incr(key, helper.isString('9007199254741001', done));
                });
            });
        });
    });
});
