gladiator = require '../..'

describe 'gladiator', () ->
  describe 'validated', () ->
    describe 'array', () ->
      arrays = [[1, 2, 3]]
      booleans = [true, false, true]
      empty = []
      nulls = [null, null, null]
      numbers = [1, 2, 3]
      objects = [{ name: 'a' }, { name: 'b' }, { name: 'c' }]
      strings = ['a', 'b', 'c']
      undefineds = [undefined, undefined, undefined]
      
      describe 'optional', () ->
        it 'should be an optional array of optional arrays', () ->
          validator = new gladiator {
            items:
              items:
                type: 'number'
              type: 'array'
            type: 'array'
          }
          
          validator.valid.should.equal true
          validator.validate(arrays).valid.should.equal true
          validator.validate(booleans).valid.should.equal false
          validator.validate(empty).valid.should.equal true
          validator.validate(nulls).valid.should.equal false
          validator.validate(numbers).valid.should.equal false
          validator.validate(objects).valid.should.equal false
          validator.validate(strings).valid.should.equal false
          validator.validate(undefineds).valid.should.equal true
          
        it 'should be an optional array of optional booleans', () ->
          validator = new gladiator {
            items:
              type: 'boolean'
            type: 'array'
          }
          
          validator.valid.should.equal true
          validator.validate(arrays).valid.should.equal false
          validator.validate(booleans).valid.should.equal true
          validator.validate(empty).valid.should.equal true
          validator.validate(nulls).valid.should.equal false
          validator.validate(numbers).valid.should.equal false
          validator.validate(objects).valid.should.equal false
          validator.validate(strings).valid.should.equal false
          validator.validate(undefineds).valid.should.equal true
        
        it 'should be an optional array of optional numbers', () ->
          validator = new gladiator {
            items:
              type: 'number'
            type: 'array'
          }
          
          validator.valid.should.equal true
          validator.validate(arrays).valid.should.equal false
          validator.validate(booleans).valid.should.equal false
          validator.validate(empty).valid.should.equal true
          validator.validate(nulls).valid.should.equal false
          validator.validate(numbers).valid.should.equal true
          validator.validate(objects).valid.should.equal false
          validator.validate(strings).valid.should.equal false
          validator.validate(undefineds).valid.should.equal true
        
        it 'should be an optional array of optional strings', () ->
          validator = new gladiator {
            items:
              type: 'string'
            type: 'array'
          }
          
          validator.valid.should.equal true
          validator.validate(arrays).valid.should.equal false
          validator.validate(booleans).valid.should.equal false
          validator.validate(empty).valid.should.equal true
          validator.validate(nulls).valid.should.equal false
          validator.validate(numbers).valid.should.equal false
          validator.validate(objects).valid.should.equal false
          validator.validate(strings).valid.should.equal true
          validator.validate(undefineds).valid.should.equal true
        
        it 'should be an optional array of required booleans', () ->
          validator = new gladiator {
            items:
              required: true
              type: 'boolean'
            type: 'array'
          }
          
          validator.valid.should.equal true
          validator.validate(arrays).valid.should.equal false
          validator.validate(booleans).valid.should.equal true
          validator.validate(empty).valid.should.equal true
          validator.validate(nulls).valid.should.equal false
          validator.validate(numbers).valid.should.equal false
          validator.validate(objects).valid.should.equal false
          validator.validate(strings).valid.should.equal false
          validator.validate(undefineds).valid.should.equal false
        
        it 'should be an optional array of required numbers', () ->
          validator = new gladiator {
            items:
              required: true
              type: 'number'
            type: 'array'
          }
          
          validator.valid.should.equal true
          validator.validate(arrays).valid.should.equal false
          validator.validate(booleans).valid.should.equal false
          validator.validate(empty).valid.should.equal true
          validator.validate(nulls).valid.should.equal false
          validator.validate(numbers).valid.should.equal true
          validator.validate(objects).valid.should.equal false
          validator.validate(strings).valid.should.equal false
          validator.validate(undefineds).valid.should.equal false
        
        it 'should be an optional array of required strings', () ->
          validator = new gladiator {
            items:
              required: true
              type: 'string'
            type: 'array'
          }
          
          validator.valid.should.equal true
          validator.validate(arrays).valid.should.equal false
          validator.validate(booleans).valid.should.equal false
          validator.validate(empty).valid.should.equal true
          validator.validate(nulls).valid.should.equal false
          validator.validate(numbers).valid.should.equal false
          validator.validate(objects).valid.should.equal false
          validator.validate(strings).valid.should.equal true
          validator.validate(undefineds).valid.should.equal false
      
      describe 'required', () ->
        it 'should be an required array of optional booleans', () ->
          validator = new gladiator {
            items:
              type: 'boolean'
            required: true
            type: 'array'
          }
          
          validator.valid.should.equal true
          validator.validate(arrays).valid.should.equal false
          validator.validate(booleans).valid.should.equal true
          validator.validate(empty).valid.should.equal true
          validator.validate(nulls).valid.should.equal false
          validator.validate(numbers).valid.should.equal false
          validator.validate(objects).valid.should.equal false
          validator.validate(strings).valid.should.equal false
          validator.validate(undefineds).valid.should.equal true
        
        it 'should be an required array of optional numbers', () ->
          validator = new gladiator {
            items:
              type: 'number'
            required: true
            type: 'array'
          }
          
          validator.valid.should.equal true
          validator.validate(arrays).valid.should.equal false
          validator.validate(booleans).valid.should.equal false
          validator.validate(empty).valid.should.equal true
          validator.validate(nulls).valid.should.equal false
          validator.validate(numbers).valid.should.equal true
          validator.validate(objects).valid.should.equal false
          validator.validate(strings).valid.should.equal false
          validator.validate(undefineds).valid.should.equal true
        
        it 'should be an required array of optional strings', () ->
          validator = new gladiator {
            items:
              type: 'string'
            required: true
            type: 'array'
          }
          
          validator.valid.should.equal true
          validator.validate(arrays).valid.should.equal false
          validator.validate(booleans).valid.should.equal false
          validator.validate(empty).valid.should.equal true
          validator.validate(nulls).valid.should.equal false
          validator.validate(numbers).valid.should.equal false
          validator.validate(objects).valid.should.equal false
          validator.validate(strings).valid.should.equal true
          validator.validate(undefineds).valid.should.equal true
        
        it 'should be an required array of required booleans', () ->
          validator = new gladiator {
            items:
              required: true
              type: 'boolean'
            required: true
            type: 'array'
          }
          
          validator.valid.should.equal true
          validator.validate(arrays).valid.should.equal false
          validator.validate(booleans).valid.should.equal true
          validator.validate(empty).valid.should.equal true
          validator.validate(nulls).valid.should.equal false
          validator.validate(numbers).valid.should.equal false
          validator.validate(objects).valid.should.equal false
          validator.validate(strings).valid.should.equal false
          validator.validate(undefineds).valid.should.equal false
        
        it 'should be an required array of required numbers', () ->
          validator = new gladiator {
            items:
              required: true
              type: 'number'
            required: true
            type: 'array'
          }
          
          validator.valid.should.equal true
          validator.validate(arrays).valid.should.equal false
          validator.validate(booleans).valid.should.equal false
          validator.validate(empty).valid.should.equal true
          validator.validate(nulls).valid.should.equal false
          validator.validate(numbers).valid.should.equal true
          validator.validate(objects).valid.should.equal false
          validator.validate(strings).valid.should.equal false
          validator.validate(undefineds).valid.should.equal false
        
        it 'should be an required array of required strings', () ->
          validator = new gladiator {
            items:
              required: true
              type: 'string'
            required: true
            type: 'array'
          }
          
          validator.valid.should.equal true
          validator.validate(arrays).valid.should.equal false
          validator.validate(booleans).valid.should.equal false
          validator.validate(empty).valid.should.equal true
          validator.validate(nulls).valid.should.equal false
          validator.validate(numbers).valid.should.equal false
          validator.validate(objects).valid.should.equal false
          validator.validate(strings).valid.should.equal true
          validator.validate(undefineds).valid.should.equal false