/* global require, chai, describe, before, it */
/* global window */
var expect = chai.expect
var Mock, Random, $, _

describe('Mock.valid', function() {
    before(function(done) {
        require(['mock', 'underscore', 'jquery'], function() {
            Mock = arguments[0]
            window.Random = Random = Mock.Random
            _ = arguments[1]
            $ = arguments[2]
            expect(Mock).to.not.equal(undefined)
            expect(_).to.not.equal(undefined)
            expect($).to.not.equal(undefined)
            done()
        })
    })

    function stringify(json) {
        return JSON.stringify(json /*, null, 4*/ )
    }

    function title(tpl, data, result, test) {
        test.title = stringify(tpl) + ' VS ' + stringify(data) + '\n\tresult: ' + stringify(result)

        // if (result.length) test.title += '\n\tresult: '
        // for (var i = 0; i < result.length; i++) {
        //     test.title += '\n\t' + result[i].message // stringify(result)
        // }
    }

    function doit(tpl, data, len) {
        it('', function() {
            var result = Mock.valid(tpl, data)
            title(tpl, data, result, this.test)
            expect(result).to.be.an('array').with.length(len)
        })
    }

    describe('Name', function() {
        doit({
            name: 1
        }, {
            name: 1
        }, 0)

        doit({
            name1: 1
        }, {
            name2: 1
        }, 1)
    })
    describe('Value - Number', function() {
        doit({
            name: 1
        }, {
            name: 1
        }, 0)

        doit({
            name: 1
        }, {
            name: 2
        }, 1)

        doit({
            name: 1.1
        }, {
            name: 2.2
        }, 1)

        doit({
            'name|1-10': 1
        }, {
            name: 5
        }, 0)

        doit({
            'name|1-10': 1
        }, {
            name: 0
        }, 1)

        doit({
            'name|1-10': 1
        }, {
            name: 11
        }, 1)
    })
    describe('Value - String', function() {
        doit({
            name: 'value'
        }, {
            name: 'value'
        }, 0)

        doit({
            name: 'value1'
        }, {
            name: 'value2'
        }, 1)

        doit({
            'name|1': 'value'
        }, {
            name: 'value'
        }, 0)

        doit({
            'name|2': 'value'
        }, {
            name: 'valuevalue'
        }, 0)

        doit({
            'name|2': 'value'
        }, {
            name: 'value'
        }, 1)

        doit({
            'name|2-3': 'value'
        }, {
            name: 'value'
        }, 1)

        doit({
            'name|2-3': 'value'
        }, {
            name: 'valuevaluevaluevalue'
        }, 1)
    })
    describe('Value - RgeExp', function() {
        doit({
            name: /value/
        }, {
            name: 'value'
        }, 0)
        doit({
            name: /value/
        }, {
            name: 'vvvvv'
        }, 1)
        doit({
            'name|1-10': /value/
        }, {
            name: 'valuevaluevaluevaluevalue'
        }, 0)
        doit({
            'name|1-10': /value/
        }, {
            name: 'vvvvvvvvvvvvvvvvvvvvvvvvv'
        }, 1)
        doit({
            'name|1-10': /^value$/
        }, {
            name: 'valuevaluevaluevaluevalue'
        }, 0)
        doit({
            name: /[a-z][A-Z][0-9]/
        }, {
            name: 'yL5'
        }, 0)
    })
    describe('Value - Object', function() {
        doit({
            name: 1
        }, {
            name: 1
        }, 0)
        doit({
            name1: 1
        }, {
            name2: 2
        }, 1)
        doit({
            name1: 1,
            name2: 2
        }, {
            name3: 3
        }, 1)
        doit({
            name1: 1,
            name2: 2
        }, {
            name1: '1',
            name2: '2'
        }, 2)
        doit({
            a: {
                b: {
                    c: {
                        d: 1
                    }
                }
            }
        }, {
            a: {
                b: {
                    c: {
                        d: 2
                    }
                }
            }
        }, 1)
    })
    describe('Value - Array', function() {
        doit([1, 2, 3], [1, 2, 3], 0)

        doit([1, 2, 3], [1, 2, 3, 4], 1)

        // 'name|1': array
        doit({
            'name|1': [1, 2, 3]
        }, {
            'name': 1
        }, 0)
        doit({
            'name|1': [1, 2, 3]
        }, {
            'name': 2
        }, 0)
        doit({
            'name|1': [1, 2, 3]
        }, {
            'name': 3
        }, 0)
        doit({ // 不检测
            'name|1': [1, 2, 3]
        }, {
            'name': 4
        }, 0)

        // 'name|+1': array
        doit({
            'name|+1': [1, 2, 3]
        }, {
            'name': 1
        }, 0)
        doit({
            'name|+1': [1, 2, 3]
        }, {
            'name': 2
        }, 0)
        doit({
            'name|+1': [1, 2, 3]
        }, {
            'name': 3
        }, 0)
        doit({
            'name|+1': [1, 2, 3]
        }, {
            'name': 4
        }, 0)

        // 'name|min-max': array
        doit({
            'name|2-3': [1]
        }, {
            'name': [1, 2, 3, 4]
        }, 1)

        doit({
            'name|2-3': [1]
        }, {
            'name': [1]
        }, 1)

        doit({
            'name|2-3': [1, 2, 3]
        }, {
            'name': [1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]
        }, 1)

        doit({
            'name|2-3': [1, 2, 3]
        }, {
            'name': [1, 2, 3]
        }, 1)

        doit({
            'name|2-3': [1]
        }, {
            'name': [1, 1, 1]
        }, 0)

        doit({
            'name|2-3': [1]
        }, {
            'name': [1, 2, 3]
        }, 2)

        // 'name|count': array
    })
    describe('Value - Placeholder', function() {
        doit({
            name: '@email'
        }, {
            name: 'nuysoft@gmail.com'
        }, 0)
        doit({
            name: '@int'
        }, {
            name: 123
        }, 0)
    })
})